* ppcobsd-nat.c: Include "gdb_assert.h".
authorMark Kettenis <kettenis@gnu.org>
Mon, 15 May 2006 21:53:20 +0000 (21:53 +0000)
committerMark Kettenis <kettenis@gnu.org>
Mon, 15 May 2006 21:53:20 +0000 (21:53 +0000)
[PT_GETFPREGS] (getfpregs_supplies): New function.
(ppcobsd_fetch_registers, ppcobsd_fetch_registers): Hanlde OS
versions that have PT_GETFPREGS.
(_initialize_ppcobsd_nat) [PT_GETFPREGS]: Initialize
ppcobsd_fpreg_offsets.
* ppcobsd-tdep.h (ppcobsd_fpreg_offsets, ppcobsd_fpregset):
Declare.
* ppcobsd-tdep.c (ppcobsd_fpreg_offsets, ppcobsd_fpregset): New
variables.
(_initialize_ppcobsd_tdep): Initialize ppcobsd_fpreg_offsets.
* Makefile.in (ppcobsd-nat.o): Update dependencies.

gdb/ChangeLog
gdb/Makefile.in
gdb/ppcobsd-nat.c
gdb/ppcobsd-tdep.c
gdb/ppcobsd-tdep.h

index 82fa385871e27150b26bf461e7a8ac275bad18f0..1f21f486584618e850e911dc873224a487be8248 100644 (file)
@@ -1,3 +1,18 @@
+2006-05-15  Mark Kettenis  <kettenis@gnu.org>
+
+       * ppcobsd-nat.c: Include "gdb_assert.h".
+       [PT_GETFPREGS] (getfpregs_supplies): New function.
+       (ppcobsd_fetch_registers, ppcobsd_fetch_registers): Hanlde OS
+       versions that have PT_GETFPREGS.
+       (_initialize_ppcobsd_nat) [PT_GETFPREGS]: Initialize
+       ppcobsd_fpreg_offsets.
+       * ppcobsd-tdep.h (ppcobsd_fpreg_offsets, ppcobsd_fpregset):
+       Declare.
+       * ppcobsd-tdep.c (ppcobsd_fpreg_offsets, ppcobsd_fpregset): New
+       variables.
+       (_initialize_ppcobsd_tdep): Initialize ppcobsd_fpreg_offsets.
+       * Makefile.in (ppcobsd-nat.o): Update dependencies.
+
 2006-05-15  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * configure.ac: Use GCC_HEADER_STDINT.
index 44d74769d639371b12e11e33e1b9c96a837abfc8..9b4bb81241877750e4c97ca679b905dd4a7ec73f 100644 (file)
@@ -2440,8 +2440,8 @@ ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(gdb_types_h) \
        $(tramp_frame_h) $(gdb_assert_h) $(gdb_string_h) \
        $(ppc_tdep_h) $(ppcnbsd_tdep_h) $(solib_svr4_h)
 ppcobsd-nat.o: ppcobsd-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) \
-       $(regcache_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) $(bsd_kvm_h) \
-       $(inf_ptrace_h)
+       $(regcache_h) $(gdb_assert_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) \
+       $(bsd_kvm_h) $(inf_ptrace_h)
 ppcobsd-tdep.o: ppcobsd-tdep.c $(defs_h) $(arch_utils_h) $(floatformat_h) \
        $(frame_h) $(frame_unwind_h) $(osabi_h) $(regcache_h) $(regset_h) \
        $(symtab_h) $(trad_frame_h) $(gdb_assert_h) $(gdb_string_h) \
index dd7ca354312046b58284ab779361c667f3297424..bdca4cafe4cfeacafb3c90489a2ef80fee417467 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for OpenBSD/powerpc.
 
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -24,6 +24,7 @@
 #include "inferior.h"
 #include "regcache.h"
 
+#include "gdb_assert.h"
 #include <stddef.h>
 #include <sys/types.h>
 #include <sys/ptrace.h>
 #include "inf-ptrace.h"
 #include "bsd-kvm.h"
 
-/* OpenBSD/powerpc doesn't have PT_GETFPREGS/PT_SETFPREGS like
-   NetBSD/powerpc and FreeBSD/powerpc.  */
+/* OpenBSD/powerpc didn't have PT_GETFPREGS/PT_SETFPREGS until release
+   4.0.  On older releases the floating-point registers are handled by
+   PT_GETREGS/PT_SETREGS, but fpscr wasn't available..  */
+
+#ifdef PT_GETFPREGS
+
+/* Returns true if PT_GETFPREGS fetches this register.  */
+
+static int
+getfpregs_supplies (int regnum)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
+     point registers.  Traditionally, GDB's register set has still
+     listed the floating point registers for such machines, so this
+     code is harmless.  However, the new E500 port actually omits the
+     floating point registers entirely from the register set --- they
+     don't even have register numbers assigned to them.
+
+     It's not clear to me how best to update this code, so this assert
+     will alert the first person to encounter the NetBSD/E500
+     combination to the problem.  */
+  gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
+
+  return ((regnum >= tdep->ppc_fp0_regnum
+           && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
+         || regnum == tdep->ppc_fpscr_regnum);
+}
+
+#endif /* PT_GETFPREGS */
 
 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
    for all registers.  */
