aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ARMJIT.cpp14
-rw-r--r--src/ARMJIT_A64/ARMJIT_Compiler.cpp11
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;