diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 5f9425fd41..21d33955e5 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -456,6 +456,10 @@ std::string ppu_thread::dump_regs() const fmt::append(ret, "XER = [CA=%u | OV=%u | SO=%u | CNT=%u]\n", xer.ca, xer.ov, xer.so, xer.cnt); fmt::append(ret, "VSCR = [SAT=%u | NJ=%u]\n", sat, nj); fmt::append(ret, "FPSCR = [FL=%u | FG=%u | FE=%u | FU=%u]\n", fpscr.fl, fpscr.fg, fpscr.fe, fpscr.fu); + if (const u32 addr = raddr) + fmt::append(ret, "Reservation Addr = 0x%x", addr); + else + fmt::append(ret, "Reservation Addr = none"); return ret; } @@ -666,6 +670,7 @@ void ppu_thread::cpu_task() void ppu_thread::cpu_sleep() { + raddr = 0; // Clear reservation vm::temporary_unlock(*this); lv2_obj::awake(this); } diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 8301f4fa92..eb39f4a1ef 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -1109,9 +1109,16 @@ void lv2_obj::sleep_unlocked(cpu_thread& thread, u64 timeout) } // Find and remove the thread - unqueue(g_ppu, ppu); + if (!unqueue(g_ppu, ppu)) + { + // Already sleeping + ppu_log.trace("sleep(): called on already sleeping thread."); + return; + } + unqueue(g_pending, ppu); + ppu->raddr = 0; // Clear reservation ppu->start_time = start_time; }