diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 87173289a911..fe9bda767694 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -645,7 +645,10 @@ cpu_thread::suspend_all::suspend_all(cpu_thread* _this) noexcept for_all_cpu([](cpu_thread* cpu) { - cpu->state += cpu_flag::pause; + if (!(cpu->state & cpu_flag::pause)) + { + cpu->state += cpu_flag::pause; + } }); busy_wait(500); diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 88277c659430..1d3cf9c2611d 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1600,6 +1600,23 @@ void spu_thread::do_putlluc(const spu_mfc_cmd& args) vm::reservation_acquire(addr, 128) += 64; } } + else if (result == 0) + { + cpu_thread::suspend_all cpu_lock(this); + + while (vm::reservation_acquire(addr, 128).bts(6)) + { + busy_wait(100); + } + + while (vm::reservation_acquire(addr, 128) & 63) + { + busy_wait(100); + } + + mov_rdata(vm::_ref(addr), to_write); + vm::reservation_acquire(addr, 128) += 64; + } } else {