I don't consider myself expert on this topic. But while _exploring_
something, I found these (MxCsr and FpCsr) are missing from
JUMP_BUFFER. Is this right? wine also don't have these. Wondering why?
Thought attached.
From cb1ff23556cbbdeb286f1fc26872d7b887044477 Mon Sep 17 00:00:00 2001
From: Biswapriyo Nath <nathbap...@gmail.com>
Date: Tue, 15 Jun 2021 21:30:25 +0530
Subject: [PATCH] crt: Add missing members in setjmp for x86_64.

---
 mingw-w64-crt/misc/setjmp.S    | 2 ++
 mingw-w64-headers/crt/setjmp.h | 4 +++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/mingw-w64-crt/misc/setjmp.S b/mingw-w64-crt/misc/setjmp.S
index b2058e9..0c06b86 100644
--- a/mingw-w64-crt/misc/setjmp.S
+++ b/mingw-w64-crt/misc/setjmp.S
@@ -50,6 +50,8 @@ __MINGW_USYMBOL(__intrinsic_setjmpex):
         movq    %r15,0x48(%rcx)      /* jmp_buf->R15 */
         movq    (%rsp),%rax
         movq    %rax,0x50(%rcx)      /* jmp_buf->Rip */
+        stmxcsr 0x58(%rcx)           /* jmp_buf->MxCsr */
+        fnstcw  0x5c(%rcx)           /* jmp_buf->FpCsr */
         movdqa  %xmm6,0x60(%rcx)     /* jmp_buf->Xmm6 */
         movdqa  %xmm7,0x70(%rcx)     /* jmp_buf->Xmm7 */
         movdqa  %xmm8,0x80(%rcx)     /* jmp_buf->Xmm8 */
diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h
index eb772a3..4b69efa 100644
--- a/mingw-w64-headers/crt/setjmp.h
+++ b/mingw-w64-headers/crt/setjmp.h
@@ -128,7 +128,9 @@ extern "C" {
     __MINGW_EXTENSION unsigned __int64 R14;
     __MINGW_EXTENSION unsigned __int64 R15;
     __MINGW_EXTENSION unsigned __int64 Rip;
-    __MINGW_EXTENSION unsigned __int64 Spare;
+    unsigned long MxCsr;
+    unsigned short FpCsr;
+    unsigned short Spare;
     SETJMP_FLOAT128 Xmm6;
     SETJMP_FLOAT128 Xmm7;
     SETJMP_FLOAT128 Xmm8;
-- 
2.32.0

_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to