From d9b7e8c25df4c9380818bb59869ff4e6016c7ca2 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 20 May 2021 20:34:16 +0100 Subject: [PATCH] Faster W^X policy for apple silicon macs --- src/virtual_memory.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/virtual_memory.cpp b/src/virtual_memory.cpp index 2f3ee39..262081a 100644 --- a/src/virtual_memory.cpp +++ b/src/virtual_memory.cpp @@ -35,6 +35,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #else #ifdef __APPLE__ #include +#include +# if defined(__aarch64__) && TARGET_OS_OSX +# define USE_PTHREAD_JIT_WP 1 +# include +# endif #endif #include #include @@ -109,9 +114,17 @@ void* allocMemoryPages(std::size_t bytes) { #else #define MEXTRA 0 #endif - mem = mmap(nullptr, bytes, PAGE_READWRITE | RESERVED_FLAGS, MAP_ANONYMOUS | MAP_PRIVATE | MEXTRA, -1, 0); + #ifdef USE_PTHREAD_JIT_WP + #define PEXTRA PROT_EXEC + #else + #define PEXTRA 0 + #endif + 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); +#endif #endif return mem; } @@ -129,11 +142,19 @@ 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); +#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); +#else pageProtect(ptr, bytes, PAGE_EXECUTE_READ); +#endif } void setPagesRWX(void* ptr, std::size_t bytes) {