2004-08-08 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / amd64fbsd-nat.c
index edab8b567093b4e74e9b3378f37784c9c2339362..caeaee9a75a406dec281f449294cf121a1ba5a24 100644 (file)
 #include <sys/sysctl.h>
 #include <machine/reg.h>
 
-#ifdef HAVE_SYS_PROCFS_H
-#include <sys/procfs.h>
-#endif
-
-#ifndef HAVE_GREGSET_T
-typedef struct reg gregset_t;
-#endif
-
-#ifndef HAVE_FPREGSET_T
-typedef struct fpreg fpregset_t;
-#endif
-
-#include "gregset.h"
-#include "x86-64-tdep.h"
+#include "amd64-tdep.h"
 #include "amd64-nat.h"
 \f
 
-/* Offset to the gregset_t location where REG is stored.  */
-#define REG_OFFSET(reg) offsetof (gregset_t, reg)
+/* Offset in `struct reg' where MEMBER is stored.  */
+#define REG_OFFSET(member) offsetof (struct reg, member)
 
-/* At reg_offset[REGNUM] you'll find the offset to the gregset_t
-   location where the GDB register REGNUM is stored.  Unsupported
-   registers are marked with `-1'.  */
-static int reg_offset[] =
+/* At amd64fbsd64_r_reg_offset[REGNUM] you'll find the offset in
+   `struct reg' location where the GDB register REGNUM is stored.
+   Unsupported registers are marked with `-1'.  */
+static int amd64fbsd64_r_reg_offset[] =
 {
   REG_OFFSET (r_rax),
   REG_OFFSET (r_rbx),
@@ -104,44 +91,44 @@ static int amd64fbsd32_r_reg_offset[I386_NUM_GREGS] =
 };
 \f
 
-/* Transfering the registers between GDB, inferiors and core files.  */
-
-/* Fill GDB's register array with the general-purpose register values
-   in *GREGSETP.  */
-
-void
-supply_gregset (gregset_t *gregsetp)
-{
-  amd64_supply_native_gregset (current_regcache, gregsetp, -1);
-}
-
-/* Fill register REGNUM (if it is a general-purpose register) in
-   *GREGSETPS with the value in GDB's register array.  If REGNUM is -1,
-   do this for all registers.  */
-
-void
-fill_gregset (gregset_t *gregsetp, int regnum)
-{
-  amd64_collect_native_gregset (current_regcache, gregsetp, regnum);
-}
+/* Support for debugging kernel virtual memory images.  */
 
-/* Fill GDB's register array with the floating-point register values
-   in *FPREGSETP.  */
-
-void
-supply_fpregset (fpregset_t *fpregsetp)
-{
-  x86_64_supply_fxsave (current_regcache, -1, fpregsetp);
-}
+#include <sys/types.h>
+#include <machine/pcb.h>
 
-/* Fill register REGNUM (if it is a floating-point register) in
-   *FPREGSETP with the value in GDB's register array.  If REGNUM is -1,
-   do this for all registers.  */
+#include "bsd-kvm.h"
 
-void
-fill_fpregset (fpregset_t *fpregsetp, int regnum)
+static int
+amd64fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
 {
-  x86_64_fill_fxsave ((char *) fpregsetp, regnum);
+  /* The following is true for FreeBSD 5.2:
+
+     The pcb contains %rip, %rbx, %rsp, %rbp, %r12, %r13, %r14, %r15,
+     %ds, %es, %fs 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 like when we just returned from cpu_switch().  */
+
+  /* The stack pointer shouldn't be zero.  */
+  if (pcb->pcb_rsp == 0)
+    return 0;
+
+  pcb->pcb_rsp += 8;
+  regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &pcb->pcb_rip);
+  regcache_raw_supply (regcache, AMD64_RBX_REGNUM, &pcb->pcb_rbx);
+  regcache_raw_supply (regcache, AMD64_RSP_REGNUM, &pcb->pcb_rsp);
+  regcache_raw_supply (regcache, AMD64_RBP_REGNUM, &pcb->pcb_rbp);
+  regcache_raw_supply (regcache, 12, &pcb->pcb_r12);
+  regcache_raw_supply (regcache, 13, &pcb->pcb_r13);
+  regcache_raw_supply (regcache, 14, &pcb->pcb_r14);
+  regcache_raw_supply (regcache, 15, &pcb->pcb_r15);
+  regcache_raw_supply (regcache, AMD64_DS_REGNUM, &pcb->pcb_ds);
+  regcache_raw_supply (regcache, AMD64_ES_REGNUM, &pcb->pcb_es);
+  regcache_raw_supply (regcache, AMD64_FS_REGNUM, &pcb->pcb_fs);
+  regcache_raw_supply (regcache, AMD64_GS_REGNUM, &pcb->pcb_gs);
+
+  return 1;
 }
 \f
 
@@ -154,7 +141,7 @@ _initialize_amd64fbsd_nat (void)
   int offset;
 
   amd64_native_gregset32_reg_offset = amd64fbsd32_r_reg_offset;
-  amd64_native_gregset64_reg_offset = reg_offset;
+  amd64_native_gregset64_reg_offset = amd64fbsd64_r_reg_offset;
 
   /* To support the recognition of signal handlers, i386bsd-tdep.c
      hardcodes some constants.  Inclusion of this file means that we
@@ -168,9 +155,9 @@ _initialize_amd64fbsd_nat (void)
      pointer since these members of `struct sigcontext' are essential
      for providing backtraces.  */
 
-#define SC_RIP_OFFSET SC_REG_OFFSET[X86_64_RIP_REGNUM]
-#define SC_RSP_OFFSET SC_REG_OFFSET[X86_64_RSP_REGNUM]
-#define SC_RBP_OFFSET SC_REG_OFFSET[X86_64_RBP_REGNUM]
+#define SC_RIP_OFFSET SC_REG_OFFSET[AMD64_RIP_REGNUM]
+#define SC_RSP_OFFSET SC_REG_OFFSET[AMD64_RSP_REGNUM]
+#define SC_RBP_OFFSET SC_REG_OFFSET[AMD64_RBP_REGNUM]
 
   /* Override the default value for the offset of the program counter
      in the sigcontext structure.  */
@@ -228,8 +215,11 @@ Please report this to <bug-gdb@gnu.org>.",
     len = sizeof (ps_strings);
     if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0)
       {
-       amd64fbsd_sigtramp_start = ps_strings - 32;
-       amd64fbsd_sigtramp_end = ps_strings;
+       amd64fbsd_sigtramp_start_addr = ps_strings - 32;
+       amd64fbsd_sigtramp_end_addr = ps_strings;
       }
   }
+
+  /* Support debugging kernel virtual memory images.  */
+  bsd_kvm_add_target (amd64fbsd_supply_pcb);
 }
This page took 0.02599 seconds and 4 git commands to generate.