From 4794869bd8a2ff9857482ce8b56428375772bd09 Mon Sep 17 00:00:00 2001 From: Eladash Date: Wed, 23 Aug 2023 09:21:02 +0300 Subject: [PATCH] sceNpDrm: Slow down sceNpDrmIsAvailable --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 33 ++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index da84bb05a5..a4ef65114d 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -17,6 +17,7 @@ #include "Emu/Cell/lv2/sys_time.h" #include "Emu/Cell/lv2/sys_fs.h" +#include "Emu/Cell/lv2/sys_sync.h" #include "Emu/NP/np_handler.h" #include "Emu/NP/np_contexts.h" #include "Emu/NP/np_helpers.h" @@ -408,6 +409,8 @@ void message_data::print() const sceNp.notice("commId: %s, msgId: %d, mainType: %d, subType: %d, subject: %s, body: %s, data_size: %d", static_cast(commId.data), msgId, mainType, subType, subject, body, data.size()); } +extern void lv2_sleep(u64 timeout, ppu_thread* ppu = nullptr); + error_code sceNpInit(u32 poolsize, vm::ptr poolptr) { sceNp.warning("sceNpInit(poolsize=0x%x, poolptr=*0x%x)", poolsize, poolptr); @@ -553,18 +556,40 @@ error_code npDrmIsAvailable(vm::cptr k_licensee_addr, vm::cptr drm_pat return CELL_OK; } -error_code sceNpDrmIsAvailable(vm::cptr k_licensee_addr, vm::cptr drm_path) +error_code sceNpDrmIsAvailable(ppu_thread& ppu, vm::cptr k_licensee_addr, vm::cptr drm_path) { sceNp.warning("sceNpDrmIsAvailable(k_licensee=*0x%x, drm_path=*0x%x)", k_licensee_addr, drm_path); - return npDrmIsAvailable(k_licensee_addr, drm_path); + if (!drm_path) + { + return SCE_NP_DRM_ERROR_INVALID_PARAM; + } + + lv2_obj::sleep(ppu); + + const auto ret = npDrmIsAvailable(k_licensee_addr, drm_path); + lv2_sleep(100000, &ppu); + + return ret; } -error_code sceNpDrmIsAvailable2(vm::cptr k_licensee_addr, vm::cptr drm_path) +error_code sceNpDrmIsAvailable2(ppu_thread& ppu, vm::cptr k_licensee_addr, vm::cptr drm_path) { sceNp.warning("sceNpDrmIsAvailable2(k_licensee=*0x%x, drm_path=*0x%x)", k_licensee_addr, drm_path); - return npDrmIsAvailable(k_licensee_addr, drm_path); + if (!drm_path) + { + return SCE_NP_DRM_ERROR_INVALID_PARAM; + } + + lv2_obj::sleep(ppu); + + const auto ret = npDrmIsAvailable(k_licensee_addr, drm_path); + + // TODO: Accurate sleep time + //lv2_sleep(20000, &ppu); + + return ret; } error_code npDrmVerifyUpgradeLicense(vm::cptr content_id)