[newlib-cygwin] Cygwin: fegetenv() should not disable exceptions

Corinna Vinschen corinna@sourceware.org
Fri Aug 3 07:36:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=d79069d2ff163397ed83fd90c97ae778977274fb

commit d79069d2ff163397ed83fd90c97ae778977274fb
Author: J.H. van de Water <houder@xs4all.nl>
Date:   Fri Aug 3 01:45:12 2018 +0200

    Cygwin: fegetenv() should not disable exceptions
    
    fnstenv MUST be followed by fldenv in fegetenv(), as the former disables all
    exceptions in the x87 FPU, which is not appropriate here (fegetenv() ).
    fldenv after fnstenv should reload the x87 FPU w/ the configuration that was
    saved by fnstenv, i.e. a configuration that might have exceptions enabled.
    
    Note: x86_64 uses SSE for floating-point, not the x87 FPU. However, because
    feraiseexcept() attempts to provoke an exception using the x87 FPU, the bug
    in fegetenv() will make this attempt futile here (x86_64).
    
    Note: WoW uses the x87 FPU for floating-point, not SSE. Here anything that
    would normally result in triggering an exception, not only feraiseexcept(),
    will not be able to, as result of the bug in fegetenv().

Diff:
---
 winsup/cygwin/fenv.cc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/fenv.cc b/winsup/cygwin/fenv.cc
index bd3f904..066704b 100644
--- a/winsup/cygwin/fenv.cc
+++ b/winsup/cygwin/fenv.cc
@@ -141,7 +141,11 @@ fegetexcept (void)
 int
 fegetenv (fenv_t *envp)
 {
-  __asm__ volatile ("fnstenv %0" : "=m" (envp->_fpu) : );
+  /* fnstenv disables all exceptions in the x87 FPU; as this is not what is
+     desired here, reload the cfg saved from the x87 FPU, back to the FPU */
+  __asm__ volatile ("fnstenv %0\n\
+                     fldenv %0"
+		    : "=m" (envp->_fpu) : );
   if (use_sse)
     __asm__ volatile ("stmxcsr %0" : "=m" (envp->_sse_mxcsr) : );
   return 0;



More information about the Cygwin-cvs mailing list