diff --git a/Core/Config.cpp b/Core/Config.cpp index 8b7705e5dd..e739e44ebe 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -305,6 +305,7 @@ static ConfigSetting cpuSettings[] = { ReportedConfigSetting("SeparateIOThread", &g_Config.bSeparateIOThread, true), ConfigSetting("FastMemoryAccess", &g_Config.bFastMemory, true), + ReportedConfigSetting("FuncReplacements", &g_Config.bFuncReplacements, true), ReportedConfigSetting("CPUSpeed", &g_Config.iLockedCPUSpeed, 0), ConfigSetting(false), diff --git a/Core/Config.h b/Core/Config.h index f655e66b59..8df0ae0c64 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -84,6 +84,7 @@ public: bool bJit; bool bCheckForNewVersion; bool bForceLagSync; + bool bFuncReplacements; // Definitely cannot be changed while game is running. bool bSeparateCPUThread; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 36b5f0d376..1c8fb46d60 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -447,7 +447,7 @@ void __KernelModuleDoState(PointerWrap &p) p.Do(loadedModules); } - if (g_Config.bFuncHashMap) { + if (g_Config.bFuncReplacements) { MIPSAnalyst::ReplaceFunctions(); } } @@ -973,7 +973,7 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro bool gotSymbols = reader.LoadSymbols(); MIPSAnalyst::ScanForFunctions(module->textStart, module->textEnd, !gotSymbols); #else - if (g_Config.bFuncHashMap) { + if (g_Config.bFuncReplacements) { bool gotSymbols = reader.LoadSymbols(); MIPSAnalyst::ScanForFunctions(module->textStart, module->textEnd, !gotSymbols); } @@ -1137,7 +1137,7 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro bool gotSymbols = reader.LoadSymbols(); MIPSAnalyst::ScanForFunctions(module->textStart, module->textEnd, !gotSymbols); #else - if (g_Config.bFuncHashMap) { + if (g_Config.bFuncReplacements) { bool gotSymbols = reader.LoadSymbols(); MIPSAnalyst::ScanForFunctions(module->textStart, module->textEnd, !gotSymbols); } diff --git a/Core/MIPS/MIPSAnalyst.cpp b/Core/MIPS/MIPSAnalyst.cpp index be49300bb6..bddbd95481 100644 --- a/Core/MIPS/MIPSAnalyst.cpp +++ b/Core/MIPS/MIPSAnalyst.cpp @@ -886,13 +886,16 @@ skip: HashFunctions(); std::string hashMapFilename = GetSysDirectory(DIRECTORY_SYSTEM) + "knownfuncs.ini"; - if (g_Config.bFuncHashMap) { - LoadHashMap(hashMapFilename); - StoreHashMap(hashMapFilename); + if (g_Config.bFuncHashMap || g_Config.bFuncReplacements) { + LoadBuiltinHashMap(); + if (g_Config.bFuncHashMap) { + LoadHashMap(hashMapFilename); + StoreHashMap(hashMapFilename); + } if (insertSymbols) { ApplyHashMap(); } - if (g_Config.bFuncHashMap) { + if (g_Config.bFuncReplacements) { ReplaceFunctions(); } } @@ -1052,8 +1055,7 @@ skip: } } - void LoadHashMap(std::string filename) { - // First insert the hardcoded entries. + void LoadBuiltinHashMap() { HashMapFunc mf; for (size_t i = 0; i < ARRAY_SIZE(hardcodedHashes); i++) { mf.hash = hardcodedHashes[i].hash; @@ -1063,7 +1065,9 @@ skip: mf.hardcoded = true; hashMap.insert(mf); } + } + void LoadHashMap(std::string filename) { FILE *file = File::OpenCFile(filename, "rt"); if (!file) { WARN_LOG(LOADER, "Could not load hash map: %s", filename.c_str()); diff --git a/Core/MIPS/MIPSAnalyst.h b/Core/MIPS/MIPSAnalyst.h index bb25de880f..932d0dda28 100644 --- a/Core/MIPS/MIPSAnalyst.h +++ b/Core/MIPS/MIPSAnalyst.h @@ -107,6 +107,7 @@ namespace MIPSAnalyst void CompileLeafs(); void SetHashMapFilename(std::string filename = ""); + void LoadBuiltinHashMap(); void LoadHashMap(std::string filename); void StoreHashMap(std::string filename = "");