* amd64obsd-nat.c: Include "gdbcore.h", "regcache.h",
authorMark Kettenis <kettenis@gnu.org>
Sat, 22 May 2004 22:42:53 +0000 (22:42 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 22 May 2004 22:42:53 +0000 (22:42 +0000)
<sys/types.h>, <machine/frame.h>, <machine/pcb.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
gdb/Makefile.in
gdb/amd64obsd-nat.c
gdb/config/i386/obsd64.mh

index 30772fbabd27d31fd2c0c107d15ea2158fb1f3b2..9055649513299d082bb9c00c94979e0e1085dc23 100644 (file)
@@ -1,5 +1,13 @@
 2004-05-23  Mark Kettenis  <kettenis@gnu.org>
 
+       * amd64obsd-nat.c: Include "gdbcore.h", "regcache.h",
+       <sys/types.h>, <machine/frame.h>, <machine/pcb.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",
        <sys/types.h>, <machine/pcb.h> and "bsd-kvm.h".
        (sparc32nbsd_supply_pcb): New function.
index d2ef0bb9f2cc9f1b835f6e55f65ad4850e50d6f6..8afa97fbc30d01c853151694918d400579eb1b49 100644 (file)
@@ -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) \
index e8d92fefa8023d6c123773deea6fb19e1c814b7b..0f9b5efac7f25df05adab1eeb5478cb510584f30 100644 (file)
@@ -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[] =
 };
 \f
 
+/* Support for debugging kernel virtual memory images.  */
+
+#include <sys/types.h>
+#include <machine/frame.h>
+#include <machine/pcb.h>
+
+#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;
+}
+\f
+
 /* 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);
 }
index 99ccfa2023ff217aefe9cac640f1798d78271f98..3e0a0e7099042e365b1b7bb287c159fa921dd742 100644 (file)
@@ -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