From ffef0c2e383613496b1afcc1aaa2ab36e7346a16 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 1 Jan 2025 14:10:55 +1000 Subject: [PATCH] CPU/CodeCache: Don't compile invalid jumps via block links --- src/core/cpu_code_cache.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/cpu_code_cache.cpp b/src/core/cpu_code_cache.cpp index dcd8c68e3..f85c6f62b 100644 --- a/src/core/cpu_code_cache.cpp +++ b/src/core/cpu_code_cache.cpp @@ -61,6 +61,7 @@ static void ClearBlocks(); static Block* LookupBlock(u32 pc); static Block* CreateBlock(u32 pc, const BlockInstructionList& instructions, const BlockMetadata& metadata); +static bool HasBlockLUT(u32 pc); static bool IsBlockCodeCurrent(const Block* block); static bool RevalidateBlock(Block* block); static PageProtectionMode GetProtectionModeForPC(u32 pc); @@ -362,6 +363,12 @@ CPU::CodeCache::Block* CPU::CodeCache::LookupBlock(u32 pc) return s_block_lut[table][idx]; } +bool CPU::CodeCache::HasBlockLUT(u32 pc) +{ + const u32 table = pc >> LUT_TABLE_SHIFT; + return (s_block_lut[table] != nullptr); +} + CPU::CodeCache::Block* CPU::CodeCache::CreateBlock(u32 pc, const BlockInstructionList& instructions, const BlockMetadata& metadata) { @@ -1372,7 +1379,7 @@ const void* CPU::CodeCache::CreateBlockLink(Block* block, void* code, u32 newpc) } else { - dst = g_compile_or_revalidate_block; + dst = HasBlockLUT(newpc) ? g_compile_or_revalidate_block : g_interpret_block; } BlockLinkMap::iterator iter = s_block_links.emplace(newpc, code);