diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 21c1eade16..a33f973df8 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -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) // 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 old_lock = 0; @@ -4923,7 +4923,7 @@ bool spu_thread::reservation_check(u32 addr, u32 hash, atomic_t* range_ // Ensure data is allocated (HACK: would raise LR event if not) // 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 old_lock = 0; diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index b118ac8027..6181c2c6bb 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -547,6 +547,13 @@ namespace vm { 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 for (u64 hi = addr2 >> 16, max = (addr2 + size2 - 1) >> 16; hi <= max; hi++) {