vectors.s
来自「eCos操作系统源码」· S 代码 · 共 854 行 · 第 1/2 页
S
854 行
_exception: // Save current register state#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS sti gr5,@(sp,4) sti gr6,@(sp,8) sti gr16,@(sp,12) movsg lr,gr5 sti gr5,@(sp,16) movsg ccr,gr5 sti gr5,@(sp,20) // Set the global offset register (gr16) call .Lexp.Lexp: movsg lr,gr16 sethi #gprelhi(.Lexp),gr5 setlo #gprello(.Lexp),gr5 sub gr16,gr5,gr16 mov sp,gr6 // Original stack pointer lda __GDB_stack,gr5 // already on GDB stack? cmp sp,gr5,icc0 bhi icc0,0,10f // no - need to switch lda __GDB_stack_base,gr5 cmp sp,gr5,icc0 bhi icc0,0,11f10: lda __GDB_stack,sp // already on GDB stack?11: subi sp,_TS_size,sp // Space for scratch saves save_GDB_exception_regs sp,gr6 save_state sp#else save_exception_regs sp save_state sp#endif LED 0x0FFF add sp,gr0,gr8 call exception_handler bra _exception_return//// Handle an interrupt// Separated from exception handling to support eCos multi-level// (ISR/DSR) interrupt structure.//_interrupt: save_exception_regs sp save_state sp mov gr4,gr30 // save vector # // Set the global offset register (gr16) call .Lexp1.Lexp1: movsg lr,gr16 sethi #gprelhi(.Lexp1),gr5 setlo #gprello(.Lexp1),gr5 sub gr16,gr5,gr16 LED 0x0700 lda hal_vsr_table,gr8 slli gr30,#2,gr4 // Vector in GR30 ld @(gr8,gr4),gr8 // Handler (VSR) defined? cmpi gr8,0,icc0 beq icc0,0,10f // No - use default LED 0x0702 callil @(gr8,0) // Yes - call it bra _exception_return//// Default interrupt processing// 10: #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) // If we are supporting Ctrl-C interrupts from GDB, we must squirrel // away a pointer to the save interrupt state here so that we can // plant a breakpoint at some later time. .extern hal_saved_interrupt_state lda hal_saved_interrupt_state,gr5 sti sp,@(gr5,0)#endif lda hal_interrupt_data,gr5 lda hal_interrupt_handlers,gr6 mov gr30,gr8 // Interrupt vector # slli gr30,#2,gr4 ld @(gr5,gr4),gr9 // data pointer ld @(gr6,gr4),gr6 // function callil @(gr6,0) LED 0x0701 // FIXME - no DSR processing//// Return from an exception/interrupt// _exception_return: LED 0x0000 restore_state sp,pcsr,0 .global reset_vectorreset_vector: // Make sure the CPU is in the proper mode (system), interrupts disabled movsg psr,gr4 li ~(_PSR_ET|_PSR_PS|_PSR_PIVL_MASK),gr5 and gr4,gr5,gr4 li (_PSR_S|_PSR_ET|(0x0F<<_PSR_PIVL_SHIFT)),gr5 or gr4,gr5,gr4 movgs gr4,psr // Make sure caches, MMUs are disabled movsg hsr0,gr4 li ~(_HSR0_ICE|_HSR0_DCE|_HSR0_IMMU|_HSR0_DMMU),gr5 and gr4,gr5,gr4 movgs gr4,hsr0 // Initialize hardware platform - this macro only contains // code which must be run before any "normal" accesses are // allowed, such as enabling DRAM controllers, etc. platform_init #if defined(CYG_HAL_STARTUP_ROMRAM)// Relocate code from ROM to static RAM call 10f // Actual address loaded at5: .long _vectors .long 20f .long 5b-_vectors .long __rom_data_end10: movsg lr,gr4 ldi @(gr4,0),gr6 ldi @(gr4,4),gr10 ldi @(gr4,8),gr7 ldi @(gr4,12),gr8 sub gr4,gr7,gr4 // GR4 - absolute base address subi gr4,#4,gr4 subi gr6,#4,gr6 setlos #4,gr715: ldu @(gr4,gr7),gr5 stu gr5,@(gr6,gr7) cmp gr6,gr8,icc0 bne icc0,0,15b jmpl @(gr10,gr0)20: nop #endif // Fall through to normal program startup #endif // CYG_HAL_STARTUP_ROM .text .global _start_start: // Set the global offset register (gr16) call .Lcall .Lcall: movsg lr,gr4 sethi #gprelhi(.Lcall),gr5 setlo #gprello(.Lcall),gr5 sub gr4,gr5,gr16 LED 0x0000 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) // Set up trap base register lda _vectors,gr4 movgs gr4,tbr LED 0x0001 // Relocate [copy] data from ROM to RAM lda __rom_data_start,gr4 lda __ram_data_start,gr5 lda __ram_data_end,gr6 cmp gr5,gr6,icc0 beq icc0,0,2f setlos #4,gr7 sub gr4,gr7,gr4 sub gr5,gr7,gr51: ldu @(gr4,gr7),gr8 stu gr8,@(gr5,gr7) cmp gr5,gr6,icc0 bne icc0,0,1b2: #endif // Set up stack, initial environment lda __startup_stack,gr4 mov gr4,sp // Enable caches early, based on configuration#ifdef CYGSEM_HAL_ENABLE_ICACHE_ON_STARTUP icei @(gr4,gr0),1 // purges current contents movsg hsr0,gr4 li _HSR0_ICE,gr5 // enable instruction cache or gr4,gr5,gr4 movgs gr4,hsr0#endif#ifdef CYGSEM_HAL_ENABLE_DCACHE_ON_STARTUP dcef @(gr4,gr0),1 // flush contents to memory dcei @(gr4,gr0),1 // purges current contents movsg hsr0,gr4 li _HSR0_DCE,gr5 // enable data cache or gr4,gr5,gr4 movgs gr4,hsr0#endif LED 0x0002 // Clear BSS space lda __bss_start,gr4 lda __bss_end,gr51: sti gr0,@(gr4,0) addi gr4,#4,gr4 cmp gr4,gr5,icc0 bne icc0,0,1b // Initialize interrupt handlers, etc li CYGNUM_HAL_ISR_COUNT,gr4 lda hal_interrupt_handlers,gr5 subi gr5,4,gr5 lda hal_default_isr,gr6 lda hal_vsr_table,gr8 subi gr8,4,gr8 // Note: this should be controlled by a CDL option lda _handle_interrupt,gr9 setlos #4,gr710: stu gr6,@(gr5,gr7) stu gr9,@(gr8,gr7) subi gr4,1,gr4 cmp gr4,gr0,icc0 bne icc0,0,10b LED 0x0003 // Initialize hardware call hal_hardware_init LED 0x0004 // Run any C++ initializations call cyg_hal_invoke_constructors LED 0x0005 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS call initialize_stub#endif LED 0x0006 // Start eCos application call cyg_start0: LED 0x0999 // Should never get here bra 0b//// Interrupt processing// _handle_interrupt: mov sp,gr31 // Save pointer to state frame movsg lr,gr29 // Set the global offset register (gr16) call 10f10: movsg lr,gr4 sethi #gprelhi(10b),gr5 setlo #gprello(10b),gr5 sub gr4,gr5,gr16 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK // Switch to interrupt stack#endif // The entire CPU state is now stashed on the stack, // increment the scheduler lock and handle the interrupt#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT .extern cyg_scheduler_sched_lock lda cyg_scheduler_sched_lock,gr8 ldi @(gr8,0),gr9 addi gr9,1,gr9 sti gr9,@(gr8,0)#endif#if defined(CYGPKG_KERNEL_INSTRUMENT) && \ defined(CYGDBG_KERNEL_INSTRUMENT_INTR) setlos #RAISE_INTR,gr8 // arg0 = type = INTR,RAISE ldi @(gr31,_TS_VECTOR),gr9 // arg1 = vector mov gr0,gr10 // arg2 = 0 call cyg_instrument // call instrument function#endif #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) // If we are supporting Ctrl-C interrupts from GDB, we must squirrel // away a pointer to the save interrupt state here so that we can // plant a breakpoint at some later time. .extern hal_saved_interrupt_state lda hal_saved_interrupt_state,gr5 sti sp,@(gr5,0)#endif lda hal_interrupt_data,gr5 lda hal_interrupt_handlers,gr7 mov gr30,gr8 // Interrupt vector # slli gr30,#2,gr4 ld @(gr5,gr4),gr9 // data pointer ld @(gr7,gr4),gr6 // function callil @(gr6,0) LED 0x0701#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT // The return value from the handler (in gr8) will indicate whether a // DSR is to be posted. Pass this together with a pointer to the // interrupt object we have just used to the interrupt tidy up routine. lda hal_interrupt_objects,gr5 slli gr30,#2,gr4 ld @(gr5,gr4),gr9 mov gr31,gr10 // register frame call interrupt_end // post any bottom layer handler // threads and call scheduler#endif movgs gr29,lr ret #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK// Execute pending DSRs the interrupt stack// Note: this can only be called from code running on a thread stack .globl hal_interrupt_stack_call_pending_DSRshal_interrupt_stack_call_pending_DSRs: subi sp,32,sp // Save important registers movsg lr,gr8 sti gr8,@(sp,0) // Turn on interrupts, switch to interrupt stack call cyg_interrupt_call_pending_DSRs // Turn off interrupts, switch back to thread stack ldi @(sp,0),gr8 movgs gr8,lr addi sp,32,sp ret#endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK//// Restore interrupt state // GR8 has state// .global hal_restore_interruptshal_restore_interrupts: movsg psr,gr4 setlos _PSR_PIVL_MASK,gr5 and gr8,gr5,gr8 // Save level being restored not gr5,gr5 and gr4,gr5,gr4 // Clear out current level or gr8,gr4,gr4 // Insert new level movgs gr4,psr ret .global hal_query_interruptshal_query_interrupts: movsg psr,gr8 setlos _PSR_PIVL_MASK,gr5 and gr8,gr5,gr8 ret //// "Vectors" - fixed location data items// This section contains any data which might be shared between// an eCos application and any other environment, e.g. the debug// ROM. // .section ".fixed_vectors"// Space for the virtual vectors .balign 16// Vectors used to communicate between eCos and ROM environments .globl hal_virtual_vector_tablehal_virtual_vector_table: .rept CYGNUM_CALL_IF_TABLE_SIZE .long 0 .endr .globl hal_vsr_tablehal_vsr_table: .rept CYGNUM_HAL_ISR_COUNT // exceptions & interrupts .long 0 .endr .section ".data"#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS .balign 16__GDB_stack_base: .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE // rather than 1k .byte 0 .endr__GDB_stack:#endif .balign 16__startup_stack_base:#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK .rept 512#else .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE#endif .byte 0 .endr .balign 16 .global __startup_stack__startup_stack: .globl hal_interrupt_handlershal_interrupt_handlers: .rept CYGNUM_HAL_ISR_COUNT .long 0 .endr .globl hal_interrupt_datahal_interrupt_data: .rept CYGNUM_HAL_ISR_COUNT .long 0 .endr .globl hal_interrupt_objectshal_interrupt_objects: .rept CYGNUM_HAL_ISR_COUNT .long 0 .endr
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?