mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-15 00:39:59 +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)
|
extern u32 ppu_lwarx(ppu_thread& ppu, u32 addr)
|
||||||
{
|
{
|
||||||
|
ppu.lr_64 = false;
|
||||||
return ppu_load_acquire_reservation<u32>(ppu, addr);
|
return ppu_load_acquire_reservation<u32>(ppu, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern u64 ppu_ldarx(ppu_thread& ppu, u32 addr)
|
extern u64 ppu_ldarx(ppu_thread& ppu, u32 addr)
|
||||||
{
|
{
|
||||||
|
ppu.lr_64 = true;
|
||||||
return ppu_load_acquire_reservation<u64>(ppu, addr);
|
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);
|
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)))
|
if (ppu.raddr != addr || ppu.rdata != data.load() || ppu.rtime != vm::reservation_acquire(addr, sizeof(u32)))
|
||||||
{
|
{
|
||||||
ppu.raddr = 0;
|
ppu.raddr = 0;
|
||||||
|
@ -135,6 +135,7 @@ public:
|
|||||||
u32 raddr{0}; // Reservation addr
|
u32 raddr{0}; // Reservation addr
|
||||||
u64 rtime{0};
|
u64 rtime{0};
|
||||||
u64 rdata{0}; // Reservation data
|
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)
|
atomic_t<u32> prio{0}; // Thread priority (0..3071)
|
||||||
const u32 stack_size; // Stack size
|
const u32 stack_size; // Stack size
|
||||||
|
Loading…
x
Reference in New Issue
Block a user