aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-10-05 21:31:33 +0000
committerMark Kettenis <kettenis@gnu.org>2003-10-05 21:31:33 +0000
commit473f17b0436507838ab28e57e7ca581d71c059b8 (patch)
treee0e9aad96933fd3e0614ebba92fa46ad69881fdc /gdb
parentc2059446380ed39ede4bb55ad2dbdb8cfb9df5dd (diff)
downloadgdb-473f17b0436507838ab28e57e7ca581d71c059b8.zip
gdb-473f17b0436507838ab28e57e7ca581d71c059b8.tar.gz
gdb-473f17b0436507838ab28e57e7ca581d71c059b8.tar.bz2
* 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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/i386-tdep.c46
-rw-r--r--gdb/i386-tdep.h10
-rw-r--r--gdb/x86-64-tdep.c19
4 files changed, 88 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1ad9643..4036992 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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,
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index d3e3357..27f3d27 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -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,
}
}
+/* 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);
+}
+
#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
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 6c4cf73..f9664bc 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -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. */
diff --git a/gdb/x86-64-tdep.c b/gdb/x86-64-tdep.c
index ddba4db..d17ee8c 100644
--- a/gdb/x86-64-tdep.c
+++ b/gdb/x86-64-tdep.c
@@ -1203,12 +1203,31 @@ x86_64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
{
return sp & -(CORE_ADDR)16;
}
+
+
+/* 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;