From 4647ebb91b9646d92d85929814815e48fa6e44ac Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Tue, 18 Apr 2023 17:50:34 -0400 Subject: [PATCH] `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> --- include/functions.h | 5 ---- include/stackcheck.h | 26 +++++++++++++++++ include/variables.h | 4 +-- include/z64.h | 16 ----------- src/boot_O2/stackcheck.c | 57 ++++++++++++++++++++------------------ src/boot_O2_g3/boot_main.c | 12 ++++---- src/boot_O2_g3/fault.c | 1 + src/boot_O2_g3/idle.c | 2 +- src/boot_O2_g3/irqmgr.c | 1 + src/boot_O2_g3/z_std_dma.c | 1 + src/code/PreRender.c | 1 + src/code/main.c | 1 + src/code/sched.c | 1 + src/code/sys_flashrom.c | 7 +++-- src/code/sys_slowly.c | 1 + tools/disasm/variables.txt | 6 ++-- 16 files changed, 79 insertions(+), 63 deletions(-) create mode 100644 include/stackcheck.h diff --git a/include/functions.h b/include/functions.h index b9b3b682b8..5d7c5364f6 100644 --- a/include/functions.h +++ b/include/functions.h @@ -122,11 +122,6 @@ s8 PadUtils_GetRelYImpl(Input* input); s8 PadUtils_GetRelX(Input* input); s8 PadUtils_GetRelY(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_L2F(MtxF* mtx, Mtx* mf); diff --git a/include/stackcheck.h b/include/stackcheck.h new file mode 100644 index 0000000000..aeb55df28e --- /dev/null +++ b/include/stackcheck.h @@ -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 diff --git a/include/variables.h b/include/variables.h index 4ef96eab27..b90fadcc60 100644 --- a/include/variables.h +++ b/include/variables.h @@ -37,8 +37,7 @@ extern FaultDrawer* sFaultDrawContext; extern FaultDrawer sFaultDrawerDefault; extern s32 gLoadLogSeverity; extern s32 gLoad2LogSeverity; -extern StackEntry* sStackInfoListStart; -extern StackEntry* sStackInfoListEnd; + // extern UNK_TYPE1 sGfxPrintFontTLUT; // extern UNK_TYPE1 sGfxPrintRainbowTLUT; // extern UNK_TYPE1 sGfxPrintRainbowData; @@ -2451,6 +2450,7 @@ extern OSTime sGraphTaskStartTime; extern u32 gSegments[NUM_SEGMENTS]; extern SchedContext gSchedContext; + extern OSThread gGraphThread; extern PadMgr gPadMgr; diff --git a/include/z64.h b/include/z64.h index 331077723b..f7c4ad29bb 100644 --- a/include/z64.h +++ b/include/z64.h @@ -576,22 +576,6 @@ typedef struct { /* 0x47F */ UNK_TYPE1 pad47F[0x1]; } 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_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 diff --git a/src/boot_O2/stackcheck.c b/src/boot_O2/stackcheck.c index 20e56f4806..edd1e3a30e 100644 --- a/src/boot_O2/stackcheck.c +++ b/src/boot_O2/stackcheck.c @@ -1,18 +1,19 @@ -#include "global.h" +#include "stackcheck.h" +#include "libc/stdbool.h" +#include "libc/stdint.h" StackEntry* sStackInfoListStart = 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) { - StackEntry* iter; - u32* addr; - - if (!entry) { + if (entry == NULL) { sStackInfoListStart = NULL; } else { - entry->head = (u32)stackTop; - entry->tail = (u32)stackBottom; + StackEntry* iter; + + entry->head = stackBottom; + entry->tail = stackTop; entry->initValue = initValue; entry->minSpace = minSpace; entry->name = name; @@ -32,13 +33,14 @@ void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 i } sStackInfoListEnd = entry; - if (!sStackInfoListStart) { + if (sStackInfoListStart == NULL) { sStackInfoListStart = entry; } if (entry->minSpace != -1) { - addr = (u32*)entry->head; - while ((u32)addr < entry->tail) { + u32* addr = entry->head; + + while (addr < (u32*)entry->tail) { *addr++ = entry->initValue; } } @@ -46,13 +48,13 @@ void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 i } 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) { sStackInfoListStart = entry->next; } else { - inconsistency = 1; + inconsistency = true; } } else { entry->prev->next = entry->next; @@ -62,7 +64,7 @@ void StackCheck_Cleanup(StackEntry* entry) { if (entry == sStackInfoListEnd) { sStackInfoListEnd = entry->prev; } else { - inconsistency = 1; + inconsistency = true; } } @@ -71,22 +73,22 @@ void StackCheck_Cleanup(StackEntry* entry) { StackStatus StackCheck_GetState(StackEntry* entry) { u32* last; - u32 used; - u32 free; - s32 status; + size_t used; + size_t free; + 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) { break; } } - used = entry->tail - (u32)last; - free = (u32)last - entry->head; + used = (uintptr_t)entry->tail - (uintptr_t)last; + free = (uintptr_t)last - (uintptr_t)entry->head; if (free == 0) { 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; } else { status = STACK_STATUS_OK; @@ -95,13 +97,14 @@ StackStatus StackCheck_GetState(StackEntry* entry) { return status; } -u32 StackCheck_CheckAll() { +u32 StackCheck_CheckAll(void) { u32 ret = 0; StackEntry* iter = sStackInfoListStart; - while (iter) { - u32 state = StackCheck_GetState(iter); - if (state) { + while (iter != NULL) { + StackStatus state = StackCheck_GetState(iter); + + if (state != STACK_STATUS_OK) { ret = 1; } iter = iter->next; @@ -111,7 +114,7 @@ u32 StackCheck_CheckAll() { } u32 StackCheck_Check(StackEntry* entry) { - if (!entry) { + if (entry == NULL) { return StackCheck_CheckAll(); } else { return StackCheck_GetState(entry); diff --git a/src/boot_O2_g3/boot_main.c b/src/boot_O2_g3/boot_main.c index 061458a1db..6a561992b3 100644 --- a/src/boot_O2_g3/boot_main.c +++ b/src/boot_O2_g3/boot_main.c @@ -1,22 +1,22 @@ #include "prevent_bss_reordering.h" #include "global.h" #include "stack.h" +#include "stackcheck.h" StackEntry sBootStackInfo; OSThread sIdleThread; -STACK(sIdleThreadStack, 0x400); +STACK(sIdleStack, 0x400); StackEntry sIdleStackInfo; -STACK(sBootThreadStack, 0x400); +STACK(sBootStack, 0x400); 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(); func_800818F4(); osInitialize(); osUnmapTLBAll(); gCartHandle = osCartRomInit(); - StackCheck_Init(&sIdleStackInfo, sIdleThreadStack, STACK_TOP(sIdleThreadStack), 0, 0x100, "idle"); - osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleThreadStack), - Z_PRIORITY_IDLE); + StackCheck_Init(&sIdleStackInfo, sIdleStack, STACK_TOP(sIdleStack), 0, 0x100, "idle"); + osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleStack), Z_PRIORITY_IDLE); osStartThread(&sIdleThread); } diff --git a/src/boot_O2_g3/fault.c b/src/boot_O2_g3/fault.c index 134b120dc9..5e4f8e24a9 100644 --- a/src/boot_O2_g3/fault.c +++ b/src/boot_O2_g3/fault.c @@ -2,6 +2,7 @@ #include "global.h" #include "stack.h" #include "vt.h" +#include "stackcheck.h" extern FaultThreadStruct* sFaultContext; extern f32 D_8009BE54; diff --git a/src/boot_O2_g3/idle.c b/src/boot_O2_g3/idle.c index 40bcf5d0e3..2b8a887283 100644 --- a/src/boot_O2_g3/idle.c +++ b/src/boot_O2_g3/idle.c @@ -1,7 +1,7 @@ -#include "prevent_bss_reordering.h" #include "global.h" #include "stack.h" #include "buffers.h" +#include "stackcheck.h" u8 D_80096B20 = 1; vu8 gViConfigUseDefault = 1; diff --git a/src/boot_O2_g3/irqmgr.c b/src/boot_O2_g3/irqmgr.c index 152c69b89a..424451a5b0 100644 --- a/src/boot_O2_g3/irqmgr.c +++ b/src/boot_O2_g3/irqmgr.c @@ -1,4 +1,5 @@ #include "global.h" +#include "stackcheck.h" vs32 gIrqMgrResetStatus = 0; volatile OSTime sIrqMgrResetTime = 0; diff --git a/src/boot_O2_g3/z_std_dma.c b/src/boot_O2_g3/z_std_dma.c index dd34d9e87f..00d894f74a 100644 --- a/src/boot_O2_g3/z_std_dma.c +++ b/src/boot_O2_g3/z_std_dma.c @@ -1,6 +1,7 @@ #include "prevent_bss_reordering.h" #include "global.h" #include "stack.h" +#include "stackcheck.h" u32 sDmaMgrDmaBuffSize = 0x2000; diff --git a/src/code/PreRender.c b/src/code/PreRender.c index 075f941d46..172659cf7d 100644 --- a/src/code/PreRender.c +++ b/src/code/PreRender.c @@ -1,6 +1,7 @@ #include "global.h" #include "slowly.h" #include "stack.h" +#include "stackcheck.h" /** * Assigns the "save" values in PreRender diff --git a/src/code/main.c b/src/code/main.c index c4a80f1eae..7fbb5ba393 100644 --- a/src/code/main.c +++ b/src/code/main.c @@ -7,6 +7,7 @@ #include "global.h" #include "buffers.h" #include "stack.h" +#include "stackcheck.h" extern OSMesgQueue sSiIntMsgQ; extern OSMesg sSiIntMsgBuf[1]; diff --git a/src/code/sched.c b/src/code/sched.c index 5f9cdf236a..c2630677cd 100644 --- a/src/code/sched.c +++ b/src/code/sched.c @@ -1,5 +1,6 @@ #include "prevent_bss_reordering.h" #include "global.h" +#include "stackcheck.h" #define RSP_DONE_MSG 667 #define RDP_DONE_MSG 668 diff --git a/src/code/sys_flashrom.c b/src/code/sys_flashrom.c index e9ea6e21ef..0db0b87441 100644 --- a/src/code/sys_flashrom.c +++ b/src/code/sys_flashrom.c @@ -1,5 +1,6 @@ #include "global.h" #include "stack.h" +#include "stackcheck.h" #include "system_malloc.h" // extern UNK_TYPE1 D_801FBE10; @@ -7,10 +8,10 @@ // extern UNK_TYPE1 D_801FBE2C; // extern UNK_TYPE4 D_801FBE30; extern STACK(sSysFlashromStack, 0x1000); -extern StackEntry sys_flashromStackEntry; -extern OSThread sys_flashromOSThread; +extern StackEntry sSysFlashromStackInfo; +extern OSThread sSysFlashromThread; 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") diff --git a/src/code/sys_slowly.c b/src/code/sys_slowly.c index 29ac0db786..754c5d4729 100644 --- a/src/code/sys_slowly.c +++ b/src/code/sys_slowly.c @@ -10,6 +10,7 @@ */ #include "slowly.h" #include "global.h" +#include "stackcheck.h" void Slowly_Main(SlowlyMgr* slowly) { slowly->status |= SLOWLY_STATUS_STARTED; diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index dc5f57f8cf..4dab18e3b1 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -289,7 +289,7 @@ 0x80099520:("sIdleThread","OSThread","",0x1b0), 0x800996D0:("sIdleThreadStack","u8","[1024]",0x400), 0x80099AD0:("sIdleStackInfo","StackEntry","",0x1c), - 0x80099AF0:("sBootThreadStack","u8","[1024]",0x400), + 0x80099AF0:("sBootStack","u8","[1024]",0x400), 0x80099EF0:("gIrqMgr","IrqMgr","",0x280), 0x8009A170:("sIrqMgrStack","u8","[1280]",0x500), 0x8009A670:("sIrqMgrStackInfo","StackEntry","",0x1c), @@ -4216,8 +4216,8 @@ 0x801FBE2C:("D_801FBE2C","UNK_TYPE1","",0x1), 0x801FBE30:("D_801FBE30","UNK_TYPE4","",0x4), 0x801FBE38:("sSysFlashromStack","u8","[4096]",0x1000), - 0x801FCE38:("sys_flashromStackEntry","StackEntry","",0x1c), - 0x801FCE58:("sys_flashromOSThread","OSThread","",0x1b0), + 0x801FCE38:("sSysFlashromStackInfo","StackEntry","",0x1c), + 0x801FCE58:("sSysFlashromThread","OSThread","",0x1b0), 0x801FD008:("D_801FD008","s80185D40","",0x2c), 0x801FD034:("D_801FD034","OSMesg","",0x4), 0x801FD040:("D_801FD040","s32","",0x10),