1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

ntdll: Only save AVX xstate in wine_syscall_dispatcher.

This commit is contained in:
Paul Gofman 2024-03-18 13:00:30 -06:00 committed by Alexandre Julliard
parent cf08bbaa0f
commit 7ae23ad775
2 changed files with 12 additions and 3 deletions

View file

@ -1005,6 +1005,7 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
CONTEXT_EX *context_ex = (CONTEXT_EX *)(context + 1);
XSAVE_AREA_HEADER *xs = (XSAVE_AREA_HEADER *)((char *)context_ex + context_ex->XState.Offset);
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
copy_xstate( &frame->xstate, xs, xs->Mask );
}
@ -1126,6 +1127,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
context_ex->XState.Length > sizeof(XSAVE_AREA_HEADER) + xstate_features_size)
return STATUS_INVALID_PARAMETER;
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
mask = (xstate_compaction_enabled ? xstate->CompactionMask : xstate->Mask) & xstate_extended_features();
xstate->Mask = frame->xstate.Mask & mask;
xstate->CompactionMask = xstate_compaction_enabled ? (0x8000000000000000 | mask) : 0;
@ -2127,6 +2129,7 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
NtGetContextThread( GetCurrentThread(), &context->c );
if (xstate_extended_features())
{
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
context_init_xstate( &context->c, &frame->xstate );
saved_compaction = frame->xstate.CompactionMask;
}
@ -2617,7 +2620,8 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
"testl $3,(%ecx)\n\t" /* frame->syscall_flags & (SYSCALL_HAVE_XSAVE | SYSCALL_HAVE_XSAVEC) */
"jz 2f\n\t"
"movl %fs:0x1fc,%eax\n\t" /* x86_thread_data()->xstate_features_mask */
"movl %fs:0x200,%edx\n\t" /* x86_thread_data()->xstate_features_mask high dword */
"xorl %edx,%edx\n\t"
"andl $7,%eax\n\t"
"xorl %edi,%edi\n\t"
"movl %edi,0x240(%ecx)\n\t"
"movl %edi,0x244(%ecx)\n\t"

View file

@ -1051,6 +1051,7 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
CONTEXT_EX *context_ex = (CONTEXT_EX *)(context + 1);
XSAVE_AREA_HEADER *xs = (XSAVE_AREA_HEADER *)((char *)context_ex + context_ex->XState.Offset);
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
copy_xstate( &frame->xstate, xs, xs->Mask );
}
@ -1159,6 +1160,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
context_ex->XState.Length > sizeof(XSAVE_AREA_HEADER) + xstate_features_size)
return STATUS_INVALID_PARAMETER;
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
mask = (xstate_compaction_enabled ? xstate->CompactionMask : xstate->Mask) & xstate_extended_features();
xstate->Mask = frame->xstate.Mask & mask;
xstate->CompactionMask = xstate_compaction_enabled ? (0x8000000000000000 | mask) : 0;
@ -1276,6 +1278,7 @@ NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
CONTEXT_EX *context_ex = (CONTEXT_EX *)(context + 1);
XSAVE_AREA_HEADER *xs = (XSAVE_AREA_HEADER *)((char *)context_ex + context_ex->XState.Offset);
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
copy_xstate( &frame->xstate, xs, xs->Mask );
frame->restore_flags |= CONTEXT_XSTATE;
}
@ -1367,6 +1370,7 @@ NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size )
context_ex->XState.Length > sizeof(XSAVE_AREA_HEADER) + xstate_features_size)
return STATUS_INVALID_PARAMETER;
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
mask = (xstate_compaction_enabled ? xstate->CompactionMask : xstate->Mask) & xstate_extended_features();
xstate->Mask = frame->xstate.Mask & mask;
xstate->CompactionMask = xstate_compaction_enabled ? (0x8000000000000000 | mask) : 0;
@ -2162,6 +2166,7 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
NtGetContextThread( GetCurrentThread(), &context->c );
if (xstate_extended_features())
{
if (xstate_compaction_enabled) frame->xstate.CompactionMask |= xstate_extended_features();
context_init_xstate( &context->c, &frame->xstate );
saved_compaction = frame->xstate.CompactionMask;
}
@ -2664,11 +2669,11 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
#ifdef __APPLE__
"movq %gs:0x30,%rdx\n\t"
"movl 0x340(%rdx),%eax\n\t"
"movl 0x344(%rdx),%edx\n\t"
#else
"movl %gs:0x340,%eax\n\t" /* amd64_thread_data()->xstate_features_mask */
"movl %gs:0x344,%edx\n\t" /* amd64_thread_data()->xstate_features_mask high dword */
#endif
"xorl %edx,%edx\n\t"
"andl $7,%eax\n\t"
"xorq %rbp,%rbp\n\t"
"movq %rbp,0x2c0(%rcx)\n\t"
"movq %rbp,0x2c8(%rcx)\n\t"