This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Patch: Fix ftag error when it is restored from fxsave in gdbserver on x86
- From: "Qunying Pan" <qpan at mvista dot com>
- To: <gdb-patches at sources dot redhat dot com>
- Cc: <qunyingpan at gmail dot com>
- Date: Mon, 31 Oct 2005 17:09:10 -0800
- Subject: Patch: Fix ftag error when it is restored from fxsave in gdbserver on x86
Hello,
This patch fixes ftag error when it is restored from fxsave in gdbserver
on x86. Acceptable?
Thanks,
Qunying
--------------------
The testcase is:
typedef long double doublest;
doublest
add_doublest (doublest u, doublest v)
{
return u + v;
}
int
main ()
{
doublest z = 0.0;
doublest x=1.0,y=2.0;
z = add_doublest(x, y);
printf("%Lf, %Lf %Lf\n", x, y, z);
return 0;
}
When debug with gdbserver, and set breakpoint at add_doublest, the
output z
will be set to nan instead of the expected output 3.0.
The patch is:
2005-10-31 Qunying Pan <qpan@mvista.com>
* gdbserver/i387-fp.c (i387_fxsave_to_cache): Fixing ftag error when
it is restored from fxsave
diff -urNp src/gdb/gdbserver.orig/i387-fp.c src/gdb/gdbserver/i387-fp.c
--- src/gdb/gdbserver.orig/i387-fp.c 2005-06-12 18:59:22.000000000
-0700
+++ src/gdb/gdbserver/i387-fp.c 2005-10-31 16:53:29.000000000 -0800
@@ -247,7 +247,7 @@ i387_fxsave_to_cache (const void *buf)
int i, top;
int st0_regnum = find_regno ("st0");
int xmm0_regnum = find_regno ("xmm0");
- unsigned long val;
+ unsigned long val, val2;
for (i = 0; i < 8; i++)
supply_register (i + st0_regnum, ((char *) &fp->st_space[0]) + i *
16);
@@ -267,7 +267,8 @@ i387_fxsave_to_cache (const void *buf)
/* Generate the form of ftag data that GDB expects. */
top = (fp->fstat >> 11) & 0x7;
- val = 0;
+ val = fp->ftag;
+ val2 = 0;
for (i = 7; i >= 0; i--)
{
int tag;
@@ -275,9 +276,9 @@ i387_fxsave_to_cache (const void *buf)
tag = i387_ftag (fp, (i + 8 - top) % 8);
else
tag = 3;
- val |= tag << (2 * i);
+ val2 |= tag << (2 * i);
}
- supply_register_by_name ("ftag", &val);
+ supply_register_by_name ("ftag", &val2);
val = fp->fiseg & 0xFFFF;
supply_register_by_name ("fiseg", &val);