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

commit ea01b87f0f43068fd69658725268ec403ad3b5e9
Author: Takashi Yano <[email protected]>
Date:   Thu Oct 31 15:47:35 2024 +0900

    Cygwin: cygfe: Fix a bug that signal handler destroys fpu states
    
    Previously, sigfe had a long-standing problem that the signal handler
    destroys fpu states. This is caused by fninit instruction in sigdelayed.
    With this patch, instead of fnstcw/fldcw and fninit, fnstenv/fldenv
    are used to maintain fpu states.
    Addresses: https://cygwin.com/pipermail/cygwin/2024-October/256503.html
    
    Fixes: ed89fbc3ff11 ("* gendef (sigdelayed (x86_64)): Save and restore FPU 
control word.")
    Reported-by: Christian Franke <[email protected]>
    Reviewed-by:
    Signed-off-by: Takashi Yano <[email protected]>

Diff:
---
 winsup/cygwin/release/3.5.5  |  3 +++
 winsup/cygwin/scripts/gendef | 15 +++++++--------
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/winsup/cygwin/release/3.5.5 b/winsup/cygwin/release/3.5.5
index dbd6b026b..9cc51dc2e 100644
--- a/winsup/cygwin/release/3.5.5
+++ b/winsup/cygwin/release/3.5.5
@@ -27,3 +27,6 @@ Fixes:
 
 - Restore pipe blocking mode for non-cygwin apps.
   Addresses: https://github.com/git-for-windows/git/issues/5115
+
+- Fix a problem that signal handler destroys the FPU context.
+  Addresses: https://cygwin.com/pipermail/cygwin/2024-October/256503.html
diff --git a/winsup/cygwin/scripts/gendef b/winsup/cygwin/scripts/gendef
index 3b1f8b9da..c2ad5c75e 100755
--- a/winsup/cygwin/scripts/gendef
+++ b/winsup/cygwin/scripts/gendef
@@ -213,10 +213,10 @@ sigdelayed:
        .seh_pushreg %rbx
        pushq   %rax
        .seh_pushreg %rax
-       subq    \$0x128,%rsp
-       .seh_stackalloc 0x128
-       stmxcsr 0x124(%rsp)
-       fnstcw  0x120(%rsp)
+       subq    \$0x148,%rsp
+       .seh_stackalloc 0x148
+       stmxcsr 0x13c(%rsp)
+       fnstenv 0x120(%rsp)
        movdqa  %xmm15,0x110(%rsp)
        movdqa  %xmm14,0x100(%rsp)
        movdqa  %xmm13,0xf0(%rsp)
@@ -275,10 +275,9 @@ sigdelayed:
        movdqa  0xf0(%rsp),%xmm13
        movdqa  0x100(%rsp),%xmm14
        movdqa  0x110(%rsp),%xmm15
-       fninit
-       fldcw   0x120(%rsp)
-       ldmxcsr 0x124(%rsp)
-       addq    \$0x128,%rsp
+       fldenv  0x120(%rsp)
+       ldmxcsr 0x13c(%rsp)
+       addq    \$0x148,%rsp
        popq    %rax
        popq    %rbx
        popq    %rcx

Reply via email to