2022-05-31 18:28:17 +00:00
|
|
|
|
#include "global.h"
|
|
|
|
|
|
|
|
|
|
s32 Overlay_Load(uintptr_t vRomStart, uintptr_t vRomEnd, void* vRamStart, void* vRamEnd, void* allocatedVRamAddr) {
|
|
|
|
|
s32 pad[3];
|
|
|
|
|
uintptr_t end;
|
|
|
|
|
OverlayRelocationSection* ovl;
|
|
|
|
|
u32 ovlOffset;
|
|
|
|
|
size_t size;
|
|
|
|
|
|
|
|
|
|
size = vRomEnd - vRomStart;
|
|
|
|
|
end = (uintptr_t)allocatedVRamAddr + size;
|
|
|
|
|
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
// "Start loading dynamic link function"
|
|
|
|
|
osSyncPrintf("\nダイナミックリンクファンクションのロードを開始します\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
// "DMA transfer of TEXT, DATA, RODATA + rel (%08x-%08x)"
|
|
|
|
|
osSyncPrintf("TEXT,DATA,RODATA+relをDMA転送します(%08x-%08x)\n", allocatedVRamAddr, end);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DmaMgr_SendRequest0(allocatedVRamAddr, vRomStart, size);
|
|
|
|
|
|
|
|
|
|
ovlOffset = ((s32*)end)[-1];
|
|
|
|
|
|
|
|
|
|
ovl = (OverlayRelocationSection*)(end - ovlOffset);
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
osSyncPrintf("TEXT(%08x), DATA(%08x), RODATA(%08x), BSS(%08x)\n", ovl->textSize, ovl->dataSize, ovl->rodataSize,
|
|
|
|
|
ovl->bssSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
osSyncPrintf("リロケーションします\n"); // "Relocate"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Overlay_Relocate(allocatedVRamAddr, ovl, vRamStart);
|
|
|
|
|
|
|
|
|
|
if (ovl->bssSize != 0) {
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
// "Clear BSS area (% 08x-% 08x)"
|
|
|
|
|
osSyncPrintf("BSS領域をクリアします(%08x-%08x)\n", end, end + ovl->bssSize);
|
|
|
|
|
}
|
2022-06-16 00:15:44 +00:00
|
|
|
|
bzero((void*)end, ovl->bssSize);
|
2022-05-31 18:28:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size = (uintptr_t)&ovl->relocations[ovl->nRelocations] - (uintptr_t)ovl;
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
// "Clear REL area (%08x-%08x)"
|
|
|
|
|
osSyncPrintf("REL領域をクリアします(%08x-%08x)\n", ovl, (uintptr_t)ovl + size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bzero(ovl, size);
|
|
|
|
|
|
|
|
|
|
size = (uintptr_t)vRamEnd - (uintptr_t)vRamStart;
|
|
|
|
|
osWritebackDCache(allocatedVRamAddr, size);
|
|
|
|
|
osInvalICache(allocatedVRamAddr, size);
|
|
|
|
|
|
|
|
|
|
if (gOverlayLogSeverity >= 3) {
|
|
|
|
|
// "Finish loading dynamic link function"
|
|
|
|
|
osSyncPrintf("ダイナミックリンクファンクションのロードを終了します\n\n");
|
|
|
|
|
}
|
|
|
|
|
return size;
|
|
|
|
|
}
|