Alternative secure JIT for macOS.

This commit is contained in:
XMRig 2020-12-12 21:32:36 +07:00
parent 775867fc3e
commit 179f09081f
No known key found for this signature in database
GPG key ID: 446A53638BE94409
3 changed files with 30 additions and 9 deletions

View file

@ -30,6 +30,7 @@
#ifdef XMRIG_OS_APPLE
# include <libkern/OSCacheControl.h>
# include <mach/vm_statistics.h>
# include <pthread.h>
# include <TargetConditionals.h>
# ifdef XMRIG_OS_MACOS
# define MEXTRA MAP_JIT
@ -74,7 +75,12 @@ bool xmrig::VirtualMemory::isOneGbPagesAvailable()
bool xmrig::VirtualMemory::protectRW(void *p, size_t size)
{
# if defined(XMRIG_OS_APPLE) && defined(XMRIG_ARM)
pthread_jit_write_protect_np(false);
return true;
# else
return mprotect(p, size, PROT_READ | PROT_WRITE) == 0;
# endif
}
@ -86,14 +92,21 @@ bool xmrig::VirtualMemory::protectRWX(void *p, size_t size)
bool xmrig::VirtualMemory::protectRX(void *p, size_t size)
{
# if defined(XMRIG_OS_APPLE) && defined(XMRIG_ARM)
pthread_jit_write_protect_np(true);
flushInstructionCache(p, size);
return true;
# else
return mprotect(p, size, PROT_READ | PROT_EXEC) == 0;
# endif
}
void *xmrig::VirtualMemory::allocateExecutableMemory(size_t size, bool hugePages)
{
# if defined(__APPLE__)
void *mem = mmap(0, size, PROT_READ | PROT_WRITE | SECURE_PROT_EXEC, MAP_PRIVATE | MAP_ANON | MEXTRA, -1, 0);
# if defined(XMRIG_OS_APPLE)
void *mem = mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON | MEXTRA, -1, 0);
pthread_jit_write_protect_np(false);
# elif defined(__FreeBSD__)
void *mem = nullptr;