commit
c30ac55cf4
|
@ -43,41 +43,39 @@ struct SPatch
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const SPatch OSPatches[] = {
|
static const SPatch OSPatches[] = {
|
||||||
// Placeholder, OSPatches[0] is the "non-existent function" index
|
// Placeholder, OSPatches[0] is the "non-existent function" index
|
||||||
{"FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC},
|
{"FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction, HookType::Replace, HookFlag::Generic},
|
||||||
|
|
||||||
{"PanicAlert", HLE_Misc::HLEPanicAlert, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG},
|
|
||||||
|
|
||||||
// Name doesn't matter, installed in CBoot::BootUp()
|
// Name doesn't matter, installed in CBoot::BootUp()
|
||||||
{"HBReload", HLE_Misc::HBReload, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC},
|
{"HBReload", HLE_Misc::HBReload, HookType::Replace, HookFlag::Generic},
|
||||||
|
|
||||||
// Debug/OS Support
|
// Debug/OS Support
|
||||||
{"OSPanic", HLE_OS::HLE_OSPanic, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG},
|
{"OSPanic", HLE_OS::HLE_OSPanic, HookType::Replace, HookFlag::Debug},
|
||||||
|
|
||||||
// This needs to be put before vprintf (because vprintf is called indirectly by this)
|
// This needs to be put before vprintf (because vprintf is called indirectly by this)
|
||||||
{"JUTWarningConsole_f", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"JUTWarningConsole_f", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
|
|
||||||
{"OSReport", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"OSReport", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"WUD_DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"WUD_DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"vprintf", HLE_OS::HLE_GeneralDebugVPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"vprintf", HLE_OS::HLE_GeneralDebugVPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"printf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"printf", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"vdprintf", HLE_OS::HLE_LogVDPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"vdprintf", HLE_OS::HLE_LogVDPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"dprintf", HLE_OS::HLE_LogDPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"dprintf", HLE_OS::HLE_LogDPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"vfprintf", HLE_OS::HLE_LogVFPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"vfprintf", HLE_OS::HLE_LogVFPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"fprintf", HLE_OS::HLE_LogFPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"fprintf", HLE_OS::HLE_LogFPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"nlPrintf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"nlPrintf", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"DWC_Printf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG},
|
{"DWC_Printf", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug},
|
||||||
{"puts", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG}, // gcc-optimized printf?
|
{"puts", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug}, // gcc-optimized printf?
|
||||||
{"___blank", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_START, HLE_TYPE_DEBUG}, // used for early init things (normally)
|
{"___blank", HLE_OS::HLE_GeneralDebugPrint, HookType::Start, HookFlag::Debug}, // used for early init things (normally)
|
||||||
{"__write_console", HLE_OS::HLE_write_console, HLE_HOOK_START, HLE_TYPE_DEBUG}, // used by sysmenu (+more?)
|
{"__write_console", HLE_OS::HLE_write_console, HookType::Start, HookFlag::Debug}, // used by sysmenu (+more?)
|
||||||
|
|
||||||
{"GeckoCodehandler", HLE_Misc::GeckoCodeHandlerICacheFlush, HLE_HOOK_START, HLE_TYPE_FIXED},
|
{"GeckoCodehandler", HLE_Misc::GeckoCodeHandlerICacheFlush, HookType::Start, HookFlag::Fixed},
|
||||||
{"GeckoHandlerReturnTrampoline", HLE_Misc::GeckoReturnTrampoline, HLE_HOOK_REPLACE, HLE_TYPE_FIXED},
|
{"GeckoHandlerReturnTrampoline", HLE_Misc::GeckoReturnTrampoline, HookType::Replace, HookFlag::Fixed},
|
||||||
{"AppLoaderReport", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_FIXED} // apploader needs OSReport-like function
|
{"AppLoaderReport", HLE_OS::HLE_GeneralDebugPrint, HookType::Replace, HookFlag::Fixed} // apploader needs OSReport-like function
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SPatch OSBreakPoints[] = {
|
static const SPatch OSBreakPoints[] = {
|
||||||
{"FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction, HLE_HOOK_START, HLE_TYPE_GENERIC},
|
{"FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction, HookType::Start, HookFlag::Generic},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
@ -117,7 +115,7 @@ void PatchFunctions()
|
||||||
// Remove all hooks that aren't fixed address hooks
|
// Remove all hooks that aren't fixed address hooks
|
||||||
for (auto i = s_original_instructions.begin(); i != s_original_instructions.end();)
|
for (auto i = s_original_instructions.begin(); i != s_original_instructions.end();)
|
||||||
{
|
{
|
||||||
if (OSPatches[i->second].flags != HLE_TYPE_FIXED)
|
if (OSPatches[i->second].flags != HookFlag::Fixed)
|
||||||
{
|
{
|
||||||
PowerPC::ppcState.iCache.Invalidate(i->first);
|
PowerPC::ppcState.iCache.Invalidate(i->first);
|
||||||
i = s_original_instructions.erase(i);
|
i = s_original_instructions.erase(i);
|
||||||
|
@ -131,7 +129,7 @@ void PatchFunctions()
|
||||||
for (u32 i = 1; i < ArraySize(OSPatches); ++i)
|
for (u32 i = 1; i < ArraySize(OSPatches); ++i)
|
||||||
{
|
{
|
||||||
// Fixed hooks don't map to symbols
|
// Fixed hooks don't map to symbols
|
||||||
if (OSPatches[i].flags == HLE_TYPE_FIXED)
|
if (OSPatches[i].flags == HookFlag::Fixed)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (const auto& symbol : g_symbolDB.GetSymbolsFromName(OSPatches[i].m_szPatchName))
|
for (const auto& symbol : g_symbolDB.GetSymbolsFromName(OSPatches[i].m_szPatchName))
|
||||||
|
@ -203,19 +201,19 @@ u32 GetFirstFunctionIndex(u32 address)
|
||||||
return first == std::end(s_original_instructions) ? index : 0;
|
return first == std::end(s_original_instructions) ? index : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetFunctionTypeByIndex(u32 index)
|
HookType GetFunctionTypeByIndex(u32 index)
|
||||||
{
|
{
|
||||||
return OSPatches[index].type;
|
return OSPatches[index].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetFunctionFlagsByIndex(u32 index)
|
HookFlag GetFunctionFlagsByIndex(u32 index)
|
||||||
{
|
{
|
||||||
return OSPatches[index].flags;
|
return OSPatches[index].flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsEnabled(int flags)
|
bool IsEnabled(HookFlag flag)
|
||||||
{
|
{
|
||||||
return flags != HLE::HLE_TYPE_DEBUG || SConfig::GetInstance().bEnableDebugging ||
|
return flag != HLE::HookFlag::Debug || SConfig::GetInstance().bEnableDebugging ||
|
||||||
PowerPC::GetMode() == PowerPC::CoreMode::Interpreter;
|
PowerPC::GetMode() == PowerPC::CoreMode::Interpreter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,7 +224,7 @@ u32 UnPatch(const std::string& patch_name)
|
||||||
if (patch == std::end(OSPatches))
|
if (patch == std::end(OSPatches))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (patch->flags == HLE_TYPE_FIXED)
|
if (patch->flags == HookFlag::Fixed)
|
||||||
{
|
{
|
||||||
u32 patch_idx = static_cast<u32>(patch - OSPatches);
|
u32 patch_idx = static_cast<u32>(patch - OSPatches);
|
||||||
u32 addr = 0;
|
u32 addr = 0;
|
||||||
|
|
|
@ -10,18 +10,18 @@
|
||||||
|
|
||||||
namespace HLE
|
namespace HLE
|
||||||
{
|
{
|
||||||
enum HookType
|
enum class HookType
|
||||||
{
|
{
|
||||||
HLE_HOOK_START = 0, // Hook the beginning of the function and execute the function afterwards
|
Start, // Hook the beginning of the function and execute the function afterwards
|
||||||
HLE_HOOK_REPLACE = 1, // Replace the function with the HLE version
|
Replace, // Replace the function with the HLE version
|
||||||
HLE_HOOK_NONE = 2, // Do not hook the function
|
None, // Do not hook the function
|
||||||
};
|
};
|
||||||
|
|
||||||
enum HookFlag
|
enum class HookFlag
|
||||||
{
|
{
|
||||||
HLE_TYPE_GENERIC = 0, // Miscellaneous function
|
Generic, // Miscellaneous function
|
||||||
HLE_TYPE_DEBUG = 1, // Debug output function
|
Debug, // Debug output function
|
||||||
HLE_TYPE_FIXED = 2, // An arbitrary hook mapped to a fixed address instead of a symbol
|
Fixed, // An arbitrary hook mapped to a fixed address instead of a symbol
|
||||||
};
|
};
|
||||||
|
|
||||||
void PatchFixedFunctions();
|
void PatchFixedFunctions();
|
||||||
|
@ -38,8 +38,8 @@ void Execute(u32 _CurrentPC, u32 _Instruction);
|
||||||
u32 GetFunctionIndex(u32 address);
|
u32 GetFunctionIndex(u32 address);
|
||||||
// Returns the HLE function index if the address matches the function start
|
// Returns the HLE function index if the address matches the function start
|
||||||
u32 GetFirstFunctionIndex(u32 address);
|
u32 GetFirstFunctionIndex(u32 address);
|
||||||
int GetFunctionTypeByIndex(u32 index);
|
HookType GetFunctionTypeByIndex(u32 index);
|
||||||
int GetFunctionFlagsByIndex(u32 index);
|
HookFlag GetFunctionFlagsByIndex(u32 index);
|
||||||
|
|
||||||
bool IsEnabled(int flags);
|
bool IsEnabled(HookFlag flag);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/Logging/Log.h"
|
#include "Common/Logging/Log.h"
|
||||||
#include "Common/MsgHandler.h"
|
|
||||||
#include "Core/GeckoCode.h"
|
#include "Core/GeckoCode.h"
|
||||||
#include "Core/HW/CPU.h"
|
#include "Core/HW/CPU.h"
|
||||||
#include "Core/Host.h"
|
#include "Core/Host.h"
|
||||||
|
@ -21,14 +20,6 @@ void UnimplementedFunction()
|
||||||
NPC = LR;
|
NPC = LR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If you want a function to panic, you can rename it PanicAlert :p
|
|
||||||
// Don't know if this is worth keeping.
|
|
||||||
void HLEPanicAlert()
|
|
||||||
{
|
|
||||||
::PanicAlert("HLE: PanicAlert %08x", LR);
|
|
||||||
NPC = LR;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HBReload()
|
void HBReload()
|
||||||
{
|
{
|
||||||
// There isn't much we can do. Just stop cleanly.
|
// There isn't much we can do. Just stop cleanly.
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
namespace HLE_Misc
|
namespace HLE_Misc
|
||||||
{
|
{
|
||||||
void HLEPanicAlert();
|
|
||||||
void UnimplementedFunction();
|
void UnimplementedFunction();
|
||||||
void HBReload();
|
void HBReload();
|
||||||
void GeckoCodeHandlerICacheFlush();
|
void GeckoCodeHandlerICacheFlush();
|
||||||
|
|
|
@ -208,15 +208,15 @@ void CachedInterpreter::Jit(u32 address)
|
||||||
u32 function = HLE::GetFirstFunctionIndex(ops[i].address);
|
u32 function = HLE::GetFirstFunctionIndex(ops[i].address);
|
||||||
if (function != 0)
|
if (function != 0)
|
||||||
{
|
{
|
||||||
int type = HLE::GetFunctionTypeByIndex(function);
|
HLE::HookType type = HLE::GetFunctionTypeByIndex(function);
|
||||||
if (type == HLE::HLE_HOOK_START || type == HLE::HLE_HOOK_REPLACE)
|
if (type == HLE::HookType::Start || type == HLE::HookType::Replace)
|
||||||
{
|
{
|
||||||
int flags = HLE::GetFunctionFlagsByIndex(function);
|
HLE::HookFlag flags = HLE::GetFunctionFlagsByIndex(function);
|
||||||
if (HLE::IsEnabled(flags))
|
if (HLE::IsEnabled(flags))
|
||||||
{
|
{
|
||||||
m_code.emplace_back(WritePC, ops[i].address);
|
m_code.emplace_back(WritePC, ops[i].address);
|
||||||
m_code.emplace_back(Interpreter::HLEFunction, function);
|
m_code.emplace_back(Interpreter::HLEFunction, function);
|
||||||
if (type == HLE::HLE_HOOK_REPLACE)
|
if (type == HLE::HookType::Replace)
|
||||||
{
|
{
|
||||||
m_code.emplace_back(EndBlock, js.downcountAmount);
|
m_code.emplace_back(EndBlock, js.downcountAmount);
|
||||||
m_code.emplace_back();
|
m_code.emplace_back();
|
||||||
|
|
|
@ -105,14 +105,14 @@ int Interpreter::SingleStepInner()
|
||||||
u32 function = HLE::GetFirstFunctionIndex(PC);
|
u32 function = HLE::GetFirstFunctionIndex(PC);
|
||||||
if (function != 0)
|
if (function != 0)
|
||||||
{
|
{
|
||||||
int type = HLE::GetFunctionTypeByIndex(function);
|
HLE::HookType type = HLE::GetFunctionTypeByIndex(function);
|
||||||
if (type == HLE::HLE_HOOK_START || type == HLE::HLE_HOOK_REPLACE)
|
if (type == HLE::HookType::Start || type == HLE::HookType::Replace)
|
||||||
{
|
{
|
||||||
int flags = HLE::GetFunctionFlagsByIndex(function);
|
HLE::HookFlag flags = HLE::GetFunctionFlagsByIndex(function);
|
||||||
if (HLE::IsEnabled(flags))
|
if (HLE::IsEnabled(flags))
|
||||||
{
|
{
|
||||||
HLEFunction(function);
|
HLEFunction(function);
|
||||||
if (type == HLE::HLE_HOOK_START)
|
if (type == HLE::HookType::Start)
|
||||||
{
|
{
|
||||||
// Run the original.
|
// Run the original.
|
||||||
function = 0;
|
function = 0;
|
||||||
|
|
|
@ -803,14 +803,14 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBloc
|
||||||
u32 function = HLE::GetFirstFunctionIndex(ops[i].address);
|
u32 function = HLE::GetFirstFunctionIndex(ops[i].address);
|
||||||
if (function != 0)
|
if (function != 0)
|
||||||
{
|
{
|
||||||
int type = HLE::GetFunctionTypeByIndex(function);
|
HLE::HookType type = HLE::GetFunctionTypeByIndex(function);
|
||||||
if (type == HLE::HLE_HOOK_START || type == HLE::HLE_HOOK_REPLACE)
|
if (type == HLE::HookType::Start || type == HLE::HookType::Replace)
|
||||||
{
|
{
|
||||||
int flags = HLE::GetFunctionFlagsByIndex(function);
|
HLE::HookFlag flags = HLE::GetFunctionFlagsByIndex(function);
|
||||||
if (HLE::IsEnabled(flags))
|
if (HLE::IsEnabled(flags))
|
||||||
{
|
{
|
||||||
HLEFunction(function);
|
HLEFunction(function);
|
||||||
if (type == HLE::HLE_HOOK_REPLACE)
|
if (type == HLE::HookType::Replace)
|
||||||
{
|
{
|
||||||
MOV(32, R(RSCRATCH), PPCSTATE(npc));
|
MOV(32, R(RSCRATCH), PPCSTATE(npc));
|
||||||
js.downcountAmount += js.st.numCycles;
|
js.downcountAmount += js.st.numCycles;
|
||||||
|
|
Loading…
Reference in New Issue