mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-10-12 02:13:17 +00:00
MemArenaDarwin: Eliminate use of mach_make_memory_entry_64
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<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, ¤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<void*>(address), size, writeable))
|
||||
{
|
||||
UnmapFromMemoryRegion(reinterpret_cast<void*>(address), size);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user