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
This commit is contained in:
John Baldwin 2015-06-12 15:14:08 +00:00
parent 9f9d9cf33e
commit 5eb95e11ba
4 changed files with 21 additions and 2 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -2867,6 +2867,7 @@ makectx(struct trapframe *tf, struct pcb *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

View File

@ -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