Implemented syscall _sys_process_exit

This commit is contained in:
Nekotekina 2017-09-16 20:43:02 +03:00
parent e789b969b0
commit b9b71ccbc1
6 changed files with 48 additions and 28 deletions

View File

@ -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;
}

View File

@ -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([]()
{

View File

@ -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);

View File

@ -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));
}

View File

@ -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");
}

View File

@ -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);