You've already forked pico-loader
mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-01-09 16:28:35 -08:00
98 lines
4.0 KiB
C++
98 lines
4.0 KiB
C++
#include "common.h"
|
|
#include "../PatchContext.h"
|
|
#include "OsGetInitArenaLoPatch.h"
|
|
|
|
static const u32 sOSGetInitArenaLoPatternOld[] = { 0xE3A0050Eu, 0xE59F1014u, 0xE351050Eu, 0x81A00001u }; // -0x34
|
|
static const u32 sOSGetInitArenaLoPattern[] = { 0xE59F1018u, 0xE3A0050Eu, 0xE351050Eu, 0x81A00001u }; // -0x34
|
|
static const u32 sOSGetInitArenaLoPattern2[] = { 0xE59F101Cu, 0xE3A0050Eu, 0xE351050Eu, 0x81A00001u }; // -0x3C
|
|
static const u32 sOSGetInitArenaLoPatternThumb[] = { 0xD0042801u, 0xD0042807u, 0xD0092808u, 0x4809E00Fu };
|
|
static const u32 sOSGetInitArenaLoPatternThumbSdk50[] = { 0x2801B508u, 0x2807D004u, 0x2808D006u, 0xE010D00Au };
|
|
|
|
bool OsGetInitArenaLoPatch::FindPatchTarget(PatchContext& patchContext)
|
|
{
|
|
if (_osGetInitArenaLo)
|
|
return true;
|
|
_osGetInitArenaLo = patchContext.FindPattern32(sOSGetInitArenaLoPattern, sizeof(sOSGetInitArenaLoPattern));
|
|
if (!_osGetInitArenaLo)
|
|
_osGetInitArenaLo = patchContext.FindPattern32(sOSGetInitArenaLoPatternOld, sizeof(sOSGetInitArenaLoPatternOld));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_osGetInitArenaLo -= 13;
|
|
_wramBssOffset = 0x54;
|
|
}
|
|
else
|
|
{
|
|
_osGetInitArenaLo = patchContext.FindPattern32(sOSGetInitArenaLoPattern2, sizeof(sOSGetInitArenaLoPattern2));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_osGetInitArenaLo -= 15;
|
|
_wramBssOffset = 0x60;
|
|
}
|
|
else
|
|
{
|
|
_osGetInitArenaLo = patchContext.FindPattern32(sOSGetInitArenaLoPatternThumb, sizeof(sOSGetInitArenaLoPatternThumb));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_wramBssOffset = 0x38;
|
|
}
|
|
else
|
|
{
|
|
_osGetInitArenaLo = patchContext.FindPattern32(sOSGetInitArenaLoPatternThumbSdk50, sizeof(sOSGetInitArenaLoPatternThumbSdk50));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_wramBssOffset = 0x40;
|
|
}
|
|
else
|
|
{
|
|
_osGetInitArenaLo = patchContext.FindPattern32Twl(sOSGetInitArenaLoPattern, sizeof(sOSGetInitArenaLoPattern));
|
|
if (!_osGetInitArenaLo)
|
|
_osGetInitArenaLo = patchContext.FindPattern32Twl(sOSGetInitArenaLoPatternOld, sizeof(sOSGetInitArenaLoPatternOld));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_osGetInitArenaLo -= 13;
|
|
_wramBssOffset = 0x54;
|
|
}
|
|
else
|
|
{
|
|
_osGetInitArenaLo = patchContext.FindPattern32Twl(sOSGetInitArenaLoPattern2, sizeof(sOSGetInitArenaLoPattern2));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_osGetInitArenaLo -= 15;
|
|
_wramBssOffset = 0x60;
|
|
}
|
|
else
|
|
{
|
|
_osGetInitArenaLo = patchContext.FindPattern32Twl(sOSGetInitArenaLoPatternThumb, sizeof(sOSGetInitArenaLoPatternThumb));
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
_wramBssOffset = 0x38;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (_osGetInitArenaLo)
|
|
{
|
|
LOG_DEBUG("Found OS_GetInitArenaLo at %p\n", _osGetInitArenaLo);
|
|
_wramBssEnd = (void*)*(u32*)((u8*)_osGetInitArenaLo + _wramBssOffset);
|
|
LOG_DEBUG("Bss end: 0x%p\n", _wramBssEnd);
|
|
_mainMemoryArenaLo = (void*)*(u32*)((u8*)_osGetInitArenaLo + _wramBssOffset - 4);
|
|
LOG_DEBUG("Main memory arena lo: 0x%p\n", _mainMemoryArenaLo);
|
|
}
|
|
else
|
|
{
|
|
LOG_WARNING("OS_GetInitArenaLo not found\n");
|
|
}
|
|
return _osGetInitArenaLo != nullptr;
|
|
}
|
|
|
|
void OsGetInitArenaLoPatch::ApplyPatch(PatchContext& patchContext)
|
|
{
|
|
if (!_osGetInitArenaLo)
|
|
return;
|
|
*(u32*)((u8*)_osGetInitArenaLo + _wramBssOffset) = (u32)_wramBssEnd;
|
|
*(u32*)((u8*)_osGetInitArenaLo + _wramBssOffset - 4) = (u32)_mainMemoryArenaLo;
|
|
}
|