mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-11 15:40:51 +00:00
ppu: Fix extreme reservation corner case
This commit is contained in:
parent
efbd77deb4
commit
cd11ae5d8b
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user