* i386v4-nat.c: Include "i386-tdep.h". Reformat and tweak various
comments. (fill_gregset, supply_gregset, supply_fpregset, fill_fpregset): Remove prototypes. (supply_gregset, fill_gregset): Remove use of register keyword and remove declaration for regmap. Use I386_NUM_GREGS instead of NUM_REGS and NUM_FREGS. (FPREGSET_FSAVE_OFFSET): Remove. (supply_fpregset, fill_fpregset): Use FPO_REGNUM instead of NUM_FREGS to determine whether the floating-point registers are available.
This commit is contained in:
parent
65e7823443
commit
fcc9bf0139
@ -1,5 +1,17 @@
|
||||
2002-06-15 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* i386v4-nat.c: Include "i386-tdep.h". Reformat and tweak various
|
||||
comments.
|
||||
(fill_gregset, supply_gregset, supply_fpregset, fill_fpregset):
|
||||
Remove prototypes.
|
||||
(supply_gregset, fill_gregset): Remove use of register keyword and
|
||||
remove declaration for regmap. Use I386_NUM_GREGS instead of
|
||||
NUM_REGS and NUM_FREGS.
|
||||
(FPREGSET_FSAVE_OFFSET): Remove.
|
||||
(supply_fpregset, fill_fpregset): Use FPO_REGNUM instead of
|
||||
NUM_FREGS to determine whether the floating-point registers are
|
||||
available.
|
||||
|
||||
* i386gnu-nat.c (supply_gregset, gnu_fetch_registers,
|
||||
gnu_store_registers): Replace usage of NUM_GREGS with
|
||||
I386_NUM_GREGS.
|
||||
|
154
gdb/i386v4-nat.c
154
gdb/i386v4-nat.c
@ -1,5 +1,6 @@
|
||||
/* Native-dependent code for SVR4 Unix running on i386's, for GDB.
|
||||
Copyright 1988, 1989, 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
/* Native-dependent code for SVR4 Unix running on i386's.
|
||||
Copyright 1988, 1989, 1991, 1992, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
@ -27,8 +28,9 @@
|
||||
#ifdef HAVE_SYS_REG_H
|
||||
#include <sys/reg.h>
|
||||
#endif
|
||||
#include "i387-tdep.h"
|
||||
|
||||
#include "i386-tdep.h"
|
||||
#include "i387-tdep.h"
|
||||
|
||||
#ifdef HAVE_SYS_PROCFS_H
|
||||
|
||||
@ -37,15 +39,16 @@
|
||||
/* Prototypes for supply_gregset etc. */
|
||||
#include "gregset.h"
|
||||
|
||||
/* The /proc interface divides the target machine's register set up into
|
||||
two different sets, the general register set (gregset) and the floating
|
||||
point register set (fpregset). For each set, there is an ioctl to get
|
||||
the current register set and another ioctl to set the current values.
|
||||
/* The `/proc' interface divides the target machine's register set up
|
||||
into two different sets, the general purpose register set (gregset)
|
||||
and the floating-point register set (fpregset). For each set,
|
||||
there is an ioctl to get the current register set and another ioctl
|
||||
to set the current values.
|
||||
|
||||
The actual structure passed through the ioctl interface is, of course,
|
||||
naturally machine dependent, and is different for each set of registers.
|
||||
For the i386 for example, the general register set is typically defined
|
||||
by:
|
||||
The actual structure passed through the ioctl interface is, of
|
||||
course, naturally machine dependent, and is different for each set
|
||||
of registers. For the i386 for example, the general-purpose
|
||||
register set is typically defined by:
|
||||
|
||||
typedef int gregset_t[19]; (in <sys/regset.h>)
|
||||
|
||||
@ -55,36 +58,38 @@
|
||||
#define UESP 17
|
||||
#define SS 18
|
||||
|
||||
and the floating point set by:
|
||||
and the floating-point set by:
|
||||
|
||||
typedef struct fpregset
|
||||
{
|
||||
union
|
||||
{
|
||||
struct fpchip_state // fp extension state //
|
||||
{
|
||||
int state[27]; // 287/387 saved state //
|
||||
int status; // status word saved at exception //
|
||||
} fpchip_state;
|
||||
struct fp_emul_space // for emulators //
|
||||
{
|
||||
char fp_emul[246];
|
||||
char fp_epad[2];
|
||||
} fp_emul_space;
|
||||
int f_fpregs[62]; // union of the above //
|
||||
} fp_reg_set;
|
||||
long f_wregs[33]; // saved weitek state //
|
||||
typedef struct fpregset {
|
||||
union {
|
||||
struct fpchip_state // fp extension state //
|
||||
{
|
||||
int state[27]; // 287/387 saved state //
|
||||
int status; // status word saved at //
|
||||
// exception //
|
||||
} fpchip_state;
|
||||
struct fp_emul_space // for emulators //
|
||||
{
|
||||
char fp_emul[246];
|
||||
char fp_epad[2];
|
||||
} fp_emul_space;
|
||||
int f_fpregs[62]; // union of the above //
|
||||
} fp_reg_set;
|
||||
long f_wregs[33]; // saved weitek state //
|
||||
} fpregset_t;
|
||||
|
||||
These routines provide the packing and unpacking of gregset_t and
|
||||
fpregset_t formatted data.
|
||||
Incidentally fpchip_state contains the FPU state in the same format
|
||||
as used by the "fsave" instruction, and that's the only thing we
|
||||
support here. I don't know how the emulator stores it state. The
|
||||
Weitek stuff definitely isn't supported.
|
||||
|
||||
*/
|
||||
The routines defined here, provide the packing and unpacking of
|
||||
gregset_t and fpregset_t formatted data. */
|
||||
|
||||
#ifdef HAVE_GREGSET_T
|
||||
|
||||
/* This is a duplicate of the table in i386-xdep.c. */
|
||||
|
||||
/* Mapping between the general-purpose registers in `/proc'
|
||||
format and GDB's register array layout. */
|
||||
static int regmap[] =
|
||||
{
|
||||
EAX, ECX, EDX, EBX,
|
||||
@ -93,92 +98,63 @@ static int regmap[] =
|
||||
DS, ES, FS, GS,
|
||||
};
|
||||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
void fill_gregset (gregset_t *, int);
|
||||
|
||||
void supply_gregset (gregset_t *);
|
||||
|
||||
void supply_fpregset (fpregset_t *);
|
||||
|
||||
void fill_fpregset (fpregset_t *, int);
|
||||
|
||||
|
||||
/* FIXME: These routine absolutely depends upon (NUM_REGS - NUM_FREGS)
|
||||
being less than or equal to the number of registers that can be stored
|
||||
in a gregset_t. Note that with the current scheme there will typically
|
||||
be more registers actually stored in a gregset_t that what we know
|
||||
about. This is bogus and should be fixed. */
|
||||
|
||||
/* Given a pointer to a general register set in /proc format (gregset_t *),
|
||||
unpack the register contents and supply them as gdb's idea of the current
|
||||
register values. */
|
||||
/* Fill GDB's register array with the general-purpose register values
|
||||
in *GREGSETP. */
|
||||
|
||||
void
|
||||
supply_gregset (gregset_t *gregsetp)
|
||||
{
|
||||
register int regi;
|
||||
register greg_t *regp = (greg_t *) gregsetp;
|
||||
extern int regmap[];
|
||||
greg_t *regp = (greg_t *) gregsetp;
|
||||
int i;
|
||||
|
||||
for (regi = 0; regi < (NUM_REGS - NUM_FREGS); regi++)
|
||||
{
|
||||
supply_register (regi, (char *) (regp + regmap[regi]));
|
||||
}
|
||||
for (i = 0; i < I386_NUM_GREGS; i++)
|
||||
supply_register (i, (char *) (regp + regmap[i]));
|
||||
}
|
||||
|
||||
/* Fill register REGNO (if it is a general-purpose register) in
|
||||
*GREGSETPS with the value in GDB's register array. If REGNO is -1,
|
||||
do this for all registers. */
|
||||
|
||||
void
|
||||
fill_gregset (gregset_t *gregsetp, int regno)
|
||||
{
|
||||
int regi;
|
||||
register greg_t *regp = (greg_t *) gregsetp;
|
||||
extern int regmap[];
|
||||
greg_t *regp = (greg_t *) gregsetp;
|
||||
int i;
|
||||
|
||||
for (regi = 0; regi < (NUM_REGS - NUM_FREGS); regi++)
|
||||
{
|
||||
if ((regno == -1) || (regno == regi))
|
||||
{
|
||||
*(regp + regmap[regi]) = *(int *) ®isters[REGISTER_BYTE (regi)];
|
||||
}
|
||||
}
|
||||
for (i = 0; i < I386_NUM_GREGS; i++)
|
||||
if (regno == -1 || regno == i)
|
||||
regcache_collect (i, regp + regmap[i]);
|
||||
}
|
||||
|
||||
#endif /* HAVE_GREGSET_T */
|
||||
|
||||
#if defined (HAVE_FPREGSET_T)
|
||||
#ifdef HAVE_FPREGSET_T
|
||||
|
||||
/* Given a pointer to a floating point register set in /proc format
|
||||
(fpregset_t *), unpack the register contents and supply them as gdb's
|
||||
idea of the current floating point register values. */
|
||||
|
||||
/* FIXME: Assumes that fpregsetp contains an i387 FSAVE area. */
|
||||
#if !defined(FPREGSET_FSAVE_OFFSET)
|
||||
#define FPREGSET_FSAVE_OFFSET 0
|
||||
#endif
|
||||
/* Fill GDB's register array with the floating-point register values in
|
||||
*FPREGSETP. */
|
||||
|
||||
void
|
||||
supply_fpregset (fpregset_t *fpregsetp)
|
||||
{
|
||||
if (NUM_FREGS == 0)
|
||||
if (FP0_REGNUM == 0)
|
||||
return;
|
||||
|
||||
i387_supply_fsave ((char *) fpregsetp + FPREGSET_FSAVE_OFFSET);
|
||||
i387_supply_fsave ((char *) fpregsetp);
|
||||
}
|
||||
|
||||
/* Given a pointer to a floating point register set in /proc format
|
||||
(fpregset_t *), update the register specified by REGNO from gdb's idea
|
||||
of the current floating point register set. If REGNO is -1, update
|
||||
them all. */
|
||||
/* Fill register REGNO (if it is a floating-point register) in
|
||||
*FPREGSETP with the value in GDB's register array. If REGNO is -1,
|
||||
do this for all registers. */
|
||||
|
||||
void
|
||||
fill_fpregset (fpregset_t *fpregsetp, int regno)
|
||||
{
|
||||
if (NUM_FREGS == 0)
|
||||
if (FP0_REGNUM == 0)
|
||||
return;
|
||||
|
||||
i387_fill_fsave ((char *) fpregsetp + FPREGSET_FSAVE_OFFSET, regno);
|
||||
i387_fill_fsave ((char *) fpregsetp, regno);
|
||||
}
|
||||
|
||||
#endif /* defined (HAVE_FPREGSET_T) */
|
||||
#endif /* HAVE_FPREGSET_T */
|
||||
|
||||
#endif /* HAVE_SYS_PROCFS_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user