All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hongxu Jia <hongxu.jia@windriver.com>
To: <openembedded-core@lists.openembedded.org>
Subject: Re: [RFC YOCTO #5248] core-image-lsb: Why FPU doesn't work correctly on qemux86-64
Date: Mon, 23 Sep 2013 17:11:17 +0800	[thread overview]
Message-ID: <524005B5.6060105@windriver.com> (raw)
In-Reply-To: <cover.1379488760.git.hongxu.jia@windriver.com>

On 09/23/2013 04:55 PM, Hongxu Jia wrote:
> *Preparation
> 1, vim local.conf
> ...
> DISTRO ?= "poky-lsb"
> MACHINE ?= "qemux86-64"
> ...
>
> *Problem
> 1, Build core-image-lsb
> ..
> bitbake core-image-lsb
> ..
>
> 2, Start qemux86-64, there are 21 LSB tcl test failures on
> qemux86-64, you could reproduce it by tcl interpreter:
>    1, On qemux86-64's terminal, start tcl interpreter
>    root@qemux86-64:~# $ tclsh
>    %
>
>    2, Run 'binary scan' to assign ieeeValues(-Subnormal)
>    % binary scan \x00\x00\x00\x00\x00\x00\x08\x80 d ieeeValues(-Subnormal)
>    1
>
>    3, Run 'puts' to output ieeeValues(-Subnormal), the result is '0.0'
>    % puts $ieeeValues(-Subnormal)
>    -0.0
>
>    Expected:
>    -1.1125369292536007e-308
>
> *Analysis
> 1, On the previous environment, add IMAGE_INSTALL_append = " tcl" to
> local.conf and build core-image-sato, the result is expected.
>
> 2, Trace tcl's source code, you could also reproduce the issue by
> compiling and executing the following C codes on core-image-lsb-sdk.
>
>    1) Build core-image-lsb-sdk, and Run qemux86-64.
>    2) On target's terminal, create a C source file:
>       root@qemux86-64:~# cat >> test.c << EOF
> #include <stdio.h>
>
> int main(int argc, char *argv[])
> {
>    double dd = 0;
>    char *p = (char*)&dd;
>    p[0] = 0x00;
>    p[1] = 0x00;
>    p[2] = 0x00;
>    p[3] = 0x00;
>    p[4] = 0x00;
>    p[5] = 0x00;
>    p[6] = 0x08;
>    p[7] = 0x00;
>
>    if (dd == 0.0)
>      printf("Incorrect equal 0.0\n");
>    else
>      printf("Expected not equal 0.0\n");
>
>    return 0;
> }
> EOF
>
>    2) Compile test.c
>      root@qemux86-64:~# gcc test.c -o test
>
>    3, Execute test
>    $ root@qemux86-64:~# ./test
>      Incorrect equal 0.0
>
>    Expected:
>      Expected not equal 0.0
>
> 3, It's about x86-64's FPU: the SSE MXCSR register.
>    If you invoke 'feenableexcept(FE_INEXACT);' or
>    'feclearexcept(FE_INEXACT);' in the above C test,
>    the issue will be fixed. In these two functions,
>    the SSE MXCSR register has been handled.
vim eglibc-2.18/libc/sysdeps/x86_64/fpu/feenablxcpt.c
...
#include <fenv.h>

int
feenableexcept (int excepts)
{
   unsigned short int new_exc, old_exc;
   unsigned int new;

   excepts &= FE_ALL_EXCEPT;

   /* Get the current control word of the x87 FPU.  */
   __asm__ ("fstcw %0" : "=m" (*&new_exc));

   old_exc = (~new_exc) & FE_ALL_EXCEPT;

   new_exc &= ~excepts;
   __asm__ ("fldcw %0" : : "m" (*&new_exc));

   /* And now the same for the SSE MXCSR register.  */
   __asm__ ("stmxcsr %0" : "=m" (*&new));

   /* The SSE exception masks are shifted by 7 bits.  */
   new &= ~(excepts << 7);
   __asm__ ("ldmxcsr %0" : : "m" (*&new));

   return old_exc;
}
...

//Hongxu

> *Solution
> Is it necessary to invoke 'feenableexcept(FE_INEXACT);' or
> 'feclearexcept(FE_INEXACT);' to handle SSE MXCSR register?
>
> Or any good idea about this issue.
>
> Thanks,
> Hongxu
>
>
>
>



  reply	other threads:[~2013-09-23  9:11 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-23  8:55 [RFC YOCTO #5248] core-image-lsb: Why FPU doesn't work correctly on qemux86-64 Hongxu Jia
2013-09-23  9:11 ` Hongxu Jia [this message]
2013-09-23 15:47   ` Khem Raj

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=524005B5.6060105@windriver.com \
    --to=hongxu.jia@windriver.com \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.