Provide more context on the exception state when an unexpected exception occurs by dumping various Supervisor, Virtual Supervisor and Hypervisor CSRs.
Signed-off-by: Oleksii Kurochko <[email protected]> --- xen/arch/riscv/traps.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/xen/arch/riscv/traps.c b/xen/arch/riscv/traps.c index e9c967786312..d6c92588ea47 100644 --- a/xen/arch/riscv/traps.c +++ b/xen/arch/riscv/traps.c @@ -17,6 +17,10 @@ #include <asm/traps.h> #include <asm/vsbi.h> +#define print_csr(csr) do { \ + printk("\t" #csr ": %#02lx\n", csr_read(csr)); \ +} while ( 0 ) + /* * Initialize the trap handling. * @@ -99,12 +103,63 @@ static const char *decode_cause(unsigned long cause) return decode_trap_cause(cause); } +static void dump_csrs(unsigned long cause) +{ + unsigned long hstatus; + bool gva; + + printk("\nDumping CSRs...\n"); + + printk("Supervisor CSRs\n"); + print_csr(CSR_STVEC); + print_csr(CSR_SATP); + print_csr(CSR_SEPC); + + hstatus = csr_read(CSR_HSTATUS); + gva = !!(hstatus & HSTATUS_GVA); + + printk("\tCSR_STVAL: %#02lx%s\n", csr_read(CSR_STVAL), + gva ? ", (guest virtual address)" : ""); + + printk("\tCSR_SCAUSE: %#02lx\n", cause); + printk("\t\tDescription: %s\n", decode_cause(cause)); + print_csr(CSR_SSTATUS); + + printk("\nVirtual Supervisor CSRs\n"); + print_csr(CSR_VSTVEC); + print_csr(CSR_VSATP); + print_csr(CSR_VSEPC); + print_csr(CSR_VSTVAL); + cause = csr_read(CSR_VSCAUSE); + printk("\tCSR_VSCAUSE: %#02lx\n", cause); + printk("\t\tDescription: %s\n", decode_cause(cause)); + print_csr(CSR_VSSTATUS); + + printk("\nHypervisor CSRs\n"); + + print_csr(CSR_HSTATUS); + printk("\t\thstatus.VTSR=%d\n", !!(hstatus & HSTATUS_VTSR)); + printk("\t\thstatus.VTVM=%d\n", !!(hstatus & HSTATUS_VTVM)); + printk("\t\thstatus.HU=%d\n", !!(hstatus & HSTATUS_HU)); + printk("\t\thstatus.SPVP=%d\n", !!(hstatus & HSTATUS_SPVP)); + printk("\t\thstatus.SPV=%d\n", !!(hstatus & HSTATUS_SPV)); + printk("\t\thstatus.GVA=%d\n", !!(hstatus & HSTATUS_GVA)); + print_csr(CSR_HGATP); + print_csr(CSR_HTVAL); + print_csr(CSR_HTINST); + print_csr(CSR_HEDELEG); + print_csr(CSR_HIDELEG); + print_csr(CSR_HSTATEEN0); +} + static void do_unexpected_trap(const struct cpu_user_regs *regs) { unsigned long cause = csr_read(CSR_SCAUSE); printk("Unhandled exception: %s\n", decode_cause(cause)); + dump_csrs(cause); + die(); } -- 2.52.0
