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

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