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