diff options
Diffstat (limited to 'firmware/target/arm/tcc780x/crt0.S')
-rw-r--r-- | firmware/target/arm/tcc780x/crt0.S | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/firmware/target/arm/tcc780x/crt0.S b/firmware/target/arm/tcc780x/crt0.S index 03f17957c5..f02a204d7e 100644 --- a/firmware/target/arm/tcc780x/crt0.S +++ b/firmware/target/arm/tcc780x/crt0.S | |||
@@ -94,9 +94,8 @@ start_loc: | |||
94 | ldr pc, =copied_start /* jump to the relocated start_loc: */ | 94 | ldr pc, =copied_start /* jump to the relocated start_loc: */ |
95 | 95 | ||
96 | copied_start: | 96 | copied_start: |
97 | #endif | 97 | #endif /* TCCBOOT */ |
98 | #else | 98 | #endif /* BOOTLOADER */ |
99 | /* We don't use interrupts in the bootloader */ | ||
100 | 99 | ||
101 | /* Set up stack for IRQ mode */ | 100 | /* Set up stack for IRQ mode */ |
102 | mov r0,#0xd2 | 101 | mov r0,#0xd2 |
@@ -107,13 +106,15 @@ copied_start: | |||
107 | mov r0,#0xd1 | 106 | mov r0,#0xd1 |
108 | msr cpsr, r0 | 107 | msr cpsr, r0 |
109 | ldr sp, =fiq_stack | 108 | ldr sp, =fiq_stack |
110 | 109 | ||
110 | #ifndef BOOTLOADER | ||
111 | /* Load the banked FIQ mode registers with useful values here. | 111 | /* Load the banked FIQ mode registers with useful values here. |
112 | These values will be used in the FIQ handler in pcm-tcc780x.c */ | 112 | These values will be used in the FIQ handler in pcm-tcc780x.c */ |
113 | .equ DADO_BASE, 0xF0059020 | 113 | .equ DADO_BASE, 0xF0059020 |
114 | 114 | ||
115 | ldr r10, =DADO_BASE | 115 | ldr r10, =DADO_BASE |
116 | ldr r11, =dma_play_data | 116 | ldr r11, =dma_play_data |
117 | #endif | ||
117 | 118 | ||
118 | /* Let abort and undefined modes use IRQ stack */ | 119 | /* Let abort and undefined modes use IRQ stack */ |
119 | mov r0,#0xd7 | 120 | mov r0,#0xd7 |
@@ -122,7 +123,6 @@ copied_start: | |||
122 | mov r0,#0xdb | 123 | mov r0,#0xdb |
123 | msr cpsr, r0 | 124 | msr cpsr, r0 |
124 | ldr sp, =irq_stack | 125 | ldr sp, =irq_stack |
125 | #endif | ||
126 | 126 | ||
127 | /* Switch to supervisor mode */ | 127 | /* Switch to supervisor mode */ |
128 | mov r0,#0xd3 | 128 | mov r0,#0xd3 |
@@ -176,18 +176,19 @@ copied_start: | |||
176 | mcr p15, 0, r0, c7, c6, 0 /* Invalidate Dcache */ | 176 | mcr p15, 0, r0, c7, c6, 0 /* Invalidate Dcache */ |
177 | mcr p15, 0, r1, c8, c7, 0 /* Invalidate TLB */ | 177 | mcr p15, 0, r1, c8, c7, 0 /* Invalidate TLB */ |
178 | 178 | ||
179 | #if !defined(BOOTLOADER) && !defined(STUB) | 179 | #ifndef STUB |
180 | 180 | ||
181 | /* Copy exception handler code to address 0 */ | 181 | /* Copy exception handler code to address 0 */ |
182 | ldr r2, =_vectorsstart | 182 | mov r2, #0x0 |
183 | ldr r3, =_vectorsend | 183 | ldr r3, =vectors_start |
184 | ldr r4, =_vectorscopy | 184 | ldr r4, =vectors_end |
185 | 1: | 185 | 1: |
186 | cmp r3, r2 | 186 | cmp r4, r3 |
187 | ldrhi r5, [r4], #4 | 187 | ldrhi r5, [r3], #4 |
188 | strhi r5, [r2], #4 | 188 | strhi r5, [r2], #4 |
189 | bhi 1b | 189 | bhi 1b |
190 | 190 | ||
191 | #ifndef BOOTLOADER | ||
191 | /* Copy the IRAM (SRAM) */ | 192 | /* Copy the IRAM (SRAM) */ |
192 | ldr r2, =_iramcopy | 193 | ldr r2, =_iramcopy |
193 | ldr r3, =_iramstart | 194 | ldr r3, =_iramstart |
@@ -226,7 +227,8 @@ copied_start: | |||
226 | ldrhi r5, [r2], #4 | 227 | ldrhi r5, [r2], #4 |
227 | strhi r5, [r3], #4 | 228 | strhi r5, [r3], #4 |
228 | bhi 1b | 229 | bhi 1b |
229 | #endif /* !BOOTLOADER,!STUB */ | 230 | #endif /* !BOOTLOADER */ |
231 | #endif /* !STUB */ | ||
230 | 232 | ||
231 | /* Initialise bss section to zero */ | 233 | /* Initialise bss section to zero */ |
232 | ldr r2, =_edata | 234 | ldr r2, =_edata |
@@ -250,10 +252,9 @@ copied_start: | |||
250 | bl main | 252 | bl main |
251 | /* main() should never return */ | 253 | /* main() should never return */ |
252 | 254 | ||
253 | #ifndef BOOTLOADER | ||
254 | |||
255 | /* Exception handlers. Will be copied to address 0 after memory remapping */ | 255 | /* Exception handlers. Will be copied to address 0 after memory remapping */ |
256 | .section .vectors,"aw" | 256 | |
257 | vectors_start: | ||
257 | ldr pc, [pc, #24] | 258 | ldr pc, [pc, #24] |
258 | ldr pc, [pc, #24] | 259 | ldr pc, [pc, #24] |
259 | ldr pc, [pc, #24] | 260 | ldr pc, [pc, #24] |
@@ -274,6 +275,7 @@ vectors: | |||
274 | .word reserved_handler | 275 | .word reserved_handler |
275 | .word irq_handler | 276 | .word irq_handler |
276 | .word fiq_handler | 277 | .word fiq_handler |
278 | vectors_end: | ||
277 | 279 | ||
278 | .text | 280 | .text |
279 | 281 | ||
@@ -304,13 +306,16 @@ data_abort_handler: | |||
304 | mov r1, #2 | 306 | mov r1, #2 |
305 | b UIE | 307 | b UIE |
306 | 308 | ||
309 | #ifdef BOOTLOADER | ||
310 | fiq_handler: | ||
311 | subs pc, lr, #4 | ||
312 | #endif | ||
313 | |||
307 | #if defined(STUB) | 314 | #if defined(STUB) |
308 | UIE: | 315 | UIE: |
309 | b UIE | 316 | b UIE |
310 | #endif | 317 | #endif |
311 | 318 | ||
312 | /* We don't use interrupts in the bootloader */ | ||
313 | |||
314 | /* Align stacks to cache line boundary */ | 319 | /* Align stacks to cache line boundary */ |
315 | .balign 16 | 320 | .balign 16 |
316 | 321 | ||
@@ -321,5 +326,3 @@ irq_stack: | |||
321 | /* 256 words of FIQ stack */ | 326 | /* 256 words of FIQ stack */ |
322 | .space 256*4 | 327 | .space 256*4 |
323 | fiq_stack: | 328 | fiq_stack: |
324 | |||
325 | #endif | ||