ppu: Fix extreme reservation corner case

This commit is contained in:
eladash 2018-09-12 22:39:00 +03:00 committed by Ivan
parent efbd77deb4
commit cd11ae5d8b
2 changed files with 5 additions and 0 deletions

View File

@ -1005,11 +1005,13 @@ static T ppu_load_acquire_reservation(ppu_thread& ppu, u32 addr)
extern u32 ppu_lwarx(ppu_thread& ppu, u32 addr)
{
ppu.lr_64 = false;
return ppu_load_acquire_reservation<u32>(ppu, addr);
}
extern u64 ppu_ldarx(ppu_thread& ppu, u32 addr)
{
ppu.lr_64 = true;
return ppu_load_acquire_reservation<u64>(ppu, addr);
}
@ -1064,6 +1066,8 @@ extern bool ppu_stwcx(ppu_thread& ppu, u32 addr, u32 reg_value)
{
atomic_be_t<u32>& data = vm::_ref<atomic_be_t<u32>>(addr);
if (UNLIKELY(ppu.lr_64)) ppu.rdata >>= 32;
if (ppu.raddr != addr || ppu.rdata != data.load() || ppu.rtime != vm::reservation_acquire(addr, sizeof(u32)))
{
ppu.raddr = 0;

View File

@ -135,6 +135,7 @@ public:
u32 raddr{0}; // Reservation addr
u64 rtime{0};
u64 rdata{0}; // Reservation data
bool lr_64{false}; // Reservation size (true for 64 bit, false for 32 bit)
atomic_t<u32> prio{0}; // Thread priority (0..3071)
const u32 stack_size; // Stack size