Module: wine Branch: master Commit: 71d9f327f02156a9dff72f02faf494f452a9995f URL: https://gitlab.winehq.org/wine/wine/-/commit/71d9f327f02156a9dff72f02faf494f...
Author: Alexandre Julliard julliard@winehq.org Date: Fri May 26 17:15:18 2023 +0200
ntdll: Allocate the ARM64EC code map when the first ARM64X binary is loaded.
---
dlls/ntdll/unix/env.c | 1 - dlls/ntdll/unix/unix_private.h | 1 - dlls/ntdll/unix/virtual.c | 39 +++++++++++++++++++-------------------- 3 files changed, 19 insertions(+), 22 deletions(-)
diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 30782a70eb0..fd505a7d2c2 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -1869,7 +1869,6 @@ static void init_peb( RTL_USER_PROCESS_PARAMETERS *params, void *module ) break; case IMAGE_FILE_MACHINE_AMD64: if (main_image_info.Machine == current_machine) break; - peb->EcCodeBitMap = virtual_alloc_arm64ec_map(); ERR( "starting %s in experimental ARM64EC mode\n", debugstr_us(¶ms->ImagePathName) ); break; } diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 2b19b8af3d2..9b69c71209a 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -233,7 +233,6 @@ extern void virtual_free_teb( TEB *teb ) DECLSPEC_HIDDEN; extern NTSTATUS virtual_clear_tls_index( ULONG index ) DECLSPEC_HIDDEN; extern NTSTATUS virtual_alloc_thread_stack( INITIAL_TEB *stack, ULONG_PTR limit, SIZE_T reserve_size, SIZE_T commit_size, BOOL guard_page ) DECLSPEC_HIDDEN; -extern void *virtual_alloc_arm64ec_map(void) DECLSPEC_HIDDEN; extern void virtual_map_user_shared_data(void) DECLSPEC_HIDDEN; extern NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack ) DECLSPEC_HIDDEN; extern unsigned int virtual_locked_server_call( void *req_ptr ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 92ee61e6353..2d0dda64249 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -2383,6 +2383,23 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, int fd, BOOL *removable )
#ifdef __aarch64__
+/*********************************************************************** + * alloc_arm64ec_map + */ +static void alloc_arm64ec_map(void) +{ + SIZE_T size = ((ULONG_PTR)user_space_limit + page_size) >> (page_shift + 3); /* one bit per page */ + unsigned int status = NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&arm64ec_map, 0, &size, + MEM_COMMIT, PAGE_READWRITE ); + if (status) + { + ERR( "failed to allocate ARM64EC map: %08x\n", status ); + exit(1); + } + peb->EcCodeBitMap = arm64ec_map; +} + + /*********************************************************************** * apply_arm64x_relocations */ @@ -2449,8 +2466,9 @@ static void update_arm64x_mapping( char *base, IMAGE_NT_HEADERS *nt, IMAGE_SECTI
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY, CHPEMetadataPointer )) return; if (!cfg->CHPEMetadataPointer) return; + if (!arm64ec_map) alloc_arm64ec_map(); metadata = (void *)(base + (cfg->CHPEMetadataPointer - nt->OptionalHeader.ImageBase)); - if (metadata->CodeMap && arm64ec_map) + if (metadata->CodeMap) { const IMAGE_CHPE_RANGE_ENTRY *map = (void *)(base + metadata->CodeMap);
@@ -3523,25 +3541,6 @@ done: }
-/*********************************************************************** - * virtual_alloc_arm64ec_map - */ -void *virtual_alloc_arm64ec_map(void) -{ -#ifdef __aarch64__ - SIZE_T size = ((ULONG_PTR)user_space_limit + page_size) >> (page_shift + 3); /* one bit per page */ - unsigned int status = NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&arm64ec_map, 0, &size, - MEM_COMMIT, PAGE_READWRITE ); - if (status) - { - ERR( "failed to allocate ARM64EC map: %08x\n", status ); - exit(1); - } -#endif - return arm64ec_map; -} - - /*********************************************************************** * virtual_map_user_shared_data */