diff --git a/core/build.h b/core/build.h index c43c91d17..63f47c6df 100755 --- a/core/build.h +++ b/core/build.h @@ -183,9 +183,6 @@ #ifdef __SWITCH__ #define FEAT_NO_RWX_PAGES -// for now: -#define FEAT_AREC DYNAREC_NONE -#define FEAT_DSPREC DYNAREC_NONE #endif //defaults diff --git a/core/hw/aica/dsp_arm64.cpp b/core/hw/aica/dsp_arm64.cpp index efef4d2eb..8a9cbb177 100644 --- a/core/hw/aica/dsp_arm64.cpp +++ b/core/hw/aica/dsp_arm64.cpp @@ -29,6 +29,7 @@ using namespace vixl::aarch64; static u8 *pCodeBuffer; +static ptrdiff_t rx_offset; class DSPAssembler : public MacroAssembler { @@ -364,7 +365,7 @@ private: template void GenCallRuntime(R (*function)(P...)) { - ptrdiff_t offset = reinterpret_cast(function) - GetBuffer()->GetStartAddress(); + ptrdiff_t offset = reinterpret_cast(function) - GetBuffer()->GetStartAddress() - rx_offset; verify(offset >= -128 * 1024 * 1024 && offset <= 128 * 1024 * 1024); verify((offset & 3) == 0); Label function_label; @@ -453,12 +454,15 @@ void dsp_recompile() void dsp_rec_init() { - if (!vmem_platform_prepare_jit_block(dsp.DynCode, sizeof(dsp.DynCode), (void**)&pCodeBuffer)) - die("mprotect failed in arm64 dsp"); +#ifdef FEAT_NO_RWX_PAGES + verify(vmem_platform_prepare_jit_block(dsp.DynCode, sizeof(dsp.DynCode), (void**)&pCodeBuffer, (uintptr_t *)&rx_offset)); +#else + verify(vmem_platform_prepare_jit_block(dsp.DynCode, sizeof(dsp.DynCode), (void**)&pCodeBuffer)); +#endif } void dsp_rec_step() { - ((void (*)())pCodeBuffer)(); + ((void (*)())(pCodeBuffer + rx_offset))(); } #endif diff --git a/core/hw/arm7/arm7_rec.cpp b/core/hw/arm7/arm7_rec.cpp index 7ed64097f..14c866b0c 100644 --- a/core/hw/arm7/arm7_rec.cpp +++ b/core/hw/arm7/arm7_rec.cpp @@ -59,6 +59,8 @@ alignas(4096) static u8 ARM7_TCB[ICacheSize] __attribute__((section("__TEXT, .te #error ARM7_TCB ALLOC #endif +ptrdiff_t rx_offset; + #pragma pack(push,1) union ArmOpBits { @@ -654,8 +656,11 @@ void flush() void init() { - if (!vmem_platform_prepare_jit_block(ARM7_TCB, ICacheSize, (void**)&ICache)) - die("vmem_platform_prepare_jit_block failed"); +#ifdef FEAT_NO_RWX_PAGES + verify(vmem_platform_prepare_jit_block(ARM7_TCB, ICacheSize, (void**)&ICache, (uintptr_t *)&rx_offset)); +#else + verify(vmem_platform_prepare_jit_block(ARM7_TCB, ICacheSize, (void**)&ICache)); +#endif icPtr = ICache; diff --git a/core/hw/arm7/arm7_rec.h b/core/hw/arm7/arm7_rec.h index c94b45d72..9cdd96ba4 100644 --- a/core/hw/arm7/arm7_rec.h +++ b/core/hw/arm7/arm7_rec.h @@ -444,6 +444,14 @@ static inline void advance(u32 size) { icPtr += size; } +extern ptrdiff_t rx_offset; +static inline void *writeToExec(void * addr) { + return (char *)addr + rx_offset; +} +static inline void *execToWrite(void * addr) { + return (char *)addr - rx_offset; +} + } void arm7backend_compile(const std::vector& block_ops, u32 cycles); diff --git a/core/hw/arm7/arm7_rec_arm64.cpp b/core/hw/arm7/arm7_rec_arm64.cpp index f95f04b0c..d3ec0d484 100644 --- a/core/hw/arm7/arm7_rec_arm64.cpp +++ b/core/hw/arm7/arm7_rec_arm64.cpp @@ -30,7 +30,7 @@ using namespace vixl::aarch64; namespace aicaarm { -static void (*arm_dispatch)(); +static void (*arm_dispatch)(); // Not an executable address class Arm7Compiler; @@ -106,7 +106,7 @@ class Arm7Compiler : public MacroAssembler void call(void *loc) { - ptrdiff_t offset = reinterpret_cast(loc) - GetBuffer()->GetStartAddress(); + ptrdiff_t offset = reinterpret_cast(loc) - reinterpret_cast(recompiler::writeToExec(GetBuffer()->GetStartAddress())); Label function_label; BindToOffset(&function_label, offset); Bl(&function_label); @@ -637,12 +637,12 @@ public: Label arm_exit; // arm_compilecode: - arm_compilecode = GetCursorAddress(); + arm_compilecode = (void (*)())recompiler::writeToExec(GetCursorAddress()); call((void*)recompiler::compile); B(&arm_dispatch_label); // arm_mainloop(regs, entry points) - arm_mainloop = GetCursorAddress(); + arm_mainloop = (arm_mainloop_t)recompiler::writeToExec(GetCursorAddress()); Stp(x25, x26, MemOperand(sp, -96, AddrMode::PreIndex)); Stp(x27, x28, MemOperand(sp, 16)); Stp(x29, x30, MemOperand(sp, 32));