[PATCH] winecrt0: Add missing members in _JUMP_BUFFER for SJLJ.
Biswapriyo Nath
nathbappai at gmail.com
Sat Jul 10 00:00:31 CDT 2021
-------------- next part --------------
From cc1f129d0c7e26a776a5c73651158c70fba41901 Mon Sep 17 00:00:00 2001
From: Biswapriyo Nath <nathbappai at gmail.com>
Date: Sat, 10 Jul 2021 10:29:30 +0530
Subject: [PATCH] winecrt0: Add missing members in _JUMP_BUFFER for SJLJ.
This store and load MXCSR and x87 FPU control word in SJLJ exception.
Signed-off-by: Biswapriyo Nath <nathbappai at gmail.com>
---
dlls/ntdll/tests/exception.c | 4 +++-
dlls/winecrt0/setjmp.c | 5 +++++
include/msvcrt/setjmp.h | 4 +++-
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index cc97a98..8bede41 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -127,7 +127,9 @@ typedef struct _JUMP_BUFFER
unsigned __int64 R14;
unsigned __int64 R15;
unsigned __int64 Rip;
- unsigned __int64 Spare;
+ unsigned long MxCsr;
+ unsigned short FpCsr;
+ unsigned short Spare;
SETJMP_FLOAT128 Xmm6;
SETJMP_FLOAT128 Xmm7;
SETJMP_FLOAT128 Xmm8;
diff --git a/dlls/winecrt0/setjmp.c b/dlls/winecrt0/setjmp.c
index d83df54..ffb3b24 100644
--- a/dlls/winecrt0/setjmp.c
+++ b/dlls/winecrt0/setjmp.c
@@ -66,6 +66,8 @@ __ASM_GLOBAL_FUNC( __wine_setjmpex,
"movq %r15,0x48(%rcx)\n\t" /* jmp_buf->R15 */
"movq (%rsp),%rax\n\t"
"movq %rax,0x50(%rcx)\n\t" /* jmp_buf->Rip */
+ "stmxcsr 0x58(%rcx)\n\t" /* jmp_buf->MxCsr */
+ "fnstcw 0x5c(%rcx)\n\t" /* jmp_buf->FpCsr */
"movdqa %xmm6,0x60(%rcx)\n\t" /* jmp_buf->Xmm6 */
"movdqa %xmm7,0x70(%rcx)\n\t" /* jmp_buf->Xmm7 */
"movdqa %xmm8,0x80(%rcx)\n\t" /* jmp_buf->Xmm8 */
@@ -89,6 +91,9 @@ __ASM_GLOBAL_FUNC( __wine_longjmp,
"movq 0x38(%rcx),%r13\n\t" /* jmp_buf->R13 */
"movq 0x40(%rcx),%r14\n\t" /* jmp_buf->R14 */
"movq 0x48(%rcx),%r15\n\t" /* jmp_buf->R15 */
+ "ldmxcsr 0x58(%rcx)\n\t" /* jmp_buf->MxCsr */
+ "fnclex\n\t"
+ "fldcw 0x5c(%rcx)\n\t" /* jmp_buf->FpCsr */
"movdqa 0x60(%rcx),%xmm6\n\t" /* jmp_buf->Xmm6 */
"movdqa 0x70(%rcx),%xmm7\n\t" /* jmp_buf->Xmm7 */
"movdqa 0x80(%rcx),%xmm8\n\t" /* jmp_buf->Xmm8 */
diff --git a/include/msvcrt/setjmp.h b/include/msvcrt/setjmp.h
index b539b22..6576605 100644
--- a/include/msvcrt/setjmp.h
+++ b/include/msvcrt/setjmp.h
@@ -65,7 +65,9 @@ typedef DECLSPEC_ALIGN(16) struct _JUMP_BUFFER
unsigned __int64 R14;
unsigned __int64 R15;
unsigned __int64 Rip;
- unsigned __int64 Spare;
+ unsigned long MxCsr;
+ unsigned short FpCsr;
+ unsigned short Spare;
SETJMP_FLOAT128 Xmm6;
SETJMP_FLOAT128 Xmm7;
SETJMP_FLOAT128 Xmm8;
--
2.32.0
More information about the wine-devel
mailing list