diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 449aec7afd41..3f3a7ad6ae38 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -3899,7 +3899,23 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args) { if (raddr) { - vm::reservation_notifier_notify(addr); + if (raddr != spurs_addr || pc != 0x11e4) + { + vm::reservation_notifier_notify(addr); + } + else + { + const u32 thread_bit_mask = (1u << index); + constexpr usz SPU_IDLE = 0x73; + + const bool switched_from_running_to_idle = (static_cast(rdata[SPU_IDLE]) & thread_bit_mask) == 0 && (_ref(0x100 + SPU_IDLE) & thread_bit_mask) != 0; + + if (switched_from_running_to_idle) + { + vm::reservation_notifier_notify(addr); + } + } + raddr = 0; }