From 1a2d599942479e53611c87a69b67bb8385e32838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 2 May 2023 21:52:43 +0200 Subject: [PATCH] JIT: Consider the block cache full a few block before it is, to allow space for proxy blocks. Should fix the following crash: Core/MIPS/JitCommon/JitBlockCache.cpp:190 JitBlock &b = blocks_[num_blocks_]; --- Core/MIPS/JitCommon/JitBlockCache.cpp | 5 +++-- Core/MIPS/JitCommon/JitBlockCache.h | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Core/MIPS/JitCommon/JitBlockCache.cpp b/Core/MIPS/JitCommon/JitBlockCache.cpp index a08f430ed4..1f0e2e0e29 100644 --- a/Core/MIPS/JitCommon/JitBlockCache.cpp +++ b/Core/MIPS/JitCommon/JitBlockCache.cpp @@ -76,7 +76,7 @@ static uint64_t HashJitBlock(const JitBlock &b) { } JitBlockCache::JitBlockCache(MIPSState *mipsState, CodeBlockCommon *codeBlock) : - codeBlock_(codeBlock), blocks_(nullptr), num_blocks_(0) { + codeBlock_(codeBlock) { } JitBlockCache::~JitBlockCache() { @@ -90,7 +90,8 @@ bool JitBlock::ContainsAddress(u32 em_address) { } bool JitBlockCache::IsFull() const { - return num_blocks_ >= MAX_NUM_BLOCKS - 1; + // -10 to safely leave space for some proxy blocks, which we don't check before we allocate (not ideal, but should work). + return num_blocks_ >= MAX_NUM_BLOCKS - 10; } void JitBlockCache::Init() { diff --git a/Core/MIPS/JitCommon/JitBlockCache.h b/Core/MIPS/JitCommon/JitBlockCache.h index 6fde09d915..71b7df9660 100644 --- a/Core/MIPS/JitCommon/JitBlockCache.h +++ b/Core/MIPS/JitCommon/JitBlockCache.h @@ -184,10 +184,10 @@ private: MIPSOpcode GetEmuHackOpForBlock(int block_num) const; CodeBlockCommon *codeBlock_; - JitBlock *blocks_; + JitBlock *blocks_ = nullptr; std::unordered_multimap proxyBlockMap_; - int num_blocks_; + int num_blocks_ = 0; std::unordered_multimap links_to_; std::map, u32> block_map_; // (end_addr, start_addr) -> number