mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-24 14:49:53 -06:00
Fix the JIT Code Memory on ARM64 Macs (#916)
This commit is contained in:
@ -25,6 +25,10 @@
|
|||||||
#include "Wifi.h"
|
#include "Wifi.h"
|
||||||
#include "NDSCart.h"
|
#include "NDSCart.h"
|
||||||
|
|
||||||
|
#if defined(__APPLE__) && defined(__aarch64__)
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "ARMJIT_x64/ARMJIT_Offsets.h"
|
#include "ARMJIT_x64/ARMJIT_Offsets.h"
|
||||||
static_assert(offsetof(ARM, CPSR) == ARM_CPSR_offset, "");
|
static_assert(offsetof(ARM, CPSR) == ARM_CPSR_offset, "");
|
||||||
static_assert(offsetof(ARM, Cycles) == ARM_Cycles_offset, "");
|
static_assert(offsetof(ARM, Cycles) == ARM_Cycles_offset, "");
|
||||||
@ -306,6 +310,9 @@ void DeInit()
|
|||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
|
#if defined(__APPLE__) && defined(__aarch64__)
|
||||||
|
pthread_jit_write_protect_np(false);
|
||||||
|
#endif
|
||||||
ResetBlockCache();
|
ResetBlockCache();
|
||||||
|
|
||||||
ARMJIT_Memory::Reset();
|
ARMJIT_Memory::Reset();
|
||||||
@ -884,8 +891,13 @@ void CompileBlock(ARM* cpu)
|
|||||||
block->StartAddrLocal = localAddr;
|
block->StartAddrLocal = localAddr;
|
||||||
|
|
||||||
FloodFillSetFlags(instrs, i - 1, 0xF);
|
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);
|
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);
|
JIT_DEBUGPRINT("block start %p\n", block->EntryPoint);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,10 @@ extern char __start__;
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace Arm64Gen;
|
using namespace Arm64Gen;
|
||||||
|
|
||||||
extern "C" void ARM_Ret();
|
extern "C" void ARM_Ret();
|
||||||
@ -226,7 +230,12 @@ Compiler::Compiler()
|
|||||||
u64 pageSize = sysconf(_SC_PAGE_SIZE);
|
u64 pageSize = sysconf(_SC_PAGE_SIZE);
|
||||||
u8* pageAligned = (u8*)(((u64)JitMem & ~(pageSize - 1)) + pageSize);
|
u8* pageAligned = (u8*)(((u64)JitMem & ~(pageSize - 1)) + pageSize);
|
||||||
u64 alignedSize = (((u64)JitMem + sizeof(JitMem)) & ~(pageSize - 1)) - (u64)pageAligned;
|
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);
|
SetCodeBase(pageAligned, pageAligned);
|
||||||
JitMemMainSize = alignedSize;
|
JitMemMainSize = alignedSize;
|
||||||
|
Reference in New Issue
Block a user