summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/nitro/os_alloc.c601
-rw-r--r--undefined_syms.txt2
2 files changed, 342 insertions, 261 deletions
diff --git a/include/nitro/os_alloc.c b/include/nitro/os_alloc.c
index 161f75a5..b8dc7ef1 100644
--- a/include/nitro/os_alloc.c
+++ b/include/nitro/os_alloc.c
@@ -14,38 +14,40 @@ extern u32 OS_CONSOLE_SIZE_4MB;
extern Cell* DLExtract(Cell* list, Cell* cell);
extern Cell* DLInsert(Cell* list, Cell* cell);
extern Cell* DLAddFront(Cell* list, Cell* cell);
+extern void OS_SetProtectionRegion1(u32 param);
+extern void OS_SetProtectionRegion2(u32 param);
-void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
#ifdef MATCH_ASM
- __asm {
- stmdb sp!,{ r4 r5 r6 lr }
- mov r4,r0
- mov r6,r1
- mov r5,r2
- bl OS_GetArenaHi
- cmp r0,#0x0
- moveq r0,#0x0
- ldmeqia sp!,{ r4 r5 r6 lr }
- bxeq lr
- sub r1,r5,#0x1
- mvn r2,r1
- and r0,r0,r2
- sub r1,r0,r6
- mov r0,r4
- and r5,r1,r2
- bl OS_GetArenaLo
- cmp r5,r0
- movcc r0,#0x0
- ldmccia sp!,{ r4 r5 r6 lr }
- bxcc lr
- mov r0,r4
- mov r1,r5
- bl OS_SetArenaHi
- mov r0,r5
- ldmia sp!,{ r4 r5 r6 lr }
- bx lr
- };
+asm void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
+ stmdb sp!,{ r4-r6, lr }
+ mov r4,r0
+ mov r6,r1
+ mov r5,r2
+ bl OS_GetArenaHi
+ cmp r0,#0x0
+ moveq r0,#0x0
+ ldmeqia sp!,{ r4-r6, lr }
+ bxeq lr
+ sub r1,r5,#0x1
+ mvn r2,r1
+ and r0,r0,r2
+ sub r1,r0,r6
+ mov r0,r4
+ and r5,r1,r2
+ bl OS_GetArenaLo
+ cmp r5,r0
+ movcc r0,#0x0
+ ldmccia sp!,{ r4-r6, lr }
+ bxcc lr
+ mov r0,r4
+ mov r1,r5
+ bl OS_SetArenaHi
+ mov r0,r5
+ ldmia sp!,{ r4-r6, lr }
+ bx lr
+}
#else
+void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
void* ptr;
u8* arenaHi;
@@ -65,48 +67,48 @@ void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
OS_SetArenaHi(id, arenaHi);
return ptr;
-#endif
}
+#endif
-void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
#ifdef MATCH_ASM
- __asm {
- stmdb sp!,{ r4 r5 r6 r7 lr }
- sub sp,sp,#0x4
- mov r7,r0
- mov r6,r1
- mov r5,r2
- bl OS_GetArenaLo
- cmp r0,#0x0
- addeq sp,sp,#0x4
- moveq r0,#0x0
- ldmeqia sp!,{ r4 r5 r6 r7 lr }
- bxeq lr
- add r0,r0,r5
- sub r1,r5,#0x1
- mvn r2,r1
- sub r0,r0,#0x1
- and r4,r2,r0
- add r0,r4,r6
- add r0,r0,r5
- sub r1,r0,#0x1
- mov r0,r7
- and r5,r2,r1
- bl OS_GetArenaHi
- cmp r5,r0
- addhi sp,sp,#0x4
- movhi r0,#0x0
- ldmhiia sp!,{ r4 r5 r6 r7 lr }
- bxhi lr
- mov r0,r7
- mov r1,r5
- bl OS_SetArenaLo
- mov r0,r4
- add sp,sp,#0x4
- ldmia sp!,{ r4 r5 r6 r7 lr }
- bx lr
- }
+asm void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
+ stmdb sp!,{ r4-r7, lr }
+ sub sp,sp,#0x4
+ mov r7,r0
+ mov r6,r1
+ mov r5,r2
+ bl OS_GetArenaLo
+ cmp r0,#0x0
+ addeq sp,sp,#0x4
+ moveq r0,#0x0
+ ldmeqia sp!,{ r4-r7, lr }
+ bxeq lr
+ add r0,r0,r5
+ sub r1,r5,#0x1
+ mvn r2,r1
+ sub r0,r0,#0x1
+ and r4,r2,r0
+ add r0,r4,r6
+ add r0,r0,r5
+ sub r1,r0,#0x1
+ mov r0,r7
+ and r5,r2,r1
+ bl OS_GetArenaHi
+ cmp r5,r0
+ addhi sp,sp,#0x4
+ movhi r0,#0x0
+ ldmhiia sp!,{ r4-r7, lr }
+ bxhi lr
+ mov r0,r7
+ mov r1,r5
+ bl OS_SetArenaLo
+ mov r0,r4
+ add sp,sp,#0x4
+ ldmia sp!,{ r4-r7, lr }
+ bx lr
+}
#else
+void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
void* ptr;
u8* arenaLo;
ptr = OS_GetArenaLo(id);
@@ -122,43 +124,43 @@ void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
OS_SetArenaLo(id, arenaLo);
return ptr;
-#endif
}
+#endif
-void OS_SetArenaLo(OSArenaId id, void* newLo) {
#ifdef MATCH_ASM
- __asm {
- mov r0,r0, lsl #0x2
- add r0,r0,#0x2700000
- add r0,r0,#0xff000
- str r1,[r0,#0xda0]
- bx lr
- }
+asm void OS_SetArenaLo(OSArenaId id, void* newLo) {
+ mov r0,r0, lsl #0x2
+ add r0,r0,#0x2700000
+ add r0,r0,#0xff000
+ str r1,[r0,#0xda0]
+ bx lr
+}
#else
+void OS_SetArenaLo(OSArenaId id, void* newLo) {
OSi_GetArenaInfo().lo[id] = newLo;
-#endif
}
+#endif
-void OS_SetArenaHi(OSArenaId id, void* newHi) {
#ifdef MATCH_ASM
- __asm {
- mov r0,r0, lsl #0x2
- add r0,r0,#0x2700000
- add r0,r0,#0xff000
- str r1,[r0,#0xdc4]
- bx lr
- }
+asm void OS_SetArenaHi(OSArenaId id, void* newHi) {
+ mov r0,r0, lsl #0x2
+ add r0,r0,#0x2700000
+ add r0,r0,#0xff000
+ str r1,[r0,#0xdc4]
+ bx lr
+}
#else
+void OS_SetArenaHi(OSArenaId id, void* newHi) {
OSi_GetArenaInfo().lo[id] = newHi;
-#endif
}
+#endif
-void* OS_GetInitArenaLo(OSArenaId id) {
#ifdef MATCH_ASM
- __asm {
- // TODO: idk how to do switch case stuff properly in asm
- }
+asm void* OS_GetInitArenaLo(OSArenaId id) {
+ // TODO: idk how to do switch case stuff properly in asm
+}
#else
+void* OS_GetInitArenaLo(OSArenaId id) {
switch (id) {
case OS_ARENA_MAIN:
return (void *)0x0225ffa0;
@@ -179,15 +181,15 @@ void* OS_GetInitArenaLo(OSArenaId id) {
default:
return NULL;
}
-#endif
}
+#endif
-void* OS_GetInitArenaHi(OSArenaId id) {
#ifdef MATCH_ASM
- __asm {
- // TODO: idk how to do switch case stuff properly in asm
- }
+asm void* OS_GetInitArenaHi(OSArenaId id) {
+ // TODO: idk how to do switch case stuff properly in asm
+}
#else
+void* OS_GetInitArenaHi(OSArenaId id) {
switch (id) {
case OS_ARENA_MAIN:
return (void *)0x023e0000;
@@ -208,72 +210,72 @@ void* OS_GetInitArenaHi(OSArenaId id) {
default:
return NULL;
}
-#endif
}
+#endif
-void* OS_GetArenaLo(OSArenaId id) {
#ifdef MATCH_ASM
- __asm {
- mov r0,r0, lsl #0x2
- add r0,r0,#0x2700000
- add r0,r0,#0xff000
- ldr r0,[r0,#0xda0]
- bx lr
- }
+asm void* OS_GetArenaLo(OSArenaId id) {
+ mov r0,r0, lsl #0x2
+ add r0,r0,#0x2700000
+ add r0,r0,#0xff000
+ ldr r0,[r0,#0xda0]
+ bx lr
+}
#else
+void* OS_GetArenaLo(OSArenaId id) {
return OSi_GetArenaInfo().lo[id];
-#endif
}
+#endif
-void* OS_GetArenaHi(OSArenaId id) {
#ifdef MATCH_ASM
- __asm {
- mov r0,r0, lsl #0x2
- add r0,r0,#0x2700000
- add r0,r0,#0xff000
- ldr r0,[r0,#0xdc4]
- bx lr
- }
+asm void* OS_GetArenaHi(OSArenaId id) {
+ mov r0,r0, lsl #0x2
+ add r0,r0,#0x2700000
+ add r0,r0,#0xff000
+ ldr r0,[r0,#0xdc4]
+ bx lr
+}
#else
+void* OS_GetArenaHi(OSArenaId id) {
return OSi_GetArenaInfo().hi[id];
-#endif
}
+#endif
-void OS_InitArenaEx() {
#ifdef MATCH_ASM
- __asm {
- stmdb sp!,{ lr }
- sub sp,sp,#0x4
- mov r0,#0x2
- bl OS_GetInitArenaHi
- mov r1,r0
- mov r0,#0x2
- bl OS_SetArenaHi
- mov r0,#0x2
- bl OS_GetInitArenaLo
- mov r1,r0
- mov r0,#0x2
- bl OS_SetArenaLo
- ldr r0,OSi_MainExArenaEnabled
- ldr r0,[r0,#0x0]
- cmp r0,#0x0
- beq LAB_020cc5b8
- bl OS_GetConsoleType
- and r0,r0,#0x3
- cmp r0,#0x1
- addne sp,sp,#0x4
- ldmneia sp!,{ lr }
- bxne lr
- LAB_020cc5b8:
- ldr r0,#0200002b
- bl OS_SetProtectionRegion1
- ldr r0,#0x023e0021
- bl OS_SetProtectionRegion2
- add sp,sp,#0x4
- ldmia sp!,{ lr }
- bx lr
- }
+asm void OS_InitArenaEx() {
+ stmdb sp!,{ lr }
+ sub sp,sp,#0x4
+ mov r0,#0x2
+ bl OS_GetInitArenaHi
+ mov r1,r0
+ mov r0,#0x2
+ bl OS_SetArenaHi
+ mov r0,#0x2
+ bl OS_GetInitArenaLo
+ mov r1,r0
+ mov r0,#0x2
+ bl OS_SetArenaLo
+ ldr r0, =OSi_MainExArenaEnabled
+ ldr r0,[r0,#0x0]
+ cmp r0,#0x0
+ beq _020CC5B8
+ bl OS_GetConsoleType
+ and r0,r0,#0x3
+ cmp r0,#0x1
+ addne sp,sp,#0x4
+ ldmneia sp!,{ lr }
+ bxne lr
+_020CC5B8:
+ ldr r0, =0x0200002b
+ bl OS_SetProtectionRegion1
+ ldr r0, =0x023e0021
+ bl OS_SetProtectionRegion2
+ add sp,sp,#0x4
+ ldmia sp!,{ lr }
+ bx lr
+}
#else
+void OS_InitArenaEx() {
void* uVar1;
uVar1 = OS_GetInitArenaHi(OS_ARENA_MAINEX);
@@ -286,83 +288,83 @@ void OS_InitArenaEx() {
// TODO:
// OS_SetProtectionRegion1(&UNK_0200002b);
// OS_SetProtectionRegion2(0x023e0021);
-#endif
}
+#endif
-void OS_InitArena() {
#ifdef MATCH_ASM
- __asm {
- stmdb sp!,{ lr }
- sub sp,sp,#0x4
- ldr r1,OSi_Initialized
- ldr r0,[r1,#0x0]
- cmp r0,#0x0
- addne sp,sp,#0x4
- ldmneia sp!,{ lr }
- bxne lr
- mov r2,#0x1
- mov r0,#0x0
- str r2,[r1,#0x0]
- bl OS_GetInitArenaHi
- mov r1,r0
- mov r0,#0x0
- bl OS_SetArenaHi
- mov r0,#0x0
- bl OS_GetInitArenaLo
- mov r1,r0
- mov r0,#0x0
- bl OS_SetArenaLo
- mov r0,#0x2
- mov r1,#0x0
- bl OS_SetArenaLo
- mov r0,#0x2
- mov r1,#0x0
- bl OS_SetArenaHi
- mov r0,#0x3
- bl OS_GetInitArenaHi
- mov r1,r0
- mov r0,#0x3
- bl OS_SetArenaHi
- mov r0,#0x3
- bl OS_GetInitArenaLo
- mov r1,r0
- mov r0,#0x3
- bl OS_SetArenaLo
- mov r0,#0x4
- bl OS_GetInitArenaHi
- mov r1,r0
- mov r0,#0x4
- bl OS_SetArenaHi
- mov r0,#0x4
- bl OS_GetInitArenaLo
- mov r1,r0
- mov r0,#0x4
- bl OS_SetArenaLo
- mov r0,#0x5
- bl OS_GetInitArenaHi
- mov r1,r0
- mov r0,#0x5
- bl OS_SetArenaHi
- mov r0,#0x5
- bl OS_GetInitArenaLo
- mov r1,r0
- mov r0,#0x5
- bl OS_SetArenaLo
- mov r0,#0x6
- bl OS_GetInitArenaHi
- mov r1,r0
- mov r0,#0x6
- bl OS_SetArenaHi
- mov r0,#0x6
- bl OS_GetInitArenaLo
- mov r1,r0
- mov r0,#0x6
- bl OS_SetArenaLo
- add sp,sp,#0x4
- ldmia sp!,{ lr }
- bx lr
- }
+asm void OS_InitArena() {
+ stmdb sp!,{ lr }
+ sub sp,sp,#0x4
+ ldr r1, =OSi_Initialized
+ ldr r0,[r1,#0x0]
+ cmp r0,#0x0
+ addne sp,sp,#0x4
+ ldmneia sp!,{ lr }
+ bxne lr
+ mov r2,#0x1
+ mov r0,#0x0
+ str r2,[r1,#0x0]
+ bl OS_GetInitArenaHi
+ mov r1,r0
+ mov r0,#0x0
+ bl OS_SetArenaHi
+ mov r0,#0x0
+ bl OS_GetInitArenaLo
+ mov r1,r0
+ mov r0,#0x0
+ bl OS_SetArenaLo
+ mov r0,#0x2
+ mov r1,#0x0
+ bl OS_SetArenaLo
+ mov r0,#0x2
+ mov r1,#0x0
+ bl OS_SetArenaHi
+ mov r0,#0x3
+ bl OS_GetInitArenaHi
+ mov r1,r0
+ mov r0,#0x3
+ bl OS_SetArenaHi
+ mov r0,#0x3
+ bl OS_GetInitArenaLo
+ mov r1,r0
+ mov r0,#0x3
+ bl OS_SetArenaLo
+ mov r0,#0x4
+ bl OS_GetInitArenaHi
+ mov r1,r0
+ mov r0,#0x4
+ bl OS_SetArenaHi
+ mov r0,#0x4
+ bl OS_GetInitArenaLo
+ mov r1,r0
+ mov r0,#0x4
+ bl OS_SetArenaLo
+ mov r0,#0x5
+ bl OS_GetInitArenaHi
+ mov r1,r0
+ mov r0,#0x5
+ bl OS_SetArenaHi
+ mov r0,#0x5
+ bl OS_GetInitArenaLo
+ mov r1,r0
+ mov r0,#0x5
+ bl OS_SetArenaLo
+ mov r0,#0x6
+ bl OS_GetInitArenaHi
+ mov r1,r0
+ mov r0,#0x6
+ bl OS_SetArenaHi
+ mov r0,#0x6
+ bl OS_GetInitArenaLo
+ mov r1,r0
+ mov r0,#0x6
+ bl OS_SetArenaLo
+ add sp,sp,#0x4
+ ldmia sp!,{ lr }
+ bx lr
+}
#else
+void OS_InitArena() {
if (OSi_Initialized) {
return;
}
@@ -385,45 +387,45 @@ void OS_InitArena() {
OS_SetArenaHi(OS_ARENA_WRAM_MAIN, OS_GetInitArenaHi(OS_ARENA_WRAM_MAIN));
OS_SetArenaLo(OS_ARENA_WRAM_MAIN, OS_GetInitArenaLo(OS_ARENA_WRAM_MAIN));
-#endif
}
+#endif
#define HEADERSIZE OSi_ROUND(sizeof(Cell), 32)
#define MINOBJSIZE (HEADERSIZE+32)
-void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) {
#ifdef MATCH_ASM
- __asm {
- stmdb sp!,{ r4 r5 r6 r7 lr }
- sub sp,sp,#0x4
- mov r7,param_1
- mov r5,param_2
- mov r4,param_3
- bl OS_DisableInterrupts
- ldr param_2,OSiHeapInfo
- mov r6,param_1
- ldr param_1,[param_2,r7,lsl #0x2]
- cmp r5,#0x0
- ldrlt r5,[param_1,#0x0]
- ldr param_2,[param_1,#0x10]
- mov param_1,#0xc
- mla r7,r5,param_1,param_2
- sub r4,r4,#0x20
- ldr param_1,[r7,#0x8]
- mov param_2,r4
- bl DLExtract
- str param_1,[r7,#0x8]
- ldr param_1,[r7,#0x4]
- mov param_2,r4
- bl DLInsert
- str param_1,[r7,#0x4]
- mov param_1,r6
- bl OS_RestoreInterrupts
- add sp,sp,#0x4
- ldmia sp!,{ r4 r5 r6 r7 lr }
- bx lr
- }
+asm void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) {
+ stmdb sp!, {r4-r7, lr}
+ sub sp,sp,#0x4
+ mov r7,r0
+ mov r5,r1
+ mov r4,r2
+ bl OS_DisableInterrupts
+ ldr r1,=OSiHeapInfo
+ mov r6,r0
+ ldr r0,[r1,r7,lsl #0x2]
+ cmp r5,#0x0
+ ldrlt r5,[r0,#0x0]
+ ldr r1,[r0,#0x10]
+ mov r0,#0xc
+ mla r7,r5,r0,r1
+ sub r4,r4,#0x20
+ ldr r0,[r7,#0x8]
+ mov r1,r4
+ bl DLExtract
+ str r0,[r7,#0x8]
+ ldr r0,[r7,#0x4]
+ mov r1,r4
+ bl DLInsert
+ str r0,[r7,#0x4]
+ mov r0,r6
+ bl OS_RestoreInterrupts
+ add sp,sp,#0x4
+ ldmia sp!,{ r4-r7, lr }
+ bx lr
+}
#else
+void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) {
OSHeapInfo *heapInfo;
HeapDesc *hd;
Cell *cell;
@@ -442,16 +444,94 @@ void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) {
hd->free = DLInsert(hd->free, cell);
OS_RestoreInterrupts(enabled);
-
-#endif
}
+#endif
-void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) {
#ifdef MATCH_ASM
- __asm {
- // TODO
- }
+asm void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) {
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r6, r0
+ mov r5, r1
+ mov r7, r2
+ bl OS_DisableInterrupts
+ ldr r1, =OSiHeapInfo
+ mov r4, r0
+ ldr r1, [r1, r6, lsl #0x2]
+ cmp r1, #0x0
+ bne _020CC7AC
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020CC7AC:
+ cmp r5, #0x0
+ ldrlt r5, [r1, #0x0]
+ ldr r1, [r1, #0x10]
+ mov r0, #0xc
+ mla r6, r5, r0, r1
+ ldr r0, [r6, #0x4]
+ add r1, r7, #0x20
+ add r1, r1, #0x1f
+ mov r5, r0
+ cmp r0, #0x0
+ bic r7, r1, #0x1f
+ beq _020CC7F4
+_020CC7DC:
+ ldr r1, [r5, #0x8]
+ cmp r7, r1
+ ble _020CC7F4
+ ldr r5, [r5, #0x4]
+ cmp r5, #0x0
+ bne _020CC7DC
+_020CC7F4:
+ cmp r5, #0x0
+ bne _020CC814
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020CC814:
+ ldr r1, [r5, #0x8]
+ sub r1, r1, r7
+ cmp r1, #0x40
+ bhs _020CC834
+ mov r1, r5
+ bl DLExtract
+ str r0, [r6, #0x4]
+ b _020CC86C
+_020CC834:
+ str r7, [r5, #0x8]
+ add r2, r5, r7
+ str r1, [r2, #0x8]
+ ldr r0, [r5, #0x0]
+ str r0, [r5, r7]
+ ldr r0, [r5, #0x4]
+ str r0, [r2, #0x4]
+ ldr r0, [r2, #0x4]
+ cmp r0, #0x0
+ strne r2, [r0, #0x0]
+ ldr r0, [r2, #0x0]
+ cmp r0, #0x0
+ strne r2, [r0, #0x4]
+ streq r2, [r6, #0x4]
+_020CC86C:
+ ldr r0, [r6, #0x8]
+ mov r1, r5
+ bl DLAddFront
+ str r0, [r6, #0x8]
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add r0, r5, #0x20
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+}
#else
+void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) {
OSHeapInfo* heapInfo;
HeapDesc* hd;
Cell* cell;
@@ -512,6 +592,5 @@ void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) {
OS_RestoreInterrupts(enabled);
return (void *)((char *)cell + HEADERSIZE);
-
-#endif
-} \ No newline at end of file
+}
+#endif \ No newline at end of file
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 09a3ce29..e6f5b4cf 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -290,6 +290,8 @@ FUN_020C9418 = 0x020C9418;
FUN_020C9480 = 0x020C9480;
FUN_020C94E8 = 0x020C94E8;
FUN_020C9550 = 0x020C9550;
+OS_SetProtectionRegion1 = 0x020CC9EC;
+OS_SetProtectionRegion2 = 0x020CC9F4;
OS_SpinWait = 0x020CD380;
FUN_020D5150 = 0x020D5150;
FUN_020D5168 = 0x020D5168;