aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-08-23 08:56:45 +0000
committerMark Kettenis <kettenis@gnu.org>2003-08-23 08:56:45 +0000
commited504bdf4fa2bb56dc2843d530bb8bb8f46b81cf (patch)
tree5773e893e889601215952dc106e2d98680252a73
parent95a745092bfca86fbe98c06cd05c6f03c7de037a (diff)
downloadfsf-binutils-gdb-ed504bdf4fa2bb56dc2843d530bb8bb8f46b81cf.zip
fsf-binutils-gdb-ed504bdf4fa2bb56dc2843d530bb8bb8f46b81cf.tar.gz
fsf-binutils-gdb-ed504bdf4fa2bb56dc2843d530bb8bb8f46b81cf.tar.bz2
* go32-nat.c (fetch_register): Call i387_supply_fsave instead of
i387_supply_register. (go32_fetch_registers): Adjust call to i387_supply_fsave. * i386nbsd-tdep.c (fetch_core_registers): Adjust call to i387_supply_fsave. (fetch_elfcore_registers): Adjust call to i387_supply_fsave and i387_supply_fxsave. * i386obsd-tdep.c (fetch_core_registers): Adjust call to i387_supply_fsave. * i386bsd-nat.c (supply_fpregset): Adjust call to i387_supply_fsave. (fetch_inferior_registers): Remove extraneous whitespace. Adjust call to i387_supply_fxsave. Call i387_supply_fsave instead of supply_fpregset. (store_inferior_registers): Remove extraneous whitespace. Call i387_fill_fsave instead of fill_fpregset. * i386gnu-nat.c (fetch_fpregs): Adjust call to i387_supply_fsave. (supply_fpregset): Likewise. * i386v4-nat.c (supply_fpregset): Adjust call to i387_supply_fsave. * i386-interix-nat.c (supply_fpregset): Adjust call to i387_supply_fsave. * i386-linux-nat.c (supply_fpregset): Adjust call to i387_supply_fsave. (supply_fpxregset): Adjust call to i387_adjust_fxsave. * i386-nto-tdep.c (i386nto_supply_fpregset): Adjust calls to i387supply_fsave and i387_supply_fxsave. * i387-tdep.c (i387_supply_fsave): Add `regnum' argument. Incorporate code from `i387_supply_register. (i387_supply_register): Remove. (i387_supply_fxsave): Add `regnum' argument. Update comments. * i387-tdep.h (i387_supply_fsave, i387_supply_fsxave): Adjust prototype. (i387_supply_register): remove prototype. Update comments.
-rw-r--r--gdb/ChangeLog39
-rw-r--r--gdb/go32-nat.c4
-rw-r--r--gdb/i386-interix-nat.c2
-rw-r--r--gdb/i386-linux-nat.c4
-rw-r--r--gdb/i386-nto-tdep.c4
-rw-r--r--gdb/i386bsd-nat.c12
-rw-r--r--gdb/i386gnu-nat.c4
-rw-r--r--gdb/i386nbsd-tdep.c11
-rw-r--r--gdb/i386obsd-tdep.c2
-rw-r--r--gdb/i386v4-nat.c2
-rw-r--r--gdb/i387-tdep.c178
-rw-r--r--gdb/i387-tdep.h22
12 files changed, 155 insertions, 129 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e20559a..c99ca61 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,42 @@
+2003-08-23 Mark Kettenis <kettenis@gnu.org>
+
+ * go32-nat.c (fetch_register): Call i387_supply_fsave instead of
+ i387_supply_register.
+ (go32_fetch_registers): Adjust call to i387_supply_fsave.
+ * i386nbsd-tdep.c (fetch_core_registers): Adjust call to
+ i387_supply_fsave.
+ (fetch_elfcore_registers): Adjust call to i387_supply_fsave and
+ i387_supply_fxsave.
+ * i386obsd-tdep.c (fetch_core_registers): Adjust call to
+ i387_supply_fsave.
+ * i386bsd-nat.c (supply_fpregset): Adjust call to
+ i387_supply_fsave.
+ (fetch_inferior_registers): Remove extraneous whitespace. Adjust
+ call to i387_supply_fxsave. Call i387_supply_fsave instead of
+ supply_fpregset.
+ (store_inferior_registers): Remove extraneous whitespace. Call
+ i387_fill_fsave instead of fill_fpregset.
+ * i386gnu-nat.c (fetch_fpregs): Adjust call to i387_supply_fsave.
+ (supply_fpregset): Likewise.
+ * i386v4-nat.c (supply_fpregset): Adjust call to
+ i387_supply_fsave.
+ * i386-interix-nat.c (supply_fpregset): Adjust call to
+ i387_supply_fsave.
+ * i386-linux-nat.c (supply_fpregset): Adjust call to
+ i387_supply_fsave.
+ (supply_fpxregset): Adjust call to i387_adjust_fxsave.
+ * i386-nto-tdep.c (i386nto_supply_fpregset): Adjust calls to
+ i387supply_fsave and i387_supply_fxsave.
+ * i387-tdep.c (i387_supply_fsave): Add `regnum' argument.
+ Incorporate code from `i387_supply_register.
+ (i387_supply_register): Remove.
+ (i387_supply_fxsave): Add `regnum' argument.
+ Update comments.
+ * i387-tdep.h (i387_supply_fsave, i387_supply_fsxave): Adjust
+ prototype.
+ (i387_supply_register): remove prototype.
+ Update comments.
+
2003-08-22 Michael Chastain <mec@shout.net>
* config/djgpp/fnchange.lst: Remove gdb/testsuite/gdb.c++/*.
diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c
index 6ff2710..9989279 100644
--- a/gdb/go32-nat.c
+++ b/gdb/go32-nat.c
@@ -468,7 +468,7 @@ fetch_register (int regno)
if (regno < FP0_REGNUM)
supply_register (regno, (char *) &a_tss + regno_mapping[regno].tss_ofs);
else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno))
- i387_supply_register (regno, (char *) &npx);
+ i387_supply_fsave ((const char *) &npx, regno);
else
internal_error (__FILE__, __LINE__,
"Invalid register no. %d in fetch_register.", regno);
@@ -483,7 +483,7 @@ go32_fetch_registers (int regno)
{
for (regno = 0; regno < FP0_REGNUM; regno++)
fetch_register (regno);
- i387_supply_fsave ((char *) &npx);
+ i387_supply_fsave ((const char *) &npx, -1);
}
}
diff --git a/gdb/i386-interix-nat.c b/gdb/i386-interix-nat.c
index 9c4daed..10e4d91 100644
--- a/gdb/i386-interix-nat.c
+++ b/gdb/i386-interix-nat.c
@@ -80,7 +80,7 @@ fill_gregset (gregset_t *gregsetp, int regno)
void
supply_fpregset (fpregset_t *fpregsetp)
{
- i387_supply_fsave ((char *) fpregsetp);
+ i387_supply_fsave ((const char *) fpregsetp, -1);
}
/* Given a pointer to a floating point register set in (fpregset_t *)
diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c
index 4549b37..4e348d9 100644
--- a/gdb/i386-linux-nat.c
+++ b/gdb/i386-linux-nat.c
@@ -320,7 +320,7 @@ static void store_regs (int tid, int regno) {}
void
supply_fpregset (elf_fpregset_t *fpregsetp)
{
- i387_supply_fsave ((char *) fpregsetp);
+ i387_supply_fsave ((const char *) fpregsetp, -1);
dummy_sse_values ();
}
@@ -385,7 +385,7 @@ static void store_fpregs (int tid, int regno) {}
void
supply_fpxregset (elf_fpxregset_t *fpxregsetp)
{
- i387_supply_fxsave ((char *) fpxregsetp);
+ i387_supply_fxsave ((const char *) fpxregsetp, -1);
}
/* Fill register REGNO (if it is a floating-point or SSE register) in
diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c
index f9a2887..2a912a1 100644
--- a/gdb/i386-nto-tdep.c
+++ b/gdb/i386-nto-tdep.c
@@ -87,9 +87,9 @@ static void
i386nto_supply_fpregset (char *fpregs)
{
if (nto_cpuinfo_valid && nto_cpuinfo_flags | X86_CPU_FXSR)
- i387_supply_fxsave (fpregs);
+ i387_supply_fxsave (fpregs, -1);
else
- i387_supply_fsave (fpregs);
+ i387_supply_fsave (fpregs, -1);
}
static void
diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c
index 0fc66fc..d81dc66 100644
--- a/gdb/i386bsd-nat.c
+++ b/gdb/i386bsd-nat.c
@@ -157,7 +157,7 @@ fill_gregset (gregset_t *gregsetp, int regno)
void
supply_fpregset (fpregset_t *fpregsetp)
{
- i387_supply_fsave ((char *) fpregsetp);
+ i387_supply_fsave ((const char *) fpregsetp, -1);
}
/* Fill register REGNO (if it is a floating-point register) in
@@ -176,7 +176,6 @@ fill_fpregset (fpregset_t *fpregsetp, int regno)
void
fetch_inferior_registers (int regno)
{
-
if (regno == -1 || GETREGS_SUPPLIES (regno))
{
gregset_t gregs;
@@ -201,7 +200,7 @@ fetch_inferior_registers (int regno)
(PTRACE_ARG3_TYPE) xmmregs, 0) == 0)
{
have_ptrace_xmmregs = 1;
- i387_supply_fxsave (xmmregs);
+ i387_supply_fxsave (xmmregs, -1);
}
else
{
@@ -209,14 +208,14 @@ fetch_inferior_registers (int regno)
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
perror_with_name ("Couldn't get floating point status");
- supply_fpregset (&fpregs);
+ i387_supply_fsave ((const char *) &fpregs, -1);
}
#else
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
perror_with_name ("Couldn't get floating point status");
- supply_fpregset (&fpregs);
+ i387_supply_fsave ((const char *) &fpregs, -1);
#endif
}
}
@@ -227,7 +226,6 @@ fetch_inferior_registers (int regno)
void
store_inferior_registers (int regno)
{
-
if (regno == -1 || GETREGS_SUPPLIES (regno))
{
gregset_t gregs;
@@ -272,7 +270,7 @@ store_inferior_registers (int regno)
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
perror_with_name ("Couldn't get floating point status");
- fill_fpregset (&fpregs, regno);
+ i387_fill_fsave ((char *) &fpregs, regno);
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
diff --git a/gdb/i386gnu-nat.c b/gdb/i386gnu-nat.c
index 4623e11..19a0654 100644
--- a/gdb/i386gnu-nat.c
+++ b/gdb/i386gnu-nat.c
@@ -89,7 +89,7 @@ fetch_fpregs (struct proc *thread)
}
/* Supply the floating-point registers. */
- i387_supply_fsave (state.hw_state);
+ i387_supply_fsave (state.hw_state, -1);
}
#ifdef HAVE_SYS_PROCFS_H
@@ -106,7 +106,7 @@ supply_gregset (gdb_gregset_t *gregs)
void
supply_fpregset (gdb_fpregset_t *fpregs)
{
- i387_supply_fsave ((char *) fpregs);
+ i387_supply_fsave ((const char *) fpregs, -1);
}
#endif
diff --git a/gdb/i386nbsd-tdep.c b/gdb/i386nbsd-tdep.c
index 601530b..9e8d973 100644
--- a/gdb/i386nbsd-tdep.c
+++ b/gdb/i386nbsd-tdep.c
@@ -1,4 +1,5 @@
-/* Target-dependent code for NetBSD/i386, for GDB.
+/* Target-dependent code for NetBSD/i386.
+
Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
@@ -88,7 +89,7 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
i386nbsd_supply_reg (regs, -1);
/* Floating point registers. */
- i387_supply_fsave (fsave);
+ i387_supply_fsave (fsave, -1);
}
static void
@@ -106,9 +107,9 @@ fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size,
case 2: /* Floating point registers. */
if (core_reg_size != 108)
- warning ("Wrong size FP register set in core file.");
+ warning ("Wrong size FP register set in core file.");
else
- i387_supply_fsave (core_reg_sect);
+ i387_supply_fsave (core_reg_sect, -1);
break;
case 3: /* "Extended" floating point registers. This is gdb-speak
@@ -116,7 +117,7 @@ fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size,
if (core_reg_size != 512)
warning ("Wrong size XMM register set in core file.");
else
- i387_supply_fxsave (core_reg_sect);
+ i387_supply_fxsave (core_reg_sect, -1);
break;
default:
diff --git a/gdb/i386obsd-tdep.c b/gdb/i386obsd-tdep.c
index 7db076d..8cfaa24 100644
--- a/gdb/i386obsd-tdep.c
+++ b/gdb/i386obsd-tdep.c
@@ -66,7 +66,7 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
i386obsd_supply_reg (regs, -1);
/* Floating point registers. */
- i387_supply_fsave (fsave);
+ i387_supply_fsave (fsave, -1);
}
static struct core_fns i386obsd_core_fns =
diff --git a/gdb/i386v4-nat.c b/gdb/i386v4-nat.c
index 7de8c14..c680dac 100644
--- a/gdb/i386v4-nat.c
+++ b/gdb/i386v4-nat.c
@@ -139,7 +139,7 @@ supply_fpregset (fpregset_t *fpregsetp)
if (FP0_REGNUM == 0)
return;
- i387_supply_fsave ((char *) fpregsetp);
+ i387_supply_fsave ((const char *) fpregsetp, -1);
}
/* Fill register REGNO (if it is a floating-point register) in
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index b6e53a1..6feb392 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -361,51 +361,44 @@ static int fsave_offset[] =
#define FSAVE_ADDR(fsave, regnum) (fsave + fsave_offset[regnum - FP0_REGNUM])
-/* Fill register REGNUM in GDB's register array with the appropriate
+/* Fill register REGNUM in GDB's register cache with the appropriate
value from *FSAVE. This function masks off any of the reserved
bits in *FSAVE. */
void
-i387_supply_register (int regnum, char *fsave)
-{
- if (fsave == NULL)
- {
- supply_register (regnum, NULL);
- return;
- }
-
- /* Most of the FPU control registers occupy only 16 bits in
- the fsave area. Give those a special treatment. */
- if (regnum >= FPC_REGNUM
- && regnum != FIOFF_REGNUM && regnum != FOOFF_REGNUM)
- {
- unsigned char val[4];
-
- memcpy (val, FSAVE_ADDR (fsave, regnum), 2);
- val[2] = val[3] = 0;
- if (regnum == FOP_REGNUM)
- val[1] &= ((1 << 3) - 1);
- supply_register (regnum, val);
- }
- else
- supply_register (regnum, FSAVE_ADDR (fsave, regnum));
-}
-
-/* Fill GDB's register array with the floating-point register values
- in *FSAVE. This function masks off any of the reserved
- bits in *FSAVE. */
-
-void
-i387_supply_fsave (char *fsave)
+i387_supply_fsave (const char *fsave, int regnum)
{
int i;
for (i = FP0_REGNUM; i < XMM0_REGNUM; i++)
- i387_supply_register (i, fsave);
+ if (regnum == -1 || regnum == i)
+ {
+ if (fsave == NULL)
+ {
+ supply_register (i, NULL);
+ return;
+ }
+
+ /* Most of the FPU control registers occupy only 16 bits in the
+ fsave area. Give those a special treatment. */
+ if (i >= FPC_REGNUM
+ && i != FIOFF_REGNUM && i != FOOFF_REGNUM)
+ {
+ unsigned char val[4];
+
+ memcpy (val, FSAVE_ADDR (fsave, i), 2);
+ val[2] = val[3] = 0;
+ if (i == FOP_REGNUM)
+ val[1] &= ((1 << 3) - 1);
+ supply_register (i, val);
+ }
+ else
+ supply_register (i, FSAVE_ADDR (fsave, i));
+ }
}
/* Fill register REGNUM (if it is a floating-point register) in *FSAVE
- with the value in GDB's register array. If REGNUM is -1, do this
+ with the value in GDB's register cache. If REGNUM is -1, do this
for all registers. This function doesn't touch any of the reserved
bits in *FSAVE. */
@@ -492,15 +485,15 @@ static int fxsave_offset[] =
((regnum == MXCSR_REGNUM) ? (fxsave + 24) : \
(fxsave + fxsave_offset[regnum - FP0_REGNUM]))
-static int i387_tag (unsigned char *raw);
+static int i387_tag (const unsigned char *raw);
-/* Fill GDB's register array with the floating-point and SSE register
- values in *FXSAVE. This function masks off any of the reserved
- bits in *FXSAVE. */
+/* Fill register REGNUM in GDB's register cache with the appropriate
+ floating-point or SSE register value from *FXSAVE. This function
+ masks off any of the reserved bits in *FXSAVE. */
void
-i387_supply_fxsave (char *fxsave)
+i387_supply_fxsave (const char *fxsave, int regnum)
{
int i, last_regnum = MXCSR_REGNUM;
@@ -508,62 +501,63 @@ i387_supply_fxsave (char *fxsave)
last_regnum = FOP_REGNUM;
for (i = FP0_REGNUM; i <= last_regnum; i++)
- {
- if (fxsave == NULL)
- {
- supply_register (i, NULL);
- continue;
- }
+ if (regnum == -1 || regnum == i)
+ {
+ if (fxsave == NULL)
+ {
+ supply_register (i, NULL);
+ continue;
+ }
- /* Most of the FPU control registers occupy only 16 bits in
- the fxsave area. Give those a special treatment. */
- if (i >= FPC_REGNUM && i < XMM0_REGNUM
- && i != FIOFF_REGNUM && i != FOOFF_REGNUM)
- {
- unsigned char val[4];
-
- memcpy (val, FXSAVE_ADDR (fxsave, i), 2);
- val[2] = val[3] = 0;
- if (i == FOP_REGNUM)
- val[1] &= ((1 << 3) - 1);
- else if (i== FTAG_REGNUM)
- {
- /* The fxsave area contains a simplified version of the
- tag word. We have to look at the actual 80-bit FP
- data to recreate the traditional i387 tag word. */
-
- unsigned long ftag = 0;
- int fpreg;
- int top;
-
- top = (((FXSAVE_ADDR (fxsave, FSTAT_REGNUM))[1] >> 3) & 0x7);
-
- for (fpreg = 7; fpreg >= 0; fpreg--)
- {
- int tag;
-
- if (val[0] & (1 << fpreg))
- {
- int regnum = (fpreg + 8 - top) % 8 + FP0_REGNUM;
- tag = i387_tag (FXSAVE_ADDR (fxsave, regnum));
- }
- else
- tag = 3; /* Empty */
-
- ftag |= tag << (2 * fpreg);
- }
- val[0] = ftag & 0xff;
- val[1] = (ftag >> 8) & 0xff;
- }
- supply_register (i, val);
- }
- else
- supply_register (i, FXSAVE_ADDR (fxsave, i));
- }
+ /* Most of the FPU control registers occupy only 16 bits in
+ the fxsave area. Give those a special treatment. */
+ if (i >= FPC_REGNUM && i < XMM0_REGNUM
+ && i != FIOFF_REGNUM && i != FOOFF_REGNUM)
+ {
+ unsigned char val[4];
+
+ memcpy (val, FXSAVE_ADDR (fxsave, i), 2);
+ val[2] = val[3] = 0;
+ if (i == FOP_REGNUM)
+ val[1] &= ((1 << 3) - 1);
+ else if (i== FTAG_REGNUM)
+ {
+ /* The fxsave area contains a simplified version of
+ the tag word. We have to look at the actual 80-bit
+ FP data to recreate the traditional i387 tag word. */
+
+ unsigned long ftag = 0;
+ int fpreg;
+ int top;
+
+ top = (((FXSAVE_ADDR (fxsave, FSTAT_REGNUM))[1] >> 3) & 0x7);
+
+ for (fpreg = 7; fpreg >= 0; fpreg--)
+ {
+ int tag;
+
+ if (val[0] & (1 << fpreg))
+ {
+ int regnum = (fpreg + 8 - top) % 8 + FP0_REGNUM;
+ tag = i387_tag (FXSAVE_ADDR (fxsave, regnum));
+ }
+ else
+ tag = 3; /* Empty */
+
+ ftag |= tag << (2 * fpreg);
+ }
+ val[0] = ftag & 0xff;
+ val[1] = (ftag >> 8) & 0xff;
+ }
+ supply_register (i, val);
+ }
+ else
+ supply_register (i, FXSAVE_ADDR (fxsave, i));
+ }
}
/* Fill register REGNUM (if it is a floating-point or SSE register) in
- *FXSAVE with the value in GDB's register array. If REGNUM is -1, do
+ *FXSAVE with the value in GDB's register cache. If REGNUM is -1, do
this for all registers. This function doesn't touch any of the
reserved bits in *FXSAVE. */
@@ -624,7 +618,7 @@ i387_fill_fxsave (char *fxsave, int regnum)
*RAW. */
static int
-i387_tag (unsigned char *raw)
+i387_tag (const unsigned char *raw)
{
int integer;
unsigned int exponent;
diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h
index df5c77b..84c31ec 100644
--- a/gdb/i387-tdep.h
+++ b/gdb/i387-tdep.h
@@ -45,33 +45,27 @@ extern void i387_register_to_value (struct frame_info *frame, int regnum,
extern void i387_value_to_register (struct frame_info *frame, int regnum,
struct type *type, const void *from);
-/* Fill register REGNUM in GDB's register array with the appropriate
+/* Fill register REGNUM in GDB's register cache with the appropriate
value from *FSAVE. This function masks off any of the reserved
bits in *FSAVE. */
-extern void i387_supply_register (int regnum, char *fsave);
-
-/* Fill GDB's register array with the floating-point register values
- in *FSAVE. This function masks off any of the reserved
- bits in *FSAVE. */
-
-extern void i387_supply_fsave (char *fsave);
+extern void i387_supply_fsave (const char *fsave, int regnum);
/* Fill register REGNUM (if it is a floating-point register) in *FSAVE
- with the value in GDB's register array. If REGNUM is -1, do this
+ with the value in GDB's register cache. If REGNUM is -1, do this
for all registers. This function doesn't touch any of the reserved
bits in *FSAVE. */
extern void i387_fill_fsave (char *fsave, int regnum);
-/* Fill GDB's register array with the floating-point and SSE register
- values in *FXSAVE. This function masks off any of the reserved
- bits in *FXSAVE. */
+/* Fill register REGNUM in GDB's register cache with the appropriate
+ floating-point or SSE register value from *FXSAVE. This function
+ masks off any of the reserved bits in *FXSAVE. */
-extern void i387_supply_fxsave (char *fxsave);
+extern void i387_supply_fxsave (const char *fxsave, int regnum);
/* Fill register REGNUM (if it is a floating-point or SSE register) in
- *FXSAVE with the value in GDB's register array. If REGNUM is -1, do
+ *FXSAVE with the value in GDB's register cache. If REGNUM is -1, do
this for all registers. This function doesn't touch any of the
reserved bits in *FXSAVE. */