SPU DMA: Fix PUTLLUC (TSX)

Prevent edge case of missing store.
This commit is contained in:
Nekotekina 2020-04-29 15:40:41 +03:00
parent f4f0fb88b1
commit 19acf260d8
2 changed files with 21 additions and 1 deletions

View File

@ -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);

View File

@ -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<decltype(rdata)>(addr), to_write);
vm::reservation_acquire(addr, 128) += 64;
}
}
else
{