[PATCH 0/1] MR571: ntdll: Fix floating point registers not being restored under Wow64.
This bug showed up on macOS Wow64 where XMM registers weren't being restored after an exception. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/571
From: Brendan Shanks <bshanks(a)codeweavers.com> --- dlls/ntdll/unix/signal_x86_64.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index d6f19dbfa84..e2db56de76b 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2026,10 +2026,12 @@ NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size ) if (flags & CONTEXT_I386_EXTENDED_REGISTERS) { memcpy( &frame->xsave, context->ExtendedRegisters, sizeof(frame->xsave) ); + frame->restore_flags |= CONTEXT_FLOATING_POINT; } else if (flags & CONTEXT_I386_FLOATING_POINT) { fpu_to_fpux( &frame->xsave, &context->FloatSave ); + frame->restore_flags |= CONTEXT_FLOATING_POINT; } if (flags & CONTEXT_I386_XSTATE) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/571
Turns out this isn't complete, I'm getting infinite syscall fault loops which I think are caused by copy_context_64to32 not implementing FP+xstate copying yet. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/571#note_5465
participants (2)
-
Brendan Shanks -
Brendan Shanks (@bshanks)