1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
.globl irq_handler
irq_handler:
mov r13,r0
sub r0,lr,#4
mov lr,r1
mrs r1,spsr
msr cpsr_c, #(MODE_SYS | IRQ_FLAG )
stmfd sp!,{r0,r1}
stmfd sp,{r2-r12, lr}
mov r0,sp
sub sp,sp,#(13*4)
msr cpsr_c, #(MODE_IRQ | IRQ_FLAG )
stmfd r0!,{r13,r14}
msr cpsr_c, #(MODE_SYS | IRQ_FLAG )
ldr r0, =current_task
ldr r0,[r0]
str sp,[r0]
ldr r12, =call_irq
mov lr,pc
bx r12
mov sp, #0
ldr r0, =current_task
ldr r0,[r0]
ldr sp,[r0]
msr cpsr_c,#(MODE_SYS | IRQ_FLAG )
mov r0,sp
add sp,sp,#(15*4)
msr cpsr_c,#(MODE_IRQ | IRQ_FLAG )
mov sp, r0
ldmfd sp,{r0-r12}^
nop
add sp, sp,#(13*4)
ldr lr,[sp, #4]
msr spsr_cxsf,lr
ldr lr,[sp]
add sp, sp,#(2*4)
movs pc,lr
|