* i386-tdep.h (struct gdbarch_tdep): Add members gregset,
authorMark Kettenis <kettenis@gnu.org>
Sun, 5 Oct 2003 21:31:33 +0000 (21:31 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sun, 5 Oct 2003 21:31:33 +0000 (21:31 +0000)
gregset_reg_offset, gregset_num_regs, sizeof_gregset, fpregset,
sizeof_fpregset.
* i386-tdep.c: Include "regset.h".
(i386_supply_gregset): New function.
(i386_supply_fpregset): New function.
(i386_gdbarch_init): Initialze register set-related members of
TDEP.
* x86-64-tdep.c (x86_64_supply_fpregset): New function.
(x86_64_init_abi): Initialize TDEP->sizeof_fpregset.

gdb/ChangeLog
gdb/i386-tdep.c
gdb/i386-tdep.h
gdb/x86-64-tdep.c

index 1ad964319c9b5f7a1f0eafbbc43e9ade697edacf..4036992cd7ea24d5878ec703a682bc8a2e7c6fe8 100644 (file)
@@ -1,3 +1,16 @@
+2003-10-05  Mark Kettenis  <kettenis@gnu.org>
+
+       * i386-tdep.h (struct gdbarch_tdep): Add members gregset,
+       gregset_reg_offset, gregset_num_regs, sizeof_gregset, fpregset,
+       sizeof_fpregset.
+       * i386-tdep.c: Include "regset.h".
+       (i386_supply_gregset): New function.
+       (i386_supply_fpregset): New function.
+       (i386_gdbarch_init): Initialze register set-related members of
+       TDEP.
+       * x86-64-tdep.c (x86_64_supply_fpregset): New function.
+       (x86_64_init_abi): Initialize TDEP->sizeof_fpregset.
+
 2003-10-03  Andrew Cagney  <cagney@redhat.com>
 
        * rs6000-tdep.c (rs6000_gdbarch_init): When the 64 bit SysV ABI,
index d3e33576cd6aadae8c0dd2719ed114274368206f..27f3d272e5c11a9c311a44a15c1f83feadca240c 100644 (file)
@@ -37,6 +37,7 @@
 #include "osabi.h"
 #include "regcache.h"
 #include "reggroups.h"
+#include "regset.h"
 #include "symfile.h"
 #include "symtab.h"
 #include "target.h"
@@ -1548,7 +1549,42 @@ i386_value_to_register (struct frame_info *frame, int regnum,
     }
 }
 \f
+/* Supply register REGNUM from the general-purpose register set REGSET
+   to register cache REGCACHE.  If REGNUM is -1, do this for all
+   registers in REGSET.  */
 
+static void
+i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
+                    int regnum, const void *gregs, size_t len)
+{
+  const struct gdbarch_tdep *tdep = regset->descr;
+  const char *regs = gregs;
+  int i;
+
+  gdb_assert (len == tdep->sizeof_gregset);
+
+  for (i = 0; i < tdep->gregset_num_regs; i++)
+    {
+      if ((regnum == i || regnum == -1)
+         && tdep->gregset_reg_offset[i] != -1)
+       regcache_raw_supply (regcache, i, regs + tdep->gregset_reg_offset[i]);
+    }
+}
+
+/* Supply register REGNUM from the floating-point register set REGSET
+   to register cache REGCACHE.  If REGNUM is -1, do this for all
+   registers in REGSET.  */
+
+static void
+i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
+                     int regnum, const void *fpregs, size_t len)
+{
+  const struct gdbarch_tdep *tdep = regset->descr;
+
+  gdb_assert (len == tdep->sizeof_fpregset);
+  i387_supply_fsave (regcache, regnum, fpregs);
+}
+\f
 
 #ifdef STATIC_TRANSFORM_NAME
 /* SunPRO encodes the static variables.  This is not related to C++
@@ -1803,6 +1839,16 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep = XMALLOC (struct gdbarch_tdep);
   gdbarch = gdbarch_alloc (&info, tdep);
 
+  /* General-purpose registers.  */
+  tdep->gregset = NULL;
+  tdep->gregset_reg_offset = NULL;
+  tdep->gregset_num_regs = I386_NUM_GREGS;
+  tdep->sizeof_gregset = 0;
+
+  /* Floating-point registers.  */
+  tdep->fpregset = NULL;
+  tdep->sizeof_fpregset = I387_SIZEOF_FSAVE;
+
   /* The default settings include the FPU registers, the MMX registers
      and the SSE registers.  This can be overidden for a specific ABI
      by adjusting the members `st0_regnum', `mm0_regnum' and
index 6c4cf73a36a50995d9d6732b4ddad6b4151c7ae4..f9664bcfd787d90a7bd456f8564d0ca9a47ae33b 100644 (file)
@@ -56,6 +56,16 @@ enum struct_return
 /* i386 architecture specific information.  */
 struct gdbarch_tdep
 {
+  /* General-purpose registers.  */
+  struct regset *gregset;
+  int *gregset_reg_offset;
+  int gregset_num_regs;
+  size_t sizeof_gregset;
+
+  /* Floating-point registers.  */
+  struct regset *fpregset;
+  size_t sizeof_fpregset;
+
   /* Register number for %st(0).  The register numbers for the other
      registers follow from this one.  Set this to -1 to indicate the
      absence of an FPU.  */
index ddba4dbf3e4645512866f997428e8b8a9d26b90a..d17ee8c508e6a7874028eb2d7beb54ff3e89437d 100644 (file)
@@ -1203,12 +1203,31 @@ x86_64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
 {
   return sp & -(CORE_ADDR)16;
 }
+\f
+
+/* Supply register REGNUM from the floating-point register set REGSET
+   to register cache REGCACHE.  If REGNUM is -1, do this for all
+   registers in REGSET.  */
+
+static void
+x86_64_supply_fpregset (const struct regset *regset, struct regcache *regcache,
+                       int regnum, const void *fpregs, size_t len)
+{
+  const struct gdbarch_tdep *tdep = regset->descr;
+
+  gdb_assert (len == tdep->sizeof_fpregset);
+  x86_64_supply_fxsave (regcache, regnum, fpregs);
+}
 
 void
 x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  /* AMD64 generally uses `fxsave' instead of `fsave' for saving its
+     floating-point registers.  */
+  tdep->sizeof_fpregset = I387_SIZEOF_FXSAVE;
+
   /* AMD64 has an FPU and 16 SSE registers.  */
   tdep->st0_regnum = X86_64_ST0_REGNUM;
   tdep->num_xmm_regs = 16;