svn commit: r284325 - in head/sys: amd64/amd64 i386/i386 i386/include

John Baldwin jhb at FreeBSD.org
Fri Jun 12 15:14:10 UTC 2015


Author: jhb
Date: Fri Jun 12 15:14:08 2015
New Revision: 284325
URL: https://svnweb.freebsd.org/changeset/base/284325

Log:
  Report the values of x86 segment registers to remote debuggers.
  
  While here, also report %eflags from the i386 trapframe.
  
  Differential Revision:	https://reviews.freebsd.org/D2743
  Reviewed by:	kib
  Obtained from:	1 month

Modified:
  head/sys/amd64/amd64/gdb_machdep.c
  head/sys/i386/i386/gdb_machdep.c
  head/sys/i386/i386/machdep.c
  head/sys/i386/include/gdb_machdep.h

Modified: head/sys/amd64/amd64/gdb_machdep.c
==============================================================================
--- head/sys/amd64/amd64/gdb_machdep.c	Fri Jun 12 15:06:17 2015	(r284324)
+++ head/sys/amd64/amd64/gdb_machdep.c	Fri Jun 12 15:14:08 2015	(r284325)
@@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
 void *
 gdb_cpu_getreg(int regnum, size_t *regsz)
 {
+	static uint32_t _kcodesel = GSEL(GCODE_SEL, SEL_KPL);
+	static uint32_t _kdatasel = GSEL(GDATA_SEL, SEL_KPL);
 
 	*regsz = gdb_cpu_regsz(regnum);
 
@@ -76,6 +78,8 @@ gdb_cpu_getreg(int regnum, size_t *regsz
 	case 14: return (&kdb_thrctx->pcb_r14);
 	case 15: return (&kdb_thrctx->pcb_r15);
 	case 16: return (&kdb_thrctx->pcb_rip);
+	case 18: return (&_kcodesel);
+	case 19: return (&_kdatasel);
 	}
 	return (NULL);
 }

Modified: head/sys/i386/i386/gdb_machdep.c
==============================================================================
--- head/sys/i386/i386/gdb_machdep.c	Fri Jun 12 15:06:17 2015	(r284324)
+++ head/sys/i386/i386/gdb_machdep.c	Fri Jun 12 15:14:08 2015	(r284325)
@@ -45,14 +45,22 @@ __FBSDID("$FreeBSD$");
 void *
 gdb_cpu_getreg(int regnum, size_t *regsz)
 {
+	static uint32_t _kcodesel = GSEL(GCODE_SEL, SEL_KPL);
+	static uint32_t _kdatasel = GSEL(GDATA_SEL, SEL_KPL);
+	static uint32_t _kprivsel = GSEL(GPRIV_SEL, SEL_KPL);
 
 	*regsz = gdb_cpu_regsz(regnum);
 
-	if (kdb_thread  == curthread) {
+	if (kdb_thread == curthread) {
 		switch (regnum) {
 		case 0:	return (&kdb_frame->tf_eax);
 		case 1:	return (&kdb_frame->tf_ecx);
 		case 2:	return (&kdb_frame->tf_edx);
+		case 9: return (&kdb_frame->tf_eflags);
+		case 10: return (&kdb_frame->tf_cs);
+		case 12: return (&kdb_frame->tf_ds);
+		case 13: return (&kdb_frame->tf_es);
+		case 14: return (&kdb_frame->tf_fs);
 		}
 	}
 	switch (regnum) {
@@ -62,6 +70,12 @@ gdb_cpu_getreg(int regnum, size_t *regsz
 	case 6:  return (&kdb_thrctx->pcb_esi);
 	case 7:  return (&kdb_thrctx->pcb_edi);
 	case 8:  return (&kdb_thrctx->pcb_eip);
+	case 10: return (&_kcodesel);
+	case 11: return (&_kdatasel);
+	case 12: return (&_kdatasel);
+	case 13: return (&_kdatasel);
+	case 14: return (&_kprivsel);
+	case 15: return (&kdb_thrctx->pcb_gs);
 	}
 	return (NULL);
 }

Modified: head/sys/i386/i386/machdep.c
==============================================================================
--- head/sys/i386/i386/machdep.c	Fri Jun 12 15:06:17 2015	(r284324)
+++ head/sys/i386/i386/machdep.c	Fri Jun 12 15:14:08 2015	(r284325)
@@ -2867,6 +2867,7 @@ makectx(struct trapframe *tf, struct pcb
 	pcb->pcb_ebx = tf->tf_ebx;
 	pcb->pcb_eip = tf->tf_eip;
 	pcb->pcb_esp = (ISPL(tf->tf_cs)) ? tf->tf_esp : (int)(tf + 1) - 8;
+	pcb->pcb_gs = rgs();
 }
 
 int

Modified: head/sys/i386/include/gdb_machdep.h
==============================================================================
--- head/sys/i386/include/gdb_machdep.h	Fri Jun 12 15:06:17 2015	(r284324)
+++ head/sys/i386/include/gdb_machdep.h	Fri Jun 12 15:14:08 2015	(r284325)
@@ -30,7 +30,7 @@
 #define	_MACHINE_GDB_MACHDEP_H_
 
 #define	GDB_BUFSZ	400
-#define	GDB_NREGS	14
+#define	GDB_NREGS	16
 #define	GDB_REG_PC	8
 
 static __inline size_t


More information about the svn-src-all mailing list