summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2022-03-29 12:42:44 -0700
committerGitHub <noreply@github.com>2022-03-29 20:42:44 +0100
commitec9909c65cc909be4f1fb4dec08a003dbae520ee (patch)
tree28c2a467c19c153134fc36e499d29abd26e2e887 /src
parentafec1c56a62d2d451e4ab00a1e5da5a14cf6a9c0 (diff)
Boot_800862E0 OK (#769)
* boot_800862E0 OK * Ran format.sh * attempt at fixing bss reordering * boot_800862E0 OK (for real this time) * Run formatter * Changes u32 pointers to uintptr_t and sizes to size_t * Run formatter * Fix bss reordering * Delete baserom.mm.us.rev1.z64:Zone.Identifier * Cleanup and some notes * Try my best to document * remove comments * Remove D_80097508 from variables.h Co-authored-by: kyleburnette <kyle@kyleburnette.com> Co-authored-by: Anghelo Carvajal <angheloalf95@gmail.com>
Diffstat (limited to 'src')
-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();
+}