From b9b71ccbc1952c6d131b6bc01d1f54bbad672f5c Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 16 Sep 2017 20:43:02 +0300 Subject: [PATCH] Implemented syscall _sys_process_exit --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 46 ++++++++++++------------ rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp | 2 +- rpcs3/Emu/Cell/Modules/sysPrxForUser.h | 2 ++ rpcs3/Emu/Cell/PPUThread.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_process.cpp | 20 +++++++++++ rpcs3/Emu/Cell/lv2/sys_process.h | 4 +-- 6 files changed, 48 insertions(+), 28 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 48b2080486..3d4180bc0e 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -2,7 +2,7 @@ #include "Emu/System.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/Cell/lv2/sys_process.h" +#include "sysPrxForUser.h" #include "Emu/IdManager.h" #include "Crypto/unedat.h" #include "Crypto/unself.h" @@ -44,7 +44,15 @@ s32 sceNpTerm() s32 npDrmIsAvailable(vm::cptr k_licensee_addr, vm::cptr drm_path) { - const std::string& enc_drm_path = drm_path.get_ptr(); + std::array k_licensee{}; + + if (k_licensee_addr) + { + std::copy_n(k_licensee_addr.get_ptr(), k_licensee.size(), k_licensee.begin()); + sceNp.notice("npDrmIsAvailable(): KLicense key %s", *reinterpret_cast*>(k_licensee.data())); + } + + const std::string enc_drm_path = drm_path.get_ptr(); if (!fs::is_file(vfs::get(enc_drm_path))) { @@ -52,20 +60,6 @@ s32 npDrmIsAvailable(vm::cptr k_licensee_addr, vm::cptr drm_path) return CELL_ENOENT; } - std::string k_licensee_str = ""; - std::array k_licensee{0}; - - if (k_licensee_addr) - { - for (s8 i = 0; i < 0x10; i++) - { - k_licensee[i] = *(k_licensee_addr + i); - k_licensee_str += fmt::format("%02x", k_licensee[i]); - } - - sceNp.notice("npDrmIsAvailable(): KLicense key %s", k_licensee_str); - } - auto npdrmkeys = fxm::get_always(); npdrmkeys->devKlic.fill(0); @@ -187,25 +181,29 @@ s32 sceNpDrmGetTimelimit(vm::cptr path, vm::ptr time_remain) s32 sceNpDrmProcessExitSpawn(vm::cptr klicensee, vm::cptr path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags) { - sceNp.warning("sceNpDrmProcessExitSpawn() -> sys_game_process_exitspawn"); + sceNp.warning("sceNpDrmProcessExitSpawn(klicensee=*0x%x, path=%s, argv=*0x%x, envp=*0x%x, data=*0x%x, data_size=0x%x, prio=%u, flags=0x%x)", + klicensee, path, argv_addr, envp_addr, data_addr, data_size, prio, flags); - sceNp.warning("klicensee: 0x%x", klicensee); - npDrmIsAvailable(klicensee, path); + if (s32 error = npDrmIsAvailable(klicensee, path)) + { + return error; + } sys_game_process_exitspawn(path, argv_addr, envp_addr, data_addr, data_size, prio, flags); - return CELL_OK; } s32 sceNpDrmProcessExitSpawn2(vm::cptr klicensee, vm::cptr path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags) { - sceNp.warning("sceNpDrmProcessExitSpawn2() -> sys_game_process_exitspawn2"); + sceNp.warning("sceNpDrmProcessExitSpawn2(klicensee=*0x%x, path=%s, argv=*0x%x, envp=*0x%x, data=*0x%x, data_size=0x%x, prio=%u, flags=0x%x)", + klicensee, path, argv_addr, envp_addr, data_addr, data_size, prio, flags); - sceNp.warning("klicensee: 0x%x", klicensee); - npDrmIsAvailable(klicensee, path); + if (s32 error = npDrmIsAvailable(klicensee, path)) + { + return error; + } sys_game_process_exitspawn2(path, argv_addr, envp_addr, data_addr, data_size, prio, flags); - return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp b/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp index aebc7921c5..1aa61e6f53 100644 --- a/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp @@ -25,7 +25,7 @@ s32 sys_process_exit(ppu_thread& ppu, s32 status) { vm::temporary_unlock(ppu); - sysPrxForUser.warning("sys_process_exit(status=0x%x)", status); + sysPrxForUser.warning("sys_process_exit(status=%d)", status); Emu.CallAfter([]() { diff --git a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h index 2e0828b68d..b6345be9e3 100644 --- a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h +++ b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h @@ -53,3 +53,5 @@ error_code sys_lwcond_signal_to(ppu_thread& CPU, vm::ptr lwcond, u error_code sys_lwcond_wait(ppu_thread& CPU, vm::ptr lwcond, u64 timeout); void sys_ppu_thread_exit(ppu_thread& CPU, u64 val); +void sys_game_process_exitspawn(vm::cptr path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags); +void sys_game_process_exitspawn2(vm::cptr path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags); diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 950e2557bd..65065cb16d 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1166,7 +1166,7 @@ extern void ppu_initialize(const ppu_module& info) if (info.name == "liblv2.sprx") { - const be_t forced_upd = 1; + const be_t forced_upd = 2; sha1_update(&ctx, reinterpret_cast(&forced_upd), sizeof(forced_upd)); } diff --git a/rpcs3/Emu/Cell/lv2/sys_process.cpp b/rpcs3/Emu/Cell/lv2/sys_process.cpp index 74cc6c8979..8f069c391e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_process.cpp @@ -232,3 +232,23 @@ s32 sys_process_detach_child(u64 unk) sys_process.todo("sys_process_detach_child(unk=0x%llx)", unk); return CELL_OK; } + +s32 _sys_process_exit(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3) +{ + vm::temporary_unlock(ppu); + + sys_process.warning("_sys_process_exit(status=%d, arg2=0x%x, arg3=0x%x)", status); + + Emu.CallAfter([]() + { + sys_process.success("Process finished"); + Emu.Stop(); + }); + + thread_ctrl::eternalize(); +} + +s32 _sys_process_exit2(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3, u32 arg4) +{ + fmt::throw_exception("_sys_process_exit2"); +} diff --git a/rpcs3/Emu/Cell/lv2/sys_process.h b/rpcs3/Emu/Cell/lv2/sys_process.h index ea31614df1..1b38637157 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.h +++ b/rpcs3/Emu/Cell/lv2/sys_process.h @@ -37,9 +37,9 @@ s32 _sys_process_get_paramsfo(vm::ps3::ptr buffer); s32 sys_process_get_sdk_version(u32 pid, vm::ps3::ptr version); s32 sys_process_get_status(u64 unk); s32 sys_process_is_spu_lock_line_reservation_address(u32 addr, u64 flags); -s32 _sys_process_exit(ppu_thread& ppu, s32 exitcode, u32 arg2, u32 arg3); -s32 _sys_process_exit2(ppu_thread& ppu, s32 exitcode, u32 arg2, u32 arg3, u32 arg4); s32 sys_process_kill(u32 pid); s32 sys_process_wait_for_child(u32 pid, vm::ps3::ptr status, u64 unk); s32 sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6); s32 sys_process_detach_child(u64 unk); +s32 _sys_process_exit(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3); +s32 _sys_process_exit2(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3, u32 arg4);