From ab1ceee16f029572d0856ec5f233b83dba921cc1 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 28 Jun 2021 18:42:08 +0200 Subject: [PATCH] JitArm64: Implement memcheck for lXX/stX without update --- Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp | 6 ++++++ Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp index db1f18759a..8dfcadcc09 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp @@ -15,6 +15,7 @@ #include "Common/Swap.h" #include "Core/HW/Memmap.h" +#include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/JitArm64/Jit.h" #include "Core/PowerPC/JitArm64/Jit_Util.h" #include "Core/PowerPC/JitArmCommon/BackPatch.h" @@ -120,6 +121,8 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode, AR if (!fastmem || do_farcode) { + const bool memcheck = jo.memcheck && !emitting_routine; + if (fastmem && do_farcode) { in_far_code = true; @@ -223,6 +226,9 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode, AR m_float_emit.ABI_PopRegisters(fprs_to_push, ARM64Reg::X30); ABI_PopRegisters(gprs_to_push); + + if (memcheck) + WriteConditionalExceptionExit(EXCEPTION_DSI, ARM64Reg::W0); } if (in_far_code) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp index 6fb5cad056..8398d1b677 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp @@ -306,7 +306,6 @@ void JitArm64::lXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITLoadStoreOff); - FALLBACK_IF(jo.memcheck); u32 a = inst.RA, b = inst.RB, d = inst.RD; s32 offset = inst.SIMM_16; @@ -378,6 +377,8 @@ void JitArm64::lXX(UGeckoInstruction inst) break; } + FALLBACK_IF(jo.memcheck && update); + SafeLoadToReg(d, update ? a : (a ? a : -1), offsetReg, flags, offset, update); } @@ -385,7 +386,6 @@ void JitArm64::stX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITLoadStoreOff); - FALLBACK_IF(jo.memcheck); u32 a = inst.RA, b = inst.RB, s = inst.RS; s32 offset = inst.SIMM_16; @@ -444,6 +444,8 @@ void JitArm64::stX(UGeckoInstruction inst) break; } + FALLBACK_IF(jo.memcheck && update); + SafeStoreFromReg(update ? a : (a ? a : -1), s, regOffset, flags, offset); if (update)