libkernel: improve module finding in sceKernelLoadStartModule (#2541)

* libkernel: improve module finding in sceKernelLoadStartModule

* clang-format

* asserts for system module

* fixes

* linting

* cleaning

* fix linker impl
This commit is contained in:
panzone91 2025-03-09 22:44:17 +01:00 committed by GitHub
parent 20ea0ee190
commit a711f4d86e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 50 additions and 30 deletions

View file

@ -139,6 +139,35 @@ s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) {
return m_modules.size() - 1;
}
s32 Linker::LoadAndStartModule(const std::filesystem::path& path, u64 args, const void* argp,
int* pRes) {
u32 handle = FindByName(path);
if (handle != -1) {
return handle;
}
handle = LoadModule(path, true);
if (handle == -1) {
return -1;
}
auto* module = GetModule(handle);
RelocateAnyImports(module);
// If the new module has a TLS image, trigger its load when TlsGetAddr is called.
if (module->tls.image_size != 0) {
AdvanceGenerationCounter();
}
// Retrieve and verify proc param according to libkernel.
u64* param = module->GetProcParam<u64*>();
ASSERT_MSG(!param || param[0] >= 0x18, "Invalid module param size: {}", param[0]);
s32 ret = module->Start(args, argp, param);
if (pRes) {
*pRes = ret;
}
return handle;
}
Module* Linker::FindByAddress(VAddr address) {
for (auto& module : m_modules) {
const VAddr base = module->GetBaseAddress();