print-exception.c (2541B)
1 // Copyright 2022, Brian Swetland <swetland@frotz.net> 2 // Licensed under the Apache License, Version 2.0 3 4 #include <hw/debug.h> 5 #include <hw/riscv.h> 6 #include <hw/context.h> 7 #include <hw/intrinsics.h> 8 9 static const char* cause_name(uint32_t n) { 10 if (n & 0x80000000U) { 11 return "Interrupt"; 12 } else { 13 switch(n & 0x7FFFFFFFU) { 14 case 0: return "Instruction Address Misaligned"; 15 case 1: return "Instruction Address Fault"; 16 case 2: return "Illegal Instruction"; 17 case 3: return "Breakpoint"; 18 case 4: return "Load Address Misaligned"; 19 case 5: return "Load Address Fault"; 20 case 6: return "Store Address Misaligned"; 21 case 7: return "Store Address Fault"; 22 case 8: return "User Mode ECALL"; 23 case 9: return "Supervisor Mode ECALL"; 24 case 11: return "Machine Mode ECALL"; 25 case 12: return "Instruction Page Fault"; 26 case 13: return "Load Page Fault"; 27 case 15: return "Store Page Fault"; 28 } 29 } 30 return "Unknown"; 31 } 32 33 static const char* mode_name(uint32_t n) { 34 switch (n) { 35 case 0: return "User"; 36 case 1: return "Supervisor"; 37 case 3: return "Machine Mode"; 38 default: return "???"; 39 } 40 } 41 42 static void xprint_regs(eframe_t* ef, uint32_t xstatus, uint32_t xcause, uint32_t xtval) { 43 xprintf("pc %08x ra %08x sp %08x gp %08x xstatus %08x\n", 44 ef->pc, ef->ra, ef->sp, ef->gp, xstatus); 45 xprintf("tp %08x t0 %08x t1 %08x t2 %08x xcause %08x\n", 46 ef->tp, ef->t0, ef->t1, ef->t2, xcause); 47 xprintf("fp %08x s1 %08x a0 %08x a1 %08x xtval %08x\n", 48 ef->s0, ef->s1, ef->a0, ef->a1, xtval); 49 xprintf("a2 %08x a3 %08x a4 %08x a5 %08x\n", 50 ef->a2, ef->a3, ef->a4, ef->a5); 51 xprintf("a6 %08x a7 %08x s2 %08x s3 %08x\n", 52 ef->a6, ef->a7, ef->s2, ef->s3); 53 xprintf("s4 %08x s5 %08x s6 %08x s7 %08x\n", 54 ef->s4, ef->s5, ef->s6, ef->s7); 55 xprintf("s8 %08x s9 %08x 10 %08x 11 %08x\n", 56 ef->s8, ef->s9, ef->s10, ef->s11); 57 xprintf("t3 %08x t4 %08x t5 %08x t6 %08x\n", 58 ef->t3, ef->t4, ef->t5, ef->t6); 59 } 60 61 void xprint_m_exception(eframe_t* ef) { 62 uint32_t mstatus = csr_read(CSR_MSTATUS); 63 uint32_t mcause = csr_read(CSR_MCAUSE); 64 uint32_t mtval = csr_read(CSR_MTVAL); 65 xprintf("** %s (in %s mode)\n\n", cause_name(mcause), 66 mode_name((mstatus >> MSTATUS_MPP_SHIFT) & 3)); 67 xprint_regs(ef, mstatus, mcause, mtval); 68 69 } 70 void xprint_s_exception(eframe_t* ef) { 71 uint32_t sstatus = csr_read(CSR_SSTATUS); 72 uint32_t scause = csr_read(CSR_SCAUSE); 73 uint32_t stval = csr_read(CSR_STVAL); 74 xprintf("** %s (in %s mode)\n\n", cause_name(scause), 75 mode_name((sstatus >> SSTATUS_SPP_SHIFT) & 1)); 76 xprint_regs(ef, sstatus, scause, stval); 77 } 78