`stackcheck.h` (#1204)

* stackcheck.h

* warning

* Update src/boot_O2/stackcheck.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* Update src/boot_O2/stackcheck.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* Update src/boot_O2/stackcheck.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* stack

* format

* bss

* review

* review

---------

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>
This commit is contained in:
Anghelo Carvajal 2023-04-18 17:50:34 -04:00 committed by GitHub
parent 823746d495
commit 4647ebb91b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 79 additions and 63 deletions

View File

@ -122,11 +122,6 @@ s8 PadUtils_GetRelYImpl(Input* input);
s8 PadUtils_GetRelX(Input* input); s8 PadUtils_GetRelX(Input* input);
s8 PadUtils_GetRelY(Input* input); s8 PadUtils_GetRelY(Input* input);
void PadUtils_UpdateRelXY(Input* input); void PadUtils_UpdateRelXY(Input* input);
void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 initValue, s32 minSpace, const char* name);
void StackCheck_Cleanup(StackEntry* entry);
StackStatus StackCheck_GetState(StackEntry* entry);
u32 StackCheck_CheckAll(void);
u32 StackCheck_Check(StackEntry* entry);
void MtxConv_F2L(Mtx* mtx, MtxF* mf); void MtxConv_F2L(Mtx* mtx, MtxF* mf);
void MtxConv_L2F(MtxF* mtx, Mtx* mf); void MtxConv_L2F(MtxF* mtx, Mtx* mf);

26
include/stackcheck.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef STACKCHECK_H
#define STACKCHECK_H
#include "ultra64.h"
typedef enum StackStatus {
/* 0 */ STACK_STATUS_OK,
/* 1 */ STACK_STATUS_WARNING,
/* 2 */ STACK_STATUS_OVERFLOW
} StackStatus;
typedef struct StackEntry {
/* 0x00 */ struct StackEntry* next;
/* 0x04 */ struct StackEntry* prev;
/* 0x08 */ void* head;
/* 0x0C */ void* tail;
/* 0x10 */ u32 initValue;
/* 0x14 */ s32 minSpace;
/* 0x18 */ const char* name;
} StackEntry; // size = 0x1C
void StackCheck_Init(StackEntry* entry, void* stackBottom, void* stackTop, u32 initValue, s32 minSpace, const char* name);
void StackCheck_Cleanup(StackEntry* entry);
u32 StackCheck_Check(StackEntry* entry);
#endif

View File

@ -37,8 +37,7 @@ extern FaultDrawer* sFaultDrawContext;
extern FaultDrawer sFaultDrawerDefault; extern FaultDrawer sFaultDrawerDefault;
extern s32 gLoadLogSeverity; extern s32 gLoadLogSeverity;
extern s32 gLoad2LogSeverity; extern s32 gLoad2LogSeverity;
extern StackEntry* sStackInfoListStart;
extern StackEntry* sStackInfoListEnd;
// extern UNK_TYPE1 sGfxPrintFontTLUT; // extern UNK_TYPE1 sGfxPrintFontTLUT;
// extern UNK_TYPE1 sGfxPrintRainbowTLUT; // extern UNK_TYPE1 sGfxPrintRainbowTLUT;
// extern UNK_TYPE1 sGfxPrintRainbowData; // extern UNK_TYPE1 sGfxPrintRainbowData;
@ -2451,6 +2450,7 @@ extern OSTime sGraphTaskStartTime;
extern u32 gSegments[NUM_SEGMENTS]; extern u32 gSegments[NUM_SEGMENTS];
extern SchedContext gSchedContext; extern SchedContext gSchedContext;
extern OSThread gGraphThread; extern OSThread gGraphThread;
extern PadMgr gPadMgr; extern PadMgr gPadMgr;

View File

@ -576,22 +576,6 @@ typedef struct {
/* 0x47F */ UNK_TYPE1 pad47F[0x1]; /* 0x47F */ UNK_TYPE1 pad47F[0x1];
} PadMgr; // size = 0x480 } PadMgr; // size = 0x480
typedef struct StackEntry {
/* 0x00 */ struct StackEntry* next;
/* 0x04 */ struct StackEntry* prev;
/* 0x08 */ u32 head;
/* 0x0C */ u32 tail;
/* 0x10 */ u32 initValue;
/* 0x14 */ s32 minSpace;
/* 0x18 */ const char* name;
} StackEntry; // size = 0x1C
typedef enum {
STACK_STATUS_OK = 0,
STACK_STATUS_WARNING = 1,
STACK_STATUS_OVERFLOW = 2
} StackStatus;
#define OS_SC_RETRACE_MSG 1 #define OS_SC_RETRACE_MSG 1
#define OS_SC_DONE_MSG 2 #define OS_SC_DONE_MSG 2
#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c #define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c

