From: Jacek Caban Subject: [PATCH 2/3] ntdll: Make cpu_info global. Message-Id: <90a1e882-3f15-c3be-ad5a-b1798df154bf@codeweavers.com> Date: Tue, 23 Feb 2021 17:55:06 +0100 And use it in a few more places. Signed-off-by: Jacek Caban --- dlls/ntdll/unix/signal_x86_64.c | 16 ++++++---------- dlls/ntdll/unix/system.c | 2 +- dlls/ntdll/unix/unix_private.h | 1 + 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index cd0d0a2c1b0..baeb472d126 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -1528,7 +1528,7 @@ static void save_context( struct xcontext *xcontext, const ucontext_t *sigcontex context->ContextFlags |= CONTEXT_FLOATING_POINT; context->u.FltSave = *FPU_sig(sigcontext); context->MxCsr = context->u.FltSave.MxCsr; - if (user_shared_data->XState.EnabledFeatures && (xs = XState_sig(FPU_sig(sigcontext)))) + if ((cpu_info.FeatureSet & CPU_FEATURE_AVX) && (xs = XState_sig(FPU_sig(sigcontext)))) { /* xcontext and sigcontext are both on the signal stack, so we can * just reference sigcontext without overflowing 32 bit XState.Offset */ @@ -1558,7 +1558,7 @@ static void restore_context( const struct xcontext *xcontext, ucontext_t *sigcon amd64_thread_data()->dr7 = context->Dr7; set_sigcontext( context, sigcontext ); if (FPU_sig(sigcontext)) *FPU_sig(sigcontext) = context->u.FltSave; - if (user_shared_data->XState.EnabledFeatures && (xs = XState_sig(FPU_sig(sigcontext)))) + if ((cpu_info.FeatureSet & CPU_FEATURE_AVX) && (xs = XState_sig(FPU_sig(sigcontext)))) xs->CompactionMask = xcontext->host_compaction_mask; } @@ -1599,9 +1599,7 @@ __ASM_GLOBAL_FUNC( set_full_cpu_context, void signal_restore_full_cpu_context(void) { struct syscall_xsave *xsave = get_syscall_xsave( get_syscall_frame() ); - SYSTEM_CPU_INFORMATION cpu_info; - NtQuerySystemInformation( SystemCpuInformation, &cpu_info, sizeof(cpu_info), NULL ); if (cpu_info.FeatureSet & CPU_FEATURE_XSAVE) { __asm__ volatile( "xrstor64 %0" : : "m"(xsave->xsave), "a" (7), "d" (0) ); @@ -1849,7 +1847,7 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context ) { xsave->xsave = context->u.FltSave; } - if (user_shared_data->XState.EnabledFeatures && (xs = xstate_from_context( context ))) + if ((cpu_info.FeatureSet & CPU_FEATURE_AVX) && (xs = xstate_from_context( context ))) { CONTEXT_EX *context_ex = (CONTEXT_EX *)(context + 1); @@ -1955,11 +1953,11 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context ) amd64_thread_data()->dr6 = context->Dr6; amd64_thread_data()->dr7 = context->Dr7; } - if (user_shared_data->XState.EnabledFeatures && (xstate = xstate_from_context( context ))) + if ((cpu_info.FeatureSet & CPU_FEATURE_AVX) && (xstate = xstate_from_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; + const BOOL compaction_enabled = cpu_info.FeatureSet & CPU_FEATURE_XSAVEC; unsigned int mask; if (context_ex->XState.Length < offsetof(XSTATE, YmmContext) @@ -2044,7 +2042,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 = (cpu_info.FeatureSet & CPU_FEATURE_XSAVEC) ? 0x8000000000000004 : 0; if (src_xs->Mask & 4) { dst_xs->Mask = 4; @@ -2800,13 +2798,11 @@ void signal_init_process(void) */ void *signal_init_syscalls(void) { - SYSTEM_CPU_INFORMATION cpu_info; void *ptr, *syscall_dispatcher; extern void __wine_syscall_dispatcher_xsave(void) DECLSPEC_HIDDEN; extern void __wine_syscall_dispatcher_xsavec(void) DECLSPEC_HIDDEN; - NtQuerySystemInformation( SystemCpuInformation, &cpu_info, sizeof(cpu_info), NULL ); if (cpu_info.FeatureSet & CPU_FEATURE_XSAVEC) syscall_dispatcher = __wine_syscall_dispatcher_xsavec; else if (cpu_info.FeatureSet & CPU_FEATURE_XSAVE) diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 27ecfae365f..a141427f364 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -168,7 +168,7 @@ struct smbios_boot_info #define FIRM 0x4649524D #define RSMB 0x52534D42 -static SYSTEM_CPU_INFORMATION cpu_info; +SYSTEM_CPU_INFORMATION cpu_info; /******************************************************************************* * Architecture specific feature detection for CPUs diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index cf680218849..e14ab777a90 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -129,6 +129,7 @@ extern HANDLE keyed_event DECLSPEC_HIDDEN; extern timeout_t server_start_time DECLSPEC_HIDDEN; extern sigset_t server_block_set DECLSPEC_HIDDEN; extern struct _KUSER_SHARED_DATA *user_shared_data DECLSPEC_HIDDEN; +extern SYSTEM_CPU_INFORMATION cpu_info DECLSPEC_HIDDEN; #ifdef __i386__ extern struct ldt_copy __wine_ldt_copy DECLSPEC_HIDDEN; #endif