From ce9024efc5ae34950f1427872a1e6052032c93d8 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 29 Aug 2024 02:55:10 +0300 Subject: [PATCH] Fix overlapping addresses returned by mmap --- Utilities/JITASM.cpp | 2 +- rpcs3/util/vm_native.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Utilities/JITASM.cpp b/Utilities/JITASM.cpp index 4253dc900c..785e25c97f 100644 --- a/Utilities/JITASM.cpp +++ b/Utilities/JITASM.cpp @@ -9,7 +9,7 @@ #include "util/v128.hpp" #include "util/simd.hpp" -#if defined(__linux__) || defined(__APPLE__) +#ifdef __linux__ #include #define CAN_OVERCOMMIT #endif diff --git a/rpcs3/util/vm_native.cpp b/rpcs3/util/vm_native.cpp index 0d566e3532..5be4b06d9b 100644 --- a/rpcs3/util/vm_native.cpp +++ b/rpcs3/util/vm_native.cpp @@ -260,7 +260,13 @@ namespace utils #ifdef __APPLE__ #ifdef ARCH_ARM64 - auto ptr = ::mmap(use_addr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE | MAP_JIT | c_map_noreserve, -1, 0); + // NOTE: On MacOS, parallel calls to mmap can return the same address more than once. Trying to madvise the same address twice throws EPERM. + static std::mutex mmap_lock; + void* ptr; + { + std::lock_guard lock(mmap_lock); + ptr = ::mmap(use_addr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE | MAP_JIT | c_map_noreserve, -1, 0); + } #else auto ptr = ::mmap(use_addr, size, PROT_NONE, MAP_ANON | MAP_PRIVATE | MAP_JIT | c_map_noreserve, -1, 0); #endif