View File

@ -1,18 +1,19 @@
#include "global.h" #include "stackcheck.h"
#include "libc/stdbool.h"
#include "libc/stdint.h"
StackEntry* sStackInfoListStart = NULL; StackEntry* sStackInfoListStart = NULL;
StackEntry* sStackInfoListEnd = NULL; StackEntry* sStackInfoListEnd = NULL;
void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 initValue, s32 minSpace, void StackCheck_Init(StackEntry* entry, void* stackBottom, void* stackTop, u32 initValue, s32 minSpace,
const char* name) { const char* name) {
StackEntry* iter; if (entry == NULL) {
u32* addr;
if (!entry) {
sStackInfoListStart = NULL; sStackInfoListStart = NULL;
} else { } else {
entry->head = (u32)stackTop; StackEntry* iter;
entry->tail = (u32)stackBottom;
entry->head = stackBottom;
entry->tail = stackTop;
entry->initValue = initValue; entry->initValue = initValue;
entry->minSpace = minSpace; entry->minSpace = minSpace;
entry->name = name; entry->name = name;
@ -32,13 +33,14 @@ void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 i
} }
sStackInfoListEnd = entry; sStackInfoListEnd = entry;
if (!sStackInfoListStart) { if (sStackInfoListStart == NULL) {
sStackInfoListStart = entry; sStackInfoListStart = entry;
} }
if (entry->minSpace != -1) { if (entry->minSpace != -1) {
addr = (u32*)entry->head; u32* addr = entry->head;
while ((u32)addr < entry->tail) {
while (addr < (u32*)entry->tail) {
*addr++ = entry->initValue; *addr++ = entry->initValue;
} }
} }
@ -46,13 +48,13 @@ void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 i
} }
void StackCheck_Cleanup(StackEntry* entry) { void StackCheck_Cleanup(StackEntry* entry) {
u32 inconsistency = 0; // unused variable needed to match u32 inconsistency = false;
if (!entry->prev) { if (entry->prev == NULL) {
if (entry == sStackInfoListStart) { if (entry == sStackInfoListStart) {
sStackInfoListStart = entry->next; sStackInfoListStart = entry->next;
} else { } else {
inconsistency = 1; inconsistency = true;
} }
} else { } else {
entry->prev->next = entry->next; entry->prev->next = entry->next;
@ -62,7 +64,7 @@ void StackCheck_Cleanup(StackEntry* entry) {
if (entry == sStackInfoListEnd) { if (entry == sStackInfoListEnd) {
sStackInfoListEnd = entry->prev; sStackInfoListEnd = entry->prev;
} else { } else {
inconsistency = 1; inconsistency = true;
} }
} }
@ -71,22 +73,22 @@ void StackCheck_Cleanup(StackEntry* entry) {
StackStatus StackCheck_GetState(StackEntry* entry) { StackStatus StackCheck_GetState(StackEntry* entry) {
u32* last; u32* last;
u32 used; size_t used;
u32 free; size_t free;
s32 status; StackStatus status;
for (last = (u32*)entry->head; (u32)last < entry->tail; last++) { for (last = entry->head; last < (u32*)entry->tail; last++) {
if (entry->initValue != *last) { if (entry->initValue != *last) {
break; break;
} }
} }
used = entry->tail - (u32)last; used = (uintptr_t)entry->tail - (uintptr_t)last;
free = (u32)last - entry->head; free = (uintptr_t)last - (uintptr_t)entry->head;
if (free == 0) { if (free == 0) {
status = STACK_STATUS_OVERFLOW; status = STACK_STATUS_OVERFLOW;
} else if (free < (u32)entry->minSpace && entry->minSpace != -1) { } else if ((free < (size_t)entry->minSpace) && (entry->minSpace != -1)) {
status = STACK_STATUS_WARNING; status = STACK_STATUS_WARNING;
} else { } else {
status = STACK_STATUS_OK; status = STACK_STATUS_OK;
@ -95,13 +97,14 @@ StackStatus StackCheck_GetState(StackEntry* entry) {
return status; return status;
} }
u32 StackCheck_CheckAll() { u32 StackCheck_CheckAll(void) {
u32 ret = 0; u32 ret = 0;
StackEntry* iter = sStackInfoListStart; StackEntry* iter = sStackInfoListStart;
while (iter) { while (iter != NULL) {
u32 state = StackCheck_GetState(iter); StackStatus state = StackCheck_GetState(iter);
if (state) {
if (state != STACK_STATUS_OK) {
ret = 1; ret = 1;
} }
iter = iter->next; iter = iter->next;
@ -111,7 +114,7 @@ u32 StackCheck_CheckAll() {
} }
u32 StackCheck_Check(StackEntry* entry) { u32 StackCheck_Check(StackEntry* entry) {
if (!entry) { if (entry == NULL) {
return StackCheck_CheckAll(); return StackCheck_CheckAll();
} else { } else {
return StackCheck_GetState(entry); return StackCheck_GetState(entry);

View File

@ -1,22 +1,22 @@
#include "prevent_bss_reordering.h" #include "prevent_bss_reordering.h"
#include "global.h" #include "global.h"
#include "stack.h" #include "stack.h"
#include "stackcheck.h"
StackEntry sBootStackInfo; StackEntry sBootStackInfo;
OSThread sIdleThread; OSThread sIdleThread;
STACK(sIdleThreadStack, 0x400); STACK(sIdleStack, 0x400);
StackEntry sIdleStackInfo; StackEntry sIdleStackInfo;
STACK(sBootThreadStack, 0x400); STACK(sBootStack, 0x400);
void bootproc(void) { void bootproc(void) {
StackCheck_Init(&sBootStackInfo, sBootThreadStack, STACK_TOP(sBootThreadStack), 0, -1, "boot"); StackCheck_Init(&sBootStackInfo, sBootStack, STACK_TOP(sBootStack), 0, -1, "boot");
osMemSize = osGetMemSize(); osMemSize = osGetMemSize();
func_800818F4(); func_800818F4();
osInitialize(); osInitialize();
osUnmapTLBAll(); osUnmapTLBAll();
gCartHandle = osCartRomInit(); gCartHandle = osCartRomInit();
StackCheck_Init(&sIdleStackInfo, sIdleThreadStack, STACK_TOP(sIdleThreadStack), 0, 0x100, "idle"); StackCheck_Init(&sIdleStackInfo, sIdleStack, STACK_TOP(sIdleStack), 0, 0x100, "idle");
osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleThreadStack), osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleStack), Z_PRIORITY_IDLE);
Z_PRIORITY_IDLE);
osStartThread(&sIdleThread); osStartThread(&sIdleThread);
} }

View File

@ -2,6 +2,7 @@
#include "global.h" #include "global.h"
#include "stack.h" #include "stack.h"
#include "vt.h" #include "vt.h"
#include "stackcheck.h"
extern FaultThreadStruct* sFaultContext; extern FaultThreadStruct* sFaultContext;
extern f32 D_8009BE54; extern f32 D_8009BE54;

View File

@ -1,7 +1,7 @@
#include "prevent_bss_reordering.h"
#include "global.h" #include "global.h"
#include "stack.h" #include "stack.h"
#include "buffers.h" #include "buffers.h"
#include "stackcheck.h"
u8 D_80096B20 = 1; u8 D_80096B20 = 1;
vu8 gViConfigUseDefault = 1; vu8 gViConfigUseDefault = 1;

View File

@ -1,4 +1,5 @@
#include "global.h" #include "global.h"
#include "stackcheck.h"
vs32 gIrqMgrResetStatus = 0; vs32 gIrqMgrResetStatus = 0;
volatile OSTime sIrqMgrResetTime = 0; volatile OSTime sIrqMgrResetTime = 0;

View File

@ -1,6 +1,7 @@
#include "prevent_bss_reordering.h" #include "prevent_bss_reordering.h"
#include "global.h" #include "global.h"
#include "stack.h" #include "stack.h"
#include "stackcheck.h"
u32 sDmaMgrDmaBuffSize = 0x2000; u32 sDmaMgrDmaBuffSize = 0x2000;

View File

@ -1,6 +1,7 @@
#include "global.h" #include "global.h"
#include "slowly.h" #include "slowly.h"
#include "stack.h" #include "stack.h"
#include "stackcheck.h"
/** /**
* Assigns the "save" values in PreRender * Assigns the "save" values in PreRender

View File

@ -7,6 +7,7 @@
#include "global.h" #include "global.h"
#include "buffers.h" #include "buffers.h"
#include "stack.h" #include "stack.h"
#include "stackcheck.h"
extern OSMesgQueue sSiIntMsgQ; extern OSMesgQueue sSiIntMsgQ;
extern OSMesg sSiIntMsgBuf[1]; extern OSMesg sSiIntMsgBuf[1];

View File

@ -1,5 +1,6 @@
#include "prevent_bss_reordering.h" #include "prevent_bss_reordering.h"
#include "global.h" #include "global.h"
#include "stackcheck.h"
#define RSP_DONE_MSG 667 #define RSP_DONE_MSG 667
#define RDP_DONE_MSG 668 #define RDP_DONE_MSG 668

View File

@ -1,5 +1,6 @@
#include "global.h" #include "global.h"
#include "stack.h" #include "stack.h"
#include "stackcheck.h"
#include "system_malloc.h" #include "system_malloc.h"
// extern UNK_TYPE1 D_801FBE10; // extern UNK_TYPE1 D_801FBE10;
@ -7,10 +8,10 @@
// extern UNK_TYPE1 D_801FBE2C; // extern UNK_TYPE1 D_801FBE2C;
// extern UNK_TYPE4 D_801FBE30; // extern UNK_TYPE4 D_801FBE30;
extern STACK(sSysFlashromStack, 0x1000); extern STACK(sSysFlashromStack, 0x1000);
extern StackEntry sys_flashromStackEntry; extern StackEntry sSysFlashromStackInfo;
extern OSThread sys_flashromOSThread; extern OSThread sSysFlashromThread;
extern s80185D40 D_801FD008; extern s80185D40 D_801FD008;
extern OSMesg D_801FD034; extern OSMesg D_801FD034[1];
#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857C0.s") #pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857C0.s")

View File

@ -10,6 +10,7 @@
*/ */
#include "slowly.h" #include "slowly.h"
#include "global.h" #include "global.h"
#include "stackcheck.h"
void Slowly_Main(SlowlyMgr* slowly) { void Slowly_Main(SlowlyMgr* slowly) {
slowly->status |= SLOWLY_STATUS_STARTED; slowly->status |= SLOWLY_STATUS_STARTED;

View File

@ -289,7 +289,7 @@
0x80099520:("sIdleThread","OSThread","",0x1b0), 0x80099520:("sIdleThread","OSThread","",0x1b0),
0x800996D0:("sIdleThreadStack","u8","[1024]",0x400), 0x800996D0:("sIdleThreadStack","u8","[1024]",0x400),
0x80099AD0:("sIdleStackInfo","StackEntry","",0x1c), 0x80099AD0:("sIdleStackInfo","StackEntry","",0x1c),
0x80099AF0:("sBootThreadStack","u8","[1024]",0x400), 0x80099AF0:("sBootStack","u8","[1024]",0x400),
0x80099EF0:("gIrqMgr","IrqMgr","",0x280), 0x80099EF0:("gIrqMgr","IrqMgr","",0x280),
0x8009A170:("sIrqMgrStack","u8","[1280]",0x500), 0x8009A170:("sIrqMgrStack","u8","[1280]",0x500),
0x8009A670:("sIrqMgrStackInfo","StackEntry","",0x1c), 0x8009A670:("sIrqMgrStackInfo","StackEntry","",0x1c),
@ -4216,8 +4216,8 @@
0x801FBE2C:("D_801FBE2C","UNK_TYPE1","",0x1), 0x801FBE2C:("D_801FBE2C","UNK_TYPE1","",0x1),
0x801FBE30:("D_801FBE30","UNK_TYPE4","",0x4), 0x801FBE30:("D_801FBE30","UNK_TYPE4","",0x4),
0x801FBE38:("sSysFlashromStack","u8","[4096]",0x1000), 0x801FBE38:("sSysFlashromStack","u8","[4096]",0x1000),
0x801FCE38:("sys_flashromStackEntry","StackEntry","",0x1c), 0x801FCE38:("sSysFlashromStackInfo","StackEntry","",0x1c),
0x801FCE58:("sys_flashromOSThread","OSThread","",0x1b0), 0x801FCE58:("sSysFlashromThread","OSThread","",0x1b0),
0x801FD008:("D_801FD008","s80185D40","",0x2c), 0x801FD008:("D_801FD008","s80185D40","",0x2c),
0x801FD034:("D_801FD034","OSMesg","",0x4), 0x801FD034:("D_801FD034","OSMesg","",0x4),
0x801FD040:("D_801FD040","s32","",0x10), 0x801FD040:("D_801FD040","s32","",0x10),