* 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:
Mark Kettenis 2002-06-15 17:22:04 +00:00
parent 65e7823443
commit fcc9bf0139
2 changed files with 77 additions and 89 deletions

View File

@ -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.

View File

@ -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 *) &registers[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 */