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/i386-tdep.c | |
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/i386-tdep.c')
-rw-r--r-- | gdb/i386-tdep.c | 46 |
1 files changed, 46 insertions, 0 deletions
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 |