From a91234ce4446b389e7e07c149d7af025404fe895 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 9 May 2026 22:02:21 +0300 Subject: [PATCH] MacOS: Do not leak MAP_JIT on utils::memory_decommit --- Utilities/JITASM.cpp | 4 ++-- Utilities/JITLLVM.cpp | 2 +- rpcs3/util/vm.hpp | 9 +++++++-- rpcs3/util/vm_native.cpp | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Utilities/JITASM.cpp b/Utilities/JITASM.cpp index bf663b3dab..962f347bfa 100644 --- a/Utilities/JITASM.cpp +++ b/Utilities/JITASM.cpp @@ -316,10 +316,10 @@ void jit_runtime::finalize() noexcept #endif // Reset JIT memory #ifdef CAN_OVERCOMMIT - utils::memory_reset(get_jit_memory(), 0x80000000); + utils::memory_reset(get_jit_memory(), 0x80000000, true); utils::memory_protect(get_jit_memory(), 0x40000000, utils::protection::wx); #else - utils::memory_decommit(get_jit_memory(), 0x80000000); + utils::memory_decommit(get_jit_memory(), 0x80000000, true); #endif s_code_pos = 0; diff --git a/Utilities/JITLLVM.cpp b/Utilities/JITLLVM.cpp index 1141e2f540..e1cbfe32b0 100644 --- a/Utilities/JITLLVM.cpp +++ b/Utilities/JITLLVM.cpp @@ -218,7 +218,7 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager // utils::memory_decommit(m_code_mems, how_much(code_ptr)); // utils::memory_decommit(m_data_ro_mems, how_much(data_ro_ptr)); // utils::memory_decommit(m_data_rw_mems, how_much(data_rw_ptr)); - utils::memory_decommit(m_code_mems, c_max_size * 3); + utils::memory_decommit(m_code_mems, c_max_size * 3, true); } llvm::JITSymbol findSymbol(const std::string& name) override diff --git a/rpcs3/util/vm.hpp b/rpcs3/util/vm.hpp index d36e098db0..560823cb31 100644 --- a/rpcs3/util/vm.hpp +++ b/rpcs3/util/vm.hpp @@ -44,10 +44,15 @@ namespace utils void memory_commit(void* pointer, usz size, protection prot = protection::rw); // Decommit all memory committed via commit_page_memory. - void memory_decommit(void* pointer, usz size); + void memory_decommit(void* pointer, usz size, bool can_be_jit = false); // Decommit all memory and commit it again. - void memory_reset(void* pointer, usz size, protection prot = protection::rw); + void memory_reset(void* pointer, usz size, protection prot = protection::rw, bool can_be_jit = false); + + inline void memory_reset(void* pointer, usz size, bool can_be_jit = false) + { + return memory_reset(pointer, size, protection::rw, can_be_jit); + } // Free memory after reserved by memory_reserve, should specify original size void memory_release(void* pointer, usz size); diff --git a/rpcs3/util/vm_native.cpp b/rpcs3/util/vm_native.cpp index 30a6218da7..c66c016a52 100644 --- a/rpcs3/util/vm_native.cpp +++ b/rpcs3/util/vm_native.cpp @@ -335,7 +335,7 @@ namespace utils #endif } - void memory_decommit(void* pointer, usz size) + void memory_decommit(void* pointer, usz size, [[maybe_unused]] bool can_be_jit) { if (!size) { @@ -352,7 +352,7 @@ namespace utils // The Xcode manpage says the pointer is a hint and the OS will try to map at the hint location // so this isn't completely undefined behavior. ensure(::munmap(pointer, size) != -1); - ensure(::mmap(pointer, size, PROT_NONE, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0) == pointer); + ensure(::mmap(pointer, size, PROT_NONE, MAP_ANON | MAP_PRIVATE | (can_be_jit ? MAP_JIT : 0), -1, 0) == pointer); #else ensure(::mmap(pointer, size, PROT_NONE, MAP_FIXED | MAP_ANON | MAP_PRIVATE | c_map_noreserve, -1, 0) != reinterpret_cast(uptr{umax})); #endif @@ -368,7 +368,7 @@ namespace utils #endif } - void memory_reset(void* pointer, usz size, protection prot) + void memory_reset(void* pointer, usz size, protection prot, [[maybe_unused]] bool can_be_jit) { if (!size) { @@ -382,7 +382,7 @@ namespace utils const u64 ptr64 = reinterpret_cast(pointer); #if defined(__APPLE__) && defined(ARCH_ARM64) ensure(::munmap(pointer, size) != -1); - ensure(::mmap(pointer, size, +prot, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0) == pointer); + ensure(::mmap(pointer, size, +prot, MAP_ANON | MAP_PRIVATE | (can_be_jit ? MAP_JIT : 0), -1, 0) == pointer); #else ensure(::mmap(pointer, size, +prot, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0) != reinterpret_cast(uptr{umax})); #endif