Index: sys/amd64/amd64/gdb_machdep.c =================================================================== --- sys/amd64/amd64/gdb_machdep.c +++ sys/amd64/amd64/gdb_machdep.c @@ -92,12 +92,89 @@ void gdb_cpu_setreg(int regnum, void *val) { + register_t regval = *(register_t *)val; + /* + * Write registers to the trapframe and pcb, if applicable. + * Some scratch registers are not tracked by the pcb. + */ switch (regnum) { - case GDB_REG_PC: - kdb_thrctx->pcb_rip = *(register_t *)val; + case GDB_REG_RAX: + if (kdb_thread == curthread) + kdb_frame->tf_rax = regval; + break; + case GDB_REG_RBX: + kdb_thrctx->pcb_rbx = regval; + if (kdb_thread == curthread) + kdb_frame->tf_rbx = regval; + break; + case GDB_REG_RCX: + if (kdb_thread == curthread) + kdb_frame->tf_rcx = regval; + break; + case GDB_REG_RDX: + if (kdb_thread == curthread) + kdb_frame->tf_rdx = regval; + break; + case GDB_REG_RSI: + if (kdb_thread == curthread) + kdb_frame->tf_rsi = regval; + break; + case GDB_REG_RDI: + if (kdb_thread == curthread) + kdb_frame->tf_rdi = regval; + break; + case GDB_REG_RBP: + kdb_thrctx->pcb_rbp = regval; + if (kdb_thread == curthread) + kdb_frame->tf_rbp = regval; + break; + case GDB_REG_RSP: + kdb_thrctx->pcb_rsp = regval; + if (kdb_thread == curthread) + kdb_frame->tf_rsp = regval; + break; + case GDB_REG_R8: + if (kdb_thread == curthread) + kdb_frame->tf_r8 = regval; + break; + case GDB_REG_R9: + if (kdb_thread == curthread) + kdb_frame->tf_r9 = regval; + break; + case GDB_REG_R10: + if (kdb_thread == curthread) + kdb_frame->tf_r10 = regval; + break; + case GDB_REG_R11: + if (kdb_thread == curthread) + kdb_frame->tf_r11 = regval; + break; + case GDB_REG_R12: + kdb_thrctx->pcb_r12 = regval; if (kdb_thread == curthread) - kdb_frame->tf_rip = *(register_t *)val; + kdb_frame->tf_r12 = regval; + break; + case GDB_REG_R13: + kdb_thrctx->pcb_r13 = regval; + if (kdb_thread == curthread) + kdb_frame->tf_r13 = regval; + break; + case GDB_REG_R14: + kdb_thrctx->pcb_r14 = regval; + if (kdb_thread == curthread) + kdb_frame->tf_r14 = regval; + break; + case GDB_REG_R15: + kdb_thrctx->pcb_r15 = regval; + if (kdb_thread == curthread) + kdb_frame->tf_r15 = regval; + break; + case GDB_REG_PC: + kdb_thrctx->pcb_rip = regval; + if (kdb_thread == curthread) + kdb_frame->tf_rip = regval; + break; } } Index: sys/amd64/include/gdb_machdep.h =================================================================== --- sys/amd64/include/gdb_machdep.h +++ sys/amd64/include/gdb_machdep.h @@ -33,6 +33,22 @@ #define GDB_BUFSZ 4096 #define GDB_NREGS 56 +#define GDB_REG_RAX 0 +#define GDB_REG_RBX 1 +#define GDB_REG_RCX 2 +#define GDB_REG_RDX 3 +#define GDB_REG_RSI 4 +#define GDB_REG_RDI 5 +#define GDB_REG_RBP 6 +#define GDB_REG_RSP 7 +#define GDB_REG_R8 8 +#define GDB_REG_R9 9 +#define GDB_REG_R10 10 +#define GDB_REG_R11 11 +#define GDB_REG_R12 12 +#define GDB_REG_R13 13 +#define GDB_REG_R14 14 +#define GDB_REG_R15 15 #define GDB_REG_PC 16 _Static_assert(GDB_BUFSZ >= (GDB_NREGS * 16), "buffer fits 'g' regs");