diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ARMJIT.cpp | 14 | ||||
-rw-r--r-- | src/ARMJIT_A64/ARMJIT_Compiler.cpp | 11 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp index 7e12385..c2375c2 100644 --- a/src/ARMJIT.cpp +++ b/src/ARMJIT.cpp @@ -25,6 +25,10 @@ #include "Wifi.h" #include "NDSCart.h" +#if defined(__APPLE__) && defined(__aarch64__) + #include <pthread.h> +#endif + #include "ARMJIT_x64/ARMJIT_Offsets.h" static_assert(offsetof(ARM, CPSR) == ARM_CPSR_offset, ""); static_assert(offsetof(ARM, Cycles) == ARM_Cycles_offset, ""); @@ -306,6 +310,9 @@ void DeInit() void Reset() { + #if defined(__APPLE__) && defined(__aarch64__) + pthread_jit_write_protect_np(false); + #endif ResetBlockCache(); ARMJIT_Memory::Reset(); @@ -884,8 +891,13 @@ void CompileBlock(ARM* cpu) block->StartAddrLocal = localAddr; FloodFillSetFlags(instrs, i - 1, 0xF); - + #if defined(__APPLE__) && defined(__aarch64__) + pthread_jit_write_protect_np(false); + #endif block->EntryPoint = JITCompiler->CompileBlock(cpu, thumb, instrs, i); + #if defined(__APPLE__) && defined(__aarch64__) + pthread_jit_write_protect_np(true); + #endif JIT_DEBUGPRINT("block start %p\n", block->EntryPoint); } diff --git a/src/ARMJIT_A64/ARMJIT_Compiler.cpp b/src/ARMJIT_A64/ARMJIT_Compiler.cpp index d681d6f..e57c75d 100644 --- a/src/ARMJIT_A64/ARMJIT_Compiler.cpp +++ b/src/ARMJIT_A64/ARMJIT_Compiler.cpp @@ -15,6 +15,10 @@ extern char __start__; #include <stdlib.h> +#ifdef __APPLE__ + #include <pthread.h> +#endif + using namespace Arm64Gen; extern "C" void ARM_Ret(); @@ -226,7 +230,12 @@ Compiler::Compiler() u64 pageSize = sysconf(_SC_PAGE_SIZE); u8* pageAligned = (u8*)(((u64)JitMem & ~(pageSize - 1)) + pageSize); u64 alignedSize = (((u64)JitMem + sizeof(JitMem)) & ~(pageSize - 1)) - (u64)pageAligned; - mprotect(pageAligned, alignedSize, PROT_EXEC | PROT_READ | PROT_WRITE); + #ifdef __APPLE__ + pageAligned = (u8*)mmap(NULL, 1024*1024*16, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_JIT,-1, 0); + pthread_jit_write_protect_np(false); + #else + mprotect(pageAligned, alignedSize, PROT_EXEC | PROT_READ | PROT_WRITE); + #endif SetCodeBase(pageAligned, pageAligned); JitMemMainSize = alignedSize; |