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