summaryrefslogtreecommitdiff
path: root/arch/microblaze/cpu/exception.c
diff options
context:
space:
mode:
authorOvidiu Panait <ovidiu.panait@windriver.com>2022-02-13 10:09:21 +0200
committerMichal Simek <michal.simek@xilinx.com>2022-02-15 13:11:43 +0100
commit7422b411757faa2a01487b43138f29b4fdde3c74 (patch)
tree2b4ad6f282b1d949665ef4e433b0b077e293c3ca /arch/microblaze/cpu/exception.c
parent1669b3d1a0b56178ec8123c48fbf6dabe46b23a4 (diff)
microblaze: exception: fix delay slot exception handling
The switch statement in _hw_exception_handler() only covers the rightmost 5 bits that encode the exception cause: switch (state & 0x1f) { ... } For this reason, the "0x1000" case will never be reached, because the 13th bit was zeroed out. To fix this, move delay slot exception handling before the switch statement (delay slot (DS) bit in Exception Status Register is independent of the exception cause (EC)). Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com> Link: https://lore.kernel.org/r/20220213080925.1548411-3-ovidiu.panait@windriver.com Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'arch/microblaze/cpu/exception.c')
-rw-r--r--arch/microblaze/cpu/exception.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/arch/microblaze/cpu/exception.c b/arch/microblaze/cpu/exception.c
index 5601dde5b4..64d5fe4a80 100644
--- a/arch/microblaze/cpu/exception.c
+++ b/arch/microblaze/cpu/exception.c
@@ -21,6 +21,11 @@ void _hw_exception_handler (void)
printf("Hardware exception at 0x%x address\n", address);
R17(address);
printf("Return address from exception 0x%x\n", address);
+
+ if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_DELAY_SLOT_EXCEP) &&
+ (state & 0x1000))
+ puts("Exception in delay slot\n");
+
switch (state & 0x1f) { /* mask on exception cause */
case 0x1:
puts("Unaligned data access exception\n");
@@ -40,11 +45,6 @@ void _hw_exception_handler (void)
case 0x7:
puts("Priviledged or stack protection violation exception\n");
break;
-#if CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_DELAY_SLOT_EXCEP)
- case 0x1000:
- puts("Exception in delay slot\n");
- break;
-#endif
default:
puts("Undefined cause\n");
break;