|
1 | 1 | #ifdef EXEC_BOOTSTRAP |
2 | 2 |
|
3 | | -.section ".init" |
4 | | -.global _start |
5 | | -.extern main |
| 3 | +.section .text.start |
6 | 4 | .align 4 |
7 | | -.arm |
8 | | - |
9 | | -#define SIZE_32KB 0b01110 |
10 | | -#define SIZE_128KB 0b10000 |
11 | | -#define SIZE_512KB 0b10010 |
12 | | -#define SIZE_2MB 0b10100 |
13 | | -#define SIZE_128MB 0b11010 |
14 | | -#define SIZE_256MB 0b11011 |
15 | | -#define SIZE_4GB 0b11111 |
16 | | - |
17 | | -@ Makes a MPU partition value |
18 | | -#define MAKE_PARTITION(offset, size_enum) \ |
19 | | - (((offset) >> 12 << 12) | ((size_enum) << 1) | 1) |
20 | | - |
21 | | - |
| 5 | +.global _start |
22 | 6 | _start: |
23 | | - b _init |
24 | | - |
25 | | - @ required, don't move :) |
26 | | - @ will be set to FIRM ARM9 entry point by BRAHMA |
27 | | - arm9ep_backup: .long 0xFFFF0000 |
28 | | - |
29 | | -_mpu_partition_table: |
30 | | - .word MAKE_PARTITION(0x00000000, SIZE_4GB) @ 0: Background region |
31 | | - .word MAKE_PARTITION(0x00000000, SIZE_128MB) @ 1: Instruction TCM (mirrored every 32KB) |
32 | | - .word MAKE_PARTITION(0x08000000, SIZE_2MB) @ 2: ARM9 internal memory |
33 | | - .word MAKE_PARTITION(0x10000000, SIZE_128MB) @ 3: IO region |
34 | | - .word MAKE_PARTITION(0x18000000, SIZE_128MB) @ 4: external device memory |
35 | | - .word MAKE_PARTITION(0x1FF80000, SIZE_512KB) @ 5: AXI WRAM |
36 | | - .word MAKE_PARTITION(0x20000000, SIZE_256MB) @ 6: FCRAM |
37 | | - .word 0 @ 7: Unused |
38 | | - |
39 | | -_populate_mpu: |
40 | | - push {r4-r5, lr} |
41 | | - ldr r4, =_mpu_partition_table |
42 | | - |
43 | | - ldr r5, [r4, #0x0] @ mmu_partition_table[0] load |
44 | | - mcr p15, 0, r5, c6, c0, 0 @ mmu_partition_table[0] write |
45 | | - ldr r5, [r4, #0x4] |
46 | | - mcr p15, 0, r5, c6, c1, 0 |
47 | | - ldr r5, [r4, #0x8] |
48 | | - mcr p15, 0, r5, c6, c2, 0 |
49 | | - ldr r5, [r4, #0xC] |
50 | | - mcr p15, 0, r5, c6, c3, 0 |
51 | | - ldr r5, [r4, #0x10] |
52 | | - mcr p15, 0, r5, c6, c4, 0 |
53 | | - ldr r5, [r4, #0x14] |
54 | | - mcr p15, 0, r5, c6, c5, 0 |
55 | | - ldr r5, [r4, #0x18] |
56 | | - mcr p15, 0, r5, c6, c6, 0 |
57 | | - ldr r5, [r4, #0x1C] |
58 | | - mcr p15, 0, r5, c6, c7, 0 |
| 7 | + @ Change the stack pointer |
| 8 | + mov sp, #0x27000000 |
59 | 9 |
|
60 | 10 | @ Give read/write access to all the memory regions |
61 | | - ldr r5, =0x03333333 |
62 | | - mcr p15, 0, r5, c5, c0, 2 @ data access |
63 | | - ldr r5, =0x03300330 |
64 | | - mcr p15, 0, r5, c5, c0, 3 @ instruction access |
65 | | - |
66 | | - mov r5, #0x66 |
67 | | - mcr p15, 0, r5, c2, c0, 0 @ data cachable |
68 | | - mcr p15, 0, r5, c2, c0, 1 @ instruction cachable |
69 | | - |
70 | | - mov r5, #0x10 |
71 | | - mcr p15, 0, r5, c3, c0, 0 @ data bufferable |
72 | | - |
73 | | - pop {r4-r5, pc} |
74 | | - |
75 | | -_enable_caches: |
76 | | - push {r4-r5, lr} |
77 | | - |
78 | | - bl _populate_mpu |
| 11 | + ldr r5, =0x33333333 |
| 12 | + mcr p15, 0, r5, c5, c0, 2 @ write data access |
| 13 | + mcr p15, 0, r5, c5, c0, 3 @ write instruction access |
| 14 | + |
| 15 | + @ Sets MPU permissions and cache settings |
| 16 | + ldr r0, =0xFFFF001D @ ffff0000 32k |
| 17 | + ldr r1, =0x01FF801D @ 01ff8000 32k |
| 18 | + ldr r2, =0x08000027 @ 08000000 1M |
| 19 | + ldr r3, =0x10000021 @ 10000000 128k |
| 20 | + ldr r4, =0x10100025 @ 10100000 512k |
| 21 | + ldr r5, =0x20000035 @ 20000000 128M |
| 22 | + ldr r6, =0x1FF00027 @ 1FF00000 1M |
| 23 | + ldr r7, =0x1800002D @ 18000000 8M |
| 24 | + mov r10, #0x25 |
| 25 | + mov r11, #0x25 |
| 26 | + mov r12, #0x25 |
| 27 | + mcr p15, 0, r0, c6, c0, 0 |
| 28 | + mcr p15, 0, r1, c6, c1, 0 |
| 29 | + mcr p15, 0, r2, c6, c2, 0 |
| 30 | + mcr p15, 0, r3, c6, c3, 0 |
| 31 | + mcr p15, 0, r4, c6, c4, 0 |
| 32 | + mcr p15, 0, r5, c6, c5, 0 |
| 33 | + mcr p15, 0, r6, c6, c6, 0 |
| 34 | + mcr p15, 0, r7, c6, c7, 0 |
| 35 | + mcr p15, 0, r10, c3, c0, 0 @ Write bufferable 0, 2, 5 |
| 36 | + mcr p15, 0, r11, c2, c0, 0 @ Data cacheable 0, 2, 5 |
| 37 | + mcr p15, 0, r12, c2, c0, 1 @ Inst cacheable 0, 2, 5 |
| 38 | + |
| 39 | + @ Enable caches |
| 40 | + mrc p15, 0, r4, c1, c0, 0 @ read control register |
| 41 | + orr r4, r4, #(1<<18) @ - itcm enable |
| 42 | + orr r4, r4, #(1<<12) @ - instruction cache enable |
| 43 | + orr r4, r4, #(1<<2) @ - data cache enable |
| 44 | + orr r4, r4, #(1<<0) @ - mpu enable |
| 45 | + mcr p15, 0, r4, c1, c0, 0 @ write control register |
| 46 | + |
| 47 | + @ Flush caches |
79 | 48 | mov r5, #0 |
80 | 49 | mcr p15, 0, r5, c7, c5, 0 @ flush I-cache |
81 | 50 | mcr p15, 0, r5, c7, c6, 0 @ flush D-cache |
| 51 | + mcr p15, 0, r5, c7, c10, 4 @ drain write buffer |
82 | 52 |
|
83 | | - mrc p15, 0, r4, c1, c0, 0 |
84 | | - orr r4, r4, #(1<<12) @ instruction cache enable |
85 | | - orr r4, r4, #(1<<2) @ data cache enable |
86 | | - orr r4, r4, #(1<<0) @ mpu enable |
87 | | - mcr p15, 0, r4, c1, c0, 0 |
88 | | - |
89 | | - pop {r4-r5, pc} |
90 | | - |
91 | | -_init: |
92 | | - push {r0-r12, lr} |
| 53 | + @ Fixes mounting of SDMC |
| 54 | + ldr r0, =0x10000020 |
| 55 | + mov r1, #0x340 |
| 56 | + str r1, [r0] |
93 | 57 |
|
94 | | - bl _enable_caches |
95 | 58 | bl main |
96 | 59 |
|
97 | | - mrc p15, 0, r4, c1, c0, 0 |
98 | | - bic r4, r4, #(1<<0) @ mpu disable |
99 | | - mcr p15, 0, r4, c1, c0, 0 |
100 | | - |
101 | | - pop {r0-r12, lr} |
102 | | - |
103 | | - @ return control to FIRM |
104 | | - ldr pc, arm9ep_backup |
| 60 | +.die: |
| 61 | + b .die |
105 | 62 |
|
106 | 63 | #endif // EXEC_BOOTSTRAP |
0 commit comments