ntdll: Only save AVX xstate in wine_syscall_dispatcher.
This commit is contained in:
parent
cf08bbaa0f
commit
7ae23ad775
2 changed files with 12 additions and 3 deletions
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue