e1bbe0c97765f4c4824cfd9391f99f02c3bbf10f
[tpg/acess2.git] / Kernel / arch / armv7 / start.S
1 KERNEL_BASE =   0x80000000
2 PCI_PADDR   =   0x60000000      @ Realview
3 UART0_PADDR =   0x10009000      @ Realview
4 @
5 @ Exception defs taken from ARM DDI 0406B
6
7 .section .init
8 interrupt_vector_table:
9         b _start @ Reset
10         b .     @ #UD
11         b SyscallHandler @ SVC (SWI assume)
12         b .     @ Prefetch abort
13         b .     @ Data abort
14         b .     @ Not Used
15         b IRQHandler    @ IRQ
16         b .     @ FIQ (Fast interrupt)
17
18 .globl _start
19 _start:
20         ldr r0, =kernel_table0-KERNEL_BASE
21         mcr p15, 0, r0, c2, c0, 1       @ Set TTBR1 to r0
22         mcr p15, 0, r0, c2, c0, 0       @ Set TTBR0 to r0 too (for identity)
23
24         mov r0, #1
25         mcr p15, 0, r0, c2, c0, 2       @ Set TTCR to 1 (50/50 split)
26         
27         mov r0, #3
28         mcr p15, 0, r0, c3, c0, 0       @ Set Domain 0 to Manager
29
30         mrc p15, 0, r0, c1, c0, 0
31         orr r0, r0, #1
32         orr r0, r0, #1 << 23
33         mcr p15, 0, r0, c1, c0, 0
34
35         ldr sp, =stack+0x10000  @ Set up stack
36         ldr r0, =kmain
37         mov pc, r0
38 1:      b 1b    @ Infinite loop
39 _ptr_kmain:
40         .long kmain
41
42 .comm stack, 0x10000    @ ; 64KiB Stack
43
44 SyscallHandler:
45         b .
46
47 IRQHandler:
48         b .
49
50 .section .padata
51 .globl kernel_table0
52
53 kernel_table0:
54         .long 0x00000002        @ Identity map the first 1 MiB
55         .rept 0x7FC - 1
56                 .long 0
57         .endr
58         .long user_table1_map + 0x000 - KERNEL_BASE + 1
59         .long user_table1_map + 0x400 - KERNEL_BASE + 1
60         .long 0 @ user_table1_map + 0x800 - KERNEL_BASE + 1
61         .long 0 @ user_table1_map + 0xC00 - KERNEL_BASE + 1
62         @ 0x80000000 - User/Kernel split
63         .long 0x00000002        @ Map first 4 MiB to 2GiB
64         .long 0x00100002        @ 
65         .long 0x00200002        @ 
66         .long 0x00300002        @ 
67         .rept 0xF00 - 0x800 - 4
68                 .long 0
69         .endr
70 #if PCI_PADDR
71         .long PCI_PADDR +  0*(1 << 20) + 2      @ Map PCI config space
72         .long PCI_PADDR +  1*(1 << 20) + 2
73         .long PCI_PADDR +  2*(1 << 20) + 2
74         .long PCI_PADDR +  3*(1 << 20) + 2
75         .long PCI_PADDR +  4*(1 << 20) + 2
76         .long PCI_PADDR +  5*(1 << 20) + 2
77         .long PCI_PADDR +  6*(1 << 20) + 2
78         .long PCI_PADDR +  7*(1 << 20) + 2
79         .long PCI_PADDR +  8*(1 << 20) + 2
80         .long PCI_PADDR +  9*(1 << 20) + 2
81         .long PCI_PADDR + 10*(1 << 20) + 2
82         .long PCI_PADDR + 11*(1 << 20) + 2
83         .long PCI_PADDR + 12*(1 << 20) + 2
84         .long PCI_PADDR + 13*(1 << 20) + 2
85         .long PCI_PADDR + 14*(1 << 20) + 2
86         .long PCI_PADDR + 15*(1 << 20) + 2
87 #else
88         .rept 16
89                 .long 0
90         .endr
91 #endif
92         .long hwmap_table_0 + 0x000 - KERNEL_BASE + 1
93         .long hwmap_table_0 + 0x400 - KERNEL_BASE + 1
94         .long hwmap_table_0 + 0x800 - KERNEL_BASE + 1
95         .long hwmap_table_0 + 0xC00 - KERNEL_BASE + 1
96         .rept 0xFF8 - 0xF00 - 16 - 4
97                 .long 0
98         .endr
99         @ Page fractals
100         .long kernel_table1_map + 0x000 - KERNEL_BASE + 1
101         .long kernel_table1_map + 0x400 - KERNEL_BASE + 1
102         .long kernel_table1_map + 0x800 - KERNEL_BASE + 1
103         .long kernel_table1_map + 0xC00 - KERNEL_BASE + 1
104         @ Top level fractals
105         .long 0         @ removed for alignment constraints, using the KERNEL_BASE identity mapping instead
106         .rept 0x1000 - 0xFF8 - 5
107                 .long 0
108         .endr
109
110 @ PID0 user table
111 .globl user_table1_map
112 user_table1_map:        @ Size = 4KiB
113         .rept 0x7F8/4
114                 .long 0
115         .endr
116         .long kernel_table0 - KERNEL_BASE + (1 << 4) + 3
117         .long user_table1_map - KERNEL_BASE + (1 << 4) + 3
118         .rept 0x800/4
119                 .long 0
120         .endr
121
122 .globl kernel_table1_map
123 kernel_table1_map:      @ Size = 4KiB
124         .rept 0xF00/4
125                 .long 0
126         .endr
127         .long hwmap_table_0 - KERNEL_BASE + (1 << 4) + 3
128         .rept 0xFF8/4 - 0xF00/4 - 1
129                 .long 0
130         .endr
131         .long kernel_table1_map - KERNEL_BASE + (1 << 4) + 3
132         .long 0
133
134 @ Hardware mappings 
135 .globl hwmap_table_0
136 hwmap_table_0:
137         .long UART0_PADDR + (1 << 4) + 3        @ UART0
138         .rept 1024 - 1
139                 .long 0
140         .endr
141         

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