summaryrefslogtreecommitdiff
path: root/src/boot_O2
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot_O2')
-rw-r--r--src/boot_O2/boot_800862E0.c116
1 files changed, 107 insertions, 9 deletions
diff --git a/src/boot_O2/boot_800862E0.c b/src/boot_O2/boot_800862E0.c
index 1055dfe1b..5774af9da 100644
--- a/src/boot_O2/boot_800862E0.c
+++ b/src/boot_O2/boot_800862E0.c
@@ -1,18 +1,116 @@
#include "global.h"
-#include "os_malloc.h"
+#include "system_malloc.h"
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/SystemArena_MallocMin1.s")
+typedef void (*BlockFunc)(void*);
+typedef void (*BlockFunc1)(void*, u32);
+typedef void (*BlockFunc8)(void*, u32, u32, u32, u32, u32, u32, u32, u32);
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/SystemArena_FreeNull.s")
+typedef struct InitFunc {
+ uintptr_t nextOffset;
+ void (*func)(void);
+} InitFunc;
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/func_8008633C.s")
+void* sInitFuncs = NULL;
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/func_800863AC.s")
+char sNew[] = { 0x00, 0x00, 0x00, 0x00 };
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/func_8008641C.s")
+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,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/func_800864EC.s")
+void* SystemArena_MallocMin1(size_t size) {
+ if (size == 0) {
+ size = 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/func_80086588.s")
+ return __osMalloc(&gSystemArena, size);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/boot/boot_800862E0/SystemArena_Init.s")
+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();
+}