Mercurial > nand-ecoscentric
diff packages/hal/arm/arch/current/src/vectors.S @ 20:5f5102441818 ecos-sw-1999-07-02
Merge from eCos master repository on 1999-07-02-23:17:07-BST
| author | jlarmour |
|---|---|
| date | Fri, 02 Jul 1999 15:44:37 +0000 |
| parents | 4f2df4ab82c8 |
| children | 306eee292492 |
line wrap: on
line diff
--- a/packages/hal/arm/arch/current/src/vectors.S +++ b/packages/hal/arm/arch/current/src/vectors.S @@ -209,7 +209,7 @@ 2: ldr sp,.__exception_stack mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_FIQ_MODE) msr cpsr,r0 - ldr sp,.__exception_stack + ldr sp,.__FIQ_exception_stack mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_UNDEF_MODE) msr cpsr,r0 ldr sp,.__exception_stack @@ -297,7 +297,7 @@ 10: str fp,[sp,#armreg_sp] // SP at time of interrupt #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS mov r0,sp - bl undefined_instruction + bl cyg_hal_report_undefined_instruction #endif mov v1,#CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION b call_exception_handler @@ -329,7 +329,7 @@ software_interrupt: str r0,[sp,#armreg_sp] // SP at time of interrupt #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS mov r0,sp - bl software_interrupt + bl cyg_hal_report_software_interrupt #endif mov v1,#CYGNUM_HAL_EXCEPTION_INTERRUPT b call_exception_handler @@ -372,7 +372,7 @@ 10: str fp,[sp,#armreg_sp] // SP at time of interrupt #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS mov r0,sp - bl abort_prefetch + bl cyg_hal_report_abort_prefetch #endif mov v1,#CYGNUM_HAL_EXCEPTION_CODE_ACCESS b call_exception_handler @@ -415,43 +415,12 @@ 10: str fp,[sp,#armreg_sp] // SP at time of interrupt #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS mov r0,sp - bl abort_data + bl cyg_hal_report_abort_data #endif mov v1,#CYGNUM_HAL_EXCEPTION_DATA_ACCESS b call_exception_handler - .code 32 -FIQ: - ldr sp,.__startup_stack // get good stack - sub lr,lr,#4 // PC at time of interrupt - stmfd sp!,{r0,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} - mov ip,sp // save SP which will vanish with - // mode switch - mrs r0,cpsr // switch to Supervisor Mode - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_SUPERVISOR_MODE - msr cpsr,r0 // sp,lr are now old values - mov ip,sp - ldr sp,.__startup_stack // get good stack - sub sp,sp,#ARMREG_SIZE+16 // make space for frame - stmea sp,{r0-r10,fp} // save immediately visible registers - ldmfd ip,{r0-r3} // saved registers - str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt - str r1,[sp,#armreg_r0] // saved R0 - str r2,[sp,#armreg_ip] // saved IP - str r3,[sp,#armreg_pc] // PC at time of interrupt - str lr,[sp,#armreg_lr] // LR at time of interrupt - add r0,ip,#ARMREG_SIZE - str r0,[sp,#armreg_sp] // SP at time of interrupt -#ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS - mov r0,sp - bl FIQ -#endif - mov v1,#CYGNUM_HAL_EXCEPTION_FIQ - b call_exception_handler - + // // Dispatch an exception handler. @@ -462,7 +431,7 @@ call_exception_handler: bl exception_handler #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS mov r0,sp - bl exception_handler_returned + bl cyg_hal_report_exception_handler_returned #endif // Restore [interrupted] context @@ -490,6 +459,16 @@ call_exception_handler: // it needs to interface with the kernel (if present). .code 32 +FIQ: + // Note: I use this exception stack while saving the context because + // the current SP does not seem to be always valid in this CPU mode. + ldr sp,.__FIQ_exception_stack // get good stack + sub lr,lr,#4 // PC at time of interrupt + stmfd sp!,{r0,fp,ip,lr} + mrs r0,spsr + stmfd sp!,{r0} + b handle_IRQ_or_FIQ + IRQ: // Note: I use this exception stack while saving the context because // the current SP does not seem to be always valid in this CPU mode. @@ -498,11 +477,13 @@ IRQ: stmfd sp!,{r0,fp,ip,lr} mrs r0,spsr stmfd sp!,{r0} + +handle_IRQ_or_FIQ: mov ip,sp // save SP which will vanish with // mode switch mrs r0,cpsr // switch to Supervisor Mode bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_SUPERVISOR_MODE + orr r0,r0,#CPSR_SUPERVISOR_MODE|CPSR_FIQ_DISABLE|CPSR_IRQ_DISABLE msr cpsr,r0 // sp,lr are now old values mov fp,sp // save old SP sub sp,sp,#ARMREG_SIZE // make space for frame @@ -619,8 +600,8 @@ hal_interrupt_stack_call_pending_DSRs: stmfd sp!,{r4,r5,lr} // Disable interrupts mrs r4,cpsr // disable IRQ's - orr r2,r4,#CPSR_IRQ_DISABLE - bic r5,r4,#CPSR_IRQ_DISABLE + orr r2,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE + bic r5,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE msr cpsr,r2 // Switch to interrupt stack mov r3,sp // save old stack pointer @@ -636,7 +617,7 @@ hal_interrupt_stack_call_pending_DSRs: // Disable interrupts mrs r1,cpsr // disable IRQ's - orr r2,r1,#CPSR_IRQ_DISABLE + orr r2,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE msr cpsr,r2 // Move back to the thread stack. @@ -676,6 +657,7 @@ PTR(__GDB_stack_base) PTR(__GDB_stack) #endif PTR(__startup_stack) +PTR(__FIQ_exception_stack) PTR(__exception_stack) PTR(__undef_exception_stack) PTR(__bss_start) @@ -749,6 +731,10 @@ hal_interrupt_objects: .rept 32 .long 0 .endr +__FIQ_exception_stack: + .rept 32 + .long 0 + .endr __exception_stack: .rept 32 .long 0
