From 8fe9bedb78f8b07dcb7d57461eb010ff485dc569 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 16 Jan 2021 19:32:37 -0800 Subject: [PATCH] Module: Keep the state for each import. On exports, we iterate modules then imports. But on imports, we iterate the exports to find the module, so we need to keep the state around higher up. --- Core/HLE/sceKernelModule.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index d0b532741e..45c6d2d929 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -117,6 +117,8 @@ static const char * const blacklistedModules[] = { "sceMD5_Library", }; +struct WriteVarSymbolState; + struct VarSymbolImport { char moduleName[KERNELOBJECT_MAX_NAME_LENGTH + 1]; u32 nid; @@ -150,7 +152,7 @@ struct FuncSymbolExport { u32 nid; }; -void ImportVarSymbol(const VarSymbolImport &var); +void ImportVarSymbol(WriteVarSymbolState &state, const VarSymbolImport &var); void ExportVarSymbol(const VarSymbolExport &var); void UnexportVarSymbol(const VarSymbolExport &var); @@ -378,11 +380,11 @@ public: ImportFuncSymbol(func, reimporting, GetName()); } - void ImportVar(const VarSymbolImport &var) { + void ImportVar(WriteVarSymbolState &state, const VarSymbolImport &var) { // Keep track and actually hook it up if possible. importedVars.push_back(var); impExpModuleNames.insert(var.moduleName); - ImportVarSymbol(var); + ImportVarSymbol(state, var); } void ExportFunc(const FuncSymbolExport &func) { @@ -667,7 +669,7 @@ static void WriteVarSymbol(WriteVarSymbolState &state, u32 exportAddress, u32 re currentMIPS->InvalidateICache(relocAddress, 4); } -void ImportVarSymbol(const VarSymbolImport &var) { +void ImportVarSymbol(WriteVarSymbolState &state, const VarSymbolImport &var) { if (var.nid == 0) { // TODO: What's the right thing for this? ERROR_LOG_REPORT(LOADER, "Var import with nid = 0, type = %d", var.type); @@ -687,7 +689,6 @@ void ImportVarSymbol(const VarSymbolImport &var) { } // Look for exports currently loaded modules already have. Maybe it's available? - WriteVarSymbolState state; for (const auto &exported : module->exportedVars) { if (exported.Matches(var)) { WriteVarSymbol(state, exported.symAddr, var.stubAddr, var.type); @@ -1053,12 +1054,13 @@ static bool KernelImportModuleFuncs(PSPModule *module, u32 *firstImportStubAddr, continue; } + WriteVarSymbolState state; u32_le *varRef = (u32_le *)Memory::GetPointer(varRefsPtr); for (; *varRef != 0; ++varRef) { var.nid = nid; var.stubAddr = (*varRef & 0x03FFFFFF) << 2; var.type = *varRef >> 26; - module->ImportVar(var); + module->ImportVar(state, var); } } } else if (entry->numVars > 0 && !reimporting) {