From fc475a97565ade34d57f80970c6b5cebcc2892a7 Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Sun, 28 May 2023 20:04:07 -0700 Subject: Docs Cleanup (#1153) * sysheap * Gorons * Update goron comment * functions.h * Update src/boot_O2/system_heap.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * add header * Fix header guards * Update data * Add malloc and free to header --------- Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> --- src/boot_O2/boot_800862E0.c | 116 ----------------------------------------- src/boot_O2/system_heap.c | 123 ++++++++++++++++++++++++++++++++++++++++++++ src/boot_O2/system_malloc.c | 2 +- 3 files changed, 124 insertions(+), 117 deletions(-) delete mode 100644 src/boot_O2/boot_800862E0.c create mode 100644 src/boot_O2/system_heap.c (limited to 'src/boot_O2') diff --git a/src/boot_O2/boot_800862E0.c b/src/boot_O2/boot_800862E0.c deleted file mode 100644 index 5774af9da..000000000 --- a/src/boot_O2/boot_800862E0.c +++ /dev/null @@ -1,116 +0,0 @@ -#include "global.h" -#include "system_malloc.h" - -typedef void (*BlockFunc)(void*); -typedef void (*BlockFunc1)(void*, u32); -typedef void (*BlockFunc8)(void*, u32, u32, u32, u32, u32, u32, u32, u32); - -typedef struct InitFunc { - uintptr_t nextOffset; - void (*func)(void); -} InitFunc; - -void* sInitFuncs = NULL; - -char sNew[] = { 0x00, 0x00, 0x00, 0x00 }; - -char D_80097508[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, - 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; - -void* SystemArena_MallocMin1(size_t size) { - if (size == 0) { - size = 1; - } - - return __osMalloc(&gSystemArena, size); -} - -void SystemArena_FreeNullCheck(void* ptr) { - if (ptr != NULL) { - __osFree(&gSystemArena, ptr); - } -} - -void SystemArena_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) { - uintptr_t pos = blk; - - for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { - blockFunc(pos); - } -} - -void SystemArena_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) { - uintptr_t pos = blk; - - for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { - blockFunc(pos, 2); - } -} - -void* SystemArena_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc8 blockFunc) { - if (blk == NULL) { - blk = SystemArena_MallocMin1(nBlk * blkSize); - } - - if (blk != NULL && blockFunc != NULL) { - uintptr_t pos = blk; - - for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { - blockFunc(pos, 0, 0, 0, 0, 0, 0, 0, 0); - } - } - - return blk; -} - -void SystemArena_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc, s32 shouldFree) { - uintptr_t pos; - uintptr_t start; - size_t maskedBlkSize; - - if (blk == NULL) { - return; - } - - if (blockFunc != NULL) { - start = blk; - maskedBlkSize = (blkSize & ~0); - pos = (uintptr_t)start + (nBlk * blkSize); - - while (pos > start) { - pos -= maskedBlkSize; - blockFunc(pos, 2); - } - } - - if (shouldFree) { - SystemArena_FreeNullCheck(blk); - } -} - -void SystemArena_RunInits(void) { - InitFunc* initFunc = (InitFunc*)&sInitFuncs; - u32 nextOffset = initFunc->nextOffset; - InitFunc* prev = NULL; - - while (nextOffset != 0) { - initFunc = (InitFunc*)((uintptr_t)initFunc + nextOffset); - - if (initFunc->func != NULL) { - (*initFunc->func)(); - } - - nextOffset = initFunc->nextOffset; - initFunc->nextOffset = (uintptr_t)prev; - prev = initFunc; - } - - sInitFuncs = prev; -} - -void SystemArena_Init(void* start, size_t size) { - SystemArena_InitArena(start, size); - SystemArena_RunInits(); -} diff --git a/src/boot_O2/system_heap.c b/src/boot_O2/system_heap.c new file mode 100644 index 000000000..66e53dc12 --- /dev/null +++ b/src/boot_O2/system_heap.c @@ -0,0 +1,123 @@ +/** + * @file system_heap.c + * + * @note: + * Only SystemHeap_Init() is used, and is essentially just a wrapper for SystemArena_Init(). + * + */ +#include "global.h" +#include "system_malloc.h" + +typedef void (*BlockFunc)(void*); +typedef void (*BlockFunc1)(void*, u32); +typedef void (*BlockFunc8)(void*, u32, u32, u32, u32, u32, u32, u32, u32); + +typedef struct InitFunc { + /* 0x0 */ uintptr_t nextOffset; + /* 0x4 */ void (*func)(void); +} InitFunc; // size = 0x8 + +void* sInitFuncs = NULL; + +char sNew[] = ""; + +UNK_TYPE1 D_80097508[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +void* SystemHeap_Malloc(size_t size) { + if (size == 0) { + size = 1; + } + + return __osMalloc(&gSystemArena, size); +} + +void SystemHeap_Free(void* ptr) { + if (ptr != NULL) { + __osFree(&gSystemArena, ptr); + } +} + +void SystemHeap_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) { + uintptr_t pos = blk; + + for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { + blockFunc(pos); + } +} + +void SystemHeap_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) { + uintptr_t pos = blk; + + for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { + blockFunc(pos, 2); + } +} + +void* SystemHeap_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc8 blockFunc) { + if (blk == NULL) { + blk = SystemHeap_Malloc(nBlk * blkSize); + } + + if (blk != NULL && blockFunc != NULL) { + uintptr_t pos = blk; + + for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { + blockFunc(pos, 0, 0, 0, 0, 0, 0, 0, 0); + } + } + + return blk; +} + +void SystemHeap_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc, s32 shouldFree) { + uintptr_t pos; + uintptr_t start; + size_t maskedBlkSize; + + if (blk == NULL) { + return; + } + + if (blockFunc != NULL) { + start = blk; + maskedBlkSize = (blkSize & ~0); + pos = (uintptr_t)start + (nBlk * blkSize); + + while (pos > start) { + pos -= maskedBlkSize; + blockFunc(pos, 2); + } + } + + if (shouldFree) { + SystemHeap_Free(blk); + } +} + +void SystemHeap_RunInits(void) { + InitFunc* initFunc = (InitFunc*)&sInitFuncs; + u32 nextOffset = initFunc->nextOffset; + InitFunc* prev = NULL; + + while (nextOffset != 0) { + initFunc = (InitFunc*)((uintptr_t)initFunc + nextOffset); + + if (initFunc->func != NULL) { + (*initFunc->func)(); + } + + nextOffset = initFunc->nextOffset; + initFunc->nextOffset = (uintptr_t)prev; + prev = initFunc; + } + + sInitFuncs = prev; +} + +void SystemHeap_Init(void* start, size_t size) { + SystemArena_Init(start, size); + SystemHeap_RunInits(); +} diff --git a/src/boot_O2/system_malloc.c b/src/boot_O2/system_malloc.c index 56608166c..cea017b38 100644 --- a/src/boot_O2/system_malloc.c +++ b/src/boot_O2/system_malloc.c @@ -38,7 +38,7 @@ u32 SystemArena_CheckArena(void) { return __osCheckArena(&gSystemArena); } -void SystemArena_InitArena(void* start, size_t size) { +void SystemArena_Init(void* start, size_t size) { __osMallocInit(&gSystemArena, start, size); } -- cgit v1.2.3