From 2e0c35398db447a1fbe111c52507afe4eb313971 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sat, 22 May 2004 17:21:36 +0000 Subject: * bsd-kvm.c, bsd-kvm.h: New files. * i386fbsd-nat.c: Include , and "bsd-kvm.h". (i386fbsd_supply_pcb): New function. * Makefile.in (ALLDEPFILES): Add bsd-kvm.c. (i386fbsd-nat.o): Update dependencies. (bsd_kvm_h): New variable. (bsd-kvm.o): New dependency. * config/i386/fbsd.mh (NATDEPFILES): Add bsd-kvm.o. (LOADLIBES): New variable. --- gdb/i386fbsd-nat.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) (limited to 'gdb/i386fbsd-nat.c') diff --git a/gdb/i386fbsd-nat.c b/gdb/i386fbsd-nat.c index efc61b6..ed07711 100644 --- a/gdb/i386fbsd-nat.c +++ b/gdb/i386fbsd-nat.c @@ -29,9 +29,6 @@ #include "i386-tdep.h" -/* Prevent warning from -Wmissing-prototypes. */ -void _initialize_i386fbsd_nat (void); - /* Resume execution of the inferior process. If STEP is nonzero, single-step it. If SIGNAL is nonzero, give it that signal. */ @@ -79,6 +76,46 @@ child_resume (ptid_t ptid, int step, enum target_signal signal) perror_with_name ("ptrace"); } + +/* Support for debugging kernel virtual memory images. */ + +#include +#include + +#include "bsd-kvm.h" + +static int +i386fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) +{ + /* The following is true for FreeBSD 4.7: + + The pcb contains %eip, %ebx, %esp, %ebp, %esi, %edi and %gs. + This accounts for all callee-saved registers specified by the + psABI and then some. Here %esp contains the stack pointer at the + point just after the call to cpu_switch(). From this information + we reconstruct the register state as it would look when we just + returned from cpu_switch(). */ + + /* The stack pointer shouldn't be zero. */ + if (pcb->pcb_esp == 0) + return 0; + + pcb->pcb_esp += 4; + regcache_raw_supply (regcache, I386_EDI_REGNUM, &pcb->pcb_edi); + regcache_raw_supply (regcache, I386_ESI_REGNUM, &pcb->pcb_esi); + regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp); + regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp); + regcache_raw_supply (regcache, I386_EBX_REGNUM, &pcb->pcb_ebx); + regcache_raw_supply (regcache, I386_EIP_REGNUM, &pcb->pcb_eip); + regcache_raw_supply (regcache, I386_GS_REGNUM, &pcb->pcb_gs); + + return 1; +} + + +/* Prevent warning from -Wmissing-prototypes. */ +void _initialize_i386fbsd_nat (void); + void _initialize_i386fbsd_nat (void) { @@ -104,4 +141,7 @@ _initialize_i386fbsd_nat (void) } } #endif + + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (i386fbsd_supply_pcb); } -- cgit v1.1