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 + -
显示快捷键?