Kernel/armv7 - Added IRQ stack, changed IRQs to be disabled until after handling
[tpg/acess2.git] / Kernel / arch / armv7 / start.S
1
2 #include "include/assembly.h"
3
4 KERNEL_BASE =   0x80000000
5 PCI_PADDR   =   0x60000000      @ Realview
6 UART0_PADDR =   0x10009000      @ Realview
7 @
8 @ Exception defs taken from ARM DDI 0406B
9
10 .section .init
11 interrupt_vector_table:
12 ivt_reset:      b _start @ Reset
13 ivt_undef:      b .     @ #UD
14 ivt_svc:        b SyscallHandler @ SVC (SWI assume)
15 ivt_prefetch:   b DataAbort     @ Prefetch abort
16 ivt_data:       b DataAbort     @ Data abort
17 ivt_unused:     b .     @ Not Used
18 ivt_irq:        b IRQHandler    @ IRQ
19 ivt_fiq:        b .     @ FIQ (Fast interrupt)
20
21 .globl _start
22 _start:
23         ldr r0, =kernel_table0-KERNEL_BASE
24         mcr p15, 0, r0, c2, c0, 1       @ Set TTBR1 to r0
25         mcr p15, 0, r0, c2, c0, 0       @ Set TTBR0 to r0 too (for identity)
26
27         mov r0, #1
28         mcr p15, 0, r0, c2, c0, 2       @ Set TTCR to 1 (50/50 split)
29         
30         mov r0, #3
31         mcr p15, 0, r0, c3, c0, 0       @ Set Domain 0 to Manager
32
33         mrc p15, 0, r0, c1, c0, 0
34         orr r0, r0, #1
35         orr r0, r0, #1 << 23
36         mcr p15, 0, r0, c1, c0, 0
37
38         @ Prepare for interrupts
39         cps #18 @ IRQ Mode
40         ldr sp, =irqstack+0x1000        @ Set up stack
41         cps #19
42
43         ldr sp, =stack+0x10000  @ Set up stack
44         ldr r0, =kmain
45         mov pc, r0
46 1:      b 1b    @ Infinite loop
47 _ptr_kmain:
48         .long kmain
49
50 .comm stack, 0x10000    @ ; 64KiB Stack
51 .comm irqstack, 0x1000  @ ; 4KiB Stack
52
53 SyscallHandler:
54         b .
55
56 .globl gpIRQHandler
57 gpIRQHandler:   .long   0
58 IRQ_saved_sp:   .long   0
59 IRQ_saved_lr:   .long   0
60 .globl IRQHandler
61 IRQHandler:
62         sub lr, #4      @ Adjust LR to the correct value
63         srsdb sp!, #19  @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD)
64         cps #19
65
66         PUSH_GPRS
67
68         ldr r0, =csIRQ_Tag
69         ldr r1, =csIRQ_Fmt
70         ldr r4, =Log_Debug
71         blx r4
72         
73         @ Call the registered handler
74         ldr r0, gpIRQHandler
75         blx r0
76
77         @ Restore CPU state
78         POP_GPRS
79         cpsie i
80         rfeia sp!       @ Pop state (actually RFEFD)
81         bx lr
82
83 .globl DataAbort
84 DataAbort:
85         sub lr, #8      @ Adjust LR to the correct value
86         srsdb sp!, #19  @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD)
87         cpsid ifa, #19
88         PUSH_GPRS
89
90         mov r2, lr
91         ldr r1, =csDataAbort_Fmt
92         ldr r0, =csDataAbort_Tag
93         ldr r4, =Log_Error
94         blx r4
95         b .
96
97         POP_GPRS
98         rfeia sp!       @ Pop state (actually RFEFD)
99         bx lr
100
101 csIRQ_Tag:
102 csDataAbort_Tag:
103         .asciz "ARMv7"
104 csIRQ_Fmt:
105         .asciz "IRQ"
106 csDataAbort_Fmt:
107         .asciz "Data Abort at %p"
108
109 .comm irqstack, 0x1000
110
111 .section .padata
112 .globl kernel_table0
113
114 kernel_table0:
115         .long 0x00000002        @ Identity map the first 1 MiB
116         .rept 0x7FC - 1
117                 .long 0
118         .endr
119         .long user_table1_map + 0x000 - KERNEL_BASE + 1
120         .long user_table1_map + 0x400 - KERNEL_BASE + 1
121         .long 0 @ user_table1_map + 0x800 - KERNEL_BASE + 1
122         .long 0 @ user_table1_map + 0xC00 - KERNEL_BASE + 1
123         @ 0x80000000 - User/Kernel split
124         .long 0x00000002        @ Map first 4 MiB to 2GiB
125         .long 0x00100002        @ 
126         .long 0x00200002        @ 
127         .long 0x00300002        @ 
128         .rept 0xF00 - 0x800 - 4
129                 .long 0
130         .endr
131 #if PCI_PADDR
132         .long PCI_PADDR +  0*(1 << 20) + 2      @ Map PCI config space
133         .long PCI_PADDR +  1*(1 << 20) + 2
134         .long PCI_PADDR +  2*(1 << 20) + 2
135         .long PCI_PADDR +  3*(1 << 20) + 2
136         .long PCI_PADDR +  4*(1 << 20) + 2
137         .long PCI_PADDR +  5*(1 << 20) + 2
138         .long PCI_PADDR +  6*(1 << 20) + 2
139         .long PCI_PADDR +  7*(1 << 20) + 2
140         .long PCI_PADDR +  8*(1 << 20) + 2
141         .long PCI_PADDR +  9*(1 << 20) + 2
142         .long PCI_PADDR + 10*(1 << 20) + 2
143         .long PCI_PADDR + 11*(1 << 20) + 2
144         .long PCI_PADDR + 12*(1 << 20) + 2
145         .long PCI_PADDR + 13*(1 << 20) + 2
146         .long PCI_PADDR + 14*(1 << 20) + 2
147         .long PCI_PADDR + 15*(1 << 20) + 2
148 #else
149         .rept 16
150                 .long 0
151         .endr
152 #endif
153         .long hwmap_table_0 + 0x000 - KERNEL_BASE + 1
154         .long hwmap_table_0 + 0x400 - KERNEL_BASE + 1
155         .long hwmap_table_0 + 0x800 - KERNEL_BASE + 1
156         .long hwmap_table_0 + 0xC00 - KERNEL_BASE + 1
157         .rept 0xFF8 - 0xF00 - 16 - 4
158                 .long 0
159         .endr
160         @ Page fractals
161         .long kernel_table1_map + 0x000 - KERNEL_BASE + 1
162         .long kernel_table1_map + 0x400 - KERNEL_BASE + 1
163         .long kernel_table1_map + 0x800 - KERNEL_BASE + 1
164         .long kernel_table1_map + 0xC00 - KERNEL_BASE + 1
165         @ Top level fractals
166         .long 0         @ removed for alignment constraints, using the KERNEL_BASE identity mapping instead
167         .rept 0x1000 - 0xFF8 - 5
168                 .long 0
169         .endr
170
171 @ PID0 user table
172 .globl user_table1_map
173 user_table1_map:        @ Size = 4KiB
174         .rept 0x7F8/4
175                 .long 0
176         .endr
177         .long kernel_table0 - KERNEL_BASE + (1 << 4) + 3
178         .long user_table1_map - KERNEL_BASE + (1 << 4) + 3
179         .rept 0x800/4
180                 .long 0
181         .endr
182
183 .globl kernel_table1_map
184 kernel_table1_map:      @ Size = 4KiB
185         .rept 0xF00/4
186                 .long 0
187         .endr
188         .long hwmap_table_0 - KERNEL_BASE + (1 << 4) + 3
189         .rept 0xFF8/4 - 0xF00/4 - 1
190                 .long 0
191         .endr
192         .long kernel_table1_map - KERNEL_BASE + (1 << 4) + 3
193         .long 0
194
195 @ Hardware mappings 
196 .globl hwmap_table_0
197 hwmap_table_0:
198         .long UART0_PADDR + (1 << 4) + 3        @ UART0
199         .rept 1024 - 1
200                 .long 0
201         .endr
202         

UCC git Repository :: git.ucc.asn.au