aboutsummaryrefslogtreecommitdiff
path: root/kernel/exceptions/irq.S
blob: a7e78bc6b061ad1381de67c2208cde5eb1ca58b3 (plain)
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
.section ".text.exceptions"
.globl irq
irq:
	cpsid ai
	stmfd sp!, {r0-r12,lr}
	// Run IRQ handler
	bl c_irq_handler
	cmp r0, #1
	bne 1f
	// Schedule if interrupted a thread
	mrs r1, spsr
	and r1, r1, #0x1f
	cmp r1, #0x10
	bne 1f
	ldmfd sp!, {r0-r12,lr}
	// Don't skip missed instruction upon return
	sub lr, #4
	push {r3}
	// Store the instruction in a special area for
	//  future processing
	ldr r3, =irqlr
	str lr, [r3, #0]
	pop {r3}
	cps #0x13
	b schedule
1:
	ldmfd sp!, {r0-r12,lr}
	subs pc, lr, #4