Module: wine Branch: master Commit: e6fa673ad5e981d1114bb31235bd7f970c6bd78d URL: https://gitlab.winehq.org/wine/wine/-/commit/e6fa673ad5e981d1114bb31235bd7f9...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Jul 9 12:19:55 2024 +0200
ntdll: Create the cross-process work list at startup on ARM64EC.
Copied from the corresponding code in wow64.dll.
---
dlls/ntdll/ntdll_misc.h | 13 +++++++++++++ dlls/ntdll/signal_arm64ec.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index bda4dd61d25..52875efa6b5 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -122,6 +122,19 @@ static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len ) extern TEB_FLS_DATA *fls_alloc_data(void); extern void heap_thread_detach(void);
+#if defined __aarch64__ || defined __arm64ec__ +/* equivalent of WOW64INFO, stored after the 64-bit PEB */ +struct arm64ec_shared_info +{ + ULONG Wow64ExecuteFlags; + USHORT NativeMachineType; + USHORT EmulatedMachineType; + HANDLE SectionHandle; + CROSS_PROCESS_WORK_LIST *CrossProcessWorkList; + void *unknown; +}; +#endif + /* register context */
#ifdef __i386__ diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 3fbdb63cb83..b48255678de 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -57,6 +57,40 @@ static inline BOOL is_valid_arm64ec_frame( ULONG_PTR frame ) }
+/********************************************************************** + * create_cross_process_work_list + */ +static NTSTATUS create_cross_process_work_list( struct arm64ec_shared_info *info ) +{ + SIZE_T map_size = 0x4000; + LARGE_INTEGER size; + NTSTATUS status; + HANDLE section; + CROSS_PROCESS_WORK_LIST *list = NULL; + CROSS_PROCESS_WORK_ENTRY *end; + UINT i; + + size.QuadPart = map_size; + status = NtCreateSection( §ion, SECTION_ALL_ACCESS, NULL, &size, PAGE_READWRITE, SEC_COMMIT, 0 ); + if (status) return status; + status = NtMapViewOfSection( section, GetCurrentProcess(), (void **)&list, 0, 0, NULL, + &map_size, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE ); + if (status) + { + NtClose( section ); + return status; + } + + end = (CROSS_PROCESS_WORK_ENTRY *)((char *)list + map_size); + for (i = 0; list->entries + i + 1 <= end; i++) + RtlWow64PushCrossProcessWorkOntoFreeList( &list->free_list, &list->entries[i] ); + + info->SectionHandle = section; + info->CrossProcessWorkList = list; + return STATUS_SUCCESS; +} + + /********************************************************************** * send_cross_process_notification */ @@ -97,6 +131,7 @@ static BOOL send_cross_process_notification( HANDLE process, UINT id, const void NTSTATUS arm64ec_process_init( HMODULE module ) { NTSTATUS status = STATUS_SUCCESS; + struct arm64ec_shared_info *info = (struct arm64ec_shared_info *)(RtlGetCurrentPeb() + 1);
__os_arm64x_dispatch_call_no_redirect = RtlFindExportedRoutineByName( module, "ExitToX64" ); __os_arm64x_dispatch_fptr = RtlFindExportedRoutineByName( module, "DispatchJump" ); @@ -108,7 +143,7 @@ NTSTATUS arm64ec_process_init( HMODULE module ) #undef GET_PTR
if (pProcessInit) status = pProcessInit(); - + if (!status) status = create_cross_process_work_list( info ); if (!status) status = arm64ec_thread_init(); return status; }