-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvic.S
More file actions
executable file
·113 lines (84 loc) · 2.09 KB
/
vic.S
File metadata and controls
executable file
·113 lines (84 loc) · 2.09 KB
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
.text
.equ VIC_BASEADDR, 0x10140000
.equ INTRSEL_OFF, 0x00c
.equ INTRENBL_OFF, 0x010
.equ SOFTINTR_OFF, 0x018
.equ SOFTINTRCLR_OFF, 0x01C
.equ IRQSTATUS_OFF, 0x00
.equ FIQSTATUS_OFF, 0x04
.global enable_vic, gen_soft_irq, enable_irq, enable_fiq, enable_cpsr_irq, enable_cpsr_fiq, \
disable_cpsr_irq, disable_cpsr_fiq
/* enable irq interrupts */
enable_cpsr_irq:
mrs r0, cpsr
and r0, r0, #0xFFFFFF7F
msr cpsr_c, r0
mov pc, lr
disable_cpsr_irq:
mrs r0, cpsr
orr r0, r0, #0x80
msr cpsr_c, r0
mov pc, lr
/* enable fiq interrrupts */
enable_cpsr_fiq:
mrs r0, cpsr
and r0, r0, #0xFFFFFFBF
msr cpsr_c, r0
mov pc, lr
disable_cpsr_fiq:
mrs r0, cpsr
orr r0, r0, #0x40
msr cpsr_c, r0
mov pc, lr
disable_interrupts:
push {lr}
bl disable_cpsr_irq
bl disable_cpsr_fiq
pop {pc}
/* we expect only one argument in r0, which contains the interrupt to enable
r0 = interrupt to enable
eg: enable_irq(1);
Generates an irq interrupt to processor, if an interrupt occurs on line 1
*/
enable_irq:
stmfd sp!, {lr}
ldr r1, =VIC_BASEADDR /* load base addr */
ldr r2, [r1, #INTRSEL_OFF] /* load the interrupt select register */
bic r2, r2, r0 /* enable irqs, by masking the corresponding irq bit */
str r2, [r1, #INTRSEL_OFF] /* enables software interrupt line */
str r0, [r1, #INTRENBL_OFF]
ldmfd sp!, {pc}
/*
r0 = irq no
eg: enable_fiq(2);
Generates an fiq interrupt to processor, if an interrupt occurs on line 2
*/
enable_fiq:
stmfd sp!, {lr}
ldr r1, =VIC_BASEADDR
str r0, [r1, #INTRSEL_OFF]
str r0, [r1, #INTRENBL_OFF]
ldmfd sp!, {pc}
/*generate_softint(20): Generates soft interrupt on line 20*/
gen_soft_irq:
stmfd sp!, {lr}
ldr r1, =VIC_BASEADDR
str r0, [r1, #SOFTINTR_OFF]
ldmfd sp!, {pc}
.global fiq_handler, irq_handler
fiq_handler:
stmfd sp!, {lr}
ldr r1, =VIC_BASEADDR
ldr r0, [r1, #FIQSTATUS_OFF]
bl handle_fiq
ldr r1, =VIC_BASEADDR
str r0, [r1, #SOFTINTRCLR_OFF]
ldmfd sp!, {pc}
irq_handler:
stmfd sp!, {lr}
ldr r1, =VIC_BASEADDR
ldr r0, [r1, #IRQSTATUS_OFF]
bl handle_irq
ldr r1, =VIC_BASEADDR
str r0, [r1, #SOFTINTRCLR_OFF]
ldmfd sp!, {pc}