diff --git a/src/core/hle/libraries/libkernel/libkernel.cpp b/src/core/hle/libraries/libkernel/libkernel.cpp index 52e1a8e6c..ff0a37355 100644 --- a/src/core/hle/libraries/libkernel/libkernel.cpp +++ b/src/core/hle/libraries/libkernel/libkernel.cpp @@ -11,6 +11,7 @@ #include "core/hle/libraries/libkernel/time_management.h" #include "core/hle/libraries/libs.h" #include "core/loader/elf.h" +#include "core/linker.h" #ifdef _WIN64 #include @@ -33,6 +34,14 @@ int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len) { BREAKPOINT(); } static thread_local int libc_error; int* PS4_SYSV_ABI __Error() { return &libc_error; } +static void* PS4_SYSV_ABI sceKernelGetProcParam() { + PRINT_FUNCTION_NAME(); + + auto* linker = Common::Singleton::Instance(); + + return reinterpret_cast(linker->GetProcParam()); +} + void LibKernel_Register(Loader::SymbolsResolver* sym) { // obj LIB_OBJ("f7uOxY9mM1U", "libkernel", 1, "libkernel", 1, 1, &g_stack_chk_guard); @@ -49,6 +58,8 @@ void LibKernel_Register(Loader::SymbolsResolver* sym) { LIB_FUNCTION("WslcK1FQcGI", "libkernel", 1, "libkernel", 1, 1, Kernel::sceKernelIsNeoMode); LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail); LIB_FUNCTION("9BcDykPmo1I", "libkernel", 1, "libkernel", 1, 1, __Error); + LIB_FUNCTION("959qrazPIrg", "libkernel", 1, "libkernel", 1, 1, sceKernelGetProcParam); + Core::Libraries::LibKernel::fileSystemSymbolsRegister(sym); Core::Libraries::LibKernel::timeSymbolsRegister(sym); diff --git a/src/core/linker.cpp b/src/core/linker.cpp index 098d41069..df349e41b 100644 --- a/src/core/linker.cpp +++ b/src/core/linker.cpp @@ -130,6 +130,7 @@ void Linker::LoadModuleToMemory(Module* m) { LOG_ERROR_IF(debug_loader, "p_filesz==0 in type {}\n", m->elf.ElfPheaderTypeStr(elf_pheader[i].p_type)); } break; + case PT_SCE_PROCPARAM: m->proc_param_virtual_addr = elf_pheader[i].p_vaddr + m->base_virtual_addr; break; default: LOG_ERROR_IF(debug_loader, "Unimplemented type {}\n", m->elf.ElfPheaderTypeStr(elf_pheader[i].p_type)); } } @@ -607,6 +608,17 @@ void Linker::StartAllModules() { } } +u64 Linker::GetProcParam() { + //std::scoped_lock lock{m_mutex}; + + for (auto& m : m_modules) { + if (!m.elf.IsSharedLib()) { + return m.proc_param_virtual_addr; + } + } + return 0; +} + static PS4_SYSV_ABI void ProgramExitFunc() { fmt::print("exit function called\n"); } static void run_main_entry(u64 addr, EntryParams* params, exit_func_t exit_func) { diff --git a/src/core/linker.h b/src/core/linker.h index ad8474250..509076d2c 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -93,6 +93,7 @@ struct DynamicModuleInfo { std::vector export_libs; std::string filename; // Filename with absolute path + }; // This struct keeps neccesary info about loaded modules. Main executeable is included too as well @@ -109,6 +110,8 @@ struct Module { Loader::SymbolsResolver export_sym; Loader::SymbolsResolver import_sym; + + u64 proc_param_virtual_addr = 0; }; class Linker { @@ -127,6 +130,7 @@ public: void RelocateAll(); int StartModule(Module* m, size_t args, const void* argp, module_func_t func); void StartAllModules(); + u64 GetProcParam(); private: const ModuleInfo* FindModule(const Module& m, const std::string& id);