| From 4b03c93ef1a41391e46322af5f7bdd41e5aaaf88 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 23 Mar 2026 17:43:47 -0600 |
| Subject: riscv: kgdb: fix several debug register assignment bugs |
| |
| From: Paul Walmsley <pjw@kernel.org> |
| |
| [ Upstream commit 834911eb8eef2501485d819b4eabebadc25c3497 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/riscv/kernel/kgdb.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| diff --git a/arch/riscv/kernel/kgdb.c b/arch/riscv/kernel/kgdb.c |
| index 1d83b36967212..eb737c7a563b9 100644 |
| --- a/arch/riscv/kernel/kgdb.c |
| +++ b/arch/riscv/kernel/kgdb.c |
| @@ -194,7 +194,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)}, |
| @@ -263,8 +263,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; |
| } |
| |
| -- |
| 2.53.0 |
| |