diff --git a/src/cpu.cpp b/src/cpu.cpp index f6421e3..b578d5d 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -69,9 +69,13 @@ namespace randomx { cpuid(info, 0x00000007); avx2_ = (info[1] & (1 << 5)) != 0; } -#elif defined(__aarch64__) && defined(HWCAP_AES) +#elif defined(__aarch64__) + #if defined(HWCAP_AES) long hwcaps = getauxval(AT_HWCAP); aes_ = (hwcaps & HWCAP_AES) != 0; + #elif defined(__APPLE__) + aes_ = true; + #endif #endif //TODO POWER8 AES } diff --git a/src/jit_compiler.hpp b/src/jit_compiler.hpp index 70ffedd..17fdad4 100644 --- a/src/jit_compiler.hpp +++ b/src/jit_compiler.hpp @@ -36,6 +36,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "jit_compiler_fallback.hpp" #endif -#if defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(__OpenBSD__) || defined(__NetBSD__) || (defined(__APPLE__) && defined(__aarch64__)) #define RANDOMX_FORCE_SECURE #endif 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) {