From da76f651ec20ac3b5cb8ace65f543d246a6c8f0a Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Sun, 27 Sep 2026 13:47:37 -0400 Subject: [PATCH] MemArenaDarwin: Eliminate use of mach_make_memory_entry_64 --- Source/Core/Common/MemArena.h | 1 - Source/Core/Common/MemArenaDarwin.cpp | 56 +++++++++------------------ 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/Source/Core/Common/MemArena.h b/Source/Core/Common/MemArena.h index 1a3093cc4d..9186bb0739 100644 --- a/Source/Core/Common/MemArena.h +++ b/Source/Core/Common/MemArena.h @@ -144,7 +144,6 @@ private: #elif defined(__APPLE__) vm_address_t m_shm_address = 0; vm_size_t m_shm_size = 0; - mem_entry_name_port_t m_shm_entry = MACH_PORT_NULL; vm_address_t m_region_address = 0; vm_size_t m_region_size = 0; diff --git a/Source/Core/Common/MemArenaDarwin.cpp b/Source/Core/Common/MemArenaDarwin.cpp index 0f6db28339..691660f462 100644 --- a/Source/Core/Common/MemArenaDarwin.cpp +++ b/Source/Core/Common/MemArenaDarwin.cpp @@ -25,36 +25,11 @@ void MemArena::GrabSHMSegment(size_t size, std::string_view base_name) return; } - memory_object_size_t entry_size = size; - // Large anonymous mappings are split into 128 MB chunks. Without MAP_MEM_VM_SHARE, - // mach_make_memory_entry_64 will only return an entry spanning the first chunk. - // Attempting to map through that entry will fail if it extends beyond the 128 MB - // boundary, which can happen when the sizes of MEM1/MEM2 are overridden. - constexpr vm_prot_t prot = VM_PROT_READ | VM_PROT_WRITE | MAP_MEM_VM_SHARE; - - retval = mach_make_memory_entry_64(mach_task_self(), &entry_size, m_shm_address, prot, - &m_shm_entry, MACH_PORT_NULL); - if (retval != KERN_SUCCESS) - { - ERROR_LOG_FMT(MEMMAP, "GrabSHMSegment failed: mach_make_memory_entry_64 returned {0:#x}", - retval); - - m_shm_address = 0; - m_shm_entry = MACH_PORT_NULL; - - return; - } - m_shm_size = size; } void MemArena::ReleaseSHMSegment() { - if (m_shm_entry != MACH_PORT_NULL) - { - mach_port_deallocate(mach_task_self(), m_shm_entry); - } - if (m_shm_address != 0) { vm_deallocate(mach_task_self(), m_shm_address, m_shm_size); @@ -62,7 +37,6 @@ void MemArena::ReleaseSHMSegment() m_shm_address = 0; m_shm_size = 0; - m_shm_entry = MACH_PORT_NULL; } void* MemArena::CreateView(s64 offset, size_t size) @@ -74,13 +48,15 @@ void* MemArena::CreateView(s64 offset, size_t size) } vm_address_t address = 0; - constexpr vm_prot_t prot = VM_PROT_READ | VM_PROT_WRITE; + vm_prot_t current_protection; + vm_prot_t maximum_protection; - kern_return_t retval = vm_map(mach_task_self(), &address, size, 0, VM_FLAGS_ANYWHERE, m_shm_entry, - offset, false, prot, prot, VM_INHERIT_DEFAULT); + kern_return_t retval = vm_remap(mach_task_self(), &address, size, 0, VM_FLAGS_ANYWHERE, + mach_task_self(), m_shm_address + offset, false, + ¤t_protection, &maximum_protection, VM_INHERIT_DEFAULT); if (retval != KERN_SUCCESS) { - ERROR_LOG_FMT(MEMMAP, "CreateView failed: vm_map returned {0:#x}", retval); + ERROR_LOG_FMT(MEMMAP, "CreateView failed: vm_remap returned {0:#x}", retval); return nullptr; } @@ -136,16 +112,22 @@ void* MemArena::MapInMemoryRegion(s64 offset, size_t size, void* base, bool writ } vm_address_t address = reinterpret_cast(base); - vm_prot_t prot = VM_PROT_READ; - if (writeable) - prot |= VM_PROT_WRITE; + vm_prot_t current_protection; + vm_prot_t maximum_protection; + + kern_return_t retval = vm_remap( + mach_task_self(), &address, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, mach_task_self(), + m_shm_address + offset, false, ¤t_protection, &maximum_protection, VM_INHERIT_DEFAULT); - kern_return_t retval = - vm_map(mach_task_self(), &address, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, m_shm_entry, - offset, false, prot, VM_PROT_READ | VM_PROT_WRITE, VM_INHERIT_DEFAULT); if (retval != KERN_SUCCESS) { - ERROR_LOG_FMT(MEMMAP, "MapInMemoryRegion failed: vm_map returned {0:#x}", retval); + ERROR_LOG_FMT(MEMMAP, "MapInMemoryRegion failed: vm_remap returned {0:#x}", retval); + return nullptr; + } + + if (!ChangeMappingProtection(reinterpret_cast(address), size, writeable)) + { + UnmapFromMemoryRegion(reinterpret_cast(address), size); return nullptr; }