aboutsummaryrefslogtreecommitdiff
path: root/src/interrupts/interrupt_vector.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/interrupts/interrupt_vector.S')
-rw-r--r--src/interrupts/interrupt_vector.S56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/interrupts/interrupt_vector.S b/src/interrupts/interrupt_vector.S
new file mode 100644
index 0000000..1ec80f7
--- /dev/null
+++ b/src/interrupts/interrupt_vector.S
@@ -0,0 +1,56 @@
+_interrupt_vectors:
+ b reset_handler_caller
+ b undef_handler_caller
+ b svc_handler_caller
+ b abort_handler_caller
+ b abort_handler_caller
+ b generic_handler_caller
+ b irq_handler_caller
+ b fiq_handler_caller
+
+reset_handler_caller:
+ ldr sp, =_supervisor_stack_top
+ ldr r5, =reset_handler
+ bx r5
+
+undef_handler_caller:
+ ldr sp, =_supervisor_stack_top
+ ldr r5, =undefined_instruction_vector
+ bx r5
+
+svc_handler_caller:
+ ldr sp, =_supervisor_stack_top
+ push {r0-r12, lr}
+ mov r0, sp
+ ldr r5, =supervisor_call_handler
+ blx r5
+ ldm sp!, {r0-r12, pc} ^
+
+abort_handler_caller:
+ ldr sp, =_supervisor_stack_top
+ ldr r5, =abort_handler
+ bx r5
+
+generic_handler_caller:
+ ldr sp, =_supervisor_stack_top
+ ldr r5, =generic_handler
+ bx r5
+
+irq_handler_caller:
+ ldr sp, =_irq_stack_top
+ sub lr, #4
+ push {r0-r12, lr}
+ mov r0, sp
+ ldr r3, =irq_handler
+ blx r3
+ ldm sp!, {r0-r12, pc} ^
+
+fiq_handler_caller:
+ ldr sp, =_fiq_stack_top
+ ldr r5, =fiq_handler
+ bx r5
+
+irq:
+ mov sp, #0x8000
+ ldr r5, =abort_handler
+ subs pc,lr,#4