diff --git a/include/fault.h b/include/fault.h index d72b9691c4..c398a003cd 100644 --- a/include/fault.h +++ b/include/fault.h @@ -72,6 +72,8 @@ void Fault_DrawText(s32 x, s32 y, const char* fmt, ...); #if PLATFORM_N64 +void func_800AE1F8(void); + // Not implemented. Silently noop-ing is fine, these are not essential for functionality. #define Fault_SetFontColor(color) (void)0 #define Fault_SetCharPad(padW, padH) (void)0 @@ -90,6 +92,7 @@ s32 Fault_VPrintf(const char* fmt, va_list args); #if PLATFORM_N64 extern vs32 gFaultMsgId; +extern volatile OSThread* gFaultFaultedThread; #define FAULT_MSG_ID gFaultMsgId diff --git a/src/code/fault_n64.c b/src/code/fault_n64.c index 92fd0cc8db..2a4a423a6d 100644 --- a/src/code/fault_n64.c +++ b/src/code/fault_n64.c @@ -93,7 +93,7 @@ FaultCursorCoords sFaultCursorPos; vs32 sFaultExit; vs32 gFaultMsgId; vs32 sFaultDisplayEnable; -OSThread* sFaultFaultedThread; +volatile OSThread* gFaultFaultedThread; s32 B_80122570[16]; s32 B_801225B0[8]; // Unused (file padding?) @@ -768,7 +768,7 @@ void Fault_ThreadEntry(void* arg0) { osSyncPrintf("FindFaultedThread()=%08x\n", faultedThread); } } while (faultedThread == NULL); - sFaultFaultedThread = faultedThread; + gFaultFaultedThread = faultedThread; Fault_LogThreadContext(faultedThread); osSyncPrintf("%d %s %d:%s = %d\n", osGetThreadId(NULL), "fault.c", 1454, "fault_display_enable", sFaultDisplayEnable); diff --git a/src/code/z_actor_dlftbls.c b/src/code/z_actor_dlftbls.c index 05e7e8d3f4..6e1fdb97cf 100644 --- a/src/code/z_actor_dlftbls.c +++ b/src/code/z_actor_dlftbls.c @@ -98,19 +98,47 @@ void ActorOverlayTable_LogPrint(void) { void ActorOverlayTable_FaultPrint(void* arg0, void* arg1) { ActorOverlay* overlayEntry; u32 overlaySize; + uintptr_t ramStart; + uintptr_t ramEnd; + u32 offset; +#if PLATFORM_N64 + uintptr_t pc = gFaultFaultedThread != NULL ? gFaultFaultedThread->context.pc : 0; + uintptr_t ra = gFaultFaultedThread != NULL ? gFaultFaultedThread->context.ra : 0; + u32 i; +#else s32 i; +#endif +#if PLATFORM_N64 + func_800AE1F8(); + + Fault_Printf("actor_dlftbls %u\n", gMaxActorId); + Fault_Printf("No. RamStart-RamEnd Offset\n"); +#else Fault_SetCharPad(-2, 0); Fault_Printf("actor_dlftbls %u\n", gMaxActorId); Fault_Printf("No. RamStart- RamEnd cn Name\n"); +#endif for (i = 0, overlayEntry = &gActorOverlayTable[0]; i < gMaxActorId; i++, overlayEntry++) { overlaySize = (uintptr_t)overlayEntry->vramEnd - (uintptr_t)overlayEntry->vramStart; - if (overlayEntry->loadedRamAddr != NULL) { - Fault_Printf("%3d %08x-%08x %3d %s\n", i, overlayEntry->loadedRamAddr, - (uintptr_t)overlayEntry->loadedRamAddr + overlaySize, overlayEntry->numLoaded, + ramStart = (uintptr_t)overlayEntry->loadedRamAddr; + ramEnd = ramStart + overlaySize; + offset = (uintptr_t)overlayEntry->vramStart - ramStart; + if (ramStart != 0) { +#if PLATFORM_N64 + Fault_Printf("%3d %08x-%08x %08x", i, ramStart, ramEnd, offset); + if (ramStart <= pc && pc < ramEnd) { + Fault_Printf(" PC:%08x", pc + offset); + } else if (ramStart <= ra && ra < ramEnd) { + Fault_Printf(" RA:%08x", ra + offset); + } + Fault_Printf("\n"); +#else + Fault_Printf("%3d %08x-%08x %3d %s\n", i, ramStart, ramEnd, overlayEntry->numLoaded, (OOT_DEBUG && overlayEntry->name != NULL) ? overlayEntry->name : ""); +#endif } } }