Module: wine Branch: master Commit: cc0ca49a464d77cc731b97a650e0f696c04478f4 URL: https://gitlab.winehq.org/wine/wine/-/commit/cc0ca49a464d77cc731b97a650e0f69...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Mar 8 12:27:58 2023 +0100
ntdll: Pass the WoW context to the server on ARM64.
---
dlls/ntdll/unix/signal_arm64.c | 11 ++++++++++- dlls/ntdll/unix/thread.c | 20 +++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 3855afc34f4..186054af546 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -590,7 +590,7 @@ void *get_native_context( CONTEXT *context ) */ void *get_wow_context( CONTEXT *context ) { - return NULL; + return get_cpu_area( main_image_info.Machine ); }
@@ -878,6 +878,15 @@ NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size ) memcpy( &context->FloatSave, &wow_frame->FloatSave, sizeof(context->FloatSave) ); context->ContextFlags |= CONTEXT_I386_FLOATING_POINT; } + if (needed_flags & CONTEXT_I386_DEBUG_REGISTERS) + { + context->Dr0 = wow_frame->Dr0; + context->Dr1 = wow_frame->Dr1; + context->Dr2 = wow_frame->Dr2; + context->Dr3 = wow_frame->Dr3; + context->Dr6 = wow_frame->Dr6; + context->Dr7 = wow_frame->Dr7; + } /* FIXME: CONTEXT_I386_XSTATE */ break; } diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index 79943ebabc2..3228180e20f 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -214,8 +214,15 @@ static unsigned int get_server_context_flags( const void *context, USHORT machin */ static unsigned int get_native_context_flags( USHORT native_machine, USHORT wow_machine ) { - if (native_machine == wow_machine) return 0; - return SERVER_CTX_DEBUG_REGISTERS | SERVER_CTX_FLOATING_POINT | SERVER_CTX_YMM_REGISTERS; + switch (MAKELONG( native_machine, wow_machine )) + { + case MAKELONG( IMAGE_FILE_MACHINE_AMD64, IMAGE_FILE_MACHINE_I386 ): + return SERVER_CTX_DEBUG_REGISTERS | SERVER_CTX_FLOATING_POINT | SERVER_CTX_YMM_REGISTERS; + case MAKELONG( IMAGE_FILE_MACHINE_ARM64, IMAGE_FILE_MACHINE_ARMNT ): + return SERVER_CTX_DEBUG_REGISTERS | SERVER_CTX_FLOATING_POINT; + default: + return 0; + } }
@@ -595,6 +602,10 @@ static NTSTATUS context_to_server( context_t *to, USHORT to_machine, const void return STATUS_SUCCESS; }
+ case MAKELONG( IMAGE_FILE_MACHINE_ARM64, IMAGE_FILE_MACHINE_I386 ): + case MAKELONG( IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_ARM64 ): + return STATUS_SUCCESS; + default: return STATUS_INVALID_PARAMETER; } @@ -974,7 +985,6 @@ static NTSTATUS context_from_server( void *dst, const context_t *from, USHORT ma ARM64_NT_CONTEXT *to = dst;
to_flags = to->ContextFlags & ~CONTEXT_ARM64; - to->ContextFlags = CONTEXT_ARM64; if ((from->flags & SERVER_CTX_CONTROL) && (to_flags & CONTEXT_ARM64_CONTROL)) { to->ContextFlags |= CONTEXT_ARM64_CONTROL; @@ -1011,6 +1021,10 @@ static NTSTATUS context_from_server( void *dst, const context_t *from, USHORT ma return STATUS_SUCCESS; }
+ case MAKELONG( IMAGE_FILE_MACHINE_ARM64, IMAGE_FILE_MACHINE_I386 ): + case MAKELONG( IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_ARM64 ): + return STATUS_SUCCESS; + default: return STATUS_INVALID_PARAMETER; }