summaryrefslogtreecommitdiff
path: root/firmware/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/crt0.S')
-rw-r--r--firmware/crt0.S24
1 files changed, 23 insertions, 1 deletions
diff --git a/firmware/crt0.S b/firmware/crt0.S
index 1e07e0c029..54432c9731 100644
--- a/firmware/crt0.S
+++ b/firmware/crt0.S
@@ -249,6 +249,9 @@ boot_table:
249 /* Set up stack for IRQ mode */ 249 /* Set up stack for IRQ mode */
250 msr cpsr_c, #0xd2 250 msr cpsr_c, #0xd2
251 ldr sp, =irq_stack 251 ldr sp, =irq_stack
252 /* Let abort mode use IRQ stack */
253 msr cpsr_c, #0xd7
254 ldr sp, =irq_stack
252 /* Switch to supervisor mode */ 255 /* Switch to supervisor mode */
253 msr cpsr_c, #0xd3 256 msr cpsr_c, #0xd3
254 ldr sp, =stackend 257 ldr sp, =stackend
@@ -278,18 +281,37 @@ ecode:
278ecodeend: 281ecodeend:
279 282
280 .global irq 283 .global irq
284 .global UIE
281 285
286/* All illegal exceptions call into UIE with exception address as first
287 parameter. This is calculated differently depending on which exception
288 we're in. Second parameter is exception number, used for a string lookup
289 in UIE.
290 */
282undef_instr_handler: 291undef_instr_handler:
292 mov r0, lr
293 mov r1, #0
294 b UIE
295
296/* We run supervisor mode most of the time, and should never see a software
297 exception being thrown. Perhaps make it illegal and call UIE?
298 */
283software_int_handler: 299software_int_handler:
284reserved_handler: 300reserved_handler:
285 movs pc, lr 301 movs pc, lr
286 302
287prefetch_abort_handler: 303prefetch_abort_handler:
304 sub r0, lr, #4
305 mov r1, #1
306 b UIE
307
288fiq_handler: 308fiq_handler:
289 subs pc, lr, #4 309 subs pc, lr, #4
290 310
291data_abort_handler: 311data_abort_handler:
292 subs pc, lr, #8 312 sub r0, lr, #8
313 mov r1, #2
314 b UIE
293 315
294irq_handler: 316irq_handler:
295 stmfd sp!, {r0-r3, r12, lr} 317 stmfd sp!, {r0-r3, r12, lr}