83b2d1b651b187c92c3ce38d417e74db8daa743a
[tpg/acess2.git] / Kernel / arch / arm7 / start.s
1 KERNEL_BASE =   0x80000000
2 @
3 @ Exception defs taken from ARM DDI 0406B
4
5 .section .init
6 interrupt_vector_table:
7         b _start @ Reset
8         b .     @ #UD
9         b SyscallHandler @ SVC (SWI assume)
10         b .     @ Prefetch abort
11         b .     @ Data abort
12         b .     @ Not Used
13         b .     @ IRQ
14         b .     @ FIQ (Fast interrupt)
15
16 .globl _start
17 _start:
18         ldr r0, =kernel_table0-KERNEL_BASE
19         mcr p15, 0, r0, c2, c0, 1       @ Set TTBR1 to r0
20         mcr p15, 0, r0, c2, c0, 0       @ Set TTBR0 to r0 too (for identity)
21
22         mov r0, #1
23         mcr p15, 0, r0, c2, c0, 2       @ Set TTCR to 1 (50/50 split)
24         
25         mov r0, #3
26         mcr p15, 0, r0, c3, c0, 0       @ Set Domain 0 to Manager
27
28         mrc p15, 0, r0, c1, c0, 0
29         orr r0, r0, #1
30         orr r0, r0, #1 << 23
31         mcr p15, 0, r0, c1, c0, 0
32
33         ldr sp, =stack+0x10000  @ Set up stack
34         ldr r0, =kmain
35         mov pc, r0
36 1:      b 1b    @ Infinite loop
37 _ptr_kmain:
38         .long kmain
39
40 .comm stack, 0x10000    @ ; 64KiB Stack
41
42 SyscallHandler:
43         b .
44 .section .padata
45 .globl kernel_table0
46
47 kernel_table0:
48         .long 0x00000002        @ Identity map the first 1 MiB
49         .rept 0x800 - 1
50                 .long 0
51         .endr
52         .long 0x00000002        @ Map first 4 MiB to 2GiB
53         .long 0x00100002        @ 
54         .long 0x00200002        @ 
55         .long 0x00300002        @ 
56         .rept 0xF00 - 0x800 - 4
57                 .long 0
58         .endr
59         .long hwmap_table_0 + 0x000 - KERNEL_BASE + 1
60         .long hwmap_table_0 + 0x400 - KERNEL_BASE + 1
61         .long hwmap_table_0 + 0x800 - KERNEL_BASE + 1
62         .long hwmap_table_0 + 0xC00 - KERNEL_BASE + 1
63         .rept 0xFF8 - 0xF00 - 4
64                 .long 0
65         .endr
66         .long kernel_table1_map + 0x000 - KERNEL_BASE + 1
67         .long kernel_table1_map + 0x400 - KERNEL_BASE + 1
68         .long kernel_table1_map + 0x800 - KERNEL_BASE + 1
69         .long kernel_table1_map + 0xC00 - KERNEL_BASE + 1
70         .long kernel_table0 - KERNEL_BASE + 2   @ Sure it maps too much, but fuck that
71         .rept 0x1000 - 0xFF8 - 5
72                 .long 0
73         .endr
74
75 .globl kernel_table1_map
76 kernel_table1_map:      @ Size = 4KiB
77         .rept 0xF00/4
78                 .long 0
79         .endr
80         .long hwmap_table_0 - KERNEL_BASE + (1 << 4) + 3
81         .rept 0xFF8/4 - 0xF00/4 - 1
82                 .long 0
83         .endr
84         .long kernel_table1_map - KERNEL_BASE + (1 << 4) + 3
85         .long 0
86
87 @ Hardware mappings 
88 .globl hwmap_table_0
89 hwmap_table_0:
90         .long 0x10009000 + (1 << 4) + 3 @ UART0
91         .rept 1024 - 1
92                 .long 0
93         .endr
94         

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