From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10205 invoked by alias); 1 Nov 2005 17:11:02 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 10186 invoked by uid 22791); 1 Nov 2005 17:10:59 -0000 Received: from gateway-1237.mvista.com (HELO hermes.mvista.com) (12.44.186.158) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Tue, 01 Nov 2005 17:10:59 +0000 Received: from Nora (nora.ddns.mvista.com [10.0.10.156]) by hermes.mvista.com (Postfix) with ESMTP id 297F31A746; Tue, 1 Nov 2005 09:10:58 -0800 (PST) From: "Qunying Pan" To: Cc: Subject: Patch: Fix ftag error when it is restored from fxsave in gdbserver on x86 Date: Tue, 01 Nov 2005 17:11:00 -0000 Message-ID: <000001c5df07$39c341f0$9c0a000a@Nora> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-SW-Source: 2005-11/txt/msg00015.txt.bz2 Hello, Sent out to gdb-patches@sources.redhat.com yesterday, but did not get through I guess. Try again to gdb-patches@sourceware.org. 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 in cross-gdb, the output z will be set to nan instead of the expected output 3.0. The patch is: 2005-10-31 Qunying Pan * 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);