mirror of https://github.com/RPCS3/rpcs3.git
Implemented syscall _sys_process_exit
This commit is contained in:
parent
e789b969b0
commit
b9b71ccbc1
|
@ -2,7 +2,7 @@
|
||||||
#include "Emu/System.h"
|
#include "Emu/System.h"
|
||||||
#include "Emu/Cell/PPUModule.h"
|
#include "Emu/Cell/PPUModule.h"
|
||||||
|
|
||||||
#include "Emu/Cell/lv2/sys_process.h"
|
#include "sysPrxForUser.h"
|
||||||
#include "Emu/IdManager.h"
|
#include "Emu/IdManager.h"
|
||||||
#include "Crypto/unedat.h"
|
#include "Crypto/unedat.h"
|
||||||
#include "Crypto/unself.h"
|
#include "Crypto/unself.h"
|
||||||
|
@ -44,7 +44,15 @@ s32 sceNpTerm()
|
||||||
|
|
||||||
s32 npDrmIsAvailable(vm::cptr<u8> k_licensee_addr, vm::cptr<char> drm_path)
|
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)))
|
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;
|
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>();
|
auto npdrmkeys = fxm::get_always<LoadedNpdrmKeys_t>();
|
||||||
|
|
||||||
npdrmkeys->devKlic.fill(0);
|
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)
|
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);
|
if (s32 error = npDrmIsAvailable(klicensee, path))
|
||||||
npDrmIsAvailable(klicensee, path);
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
sys_game_process_exitspawn(path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
|
sys_game_process_exitspawn(path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
|
||||||
|
|
||||||
return CELL_OK;
|
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)
|
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);
|
if (s32 error = npDrmIsAvailable(klicensee, path))
|
||||||
npDrmIsAvailable(klicensee, path);
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
sys_game_process_exitspawn2(path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
|
sys_game_process_exitspawn2(path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ s32 sys_process_exit(ppu_thread& ppu, s32 status)
|
||||||
{
|
{
|
||||||
vm::temporary_unlock(ppu);
|
vm::temporary_unlock(ppu);
|
||||||
|
|
||||||
sysPrxForUser.warning("sys_process_exit(status=0x%x)", status);
|
sysPrxForUser.warning("sys_process_exit(status=%d)", status);
|
||||||
|
|
||||||
Emu.CallAfter([]()
|
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);
|
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_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")
|
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));
|
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);
|
sys_process.todo("sys_process_detach_child(unk=0x%llx)", unk);
|
||||||
return CELL_OK;
|
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_sdk_version(u32 pid, vm::ps3::ptr<s32> version);
|
||||||
s32 sys_process_get_status(u64 unk);
|
s32 sys_process_get_status(u64 unk);
|
||||||
s32 sys_process_is_spu_lock_line_reservation_address(u32 addr, u64 flags);
|
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_kill(u32 pid);
|
||||||
s32 sys_process_wait_for_child(u32 pid, vm::ps3::ptr<u32> status, u64 unk);
|
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_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_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…
Reference in New Issue