diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp index a33436371e..9b8292db27 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp @@ -1140,7 +1140,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr spurs, u32 revision, const auto lwCond = spurs.ptr(&CellSpurs::cond); // Create a mutex to protect access to SPURS handler thread data - if (s32 rc = sys_lwmutex_create(lwMutex, vm::make_var(sys_lwmutex_attribute_t{ SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, "_spuPrv" }))) + if (s32 rc = sys_lwmutex_create(ppu, lwMutex, vm::make_var(sys_lwmutex_attribute_t{ SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, "_spuPrv" }))) { _spurs::finalize_spu(ppu, spurs); return rollback(), rc; diff --git a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h index 5d892ef303..d14dbcb09d 100644 --- a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h +++ b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h @@ -18,7 +18,7 @@ vm::ptr _sys_memset(vm::ptr dst, s32 value, u32 size); struct sys_lwmutex_t; struct sys_lwmutex_attribute_t; -error_code sys_lwmutex_create(vm::ptr lwmutex, vm::ptr attr); +error_code sys_lwmutex_create(ppu_thread& ppu, vm::ptr lwmutex, vm::ptr attr); error_code sys_lwmutex_lock(ppu_thread& CPU, vm::ptr lwmutex, u64 timeout); error_code sys_lwmutex_trylock(ppu_thread& CPU, vm::ptr lwmutex); error_code sys_lwmutex_unlock(ppu_thread& CPU, vm::ptr lwmutex); diff --git a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp index 633263e482..29789a2a95 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp @@ -10,7 +10,7 @@ extern logs::channel sysPrxForUser; -error_code sys_lwmutex_create(vm::ptr lwmutex, vm::ptr attr) +error_code sys_lwmutex_create(ppu_thread& ppu, vm::ptr lwmutex, vm::ptr attr) { sysPrxForUser.trace("sys_lwmutex_create(lwmutex=*0x%x, attr=*0x%x)", lwmutex, attr); @@ -42,7 +42,7 @@ error_code sys_lwmutex_create(vm::ptr lwmutex, vm::ptrflags = 0; attrs->name_u64 = attr->name_u64; - if (error_code res = g_cfg.core.hle_lwmutex ? sys_mutex_create(out_id, attrs) : _sys_lwmutex_create(out_id, protocol, lwmutex, 0x80000001, attr->name_u64)) + if (error_code res = g_cfg.core.hle_lwmutex ? sys_mutex_create(ppu, out_id, attrs) : _sys_lwmutex_create(out_id, protocol, lwmutex, 0x80000001, attr->name_u64)) { return res; } @@ -60,7 +60,7 @@ error_code sys_lwmutex_destroy(ppu_thread& ppu, vm::ptr lwmutex) if (g_cfg.core.hle_lwmutex) { - return sys_mutex_destroy(lwmutex->sleep_queue); + return sys_mutex_destroy(ppu, lwmutex->sleep_queue); } // check to prevent recursive locking in the next call diff --git a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp index db0d7e762c..f97d324d62 100644 --- a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp @@ -88,7 +88,7 @@ s32 sys_mempool_create(ppu_thread& ppu, vm::ptr mempool, vm::ptr< attr->flags = 0; // Also no idea what this is. strcpy_trunc(attr->name, "mp_m" + std::to_string(*mempool)); - error_code ret = sys_mutex_create(mutexid, attr); + error_code ret = sys_mutex_create(ppu, mutexid, attr); if (ret != 0) { // TODO: Better exception handling. fmt::throw_exception("mempool %x failed to create mutex", mempool); @@ -125,7 +125,7 @@ void sys_mempool_destroy(ppu_thread& ppu, sys_mempool_t mempool) sys_mutex_lock(ppu, memory_pool->mutexid, 0); idm::remove(mempool); sys_mutex_unlock(ppu, mutexid); - sys_mutex_destroy(mutexid); + sys_mutex_destroy(ppu, mutexid); sys_cond_destroy(ppu, condid); } else diff --git a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp index 8e0fb24b81..b740b88a38 100644 --- a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp @@ -35,7 +35,7 @@ static u32 ppu_alloc_tls() { // Default (small) TLS allocation addr = s_tls_area + i * s_tls_size; - break; + break; } } @@ -101,7 +101,7 @@ void sys_initialize_tls(ppu_thread& ppu, u64 main_thread_id, u32 tls_seg_addr, u lwa->protocol = SYS_SYNC_PRIORITY; lwa->recursive = SYS_SYNC_RECURSIVE; lwa->name_u64 = "atexit!\0"_u64; - sys_lwmutex_create(g_ppu_atexit_lwm, lwa); + sys_lwmutex_create(ppu, g_ppu_atexit_lwm, lwa); vm::var attr; attr->protocol = SYS_SYNC_PRIORITY; @@ -111,16 +111,16 @@ void sys_initialize_tls(ppu_thread& ppu, u64 main_thread_id, u32 tls_seg_addr, u attr->ipc_key = 0; attr->flags = 0; attr->name_u64 = "_lv2ppu\0"_u64; - sys_mutex_create(g_ppu_once_mutex, attr); + sys_mutex_create(ppu, g_ppu_once_mutex, attr); attr->recursive = SYS_SYNC_RECURSIVE; attr->name_u64 = "_lv2tls\0"_u64; - sys_mutex_create(g_ppu_exit_mutex, attr); + sys_mutex_create(ppu, g_ppu_exit_mutex, attr); lwa->protocol = SYS_SYNC_PRIORITY; lwa->recursive = SYS_SYNC_RECURSIVE; lwa->name_u64 = "_lv2prx\0"_u64; - sys_lwmutex_create(g_ppu_prx_lwm, lwa); + sys_lwmutex_create(ppu, g_ppu_prx_lwm, lwa); // TODO: missing prx initialization } @@ -182,7 +182,7 @@ void sys_ppu_thread_exit(ppu_thread& ppu, u64 val) } verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm); - + // Deallocate TLS ppu_free_tls(vm::cast(ppu.gpr[13], HERE) - 0x7030); diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp index a0db66c096..8777542919 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp @@ -8,16 +8,16 @@ #include "Emu/Cell/PPUThread.h" #include "sys_mutex.h" - - LOG_CHANNEL(sys_mutex); template<> DECLARE(ipc_manager::g_ipc) {}; extern u64 get_system_time(); -error_code sys_mutex_create(vm::ptr mutex_id, vm::ptr attr) +error_code sys_mutex_create(ppu_thread& ppu, vm::ptr mutex_id, vm::ptr attr) { + vm::temporary_unlock(ppu); + sys_mutex.warning("sys_mutex_create(mutex_id=*0x%x, attr=*0x%x)", mutex_id, attr); if (!mutex_id || !attr) @@ -74,8 +74,10 @@ error_code sys_mutex_create(vm::ptr mutex_id, vm::ptr(mutex_id, [](lv2_mutex& mutex) -> CellError @@ -110,6 +112,8 @@ error_code sys_mutex_destroy(u32 mutex_id) error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout) { + vm::temporary_unlock(ppu); + sys_mutex.trace("sys_mutex_lock(mutex_id=0x%x, timeout=0x%llx)", mutex_id, timeout); const auto mutex = idm::get(mutex_id, [&](lv2_mutex& mutex) @@ -190,6 +194,8 @@ error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout) error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id) { + vm::temporary_unlock(ppu); + sys_mutex.trace("sys_mutex_trylock(mutex_id=0x%x)", mutex_id); const auto mutex = idm::check(mutex_id, [&](lv2_mutex& mutex) @@ -217,6 +223,8 @@ error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id) error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id) { + vm::temporary_unlock(ppu); + sys_mutex.trace("sys_mutex_unlock(mutex_id=0x%x)", mutex_id); const auto mutex = idm::check(mutex_id, [&](lv2_mutex& mutex) diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.h b/rpcs3/Emu/Cell/lv2/sys_mutex.h index 2d60d31f7a..548da7a0ce 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.h +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.h @@ -147,8 +147,8 @@ class ppu_thread; // Syscalls -error_code sys_mutex_create(vm::ptr mutex_id, vm::ptr attr); -error_code sys_mutex_destroy(u32 mutex_id); +error_code sys_mutex_create(ppu_thread& ppu, vm::ptr mutex_id, vm::ptr attr); +error_code sys_mutex_destroy(ppu_thread& ppu, u32 mutex_id); error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout); error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id); error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id);