|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] xen/riscv: dump CSRs on unexpected traps
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 <oleksii.kurochko@xxxxxxxxx>
---
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |