From c7973839fa94c7c7f1671261a76863447adbbeba Mon Sep 17 00:00:00 2001 From: Jethro Grassie Date: Fri, 12 Nov 2021 14:50:41 -0500 Subject: [PATCH 1/3] Fix apple-non-arm jit guard --- src/virtual_memory.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/virtual_memory.cpp b/src/virtual_memory.cpp index e3cc3c8..12694cc 100644 --- a/src/virtual_memory.cpp +++ b/src/virtual_memory.cpp @@ -36,9 +36,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef __APPLE__ #include #include -# ifdef TARGET_OS_OSX -# define USE_PTHREAD_JIT_WP 1 -# include +# if TARGET_OS_OSX +# if TARGET_CPU_ARM64 +# define USE_PTHREAD_JIT_WP 1 +# else +# undef USE_PTHREAD_JIT_WP +# endif +# include # endif #endif #include From 31b9b0f8fc8fcbbcf483ceb970cbeac1948cdad0 Mon Sep 17 00:00:00 2001 From: Jethro Grassie Date: Fri, 12 Nov 2021 20:07:36 -0500 Subject: [PATCH 2/3] Add runtime checks --- src/virtual_memory.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/virtual_memory.cpp b/src/virtual_memory.cpp index 12694cc..af2b696 100644 --- a/src/virtual_memory.cpp +++ b/src/virtual_memory.cpp @@ -36,12 +36,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef __APPLE__ #include #include +#include # if TARGET_OS_OSX -# if TARGET_CPU_ARM64 -# define USE_PTHREAD_JIT_WP 1 -# else -# undef USE_PTHREAD_JIT_WP -# endif +# define USE_PTHREAD_JIT_WP 1 # include # endif #endif @@ -118,8 +115,11 @@ void* allocMemoryPages(std::size_t bytes) { mem = mmap(nullptr, bytes, PAGE_READWRITE | RESERVED_FLAGS | PEXTRA, MAP_ANONYMOUS | MAP_PRIVATE | MEXTRA, -1, 0); if (mem == MAP_FAILED) throw std::runtime_error("allocMemoryPages - mmap failed"); -#ifdef USE_PTHREAD_JIT_WP - pthread_jit_write_protect_np(false); +#if defined(USE_PTHREAD_JIT_WP) && defined(MAC_OS_VERSION_11_0) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0 + if (__builtin_available(macOS 11.0, *)) { + pthread_jit_write_protect_np(false); + } #endif #endif return mem; @@ -138,16 +138,22 @@ static inline void pageProtect(void* ptr, std::size_t bytes, int rules) { } void setPagesRW(void* ptr, std::size_t bytes) { -#ifdef USE_PTHREAD_JIT_WP - pthread_jit_write_protect_np(false); +#if defined(USE_PTHREAD_JIT_WP) && defined(MAC_OS_VERSION_11_0) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0 + if (__builtin_available(macOS 11.0, *)) { + pthread_jit_write_protect_np(false); + } #else pageProtect(ptr, bytes, PAGE_READWRITE); #endif } void setPagesRX(void* ptr, std::size_t bytes) { -#ifdef USE_PTHREAD_JIT_WP - pthread_jit_write_protect_np(true); +#if defined(USE_PTHREAD_JIT_WP) && defined(MAC_OS_VERSION_11_0) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0 + if (__builtin_available(macOS 11.0, *)) { + pthread_jit_write_protect_np(true); + } #else pageProtect(ptr, bytes, PAGE_EXECUTE_READ); #endif From 4d8ef87936f90fdb45c0e052708f770083cdca7c Mon Sep 17 00:00:00 2001 From: Jethro Grassie Date: Sat, 13 Nov 2021 08:53:57 -0500 Subject: [PATCH 3/3] pageProtect when missing pthread_jit_write_protect_np --- src/virtual_memory.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/virtual_memory.cpp b/src/virtual_memory.cpp index af2b696..caf0292 100644 --- a/src/virtual_memory.cpp +++ b/src/virtual_memory.cpp @@ -142,6 +142,8 @@ void setPagesRW(void* ptr, std::size_t bytes) { && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0 if (__builtin_available(macOS 11.0, *)) { pthread_jit_write_protect_np(false); + } else { + pageProtect(ptr, bytes, PAGE_READWRITE); } #else pageProtect(ptr, bytes, PAGE_READWRITE); @@ -153,6 +155,8 @@ void setPagesRX(void* ptr, std::size_t bytes) { && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0 if (__builtin_available(macOS 11.0, *)) { pthread_jit_write_protect_np(true); + } else { + pageProtect(ptr, bytes, PAGE_EXECUTE_READ); } #else pageProtect(ptr, bytes, PAGE_EXECUTE_READ);