This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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);



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]