ntdll: Fix compacted legacy xsave area handling.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7b95cdffa6
commit
aae2e2adf0
|
@ -1848,6 +1848,7 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
|
||||||
if (flags & CONTEXT_FLOATING_POINT)
|
if (flags & CONTEXT_FLOATING_POINT)
|
||||||
{
|
{
|
||||||
xsave->xsave = context->u.FltSave;
|
xsave->xsave = context->u.FltSave;
|
||||||
|
xsave->xstate.Mask |= XSTATE_MASK_LEGACY;
|
||||||
}
|
}
|
||||||
if (user_shared_data->XState.EnabledFeatures && (xs = xstate_from_context( context )))
|
if (user_shared_data->XState.EnabledFeatures && (xs = xstate_from_context( context )))
|
||||||
{
|
{
|
||||||
|
@ -1941,8 +1942,39 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
|
||||||
}
|
}
|
||||||
if (needed_flags & CONTEXT_FLOATING_POINT)
|
if (needed_flags & CONTEXT_FLOATING_POINT)
|
||||||
{
|
{
|
||||||
context->u.FltSave = get_syscall_xsave(frame)->xsave;
|
struct syscall_xsave *xsave = get_syscall_xsave( frame );
|
||||||
context->MxCsr = context->u.FltSave.MxCsr;
|
|
||||||
|
if (!xstate_compaction_enabled ||
|
||||||
|
(xsave->xstate.Mask & XSTATE_MASK_LEGACY_FLOATING_POINT))
|
||||||
|
{
|
||||||
|
memcpy( &context->u.FltSave, &xsave->xsave, FIELD_OFFSET( XSAVE_FORMAT, MxCsr ));
|
||||||
|
memcpy( context->u.FltSave.FloatRegisters, xsave->xsave.FloatRegisters,
|
||||||
|
sizeof( context->u.FltSave.FloatRegisters ));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset( &context->u.FltSave, 0, FIELD_OFFSET( XSAVE_FORMAT, MxCsr ));
|
||||||
|
memset( context->u.FltSave.FloatRegisters, 0,
|
||||||
|
sizeof( context->u.FltSave.FloatRegisters ));
|
||||||
|
context->u.FltSave.ControlWord = 0x37f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!xstate_compaction_enabled || (xsave->xstate.Mask & XSTATE_MASK_LEGACY_SSE))
|
||||||
|
{
|
||||||
|
memcpy( context->u.FltSave.XmmRegisters, xsave->xsave.XmmRegisters,
|
||||||
|
sizeof( context->u.FltSave.XmmRegisters ));
|
||||||
|
context->u.FltSave.MxCsr = xsave->xsave.MxCsr;
|
||||||
|
context->u.FltSave.MxCsr_Mask = xsave->xsave.MxCsr_Mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset( context->u.FltSave.XmmRegisters, 0,
|
||||||
|
sizeof( context->u.FltSave.XmmRegisters ));
|
||||||
|
context->u.FltSave.MxCsr = 0x1f80;
|
||||||
|
context->u.FltSave.MxCsr_Mask = 0x2ffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
context->MxCsr = context->u.FltSave.MxCsr;
|
||||||
context->ContextFlags |= CONTEXT_FLOATING_POINT;
|
context->ContextFlags |= CONTEXT_FLOATING_POINT;
|
||||||
}
|
}
|
||||||
/* update the cached version of the debug registers */
|
/* update the cached version of the debug registers */
|
||||||
|
|
Loading…
Reference in New Issue