@@ -52,8 +82,26 @@ ppcobsd_fetch_registers (int regnum)
              (PTRACE_TYPE_ARG3) &regs, 0) == -1)
     perror_with_name (_("Couldn't get registers"));
 
-  ppcobsd_supply_gregset (&ppcobsd_gregset, current_regcache, -1,
-                         &regs, sizeof regs);
+  ppc_supply_gregset (&ppcobsd_gregset, current_regcache, -1,
+                     &regs, sizeof regs);
+#ifndef PT_GETFPREGS
+  ppc_supply_fpregset (&ppcobsd_gregset, current_regcache, -1,
+                      &regs, sizeof regs);
+#endif
+
+#ifdef PT_GETFPREGS
+  if (regnum == -1 || getfpregs_supplies (regnum))
+    {
+      struct fpreg fpregs;
+
+      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
+                 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+       perror_with_name (_("Couldn't get floating point status"));
+
+      ppc_supply_fpregset (&ppcobsd_fpregset, current_regcache, -1,
+                          &fpregs, sizeof fpregs);
+    }
+#endif
 }
 
 /* Store register REGNUM back into the inferior.  If REGNUM is -1, do
@@ -68,12 +116,34 @@ ppcobsd_store_registers (int regnum)
              (PTRACE_TYPE_ARG3) &regs, 0) == -1)
     perror_with_name (_("Couldn't get registers"));
 
-  ppcobsd_collect_gregset (&ppcobsd_gregset, current_regcache,
-                          regnum, &regs, sizeof regs);
+  ppc_collect_gregset (&ppcobsd_gregset, current_regcache,
+                      regnum, &regs, sizeof regs);
+#ifndef PT_GETFPREGS
+  ppc_collect_fpregset (&ppcobsd_gregset, current_regcache,
+                       regnum, &regs, sizeof regs);
+#endif
 
   if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
              (PTRACE_TYPE_ARG3) &regs, 0) == -1)
     perror_with_name (_("Couldn't write registers"));
+
+#ifdef PT_GETFPREGS
+  if (regnum == -1 || getfpregs_supplies (regnum))
+    {
+      struct fpreg fpregs;
+
+      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
+                 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+       perror_with_name (_("Couldn't get floating point status"));
+
+      ppc_collect_fpregset (&ppcobsd_fpregset, current_regcache,
+                           regnum, &fpregs, sizeof fpregs);
+
+      if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
+                 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+       perror_with_name (_("Couldn't write floating point status"));
+    }
+#endif
 }
 \f
 
@@ -141,6 +211,10 @@ _initialize_ppcobsd_nat (void)
   /* Floating-point registers.  */
   ppcobsd_reg_offsets.f0_offset = offsetof (struct reg, fpr);
   ppcobsd_reg_offsets.fpscr_offset = -1;
+#ifdef PT_GETFPREGS
+  ppcobsd_fpreg_offsets.f0_offset = offsetof (struct fpreg, fpr);
+  ppcobsd_fpreg_offsets.fpscr_offset = offsetof (struct fpreg, fpscr);
+#endif
 
   /* AltiVec registers.  */
   ppcobsd_reg_offsets.vr0_offset = offsetof (struct vreg, vreg);
index 4b752b86b0fc234be8708a7d0fbd2ebae9569971..b4bc4197e8b8171b0c34d9b8cc3a40e677cdc066 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for OpenBSD/powerpc.
 
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -39,6 +39,7 @@
 
 /* Register offsets from <machine/reg.h>.  */
 struct ppc_reg_offsets ppcobsd_reg_offsets;
+struct ppc_reg_offsets ppcobsd_fpreg_offsets;
 \f
 
 /* Core file support.  */
@@ -102,6 +103,12 @@ struct regset ppcobsd_gregset =
   ppcobsd_supply_gregset
 };
 
+struct regset ppcobsd_fpregset =
+{
+  &ppcobsd_fpreg_offsets,
+  ppc_supply_fpregset
+};
+
 /* Return the appropriate register set for the core section identified
    by SECT_NAME and SECT_SIZE.  */
 
@@ -341,4 +348,11 @@ _initialize_ppcobsd_tdep (void)
       ppcobsd_reg_offsets.vscr_offset = 512;
       ppcobsd_reg_offsets.vrsave_offset = 520;
     }
+
+  if (ppcobsd_fpreg_offsets.fpscr_offset == 0)
+    {
+      /* Floating-point registers.  */
+      ppcobsd_reg_offsets.f0_offset = 0;
+      ppcobsd_reg_offsets.fpscr_offset = 256;
+    }
 }
index 899d653b918ce72c8e9e27035f862a846dbad3e0..b1a7f8b7330a7abbd4904aaadd00c00cba3a205f 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for OpenBSD/powerpc.
 
-   Copyright (C) 2004 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -29,9 +29,11 @@ struct regcache;
 
 /* Register offsets for OpenBSD/powerpc.  */
 extern struct ppc_reg_offsets ppcobsd_reg_offsets;
+extern struct ppc_reg_offsets ppcobsd_fpreg_offsets;
 
 /* Register sets for OpenBSD/powerpc.  */
 extern struct regset ppcobsd_gregset;
+extern struct regset ppcobsd_fpregset;
 \f
 
 /* Supply register REGNUM in the general-purpose register set REGSET