[PATCH] Skip SSE registers if they're not supported
Mark Kettenis
kettenis@chello.nl
Sun May 12 14:29:00 GMT 2002
While working on multi-arching the i386 a bit further I encountered
the situation where I was debugging (on Linux) a binary that wasn't
recognized as a Linux binary. Instead it was recognized as a SVR4
binary, and since my current implementation of the SVR4 ABI doesn't
include the SSE registers, GDB choked when the native Linux support
bits tried to access these SSE registers in GDB's register file.
Thinking a bit more about what's happening, I reliased that my Athlon
does support the fxsave instruction while it doesn't have SSE
support. Therefore I think the attached patch is appropriate.
Checked in.
Mark
Index: ChangeLog
from Mark Kettenis <kettenis@gnu.org>
* i387-tdep.c (i387_supply_fxsave): Skip the SSE registers if
the're not supported by the current architecture.
(i387_fill_fxsave): Likewise.
Index: i387-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i387-tdep.c,v
retrieving revision 1.17
diff -u -p -r1.17 i387-tdep.c
--- i387-tdep.c 11 May 2002 17:22:26 -0000 1.17
+++ i387-tdep.c 12 May 2002 21:14:44 -0000
@@ -1,6 +1,6 @@
/* Intel 387 floating point stuff.
- Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1998, 1999, 2000, 2001
- Free Software Foundation, Inc.
+ Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1998, 1999, 2000,
+ 2001, 2002 Free Software Foundation, Inc.
This file is part of GDB.
@@ -542,9 +542,12 @@ static int i387_tag (unsigned char *raw)
void
i387_supply_fxsave (char *fxsave)
{
- int i;
+ int i, last_regnum = MXCSR_REGNUM;
+
+ if (gdbarch_tdep (current_gdbarch)->num_xmm_regs == 0)
+ last_regnum = FOP_REGNUM;
- for (i = FP0_REGNUM; i <= MXCSR_REGNUM; i++)
+ for (i = FP0_REGNUM; i <= last_regnum; i++)
{
/* Most of the FPU control registers occupy only 16 bits in
the fxsave area. Give those a special treatment. */
@@ -601,9 +604,12 @@ i387_supply_fxsave (char *fxsave)
void
i387_fill_fxsave (char *fxsave, int regnum)
{
- int i;
+ int i, last_regnum = MXCSR_REGNUM;
+
+ if (gdbarch_tdep (current_gdbarch)->num_xmm_regs == 0)
+ last_regnum = FOP_REGNUM;
- for (i = FP0_REGNUM; i <= MXCSR_REGNUM; i++)
+ for (i = FP0_REGNUM; i <= last_regnum; i++)
if (regnum == -1 || regnum == i)
{
/* Most of the FPU control registers occupy only 16 bits in
More information about the Gdb-patches
mailing list