|
@@ -23,15 +23,16 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <common.h>
|
|
#include <common.h>
|
|
|
|
+#include <asm/asm.h>
|
|
|
|
|
|
void _hw_exception_handler (void)
|
|
void _hw_exception_handler (void)
|
|
{
|
|
{
|
|
int address = 0;
|
|
int address = 0;
|
|
int state = 0;
|
|
int state = 0;
|
|
/* loading address of exception EAR */
|
|
/* loading address of exception EAR */
|
|
- __asm__ __volatile ("mfs %0,rear"::"r" (address):"memory");
|
|
|
|
|
|
+ MFSEAR(address);
|
|
/* loading excetpion state register ESR */
|
|
/* loading excetpion state register ESR */
|
|
- __asm__ __volatile ("mfs %0,resr"::"r" (state):"memory");
|
|
|
|
|
|
+ MFSESR(state);
|
|
printf ("Hardware exception at 0x%x address\n", address);
|
|
printf ("Hardware exception at 0x%x address\n", address);
|
|
switch (state & 0x1f) { /* mask on exception cause */
|
|
switch (state & 0x1f) { /* mask on exception cause */
|
|
case 0x1:
|
|
case 0x1:
|
|
@@ -49,6 +50,11 @@ void _hw_exception_handler (void)
|
|
case 0x5:
|
|
case 0x5:
|
|
puts ("Divide by zero exception\n");
|
|
puts ("Divide by zero exception\n");
|
|
break;
|
|
break;
|
|
|
|
+#ifdef MICROBLAZE_V5
|
|
|
|
+ case 0x1000:
|
|
|
|
+ puts ("Exception in delay slot\n");
|
|
|
|
+ break;
|
|
|
|
+#endif
|
|
default:
|
|
default:
|
|
puts ("Undefined cause\n");
|
|
puts ("Undefined cause\n");
|
|
break;
|
|
break;
|