From 5784ffc972e5ee87a9bdff93065d1b4ff2cede62 Mon Sep 17 00:00:00 2001 From: Eladash Date: Thu, 12 Aug 2021 21:58:18 +0300 Subject: [PATCH] Fixup PPU breakpoints --- rpcs3/Emu/Cell/PPUThread.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index e1b421d2a1..2785dd79ac 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -515,7 +515,7 @@ static bool ppu_break(ppu_thread& ppu, ppu_opcode_t) // Set or remove breakpoint extern bool ppu_breakpoint(u32 addr, bool is_adding) { - if (!vm::check_addr(addr, vm::page_executable) || g_cfg.core.ppu_decoder == ppu_decoder_type::llvm) + if (addr % 4 || !vm::check_addr(addr, vm::page_executable) || g_cfg.core.ppu_decoder == ppu_decoder_type::llvm) { return false; } @@ -544,13 +544,23 @@ extern bool ppu_breakpoint(u32 addr, bool is_adding) to_set = ppu_cache(addr); } + u64& _ref = ppu_ref(addr); + if (is_adding) { // Swap if adding std::swap(to_set, expected); + + const u64 _fall = reinterpret_cast(&ppu_fallback); + + if (_ref == _fall) + { + ppu_log.error("Unregistered instruction replaced with a breakpoint at 0x%08x", addr); + expected = _fall; + } } - return atomic_storage::compare_exchange(ppu_ref(addr), expected, to_set); + return atomic_storage::compare_exchange(_ref, expected, to_set); } extern bool ppu_patch(u32 addr, u32 value)