mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-20 03:25:16 +00:00
Implemented syscall _sys_process_exit
This commit is contained in:
parent
e789b969b0
commit
b9b71ccbc1
6 changed files with 48 additions and 28 deletions
|
@ -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<u8> k_licensee_addr, vm::cptr<char> drm_path)
|
||||
{
|
||||
const std::string& enc_drm_path = drm_path.get_ptr();
|
||||
std::array<u8, 0x10> 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<be_t<v128, 1>*>(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<u8> k_licensee_addr, vm::cptr<char> drm_path)
|
|||
return CELL_ENOENT;
|
||||
}
|
||||
|
||||
std::string k_licensee_str = "";
|
||||
std::array<u8, 0x10> 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<LoadedNpdrmKeys_t>();
|
||||
|
||||
npdrmkeys->devKlic.fill(0);
|
||||
|
@ -187,25 +181,29 @@ s32 sceNpDrmGetTimelimit(vm::cptr<char> path, vm::ptr<u64> time_remain)
|
|||
|
||||
s32 sceNpDrmProcessExitSpawn(vm::cptr<u8> klicensee, vm::cptr<char> 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<u8> klicensee, vm::cptr<char> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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([]()
|
||||
{
|
||||
|
|
|
@ -53,3 +53,5 @@ error_code sys_lwcond_signal_to(ppu_thread& CPU, vm::ptr<sys_lwcond_t> lwcond, u
|
|||
error_code sys_lwcond_wait(ppu_thread& CPU, vm::ptr<sys_lwcond_t> lwcond, u64 timeout);
|
||||
|
||||
void sys_ppu_thread_exit(ppu_thread& CPU, u64 val);
|
||||
void sys_game_process_exitspawn(vm::cptr<char> path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags);
|
||||
void sys_game_process_exitspawn2(vm::cptr<char> path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags);
|
||||
|
|
|
@ -1166,7 +1166,7 @@ extern void ppu_initialize(const ppu_module& info)
|
|||
|
||||
if (info.name == "liblv2.sprx")
|
||||
{
|
||||
const be_t<u64> forced_upd = 1;
|
||||
const be_t<u64> forced_upd = 2;
|
||||
sha1_update(&ctx, reinterpret_cast<const u8*>(&forced_upd), sizeof(forced_upd));
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -37,9 +37,9 @@ s32 _sys_process_get_paramsfo(vm::ps3::ptr<char> buffer);
|
|||
s32 sys_process_get_sdk_version(u32 pid, vm::ps3::ptr<s32> 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<u32> 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);
|
||||
|
|
Loading…
Add table
Reference in a new issue