diff --git a/Core/Config.cpp b/Core/Config.cpp index fd0496a966..b3eb460078 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -60,6 +60,7 @@ void Config::Load(const char *iniFileName) general->Get("Recent", recentIsos); general->Get("WindowX", &iWindowX, 40); general->Get("WindowY", &iWindowY, 100); + general->Get("AutoSaveSymbolMap", &bAutoSaveSymbolMap, false); if (recentIsos.size() > MAX_RECENT) recentIsos.resize(MAX_RECENT); @@ -139,6 +140,7 @@ void Config::Save() general->Set("Recent", recentIsos); general->Set("WindowX", iWindowX); general->Set("WindowY", iWindowY); + general->Set("AutoSaveSymbolMap", bAutoSaveSymbolMap); IniFile::Section *cpu = iniFile.GetOrCreateSection("CPU"); cpu->Set("Jit", bJit); diff --git a/Core/Config.h b/Core/Config.h index 6c963150cb..026da45c7e 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -44,6 +44,7 @@ public: bool bIgnoreBadMemAccess; bool bFastMemory; bool bJit; + bool bAutoSaveSymbolMap; std::string sReportHost; std::vector recentIsos; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 86340bc514..e127ca36e9 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -391,6 +391,10 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro dontadd = true; } } + else if (host->AttemptLoadSymbolMap()) + { + dontadd = true; + } INFO_LOG(LOADER,"Module %s: %08x %08x %08x", modinfo->name, modinfo->gp, modinfo->libent,modinfo->libstub); diff --git a/Core/Host.h b/Core/Host.h index 4d346b5921..966af3748a 100644 --- a/Core/Host.h +++ b/Core/Host.h @@ -57,6 +57,7 @@ public: virtual bool IsDebuggingEnabled() {return true;} virtual bool AttemptLoadSymbolMap() {return false;} + virtual void SaveSymbolMap() {} virtual void SetWindowTitle(const char *message) {} virtual void SendCoreWait(bool) {} diff --git a/Core/System.cpp b/Core/System.cpp index a15f1675fa..a17329b1e2 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -76,6 +76,8 @@ bool PSP_Init(const CoreParameter &coreParam, std::string *error_string) mipsr4k.Reset(); mipsr4k.pc = 0; + host->AttemptLoadSymbolMap(); + if (coreParameter.enableSound) { mixer = new PSPMixer(); @@ -126,6 +128,9 @@ void PSP_Shutdown() CoreTiming::Shutdown(); + if (g_Config.bAutoSaveSymbolMap) + host->SaveSymbolMap(); + if (coreParameter.enableSound) { host->ShutdownSound(); diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 4be966281c..500b211aed 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -80,7 +80,6 @@ EmuScreen::EmuScreen(const std::string &filename) : invalid_(true) { } host->BootDone(); - host->AttemptLoadSymbolMap(); host->UpdateDisassembly(); #ifdef _WIN32 @@ -99,8 +98,6 @@ EmuScreen::EmuScreen(const std::string &filename) : invalid_(true) { EmuScreen::~EmuScreen() { if (!invalid_) { // If we were invalid, it would already be shutdown. - - // symbolMap.SaveSymbolMap(SymbolMapFilename(coreParam.fileToStart).c_str()); PSP_Shutdown(); } } diff --git a/Windows/WindowsHost.cpp b/Windows/WindowsHost.cpp index 87ff538cc0..6ce7777e04 100644 --- a/Windows/WindowsHost.cpp +++ b/Windows/WindowsHost.cpp @@ -155,7 +155,16 @@ static std::string SymbolMapFilename(const char *currentFilename) bool WindowsHost::AttemptLoadSymbolMap() { - return symbolMap.LoadSymbolMap(SymbolMapFilename(PSP_CoreParameter().fileToStart.c_str()).c_str()); + if (loadedSymbolMap_) + return true; + loadedSymbolMap_ = symbolMap.LoadSymbolMap(SymbolMapFilename(PSP_CoreParameter().fileToStart.c_str()).c_str()); + return loadedSymbolMap_; +} + +void WindowsHost::SaveSymbolMap() +{ + symbolMap.SaveSymbolMap(SymbolMapFilename(PSP_CoreParameter().fileToStart.c_str()).c_str()); + loadedSymbolMap_ = false; } void WindowsHost::AddSymbol(std::string name, u32 addr, u32 size, int type=0) diff --git a/Windows/WindowsHost.h b/Windows/WindowsHost.h index 268abcba59..5653f311fe 100644 --- a/Windows/WindowsHost.h +++ b/Windows/WindowsHost.h @@ -28,6 +28,7 @@ public: mainWindow_ = mainWindow; displayWindow_ = displayWindow; input = getInputDevices(); + loadedSymbolMap_ = false; } void UpdateMemView(); void UpdateDisassembly(); @@ -47,10 +48,12 @@ public: bool IsDebuggingEnabled(); void BootDone(); bool AttemptLoadSymbolMap(); + void SaveSymbolMap(); void SetWindowTitle(const char *message); private: HWND displayWindow_; HWND mainWindow_; std::list> input; + bool loadedSymbolMap_; }; \ No newline at end of file