From d9750e8f9ff1ecefc6d3a227c6ee9bf652cba1ac Mon Sep 17 00:00:00 2001 From: Eladash Date: Fri, 5 Jun 2020 12:36:28 +0300 Subject: [PATCH] SPU/PPU reservations: Optimizations for reservation locks and check_state() (non-TSX) --- rpcs3/Emu/CPU/CPUThread.cpp | 46 +++++----- rpcs3/Emu/Cell/lv2/sys_cond.cpp | 12 +-- rpcs3/Emu/Cell/lv2/sys_event.cpp | 14 +-- rpcs3/Emu/Cell/lv2/sys_event_flag.cpp | 14 +-- rpcs3/Emu/Cell/lv2/sys_interrupt.cpp | 8 +- rpcs3/Emu/Cell/lv2/sys_lwcond.cpp | 10 +-- rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp | 12 +-- rpcs3/Emu/Cell/lv2/sys_memory.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_mmapper.cpp | 26 +++--- rpcs3/Emu/Cell/lv2/sys_mutex.cpp | 10 +-- rpcs3/Emu/Cell/lv2/sys_net.cpp | 54 ++++++------ rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp | 4 +- rpcs3/Emu/Cell/lv2/sys_process.cpp | 4 +- rpcs3/Emu/Cell/lv2/sys_rwlock.cpp | 16 ++-- rpcs3/Emu/Cell/lv2/sys_semaphore.cpp | 12 +-- rpcs3/Emu/Cell/lv2/sys_spu.cpp | 118 +++++++++++++------------- rpcs3/Emu/Cell/lv2/sys_sync.h | 1 + rpcs3/Emu/Cell/lv2/sys_timer.cpp | 18 ++-- rpcs3/Emu/Cell/lv2/sys_vm.cpp | 28 +++--- rpcs3/Emu/Memory/vm.cpp | 95 +++++++++++---------- 20 files changed, 251 insertions(+), 252 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 25f91e85f5..f4ee44b48b 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -464,14 +464,8 @@ bool cpu_thread::check_state() noexcept } bool cpu_sleep_called = false; - bool cpu_flag_memory = false; bool escape, retval; - if (!(state & cpu_flag::wait)) - { - state += cpu_flag::wait; - } - while (true) { // Process all flags in a single atomic op @@ -490,20 +484,20 @@ bool cpu_thread::check_state() noexcept if (!(flags & (cpu_flag::exit + cpu_flag::dbg_global_stop + cpu_flag::ret + cpu_flag::stop))) { // Check pause flags which hold thread inside check_state - if (flags & (cpu_flag::pause + cpu_flag::suspend + cpu_flag::dbg_global_pause + cpu_flag::dbg_pause)) + if (flags & (cpu_flag::pause + cpu_flag::suspend + cpu_flag::dbg_global_pause + cpu_flag::dbg_pause + cpu_flag::memory)) { + if (!(flags & cpu_flag::wait)) + { + flags += cpu_flag::wait; + store = true; + } + escape = false; return store; } - if (flags & cpu_flag::memory) + if (flags & cpu_flag::wait) { - // wait flag will be cleared later (optimization) - cpu_flag_memory = true; - } - else - { - AUDIT(!cpu_flag_memory); flags -= cpu_flag::wait; store = true; } @@ -512,7 +506,12 @@ bool cpu_thread::check_state() noexcept } else { - cpu_flag_memory = false; + if (!(flags & cpu_flag::wait)) + { + flags += cpu_flag::wait; + store = true; + } + retval = true; } @@ -529,17 +528,6 @@ bool cpu_thread::check_state() noexcept if (escape) { - if (cpu_flag_memory) - { - cpu_mem(); - - if (state & (cpu_flag::pause + cpu_flag::memory)) [[unlikely]] - { - state += cpu_flag::wait; - continue; - } - } - return retval; } else if (!cpu_sleep_called && state0 & cpu_flag::suspend) @@ -555,6 +543,12 @@ bool cpu_thread::check_state() noexcept } else { + if (state0 == (cpu_flag::memory + cpu_flag::wait)) + { + vm::passive_lock(*this); + continue; + } + // If only cpu_flag::pause was set, notification won't arrive g_fxo->get()->cpu_suspend_lock.lock_unlock(); } diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index 2107a70822..fc68b2e50b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -13,7 +13,7 @@ template<> DECLARE(ipc_manager::g_ipc) {}; error_code sys_cond_create(ppu_thread& ppu, vm::ptr cond_id, u32 mutex_id, vm::ptr attr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_cond.warning("sys_cond_create(cond_id=*0x%x, mutex_id=0x%x, attr=*0x%x)", cond_id, mutex_id, attr); @@ -46,7 +46,7 @@ error_code sys_cond_create(ppu_thread& ppu, vm::ptr cond_id, u32 mutex_id, error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_cond.warning("sys_cond_destroy(cond_id=0x%x)", cond_id); @@ -78,7 +78,7 @@ error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_cond.trace("sys_cond_signal(cond_id=0x%x)", cond_id); @@ -111,7 +111,7 @@ error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_cond.trace("sys_cond_signal_all(cond_id=0x%x)", cond_id); @@ -149,7 +149,7 @@ error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_cond.trace("sys_cond_signal_to(cond_id=0x%x, thread_id=0x%x)", cond_id, thread_id); @@ -201,7 +201,7 @@ error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id) error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_cond.trace("sys_cond_wait(cond_id=0x%x, timeout=%lld)", cond_id, timeout); diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index dea1ff1974..52a273548f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -161,7 +161,7 @@ error_code sys_event_queue_create(vm::ptr equeue_id, vm::ptr event_array, s32 size, vm::ptr number) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event.trace("sys_event_queue_tryreceive(equeue_id=0x%x, event_array=*0x%x, size=%d, number=*0x%x)", equeue_id, event_array, size, number); @@ -262,7 +262,7 @@ error_code sys_event_queue_tryreceive(ppu_thread& ppu, u32 equeue_id, vm::ptr dummy_event, u64 timeout) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event.trace("sys_event_queue_receive(equeue_id=0x%x, *0x%x, timeout=0x%llx)", equeue_id, dummy_event, timeout); @@ -346,7 +346,7 @@ error_code sys_event_queue_receive(ppu_thread& ppu, u32 equeue_id, vm::ptr eport_id, s32 port_type, u64 name) error_code sys_event_port_destroy(ppu_thread& ppu, u32 eport_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event.warning("sys_event_port_destroy(eport_id=0x%x)", eport_id); @@ -447,7 +447,7 @@ error_code sys_event_port_connect_local(u32 eport_id, u32 equeue_id) error_code sys_event_port_connect_ipc(ppu_thread& ppu, u32 eport_id, u64 ipc_key) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event.warning("sys_event_port_connect_ipc(eport_id=0x%x, ipc_key=0x%x)", eport_id, ipc_key); @@ -484,7 +484,7 @@ error_code sys_event_port_connect_ipc(ppu_thread& ppu, u32 eport_id, u64 ipc_key error_code sys_event_port_disconnect(ppu_thread& ppu, u32 eport_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event.warning("sys_event_port_disconnect(eport_id=0x%x)", eport_id); diff --git a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp index 07f57a7d78..3edec008fc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp @@ -15,7 +15,7 @@ template<> DECLARE(ipc_manager::g_ipc) {}; error_code sys_event_flag_create(ppu_thread& ppu, vm::ptr id, vm::ptr attr, u64 init) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event_flag.warning("sys_event_flag_create(id=*0x%x, attr=*0x%x, init=0x%llx)", id, attr, init); @@ -63,7 +63,7 @@ error_code sys_event_flag_create(ppu_thread& ppu, vm::ptr id, vm::ptr result, u64 timeout) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event_flag.trace("sys_event_flag_wait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x, timeout=0x%llx)", id, bitptn, mode, result, timeout); @@ -208,7 +208,7 @@ error_code sys_event_flag_wait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm error_code sys_event_flag_trywait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm::ptr result) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event_flag.trace("sys_event_flag_trywait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x)", id, bitptn, mode, result); @@ -335,7 +335,7 @@ error_code sys_event_flag_set(u32 id, u64 bitptn) error_code sys_event_flag_clear(ppu_thread& ppu, u32 id, u64 bitptn) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event_flag.trace("sys_event_flag_clear(id=0x%x, bitptn=0x%llx)", id, bitptn); @@ -354,7 +354,7 @@ error_code sys_event_flag_clear(ppu_thread& ppu, u32 id, u64 bitptn) error_code sys_event_flag_cancel(ppu_thread& ppu, u32 id, vm::ptr num) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event_flag.trace("sys_event_flag_cancel(id=0x%x, num=*0x%x)", id, num); @@ -406,7 +406,7 @@ error_code sys_event_flag_cancel(ppu_thread& ppu, u32 id, vm::ptr num) error_code sys_event_flag_get(ppu_thread& ppu, u32 id, vm::ptr flags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_event_flag.trace("sys_event_flag_get(id=0x%x, flags=*0x%x)", id, flags); diff --git a/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp b/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp index e17abbdbf3..4b1f9534b2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp @@ -44,7 +44,7 @@ void lv2_int_serv::join() error_code sys_interrupt_tag_destroy(ppu_thread& ppu, u32 intrtag) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_interrupt.warning("sys_interrupt_tag_destroy(intrtag=0x%x)", intrtag); @@ -73,7 +73,7 @@ error_code sys_interrupt_tag_destroy(ppu_thread& ppu, u32 intrtag) error_code _sys_interrupt_thread_establish(ppu_thread& ppu, vm::ptr ih, u32 intrtag, u32 intrthread, u64 arg1, u64 arg2) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_interrupt.warning("_sys_interrupt_thread_establish(ih=*0x%x, intrtag=0x%x, intrthread=0x%x, arg1=0x%llx, arg2=0x%llx)", ih, intrtag, intrthread, arg1, arg2); @@ -133,7 +133,7 @@ error_code _sys_interrupt_thread_establish(ppu_thread& ppu, vm::ptr ih, u32 error_code _sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih, vm::ptr r13) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_interrupt.warning("_sys_interrupt_thread_disestablish(ih=0x%x, r13=*0x%x)", ih, r13); @@ -163,7 +163,7 @@ error_code _sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih, vm::ptr lwcond_id, u32 lwmutex_id, vm::ptr control, u64 name) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwcond.warning(u8"_sys_lwcond_create(lwcond_id=*0x%x, lwmutex_id=0x%x, control=*0x%x, name=0x%llx (ā€œ%sā€))", lwcond_id, lwmutex_id, control, name, lv2_obj::name64(std::bit_cast>(name))); @@ -43,7 +43,7 @@ error_code _sys_lwcond_create(ppu_thread& ppu, vm::ptr lwcond_id, u32 lwmut error_code _sys_lwcond_destroy(ppu_thread& ppu, u32 lwcond_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwcond.warning("_sys_lwcond_destroy(lwcond_id=0x%x)", lwcond_id); @@ -72,7 +72,7 @@ error_code _sys_lwcond_destroy(ppu_thread& ppu, u32 lwcond_id) error_code _sys_lwcond_signal(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u32 ppu_thread_id, u32 mode) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwcond.trace("_sys_lwcond_signal(lwcond_id=0x%x, lwmutex_id=0x%x, ppu_thread_id=0x%x, mode=%d)", lwcond_id, lwmutex_id, ppu_thread_id, mode); @@ -197,7 +197,7 @@ error_code _sys_lwcond_signal(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u3 error_code _sys_lwcond_signal_all(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u32 mode) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwcond.trace("_sys_lwcond_signal_all(lwcond_id=0x%x, lwmutex_id=0x%x, mode=%d)", lwcond_id, lwmutex_id, mode); @@ -282,7 +282,7 @@ error_code _sys_lwcond_signal_all(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id error_code _sys_lwcond_queue_wait(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u64 timeout) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwcond.trace("_sys_lwcond_queue_wait(lwcond_id=0x%x, lwmutex_id=0x%x, timeout=0x%llx)", lwcond_id, lwmutex_id, timeout); diff --git a/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp b/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp index 8245582aac..cf8b3387f2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp @@ -10,7 +10,7 @@ LOG_CHANNEL(sys_lwmutex); error_code _sys_lwmutex_create(ppu_thread& ppu, vm::ptr lwmutex_id, u32 protocol, vm::ptr control, s32 has_name, u64 name) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwmutex.warning(u8"_sys_lwmutex_create(lwmutex_id=*0x%x, protocol=0x%x, control=*0x%x, has_name=0x%x, name=0x%llx (ā€œ%sā€))", lwmutex_id, protocol, control, has_name, name, lv2_obj::name64(std::bit_cast>(name))); @@ -36,7 +36,7 @@ error_code _sys_lwmutex_create(ppu_thread& ppu, vm::ptr lwmutex_id, u32 pro error_code _sys_lwmutex_destroy(ppu_thread& ppu, u32 lwmutex_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwmutex.warning("_sys_lwmutex_destroy(lwmutex_id=0x%x)", lwmutex_id); @@ -97,7 +97,7 @@ error_code _sys_lwmutex_destroy(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwmutex.trace("_sys_lwmutex_lock(lwmutex_id=0x%x, timeout=0x%llx)", lwmutex_id, timeout); @@ -192,7 +192,7 @@ error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout) error_code _sys_lwmutex_trylock(ppu_thread& ppu, u32 lwmutex_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwmutex.trace("_sys_lwmutex_trylock(lwmutex_id=0x%x)", lwmutex_id); @@ -227,7 +227,7 @@ error_code _sys_lwmutex_trylock(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_unlock(ppu_thread& ppu, u32 lwmutex_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwmutex.trace("_sys_lwmutex_unlock(lwmutex_id=0x%x)", lwmutex_id); @@ -254,7 +254,7 @@ error_code _sys_lwmutex_unlock(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_unlock2(ppu_thread& ppu, u32 lwmutex_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_lwmutex.warning("_sys_lwmutex_unlock2(lwmutex_id=0x%x)", lwmutex_id); diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index 6f2771f032..74a7bba526 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -3,6 +3,7 @@ #include "Utilities/VirtualMemory.h" #include "Emu/Memory/vm_locking.h" +#include "Emu/CPU/CPUThread.h" #include "Emu/IdManager.h" #include diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index a665a5ace6..84eb52b643 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -43,7 +43,7 @@ error_code create_lv2_shm(bool pshared, u64 ipc_key, u32 size, u32 align, u64 fl error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u64 alignment, vm::ptr alloc_addr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.error("sys_mmapper_allocate_address(size=0x%llx, flags=0x%llx, alignment=0x%llx, alloc_addr=*0x%x)", size, flags, alignment, alloc_addr); @@ -86,7 +86,7 @@ error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u6 error_code sys_mmapper_allocate_fixed_address(ppu_thread& ppu) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.error("sys_mmapper_allocate_fixed_address()"); @@ -100,7 +100,7 @@ error_code sys_mmapper_allocate_fixed_address(ppu_thread& ppu) error_code sys_mmapper_allocate_shared_memory(ppu_thread& ppu, u64 ipc_key, u32 size, u64 flags, vm::ptr mem_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.warning("sys_mmapper_allocate_shared_memory(ipc_key=0x%llx, size=0x%x, flags=0x%llx, mem_id=*0x%x)", ipc_key, size, flags, mem_id); @@ -157,7 +157,7 @@ error_code sys_mmapper_allocate_shared_memory(ppu_thread& ppu, u64 ipc_key, u32 error_code sys_mmapper_allocate_shared_memory_from_container(ppu_thread& ppu, u64 ipc_key, u32 size, u32 cid, u64 flags, vm::ptr mem_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.warning("sys_mmapper_allocate_shared_memory_from_container(ipc_key=0x%llx, size=0x%x, cid=0x%x, flags=0x%llx, mem_id=*0x%x)", ipc_key, size, cid, flags, mem_id); @@ -227,7 +227,7 @@ error_code sys_mmapper_allocate_shared_memory_from_container(ppu_thread& ppu, u6 error_code sys_mmapper_allocate_shared_memory_ext(ppu_thread& ppu, u64 ipc_key, u32 size, u32 flags, vm::ptr entries, s32 entry_count, vm::ptr mem_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.todo("sys_mmapper_allocate_shared_memory_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, entries, entry_count, mem_id); @@ -331,7 +331,7 @@ error_code sys_mmapper_allocate_shared_memory_ext(ppu_thread& ppu, u64 ipc_key, error_code sys_mmapper_allocate_shared_memory_from_container_ext(ppu_thread& ppu, u64 ipc_key, u32 size, u64 flags, u32 cid, vm::ptr entries, s32 entry_count, vm::ptr mem_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.todo("sys_mmapper_allocate_shared_memory_from_container_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, cid=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, cid, entries, entry_count, mem_id); @@ -443,7 +443,7 @@ error_code sys_mmapper_allocate_shared_memory_from_container_ext(ppu_thread& ppu error_code sys_mmapper_change_address_access_right(ppu_thread& ppu, u32 addr, u64 flags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.todo("sys_mmapper_change_address_access_right(addr=0x%x, flags=0x%llx)", addr, flags); @@ -452,7 +452,7 @@ error_code sys_mmapper_change_address_access_right(ppu_thread& ppu, u32 addr, u6 error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.error("sys_mmapper_free_address(addr=0x%x)", addr); @@ -509,7 +509,7 @@ error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr) error_code sys_mmapper_free_shared_memory(ppu_thread& ppu, u32 mem_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.warning("sys_mmapper_free_shared_memory(mem_id=0x%x)", mem_id); @@ -542,7 +542,7 @@ error_code sys_mmapper_free_shared_memory(ppu_thread& ppu, u32 mem_id) error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id, u64 flags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.warning("sys_mmapper_map_shared_memory(addr=0x%x, mem_id=0x%x, flags=0x%llx)", addr, mem_id, flags); @@ -592,7 +592,7 @@ error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id, error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_id, u64 flags, vm::ptr alloc_addr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.warning("sys_mmapper_search_and_map(start_addr=0x%x, mem_id=0x%x, flags=0x%llx, alloc_addr=*0x%x)", start_addr, mem_id, flags, alloc_addr); @@ -640,7 +640,7 @@ error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_i error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr mem_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mmapper.warning("sys_mmapper_unmap_shared_memory(addr=0x%x, mem_id=*0x%x)", addr, mem_id); @@ -689,7 +689,7 @@ error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr DECLARE(ipc_manager::g_ipc) {}; error_code sys_mutex_create(ppu_thread& ppu, vm::ptr mutex_id, vm::ptr attr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_mutex.warning("sys_mutex_create(mutex_id=*0x%x, attr=*0x%x)", mutex_id, attr); @@ -75,7 +75,7 @@ error_code sys_mutex_create(ppu_thread& ppu, vm::ptr mutex_id, vm::ptr addr, vm::ptr paddrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_accept(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); @@ -536,7 +536,7 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr addr, u32 addrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_bind(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen); @@ -611,7 +611,7 @@ error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, u32 addrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_connect(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen); @@ -803,7 +803,7 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_getpeername(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); @@ -868,7 +868,7 @@ error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_getsockname(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); @@ -919,7 +919,7 @@ error_code sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr optval, vm::ptr optlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=*0x%x)", s, level, optname, optval, optlen); @@ -1145,7 +1145,7 @@ error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam error_code sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_listen(s=%d, backlog=%d)", s, backlog); @@ -1181,7 +1181,7 @@ error_code sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog) error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 len, s32 flags, vm::ptr addr, vm::ptr paddrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_recvfrom(s=%d, buf=*0x%x, len=%u, flags=0x%x, addr=*0x%x, paddrlen=*0x%x)", s, buf, len, flags, addr, paddrlen); @@ -1386,7 +1386,7 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 error_code sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr msg, s32 flags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_bnet_recvmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags); return CELL_OK; @@ -1394,7 +1394,7 @@ error_code sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr error_code sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr msg, s32 flags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_bnet_sendmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags); return CELL_OK; @@ -1402,7 +1402,7 @@ error_code sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 len, s32 flags, vm::cptr addr, u32 addrlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_sendto(s=%d, buf=*0x%x, len=%u, flags=0x%x, addr=*0x%x, addrlen=%u)", s, buf, len, flags, addr, addrlen); @@ -1578,7 +1578,7 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 l error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::cptr optval, u32 optlen) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=%u)", s, level, optname, optval, optlen); @@ -1772,7 +1772,7 @@ error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_shutdown(s=%d, how=%d)", s, how); @@ -1818,7 +1818,7 @@ error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_socket(family=%d, type=%d, protocol=%d)", family, type, protocol); @@ -1873,7 +1873,7 @@ error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protoc error_code sys_net_bnet_close(ppu_thread& ppu, s32 s) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_close(s=%d)", s); @@ -1895,7 +1895,7 @@ error_code sys_net_bnet_close(ppu_thread& ppu, s32 s) error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 nfds, s32 ms) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_poll(fds=*0x%x, nfds=%d, ms=%d)", fds, nfds, ms); @@ -2076,7 +2076,7 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 n error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr readfds, vm::ptr writefds, vm::ptr exceptfds, vm::ptr _timeout) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.warning("sys_net_bnet_select(nfds=%d, readfds=*0x%x, writefds=*0x%x, exceptfds=*0x%x, timeout=*0x%x)", nfds, readfds, writefds, exceptfds, _timeout); @@ -2291,7 +2291,7 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr buf, s32 len, vm::ptr pflags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("_sys_net_read_dump(id=0x%x, buf=*0x%x, len=%d, pflags=*0x%x)", id, buf, len, pflags); return CELL_OK; @@ -2307,7 +2307,7 @@ error_code _sys_net_read_dump(ppu_thread& ppu, s32 id, vm::ptr buf, s32 le error_code _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr pflags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("_sys_net_close_dump(id=0x%x, pflags=*0x%x)", id, pflags); return CELL_OK; @@ -2315,7 +2315,7 @@ error_code _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr pflags) error_code _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr buf, s32 len, u32 unknown) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo(__func__); return CELL_OK; @@ -2323,7 +2323,7 @@ error_code _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr buf, s32 error_code sys_net_abort(ppu_thread& ppu, s32 type, u64 arg, s32 flags) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_abort(type=%d, arg=0x%x, flags=0x%x)", type, arg, flags); return CELL_OK; @@ -2338,7 +2338,7 @@ struct net_infoctl_cmd_9_t error_code sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr arg) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_infoctl(cmd=%d, arg=*0x%x)", cmd, arg); @@ -2379,7 +2379,7 @@ error_code sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr arg) error_code sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr arg3, s32 arg4) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_control(0x%x, %d, *0x%x, %d)", arg1, arg2, arg3, arg4); return CELL_OK; @@ -2387,7 +2387,7 @@ error_code sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr ar error_code sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_bnet_ioctl(%d, 0x%x, 0x%x)", arg1, arg2, arg3); return CELL_OK; @@ -2395,7 +2395,7 @@ error_code sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) error_code sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm::ptr arg4, u32 arg5, u32 arg6) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_bnet_sysctl(0x%x, 0x%x, 0x%x, *0x%x, 0x%x, 0x%x)", arg1, arg2, arg3, arg4, arg5, arg6); return CELL_OK; @@ -2403,7 +2403,7 @@ error_code sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm error_code sys_net_eurus_post_command(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_net.todo("sys_net_eurus_post_command(%d, 0x%x, 0x%x)", arg1, arg2, arg3); return CELL_OK; diff --git a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp index 2496a0e0f7..38c7424de5 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp @@ -35,7 +35,7 @@ struct ppu_thread_cleaner void _sys_ppu_thread_exit(ppu_thread& ppu, u64 errorcode) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; // Need to wait until the current writer finish if (ppu.state & cpu_flag::memory) vm::g_mutex.lock_unlock(); @@ -90,7 +90,7 @@ s32 sys_ppu_thread_yield(ppu_thread& ppu) error_code sys_ppu_thread_join(ppu_thread& ppu, u32 thread_id, vm::ptr vptr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_ppu_thread.trace("sys_ppu_thread_join(thread_id=0x%x, vptr=*0x%x)", thread_id, vptr); diff --git a/rpcs3/Emu/Cell/lv2/sys_process.cpp b/rpcs3/Emu/Cell/lv2/sys_process.cpp index 964d5b0165..9ae93bc78f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_process.cpp @@ -281,7 +281,7 @@ error_code sys_process_detach_child(u64 unk) void _sys_process_exit(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_process.warning("_sys_process_exit(status=%d, arg2=0x%x, arg3=0x%x)", status, arg2, arg3); @@ -339,7 +339,7 @@ void _sys_process_exit2(ppu_thread& ppu, s32 status, vm::ptr ar if (disc.empty() && !Emu.GetTitleID().empty()) disc = vfs::get(Emu.GetDir()); - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; Emu.CallAfter([path = std::move(path), argv = std::move(argv), envp = std::move(envp), data = std::move(data), disc = std::move(disc), hdd1 = std::move(hdd1), klic = g_fxo->get()->devKlic.load()]() mutable { diff --git a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp index bb1f8f2b19..df94e4a2c8 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp @@ -13,7 +13,7 @@ template<> DECLARE(ipc_manager::g_ipc) {}; error_code sys_rwlock_create(ppu_thread& ppu, vm::ptr rw_lock_id, vm::ptr attr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_rwlock.warning("sys_rwlock_create(rw_lock_id=*0x%x, attr=*0x%x)", rw_lock_id, attr); @@ -46,7 +46,7 @@ error_code sys_rwlock_create(ppu_thread& ppu, vm::ptr rw_lock_id, vm::ptr DECLARE(ipc_manager::g_ipc) {}; error_code sys_semaphore_create(ppu_thread& ppu, vm::ptr sem_id, vm::ptr attr, s32 initial_val, s32 max_val) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_semaphore.warning("sys_semaphore_create(sem_id=*0x%x, attr=*0x%x, initial_val=%d, max_val=%d)", sem_id, attr, initial_val, max_val); @@ -52,7 +52,7 @@ error_code sys_semaphore_create(ppu_thread& ppu, vm::ptr sem_id, vm::ptr count) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_semaphore.trace("sys_semaphore_get_value(sem_id=0x%x, count=*0x%x)", sem_id, count); diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index 5f88a36b94..e527a273f6 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -201,7 +201,7 @@ std::pair*, std::shared_ptr> lv2_spu_gro error_code sys_spu_initialize(ppu_thread& ppu, u32 max_usable_spu, u32 max_raw_spu) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_initialize(max_usable_spu=%d, max_raw_spu=%d)", max_usable_spu, max_raw_spu); @@ -215,7 +215,7 @@ error_code sys_spu_initialize(ppu_thread& ppu, u32 max_usable_spu, u32 max_raw_s error_code _sys_spu_image_get_information(ppu_thread& ppu, vm::ptr img, vm::ptr entry_point, vm::ptr nsegs) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("_sys_spu_image_get_information(img=*0x%x, entry_point=*0x%x, nsegs=*0x%x)", img, entry_point, nsegs); @@ -238,7 +238,7 @@ error_code _sys_spu_image_get_information(ppu_thread& ppu, vm::ptr img, vm::cptr path) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_image_open(img=*0x%x, path=%s)", img, path); @@ -263,7 +263,7 @@ error_code sys_spu_image_open(ppu_thread& ppu, vm::ptr img, vm::c error_code _sys_spu_image_import(ppu_thread& ppu, vm::ptr img, u32 src, u32 size, u32 arg4) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("_sys_spu_image_import(img=*0x%x, src=*0x%x, size=0x%x, arg4=0x%x)", img, src, size, arg4); @@ -273,7 +273,7 @@ error_code _sys_spu_image_import(ppu_thread& ppu, vm::ptr img, u3 error_code _sys_spu_image_close(ppu_thread& ppu, vm::ptr img) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("_sys_spu_image_close(img=*0x%x)", img); @@ -295,7 +295,7 @@ error_code _sys_spu_image_close(ppu_thread& ppu, vm::ptr img) error_code _sys_spu_image_get_segments(ppu_thread& ppu, vm::ptr img, vm::ptr segments, s32 nseg) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.error("_sys_spu_image_get_segments(img=*0x%x, segments=*0x%x, nseg=%d)", img, segments, nseg); @@ -318,7 +318,7 @@ error_code _sys_spu_image_get_segments(ppu_thread& ppu, vm::ptr i error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr thread, u32 group_id, u32 spu_num, vm::ptr img, vm::ptr attr, vm::ptr arg) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_initialize(thread=*0x%x, group=0x%x, spu_num=%d, img=*0x%x, attr=*0x%x, arg=*0x%x)", thread, group_id, spu_num, img, attr, arg); @@ -451,7 +451,7 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr thread, u32 g error_code sys_spu_thread_set_argument(ppu_thread& ppu, u32 id, vm::ptr arg) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_set_argument(id=0x%x, arg=*0x%x)", id, arg); @@ -471,7 +471,7 @@ error_code sys_spu_thread_set_argument(ppu_thread& ppu, u32 id, vm::ptr status) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_get_exit_status(id=0x%x, status=*0x%x)", id, status); @@ -495,7 +495,7 @@ error_code sys_spu_thread_get_exit_status(ppu_thread& ppu, u32 id, vm::ptr error_code sys_spu_thread_group_create(ppu_thread& ppu, vm::ptr id, u32 num, s32 prio, vm::ptr attr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_create(id=*0x%x, num=%d, prio=%d, attr=*0x%x)", id, num, prio, attr); @@ -641,7 +641,7 @@ error_code sys_spu_thread_group_create(ppu_thread& ppu, vm::ptr id, u32 num error_code sys_spu_thread_group_destroy(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_destroy(id=0x%x)", id); @@ -691,7 +691,7 @@ error_code sys_spu_thread_group_destroy(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_start(id=0x%x)", id); @@ -763,7 +763,7 @@ error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_suspend(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_suspend(id=0x%x)", id); @@ -846,7 +846,7 @@ error_code sys_spu_thread_group_suspend(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_resume(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_resume(id=0x%x)", id); @@ -913,7 +913,7 @@ error_code sys_spu_thread_group_resume(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_yield(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_yield(id=0x%x)", id); @@ -947,7 +947,7 @@ error_code sys_spu_thread_group_yield(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_terminate(ppu_thread& ppu, u32 id, s32 value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_terminate(id=0x%x, value=0x%x)", id, value); @@ -1033,7 +1033,7 @@ error_code sys_spu_thread_group_terminate(ppu_thread& ppu, u32 id, s32 value) error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr cause, vm::ptr status) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_join(id=0x%x, cause=*0x%x, status=*0x%x)", id, cause, status); @@ -1119,7 +1119,7 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr cause error_code sys_spu_thread_group_set_priority(ppu_thread& ppu, u32 id, s32 priority) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_set_priority(id=0x%x, priority=%d)", id, priority); @@ -1142,7 +1142,7 @@ error_code sys_spu_thread_group_set_priority(ppu_thread& ppu, u32 id, s32 priori error_code sys_spu_thread_group_get_priority(ppu_thread& ppu, u32 id, vm::ptr priority) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_group_get_priority(id=0x%x, priority=*0x%x)", id, priority); @@ -1167,7 +1167,7 @@ error_code sys_spu_thread_group_get_priority(ppu_thread& ppu, u32 id, vm::ptr info) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_syscall_253(id=0x%x, info=*0x%x)", id, info); @@ -1221,7 +1221,7 @@ error_code sys_spu_thread_group_syscall_253(ppu_thread& ppu, u32 id, vm::ptr value, u32 type) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_read_ls(id=0x%x, lsa=0x%05x, value=*0x%x, type=%d)", id, lsa, value, type); @@ -1307,7 +1307,7 @@ error_code sys_spu_thread_read_ls(ppu_thread& ppu, u32 id, u32 lsa, vm::ptr error_code sys_spu_thread_write_spu_mb(ppu_thread& ppu, u32 id, u32 value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_write_spu_mb(id=0x%x, value=0x%x)", id, value); @@ -1327,7 +1327,7 @@ error_code sys_spu_thread_write_spu_mb(ppu_thread& ppu, u32 id, u32 value) error_code sys_spu_thread_set_spu_cfg(ppu_thread& ppu, u32 id, u64 value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_set_spu_cfg(id=0x%x, value=0x%x)", id, value); @@ -1350,7 +1350,7 @@ error_code sys_spu_thread_set_spu_cfg(ppu_thread& ppu, u32 id, u64 value) error_code sys_spu_thread_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_get_spu_cfg(id=0x%x, value=*0x%x)", id, value); @@ -1368,7 +1368,7 @@ error_code sys_spu_thread_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr valu error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_spu_thread_write_snr(id=0x%x, number=%d, value=0x%x)", id, number, value); @@ -1391,7 +1391,7 @@ error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 val error_code sys_spu_thread_group_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_connect_event(id=0x%x, eq=0x%x, et=%d)", id, eq, et); @@ -1440,7 +1440,7 @@ error_code sys_spu_thread_group_connect_event(ppu_thread& ppu, u32 id, u32 eq, u error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_disconnect_event(id=0x%x, et=%d)", id, et); @@ -1476,7 +1476,7 @@ error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et error_code sys_spu_thread_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et, u8 spup) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_connect_event(id=0x%x, eq=0x%x, et=%d, spup=%d)", id, eq, et, spup); @@ -1510,7 +1510,7 @@ error_code sys_spu_thread_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et, error_code sys_spu_thread_disconnect_event(ppu_thread& ppu, u32 id, u32 et, u8 spup) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_disconnect_event(id=0x%x, et=%d, spup=%d)", id, et, spup); @@ -1543,7 +1543,7 @@ error_code sys_spu_thread_disconnect_event(ppu_thread& ppu, u32 id, u32 et, u8 s error_code sys_spu_thread_bind_queue(ppu_thread& ppu, u32 id, u32 spuq, u32 spuq_num) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_bind_queue(id=0x%x, spuq=0x%x, spuq_num=0x%x)", id, spuq, spuq_num); @@ -1597,7 +1597,7 @@ error_code sys_spu_thread_bind_queue(ppu_thread& ppu, u32 id, u32 spuq, u32 spuq error_code sys_spu_thread_unbind_queue(ppu_thread& ppu, u32 id, u32 spuq_num) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_unbind_queue(id=0x%x, spuq_num=0x%x)", id, spuq_num); @@ -1632,7 +1632,7 @@ error_code sys_spu_thread_unbind_queue(ppu_thread& ppu, u32 id, u32 spuq_num) error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 id, u32 eq, u64 req, vm::ptr spup) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_connect_event_all_threads(id=0x%x, eq=0x%x, req=0x%llx, spup=*0x%x)", id, eq, req, spup); @@ -1711,7 +1711,7 @@ error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 i error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u32 id, u8 spup) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_disconnect_event_all_threads(id=0x%x, spup=%d)", id, spup); @@ -1742,7 +1742,7 @@ error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u3 error_code sys_spu_thread_group_log(ppu_thread& ppu, s32 command, vm::ptr stat) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_group_log(command=0x%x, stat=*0x%x)", command, stat); @@ -1779,7 +1779,7 @@ error_code sys_spu_thread_group_log(ppu_thread& ppu, s32 command, vm::ptr s error_code sys_spu_thread_recover_page_fault(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_spu_thread_recover_page_fault(id=0x%x)", id); @@ -1795,7 +1795,7 @@ error_code sys_spu_thread_recover_page_fault(ppu_thread& ppu, u32 id) error_code sys_raw_spu_recover_page_fault(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_raw_spu_recover_page_fault(id=0x%x)", id); @@ -1811,7 +1811,7 @@ error_code sys_raw_spu_recover_page_fault(ppu_thread& ppu, u32 id) error_code sys_raw_spu_create(ppu_thread& ppu, vm::ptr id, vm::ptr attr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_raw_spu_create(id=*0x%x, attr=*0x%x)", id, attr); @@ -1844,7 +1844,7 @@ error_code sys_raw_spu_create(ppu_thread& ppu, vm::ptr id, vm::ptr at error_code sys_isolated_spu_create(ppu_thread& ppu, vm::ptr id, vm::ptr image, u64 arg1, u64 arg2, u64 arg3, u64 arg4) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_create(id=*0x%x, image=*0x%x, arg1=0x%llx, arg2=0x%llx, arg3=0x%llx, arg4=0x%llx)", id, image, arg1, arg2, arg3, arg4); @@ -1982,7 +1982,7 @@ error_code raw_spu_destroy(ppu_thread& ppu, u32 id) error_code sys_raw_spu_destroy(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_raw_spu_destroy(id=%d)", id); @@ -1991,7 +1991,7 @@ error_code sys_raw_spu_destroy(ppu_thread& ppu, u32 id) error_code sys_isolated_spu_destroy(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_destroy(id=%d)", id); @@ -2044,7 +2044,7 @@ error_code raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, vm:: error_code sys_raw_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_id, u32 hwthread, vm::ptr intrtag) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.warning("sys_raw_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag=*0x%x)", id, class_id, hwthread, intrtag); @@ -2053,7 +2053,7 @@ error_code sys_raw_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_i error_code sys_isolated_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_id, u32 hwthread, vm::ptr intrtag) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag=*0x%x)", id, class_id, hwthread, intrtag); @@ -2082,7 +2082,7 @@ error_code raw_spu_set_int_mask(u32 id, u32 class_id, u64 mask) error_code sys_raw_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 mask) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_set_int_mask(id=%d, class_id=%d, mask=0x%llx)", id, class_id, mask); @@ -2092,7 +2092,7 @@ error_code sys_raw_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 m error_code sys_isolated_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 mask) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_set_int_mask(id=%d, class_id=%d, mask=0x%llx)", id, class_id, mask); @@ -2121,7 +2121,7 @@ error_code raw_spu_set_int_stat(u32 id, u32 class_id, u64 stat) error_code sys_raw_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 stat) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_set_int_stat(id=%d, class_id=%d, stat=0x%llx)", id, class_id, stat); @@ -2130,7 +2130,7 @@ error_code sys_raw_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 s error_code sys_isolated_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 stat) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_set_int_stat(id=%d, class_id=%d, stat=0x%llx)", id, class_id, stat); @@ -2159,7 +2159,7 @@ error_code raw_spu_get_int_control(u32 id, u32 class_id, vm::ptr value, ato error_code sys_raw_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr mask) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_get_int_mask(id=%d, class_id=%d, mask=*0x%x)", id, class_id, mask); @@ -2168,7 +2168,7 @@ error_code sys_raw_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::p error_code sys_isolated_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr mask) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_isolated_spu_get_int_mask(id=%d, class_id=%d, mask=*0x%x)", id, class_id, mask); @@ -2177,7 +2177,7 @@ error_code sys_isolated_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, error_code sys_raw_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr stat) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_get_int_stat(id=%d, class_id=%d, stat=*0x%x)", id, class_id, stat); @@ -2186,7 +2186,7 @@ error_code sys_raw_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::p error_code sys_isolated_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr stat) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_get_int_stat(id=%d, class_id=%d, stat=*0x%x)", id, class_id, stat); @@ -2210,7 +2210,7 @@ error_code raw_spu_read_puint_mb(u32 id, vm::ptr value) error_code sys_raw_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_read_puint_mb(id=%d, value=*0x%x)", id, value); @@ -2219,7 +2219,7 @@ error_code sys_raw_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr value error_code sys_isolated_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_read_puint_mb(id=%d, value=*0x%x)", id, value); @@ -2248,7 +2248,7 @@ error_code raw_spu_set_spu_cfg(u32 id, u32 value) error_code sys_raw_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_set_spu_cfg(id=%d, value=0x%x)", id, value); @@ -2257,7 +2257,7 @@ error_code sys_raw_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value) error_code sys_isolated_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_set_spu_cfg(id=%d, value=0x%x)", id, value); @@ -2281,7 +2281,7 @@ error_code raw_spu_get_spu_cfg(u32 id, vm::ptr value) error_code sys_raw_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.trace("sys_raw_spu_get_spu_afg(id=%d, value=*0x%x)", id, value); @@ -2290,7 +2290,7 @@ error_code sys_raw_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr value) error_code sys_isolated_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr value) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_get_spu_afg(id=%d, value=*0x%x)", id, value); @@ -2299,7 +2299,7 @@ error_code sys_isolated_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr va error_code sys_isolated_spu_start(ppu_thread& ppu, u32 id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_spu.todo("sys_isolated_spu_start(id=%d)", id); diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index 43b7b952af..e3c4d682fe 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -162,6 +162,7 @@ public: static inline bool awake(cpu_thread* const thread, s32 prio = enqueue_cmd) { + vm::temporary_unlock(); std::lock_guard lock(g_mutex); return awake_unlocked(thread, prio); } diff --git a/rpcs3/Emu/Cell/lv2/sys_timer.cpp b/rpcs3/Emu/Cell/lv2/sys_timer.cpp index 59f97ff0fe..04b6223543 100644 --- a/rpcs3/Emu/Cell/lv2/sys_timer.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_timer.cpp @@ -61,7 +61,7 @@ void lv2_timer_context::operator()() error_code sys_timer_create(ppu_thread& ppu, vm::ptr timer_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_timer.warning("sys_timer_create(timer_id=*0x%x)", timer_id); @@ -76,7 +76,7 @@ error_code sys_timer_create(ppu_thread& ppu, vm::ptr timer_id) error_code sys_timer_destroy(ppu_thread& ppu, u32 timer_id) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_timer.warning("sys_timer_destroy(timer_id=0x%x)", timer_id); @@ -106,7 +106,7 @@ error_code sys_timer_destroy(ppu_thread& ppu, u32 timer_id) error_code sys_timer_get_information(ppu_thread& ppu, u32 timer_id, vm::ptr info) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_timer.trace("sys_timer_get_information(timer_id=0x%x, info=*0x%x)", timer_id, info); @@ -128,7 +128,7 @@ error_code sys_timer_get_information(ppu_thread& ppu, u32 timer_id, vm::ptr sys_timer_usleep()", sleep_time); @@ -292,7 +292,7 @@ error_code sys_timer_sleep(ppu_thread& ppu, u32 sleep_time) error_code sys_timer_usleep(ppu_thread& ppu, u64 sleep_time) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_timer.trace("sys_timer_usleep(sleep_time=0x%llx)", sleep_time); diff --git a/rpcs3/Emu/Cell/lv2/sys_vm.cpp b/rpcs3/Emu/Cell/lv2/sys_vm.cpp index df9106bc8a..64282ac614 100644 --- a/rpcs3/Emu/Cell/lv2/sys_vm.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_vm.cpp @@ -35,7 +35,7 @@ struct sys_vm_global_t error_code sys_vm_memory_map(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr addr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.error("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr); @@ -94,7 +94,7 @@ error_code sys_vm_memory_map(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 error_code sys_vm_memory_map_different(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr addr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_memory_map_different(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr); // TODO: if needed implement different way to map memory, unconfirmed. @@ -104,7 +104,7 @@ error_code sys_vm_memory_map_different(ppu_thread& ppu, u32 vsize, u32 psize, u3 error_code sys_vm_unmap(ppu_thread& ppu, u32 addr) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_unmap(addr=0x%x)", addr); @@ -135,7 +135,7 @@ error_code sys_vm_unmap(ppu_thread& ppu, u32 addr) error_code sys_vm_append_memory(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_append_memory(addr=0x%x, size=0x%x)", addr, size); @@ -175,7 +175,7 @@ error_code sys_vm_append_memory(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_return_memory(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_return_memory(addr=0x%x, size=0x%x)", addr, size); @@ -226,7 +226,7 @@ error_code sys_vm_return_memory(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_lock(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_lock(addr=0x%x, size=0x%x)", addr, size); @@ -247,7 +247,7 @@ error_code sys_vm_lock(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_unlock(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_unlock(addr=0x%x, size=0x%x)", addr, size); @@ -268,7 +268,7 @@ error_code sys_vm_unlock(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_touch(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_touch(addr=0x%x, size=0x%x)", addr, size); @@ -289,7 +289,7 @@ error_code sys_vm_touch(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_flush(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_flush(addr=0x%x, size=0x%x)", addr, size); @@ -310,7 +310,7 @@ error_code sys_vm_flush(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_invalidate(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_invalidate(addr=0x%x, size=0x%x)", addr, size); @@ -331,7 +331,7 @@ error_code sys_vm_invalidate(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_store(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_store(addr=0x%x, size=0x%x)", addr, size); @@ -352,7 +352,7 @@ error_code sys_vm_store(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_sync(ppu_thread& ppu, u32 addr, u32 size) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_sync(addr=0x%x, size=0x%x)", addr, size); @@ -373,7 +373,7 @@ error_code sys_vm_sync(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_test(ppu_thread& ppu, u32 addr, u32 size, vm::ptr result) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_test(addr=0x%x, size=0x%x, result=*0x%x)", addr, size, result); @@ -391,7 +391,7 @@ error_code sys_vm_test(ppu_thread& ppu, u32 addr, u32 size, vm::ptr result) error_code sys_vm_get_statistics(ppu_thread& ppu, u32 addr, vm::ptr stat) { - vm::temporary_unlock(ppu); + ppu.state += cpu_flag::wait; sys_vm.warning("sys_vm_get_statistics(addr=0x%x, stat=*0x%x)", addr, stat); diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 6b62b010de..9ee9bca926 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -86,7 +86,7 @@ namespace vm if (!g_locks[i] && g_locks[i].compare_and_swap_test(nullptr, _cpu)) { g_tls_locked = g_locks.data() + i; - return; + break; } if (++i == max) i = 0; @@ -137,47 +137,38 @@ namespace vm void passive_lock(cpu_thread& cpu) { - if (g_tls_locked && *g_tls_locked == &cpu) [[unlikely]] + if (!g_tls_locked || *g_tls_locked != &cpu) [[unlikely]] { - if (cpu.state & cpu_flag::wait) - { - while (true) - { - g_mutex.lock_unlock(); - cpu.state -= cpu_flag::wait + cpu_flag::memory; - - if (g_mutex.is_lockable()) [[likely]] - { - return; - } - - cpu.state += cpu_flag::wait; - } - } - - return; - } - - if (cpu.state & cpu_flag::memory) - { - cpu.state -= cpu_flag::memory + cpu_flag::wait; - } - - if (g_mutex.is_lockable()) [[likely]] - { - // Optimistic path (hope that mutex is not exclusively locked) _register_lock(&cpu); - if (g_mutex.is_lockable()) [[likely]] + if (cpu.state) [[likely]] + { + cpu.state -= cpu_flag::wait + cpu_flag::memory; + } + + if (g_mutex.is_lockable()) { return; } - passive_unlock(cpu); + cpu.state += cpu_flag::wait; } - ::reader_lock lock(g_mutex); - _register_lock(&cpu); + if (cpu.state & cpu_flag::wait) + { + while (true) + { + g_mutex.lock_unlock(); + cpu.state -= cpu_flag::wait + cpu_flag::memory; + + if (g_mutex.is_lockable()) [[likely]] + { + return; + } + + cpu.state += cpu_flag::wait; + } + } } atomic_t* range_lock(u32 addr, u32 end) @@ -284,7 +275,7 @@ namespace vm void temporary_unlock(cpu_thread& cpu) noexcept { - cpu.state += cpu_flag::wait; + if (!(cpu.state & cpu_flag::wait)) cpu.state += cpu_flag::wait; if (g_tls_locked && g_tls_locked->compare_and_swap_test(&cpu, nullptr)) { @@ -304,17 +295,23 @@ namespace vm { auto cpu = get_current_cpu_thread(); - if (!cpu || !g_tls_locked || !g_tls_locked->compare_and_swap_test(cpu, nullptr)) + if (cpu) { - cpu = nullptr; + if (!g_tls_locked || *g_tls_locked != cpu) + { + cpu = nullptr; + } + else + { + cpu->state += cpu_flag::wait; + } } g_mutex.lock_shared(); if (cpu) { - _register_lock(cpu); - cpu->state -= cpu_flag::memory; + cpu->state -= cpu_flag::memory + cpu_flag::wait; } } @@ -345,9 +342,16 @@ namespace vm { auto cpu = get_current_cpu_thread(); - if (!cpu || !g_tls_locked || !g_tls_locked->compare_and_swap_test(cpu, nullptr)) + if (cpu) { - cpu = nullptr; + if (!g_tls_locked || *g_tls_locked != cpu) + { + cpu = nullptr; + } + else + { + cpu->state += cpu_flag::wait; + } } g_mutex.lock(); @@ -356,7 +360,7 @@ namespace vm { for (auto lock = g_locks.cbegin(), end = lock + g_cfg.core.ppu_threads; lock != end; lock++) { - if (cpu_thread* ptr = *lock) + if (auto ptr = +*lock; ptr && !(ptr->state & cpu_flag::memory)) { ptr->state.test_and_set(cpu_flag::memory); } @@ -394,18 +398,17 @@ namespace vm for (auto lock = g_locks.cbegin(), end = lock + g_cfg.core.ppu_threads; lock != end; lock++) { - cpu_thread* ptr; - while ((ptr = *lock) && !(ptr->state & cpu_flag::wait)) + if (auto ptr = +*lock) { - _mm_pause(); + while (!(ptr->state & cpu_flag::wait)) + _mm_pause(); } } } if (cpu) { - _register_lock(cpu); - cpu->state -= cpu_flag::memory; + cpu->state -= cpu_flag::memory + cpu_flag::wait; } }