diff --git a/rpcs3/Emu/Cell/Modules/sys_libc.cpp b/rpcs3/Emu/Cell/Modules/sys_libc.cpp index 8142ffe153..d876258a22 100644 --- a/rpcs3/Emu/Cell/Modules/sys_libc.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_libc.cpp @@ -13,5 +13,5 @@ void sys_libc_memcpy(vm::ptr dst, vm::cptr src, u32 size) DECLARE(ppu_module_manager::sys_libc)("sys_libc", []() { - REG_FNID(sys_libc, "memcpy", sys_libc_memcpy).flag(MFF_FORCED_HLE); + REG_FNID(sys_libc, "memcpy", sys_libc_memcpy)/*.flag(MFF_FORCED_HLE)*/; }); diff --git a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp index 6ef016d39f..a43f1891cb 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp @@ -11,8 +11,6 @@ extern logs::channel sysPrxForUser; -extern bool g_avoid_lwm = false; - error_code sys_lwcond_create(vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr) { sysPrxForUser.trace("sys_lwcond_create(lwcond=*0x%x, lwmutex=*0x%x, attr=*0x%x)", lwcond, lwmutex, attr); @@ -22,7 +20,7 @@ error_code sys_lwcond_create(vm::ptr lwcond, vm::ptrpshared = SYS_SYNC_NOT_PROCESS_SHARED; attrs->name_u64 = attr->name_u64; - if (auto res = g_avoid_lwm ? sys_cond_create(out_id, lwmutex->sleep_queue, attrs) : _sys_lwcond_create(out_id, lwmutex->sleep_queue, lwcond, attr->name_u64, 0)) + if (auto res = g_cfg.core.hle_lwmutex ? sys_cond_create(out_id, lwmutex->sleep_queue, attrs) : _sys_lwcond_create(out_id, lwmutex->sleep_queue, lwcond, attr->name_u64, 0)) { return res; } @@ -36,7 +34,7 @@ error_code sys_lwcond_destroy(vm::ptr lwcond) { sysPrxForUser.trace("sys_lwcond_destroy(lwcond=*0x%x)", lwcond); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_cond_destroy(lwcond->lwcond_queue); } @@ -54,7 +52,7 @@ error_code sys_lwcond_signal(ppu_thread& ppu, vm::ptr lwcond) { sysPrxForUser.trace("sys_lwcond_signal(lwcond=*0x%x)", lwcond); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_cond_signal(ppu, lwcond->lwcond_queue); } @@ -124,7 +122,7 @@ error_code sys_lwcond_signal_all(ppu_thread& ppu, vm::ptr lwcond) { sysPrxForUser.trace("sys_lwcond_signal_all(lwcond=*0x%x)", lwcond); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_cond_signal_all(ppu, lwcond->lwcond_queue); } @@ -188,7 +186,7 @@ error_code sys_lwcond_signal_to(ppu_thread& ppu, vm::ptr lwcond, u { sysPrxForUser.trace("sys_lwcond_signal_to(lwcond=*0x%x, ppu_thread_id=0x%x)", lwcond, ppu_thread_id); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_cond_signal_to(ppu, lwcond->lwcond_queue, ppu_thread_id); } @@ -252,7 +250,7 @@ error_code sys_lwcond_wait(ppu_thread& ppu, vm::ptr lwcond, u64 ti { sysPrxForUser.trace("sys_lwcond_wait(lwcond=*0x%x, timeout=0x%llx)", lwcond, timeout); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_cond_wait(ppu, lwcond->lwcond_queue, timeout); } @@ -333,10 +331,10 @@ error_code sys_lwcond_wait(ppu_thread& ppu, vm::ptr lwcond, u64 ti void sysPrxForUser_sys_lwcond_init() { - REG_FUNC(sysPrxForUser, sys_lwcond_create); - REG_FUNC(sysPrxForUser, sys_lwcond_destroy); - REG_FUNC(sysPrxForUser, sys_lwcond_signal); - REG_FUNC(sysPrxForUser, sys_lwcond_signal_all); - REG_FUNC(sysPrxForUser, sys_lwcond_signal_to); - REG_FUNC(sysPrxForUser, sys_lwcond_wait); + REG_FUNC(sysPrxForUser, sys_lwcond_create).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwcond_destroy).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwcond_signal).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwcond_signal_all).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwcond_signal_to).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwcond_wait).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); } diff --git a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp index 815a263b70..ac1fb7c4bc 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp @@ -10,8 +10,6 @@ extern logs::channel sysPrxForUser; -extern bool g_avoid_lwm; - error_code sys_lwmutex_create(vm::ptr lwmutex, vm::ptr attr) { sysPrxForUser.trace("sys_lwmutex_create(lwmutex=*0x%x, attr=*0x%x)", lwmutex, attr); @@ -36,7 +34,7 @@ error_code sys_lwmutex_create(vm::ptr lwmutex, vm::ptr out_id; vm::var attrs; - attrs->protocol = attr->protocol; + attrs->protocol = protocol == SYS_SYNC_FIFO ? SYS_SYNC_FIFO : SYS_SYNC_PRIORITY; attrs->recursive = attr->recursive; attrs->pshared = SYS_SYNC_NOT_PROCESS_SHARED; attrs->adaptive = SYS_SYNC_NOT_ADAPTIVE; @@ -44,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_avoid_lwm ? sys_mutex_create(out_id, attrs) : _sys_lwmutex_create(out_id, protocol, lwmutex, 0x80000001, attr->name_u64, 0)) + 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, 0)) { return res; } @@ -60,7 +58,7 @@ error_code sys_lwmutex_destroy(ppu_thread& ppu, vm::ptr lwmutex) { sysPrxForUser.trace("sys_lwmutex_destroy(lwmutex=*0x%x)", lwmutex); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_mutex_destroy(lwmutex->sleep_queue); } @@ -96,7 +94,7 @@ error_code sys_lwmutex_lock(ppu_thread& ppu, vm::ptr lwmutex, u64 { sysPrxForUser.trace("sys_lwmutex_lock(lwmutex=*0x%x, timeout=0x%llx)", lwmutex, timeout); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_mutex_lock(ppu, lwmutex->sleep_queue, timeout); } @@ -197,7 +195,7 @@ error_code sys_lwmutex_trylock(ppu_thread& ppu, vm::ptr lwmutex) { sysPrxForUser.trace("sys_lwmutex_trylock(lwmutex=*0x%x)", lwmutex); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_mutex_trylock(ppu, lwmutex->sleep_queue); } @@ -269,7 +267,7 @@ error_code sys_lwmutex_unlock(ppu_thread& ppu, vm::ptr lwmutex) { sysPrxForUser.trace("sys_lwmutex_unlock(lwmutex=*0x%x)", lwmutex); - if (g_avoid_lwm) + if (g_cfg.core.hle_lwmutex) { return sys_mutex_unlock(ppu, lwmutex->sleep_queue); } @@ -316,9 +314,9 @@ error_code sys_lwmutex_unlock(ppu_thread& ppu, vm::ptr lwmutex) void sysPrxForUser_sys_lwmutex_init() { - REG_FUNC(sysPrxForUser, sys_lwmutex_create); - REG_FUNC(sysPrxForUser, sys_lwmutex_destroy); - REG_FUNC(sysPrxForUser, sys_lwmutex_lock); - REG_FUNC(sysPrxForUser, sys_lwmutex_trylock); - REG_FUNC(sysPrxForUser, sys_lwmutex_unlock); + REG_FUNC(sysPrxForUser, sys_lwmutex_create).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwmutex_destroy).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwmutex_lock).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwmutex_trylock).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); + REG_FUNC(sysPrxForUser, sys_lwmutex_unlock).flag(g_cfg.core.hle_lwmutex ? MFF_FORCED_HLE : MFF_PERFECT); } diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index b7986b0179..00c42866f7 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -536,7 +536,7 @@ static auto ppu_load_exports(const std::shared_ptr& link, u32 // Static function const auto _sf = _sm && _sm->functions.count(fnid) ? &_sm->functions.at(fnid) : nullptr; - if (_sf && (_sf->flags & MFF_FORCED_HLE) && g_cfg.core.hook_functions) + if (_sf && (_sf->flags & MFF_FORCED_HLE)) { // Inject a branch to the HLE implementation const u32 _entry = vm::read32(faddr); diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index c61da9cd62..fcf40faa91 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -362,6 +362,7 @@ struct cfg_root : cfg::node cfg::_enum lib_loading{this, "Lib Loader", lib_loading_type::liblv2only}; cfg::_bool hook_functions{this, "Hook static functions"}; cfg::set_entry load_libraries{this, "Load libraries"}; + cfg::_bool hle_lwmutex{this, "HLE lwmutex"}; // Force alternative lwmutex/lwcond implementation } core{this};