POPS: Boot converted PBPs with firmware 4.05

The user modules started after the manager now come from the firmware's
own boot configuration (pspbtcnf.bin's POPS mode), since they differ by
version: 4.05's pafmini.prx needs heaparea2.prx first. 6.60's also
lists common_util.prx, which wasn't started before.

4.05 renumbered the kernel NIDs again. Its aliases are checked like
5.55's, and the sysreg ones by what they do to the registers: the call
sites got five of those wrong. Its manager allocates from a pool with
the kernel's sceKernelAllocateFpl, which stays unresolved for kernel
modules (see ThreadManForKernel), so only the manager's import gets the
user one. scePower_driver gets 6.60's clock frequency NID, which 6.20's
and 4.05's old one now map to.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Henrik RydgårdandClaude Opus 5.5 committed 2026-10-21 13:15:30 +02:00
1 parent 3c72cc29ab
commit 2924e3a090
5 files changed
+106 -16

No files matched your search

+16
View File
@@ -521,6 +521,22 @@ u32 KernelFindModuleExport(const char *libraryName, u32 nid) {
return 0;
}
u32 KernelFindModuleImport(const char *moduleName, const char *libraryName, u32 nid) {
u32 error;
for (SceUID moduleId : loadedModules) {
PSPModule *module = kernelObjects.Get<PSPModule>(moduleId, error);
if (!module || strcmp(module->GetName(), moduleName) != 0) {
continue;
}
for (const FuncSymbolImport &func : module->importedFuncs) {
if (func.nid == nid && !strncmp(func.moduleName, libraryName, KERNELOBJECT_MAX_NAME_LENGTH)) {
return func.stubAddr;
}
}
}
return 0;
}
// Set once we've seen a PSP_MODULE_VSH_MODE module load (i.e. we're booting the VSH rather
// than a game), and reset on the next __KernelLoadExec. See ShouldHLEModuleForLoad below.
static bool g_runningVSH = false;