Mercurial > ecos
view packages/hal/m68k/arch/current/src/vectors.S @ 3292:7f8e529b4d82 default tip
Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
| author | vae |
|---|---|
| date | Wed, 29 Apr 2015 23:31:48 +0000 |
| parents | 74dbf4c3f2e1 |
| children |
line wrap: on
line source
// #======================================================================== // # // # 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., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 v2. // // 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
