git: cfe79bddf4b0 - stable/12 - amd64: allow gdb(4) to write to most registers

Mitchell Horne mhorne at FreeBSD.org
Mon Jan 4 21:11:18 UTC 2021


The branch stable/12 has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=cfe79bddf4b02bd3a9f9d299085ac84e25b0d491

commit cfe79bddf4b02bd3a9f9d299085ac84e25b0d491
Author:     Mitchell Horne <mhorne at FreeBSD.org>
AuthorDate: 2020-12-18 16:09:24 +0000
Commit:     Mitchell Horne <mhorne at FreeBSD.org>
CommitDate: 2021-01-04 20:50:43 +0000

    amd64: allow gdb(4) to write to most registers
    
    Similar to the recent patch to arm's gdb stub in r368414, allow GDB to
    update the contents of most general purpose registers.
    
    Sponsored by:   NetApp, Inc.
    Sponsored by:   Klara, Inc.
    
    (cherry picked from commit 0ef474de88fdb78e3cb7ac9bc0b1b98e5b49b4e4)
---
 sys/amd64/amd64/gdb_machdep.c   | 38 ++++++++++++++++++++++++++++++++++----
 sys/amd64/include/gdb_machdep.h | 16 ++++++++++++++++
 2 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/sys/amd64/amd64/gdb_machdep.c b/sys/amd64/amd64/gdb_machdep.c
index f7ca3c07ea36..cf5979b7a1ea 100644
--- a/sys/amd64/amd64/gdb_machdep.c
+++ b/sys/amd64/amd64/gdb_machdep.c
@@ -92,12 +92,42 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
 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.
+	 */
+	if (kdb_thread == curthread) {
+		switch (regnum) {
+		case GDB_REG_RAX: kdb_frame->tf_rax = regval; break;
+		case GDB_REG_RBX: kdb_frame->tf_rbx = regval; break;
+		case GDB_REG_RCX: kdb_frame->tf_rcx = regval; break;
+		case GDB_REG_RDX: kdb_frame->tf_rdx = regval; break;
+		case GDB_REG_RSI: kdb_frame->tf_rsi = regval; break;
+		case GDB_REG_RDI: kdb_frame->tf_rdi = regval; break;
+		case GDB_REG_RBP: kdb_frame->tf_rbp = regval; break;
+		case GDB_REG_RSP: kdb_frame->tf_rsp = regval; break;
+		case GDB_REG_R8:  kdb_frame->tf_r8  = regval; break;
+		case GDB_REG_R9:  kdb_frame->tf_r9  = regval; break;
+		case GDB_REG_R10: kdb_frame->tf_r10 = regval; break;
+		case GDB_REG_R11: kdb_frame->tf_r11 = regval; break;
+		case GDB_REG_R12: kdb_frame->tf_r12 = regval; break;
+		case GDB_REG_R13: kdb_frame->tf_r13 = regval; break;
+		case GDB_REG_R14: kdb_frame->tf_r14 = regval; break;
+		case GDB_REG_R15: kdb_frame->tf_r15 = regval; break;
+		case GDB_REG_PC:  kdb_frame->tf_rip = regval; break;
+		}
+	}
 	switch (regnum) {
-	case GDB_REG_PC:
-		kdb_thrctx->pcb_rip = *(register_t *)val;
-		if (kdb_thread  == curthread)
-			kdb_frame->tf_rip = *(register_t *)val;
+	case GDB_REG_RBX: kdb_thrctx->pcb_rbx = regval; break;
+	case GDB_REG_RBP: kdb_thrctx->pcb_rbp = regval; break;
+	case GDB_REG_RSP: kdb_thrctx->pcb_rsp = regval; break;
+	case GDB_REG_R12: kdb_thrctx->pcb_r12 = regval; break;
+	case GDB_REG_R13: kdb_thrctx->pcb_r13 = regval; break;
+	case GDB_REG_R14: kdb_thrctx->pcb_r14 = regval; break;
+	case GDB_REG_R15: kdb_thrctx->pcb_r15 = regval; break;
+	case GDB_REG_PC:  kdb_thrctx->pcb_rip = regval; break;
 	}
 }
 
diff --git a/sys/amd64/include/gdb_machdep.h b/sys/amd64/include/gdb_machdep.h
index 6ad8b01d00ca..add6dc94dfec 100644
--- a/sys/amd64/include/gdb_machdep.h
+++ b/sys/amd64/include/gdb_machdep.h
@@ -33,6 +33,22 @@
 
 #define	GDB_BUFSZ	(GDB_NREGS * 16)
 #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 __inline size_t


More information about the dev-commits-src-all mailing list