This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add OpenBSD/amd64 libkvm support


Committed,

Mark


Index: ChangeLog
from  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.

Index: amd64obsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/amd64obsd-nat.c,v
retrieving revision 1.2
diff -u -p -r1.2 amd64obsd-nat.c
--- amd64obsd-nat.c 25 Feb 2004 20:59:12 -0000 1.2
+++ amd64obsd-nat.c 22 May 2004 22:42:24 -0000
@@ -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 <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;
+}
+
+
 /* 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: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.575
diff -u -p -r1.575 Makefile.in
--- Makefile.in 22 May 2004 22:34:42 -0000 1.575
+++ Makefile.in 22 May 2004 22:42:25 -0000
@@ -1553,8 +1553,8 @@ amd64nbsd-nat.o: amd64nbsd-nat.c $(defs_
 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: config/i386/obsd64.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/obsd64.mh,v
retrieving revision 1.2
diff -u -p -r1.2 obsd64.mh
--- config/i386/obsd64.mh 22 Feb 2004 16:20:22 -0000 1.2
+++ config/i386/obsd64.mh 22 May 2004 22:42:25 -0000
@@ -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]