From 473f17b0436507838ab28e57e7ca581d71c059b8 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sun, 5 Oct 2003 21:31:33 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 13 +++++++++++++ gdb/i386-tdep.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ gdb/i386-tdep.h | 10 ++++++++++ gdb/x86-64-tdep.c | 19 +++++++++++++++++++ 4 files changed, 88 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1ad964319c9..4036992cd7e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2003-10-05 Mark Kettenis + + * 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 * 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 d3e33576cd6..27f3d272e5c 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 6c4cf73a36a..f9664bcfd78 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 ddba4dbf3e4..d17ee8c508e 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; -- 2.30.2