vectors.s
来自「开放源码实时操作系统源码.」· 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 stack
FUNC_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 2f
1: 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 done
2:
# 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,r2
1: 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 2
FUNC_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 = 0
1: cmp/eq r3,r4 ! skip if no bss
bt 2f
mov.l r0,@r3 ! store zero
add #4,r3
bra 1b ! loop
nop
2:
# 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
nop
9:
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
#endif
SYM_DEF(hal_interrupt_handlers)
.rept CYG_ISR_TABLE_SIZE
.long CYG_LABEL_DEFN(hal_default_isr)
.endr
SYM_DEF(hal_interrupt_data)
.rept CYG_ISR_TABLE_SIZE
.long 0
.endr
SYM_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 16
SYM_DEF(cyg_interrupt_stack_base)
.rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
.byte 0
.endr
.balign 16
.global _cyg_interrupt_stack
SYM_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 16
SYM_DEF(startup_stack_base)
.rept STARTUP_STACK_SIZE
.byte 0
.endr
.balign 16
SYM_DEF(startup_stack)
.long 0,0,0,0
#---------------------------------------------------------------------------
# end of vectors.S
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?