This bug showed up on macOS Wow64 where XMM registers weren't being restored after an exception.
From: Brendan Shanks bshanks@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) {
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.