[PATCH] ntdll: Initialize StatusWord and TagWord in i386 init_thread_context.

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Fri Jul 3 01:56:57 CDT 2020


This does not resolve the bug, but moves toward resolving it.

I have not been able to get a consistent read on what to initialize the 
remaining members to.

Thanks,
Jefferson
-------------- next part --------------
From 9a98ce3e59a325ae7baaf8745f9ef2844f616099 Mon Sep 17 00:00:00 2001
From: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
Date: Fri, 3 Jul 2020 08:36:14 +0000
Subject: [PATCH] ntdll: Initialize StatusWord and TagWord in i386
 init_thread_context.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49495
Signed-off-by: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
---
 dlls/kernel32/tests/process.c | 40 +++++++++++++++++++++++++++++++++--
 dlls/ntdll/unix/signal_i386.c |  4 ++++
 2 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index eaa5da2e95..0a47f53ce9 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -62,6 +62,34 @@
           wine_dbgstr_w(expected), wine_dbgstr_w(value)); \
     } while (0)
 
+#ifndef __x86_64__
+typedef struct DECLSPEC_ALIGN(16) _M128A
+{
+    ULONGLONG Low;
+    LONGLONG High;
+} M128A;
+
+typedef struct
+{
+    WORD ControlWord;
+    WORD StatusWord;
+    BYTE TagWord;
+    BYTE Reserved1;
+    WORD ErrorOpcode;
+    DWORD ErrorOffset;
+    WORD ErrorSelector;
+    WORD Reserved2;
+    DWORD DataOffset;
+    WORD DataSelector;
+    WORD Reserved3;
+    DWORD MxCsr;
+    DWORD MxCsr_Mask;
+    M128A FloatRegisters[8];
+    M128A XmmRegisters[16];
+    BYTE Reserved4[96];
+} XMM_SAVE_AREA32;
+#endif
+
 static HINSTANCE hkernel32, hntdll;
 static void   (WINAPI *pGetNativeSystemInfo)(LPSYSTEM_INFO);
 static BOOL   (WINAPI *pGetSystemRegistryQuota)(PDWORD, PDWORD);
@@ -3214,7 +3242,11 @@ static void test_SuspendProcessNewThread(void)
         "esp is not at top of stack page or properly aligned: %08x\n", ctx.Esp );
     ok( (ctx.EFlags & ~2) == 0x200, "wrong flags %08x\n", ctx.EFlags );
     ok( (WORD)ctx.FloatSave.ControlWord == 0x27f, "wrong control %08x\n", ctx.FloatSave.ControlWord );
-    ok( *(WORD *)ctx.ExtendedRegisters == 0x27f, "wrong control %08x\n", *(WORD *)ctx.ExtendedRegisters );
+    ok( (WORD)ctx.FloatSave.StatusWord == 0, "wrong status %08x\n", ctx.FloatSave.StatusWord );
+    ok( (WORD)ctx.FloatSave.TagWord == 0xffff, "wrong tag %08x\n", ctx.FloatSave.TagWord );
+    ok( ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->ControlWord == 0x27f, "wrong control %08x\n", ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->ControlWord );
+    ok( ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->StatusWord == 0, "wrong status %08x\n", ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->StatusWord );
+    ok( ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->TagWord == 0, "wrong tag %08x\n", ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->TagWord );
 #endif
 
     ResumeThread( thread_handle );
@@ -3379,7 +3411,11 @@ static void test_SuspendProcessState(void)
         "esp is not at top of stack page or properly aligned: %08x\n", ctx.Esp );
     ok( (ctx.EFlags & ~2) == 0x200, "wrong flags %08x\n", ctx.EFlags );
     ok( (WORD)ctx.FloatSave.ControlWord == 0x27f, "wrong control %08x\n", ctx.FloatSave.ControlWord );
-    ok( *(WORD *)ctx.ExtendedRegisters == 0x27f, "wrong control %08x\n", *(WORD *)ctx.ExtendedRegisters );
+    ok( (WORD)ctx.FloatSave.StatusWord == 0, "wrong status %08x\n", ctx.FloatSave.StatusWord );
+    ok( (WORD)ctx.FloatSave.TagWord == 0xffff, "wrong tag %08x\n", ctx.FloatSave.TagWord );
+    ok( ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->ControlWord == 0x27f, "wrong control %08x\n", ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->ControlWord );
+    ok( ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->StatusWord == 0, "wrong status %08x\n", ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->StatusWord );
+    ok( ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->TagWord == 0, "wrong tag %08x\n", ((XMM_SAVE_AREA32 *)ctx.ExtendedRegisters)->TagWord );
     entry_ptr = (void *)ctx.Eax;
     peb_ptr = (void *)ctx.Ebx;
 
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index ea9bfbeb3b..c1f7cfe3f6 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -2270,7 +2270,11 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry,
     context->Esp    = (DWORD)NtCurrentTeb()->Tib.StackBase - 16;
     context->Eip    = (DWORD)relay;
     context->FloatSave.ControlWord = 0x27f;
+    context->FloatSave.StatusWord  = 0;
+    context->FloatSave.TagWord     = 0xffff;
     ((XMM_SAVE_AREA32 *)context->ExtendedRegisters)->ControlWord = 0x27f;
+    ((XMM_SAVE_AREA32 *)context->ExtendedRegisters)->StatusWord  = 0;
+    ((XMM_SAVE_AREA32 *)context->ExtendedRegisters)->TagWord     = 0;
     ((XMM_SAVE_AREA32 *)context->ExtendedRegisters)->MxCsr = 0x1f80;
 }
 
-- 
2.26.2



More information about the wine-devel mailing list