[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v5] xen/riscv: dump GPRs and CSRs on unexpected traps
- To: Jan Beulich <jbeulich@xxxxxxxx>
- From: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
- Date: Wed, 28 Jan 2026 16:49:49 +0100
- Cc: Romain Caritey <Romain.Caritey@xxxxxxxxxxxxx>, Alistair Francis <alistair.francis@xxxxxxx>, Connor Davis <connojdavis@xxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
- Delivery-date: Wed, 28 Jan 2026 15:50:06 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
On 1/28/26 4:17 PM, Jan Beulich wrote:
On 28.01.2026 13:53, Oleksii Kurochko wrote:
--- a/xen/arch/riscv/traps.c
+++ b/xen/arch/riscv/traps.c
@@ -99,11 +99,65 @@ static const char *decode_cause(unsigned long cause)
return decode_trap_cause(cause);
}
-static void do_unexpected_trap(const struct cpu_user_regs *regs)
+static void dump_general_regs(const struct cpu_user_regs *regs)
{
- unsigned long cause = csr_read(CSR_SCAUSE);
+#define X(regs, name, delim) \
+ printk("%-4s: %016lx" delim, #name, (regs)->name)
+
+ X(regs, ra, " "); X(regs, sp, "\n");
+ X(regs, gp, " "); X(regs, tp, "\n");
+ X(regs, t0, " "); X(regs, t1, "\n");
+ X(regs, t2, " "); X(regs, s0, "\n");
+ X(regs, s1, " "); X(regs, a0, "\n");
+ X(regs, a1, " "); X(regs, a2, "\n");
+ X(regs, a3, " "); X(regs, a4, "\n");
+ X(regs, a5, " "); X(regs, a6, "\n");
+ X(regs, a7, " "); X(regs, s2, "\n");
+ X(regs, s3, " "); X(regs, s4, "\n");
+ X(regs, s5, " "); X(regs, s6, "\n");
+ X(regs, s7, " "); X(regs, s8, "\n");
+ X(regs, s9, " "); X(regs, s10, "\n");
+ X(regs, s11, " "); X(regs, t3, "\n");
+ X(regs, t4, " "); X(regs, t5, "\n");
+ X(regs, t6, " ");
DYM "\n" here?
Oh, right, it should be "\n".
+#undef X
+}
+
+static void dump_csrs(const char *ctx)
+{
+#define X(name, csr, fmt, ...) \
+ v = csr_read(csr); \
+ printk("%-10s: %016lx" fmt, #name, v, ##__VA_ARGS__)
+
+ unsigned long v;
+
+ X(htval, CSR_HTVAL, " "); X(htinst, CSR_HTINST, "\n");
+ X(hedeleg, CSR_HEDELEG, " "); X(hideleg, CSR_HIDELEG, "\n");
+ X(hstatus, CSR_HSTATUS, " [%s%s%s%s%s%s ]\n",
+ (v & HSTATUS_VTSR) ? " VTSR" : "",
+ (v & HSTATUS_VTVM) ? " VTVM" : "",
+ (v & HSTATUS_HU) ? " HU" : "",
+ (v & HSTATUS_SPVP) ? " SPVP" : "",
+ (v & HSTATUS_SPV) ? " SPV" : "",
+ (v & HSTATUS_GVA) ? " GVA" : "");
+ X(hgatp, CSR_HGATP, "\n");
+ X(hstateen0, CSR_HSTATEEN0, "\n");
+ X(stvec, CSR_STVEC, " "); X(vstvec, CSR_VSTVEC, "\n");
+ X(sepc, CSR_SEPC, " "); X(vsepc, CSR_VSEPC, "\n");
+ X(stval, CSR_STVAL, " "); X(vstval, CSR_VSTVAL, "\n");
+ X(status, CSR_SSTATUS, " "); X(vsstatus, CSR_VSSTATUS, "\n");
+ X(satp, CSR_SATP, "\n");
+ X(scause, CSR_SCAUSE, " %s[%s]\n", ctx, decode_cause(v));
For it, in particular the "ctx" string, to stand out, perhaps this wants moving
first in the function?
I would be grateful for this.
With the adjustments (happy to carry out while committing, so long as you
agree):
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
Thanks a lot.
~ Oleksii
|