diff options
author | Daniel Schwierzeck | 2016-02-07 19:39:58 +0100 |
---|---|---|
committer | Daniel Schwierzeck | 2016-11-30 16:11:39 +0100 |
commit | 345490fcd68d830adef7fcfa4ef5bf5681c29546 (patch) | |
tree | 319b20f5840e24709449ac842b173368280297cf /arch/mips/cpu | |
parent | af3971f81ac0fc344461cf86af682ecf1ebe18a8 (diff) |
MIPS: fix ROM exception vectors
When booting from ROM, early exceptions can't be handled
properly. Instead of busy-looping give the developer the
possibilty to examine the situation. Invoke an UHI
exception operation which can be read as unhandled exception
by a hardware debugger if one is attached. If the debugger
doesn't support UHI, the exception is read as unexpected
breakpoint.
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Diffstat (limited to 'arch/mips/cpu')
-rw-r--r-- | arch/mips/cpu/start.S | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/arch/mips/cpu/start.S b/arch/mips/cpu/start.S index 108d2df38ad..2397b6cc823 100644 --- a/arch/mips/cpu/start.S +++ b/arch/mips/cpu/start.S @@ -52,6 +52,14 @@ .set noreorder + .macro uhi_mips_exception + move k0, t9 # preserve t9 in k0 + move k1, a0 # preserve a0 in k1 + li t9, 15 # UHI exception operation + li a0, 0 # Use hard register context + sdbbp 1 # Invoke UHI operation + .endm + ENTRY(_start) /* U-Boot entry point */ b reset @@ -79,30 +87,30 @@ ENTRY(_start) #endif #if defined(CONFIG_ROM_EXCEPTION_VECTORS) + /* + * Exception vector entry points. When running from ROM, an exception + * cannot be handled. Halt execution and transfer control to debugger, + * if one is attached. + */ .org 0x200 /* TLB refill, 32 bit task */ -1: b 1b - nop + uhi_mips_exception .org 0x280 /* XTLB refill, 64 bit task */ -1: b 1b - nop + uhi_mips_exception .org 0x300 /* Cache error exception */ -1: b 1b - nop + uhi_mips_exception .org 0x380 /* General exception */ -1: b 1b - nop + uhi_mips_exception .org 0x400 /* Catch interrupt exceptions */ -1: b 1b - nop + uhi_mips_exception .org 0x480 /* EJTAG debug exception */ @@ -222,6 +230,7 @@ reset: move a0, zero # a0 <-- boot_flags = 0 PTR_LA t9, board_init_f + jr t9 move ra, zero |