diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index d56f4dc41..8ac37f0b6 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include @@ -398,6 +399,24 @@ int PS4_SYSV_ABI posix_getpagesize() { return 4096; } +int PS4_SYSV_ABI sceKernelGetModuleList(Core::Module** pArray, size_t numArray, size_t* pActualNum) { + auto* linker = Common::Singleton::Instance(); + int numModules = linker->GetNumberModules(); + for (int i = 0; i < std::min(static_cast(numArray), numModules); ++i) + { + auto m = linker->GetModule(i); + if (!m) + { + *pActualNum = i; + break; + } + + pArray[i] = m; + } + + return ORBIS_OK; +} + void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { service_thread = std::jthread{KernelServiceThread}; @@ -443,6 +462,8 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("kBJzF8x4SyE", "libkernel", 1, "libkernel", 1, 1, sceKernelBatchMap2); LIB_FUNCTION("DGMG3JshrZU", "libkernel", 1, "libkernel", 1, 1, sceKernelSetVirtualRangeName); + LIB_FUNCTION("IuxnUuXk6Bg", "libkernel", 1, "libkernel", 1, 1, sceKernelGetModuleList); + // equeue LIB_FUNCTION("D0OdFMjp46I", "libkernel", 1, "libkernel", 1, 1, sceKernelCreateEqueue); LIB_FUNCTION("jpFjmgAC5AE", "libkernel", 1, "libkernel", 1, 1, sceKernelDeleteEqueue); diff --git a/src/core/libraries/kernel/libkernel.h b/src/core/libraries/kernel/libkernel.h index c28a548ff..8265c896a 100644 --- a/src/core/libraries/kernel/libkernel.h +++ b/src/core/libraries/kernel/libkernel.h @@ -6,6 +6,7 @@ #include #include "common/types.h" +#include "core/module.h" namespace Core::Loader { class SymbolsResolver; @@ -34,6 +35,7 @@ typedef struct { int* PS4_SYSV_ABI __Error(); int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver); +int PS4_SYSV_ABI sceKernelGetModuleList(Core::Module** pArray, size_t numArray, size_t* pActualNum); void LibKernel_Register(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/linker.h b/src/core/linker.h index ed1fe400c..afd26ff59 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -79,6 +79,10 @@ public: return m_modules.at(index).get(); } + int GetNumberModules() const { + return m_modules.size(); + } + void RelocateAnyImports(Module* m) { Relocate(m); for (auto& module : m_modules) {