Jacek Caban : ntdll: Don't use FeatureSet for XSAVE compaction support flag.

Alexandre Julliard julliard at winehq.org
Wed Feb 24 15:45:41 CST 2021


Module: wine
Branch: master
Commit: 014f249aea46694a89e6b7b507ddac1ff561d241
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=014f249aea46694a89e6b7b507ddac1ff561d241

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb 24 18:27:16 2021 +0100

ntdll: Don't use FeatureSet for XSAVE compaction support flag.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/signal_i386.c   | 4 ++--
 dlls/ntdll/unix/signal_x86_64.c | 9 ++++-----
 dlls/ntdll/unix/system.c        | 4 +++-
 dlls/ntdll/unix/unix_private.h  | 2 ++
 include/winternl.h              | 3 +--
 5 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index 4d03153bd1f..6cc80809316 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -716,7 +716,7 @@ static inline NTSTATUS save_xstate( CONTEXT *context )
             || context_ex->XState.Length > sizeof(XSTATE))
         return STATUS_INVALID_PARAMETER;
 
-    if (user_shared_data->XState.CompactionEnabled)
+    if (xstate_compaction_enabled)
     {
         /* xsavec doesn't use anything from the save area. */
         __asm__ volatile( "xsavec %0" : "=m"(xsave_area)
@@ -1650,7 +1650,7 @@ C_ASSERT( (offsetof(struct stack_layout, xstate) == sizeof(struct stack_layout))
         assert(!((ULONG_PTR)dst_xs & 63));
         context_init_xstate( &stack->context, stack->xstate );
         memset( dst_xs, 0, offsetof(XSTATE, YmmContext) );
-        dst_xs->CompactionMask = user_shared_data->XState.CompactionEnabled ? 0x8000000000000004 : 0;
+        dst_xs->CompactionMask = xstate_compaction_enabled ? 0x8000000000000004 : 0;
         if (src_xs->Mask & 4)
         {
             dst_xs->Mask = 4;
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index cd0d0a2c1b0..509ff6d460f 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1959,16 +1959,15 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
         {
             struct syscall_xsave *xsave = get_syscall_xsave( frame );
             CONTEXT_EX *context_ex = (CONTEXT_EX *)(context + 1);
-            const BOOL compaction_enabled = user_shared_data->XState.CompactionEnabled;
             unsigned int mask;
 
             if (context_ex->XState.Length < offsetof(XSTATE, YmmContext)
                 || context_ex->XState.Length > sizeof(XSTATE))
                 return STATUS_INVALID_PARAMETER;
 
-            mask = (compaction_enabled ? xstate->CompactionMask : xstate->Mask) & XSTATE_MASK_GSSE;
+            mask = (xstate_compaction_enabled ? xstate->CompactionMask : xstate->Mask) & XSTATE_MASK_GSSE;
             xstate->Mask = xsave->xstate.Mask & mask;
-            xstate->CompactionMask = compaction_enabled ? (0x8000000000000000 | mask) : 0;
+            xstate->CompactionMask = xstate_compaction_enabled ? (0x8000000000000000 | mask) : 0;
             memset( xstate->Reserved, 0, sizeof(xstate->Reserved) );
             if (xstate->Mask)
             {
@@ -2044,7 +2043,7 @@ static void setup_raise_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec
         assert( !((ULONG_PTR)dst_xs & 63) );
         context_init_xstate( &stack->context, stack->xstate );
         memset( dst_xs, 0, offsetof(XSTATE, YmmContext) );
-        dst_xs->CompactionMask = user_shared_data->XState.CompactionEnabled ? 0x8000000000000004 : 0;
+        dst_xs->CompactionMask = xstate_compaction_enabled ? 0x8000000000000004 : 0;
         if (src_xs->Mask & 4)
         {
             dst_xs->Mask = 4;
@@ -2807,7 +2806,7 @@ void *signal_init_syscalls(void)
     extern void __wine_syscall_dispatcher_xsavec(void) DECLSPEC_HIDDEN;
 
     NtQuerySystemInformation( SystemCpuInformation, &cpu_info, sizeof(cpu_info), NULL );
-    if (cpu_info.FeatureSet & CPU_FEATURE_XSAVEC)
+    if (xstate_compaction_enabled)
         syscall_dispatcher = __wine_syscall_dispatcher_xsavec;
     else if (cpu_info.FeatureSet & CPU_FEATURE_XSAVE)
         syscall_dispatcher = __wine_syscall_dispatcher_xsave;
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index 27ecfae365f..00fca0fd1f0 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -178,6 +178,8 @@ static SYSTEM_CPU_INFORMATION cpu_info;
  */
 #if defined(__i386__) || defined(__x86_64__)
 
+BOOL xstate_compaction_enabled = FALSE;
+
 #define AUTH	0x68747541	/* "Auth" */
 #define ENTI	0x69746e65	/* "enti" */
 #define CAMD	0x444d4163	/* "cAMD" */
@@ -308,7 +310,7 @@ static void get_cpuinfo( SYSTEM_CPU_INFORMATION *info )
         if (info->FeatureSet & CPU_FEATURE_XSAVE)
         {
             do_cpuid( 0x0000000d, regs3 ); /* get XSAVE details */
-            if (regs3[0] & 2) info->FeatureSet |= CPU_FEATURE_XSAVEC;
+            if (regs3[0] & 2) xstate_compaction_enabled = TRUE;
         }
 
         if (regs[1] == AUTH && regs[3] == ENTI && regs[2] == CAMD)
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index cf680218849..cd11ba1c46b 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -307,6 +307,8 @@ struct xcontext
 };
 
 #if defined(__i386__) || defined(__x86_64__)
+extern BOOL xstate_compaction_enabled DECLSPEC_HIDDEN;
+
 static inline XSTATE *xstate_from_context( const CONTEXT *context )
 {
     CONTEXT_EX *xctx = (CONTEXT_EX *)(context + 1);
diff --git a/include/winternl.h b/include/winternl.h
index 3beecf10ff6..f0ab223ef2e 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1754,14 +1754,13 @@ typedef struct _SYSTEM_CPU_INFORMATION {
 
 /* FIXME: following values are made up, actual flags are unknown */
 #define CPU_FEATURE_SSSE3         0x00008000   /* SSSE3 instructions */
-#define CPU_FEATURE_XSAVEC        0x00400000   /* XSAVEC instructions */
 #define CPU_FEATURE_SSE41         0x01000000   /* SSE41 instructions */
 #define CPU_FEATURE_SSE42         0x02000000   /* SSE42 instructions */
 #define CPU_FEATURE_AVX           0x40000000   /* AVX instructions */
 #define CPU_FEATURE_AVX2          0x80000000   /* AVX2 instructions */
-
 #define CPU_FEATURE_PAE           0x00200000
 #define CPU_FEATURE_DAZ           0x00400000
+
 #define CPU_FEATURE_ARM_VFP_32    0x00000001
 #define CPU_FEATURE_ARM_NEON      0x00000002
 #define CPU_FEATURE_ARM_V8_CRC32  0x00000004




More information about the wine-cvs mailing list