xref: /openbmc/u-boot/arch/microblaze/cpu/exception.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
26260fb04SPeter Tyser /*
36260fb04SPeter Tyser  * (C) Copyright 2007 Michal Simek
46260fb04SPeter Tyser  *
56260fb04SPeter Tyser  * Michal  SIMEK <monstr@monstr.eu>
66260fb04SPeter Tyser  */
76260fb04SPeter Tyser 
86260fb04SPeter Tyser #include <common.h>
96260fb04SPeter Tyser #include <asm/asm.h>
106260fb04SPeter Tyser 
_hw_exception_handler(void)116260fb04SPeter Tyser void _hw_exception_handler (void)
126260fb04SPeter Tyser {
136260fb04SPeter Tyser 	int address = 0;
146260fb04SPeter Tyser 	int state = 0;
155e2fc801SMichal Simek 
166260fb04SPeter Tyser 	/* loading address of exception EAR */
176260fb04SPeter Tyser 	MFS(address, rear);
186260fb04SPeter Tyser 	/* loading excetpion state register ESR */
196260fb04SPeter Tyser 	MFS(state, resr);
206260fb04SPeter Tyser 	printf("Hardware exception at 0x%x address\n", address);
211c424d26SMichal Simek 	R17(address);
221c424d26SMichal Simek 	printf("Return address from exception 0x%x\n", address);
236260fb04SPeter Tyser 	switch (state & 0x1f) {	/* mask on exception cause */
246260fb04SPeter Tyser 	case 0x1:
256260fb04SPeter Tyser 		puts("Unaligned data access exception\n");
266260fb04SPeter Tyser 		break;
276260fb04SPeter Tyser 	case 0x2:
286260fb04SPeter Tyser 		puts("Illegal op-code exception\n");
296260fb04SPeter Tyser 		break;
306260fb04SPeter Tyser 	case 0x3:
316260fb04SPeter Tyser 		puts("Instruction bus error exception\n");
326260fb04SPeter Tyser 		break;
336260fb04SPeter Tyser 	case 0x4:
346260fb04SPeter Tyser 		puts("Data bus error exception\n");
356260fb04SPeter Tyser 		break;
366260fb04SPeter Tyser 	case 0x5:
376260fb04SPeter Tyser 		puts("Divide by zero exception\n");
386260fb04SPeter Tyser 		break;
396260fb04SPeter Tyser #ifdef MICROBLAZE_V5
40ef2c1d85SMichal Simek 	case 0x7:
41ef2c1d85SMichal Simek 		puts("Priviledged or stack protection violation exception\n");
42ef2c1d85SMichal Simek 		break;
436260fb04SPeter Tyser 	case 0x1000:
446260fb04SPeter Tyser 		puts("Exception in delay slot\n");
456260fb04SPeter Tyser 		break;
466260fb04SPeter Tyser #endif
476260fb04SPeter Tyser 	default:
486260fb04SPeter Tyser 		puts("Undefined cause\n");
496260fb04SPeter Tyser 		break;
506260fb04SPeter Tyser 	}
516260fb04SPeter Tyser 	printf("Unaligned %sword access\n", ((state & 0x800) ? "" : "half"));
526260fb04SPeter Tyser 	printf("Unaligned %s access\n", ((state & 0x400) ? "store" : "load"));
536260fb04SPeter Tyser 	printf("Register R%x\n", (state & 0x3E) >> 5);
546260fb04SPeter Tyser 	hang();
556260fb04SPeter Tyser }
566260fb04SPeter Tyser 
576260fb04SPeter Tyser #ifdef CONFIG_SYS_USR_EXCEP
_exception_handler(void)586260fb04SPeter Tyser void _exception_handler (void)
596260fb04SPeter Tyser {
606260fb04SPeter Tyser 	puts("User vector_exception\n");
616260fb04SPeter Tyser 	hang();
626260fb04SPeter Tyser }
636260fb04SPeter Tyser #endif
64