mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-06 07:12:28 +01:00
SPU: Exclude reservation_check address receptacle from writer_lock
This commit is contained in:
parent
ddecade935
commit
1250e428a7
|
|
@ -4842,7 +4842,7 @@ bool spu_thread::reservation_check(u32 addr, const decltype(rdata)& data) const
|
||||||
|
|
||||||
// Ensure data is allocated (HACK: would raise LR event if not)
|
// Ensure data is allocated (HACK: would raise LR event if not)
|
||||||
// Set range_lock first optimistically
|
// Set range_lock first optimistically
|
||||||
range_lock->store(u64{128} << 32 | addr);
|
range_lock->store(u64{128} << 32 | addr | vm::range_readable);
|
||||||
|
|
||||||
u64 lock_val = *std::prev(std::end(vm::g_range_lock_set));
|
u64 lock_val = *std::prev(std::end(vm::g_range_lock_set));
|
||||||
u64 old_lock = 0;
|
u64 old_lock = 0;
|
||||||
|
|
@ -4923,7 +4923,7 @@ bool spu_thread::reservation_check(u32 addr, u32 hash, atomic_t<u64, 64>* range_
|
||||||
|
|
||||||
// Ensure data is allocated (HACK: would raise LR event if not)
|
// Ensure data is allocated (HACK: would raise LR event if not)
|
||||||
// Set range_lock first optimistically
|
// Set range_lock first optimistically
|
||||||
range_lock->store(u64{128} << 32 | addr);
|
range_lock->store(u64{128} << 32 | addr | vm::range_readable);
|
||||||
|
|
||||||
u64 lock_val = *std::prev(std::end(vm::g_range_lock_set));
|
u64 lock_val = *std::prev(std::end(vm::g_range_lock_set));
|
||||||
u64 old_lock = 0;
|
u64 old_lock = 0;
|
||||||
|
|
|
||||||
|
|
@ -547,6 +547,13 @@ namespace vm
|
||||||
{
|
{
|
||||||
to_clear = for_all_range_locks(to_clear & ~get_range_lock_bits(true), [&](u64 addr2, u32 size2)
|
to_clear = for_all_range_locks(to_clear & ~get_range_lock_bits(true), [&](u64 addr2, u32 size2)
|
||||||
{
|
{
|
||||||
|
constexpr u32 range_size_loc = vm::range_pos - 32;
|
||||||
|
|
||||||
|
if ((size2 >> range_size_loc) == (vm::range_readable >> vm::range_pos))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Split and check every 64K page separately
|
// Split and check every 64K page separately
|
||||||
for (u64 hi = addr2 >> 16, max = (addr2 + size2 - 1) >> 16; hi <= max; hi++)
|
for (u64 hi = addr2 >> 16, max = (addr2 + size2 - 1) >> 16; hi <= max; hi++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue