diff options
author | Mark Kettenis <kettenis@gnu.org> | 2003-10-05 21:31:33 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2003-10-05 21:31:33 +0000 |
commit | 473f17b0436507838ab28e57e7ca581d71c059b8 (patch) | |
tree | e0e9aad96933fd3e0614ebba92fa46ad69881fdc /gdb | |
parent | c2059446380ed39ede4bb55ad2dbdb8cfb9df5dd (diff) | |
download | gdb-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/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 46 | ||||
-rw-r--r-- | gdb/i386-tdep.h | 10 | ||||
-rw-r--r-- | gdb/x86-64-tdep.c | 19 |
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; |