summaryrefslogtreecommitdiff
path: root/src/code/fault.c
diff options
context:
space:
mode:
authorRoman971 <romanlasnier@hotmail.com>2020-03-22 22:19:43 +0100
committerRoman971 <romanlasnier@hotmail.com>2020-03-22 22:20:03 +0100
commit8cfe7cce9f8d8abea794e67510879e751d373a87 (patch)
treec6c46f34d3575f6dc02b98b2b5f5ad88d2b2c64e /src/code/fault.c
parent251aea64ab3e6e8cd6f1d9ed34f514e656724777 (diff)
Format all src C files
Diffstat (limited to 'src/code/fault.c')
-rw-r--r--src/code/fault.c296
1 files changed, 120 insertions, 176 deletions
diff --git a/src/code/fault.c b/src/code/fault.c
index 4af2d6c60..7884c5057 100644
--- a/src/code/fault.c
+++ b/src/code/fault.c
@@ -3,9 +3,8 @@
#include <alloca.h>
#include <vt.h>
-//data
-const char* sExceptionNames[] =
-{
+// data
+const char* sExceptionNames[] = {
"Interrupt",
"TLB modification",
"TLB exception on load",
@@ -32,7 +31,7 @@ const char* sExceptionNames[] =
"Inexact operation",
};
-//bss
+// bss
FaultThreadStruct* sFaultStructPtr;
u8 sFaultIsWaitingForInput;
char sFaultStack[0x600];
@@ -41,23 +40,22 @@ FaultThreadStruct gFaultStruct;
#pragma GLOBAL_ASM("asm/non_matchings/code/fault/pad_800D3F10.s")
-void Fault_SleepImpl(u32 duration)
-{
+void Fault_SleepImpl(u32 duration) {
u64 value = (duration * OS_CPU_COUNTER) / 1000ull;
func_800FF3A0(value);
}
-void Fault_ClientProcessThread(FaultClientContext* ctx)
-{
- if (ctx->callback)
+void Fault_ClientProcessThread(FaultClientContext* ctx) {
+ if (ctx->callback) {
ctx->ret = ctx->callback(ctx->param0, ctx->param1);
+ }
- if (ctx->queue)
+ if (ctx->queue) {
osSendMesg(ctx->queue, ctx->msg, 1);
+ }
}
-void Fault_ProcessClientContext(FaultClientContext* ctx)
-{
+void Fault_ProcessClientContext(FaultClientContext* ctx) {
OSMesgQueue queue;
OSMesg msg;
OSMesg recMsg;
@@ -72,27 +70,23 @@ void Fault_ProcessClientContext(FaultClientContext* ctx)
ctx->queue = &queue;
ctx->msg = NULL;
- if (sFaultStructPtr->currClientThreadSp != 0)
- {
+ if (sFaultStructPtr->currClientThreadSp != 0) {
thread = alloca(sizeof(OSThread));
osCreateThread(thread, 2, Fault_ClientProcessThread, ctx, sFaultStructPtr->currClientThreadSp, 0x7E);
osStartThread(thread);
- }
- else
- {
+ } else {
Fault_ClientProcessThread(ctx);
}
- while (true)
- {
+ while (true) {
osSetTimer(&timer, OS_USEC_TO_CYCLES(1000000), 0, &queue, (OSMesg)timerMsgVal);
osRecvMesg(&queue, &recMsg, 1);
- if (recMsg != (OSMesg)666)
+ if (recMsg != (OSMesg)666) {
break;
+ }
- if (!sFaultIsWaitingForInput)
- {
+ if (!sFaultIsWaitingForInput) {
ctx->ret = -1;
break;
}
@@ -100,15 +94,13 @@ void Fault_ProcessClientContext(FaultClientContext* ctx)
osStopTimer(&timer);
- if (thread != NULL)
- {
+ if (thread != NULL) {
osStopThread(thread);
osDestroyThread(thread);
}
}
-u32 Fault_ProcessClient(u32 callback, u32 param0, u32 param1)
-{
+u32 Fault_ProcessClient(u32 callback, u32 param0, u32 param1) {
FaultClientContext a;
a.callback = callback;
a.param0 = param0;
@@ -120,8 +112,7 @@ u32 Fault_ProcessClient(u32 callback, u32 param0, u32 param1)
#ifdef NON_MATCHING
// minor ordering differences
-void Fault_AddClient(FaultClient* client, void* callback, void* param0, void* param1)
-{
+void Fault_AddClient(FaultClient* client, void* callback, void* param0, void* param1) {
OSIntMask mask;
u32 alreadyExists;
FaultClient* iter;
@@ -130,10 +121,8 @@ void Fault_AddClient(FaultClient* client, void* callback, void* param0, void* pa
mask = osSetIntMask(1);
iter = sFaultStructPtr->clients;
- while (iter)
- {
- if (iter == client)
- {
+ while (iter) {
+ if (iter == client) {
alreadyExists = true;
goto end;
}
@@ -188,8 +177,9 @@ void Fault_RemoveClient(FaultClient* client) {
osSetIntMask(mask);
- if (listIsEmpty)
+ if (listIsEmpty) {
osSyncPrintf(VT_COL(RED, WHITE) "fault_RemoveClient: %08x リスト不整合です\n" VT_RST, client);
+ }
}
#pragma GLOBAL_ASM("asm/non_matchings/code/fault/Fault_AddAddrConvClient.s")
@@ -228,24 +218,23 @@ void Fault_RemoveAddrConvClient(FaultAddrConvClient* client) {
osSetIntMask(mask);
if (listIsEmpty) {
- osSyncPrintf(VT_COL(RED, WHITE) "fault_AddressConverterRemoveClient: %08x は既にリスト中にある\n" VT_RST, client);
+ osSyncPrintf(VT_COL(RED, WHITE) "fault_AddressConverterRemoveClient: %08x は既にリスト中にある\n" VT_RST,
+ client);
}
}
-u32 Fault_ConvertAddress(FaultAddrConvClient* client)
-{
+u32 Fault_ConvertAddress(FaultAddrConvClient* client) {
u32 ret;
FaultAddrConvClient* iter = sFaultStructPtr->addrConvClients;
- while(iter)
- {
- if (iter->callback)
- {
+ while (iter) {
+ if (iter->callback) {
ret = Fault_ProcessClient(iter->callback, client, iter->param);
- if (ret == -1)
+ if (ret == -1) {
Fault_RemoveAddrConvClient(iter);
- else if (ret)
+ } else if (ret) {
return ret;
+ }
}
iter = iter->next;
}
@@ -253,35 +242,29 @@ u32 Fault_ConvertAddress(FaultAddrConvClient* client)
return 0;
}
-void Fault_Sleep(u32 duration)
-{
+void Fault_Sleep(u32 duration) {
Fault_SleepImpl(duration);
}
-void Fault_PadCallback(Input* input)
-{
- //BUG: this function is not called correctly and thus will crash from reading a bad pointer at 0x800C7E4C
+void Fault_PadCallback(Input* input) {
+ // BUG: this function is not called correctly and thus will crash from reading a bad pointer at 0x800C7E4C
func_800C7E08(input, 0);
}
-void Fault_UpdatePadImpl()
-{
+void Fault_UpdatePadImpl() {
sFaultStructPtr->padCallback(&sFaultStructPtr->padInput);
}
#ifdef NON_MATCHING
// ordering differences and possibly regalloc
-u32 Fault_WaitForInputImpl()
-{
+u32 Fault_WaitForInputImpl() {
u16 kDown;
u32 exitDebugger;
s32 count = 600;
Input* curInput = &sFaultStructPtr->padInput;
- while (true)
- {
- while (true)
- {
+ while (true) {
+ while (true) {
Fault_Sleep(0x10);
Fault_UpdatePadImpl();
@@ -316,71 +299,63 @@ u32 Fault_WaitForInputImpl()
#pragma GLOBAL_ASM("asm/non_matchings/code/fault/Fault_WaitForInputImpl.s")
#endif
-void Fault_WaitForInput()
-{
+void Fault_WaitForInput() {
sFaultIsWaitingForInput = 1;
Fault_WaitForInputImpl();
sFaultIsWaitingForInput = 0;
}
-void Fault_DrawRec(s32 x, s32 y, s32 w, s32 h, u16 color)
-{
+void Fault_DrawRec(s32 x, s32 y, s32 w, s32 h, u16 color) {
FaultDrawer_DrawRecImpl(x, y, x + w - 1, y + h - 1, color);
}
-void Fault_FillScreenBlack()
-{
+void Fault_FillScreenBlack() {
FaultDrawer_SetForeColor(0xFFFF);
FaultDrawer_SetBackColor(1);
FaultDrawer_FillScreen();
FaultDrawer_SetBackColor(0);
}
-void Fault_FillScreenRed()
-{
+void Fault_FillScreenRed() {
FaultDrawer_SetForeColor(0xFFFF);
FaultDrawer_SetBackColor(0xF001);
FaultDrawer_FillScreen();
FaultDrawer_SetBackColor(0);
}
-void Fault_DrawCornerRec(u16 color)
-{
+void Fault_DrawCornerRec(u16 color) {
Fault_DrawRec(0x16, 0x10, 8, 1, color);
}
-void Fault_PrintFReg(s32 idx, f32* value)
-{
+void Fault_PrintFReg(s32 idx, f32* value) {
u32 raw = *(u32*)value;
s32 v0 = ((raw & 0x7f800000) >> 0x17) - 0x7f;
- if ((v0 >= -0x7e && v0 < 0x80) || raw == 0)
+ if ((v0 >= -0x7e && v0 < 0x80) || raw == 0) {
FaultDrawer_Printf("F%02d:%14.7e ", idx, *value);
- else
+ } else {
FaultDrawer_Printf("F%02d: %08x(16) ", idx, raw);
+ }
}
-void Fault_LogFReg(s32 idx, f32* value)
-{
+void Fault_LogFReg(s32 idx, f32* value) {
u32 raw = *(u32*)value;
s32 v0 = ((raw & 0x7f800000) >> 0x17) - 0x7f;
- if ((v0 >= -0x7e && v0 < 0x80) || raw == 0)
+ if ((v0 >= -0x7e && v0 < 0x80) || raw == 0) {
osSyncPrintf("F%02d:%14.7e ", idx, *value);
- else
+ } else {
osSyncPrintf("F%02d: %08x(16) ", idx, *(u32*)value);
+ }
}
-void Fault_PrintFPCR(u32 value)
-{
+void Fault_PrintFPCR(u32 value) {
s32 i;
u32 flag = 0x20000;
FaultDrawer_Printf("FPCSR:%08xH ", value);
- for (i = 0; i < 6; i++)
- {
- if (value & flag)
- {
- FaultDrawer_Printf("(%s)", sExceptionNames[i+18]);
+ for (i = 0; i < 6; i++) {
+ if (value & flag) {
+ FaultDrawer_Printf("(%s)", sExceptionNames[i + 18]);
break;
}
flag >>= 1;
@@ -388,30 +363,28 @@ void Fault_PrintFPCR(u32 value)
FaultDrawer_Printf("\n");
}
-void Fault_LogFPCR(u32 value)
-{
+void Fault_LogFPCR(u32 value) {
s32 i;
u32 flag = 0x20000;
osSyncPrintf("FPCSR:%08xH ", value);
- for (i = 0; i < 6; i++)
- {
- if (value & flag)
- {
- osSyncPrintf("(%s)\n", sExceptionNames[i+18]);
+ for (i = 0; i < 6; i++) {
+ if (value & flag) {
+ osSyncPrintf("(%s)\n", sExceptionNames[i + 18]);
break;
}
flag >>= 1;
}
}
-void Fault_PrintThreadContext(OSThread* t)
-{
- __OSThreadContext *ctx;
- s32 causeStrIdx = (s32) ((((u32) t->context.cause >> 2) & 0x1f) << 0x10) >> 0x10;
- if (causeStrIdx == 0x17)
+void Fault_PrintThreadContext(OSThread* t) {
+ __OSThreadContext* ctx;
+ s32 causeStrIdx = (s32)((((u32)t->context.cause >> 2) & 0x1f) << 0x10) >> 0x10;
+ if (causeStrIdx == 0x17) {
causeStrIdx = 0x10;
- if (causeStrIdx == 0x1f)
+ }
+ if (causeStrIdx == 0x1f) {
causeStrIdx = 0x11;
+ }
FaultDrawer_FillScreen();
FaultDrawer_SetCharPad(-2, 4);
@@ -462,14 +435,15 @@ void Fault_PrintThreadContext(OSThread* t)
FaultDrawer_SetCharPad(0, 0);
}
-void Fault_LogThreadContext(OSThread* t)
-{
- __OSThreadContext *ctx;
- s32 causeStrIdx = (s32) ((((u32) t->context.cause >> 2) & 0x1f) << 0x10) >> 0x10;
- if (causeStrIdx == 0x17)
+void Fault_LogThreadContext(OSThread* t) {
+ __OSThreadContext* ctx;
+ s32 causeStrIdx = (s32)((((u32)t->context.cause >> 2) & 0x1f) << 0x10) >> 0x10;
+ if (causeStrIdx == 0x17) {
causeStrIdx = 0x10;
- if (causeStrIdx == 0x1f)
+ }
+ if (causeStrIdx == 0x1f) {
causeStrIdx = 0x11;
+ }
ctx = &t->context;
osSyncPrintf("\n");
@@ -515,26 +489,23 @@ void Fault_LogThreadContext(OSThread* t)
osSyncPrintf("\n");
}
-OSThread* Fault_FindFaultedThread()
-{
+OSThread* Fault_FindFaultedThread() {
OSThread* iter = func_80104140();
- while (iter->priority != -1)
- {
- if (iter->priority > 0 && iter->priority < 0x7f && (iter->flags & 3))
+ while (iter->priority != -1) {
+ if (iter->priority > 0 && iter->priority < 0x7f && (iter->flags & 3)) {
return iter;
+ }
iter = iter->tlnext;
}
return NULL;
}
-void Fault_Wait5Seconds(void)
-{
- OSTime start[2]; //to make the function allocate 0x28 bytes of stack instead of 0x20
+void Fault_Wait5Seconds(void) {
+ OSTime start[2]; // to make the function allocate 0x28 bytes of stack instead of 0x20
start[0] = osGetTime();
- do
- {
+ do {
Fault_Sleep(0x10);
- } while ((osGetTime() - start[0]) < OS_USEC_TO_CYCLES(5000000)+1); //0xdf84759
+ } while ((osGetTime() - start[0]) < OS_USEC_TO_CYCLES(5000000) + 1); // 0xdf84759
sFaultStructPtr->faultActive = true;
}
@@ -561,7 +532,7 @@ void Fault_DrawMemDumpPage(const char* title, u32* addr, u32 param_3) {
Fault_FillScreenBlack();
FaultDrawer_SetCharPad(-2, 0);
- FaultDrawer_DrawText(0x24, 0x12, "%s %08x", title? title : "PrintDump", alignedAddr);
+ FaultDrawer_DrawText(0x24, 0x12, "%s %08x", title ? title : "PrintDump", alignedAddr);
if (alignedAddr >= (u32*)0x80000000 && alignedAddr < (u32*)0xC0000000) {
for (y = 0x1C; y != 0xE2; y += 9) {
FaultDrawer_DrawText(0x18, y, "%06x", writeAddr);
@@ -577,15 +548,13 @@ void Fault_DrawMemDumpPage(const char* title, u32* addr, u32 param_3) {
#ifdef NON_MATCHING
// saved register and stack usage differences
// possibly some minor ordering and regalloc differences
-void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1)
-{
+void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1) {
Input* curInput = &sFaultStructPtr->padInput;
u32 addr = pc;
s32 count;
s32 off;
- while (true)
- {
+ while (true) {
if (addr < 0x80000000)
addr = 0x80000000;
if (addr > 0x807fff00)
@@ -595,8 +564,7 @@ void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1)
Fault_DrawMemDumpPage("Dump", (u32*)addr, 0);
count = 600;
- while (sFaultStructPtr->faultActive)
- {
+ while (sFaultStructPtr->faultActive) {
if (count == 0)
return;
@@ -607,8 +575,7 @@ void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1)
sFaultStructPtr->faultActive = false;
}
- do
- {
+ do {
Fault_Sleep(0x10);
Fault_UpdatePadImpl();
} while (curInput->padPressed == 0);
@@ -652,8 +619,7 @@ void Fault_DrawMemDump(u32 pc, u32 sp, u32 unk0, u32 unk1)
#pragma GLOBAL_ASM("asm/non_matchings/code/fault/Fault_LogStackTrace.s")
-void Fault_ResumeThread(OSThread* t)
-{
+void Fault_ResumeThread(OSThread* t) {
t->context.cause = 0;
t->context.fpcsr = 0;
t->context.pc += 4;
@@ -663,39 +629,39 @@ void Fault_ResumeThread(OSThread* t)
osStartThread(t);
}
-void Fault_CommitFB()
-{
+void Fault_CommitFB() {
u16* fb;
osViSetYScale(1.0f);
osViSetMode(&osViModeNtscLan1);
- osViSetSpecialFeatures(0x42); //gama_disable|dither_fliter_enable_aa_mode3_disable
+ osViSetSpecialFeatures(0x42); // gama_disable|dither_fliter_enable_aa_mode3_disable
osViBlack(false);
- if (sFaultStructPtr->fb)
+ if (sFaultStructPtr->fb) {
fb = sFaultStructPtr->fb;
- else
- {
+ } else {
fb = (u16*)osViGetNextFramebuffer();
- if ((u32)fb == 0x80000000)
+ if ((u32)fb == 0x80000000) {
fb = (u16*)((osMemSize | 0x80000000) - 0x25800);
+ }
}
osViSwapBuffer(fb);
FaultDrawer_SetDrawerFB(fb, 0x140, 0xf0);
}
-void Fault_ProcessClients(void)
-{
+void Fault_ProcessClients(void) {
FaultClient* iter = sFaultStructPtr->clients;
s32 idx = 0;
- while(iter)
- {
- if (iter->callback)
- {
+ while (iter) {
+ if (iter->callback) {
Fault_FillScreenBlack();
FaultDrawer_SetCharPad(-2, 0);
- FaultDrawer_Printf("\x1a""8CallBack (%d) %08x %08x %08x\n""\x1a""7", idx++, iter, iter->param1, iter->param2);
+ FaultDrawer_Printf("\x1a"
+ "8CallBack (%d) %08x %08x %08x\n"
+ "\x1a"
+ "7",
+ idx++, iter, iter->param1, iter->param2);
FaultDrawer_SetCharPad(0, 0);
Fault_ProcessClient(iter->callback, iter->param1, iter->param2);
Fault_WaitForInput();
@@ -705,45 +671,34 @@ void Fault_ProcessClients(void)
}
}
-void Fault_UpdatePad()
-{
+void Fault_UpdatePad() {
Fault_UpdatePadImpl();
}
#ifdef NON_MATCHING
// saved register and stack usage differences
-void Fault_ThreadEntry(void* arg)
-{
+void Fault_ThreadEntry(void* arg) {
OSThread* faultedThread;
OSMesg msg;
osSetEventMesg(OS_EVENT_CPU_BREAK, &sFaultStructPtr->queue, 1);
osSetEventMesg(OS_EVENT_FAULT, &sFaultStructPtr->queue, 2);
- while (true)
- {
- do
- {
+ while (true) {
+ do {
osRecvMesg(&sFaultStructPtr->queue, &msg, 1);
- if (msg == (OSMesg)1)
- {
+ if (msg == (OSMesg)1) {
sFaultStructPtr->msgId = 1;
osSyncPrintf("フォルトマネージャ:OS_EVENT_CPU_BREAKを受信しました\n");
- }
- else if (1 && msg == (OSMesg)2)
- {
+ } else if (1 && msg == (OSMesg)2) {
sFaultStructPtr->msgId = 2;
osSyncPrintf("フォルトマネージャ:OS_EVENT_FAULTを受信しました\n");
- }
- else if (msg == (OSMesg)3)
- {
+ } else if (msg == (OSMesg)3) {
Fault_UpdatePad();
faultedThread = NULL;
continue;
- }
- else
- {
+ } else {
sFaultStructPtr->msgId = 3;
osSyncPrintf("フォルトマネージャ:不明なメッセージを受信しました\n");
}
@@ -751,8 +706,7 @@ void Fault_ThreadEntry(void* arg)
faultedThread = __osGetCurrFaultedThread();
osSyncPrintf("__osGetCurrFaultedThread()=%08x\n", faultedThread);
- if (faultedThread == NULL)
- {
+ if (faultedThread == NULL) {
faultedThread = Fault_FindFaultedThread();
osSyncPrintf("FindFaultedThread()=%08x\n", faultedThread);
}
@@ -769,8 +723,7 @@ void Fault_ThreadEntry(void* arg)
if (sFaultStructPtr->faultActive)
Fault_Wait5Seconds();
- else
- {
+ else {
Fault_DrawCornerRec(0xF801);
Fault_WaitForButtonCombo();
}
@@ -779,8 +732,7 @@ void Fault_ThreadEntry(void* arg)
FaultDrawer_SetForeColor(0xFFFF);
FaultDrawer_SetBackColor(0);
- do
- {
+ do {
Fault_PrintThreadContext(faultedThread);
Fault_LogThreadContext(faultedThread);
Fault_WaitForInput();
@@ -799,10 +751,7 @@ void Fault_ThreadEntry(void* arg)
Fault_WaitForInput();
} while (!sFaultStructPtr->exitDebugger);
- while (!sFaultStructPtr->exitDebugger)
- {
-
- }
+ while (!sFaultStructPtr->exitDebugger) {}
Fault_ResumeThread(faultedThread);
}
@@ -811,14 +760,12 @@ void Fault_ThreadEntry(void* arg)
#pragma GLOBAL_ASM("asm/non_matchings/code/fault/Fault_ThreadEntry.s")
#endif
-void Fault_SetFB(void* fb, u16 w, u16 h)
-{
+void Fault_SetFB(void* fb, u16 w, u16 h) {
sFaultStructPtr->fb = fb;
FaultDrawer_SetDrawerFB(fb, w, h);
}
-void Fault_Start(void)
-{
+void Fault_Start(void) {
sFaultStructPtr = &gFaultStruct;
bzero(sFaultStructPtr, sizeof(FaultThreadStruct));
FaultDrawer_SetDefault();
@@ -832,13 +779,12 @@ void Fault_Start(void)
sFaultStructPtr->faultActive = false;
gFaultStruct.faultHandlerEnabled = true;
osCreateMesgQueue(&sFaultStructPtr->queue, &sFaultStructPtr->msg, 1);
- StackCheck_Init(sFaultThreadInfo, &sFaultStack, sFaultStack+sizeof(sFaultStack), 0, 0x100, "fault");
+ StackCheck_Init(sFaultThreadInfo, &sFaultStack, sFaultStack + sizeof(sFaultStack), 0, 0x100, "fault");
osCreateThread(&sFaultStructPtr->thread, 2, &Fault_ThreadEntry, 0, sFaultThreadInfo, 0x7f);
osStartThread(&sFaultStructPtr->thread);
}
-void Fault_HangupFaultClient(const char* arg0, const char* arg1)
-{
+void Fault_HangupFaultClient(const char* arg0, const char* arg1) {
osSyncPrintf("HungUp on Thread %d\n", osGetThreadId(0));
osSyncPrintf("%s\n", arg0 ? arg0 : "(NULL)");
osSyncPrintf("%s\n", arg1 ? arg1 : "(NULL)");
@@ -847,16 +793,14 @@ void Fault_HangupFaultClient(const char* arg0, const char* arg1)
FaultDrawer_Printf("%s\n", arg1 ? arg1 : "(NULL)");
}
-void Fault_AddHungupAndCrashImpl(const char* arg0, const char* arg1)
-{
+void Fault_AddHungupAndCrashImpl(const char* arg0, const char* arg1) {
FaultClient client;
char padd[4];
Fault_AddClient(&client, &Fault_HangupFaultClient, arg0, arg1);
- *(u32*)0x11111111 = 0; //trigger an exception
+ *(u32*)0x11111111 = 0; // trigger an exception
}
-void Fault_AddHungupAndCrash(const char* filename, u32 line)
-{
+void Fault_AddHungupAndCrash(const char* filename, u32 line) {
char msg[256];
sprintf(msg, "HungUp %s:%d", filename, line);
Fault_AddHungupAndCrashImpl(msg, NULL);