summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/arm/cpu_asm.S
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-07-17 13:50:31 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-07-17 13:50:31 +0000
commit632e4306dcb9bada638e35e7cd5f1de0fcf66902 (patch)
tree859cba08c62c464bed3da9305c15015ddd82e422 /cpukit/score/cpu/arm/cpu_asm.S
parentUpdate. (diff)
downloadrtems-632e4306dcb9bada638e35e7cd5f1de0fcf66902.tar.bz2
exception handler maintenance
Diffstat (limited to 'cpukit/score/cpu/arm/cpu_asm.S')
-rw-r--r--cpukit/score/cpu/arm/cpu_asm.S130
1 files changed, 0 insertions, 130 deletions
diff --git a/cpukit/score/cpu/arm/cpu_asm.S b/cpukit/score/cpu/arm/cpu_asm.S
index 79882b294d..91654fa4bb 100644
--- a/cpukit/score/cpu/arm/cpu_asm.S
+++ b/cpukit/score/cpu/arm/cpu_asm.S
@@ -84,133 +84,3 @@ _restore:
FUNC_START_ARM(_CPU_Context_restore)
mov r1, r0
b _restore
-
-
-
-/* FIXME: _Exception_Handler_Undef_Swi is untested */
-FUNC_START_ARM(_Exception_Handler_Undef_Swi)
-/* FIXME: This should use load and store multiple instructions */
- sub r13,r13,#SIZE_REGS
- str r4, [r13, #REG_R4]
- str r5, [r13, #REG_R5]
- str r6, [r13, #REG_R6]
- str r7, [r13, #REG_R7]
- str r8, [r13, #REG_R8]
- str r9, [r13, #REG_R9]
- str r10, [r13, #REG_R10]
- str r11, [r13, #REG_R11]
- str sp, [r13, #REG_SP]
- str lr, [r13, #REG_LR]
- mrs r0, cpsr /* read the status */
- and r0, r0,#0x1f /* we keep the mode as exception number */
- str r0, [r13, #REG_PC] /* we store it in a free place */
- mov r0, r13 /* put frame address in r0 (C arg 1) */
-
- ldr r1, =SWI_Handler
- ldr lr, =_go_back_1
- ldr pc,[r1] /* call handler */
-_go_back_1:
- ldr r4, [r13, #REG_R4]
- ldr r5, [r13, #REG_R5]
- ldr r6, [r13, #REG_R6]
- ldr r7, [r13, #REG_R7]
- ldr r8, [r13, #REG_R8]
- ldr r9, [r13, #REG_R9]
- ldr r10, [r13, #REG_R10]
- ldr r11, [r13, #REG_R11]
- ldr sp, [r13, #REG_SP]
- ldr lr, [r13, #REG_LR]
- add r13,r13,#SIZE_REGS
- movs pc,r14 /* return */
-
-/* FIXME: _Exception_Handler_Abort is untested */
-FUNC_START_ARM(_Exception_Handler_Abort)
-/* FIXME: This should use load and store multiple instructions */
- sub r13,r13,#SIZE_REGS
- str r4, [r13, #REG_R4]
- str r5, [r13, #REG_R5]
- str r6, [r13, #REG_R6]
- str r7, [r13, #REG_R7]
- str r8, [r13, #REG_R8]
- str r9, [r13, #REG_R9]
- str sp, [r13, #REG_R11]
- str lr, [r13, #REG_SP]
- str lr, [r13, #REG_LR]
- mrs r0, cpsr /* read the status */
- and r0, r0,#0x1f /* we keep the mode as exception number */
- str r0, [r13, #REG_PC] /* we store it in a free place */
- mov r0, r13 /* put frame address in ro (C arg 1) */
-
- ldr r1, =_currentExcHandler
- ldr lr, =_go_back_2
- ldr pc,[r1] /* call handler */
-_go_back_2:
- ldr r4, [r13, #REG_R4]
- ldr r5, [r13, #REG_R5]
- ldr r6, [r13, #REG_R6]
- ldr r7, [r13, #REG_R7]
- ldr r8, [r13, #REG_R8]
- ldr r9, [r13, #REG_R9]
- ldr r10, [r13, #REG_R10]
- ldr sp, [r13, #REG_R11]
- ldr lr, [r13, #REG_SP]
- ldr lr, [r13, #REG_LR]
- add r13,r13,#SIZE_REGS
-#ifdef __thumb__
- subs r11, r14,#4
- bx r11
- nop
-#else
- subs pc,r14,#4 /* return */
-#endif
-
-#define ABORT_REGS_OFFS 32-REG_R4
-#define ABORT_SIZE_REGS SIZE_REGS+ABORT_REGS_OFFS
-
-FUNC_START_ARM(_exc_data_abort)
- sub sp, sp, #ABORT_SIZE_REGS /* reserve register frame */
- stmia sp, {r0-r11}
- add sp, sp, #ABORT_REGS_OFFS /* the Context_Control structure starts by CPSR, R4, ... */
-
- str ip, [sp, #REG_PC] /* store R12 (ip) somewhere, oh hackery, hackery, hack */
- str lr, [sp, #REG_LR]
-
- mov r1, lr
- ldr r0, [r1, #-8] /* r0 = bad instruction */
- mrs r1, spsr /* r1 = spsr */
- mov r2, r13 /* r2 = exception frame of Context_Control type */
-#if defined(__thumb__)
- .code 32
- /*arm to thumb*/
- adr r5, to_thumb + 1
- bx r5
- .code 16
-to_thumb:
-#endif
- bl do_data_abort
-#if defined(__thumb__)
-/*back to arm*/
- .code 16
-thumb_to_arm:
- .align 2
- adr r5, arm_code
- bx r5
- nop
- .code 32
-arm_code:
-#endif
-
- ldr lr, [sp, #REG_LR]
- ldr ip, [sp, #REG_PC] /* restore R12 (ip) */
-
- sub sp, sp, #ABORT_REGS_OFFS
- ldmia sp, {r0-r11}
- add sp, sp, #ABORT_SIZE_REGS
-#ifdef __thumb__
- subs r11, r14, #4 /* return to the instruction */
- bx r11
- nop
-#else
- subs pc, r14, #4
-#endif
- /* _AFTER_ the aborted one */