mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-12-09 21:07:41 +00:00
Match and link OSReset
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user