diff --git a/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp b/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp index 6736bcb69f..aebc7921c5 100644 --- a/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/Cell/Modules/sysPrxForUser.cpp @@ -21,6 +21,23 @@ s64 sys_time_get_system_time() return get_system_time(); } +s32 sys_process_exit(ppu_thread& ppu, s32 status) +{ + vm::temporary_unlock(ppu); + + sysPrxForUser.warning("sys_process_exit(status=0x%x)", status); + + Emu.CallAfter([]() + { + sysPrxForUser.success("Process finished"); + Emu.Stop(); + }); + + thread_ctrl::eternalize(); + + return CELL_OK; +} + s64 _sys_process_atexitspawn() { sysPrxForUser.todo("_sys_process_atexitspawn()"); @@ -236,7 +253,6 @@ DECLARE(ppu_module_manager::sysPrxForUser)("sysPrxForUser", []() REG_FUNC(sysPrxForUser, sys_time_get_system_time); - // TODO: split syscalls and liblv2 functions REG_FUNC(sysPrxForUser, sys_process_exit); REG_FUNC(sysPrxForUser, _sys_process_atexitspawn); REG_FUNC(sysPrxForUser, _sys_process_at_Exitspawn); diff --git a/rpcs3/Emu/Cell/PPUFunction.cpp b/rpcs3/Emu/Cell/PPUFunction.cpp index 07af0c9ea4..d257b0e787 100644 --- a/rpcs3/Emu/Cell/PPUFunction.cpp +++ b/rpcs3/Emu/Cell/PPUFunction.cpp @@ -7,7 +7,6 @@ extern std::string ppu_get_syscall_name(u64 code) { case 1: return "sys_process_getpid"; case 2: return "sys_process_wait_for_child"; - case 3: return "sys_process_exit"; case 4: return "sys_process_get_status"; case 5: return "sys_process_detach_child"; case 12: return "sys_process_get_number_of_object"; @@ -16,10 +15,10 @@ extern std::string ppu_get_syscall_name(u64 code) case 18: return "sys_process_getppid"; case 19: return "sys_process_kill"; case 21: return "_sys_process_spawn"; - case 22: return "sys_process_exit"; + case 22: return "_sys_process_exit"; case 23: return "sys_process_wait_for_child2"; case 25: return "sys_process_get_sdk_version"; - case 26: return "_sys_process_exit"; + case 26: return "_sys_process_exit2"; case 28: return "_sys_process_get_number_of_object"; case 29: return "sys_process_get_id"; case 30: return "_sys_process_get_paramsfo"; diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index cfc846d1aa..55f797b19f 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -76,11 +76,11 @@ const std::array s_ppu_syscall_table BIND_FUNC(sys_process_kill), //19 (0x013) null_func, //20 (0x014) UNS null_func,//BIND_FUNC(_sys_process_spawn), //21 (0x015) DBG - null_func,//BIND_FUNC(sys_process_exit), //22 (0x016) + BIND_FUNC(_sys_process_exit), //22 (0x016) BIND_FUNC(sys_process_wait_for_child2), //23 (0x017) DBG null_func,//BIND_FUNC(), //24 (0x018) DBG BIND_FUNC(sys_process_get_sdk_version), //25 (0x019) - null_func,//BIND_FUNC(_sys_process_exit), //26 (0x01A) + BIND_FUNC(_sys_process_exit2), //26 (0x01A) null_func,//BIND_FUNC(), //27 (0x01B) DBG null_func,//BIND_FUNC(_sys_process_get_number_of_object)//28 (0x01C) ROOT BIND_FUNC(sys_process_get_id), //29 (0x01D) ROOT diff --git a/rpcs3/Emu/Cell/lv2/sys_process.cpp b/rpcs3/Emu/Cell/lv2/sys_process.cpp index c9fa057158..74cc6c8979 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_process.cpp @@ -46,23 +46,6 @@ s32 sys_process_getppid() return 0; } -s32 sys_process_exit(ppu_thread& ppu, s32 status) -{ - vm::temporary_unlock(ppu); - - sys_process.warning("sys_process_exit(status=0x%x)", status); - - Emu.CallAfter([]() - { - sys_process.success("Process finished"); - Emu.Stop(); - }); - - thread_ctrl::eternalize(); - - return CELL_OK; -} - template u32 idm_get_count() { diff --git a/rpcs3/Emu/Cell/lv2/sys_process.h b/rpcs3/Emu/Cell/lv2/sys_process.h index b403482fce..ea31614df1 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.h +++ b/rpcs3/Emu/Cell/lv2/sys_process.h @@ -37,10 +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 errorcode); +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); -void sys_game_process_exitspawn(vm::ps3::cptr path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags); -void sys_game_process_exitspawn2(vm::ps3::cptr path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags);