xref: /openbmc/u-boot/arch/microblaze/cpu/exception.c (revision 1c424d26)
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;
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);
21*1c424d26SMichal Simek 	R17(address);
22*1c424d26SMichal 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
586260fb04SPeter Tyser void _exception_handler (void)
596260fb04SPeter Tyser {
606260fb04SPeter Tyser 	puts ("User vector_exception\n");
616260fb04SPeter Tyser 	hang ();
626260fb04SPeter Tyser }
636260fb04SPeter Tyser #endif
64