diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 6850908e54..d7df3552a6 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -484,16 +484,37 @@ void ppu_reservation_fallback(ppu_thread& ppu) } } -static std::unordered_map* s_ppu_toc; +struct ppu_toc_manager +{ + std::unordered_map toc_map; + + shared_mutex mutex; +}; static void ppu_check_toc(ppu_thread& ppu, ppu_opcode_t op, be_t* this_op, ppu_intrp_func* next_fn) { - // Compare TOC with expected value - const auto found = s_ppu_toc->find(ppu.cia); + ppu.cia = vm::get_addr(this_op); - if (ppu.gpr[2] != found->second) { - ppu_log.error("Unexpected TOC (0x%x, expected 0x%x)", ppu.gpr[2], found->second); + auto& toc_manager = g_fxo->get(); + + reader_lock lock(toc_manager.mutex); + + auto& ppu_toc = toc_manager.toc_map; + + const auto found = ppu_toc.find(ppu.cia); + + if (found != ppu_toc.end()) + { + const u32 toc = atomic_storage::load(found->second); + + // Compare TOC with expected value + if (toc != umax && ppu.gpr[2] != toc) + { + ppu_log.error("Unexpected TOC (0x%x, expected 0x%x)", ppu.gpr[2], toc); + atomic_storage::exchange(found->second, u32{umax}); + } + } } // Fallback to the interpreter function @@ -3385,13 +3406,6 @@ extern void ppu_initialize() } } -struct ppu_toc_manager -{ - std::unordered_map toc_map; - - shared_mutex mutex; -}; - bool ppu_initialize(const ppu_module& info, bool check_only) { if (g_cfg.core.ppu_decoder != ppu_decoder_type::llvm) @@ -3401,8 +3415,11 @@ bool ppu_initialize(const ppu_module& info, bool check_only) return false; } - // Temporarily - s_ppu_toc = &g_fxo->get().toc_map; + auto& toc_manager = g_fxo->get(); + + std::lock_guard lock(toc_manager.mutex); + + auto& ppu_toc = toc_manager.toc_map; for (const auto& func : info.funcs) { @@ -3413,7 +3430,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only) if (g_cfg.core.ppu_debug && func.size && func.toc != umax) { - s_ppu_toc->emplace(func.addr, func.toc); + ppu_toc.emplace(func.addr, func.toc); ppu_ref(func.addr) = &ppu_check_toc; } }