MemArenaDarwin: Eliminate use of mach_make_memory_entry_64

This commit is contained in:
OatmealDome
2026-09-27 13:59:01 -04:00
parent 465c652da1
commit da76f651ec
2 changed files with 19 additions and 38 deletions
-1
View File
@@ -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;
+19 -37
View File
@@ -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,
&current_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<vm_address_t>(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, &current_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<void*>(address), size, writeable))
{
UnmapFromMemoryRegion(reinterpret_cast<void*>(address), size);
return nullptr;
}