os-workshop

same materials and sample source for RV32 OS projects
git clone http://frotz.net/git/os-workshop.git
Log | Files | Refs

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