diff options
author | red031000 <rubenru09@aol.com> | 2020-04-23 19:43:49 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-04-23 19:43:49 +0100 |
commit | d92774c7db0d5655f271d2cefc0831afbd091954 (patch) | |
tree | c4f2f76580961e60127017ce43007fcfe1d5c757 | |
parent | 0612b1de9f20f80ca082971d433942944350a9fe (diff) |
fix match_asm for os_alloc.c
-rw-r--r-- | include/nitro/os_alloc.c | 601 | ||||
-rw-r--r-- | undefined_syms.txt | 2 |
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; |