mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-18 02:38:56 +00:00
7422b41175
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>
64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* (C) Copyright 2007 Michal Simek
|
|
*
|
|
* Michal SIMEK <monstr@monstr.eu>
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <hang.h>
|
|
#include <asm/asm.h>
|
|
|
|
void _hw_exception_handler (void)
|
|
{
|
|
int address = 0;
|
|
int state = 0;
|
|
|
|
/* loading address of exception EAR */
|
|
MFS(address, rear);
|
|
/* loading excetpion state register ESR */
|
|
MFS(state, resr);
|
|
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");
|
|
break;
|
|
case 0x2:
|
|
puts("Illegal op-code exception\n");
|
|
break;
|
|
case 0x3:
|
|
puts("Instruction bus error exception\n");
|
|
break;
|
|
case 0x4:
|
|
puts("Data bus error exception\n");
|
|
break;
|
|
case 0x5:
|
|
puts("Divide by zero exception\n");
|
|
break;
|
|
case 0x7:
|
|
puts("Priviledged or stack protection violation exception\n");
|
|
break;
|
|
default:
|
|
puts("Undefined cause\n");
|
|
break;
|
|
}
|
|
printf("Unaligned %sword access\n", ((state & 0x800) ? "" : "half"));
|
|
printf("Unaligned %s access\n", ((state & 0x400) ? "store" : "load"));
|
|
printf("Register R%x\n", (state & 0x3E) >> 5);
|
|
hang();
|
|
}
|
|
|
|
#if CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USR_EXCEP)
|
|
void _exception_handler (void)
|
|
{
|
|
puts("User vector_exception\n");
|
|
hang();
|
|
}
|
|
#endif
|