diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp index ef5f460036..bec069bfdc 100644 --- a/Source/Core/Core/Boot/Boot.cpp +++ b/Source/Core/Core/Boot/Boot.cpp @@ -21,7 +21,6 @@ #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/Debugger/Debugger_SymbolMap.h" -#include "Core/GeckoCode.h" #include "Core/HLE/HLE.h" #include "Core/HW/DVD/DVDInterface.h" #include "Core/HW/EXI/EXI_DeviceIPL.h" @@ -479,19 +478,6 @@ bool CBoot::BootUp() } } - // HLE jump to loader (homebrew). Disabled when Gecko is active as it interferes with the code - // handler - if (!SConfig::GetInstance().bEnableCheats) - { - HLE::Patch(0x80001800, "HBReload"); - Memory::CopyToEmu(0x00001804, "STUBHAXX", 8); - } - - // Not part of the binary itself, but either we or Gecko OS might insert - // this, and it doesn't clear the icache properly. - HLE::Patch(Gecko::ENTRY_POINT, "GeckoCodehandler"); - // This has to always be installed even if cheats are not enabled because of the possiblity of - // loading a savestate where PC is inside the code handler while cheats are disabled. - HLE::Patch(Gecko::HLE_TRAMPOLINE_ADDRESS, "GeckoHandlerReturnTrampoline"); + HLE::PatchFixedFunctions(); return true; } diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index 47a537e296..ba10d0aeb8 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -785,10 +785,8 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id, u64 title_id, u // TODO: have a callback mechanism for title changes? g_symbolDB.Clear(); CBoot::LoadMapFromFilename(); - HLE::Clear(); - HLE::PatchFunctions(); - PatchEngine::Shutdown(); - PatchEngine::LoadPatches(); + HLE::Reload(); + PatchEngine::Reload(); HiresTexture::Update(); } } diff --git a/Source/Core/Core/HLE/HLE.cpp b/Source/Core/Core/HLE/HLE.cpp index b32d269355..e2e2a20919 100644 --- a/Source/Core/Core/HLE/HLE.cpp +++ b/Source/Core/Core/HLE/HLE.cpp @@ -10,6 +10,7 @@ #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/Debugger/Debugger_SymbolMap.h" +#include "Core/GeckoCode.h" #include "Core/HLE/HLE.h" #include "Core/HLE/HLE_Misc.h" #include "Core/HLE/HLE_OS.h" @@ -88,6 +89,24 @@ void Patch(u32 addr, const char* hle_func_name) } } +void PatchFixedFunctions() +{ + // HLE jump to loader (homebrew). Disabled when Gecko is active as it interferes with the code + // handler + if (!SConfig::GetInstance().bEnableCheats) + { + Patch(0x80001800, "HBReload"); + Memory::CopyToEmu(0x00001804, "STUBHAXX", 8); + } + + // Not part of the binary itself, but either we or Gecko OS might insert + // this, and it doesn't clear the icache properly. + Patch(Gecko::ENTRY_POINT, "GeckoCodehandler"); + // This has to always be installed even if cheats are not enabled because of the possiblity of + // loading a savestate where PC is inside the code handler while cheats are disabled. + Patch(Gecko::HLE_TRAMPOLINE_ADDRESS, "GeckoHandlerReturnTrampoline"); +} + void PatchFunctions() { // Remove all hooks that aren't fixed address hooks @@ -141,6 +160,13 @@ void Clear() s_original_instructions.clear(); } +void Reload() +{ + Clear(); + PatchFixedFunctions(); + PatchFunctions(); +} + void Execute(u32 _CurrentPC, u32 _Instruction) { unsigned int FunctionIndex = _Instruction & 0xFFFFF; diff --git a/Source/Core/Core/HLE/HLE.h b/Source/Core/Core/HLE/HLE.h index 61b50a8e72..8cc513124f 100644 --- a/Source/Core/Core/HLE/HLE.h +++ b/Source/Core/Core/HLE/HLE.h @@ -24,8 +24,10 @@ enum HookFlag HLE_TYPE_FIXED = 2, // An arbitrary hook mapped to a fixed address instead of a symbol }; +void PatchFixedFunctions(); void PatchFunctions(); void Clear(); +void Reload(); void Patch(u32 pc, const char* func_name); u32 UnPatch(const std::string& patchName); diff --git a/Source/Core/Core/PatchEngine.cpp b/Source/Core/Core/PatchEngine.cpp index b2d9b17566..87c60e1f11 100644 --- a/Source/Core/Core/PatchEngine.cpp +++ b/Source/Core/Core/PatchEngine.cpp @@ -246,4 +246,10 @@ void Shutdown() Gecko::Shutdown(); } +void Reload() +{ + Shutdown(); + LoadPatches(); +} + } // namespace diff --git a/Source/Core/Core/PatchEngine.h b/Source/Core/Core/PatchEngine.h index 2d70bf4cf8..b1e7b2ba02 100644 --- a/Source/Core/Core/PatchEngine.h +++ b/Source/Core/Core/PatchEngine.h @@ -45,6 +45,7 @@ void LoadPatchSection(const std::string& section, std::vector& patches, I void LoadPatches(); bool ApplyFramePatches(); void Shutdown(); +void Reload(); inline int GetPatchTypeCharLength(PatchType type) {