diff --git a/rpcs3/Emu/SysCalls/lv2/sys_process.cpp b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp index ecb7f302bc..f36e417ec2 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_process.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp @@ -10,10 +10,16 @@ SysCallBase sc_p("Process"); sysProcessObjects_t procObjects; +s32 process_getpid() +{ + // TODO: get current process id + return 1; +} + s32 sys_process_getpid() { sc_p.Log("sys_process_getpid() -> 1"); - return 1; + return process_getpid(); } s32 sys_process_getppid() @@ -228,12 +234,29 @@ s32 sys_process_get_paramsfo(mem8_ptr_t buffer) return CELL_OK;*/ } +s32 process_get_sdk_version(u32 pid, s32& ver) +{ + // TODO: get correct SDK version for selected pid + ver = Emu.m_sdk_version; + + return CELL_OK; +} + s32 sys_process_get_sdk_version(u32 pid, mem32_t version) { sc_p.Warning("sys_process_get_sdk_version(pid=%d, version_addr=0x%x)", pid, version.GetAddr()); - version = 0x360001; // TODO - return CELL_OK; + s32 sdk_ver; + s32 ret = process_get_sdk_version(pid, sdk_ver); + if (ret != CELL_OK) + { + return ret; // error code + } + else + { + version = sdk_ver; + return CELL_OK; + } } s32 sys_process_kill(u32 pid) diff --git a/rpcs3/Emu/SysCalls/lv2/sys_process.h b/rpcs3/Emu/SysCalls/lv2/sys_process.h index 3ec275818b..8d14099c05 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_process.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.h @@ -51,6 +51,10 @@ struct sysProcessObjects_t // Extern extern sysProcessObjects_t procObjects; +// Auxiliary functions +s32 process_getpid(); +s32 process_get_sdk_version(u32 pid, s32& ver); + // SysCalls s32 sys_process_getpid(); s32 sys_process_getppid(); diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 3bf2af91bf..5fb9ff7a36 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -16,6 +16,8 @@ #include "Emu/CPU/CPUThreadManager.h" //gui dependency +#include "Loader/PSF.h" + #include "../Crypto/unself.h" #include #include @@ -258,6 +260,26 @@ void Emulator::Load() return; } + // setting default values + Emu.m_sdk_version = -1; // possibly "unknown" value + + // trying to load some info from PARAM.SFO + vfsFile f2("/app_home/PARAM.SFO"); + if (f2.IsOpened()) + { + PSFLoader psf(f2); + if (psf.Load(false)) + { + std::string version = psf.GetString("PS3_SYSTEM_VER"); + + const size_t dot = version.find('.'); + if (dot != std::string::npos) + { + Emu.m_sdk_version = (std::stoi(version, nullptr, 16) << 20) | ((std::stoi(version.substr(dot + 1), nullptr, 16) & 0xffff) << 4) | 1; + } + } + } + LoadPoints(BreakPointsDBName); CPUThread& thread = GetCPU().AddThread(thread_type); diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 7052d05118..f2500878ac 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -106,6 +106,7 @@ public: std::string m_path; std::string m_elf_path; std::string m_title_id; + s32 m_sdk_version; Emulator();