diff --git a/sources/fault_vectors.c b/sources/fault_vectors.c index 53c1019..529e755 100644 --- a/sources/fault_vectors.c +++ b/sources/fault_vectors.c @@ -12,10 +12,131 @@ extern exception_handler SDRAM_VECTOR_TABLE[]; void fault_handler(uint32_t format_status, uint32_t pc) { - xprintf("\007\007exception!\r\n"); + int format; + int fault_status; + int vector; + int sr; + + xprintf("\007\007exception! Processor halted.\r\n"); xprintf("format_status: %lx\r\n", format_status); xprintf("pc: %lx\r\n", pc); - xprintf("processor halted.\r\n"); + + format = (format_status & 0b11110000000000000000000000000000) >> 28; + fault_status = ((format_status & 0b00001100000000000000000000000000) >> 26) | + ((format_status & 0b00000000000000110000000000000000) >> 16); + vector = (format_status & 0b00000011111111000000000000000000) >> 18; + sr = (format_status & 0b00000000000000001111111111111111); + + xprintf("format: %x\r\n", format); + xprintf("fault_status: %x ", fault_status); + switch (fault_status) + { + case 0: + xprintf("(not an access or address error nor an interrupted debug service routine)"); + break; + case 1: + case 3: + case 11: + xprintf("(reserved)"); + break; + case 2: + xprintf("(interrupt during a debug service routine for faults other than access errors)"); + break; + case 4: + xprintf("(error (for example, protection fault) on instruction fetch)"); + break; + case 5: + xprintf("(TLB miss on opword or instruction fetch)"); + break; + case 6: + xprintf("(TLB miss on extension word of instruction fetch)"); + break; + case 7: + xprintf("(IFP access error while executing in emulator mode)"); + break; + case 8: + xprintf("(error on data write)"); + break; + case 9: + xprintf("(error on attempted wrote to write-protected space)"); + break; + case 10: + xprintf("(TLB miss on data write)"); + break; + case 12: + xprintf("(error on data read)"); + break; + case 13: + xprintf("(attempted read, read-modify-write of protected space)"); + break; + case 14: + xprintf("(TLB miss on data read or read-modify-write"); + break; + case 15: + xprintf("(OEP access error while executing in emulator mode)"); + } + xprintf("\r\n"); + + xprintf("vector = %02x (", vector); + switch (vector) + { + case 2: + xprintf("access error"); + break; + case 3: + xprintf("address error"); + break; + case 4: + xprintf("illegal instruction"); + break; + case 5: + xprintf("divide by zero"); + break; + case 8: + xprintf("privilege violation"); + break; + case 9: + xprintf("trace"); + break; + case 10: + xprintf("unimplemented line-a opcode"); + break; + case 11: + xprintf("unimplemented line-f opcode"); + break; + case 12: + xprintf("non-PC breakpoint debug interrupt"); + break; + case 13: + xprintf("PC breakpoint debug interrupt"); + break; + case 14: + xprintf("format error"); + break; + case 24: + xprintf("spurious interrupt"); + break; + default: + if ( ((fault_status >= 6) && (fault_status <= 7)) || + ((fault_status >= 16) && (fault_status <= 23))) + { + xprintf("reserved"); + } + else if ((fault_status >= 25) && (fault_status <= 31)) + { + xprintf("level %d autovectored interrupt", fault_status - 24); + } + else if ((fault_status >= 32) && (fault_status <= 47)) + { + xprintf("trap #%d", fault_status - 32); + } + else + { + xprintf("unknown fault status"); + } + } + xprintf(")\r\n"); + xprintf("sr=%4x\r\n", sr); } void handler(void)