diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index a5992c1dc2..d938409341 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -26,8 +26,8 @@ void spu_recompiler_base::enter(SPUThread& spu) // Search if cached data matches auto func_ptr = spu.compiled_cache[spu.pc / 4]; - // func.contents is there only as a temporary test, to see if SPU code not getting invalidated is the reason for the crashes - if (func_ptr && func_ptr->dirty_bit) + // Dirty bit check commented out until another code invalidation is found - SYNC, SYNCC, DSYNC and DMAs aren't covering everything + if (func_ptr/* && func_ptr->dirty_bit*/) { auto & func = *func_ptr; func.dirty_bit = false; diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 5fae3fc65e..84aa1d95dd 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -688,31 +688,33 @@ void SPUThread::process_mfc_cmd() bool result = false; // Check for fast exit in the beginning as well - vm::writer_lock lock(vm::try_to_lock); - - if (lock.locked || memcmp(rdata.data(), data.data(), rdata.size() * sizeof(rdata[0])) == 0) { - if (raddr == ch_mfc_cmd.eal && rtime == vm::reservation_acquire(raddr, 128)) + if (raddr == ch_mfc_cmd.eal && rtime == vm::reservation_acquire(raddr, 128) && rdata == data) + { + // TODO: vm::check_addr + if (s_use_rtm && utils::transaction_enter()) { - // TODO: vm::check_addr - if (s_use_rtm && utils::transaction_enter()) + if (!vm::reader_lock{ vm::try_to_lock }) { - if (!lock.locked && !vm::reader_lock{ vm::try_to_lock }) - { - _xabort(0); - } - - if (rtime == vm::reservation_acquire(raddr, 128) && rdata == data) - { - data = to_write; - result = true; - - vm::reservation_update(raddr, 128); - vm::notify(raddr, 128); - } - - _xend(); + _xabort(0); } - else if (lock.locked) + + if (rtime == vm::reservation_acquire(raddr, 128) && rdata == data) + { + data = to_write; + result = true; + + vm::reservation_update(raddr, 128); + vm::notify(raddr, 128); + } + + _xend(); + } + else + { + // TODO maybe timeout and check if the lock is still needed in long waits (If rtime changes, no use) + vm::writer_lock lock; + + if (rtime == vm::reservation_acquire(raddr, 128)) { data = to_write; vm::reservation_update(raddr, 128); @@ -721,21 +723,6 @@ void SPUThread::process_mfc_cmd() result = true; vm::notify(raddr, 128); } - else - { - // TODO maybe timeout and check if the lock is still needed in long waits (If rtime changes, no use) - vm::writer_lock lock(0); - - if (rtime == vm::reservation_acquire(raddr, 128)) - { - data = to_write; - vm::reservation_update(raddr, 128); - lock.unlock(); - - result = true; - vm::notify(raddr, 128); - } - } } } diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index 008d0ef489..b93ca7c5a0 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -42,7 +42,6 @@ namespace vm { named_thread* owner; u32 addr; - bool inserted = false; u64 stamp; const void* data; static const u32 size = 128; // Always 128 currently