]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
riscv: kgdb: fix several debug register assignment bugs
authorPaul Walmsley <pjw@kernel.org>
Mon, 23 Mar 2026 23:43:47 +0000 (17:43 -0600)
committerPaul Walmsley <pjw@kernel.org>
Sun, 5 Apr 2026 00:36:52 +0000 (18:36 -0600)
Fix several bugs in the RISC-V kgdb implementation:

- The element of dbg_reg_def[] that is supposed to pertain to the S1
  register embeds instead the struct pt_regs offset of the A1
  register.  Fix this to use the S1 register offset in struct pt_regs.

- The sleeping_thread_to_gdb_regs() function copies the value of the
  S10 register into the gdb_regs[] array element meant for the S9
  register, and copies the value of the S11 register into the array
  element meant for the S10 register.  It also neglects to copy the
  value of the S11 register.  Fix all of these issues.

Fixes: fe89bd2be8667 ("riscv: Add KGDB support")
Cc: Vincent Chen <vincent.chen@sifive.com>
Link: https://patch.msgid.link/fde376f8-bcfd-bfe4-e467-07d8f7608d05@kernel.org
Signed-off-by: Paul Walmsley <pjw@kernel.org>
arch/riscv/kernel/kgdb.c

index 15fec5d1e6decfd7d6a6e3031579905ea53da692..0bf629204c76a45d34cdf0c3d45f1b4856996663 100644 (file)
@@ -175,7 +175,7 @@ struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] = {
        {DBG_REG_T1, GDB_SIZEOF_REG, offsetof(struct pt_regs, t1)},
        {DBG_REG_T2, GDB_SIZEOF_REG, offsetof(struct pt_regs, t2)},
        {DBG_REG_FP, GDB_SIZEOF_REG, offsetof(struct pt_regs, s0)},
-       {DBG_REG_S1, GDB_SIZEOF_REG, offsetof(struct pt_regs, a1)},
+       {DBG_REG_S1, GDB_SIZEOF_REG, offsetof(struct pt_regs, s1)},
        {DBG_REG_A0, GDB_SIZEOF_REG, offsetof(struct pt_regs, a0)},
        {DBG_REG_A1, GDB_SIZEOF_REG, offsetof(struct pt_regs, a1)},
        {DBG_REG_A2, GDB_SIZEOF_REG, offsetof(struct pt_regs, a2)},
@@ -244,8 +244,9 @@ sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *task)
        gdb_regs[DBG_REG_S6_OFF] = task->thread.s[6];
        gdb_regs[DBG_REG_S7_OFF] = task->thread.s[7];
        gdb_regs[DBG_REG_S8_OFF] = task->thread.s[8];
-       gdb_regs[DBG_REG_S9_OFF] = task->thread.s[10];
-       gdb_regs[DBG_REG_S10_OFF] = task->thread.s[11];
+       gdb_regs[DBG_REG_S9_OFF] = task->thread.s[9];
+       gdb_regs[DBG_REG_S10_OFF] = task->thread.s[10];
+       gdb_regs[DBG_REG_S11_OFF] = task->thread.s[11];
        gdb_regs[DBG_REG_EPC_OFF] = task->thread.ra;
 }