5
5
#include <arm.h>
6
6
#include <brf.h>
7
7
8
- @ Make sure to preserve r0 - r2
9
8
. global _start
10
9
_start:
11
- @ Switch to supervisor mode and disable interrupts
12
- msr cpsr_c , #(SR_SYS_MODE | SR_IRQ | SR_FIQ)
10
+ @ Disable interrupts
11
+ mrs r4 , cpsr
12
+ orr r4 , r4 , #(SR_IRQ | SR_FIQ)
13
+ msr cpsr_c , r4
13
14
14
- @ Short delay ( not always necessary , just in case)
15
- mov r3 , # 0x40000
16
- .Lwaitloop:
17
- subs r3 , # 1
18
- bgt .Lwaitloop
19
-
20
- @ Check the load address
21
- adr r3 , _start
22
- ldr r4 , =__start__
23
- cmp r3 , r4
24
- beq _start_gm
25
-
26
- @ Relocate the binary to the correct location and branch to it
27
- ldr r5 , =__code_size__
28
- .Lbincopyloop:
29
- subs r5 , # 4
30
- ldrge r6 , [ r3 , r5 ]
31
- strge r6 , [ r4 , r5 ]
32
- bge .Lbincopyloop
33
-
34
- mov r5 , r0
35
- mov r6 , r1
36
- mov r7 , r2
37
- ldr r3 , =BRF_WB_INV_DCACHE
38
- blx r3
39
- mov r0 , r5
40
- mov r1 , r6
41
- mov r2 , r7
42
-
43
- mov lr , # 0
44
- mcr p15 , 0 , lr , c7 , c5 , 0 @ Invalidate ICache
45
-
46
- bx r4
47
-
48
- _start_gm:
49
- ldr sp , =__stack_top
15
+ @ Preserve boot registers
16
+ mov r9 , r0
17
+ mov r10 , r1
18
+ mov r11 , r2
50
19
51
- mov r9 , r0 @ argc
52
- mov r10 , r1 @ argv
20
+ @ Clear bss
21
+ ldr r0 , =__bss_start
22
+ ldr r1 , =__bss_end
23
+ mov r2 , # 0
24
+ .LBSS_Clear:
25
+ cmp r0 , r1
26
+ strlo r2 , [ r0 ], # 4
27
+ blo .LBSS_Clear
53
28
54
- ldr r4 , = 0xBEEF
55
- lsl r2 , # 16
56
- lsr r2 , # 16
57
- cmp r2 , r4 @ magic word
58
- movne r9 , # 0
29
+ ldr r0 , =BRF_WB_INV_DCACHE
30
+ blx r0 @ Writeback & Invalidate Data Cache
31
+ ldr r0 , =BRF_INVALIDATE_ICACHE
32
+ blx r0 @ Invalidate Instruction Cache
59
33
60
- @ Disable caches / mpu
34
+ @ Disable caches / DTCM / MPU
61
35
ldr r1 , =(CR_ENABLE_MPU | CR_ENABLE_DCACHE | CR_ENABLE_ICACHE | \
62
36
CR_ENABLE_DTCM)
63
- ldr r2 , =(CR_ENABLE_ITCM | CR_CACHE_RROBIN )
37
+ ldr r2 , =(CR_ENABLE_ITCM)
64
38
mrc p15 , 0 , r0 , c1 , c0 , 0
65
39
bic r0 , r1
66
40
orr r0 , r2
67
41
mcr p15 , 0 , r0 , c1 , c0 , 0
68
42
69
- @ Clear bss
70
- ldr r0 , =__bss_start
71
- ldr r1 , =__bss_end
72
- mov r2 , # 0
73
- .Lbss_clr:
74
- cmp r0 , r1
75
- strlt r2 , [ r0 ], # 4
76
- blt .Lbss_clr
77
-
78
- @ Invalidate caches
79
- mov r5 , # 0
80
- mcr p15 , 0 , r5 , c7 , c5 , 0 @ invalidate I - cache
81
- mcr p15 , 0 , r5 , c7 , c6 , 0 @ invalidate D - cache
82
- mcr p15 , 0 , r5 , c7 , c10 , 4 @ drain write buffer
43
+ @ Give full access to defined memory regions
44
+ ldr r0 , = 0x33333333
45
+ mcr p15 , 0 , r0 , c5 , c0 , 2 @ write data access
46
+ mcr p15 , 0 , r0 , c5 , c0 , 3 @ write instruction access
83
47
84
- @ Give read/write access to all the memory regions
85
- ldr r5 , = 0x33333333
86
- mcr p15 , 0 , r5 , c5 , c0 , 2 @ write data access
87
- mcr p15 , 0 , r5 , c5 , c0 , 3 @ write instruction access
88
-
89
- @ Sets MPU regions and cache settings
48
+ @ Set MPU regions and cache settings
90
49
adr r0 , __mpu_regions
91
50
ldmia r0 , {r1 - r8 }
92
- mov r0 , #0b00101101 @ bootrom/itcm/arm9 mem and fcram are cacheable/bufferable
51
+ mov r0 , #0b00101000
93
52
mcr p15 , 0 , r1 , c6 , c0 , 0
94
53
mcr p15 , 0 , r2 , c6 , c1 , 0
95
54
mcr p15 , 0 , r3 , c6 , c2 , 0
@@ -98,42 +57,53 @@ _start_gm:
98
57
mcr p15 , 0 , r6 , c6 , c5 , 0
99
58
mcr p15 , 0 , r7 , c6 , c6 , 0
100
59
mcr p15 , 0 , r8 , c6 , c7 , 0
101
- mcr p15 , 0 , r0 , c3 , c0 , 0 @ Write bufferable 0 , 2 , 5
102
- mcr p15 , 0 , r0 , c2 , c0 , 0 @ Data cacheable 0 , 2 , 5
103
- mcr p15 , 0 , r0 , c2 , c0 , 1 @ Inst cacheable 0 , 2 , 5
60
+ mcr p15 , 0 , r0 , c3 , c0 , 0 @ Write bufferable
61
+ mcr p15 , 0 , r0 , c2 , c0 , 0 @ Data cacheable
62
+ mcr p15 , 0 , r0 , c2 , c0 , 1 @ Inst cacheable
104
63
105
64
@ Enable dctm
106
- ldr r0 , = 0x3000800A @ set dtcm
107
- mcr p15 , 0 , r0 , c9 , c1 , 0 @ set the dtcm Region Register
108
-
109
- @ Install exception handlers
110
- ldr r0 , =XRQ_Start
111
- ldr r1 , =XRQ_End
112
- ldr r2 , = 0x00000000
113
- .LXRQ_Install:
114
- cmp r0 , r1
115
- ldrlt r3 , [ r0 ], # 4
116
- strlt r3 , [ r2 ], # 4
117
- blt .LXRQ_Install
65
+ ldr r0 , = 0x3000800A
66
+ mcr p15 , 0 , r0 , c9 , c1 , 0 @ set the DTCM Region Register
118
67
119
68
@ Enable caches / select low exception vectors
120
69
ldr r1 , =(CR_ALT_VECTORS | CR_DISABLE_TBIT)
121
- ldr r2 , =(CR_ENABLE_MPU | CR_ENABLE_DCACHE | CR_ENABLE_ICACHE | \
122
- CR_ENABLE_DTCM)
70
+ ldr r2 , =(CR_ENABLE_MPU | CR_ENABLE_DCACHE | CR_ENABLE_ICACHE | \
71
+ CR_ENABLE_DTCM | CR_CACHE_RROBIN )
123
72
mrc p15 , 0 , r0 , c1 , c0 , 0
124
73
bic r0 , r1
125
74
orr r0 , r2
126
75
mcr p15 , 0 , r0 , c1 , c0 , 0
127
76
128
- @ Fixes mounting of SDMC
129
- ldr r0 , = 0x10000000
77
+ @ Install exception handlers
78
+ ldr r0 , =XRQ_Start
79
+ ldr r1 , =XRQ_End
80
+ ldr r2 , = 0x00000000
81
+ .LXRQ_Install:
82
+ cmp r0 , r1
83
+ ldrlo r3 , [ r0 ], # 4
84
+ strlo r3 , [ r2 ], # 4
85
+ blo .LXRQ_Install
86
+
87
+ @ Fix SDMC mounting
88
+ mov r0 , # 0x10000000
130
89
mov r1 , # 0x340
131
90
str r1 , [ r0 , # 0x20 ]
132
91
133
- mov r0 , r9
134
- mov r1 , r10
92
+ @ Check arguments
93
+ lsl r2 , r11 , # 16
94
+ lsr r2 , r2 , # 16
135
95
136
- bl main
96
+ ldr r3 , = 0xBEEF
97
+ cmp r2 , r3
98
+
99
+ moveq r0 , r9
100
+ moveq r1 , r10
101
+ movne r0 , # 0
102
+
103
+ @ Switch to system mode , disable interrupts , setup application stack
104
+ msr cpsr_c , #(SR_SYS_MODE | SR_IRQ | SR_FIQ)
105
+ ldr sp , =__stack_top
106
+ b main
137
107
138
108
__mpu_regions:
139
109
. word 0xFFFF001F @ FFFF0000 64k | bootrom (unprotected / protected)
0 commit comments