From 061e86e90a849ffea50af6d0c0708bd49465e497 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sat, 22 May 2004 22:42:53 +0000 Subject: [PATCH] * amd64obsd-nat.c: Include "gdbcore.h", "regcache.h", , , and "bsd-kvm.h". (amd64obsd_supply_pcb): New function. (_initialize_amd64obsd_nat): Enable libkvm interface. * Makefile.in (amd64obsd-nat.o): Update dependencies. * config/i386/obsd64.mh (NATDEPFILES): Add bsd-kvm.o (LOADLIBES): New variable. --- gdb/ChangeLog | 8 +++++ gdb/Makefile.in | 4 +-- gdb/amd64obsd-nat.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ gdb/config/i386/obsd64.mh | 4 ++- 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 30772fbabd..9055649513 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2004-05-23 Mark Kettenis + * amd64obsd-nat.c: Include "gdbcore.h", "regcache.h", + , , and "bsd-kvm.h". + (amd64obsd_supply_pcb): New function. + (_initialize_amd64obsd_nat): Enable libkvm interface. + * Makefile.in (amd64obsd-nat.o): Update dependencies. + * config/i386/obsd64.mh (NATDEPFILES): Add bsd-kvm.o + (LOADLIBES): New variable. + * sparcnbsd-nat.c: Include "gdbcore.h", "regcache.h", , and "bsd-kvm.h". (sparc32nbsd_supply_pcb): New function. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index d2ef0bb9f2..8afa97fbc3 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1553,8 +1553,8 @@ amd64nbsd-nat.o: amd64nbsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \ amd64nbsd-tdep.o: amd64nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \ $(gdbcore_h) $(osabi_h) $(symtab_h) $(gdb_assert_h) $(amd64_tdep_h) \ $(nbsd_tdep_h) $(solib_svr4_h) -amd64obsd-nat.o: amd64obsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \ - $(amd64_nat_h) +amd64obsd-nat.o: amd64obsd-nat.c $(defs_h) $(gdbcore_h) $(regcache_h) \ + $(gdb_assert_h) $(amd64_tdep_h) $(amd64_nat_h) $(bsd_kvm_h) amd64obsd-tdep.o: amd64obsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \ $(symtab_h) $(objfiles_h) $(osabi_h) $(regset_h) $(target_h) \ $(gdb_assert_h) $(gdb_string_h) $(amd64_tdep_h) $(i387_tdep_h) \ diff --git a/gdb/amd64obsd-nat.c b/gdb/amd64obsd-nat.c index e8d92fefa8..0f9b5efac7 100644 --- a/gdb/amd64obsd-nat.c +++ b/gdb/amd64obsd-nat.c @@ -20,6 +20,8 @@ Boston, MA 02111-1307, USA. */ #include "defs.h" +#include "gdbcore.h" +#include "regcache.h" #include "gdb_assert.h" @@ -56,6 +58,76 @@ static int amd64obsd32_r_reg_offset[] = }; +/* Support for debugging kernel virtual memory images. */ + +#include +#include +#include + +#include "bsd-kvm.h" + +static int +amd64obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) +{ + struct switchframe sf; + int regnum; + + /* The following is true for OpenBSD 3.5: + + The pcb contains the stack pointer at the point of the context + switch in cpu_switch(). At that point we have a stack frame as + described by `struct switchframe', which for OpenBSD 3.5 has the + following layout: + + interrupt level + %r15 + %r14 + %r13 + %r12 + %rbp + %rbx + return address + + Together with %rsp in the pcb, this accounts for all callee-saved + registers specified by the psABI. From this information we + reconstruct the register state as it would look when we just + returned from cpu_switch(). + + For core dumps the pcb is saved by savectx(). In that case the + stack frame only contains the return address, and there is no way + to recover the other registers. */ + + /* The stack pointer shouldn't be zero. */ + if (pcb->pcb_rsp == 0) + return 0; + + /* Read the stack frame, and check its validity. */ + read_memory (pcb->pcb_rsp, (char *) &sf, sizeof sf); + if (sf.sf_rbp == pcb->pcb_rbp) + { + /* Yes, we have a frame that matches cpu_switch(). */ + pcb->pcb_rsp += sizeof (struct switchframe); + regcache_raw_supply (regcache, 12, &sf.sf_r12); + regcache_raw_supply (regcache, 13, &sf.sf_r13); + regcache_raw_supply (regcache, 14, &sf.sf_r14); + regcache_raw_supply (regcache, 15, &sf.sf_r15); + regcache_raw_supply (regcache, AMD64_RBX_REGNUM, &sf.sf_rbx); + regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &sf.sf_rip); + } + else + { + /* No, the pcb must have been last updated by savectx(). */ + pcb->pcb_rsp += 8; + regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &sf); + } + + regcache_raw_supply (regcache, AMD64_RSP_REGNUM, &pcb->pcb_rsp); + regcache_raw_supply (regcache, AMD64_RBP_REGNUM, &pcb->pcb_rbp); + + return 1; +} + + /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_amd64obsd_nat (void); @@ -65,4 +137,7 @@ _initialize_amd64obsd_nat (void) amd64_native_gregset32_reg_offset = amd64obsd32_r_reg_offset; amd64_native_gregset32_num_regs = ARRAY_SIZE (amd64obsd32_r_reg_offset); amd64_native_gregset64_reg_offset = amd64obsd_r_reg_offset; + + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (amd64obsd_supply_pcb); } diff --git a/gdb/config/i386/obsd64.mh b/gdb/config/i386/obsd64.mh index 99ccfa2023..3e0a0e7099 100644 --- a/gdb/config/i386/obsd64.mh +++ b/gdb/config/i386/obsd64.mh @@ -1,5 +1,7 @@ # Host: OpenBSD/amd64 NATDEPFILES= fork-child.o infptrace.o inftarg.o \ - amd64-nat.o amd64bsd-nat.o amd64obsd-nat.o + amd64-nat.o amd64bsd-nat.o amd64obsd-nat.o bsd-kvm.o NAT_FILE= nm-nbsd.h XM_FILE= xm-i386.h + +LOADLIBES= -lkvm -- 2.11.0