e2f2d2c23c2c06a522f2b7917881697a5b560704
[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 #19
40
41         ldr sp, =stack+0x10000  @ Set up stack
42         ldr r0, =kmain
43         mov pc, r0
44 1:      b 1b    @ Infinite loop
45 _ptr_kmain:
46         .long kmain
47
48 .comm stack, 0x10000    @ ; 64KiB Stack
49
50 SyscallHandler:
51         b .
52
53 .globl gpIRQHandler
54 gpIRQHandler:   .long   0
55 IRQ_saved_sp:   .long   0
56 IRQ_saved_lr:   .long   0
57 .globl IRQHandler
58 IRQHandler:
59         sub lr, #4      @ Adjust LR to the correct value
60         srsdb sp!, #19  @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD)
61         cpsie i, #19
62
63         PUSH_GPRS
64
65         ldr r0, =csIRQ_Tag
66         ldr r1, =csIRQ_Fmt
67         ldr r4, =Log_Debug
68         blx r4
69         
70         @ Call the registered handler
71         ldr r0, gpIRQHandler
72         blx r0
73
74         @ Restore CPU state
75         POP_GPRS
76         rfeia sp!       @ Pop state (actually RFEFD)
77         bx lr
78
79 .globl DataAbort
80 DataAbort:
81         sub lr, #8      @ Adjust LR to the correct value
82         srsdb sp!, #19  @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD)
83         cpsie i, #19
84         PUSH_GPRS
85
86         mov r2, lr
87         ldr r1, =csDataAbort_Fmt
88         ldr r0, =csDataAbort_Tag
89         ldr r4, =Log_Error
90         blx r4
91         b .
92
93         POP_GPRS
94         rfeia sp!       @ Pop state (actually RFEFD)
95         bx lr
96
97 csIRQ_Tag:
98 csDataAbort_Tag:
99         .asciz "ARMv7"
100 csIRQ_Fmt:
101         .asciz "IRQ"
102 csDataAbort_Fmt:
103         .asciz "Data Abort at %p"
104
105 .comm irqstack, 0x1000
106
107 .section .padata
108 .globl kernel_table0
109
110 kernel_table0:
111         .long 0x00000002        @ Identity map the first 1 MiB
112         .rept 0x7FC - 1
113                 .long 0
114         .endr
115         .long user_table1_map + 0x000 - KERNEL_BASE + 1
116         .long user_table1_map + 0x400 - KERNEL_BASE + 1
117         .long 0 @ user_table1_map + 0x800 - KERNEL_BASE + 1
118         .long 0 @ user_table1_map + 0xC00 - KERNEL_BASE + 1
119         @ 0x80000000 - User/Kernel split
120         .long 0x00000002        @ Map first 4 MiB to 2GiB
121         .long 0x00100002        @ 
122         .long 0x00200002        @ 
123         .long 0x00300002        @ 
124         .rept 0xF00 - 0x800 - 4
125                 .long 0
126         .endr
127 #if PCI_PADDR
128         .long PCI_PADDR +  0*(1 << 20) + 2      @ Map PCI config space
129         .long PCI_PADDR +  1*(1 << 20) + 2
130         .long PCI_PADDR +  2*(1 << 20) + 2
131         .long PCI_PADDR +  3*(1 << 20) + 2
132         .long PCI_PADDR +  4*(1 << 20) + 2
133         .long PCI_PADDR +  5*(1 << 20) + 2
134         .long PCI_PADDR +  6*(1 << 20) + 2
135         .long PCI_PADDR +  7*(1 << 20) + 2
136         .long PCI_PADDR +  8*(1 << 20) + 2
137         .long PCI_PADDR +  9*(1 << 20) + 2
138         .long PCI_PADDR + 10*(1 << 20) + 2
139         .long PCI_PADDR + 11*(1 << 20) + 2
140         .long PCI_PADDR + 12*(1 << 20) + 2
141         .long PCI_PADDR + 13*(1 << 20) + 2
142         .long PCI_PADDR + 14*(1 << 20) + 2
143         .long PCI_PADDR + 15*(1 << 20) + 2
144 #else
145         .rept 16
146                 .long 0
147         .endr
148 #endif
149         .long hwmap_table_0 + 0x000 - KERNEL_BASE + 1
150         .long hwmap_table_0 + 0x400 - KERNEL_BASE + 1
151         .long hwmap_table_0 + 0x800 - KERNEL_BASE + 1
152         .long hwmap_table_0 + 0xC00 - KERNEL_BASE + 1
153         .rept 0xFF8 - 0xF00 - 16 - 4
154                 .long 0
155         .endr
156         @ Page fractals
157         .long kernel_table1_map + 0x000 - KERNEL_BASE + 1
158         .long kernel_table1_map + 0x400 - KERNEL_BASE + 1
159         .long kernel_table1_map + 0x800 - KERNEL_BASE + 1
160         .long kernel_table1_map + 0xC00 - KERNEL_BASE + 1
161         @ Top level fractals
162         .long 0         @ removed for alignment constraints, using the KERNEL_BASE identity mapping instead
163         .rept 0x1000 - 0xFF8 - 5
164                 .long 0
165         .endr
166
167 @ PID0 user table
168 .globl user_table1_map
169 user_table1_map:        @ Size = 4KiB
170         .rept 0x7F8/4
171                 .long 0
172         .endr
173         .long kernel_table0 - KERNEL_BASE + (1 << 4) + 3
174         .long user_table1_map - KERNEL_BASE + (1 << 4) + 3
175         .rept 0x800/4
176                 .long 0
177         .endr
178
179 .globl kernel_table1_map
180 kernel_table1_map:      @ Size = 4KiB
181         .rept 0xF00/4
182                 .long 0
183         .endr
184         .long hwmap_table_0 - KERNEL_BASE + (1 << 4) + 3
185         .rept 0xFF8/4 - 0xF00/4 - 1
186                 .long 0
187         .endr
188         .long kernel_table1_map - KERNEL_BASE + (1 << 4) + 3
189         .long 0
190
191 @ Hardware mappings 
192 .globl hwmap_table_0
193 hwmap_table_0:
194         .long UART0_PADDR + (1 << 4) + 3        @ UART0
195         .rept 1024 - 1
196                 .long 0
197         .endr
198         

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