From 20f8ff7881b575d265f02b769eaab6ce53eef06c Mon Sep 17 00:00:00 2001 From: DH Date: Thu, 21 Nov 2024 02:48:43 +0300 Subject: [PATCH] kernel: add ps5 sysvec stub sys_begin_app_mount & sys_end_app_mount --- orbis-kernel/src/sys/sys_sce.cpp | 6 +- orbis-kernel/src/sysvec.cpp | 739 ++++++++++++++++++++++++++++++- rpcsx/main.cpp | 18 +- 3 files changed, 756 insertions(+), 7 deletions(-) diff --git a/orbis-kernel/src/sys/sys_sce.cpp b/orbis-kernel/src/sys/sys_sce.cpp index 2d4339b52..977ce852d 100644 --- a/orbis-kernel/src/sys/sys_sce.cpp +++ b/orbis-kernel/src/sys/sys_sce.cpp @@ -1683,10 +1683,12 @@ orbis::SysResult orbis::sys_get_phys_page_size(Thread *thread /* TODO */) { return ErrorCode::NOSYS; } orbis::SysResult orbis::sys_begin_app_mount(Thread *thread /* TODO */) { - return ErrorCode::NOSYS; + ORBIS_LOG_FATAL(__FUNCTION__); + return {}; } orbis::SysResult orbis::sys_end_app_mount(Thread *thread /* TODO */) { - return ErrorCode::NOSYS; + ORBIS_LOG_FATAL(__FUNCTION__); + return {}; } orbis::SysResult orbis::sys_fsc2h_ctrl(Thread *thread /* TODO */) { return ErrorCode::NOSYS; diff --git a/orbis-kernel/src/sysvec.cpp b/orbis-kernel/src/sysvec.cpp index 2430f0275..786531131 100644 --- a/orbis-kernel/src/sysvec.cpp +++ b/orbis-kernel/src/sysvec.cpp @@ -1,8 +1,8 @@ #include "sys/syscall.hpp" #include "sys/sysentry.hpp" #include "sys/sysproto.hpp" -#include "thread/Thread.hpp" #include "thread/Process.hpp" +#include "thread/Thread.hpp" #include #include @@ -34,7 +34,15 @@ void orbis::syscall_entry(Thread *thread) { auto p = thread->tproc; if (syscall_num >= p->sysent->size) { + if (thread->tproc->onSysEnter != nullptr) { + thread->tproc->onSysEnter(thread, syscall_num, nullptr, 0); + } error = int(ErrorCode::NOSYS); + + if (thread->tproc->onSysExit != nullptr) { + thread->tproc->onSysExit(thread, syscall_num, nullptr, 0, + ErrorCode::NOSYS); + } } else { auto sysent = p->sysent->table[syscall_num]; uint64_t args[8]; @@ -2489,6 +2497,732 @@ static constexpr sysent ps4_sysent[] = { wrap(), }; +static constexpr sysent ps5_sysent[] = { + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), + wrap(), +}; + constinit sysentvec freebsd9_sysvec = {.size = std::size(freebsd9_sysent), .table = freebsd9_sysent}; @@ -2498,5 +3232,6 @@ constinit sysentvec freebsd11_sysvec = {.size = std::size(freebsd11_sysent), constinit sysentvec ps4_sysvec = {.size = std::size(ps4_sysent), .table = ps4_sysent}; -constinit sysentvec ps5_sysvec = {.size = 0, .table = nullptr}; +constinit sysentvec ps5_sysvec = {.size = std::size(ps5_sysent), + .table = ps5_sysent}; } // namespace orbis diff --git a/rpcsx/main.cpp b/rpcsx/main.cpp index 807342014..67010ee1a 100644 --- a/rpcsx/main.cpp +++ b/rpcsx/main.cpp @@ -525,8 +525,16 @@ int guestExec(orbis::Thread *mainThread, ExecEnv execEnv, if (executableModule->dynType == orbis::DynType::Ps4) { mainThread->tproc->type = orbis::ProcessType::Ps4; + mainThread->tproc->sysent = &orbis::ps4_sysvec; } else if (executableModule->dynType == orbis::DynType::Ps5) { mainThread->tproc->type = orbis::ProcessType::Ps5; + mainThread->tproc->sysent = &orbis::ps5_sysvec; + } else { + if (orbis::g_context.fwType == orbis::FwType::Ps4) { + mainThread->tproc->sysent = &orbis::ps4_sysvec; + } else { + mainThread->tproc->sysent = &orbis::ps5_sysvec; + } } // clang-format off @@ -995,7 +1003,6 @@ int main(int argc, const char *argv[]) { int status = 0; - initProcess->sysent = &orbis::ps4_sysvec; initProcess->onSysEnter = onSysEnter; initProcess->onSysExit = onSysExit; initProcess->ops = &rx::procOpsTable; @@ -1097,11 +1104,16 @@ int main(int argc, const char *argv[]) { return 1; } + auto execEnv = guestCreateExecEnv(mainThread, executableModule, isSystem); + + if (isSystem && executableModule->dynType == orbis::DynType::None) { + orbis::g_context.fwType = orbis::FwType::Ps5; + executableModule->dynType = orbis::DynType::Ps5; + } + guestInitDev(); guestInitFd(mainThread); - auto execEnv = guestCreateExecEnv(mainThread, executableModule, isSystem); - // data transfer mode // 0 - normal // 1 - source