From f88bf8bbff9c897370f4e9327373a60d49588982 Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 14 Mar 2013 14:40:01 +1000 Subject: [PATCH] Attempt at fixing JIT on iOS. Can only have PROT_WRITE or PROT_EXEC enabled. So toggle between them as needed. --- Common/ArmEmitter.cpp | 3 +-- Common/ArmEmitter.h | 6 +++++- Common/MemoryUtil.cpp | 2 +- Core/MIPS/ARM/ArmJit.cpp | 13 +++++++++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index e2f55ccb74..00cf93de3f 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -236,8 +236,7 @@ void ARMXEmitter::FlushIcacheSection(u8 *start, u8 *end) #elif defined(BLACKBERRY) msync(start, end - start, MS_SYNC | MS_INVALIDATE_ICACHE); #elif defined(IOS) - if (start != NULL) - sys_cache_control(kCacheFunctionPrepareForExecution, start, end - start); + sys_cache_control(kCacheFunctionPrepareForExecution, start, end - start); #elif !defined(_WIN32) __builtin___clear_cache(start, end); #endif diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 9fbe8c5d4d..a31e1753a2 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -611,7 +611,11 @@ public: // Start over if you need to change the code (call FreeCodeSpace(), AllocCodeSpace()). void WriteProtect() { - WriteProtectMemory(region, region_size, true); + WriteProtectMemory(region, region_size, true); + } + void UnWriteProtect() + { + UnWriteProtectMemory(region, region_size, false); } void ResetCodePtr() diff --git a/Common/MemoryUtil.cpp b/Common/MemoryUtil.cpp index a7119b307c..d474ed633e 100644 --- a/Common/MemoryUtil.cpp +++ b/Common/MemoryUtil.cpp @@ -86,7 +86,7 @@ void* AllocateExecutableMemory(size_t size, bool low) if (low && (!map_hint)) map_hint = (char*)round_page(512*1024*1024); /* 0.5 GB rounded up to the next page */ #endif - void* ptr = mmap(map_hint, size, PROT_READ | PROT_WRITE | PROT_EXEC, + void* ptr = mmap(map_hint, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE #if defined(__x86_64__) && defined(MAP_32BIT) | (low ? MAP_32BIT : 0) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index f2e57473b9..63919f8906 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -62,7 +62,13 @@ Jit::Jit(MIPSState *mips) : blocks(mips), gpr(mips), fpr(mips), mips_(mips) gpr.SetEmitter(this); fpr.SetEmitter(this); AllocCodeSpace(1024 * 1024 * 16); // 32MB is the absolute max because that's what an ARM branch instruction can reach, backwards and forwards. +#ifdef IOS + UnWriteProtect(); +#endif GenerateFixedCode(); +#ifdef IOS + WriteProtect(); +#endif js.startDefaultPrefix = true; } @@ -201,6 +207,10 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) js.inDelaySlot = false; js.PrefixStart(); +#ifdef IOS + UnWriteProtect(); +#endif + // We add a check before the block, used when entering from a linked block. b->checkedEntry = GetCodePtr(); // Downcount flag check. The last block decremented downcounter, and the flag should still be available. @@ -255,6 +265,9 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) } } #endif +#ifdef IOS + WriteProtect(); +#endif b->codeSize = GetCodePtr() - b->normalEntry;