Match and link OSReset

This commit is contained in:
2022-10-11 00:01:27 -07:00
parent 111a04b74f
commit fecef57a18
6 changed files with 91 additions and 14 deletions

View File

@@ -1,4 +1,6 @@
#include "dolphin/os/OSReset.h"
#include "dolphin/OSRtcPriv.h"
#include "dolphin/os.h"
#include "dolphin/vi.h"
volatile u8 DAT_800030e2 : 0x800030e2;
typedef struct Unk {
@@ -52,10 +54,9 @@ void OSRegisterResetFunction(OSResetFunctionInfo* func) {
tmp->next = func;
}
s32 __OSCallResetFunctions(s32 arg0) {
BOOL __OSCallResetFunctions(u32 arg0) {
OSResetFunctionInfo* iter;
s32 retCode = 0;
u32 ret;
for (iter = ResetFunctionQueue.first; iter != NULL; iter = iter->next) {
retCode |= !iter->func(arg0);
@@ -72,9 +73,9 @@ asm void Reset(register s32 resetCode) {
nofralloc
b lbl_8038315C
lbl_80383140:
mfspr r8, 0x3f0
mfspr r8, HID0
ori r8, r8, 8
mtspr 0x3f0, r8
mtspr HID0, r8
isync
sync
nop
@@ -82,9 +83,9 @@ lbl_80383140:
lbl_8038315C:
b lbl_8038317C
lbl_80383160:
mftb r5, 0x10c
mftb r5, 268
lbl_80383164:
mftb r6, 0x10c
mftb r6, 268
subf r7, r5, r6
cmplwi r7, 0x1124
blt lbl_80383164
@@ -110,14 +111,76 @@ lbl_803831A8:
// clang-format on
}
OSThreadQueue __OSActiveThreadQueue : (OS_BASE_CACHED | 0x00DC);
static void KillThreads(void) {
OSThread* thread;
OSThread* next;
for (thread = __OSActiveThreadQueue.head; thread; thread = next) {
next = thread->linkActive.next;
switch (thread->state) {
case 1:
case 4:
OSCancelThread(thread);
break;
default:
break;
}
}
}
void __OSDoHotReset(s32 arg0) {
OSDisableInterrupts();
DAT_cc002000._2 = 0;
__VIRegs[1] = 0;
ICFlashInvalidate();
Reset(arg0 * 8);
}
void OSResetSystem(int reset, u32 resetCode, BOOL forceMenu) {}
void OSResetSystem(int reset, u32 resetCode, BOOL forceMenu) {
BOOL rc;
BOOL disableRecalibration;
u32 unk[3];
OSDisableScheduler();
__OSStopAudioSystem();
if (reset == OS_RESET_SHUTDOWN) {
disableRecalibration = __PADDisableRecalibration(TRUE);
}
while (!__OSCallResetFunctions(FALSE))
;
if (reset == OS_RESET_HOTRESET && forceMenu) {
OSSram* sram;
sram = __OSLockSram();
sram->flags |= 0x40;
__OSUnlockSram(TRUE);
while (!__OSSyncSram())
;
}
OSDisableInterrupts();
__OSCallResetFunctions(TRUE);
LCDisable();
if (reset == OS_RESET_HOTRESET) {
__OSDoHotReset(resetCode);
} else if (reset == OS_RESET_RESTART) {
KillThreads();
OSEnableScheduler();
__OSReboot(resetCode, forceMenu);
}
KillThreads();
memset(OSPhysicalToCached(0x40), 0, 0xcc - 0x40);
memset(OSPhysicalToCached(0xd4), 0, 0xe8 - 0xd4);
memset(OSPhysicalToCached(0xf4), 0, 0xf8 - 0xf4);
memset(OSPhysicalToCached(0x3000), 0, 0xc0);
memset(OSPhysicalToCached(0x30c8), 0, 0xd4 - 0xc8);
memset(OSPhysicalToCached(0x30e2), 0, 1);
__PADDisableRecalibration(disableRecalibration);
}
u32 OSGetResetCode(void) {
if (DAT_800030e2 != 0) {