Commit 482b6a6d authored by Martin Storsjö's avatar Martin Storsjö Committed by Alexandre Julliard

ntdll: Zero-initialize the syscall_frame used for starting threads on ARM/ARM64.

This fixes an inconsistency since fed7e7a7 (ntdll: Simulate a syscall return when starting a thread); in that commit, on i386 and x86_64, the syscall_frame used for starting the thread was zeroed with a memset, while it wasn't on arm and arm64. This had a noticable effect on float maths, where the uninitialized frame->restore_flags field could have the CONTEXT_FLOATING_POINT bit set. (call_init_thunk only ORs in CONTEXT_INTEGER into the restore_flags field, on all architectures). If that bit was set, it would restore uninitialized data into the fpscr register, possibly setting the FPU in a nondefault rounding mode. Signed-off-by: 's avatarMartin Storsjö <martin@martin.st> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 9b9d8182
......@@ -1105,6 +1105,7 @@ void DECLSPEC_HIDDEN call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, B
ctx = (CONTEXT *)((ULONG_PTR)context.Sp & ~15) - 1;
*ctx = context;
ctx->ContextFlags = CONTEXT_FULL;
memset( frame, 0, sizeof(*frame) );
NtSetContextThread( GetCurrentThread(), ctx );
frame->sp = (DWORD)ctx;
......
......@@ -1202,6 +1202,7 @@ void DECLSPEC_HIDDEN call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, B
ctx = (CONTEXT *)((ULONG_PTR)context.Sp & ~15) - 1;
*ctx = context;
ctx->ContextFlags = CONTEXT_FULL;
memset( frame, 0, sizeof(*frame) );
NtSetContextThread( GetCurrentThread(), ctx );
frame->sp = (ULONG64)ctx;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment