xref: /openbmc/u-boot/arch/microblaze/cpu/exception.c (revision 1a459660)
16260fb04SPeter Tyser /*
26260fb04SPeter Tyser  * (C) Copyright 2007 Michal Simek
36260fb04SPeter Tyser  *
46260fb04SPeter Tyser  * Michal  SIMEK <monstr@monstr.eu>
56260fb04SPeter Tyser  *
6*1a459660SWolfgang 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);
216260fb04SPeter Tyser 	switch (state & 0x1f) {	/* mask on exception cause */
226260fb04SPeter Tyser 	case 0x1:
236260fb04SPeter Tyser 		puts ("Unaligned data access exception\n");
246260fb04SPeter Tyser 		break;
256260fb04SPeter Tyser 	case 0x2:
266260fb04SPeter Tyser 		puts ("Illegal op-code exception\n");
276260fb04SPeter Tyser 		break;
286260fb04SPeter Tyser 	case 0x3:
296260fb04SPeter Tyser 		puts ("Instruction bus error exception\n");
306260fb04SPeter Tyser 		break;
316260fb04SPeter Tyser 	case 0x4:
326260fb04SPeter Tyser 		puts ("Data bus error exception\n");
336260fb04SPeter Tyser 		break;
346260fb04SPeter Tyser 	case 0x5:
356260fb04SPeter Tyser 		puts ("Divide by zero exception\n");
366260fb04SPeter Tyser 		break;
376260fb04SPeter Tyser #ifdef MICROBLAZE_V5
386260fb04SPeter Tyser 	case 0x1000:
396260fb04SPeter Tyser 		puts ("Exception in delay slot\n");
406260fb04SPeter Tyser 		break;
416260fb04SPeter Tyser #endif
426260fb04SPeter Tyser 	default:
436260fb04SPeter Tyser 		puts ("Undefined cause\n");
446260fb04SPeter Tyser 		break;
456260fb04SPeter Tyser 	}
466260fb04SPeter Tyser 	printf ("Unaligned %sword access\n", ((state & 0x800) ? "" : "half"));
476260fb04SPeter Tyser 	printf ("Unaligned %s access\n", ((state & 0x400) ? "store" : "load"));
486260fb04SPeter Tyser 	printf ("Register R%x\n", (state & 0x3E) >> 5);
496260fb04SPeter Tyser 	hang ();
506260fb04SPeter Tyser }
516260fb04SPeter Tyser 
526260fb04SPeter Tyser #ifdef CONFIG_SYS_USR_EXCEP
536260fb04SPeter Tyser void _exception_handler (void)
546260fb04SPeter Tyser {
556260fb04SPeter Tyser 	puts ("User vector_exception\n");
566260fb04SPeter Tyser 	hang ();
576260fb04SPeter Tyser }
586260fb04SPeter Tyser #endif
59