From 6c03fc4f01f3a6b44b4ae1a216f95ee23afd4785 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 17 Mar 2015 23:50:20 -0700 Subject: [PATCH] Correct savestate interaction with proxy blocks. At least, I think that's what's going wrong here. Either way, this is safer and apparently fixes #7612. --- Core/MIPS/JitCommon/JitBlockCache.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Core/MIPS/JitCommon/JitBlockCache.cpp b/Core/MIPS/JitCommon/JitBlockCache.cpp index 0843209e9..4ada7104c 100644 --- a/Core/MIPS/JitCommon/JitBlockCache.cpp +++ b/Core/MIPS/JitCommon/JitBlockCache.cpp @@ -75,7 +75,6 @@ using namespace Gen; #endif const u32 INVALID_EXIT = 0xFFFFFFFF; -const MIPSOpcode INVALID_ORIGINAL_OP = MIPSOpcode(0x00000001); JitBlockCache::JitBlockCache(MIPSState *mips, NativeCodeBlock *codeBlock) : mips_(mips), codeBlock_(codeBlock), blocks_(0), num_blocks_(0) { @@ -483,12 +482,13 @@ std::vector JitBlockCache::SaveAndClearEmuHackOps() { continue; const u32 emuhack = GetEmuHackOpForBlock(block_num).encoding; - result[block_num] = emuhack; - // The goal here is to prevent restoring it if it did not match (in case originalFirstOpcode does match.) - if (Memory::ReadUnchecked_U32(b.originalAddress) != emuhack) - b.originalFirstOpcode = INVALID_ORIGINAL_OP; - else + if (Memory::ReadUnchecked_U32(b.originalAddress) == emuhack) + { + result[block_num] = emuhack; Memory::Write_Opcode_JIT(b.originalAddress, b.originalFirstOpcode); + } + else + result[block_num] = 0; } return result; @@ -502,7 +502,7 @@ void JitBlockCache::RestoreSavedEmuHackOps(std::vector saved) { for (int block_num = 0; block_num < num_blocks_; ++block_num) { const JitBlock &b = blocks_[block_num]; - if (b.invalid) + if (b.invalid || saved[block_num] == 0) continue; // Only if we restored it, write it back.