diff packages/hal/m68k/arch/current/src/vectors.S @ 2649:c8ac62402c90

Contribute eCosCentric's M68K architectural HAL, replacing the old code.
author bartv
date Thu, 20 Nov 2008 22:26:03 +0000
parents
children 74dbf4c3f2e1
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/m68k/arch/current/src/vectors.S
@@ -0,0 +1,251 @@
+// #========================================================================
+// #
+// #    vectors.S
+// #
+// #    M68K startup and exception handling.
+// #
+// #========================================================================
+//###ECOSGPLCOPYRIGHTBEGIN####
+//-------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2003,2004,2005,2006,2008 Free Software Foundation, Inc.
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//========================================================================
+//###DESCRIPTIONBEGIN####
+//
+// Author(s):     bartv
+// Date:          2003-06-04
+// 
+//###DESCRIPTIONEND####
+//========================================================================
+
+#include <pkgconf/system.h>
+#include <pkgconf/hal.h>
+#include <pkgconf/hal_m68k.h>
+#include CYGBLD_HAL_TARGET_H
+#include <cyg/hal/hal_io.h>
+#include <cyg/hal/arch.inc>
+
+// ----------------------------------------------------------------------------
+// These are for compatibility with older HALs
+#ifdef HAL_M68K_EXCEPTION_VECTORS
+# define _HAL_M68K_START_               HAL_M68K_EXCEPTION_VECTORS
+# undef HAL_M68K_EXCEPTION_VECTORS        
+#endif
+#ifdef HAL_M68K_COPY_ROM_DATA_TO_RAM
+# define _HAL_M68K_COPY_ROM_DATA_TO_RAM_        1
+# undef HAL_M68K_COPY_ROM_DATA_TO_RAM
+#endif
+                
+// ----------------------------------------------------------------------------
+// Exception vectors. Typically there are two exception vectors. There is
+// one in flash which contains the h/w entry point. This is the section
+// .m68k_start. Then there is the run-time set of exception vectors, typically
+// held in RAM, which is the section .ram_vectors.  In addition to the pointers
+// to the exception and interrupt VSRs that section contains the virtual vector
+// table and any data that needs to be shared between RedBoot and the application,
+// for example shadow copies of read-only registers.
+//
+// Typical scenarios include the following:
+//        
+//   1) _HAL_M68K_START_ code relocates the flash from its boot location of 0x0
+//      to somewhere else. _HAL_M68K_PLATFORM_SETUP1_ initializes SDRAM and
+//      places it at 0x0. _HAL_M68K_START_ only contains the two initial exception
+//      vector slots for the start address and stack, the RAM vectors are fully
+//      populated at run-time by the architectural HAL. This is the typical
+//      scenario for "large" systems.        
+//        
+//   2) for "small" systems where usually there is no RedBoot and the application
+//      runs directly from flash, all the exception vectors also reside in flash
+//      and are statically initialized. _HAL_M68K_START_ contains the full set
+//      of vectors.
+//
+//   3) as a variant of (2) the run-time exception vectors may live in RAM,
+//      typically relocated via the VBR register. The vectors will usually be
+//      dynamically initialized, but if the application is loaded via gdb then
+//      some code may be saved by static initialization.
+
+
+        .section        ".m68k_start", "ax"
+        // This will typically be defined by the platform HAL to get the world
+        // in a sane state. It should do one-off initializations like getting
+        // the system into a state matching the memory map. If booting from
+        // flash it should also contain the initial PC and stack exception
+        // vectors.
+#ifdef _HAL_M68K_START_
+        _HAL_M68K_START_
+#endif                
+
+        .section        ".m68k_start.hal_m68k_exception_reset", "ax"
+        // The actual entry point, as defined in the linker script. The exact
+        // state of the system at this point depends on the configuration and
+        // the processor.
+        .global hal_m68k_exception_reset
+        .type   hal_m68k_exception_reset, function
+hal_m68k_exception_reset:
+
+        // Make absolutely sure that the status register is in a
+	// sensible state with interrupts disabled, irrespective of
+        // the platform.
+        mov.w   #0x2700,%sr
+
+        // Platform-specific initialization. This will do things like starting
+        // up the SDRAM controller. It may also run variant and processor
+        // initialization code, but the platform HAL gets to decide the order.
+#ifdef _HAL_M68K_PLATFORM_SETUP1_
+        _HAL_M68K_PLATFORM_SETUP1_
+#endif
+
+        // All memory should now be running so we can get the C environment
+        // set up. Clear BSS before switching to C mode
+        .extern _hal_bss_start
+        .extern _hal_bss_end
+        move.l   # _hal_bss_start,%a0
+        move.l   # _hal_bss_end,%a1
+1:              
+        cmp.l   %a0,%a1
+        ble     2f
+        clr.l   (%a0)+
+        jra     1b
+2:
+
+        // If booting from ROM, move .data from ROM to RAM
+#ifdef _HAL_M68K_COPY_ROM_DATA_TO_RAM_
+        .extern _hal_data_section_start_lma
+        .extern _hal_data_section_end_lma
+        .extern _hal_data_section_start_vma
+        move.l  # _hal_data_section_start_lma, %a0
+        move.l  # _hal_data_section_end_lma,   %a1
+        move.l  # _hal_data_section_start_vma, %a2
+1:              
+        cmp.l   %a0,%a1
+        ble     2f
+        mov.l   (%a0)+,(%a2)+
+        jra     1b
+2:                      
+#endif
+
+        // If there is an FPU, set the default mode
+#ifdef CYGINT_HAL_M68K_VARIANT_FPU
+        mov.w   # CYGNUM_HAL_M68K_FPU_CR_DEFAULT, %fpcr
+#endif
+
+        // If there is on-chip RAM, copy code and data there and clear
+        // its BSS.
+#ifdef _HAL_M68K_INITIALIZE_IRAM_
+        .extern _hal_iram_text_section_start_lma
+        .extern _hal_iram_data_section_end_lma
+        .extern _hal_iram_text_section_start_vma
+        .extern _hal_iram_bss_section_start
+        .extern _hal_iram_bss_section_end
+        
+        move.l  # _hal_iram_text_section_start_lma, %a0
+        move.l  # _hal_iram_data_section_end_lma,   %a1
+        move.l  # _hal_iram_text_section_start_vma, %a2
+1:      
+        cmp.l   %a0, %a1
+        ble     2f
+        mov.l   (%a0)+, (%a2)+
+        jra     1b
+2:      
+        move.l  # _hal_iram_bss_section_start, %a0
+        move.l  # _hal_iram_bss_section_end,   %a1
+3:      
+        cmp.l   %a0, %a1
+        ble     4f
+        clr.l   (%a0)+
+        jra     3b
+4:      
+#endif                
+
+        // Now we just need a valid stack and we can switch to C
+        // for the remaining initialization. Clearing the frame
+        // pointer may make life easier for gdb.
+        mov.l   _HAL_M68K_STARTUP_STACK_,%sp
+        suba.l  %a6, %a6
+        
+        .extern hal_m68k_c_startup
+        jmp     hal_m68k_c_startup
+                
+// The exception vector table. Usually this will be held in RAM
+// at location 0x0, although it may get moved around via e.g.
+// the %vbr register. In addition to the exception vectors the
+// virtual vector table is held here, as is any data that needs
+// to be shared between RedBoot and eCos.
+//
+// Some targets in some configurations may define their own version
+// of this, if for example the exception vector is held in ROM.
+#if defined(_HAL_M68K_RAM_VECTORS_)
+        
+        _HAL_M68K_RAM_VECTORS_
+                
+#elif !defined(_HAL_M68K_RAM_VECTORS_DEFINED_)
+        .section        ".ram_vectors", "aw", @nobits
+
+# ifndef _HAL_M68K_SUPPRESS_RAM_VECTORS_VSR_TABLE_        
+        // Start with the interrupt/exception vectors.
+        .global hal_m68k_vsr_table
+hal_m68k_vsr_table:  
+        .rept   HAL_M68K_VSR_COUNT
+        .long   0
+        .endr
+# endif
+                
+        // Next the virtual vector table. Space for this is usually allocated,
+        // even if virtual vectors are not supported. That avoids confusion
+        // if RedBoot and the application are configured differently. If a
+        // platform will never support RedBoot, e.g. because of lack of memory,
+        // then it can suppress the virtual vectors.
+        //
+        // The size of the table comes from <cyg/hal/hal_if.h>,
+        // CYGNUM_CALL_IF_TABLE_SIZE, but that header cannot easily be included
+        // in assembler.
+# ifndef _HAL_M68K_SUPPRESS_VIRTUAL_VECTOR_
+        .global hal_virtual_vector_table
+hal_virtual_vector_table:       
+        .rept   64
+        .long   0
+        .endr        
+# endif
+        
+        // Allow the variant, processor and platform HALs to store additional
+        // information in the global vectors section. Typically this is used for
+        // data which needs to be shared between RedBoot and the application,
+        // e.g. shadow copies of write-only hardware registers.
+# ifdef _HAL_M68K_VARIANT_RAM_VECTORS_
+        _HAL_M68K_VARIANT_RAM_VECTORS_
+# endif
+# ifdef _HAL_M68K_PROCESSOR_RAM_VECTORS_
+        _HAL_M68K_PROCESSOR_RAM_VECTORS_
+# endif
+# ifdef _HAL_M68K_PLATFORM_RAM_VECTORS_
+        _HAL_M68K_PLATFORM_RAM_VECTORS_
+# endif
+#endif  // _HAL_M68K_RAM_VECTORS_DEFINED_
+
+                
+// ----------------------------------------------------------------------------
+// end of vectors.S