From: Jacek Caban <jacek@codeweavers.com> --- dlls/ntdll/unix/signal_arm64.c | 11 ++++------- dlls/ntdll/unix/unix_private.h | 8 +------- dlls/ntdll/unix/virtual.c | 12 ++++++++++++ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index a1d35cd5a44..9750ec55cc4 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -424,11 +424,8 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context ) frame->sp = context->Sp; frame->pc = context->Pc; frame->cpsr = context->Cpsr; - if (is_arm64ec()) - { - if (!is_ec_code( frame->pc )) flags |= RESTORE_FLAGS_EMULATION; - else frame->restore_flags &= ~RESTORE_FLAGS_EMULATION; - } + if (is_emulated_code( frame->pc )) flags |= RESTORE_FLAGS_EMULATION; + else frame->restore_flags &= ~RESTORE_FLAGS_EMULATION; } if (flags & CONTEXT_FLOATING_POINT) { @@ -1403,7 +1400,7 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *_sigcontext ) save_context( &context, sigcontext ); context.ContextFlags |= CONTEXT_EXCEPTION_REPORTING; wait_suspend( &context ); - if (is_arm64ec() && !is_ec_code( context.Pc )) + if (is_emulated_code( context.Pc )) { CONTEXT *user_context = (CONTEXT *)((context.Sp - sizeof(CONTEXT)) & ~15); @@ -1433,7 +1430,7 @@ static void usr2_handler( int signal, siginfo_t *siginfo, void *_sigcontext ) if (!is_inside_syscall( data, SP_sig(sigcontext) )) return; if (!frame) return; - if (is_arm64ec() && !is_ec_code( frame->pc )) + if (is_emulated_code( frame->pc )) { CONTEXT *user_context = (CONTEXT *)((frame->sp - sizeof(CONTEXT)) & ~15); diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index c8ca97d21a0..9a4db8e5d76 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -335,6 +335,7 @@ extern void virtual_fill_image_information( const struct pe_image_info *pe_info, SECTION_IMAGE_INFORMATION *info ); extern void *get_builtin_so_handle( void *module ); extern NTSTATUS set_builtin_unixlib_name( void *module, const char *name ); +extern BOOL is_emulated_code( ULONG_PTR ptr ); extern NTSTATUS get_thread_ldt_entry( HANDLE handle, THREAD_DESCRIPTOR_INFORMATION *info, ULONG len ); extern void *get_native_context( CONTEXT *context ); @@ -478,13 +479,6 @@ static inline BOOL is_inside_syscall( struct thread_data *data, ULONG_PTR sp ) (char *)sp <= (char *)get_syscall_frame( data )); } -static inline BOOL is_ec_code( ULONG_PTR ptr ) -{ - const UINT64 *map = (const UINT64 *)peb->EcCodeBitMap; - ULONG_PTR page = ptr / page_size; - return (map[page / 64] >> (page & 63)) & 1; -} - static inline CLIENT_ID make_client_id( ULONG pid, ULONG tid ) { CLIENT_ID id = { .UniqueProcess = ULongToHandle(pid), .UniqueThread = ULongToHandle(tid) }; diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index d6038c4dcb6..356b456bc29 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -2797,6 +2797,18 @@ static void *get_host_addr_space_limit(void) #ifdef __aarch64__ +/*********************************************************************** + * is_emulated_code + */ +BOOL is_emulated_code( ULONG_PTR ptr ) +{ + const UINT64 *map = (const UINT64 *)peb->EcCodeBitMap; + ULONG_PTR page = ptr / page_size; + if (!is_arm64ec() || ptr >= (ULONG_PTR)user_space_limit) return FALSE; + return !((map[page / 64] >> (page & 63)) & 1); +} + + /*********************************************************************** * alloc_arm64ec_map */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11744