vectors.s

来自「eCos操作系统源码」· S 代码 · 共 643 行 · 第 1/2 页

S
643
字号
#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK##-----------------------------------------------------------------------------## Execute pending DSRs on the interrupt stack with interrupts enabled.## Note: this can only be called from code running on a thread stackFUNC_START(hal_interrupt_stack_call_pending_DSRs)        # Change to interrupt stack        mov     r15,r2        mov.l   $cyg_interrupt_stack,r15        mov.l   r2,@-r15                ! save old stack pointer        sts.l   pr,@-r15                ! save pr on stack        stc     sr,r3        mov.l   r3,@-r15                ! save sr on stack        # enable interrupts        hal_cpu_int_enable r0,r1        # Call into kernel which will execute DSRs        mov.l   $cyg_interrupt_call_pending_DSRs,r0        jsr     @r0         nop        # Get old sr, pr, and stack values        mov.l   @r15+,r3                ! get old sr        lds.l   @r15+,pr                ! get old pr        mov.l   @r15+,r15               ! get old stack pointer        # Restore SR interrupt state        hal_cpu_int_merge r3,r0,r1        rts         nop#endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK#endif // CYGFUN_HAL_COMMON_KERNEL_SUPPORT        .align  2        #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \    || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)        SYM_PTR_REF(hal_saved_interrupt_state)#endif#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK         SYM_PTR_REF(cyg_interrupt_stack_base)        SYM_PTR_REF(cyg_interrupt_stack)#endif        SYM_PTR_REF(hal_interrupt_handlers)        SYM_PTR_REF(hal_interrupt_data)        SYM_PTR_REF(hal_interrupt_objects)#ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING        SYM_PTR_REF(cyg_hal_ILVL_table)$unmasked_SR:        .long   (CYG_SR & ~CYGARC_REG_SR_IMASK)#endif // CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING                #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT        SYM_PTR_REF(cyg_interrupt_call_pending_DSRs)        SYM_PTR_REF(interrupt_end)        SYM_PTR_REF(cyg_scheduler_sched_lock)#endif#---------------------------------------------------------------------------# Platform initialization (reset)FUNC_START(_reset_platform)        hal_post_reset_init     #ifdef __DEBUG        mov     #0,r0        mov     #1,r1        mov     #2,r2        mov     #3,r3        mov     #4,r4        mov     #5,r5        mov     #6,r6        mov     #7,r7        mov     #8,r8        mov     #9,r9        mov     #10,r10        mov     #11,r11        mov     #12,r12        mov     #13,r13        mov     #14,r14#endif               # Call platform specific hardware initialization        # This may include memory controller initialization. It is not        # safe to access RAM until after this point.        # Note that caches must not be enabled until after this point,        # since we may be fiddling the FRQCR which cannot be safely done        # by code in burst/cachable memory (errata SH7-184e).        hal_hardware_init        # Now copy necessary bits to RAM and jump to the VMA base#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_SUBSETROMRAM)        # Copy data from ROM to ram        mov.l   $_rom_data_start,r3    ! r3 = rom start        mov.l   $_ram_data_start,r4    ! r4 = ram start        mov.l   $_ram_data_end,r5      ! r5 = ram end                cmp/eq  r4,r5                   ! skip if no data        bt      2f1:      mov.l   @r3+,r0                 ! get word from ROM        mov.l   r0,@r4                  ! store in RAM        add     #4,r4        cmp/eq  r4,r5                   ! compare        bf      1b                      ! loop if not yet done2:        # Jump to the proper VMA base of the code.        mov.l   $complete_setup,r0        jmp     @r0         nop        .align 2        SYM_PTR_REF(_rom_data_start)        SYM_PTR_REF(_ram_data_start)        SYM_PTR_REF(_ram_data_end)        SYM_PTR_REF(complete_setup)#elif defined(CYG_HAL_STARTUP_ROMRAM)        # Copy everything to the proper VMA base and jump to it.        mov.l   $_vector_code_lma,r0        mov.l   $_vector_code_vma,r1        mov.l   $end,r21:      mov.l   @r0+,r3                 ! get word from ROM        mov.l   r3,@r1                  ! store in RAM        add     #4,r1        cmp/eq  r1,r2                   ! compare        bf      1b                      ! loop if not yet done        mov.l   $complete_setup,r0        jmp     @r0         nop        .align  2        SYM_PTR_REF(_vector_code_lma)        SYM_PTR_REF(_vector_code_vma)        SYM_PTR_REF(end)        SYM_PTR_REF(complete_setup)#else        # Jump to remaining setup code. Relative branch is OK since VMA=LMA.        bra   CYG_LABEL_DEFN(complete_setup)         nop                #endif#-----------------------------------------------------------------------------# Complete target initialization and setup.# After this point we can use absolute addressing modes and access all the# memory in the system.	.align  2FUNC_START(complete_setup)                        # Set up monitor related stuff (vectors primarily)        hal_mon_init        # set up stack        mov.l    $startup_stack,r15        # clear BSS        mov.l   $_bss_start,r3         ! r3 = start        mov.l   $_bss_end,r4           ! r4 = end        mov     #0,r0                   ! r0 = 01:      cmp/eq  r3,r4                   ! skip if no bss        bt      2f        mov.l   r0,@r3                  ! store zero        add     #4,r3        bra     1b                      ! loop         nop2:        # It is now safe to call C functions which may rely on initialized        # data.        #        # Initialize MMU.#        .extern hal_MMU_init#        jsr      hal_MMU_init#         nop                # Enable caches        mov.l    $cyg_var_enable_caches,r1        jsr      @r1         nop        # Variant HALs may need to do something special before we continue        mov.l    $hal_variant_init,r1        jsr      @r1         nop        # Platform initialization        mov.l    $hal_platform_init,r1        jsr      @r1         nop                # call c++ constructors        mov.l    $cyg_hal_invoke_constructors,r1        jsr      @r1         nop#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS        mov.l    $initialize_stub,r1        jsr      @r1         nop#endif#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \    || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)        mov.l    $hal_ctrlc_isr_init,r1        jsr      @r1         nop#endif        mov.l    $cyg_start,r1        jsr      @r1         nop9:              bra      9b                     ! if we return, loop         nop        .align  2        SYM_PTR_REF(_bss_start)        SYM_PTR_REF(_bss_end)        SYM_PTR_REF(startup_stack)        SYM_PTR_REF(cyg_hal_invoke_constructors)        SYM_PTR_REF(cyg_var_enable_caches)        SYM_PTR_REF(hal_variant_init)        SYM_PTR_REF(hal_platform_init)        SYM_PTR_REF(cyg_start)#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS        SYM_PTR_REF(initialize_stub)#endif#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \    || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)        SYM_PTR_REF(hal_ctrlc_isr_init)#endif#---------------------------------------------------------------------------# Interrupt vector tables.# These tables contain the isr, data and object pointers used to deliver# interrupts to user code.        .data        .extern CYG_LABEL_DEFN(hal_default_isr)#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN#define CYG_ISR_TABLE_SIZE    1#else#define CYG_ISR_TABLE_SIZE    CYGNUM_HAL_ISR_COUNT#endifSYM_DEF(hal_interrupt_handlers)        .rept   CYG_ISR_TABLE_SIZE        .long   CYG_LABEL_DEFN(hal_default_isr)        .endrSYM_DEF(hal_interrupt_data)        .rept   CYG_ISR_TABLE_SIZE        .long   0        .endrSYM_DEF(hal_interrupt_objects)        .rept   CYG_ISR_TABLE_SIZE        .long   0        .endr#---------------------------------------------------------------------------## Temporary interrupt stack                .section ".bss"#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK         .balign 16SYM_DEF(cyg_interrupt_stack_base)        .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE        .byte 0        .endr        .balign 16        .global _cyg_interrupt_stackSYM_DEF(cyg_interrupt_stack)                .long   0,0,0,0#endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK#if defined(CYGSEM_HAL_ROM_MONITOR) || defined(CYGPKG_REDBOOT)  // Enough space for stub to handle downloads. If using thread capabilities  // it will be using the RAM application's stack.# define STARTUP_STACK_SIZE CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE#else# ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK   // Enough space to run constructors.   // FIXME: 512 is enough for all tests. doc/examples/twothreads   // calls printf on this stack though, and so requires more space.#  define STARTUP_STACK_SIZE 1024# else#  define STARTUP_STACK_SIZE CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE# endif#endif        .balign 16SYM_DEF(startup_stack_base)        .rept   STARTUP_STACK_SIZE        .byte 0        .endr        .balign 16SYM_DEF(startup_stack)        .long   0,0,0,0#---------------------------------------------------------------------------# end of vectors.S

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?