* 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.
This commit is contained in:
parent
c205944638
commit
473f17b043
4 changed files with 88 additions and 0 deletions
|
@ -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>
|
2003-10-03 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
* rs6000-tdep.c (rs6000_gdbarch_init): When the 64 bit SysV ABI,
|
* rs6000-tdep.c (rs6000_gdbarch_init): When the 64 bit SysV ABI,
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
#include "regcache.h"
|
#include "regcache.h"
|
||||||
#include "reggroups.h"
|
#include "reggroups.h"
|
||||||
|
#include "regset.h"
|
||||||
#include "symfile.h"
|
#include "symfile.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "target.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
|
#ifdef STATIC_TRANSFORM_NAME
|
||||||
/* SunPRO encodes the static variables. This is not related to C++
|
/* 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);
|
tdep = XMALLOC (struct gdbarch_tdep);
|
||||||
gdbarch = gdbarch_alloc (&info, 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
|
/* The default settings include the FPU registers, the MMX registers
|
||||||
and the SSE registers. This can be overidden for a specific ABI
|
and the SSE registers. This can be overidden for a specific ABI
|
||||||
by adjusting the members `st0_regnum', `mm0_regnum' and
|
by adjusting the members `st0_regnum', `mm0_regnum' and
|
||||||
|
|
|
@ -56,6 +56,16 @@ enum struct_return
|
||||||
/* i386 architecture specific information. */
|
/* i386 architecture specific information. */
|
||||||
struct gdbarch_tdep
|
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
|
/* Register number for %st(0). The register numbers for the other
|
||||||
registers follow from this one. Set this to -1 to indicate the
|
registers follow from this one. Set this to -1 to indicate the
|
||||||
absence of an FPU. */
|
absence of an FPU. */
|
||||||
|
|
|
@ -1203,12 +1203,31 @@ x86_64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
|
||||||
{
|
{
|
||||||
return sp & -(CORE_ADDR)16;
|
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
|
void
|
||||||
x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||||
{
|
{
|
||||||
struct gdbarch_tdep *tdep = gdbarch_tdep (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. */
|
/* AMD64 has an FPU and 16 SSE registers. */
|
||||||
tdep->st0_regnum = X86_64_ST0_REGNUM;
|
tdep->st0_regnum = X86_64_ST0_REGNUM;
|
||||||
tdep->num_xmm_regs = 16;
|
tdep->num_xmm_regs = 16;
|
||||||
|
|
Loading…
Add table
Reference in a new issue