Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Jun 2017 14:19:18 +0530
From:      karnajit wangkhem <karnajitw@gmail.com>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Undesirable FPU tag word value after PT_SETFPREGS on i386
Message-ID:  <CAB6rxaTbYBezW=pEFNFyxJ-LQmdLA98H4QuT2ufr7MLqeb3FuQ@mail.gmail.com>
In-Reply-To: <CAB6rxaQwK3iqE3=qgp8hEyQ0jY-D5-ZfoQ0hdePnxr0aWEFidw@mail.gmail.com>
References:  <CAB6rxaSiG9zJMAjjBEKBimK_j6GaNaVXWuxH0civ1n0C0ZXF1w@mail.gmail.com> <20170616132329.GY2088@kib.kiev.ua> <CAB6rxaQwK3iqE3=qgp8hEyQ0jY-D5-ZfoQ0hdePnxr0aWEFidw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

Sorry for reviving this thread again. Will it be possible for this fix to
go freebsd 11 and head. The issue in my case is that lldb doesn't work well
with expression without this patch.

Please guide me in this regard.

Regards,
Karan

On Sat, Jun 17, 2017 at 2:23 PM, karnajit wangkhem <karnajitw@gmail.com>
wrote:

> Thanks that worked...
>
> $ ./a.out
> Child has stopped...
> FPU TAG = ffff
> FPU TAG = ffff
> Send continue to child process
> a.out   test.c
> Child exited
>
> Before:
> $ ./fpu
> Process has not terminated, but has stopped...
> Send continue to child process
> Enter d = 4.4
> Process has not terminated, but has stopped...
> Send continue to child process
> d = 4.400000 : e = nan : f = nan
> Child exited normally
>
> Now:
> $ ./fpu
> Process has not terminated, but has stopped...
> Enter d = Send continue to child process
> 4.4
> Process has not terminated, but has stopped...
> Send continue to child process
> d = 4.400000 : e = 7.900000 : f = 10.400000
> Child exited normally
>
> Regards,
> Karan
>
> On Fri, Jun 16, 2017 at 6:53 PM, Konstantin Belousov <kostikbel@gmail.com>
> wrote:
>
>> On Fri, Jun 16, 2017 at 03:19:35PM +0530, karnajit wangkhem wrote:
>> > Hi All,
>> >
>> > Please help me understand why NaN is reported after PT_SETFPREGS. As a
>> > result of this, if the inferior process contains an float operations,
>> they
>> > result in NaN.
>> > This behavior is not seen in case of 32/64 bit binary on amd64.
>> >
>> > My env
>> > kern.ostype: FreeBSD
>> > kern.osrelease: 11.0-RELEASE-p1
>> > kern.version: FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 03:40:55
>> UTC
>> > 2016
>> >     root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC
>> > hw.machine_arch: i386
>> >
>> > Result of the below program on an i386 box
>> > FPU TAG = ffff
>> > FPU TAG = fe00  -> 11 11 11 10 00 00 00 00
>>
>> FreeBSD 11 started translating between abridged and full FPU tags, but
>> the translation appeared to be broken.  Try this.
>>
>> diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
>> index 5ca1ee507fe..de29adc4101 100644
>> --- a/sys/i386/isa/npx.c
>> +++ b/sys/i386/isa/npx.c
>> @@ -1108,7 +1108,7 @@ npx_fill_fpregs_xmm1(struct savexmm *sv_xmm, struct
>> save87 *sv_87)
>>                 sv_87->sv_ac[i] = sv_xmm->sv_fp[i].fp_acc;
>>                 if ((penv_xmm->en_tw & (1 << i)) != 0)
>>                         /* zero and special are set as valid */
>> -                       penv_87->en_tw &= ~(3 << i);
>> +                       penv_87->en_tw &= ~(3 << i * 2);
>>         }
>>  }
>>
>> @@ -1143,7 +1143,7 @@ npx_set_fpregs_xmm(struct save87 *sv_87, struct
>> savexmm *sv_xmm)
>>         penv_xmm->en_tw = 0;
>>         for (i = 0; i < 8; ++i) {
>>                 sv_xmm->sv_fp[i].fp_acc = sv_87->sv_ac[i];
>> -               if ((penv_87->en_tw && (3 << i)) != (3 << i))
>> +               if ((penv_87->en_tw & (3 << i * 2)) != (3 << i * 2))
>>                     penv_xmm->en_tw |= 1 << i;
>>         }
>>  }
>>
>
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAB6rxaTbYBezW=pEFNFyxJ-LQmdLA98H4QuT2ufr7MLqeb3FuQ>