diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 4c6b54f007..50fdca7643 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -2297,6 +2297,27 @@ void ppu_thread::cpu_on_stop() } } +void ppu_thread::cpu_wait(bs_t old) +{ + // Meanwhile while waiting, notify SPU waiters + if (u32 addr = res_notify) + { + res_notify = 0; + + if (res_notify_time == vm::reservation_notifier_count_index(addr).second) + { + vm::reservation_notifier_notify(addr); + } + } + + if (old != state) + { + return; + } + + state.wait(old); +} + void ppu_thread::exec_task() { if (g_cfg.core.ppu_decoder != ppu_decoder_type::_static) diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index 1b09a91e27..9f94ad50f6 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -150,6 +150,7 @@ public: virtual void cpu_task() override final; virtual void cpu_sleep() override; virtual void cpu_on_stop() override; + virtual void cpu_wait(bs_t old) override; virtual ~ppu_thread() override; SAVESTATE_INIT_POS(3); diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 30fba645dc..446d8d98a3 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -387,6 +387,9 @@ namespace vm ok = false; } + // Do some CPU work + cpu.cpu_wait(+cpu_flag::exit); + if (!ok || cpu.state & cpu_flag::memory) { for (u64 i = 0;; i++)