From 0a7f7fc909c2bc0120002693a6b2052704a375fd Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 18 Aug 2021 20:11:27 -0400 Subject: NNS_FND_allocator --- arm9/Makefile | 2 + arm9/asm/NNS_FND_allocator.s | 65 --------------------------------- arm9/lib/libnns/src/NNS_FND_allocator.c | 32 ++++++++++++++++ 3 files changed, 34 insertions(+), 65 deletions(-) delete mode 100644 arm9/asm/NNS_FND_allocator.s create mode 100644 arm9/lib/libnns/src/NNS_FND_allocator.c diff --git a/arm9/Makefile b/arm9/Makefile index b48ac56c..9203117b 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -194,6 +194,8 @@ ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(ASM_DIRS) $(LIB $(BUILD_DIR)/lib/%.o: MWCCVERSION = 1.2/sp2p3 $(BUILD_DIR)/lib/%.o: CFLAGS = -O4,p -gccext,on -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -interworking -DFS_IMPLEMENT -enum int -W all -i ../include -ir ../include-mw -ir lib/libc/include -ir lib/libnns/include -ir lib/NitroSDK/include +$(BUILD_DIR)/lib/%.o: MWCCVERSION = 1.2/sp3 + # FIXME: Using -ipa file breaks .rodata alignment $(BUILD_DIR)/src/math_util.o: CFLAGS = -O4,p -gccext,on -proc arm946e -fp soft -lang c99 -Cpp_exceptions off $(foreach dir,$(INCLUDE_DIRS),-i $(dir)) $(foreach dir,$(INCLUDE_RECURSIVE_DIRS),-ir $(dir)) -interworking -DFS_IMPLEMENT -enum int -W all -D$(GAME_VERSION) -D$(GAME_LANGUAGE) diff --git a/arm9/asm/NNS_FND_allocator.s b/arm9/asm/NNS_FND_allocator.s deleted file mode 100644 index 537ce6a0..00000000 --- a/arm9/asm/NNS_FND_allocator.s +++ /dev/null @@ -1,65 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .rodata - ; static const in function - - .global sAllocatorFunc$7864 -sAllocatorFunc$7864: ; 0x020FF7CC - .word AllocatorAllocForExpHeap - .word AllocatorFreeForExpHeap - .text - - arm_func_start NNS_FndInitAllocatorForExpHeap -NNS_FndInitAllocatorForExpHeap: ; 0x020AE82C - ldr ip, _020AE848 ; =sAllocatorFunc$7864 - mov r3, #0x0 - str r12, [r0, #0x0] - str r1, [r0, #0x4] - str r2, [r0, #0x8] - str r3, [r0, #0xc] - bx lr - .balign 4 -_020AE848: .word sAllocatorFunc$7864 - arm_func_end NNS_FndInitAllocatorForExpHeap - - arm_func_start NNS_FndFreeToAllocator -NNS_FndFreeToAllocator: ; 0x020AE84C - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, [r0, #0x0] - ldr r2, [r2, #0x4] - blx r2 - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndFreeToAllocator - - arm_func_start NNS_FndAllocFromAllocator -NNS_FndAllocFromAllocator: ; 0x020AE868 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, [r0, #0x0] - ldr r2, [r2, #0x0] - blx r2 - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndAllocFromAllocator - - arm_func_start AllocatorFreeForExpHeap -AllocatorFreeForExpHeap: ; 0x020AE884 - ldr ip, _020AE890 ; =NNS_FndFreeToExpHeap - ldr r0, [r0, #0x4] - bx r12 - .balign 4 -_020AE890: .word NNS_FndFreeToExpHeap - arm_func_end AllocatorFreeForExpHeap - - arm_func_start AllocatorAllocForExpHeap -AllocatorAllocForExpHeap: ; 0x020AE894 - ldr ip, _020AE8A8 ; =NNS_FndAllocFromExpHeapEx - mov r2, r0 - ldr r0, [r2, #0x4] - ldr r2, [r2, #0x8] - bx r12 - .balign 4 -_020AE8A8: .word NNS_FndAllocFromExpHeapEx - arm_func_end AllocatorAllocForExpHeap diff --git a/arm9/lib/libnns/src/NNS_FND_allocator.c b/arm9/lib/libnns/src/NNS_FND_allocator.c new file mode 100644 index 00000000..31d0eb70 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_allocator.c @@ -0,0 +1,32 @@ +#include "nitro.h" +#include "NNS_FND_allocator.h" +#include "NNS_FND_expheap.h" + +void *AllocatorAllocForExpHeap(NNSFndAllocator * pAllocator, u32 size) +{ + return NNS_FndAllocFromExpHeapEx(pAllocator->pHeap, size, pAllocator->heapParam1); +} + +void AllocatorFreeForExpHeap(NNSFndAllocator * pAllocator, void *memBlock) +{ + NNS_FndFreeToExpHeap(pAllocator->pHeap, memBlock); +} + +void *NNS_FndAllocFromAllocator(NNSFndAllocator * pAllocator, u32 size) +{ + return pAllocator->pFunc->pfAlloc(pAllocator, size); +} + +void NNS_FndFreeToAllocator(NNSFndAllocator * pAllocator, void *memBlock) +{ + pAllocator->pFunc->pfFree(pAllocator, memBlock); +} + +void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle pHeap, int alignment) +{ + static const NNSFndAllocatorFunc pFunc = {AllocatorAllocForExpHeap, AllocatorFreeForExpHeap}; + pAllocator->pFunc = &pFunc; + pAllocator->pHeap = pHeap; + pAllocator->heapParam1 = alignment; + pAllocator->heapParam2 = 0; +} -- cgit v1.2.3 From 37461da16af3814029d9ae6adcdb6483872a6eb4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 18 Aug 2021 20:51:11 -0400 Subject: NNS_FND_heapcommon --- arm9/asm/NNS_FND_heapcommon.s | 112 ------------------------------- arm9/lib/libnns/include/NNS_FND_list.h | 15 +++++ arm9/lib/libnns/src/NNS_FND_heapcommon.c | 61 +++++++++++++++++ 3 files changed, 76 insertions(+), 112 deletions(-) delete mode 100644 arm9/asm/NNS_FND_heapcommon.s create mode 100644 arm9/lib/libnns/src/NNS_FND_heapcommon.c diff --git a/arm9/asm/NNS_FND_heapcommon.s b/arm9/asm/NNS_FND_heapcommon.s deleted file mode 100644 index ca3108d2..00000000 --- a/arm9/asm/NNS_FND_heapcommon.s +++ /dev/null @@ -1,112 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global sRootListInitialized -sRootListInitialized: ; 0x021CCD38 - .space 0x4 - - .global sRootList -sRootList: ; 0x021CCD3C - .space 0xc - .text - - arm_func_start NNSi_FndFinalizeHeap -NNSi_FndFinalizeHeap: ; 0x020ADC8C - stmdb sp!, {r4,lr} - mov r4, r0 - bl FindListContainHeap - mov r1, r4 - bl NNS_FndRemoveListObject - ldmia sp!, {r4,pc} - arm_func_end NNSi_FndFinalizeHeap - - arm_func_start NNSi_FndInitHeapHead -NNSi_FndInitHeapHead: - stmdb sp!, {r4,lr} - mov r4, r0 - str r1, [r4, #0x0] - str r2, [r4, #0x18] - str r3, [r4, #0x1c] - mov r0, #0x0 - str r0, [r4, #0x20] - ldr r1, [r4, #0x20] - ldrh r0, [sp, #0x8] - bic r1, r1, #0xff - str r1, [r4, #0x20] - ldr r1, [r4, #0x20] - and r0, r0, #0xff - orr r2, r1, r0 - add r0, r4, #0xc - mov r1, #0x4 - str r2, [r4, #0x20] - bl NNS_FndInitList - ldr r0, _020ADD28 ; =sRootListInitialized - ldr r0, [r0, #0x0] - cmp r0, #0x0 - bne _020ADD14 - ldr r0, _020ADD2C ; =sRootList - mov r1, #0x4 - bl NNS_FndInitList - ldr r0, _020ADD28 ; =sRootListInitialized - mov r1, #0x1 - str r1, [r0, #0x0] -_020ADD14: - mov r0, r4 - bl FindListContainHeap - mov r1, r4 - bl NNS_FndAppendListObject - ldmia sp!, {r4,pc} - .balign 4 -_020ADD28: .word sRootListInitialized -_020ADD2C: .word sRootList - arm_func_end NNSi_FndInitHeapHead - - arm_func_start FindListContainHeap -FindListContainHeap: ; 0x020ADD30 - stmdb sp!, {r4,lr} - ldr r4, _020ADD54 ; =sRootList - mov r1, r0 - mov r0, r4 - bl FindContainHeap - cmp r0, #0x0 - addne r4, r0, #0xc - mov r0, r4 - ldmia sp!, {r4,pc} - .balign 4 -_020ADD54: .word sRootList - arm_func_end FindListContainHeap - - arm_func_start FindContainHeap -FindContainHeap: - stmdb sp!, {r4-r6,lr} - mov r5, r1 - mov r1, #0x0 - mov r6, r0 - bl NNS_FndGetNextListObject - movs r4, r0 - beq _020ADDB8 -_020ADD74: - ldr r0, [r4, #0x18] - cmp r0, r5 - bhi _020ADDA4 - ldr r0, [r4, #0x1c] - cmp r5, r0 - bhs _020ADDA4 - mov r1, r5 - add r0, r4, #0xc - bl FindContainHeap - cmp r0, #0x0 - moveq r0, r4 - ldmia sp!, {r4-r6,pc} -_020ADDA4: - mov r0, r6 - mov r1, r4 - bl NNS_FndGetNextListObject - movs r4, r0 - bne _020ADD74 -_020ADDB8: - mov r0, #0x0 - ldmia sp!, {r4-r6,pc} - arm_func_end FindContainHeap diff --git a/arm9/lib/libnns/include/NNS_FND_list.h b/arm9/lib/libnns/include/NNS_FND_list.h index 5fec2fdf..4bba7882 100644 --- a/arm9/lib/libnns/include/NNS_FND_list.h +++ b/arm9/lib/libnns/include/NNS_FND_list.h @@ -17,4 +17,19 @@ typedef struct } NNSFndList; +void NNS_FndInitList( + NNSFndList *pList, + s32 alignment +); + +void NNS_FndAppendListObject( + NNSFndList *pList, + void* object +); + +void NNS_FndRemoveListObject( + NNSFndList *pList, + void* object +); + #endif //GUARD_NNS_FND_LIST_H diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c new file mode 100644 index 00000000..2520aab2 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -0,0 +1,61 @@ +#include "nitro.h" +#include "NNS_FND_heapcommon.h" +#include "NNS_FND_list.h" + +BOOL sRootListInitialized; +NNSFndList sRootList; + +static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 option_flag) +{ + pHead->attribute &= ~0xFF; + pHead->attribute |= option_flag; +} + +void *NNS_FndGetNextListObject(NNSFndList *, void *); + +NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +{ + NNSiFndHeapHead * pHead = NULL; + + while ((pHead = NNS_FndGetNextListObject(pList, pHead)) != NULL) + { + if (pHead->heapStart <= memBlock && memBlock < pHead->heapEnd) + { + NNSiFndHeapHead * ret = FindContainHeap(&pHead->childList, memBlock); + if (ret == NULL) + ret = pHead; + return ret; + } + } + return NULL; +} + +NNSFndList* FindListContainHeap(const void * memBlock) +{ + NNSFndList* ret = &sRootList; + NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); + if (pHead != NULL) + ret = &pHead->childList; + return ret; +} + +void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag) +{ + pHead->signature = signature; + pHead->heapStart = heapStart; + pHead->heapEnd = heapEnd; + pHead->attribute = 0; + NNSi_FndHeapHeadSetOptionFlag(pHead, optionFlag); + NNS_FndInitList(&pHead->childList, 4); + if (!sRootListInitialized) + { + NNS_FndInitList(&sRootList, 4); + sRootListInitialized = TRUE; + } + NNS_FndAppendListObject(FindListContainHeap(pHead), pHead); +} + +void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead) +{ + NNS_FndRemoveListObject(FindListContainHeap(pHead), pHead); +} -- cgit v1.2.3 From 0b1d351cd70a5b5e170d77d2880f806d88d45073 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 08:33:07 -0400 Subject: NNS_FND_list --- arm9/asm/NNS_FND_list.s | 169 ------------------------------- arm9/lib/libnns/src/NNS_FND_heapcommon.c | 4 +- arm9/lib/libnns/src/NNS_FND_list.c | 128 +++++++++++++++++++++++ 3 files changed, 130 insertions(+), 171 deletions(-) delete mode 100644 arm9/asm/NNS_FND_list.s create mode 100644 arm9/lib/libnns/src/NNS_FND_list.c diff --git a/arm9/asm/NNS_FND_list.s b/arm9/asm/NNS_FND_list.s deleted file mode 100644 index 21999c11..00000000 --- a/arm9/asm/NNS_FND_list.s +++ /dev/null @@ -1,169 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .text - - arm_func_start NNS_FndGetPrevListObject -NNS_FndGetPrevListObject: ; 0x020ADA84 - cmp r1, #0x0 - ldreq r0, [r0, #0x4] - ldrneh r0, [r0, #0xa] - ldrne r0, [r1, r0] - bx lr - arm_func_end NNS_FndGetPrevListObject - - arm_func_start NNS_FndGetNextListObject -NNS_FndGetNextListObject: ; 0x020ADA98 - cmp r1, #0x0 - ldreq r0, [r0, #0x0] - ldrneh r0, [r0, #0xa] - addne r0, r1, r0 - ldrne r0, [r0, #0x4] - bx lr - arm_func_end NNS_FndGetNextListObject - - arm_func_start NNS_FndRemoveListObject -NNS_FndRemoveListObject: ; 0x020ADAB0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldrh r12, [r0, #0xa] - ldr r3, [r1, r12] - add lr, r1, r12 - cmp r3, #0x0 - ldreq r1, [lr, #0x4] - streq r1, [r0, #0x0] - ldrne r2, [lr, #0x4] - addne r1, r3, r12 - strne r2, [r1, #0x4] - ldr r3, [lr, #0x4] - cmp r3, #0x0 - ldreq r1, [lr, #0x0] - streq r1, [r0, #0x4] - ldrneh r1, [r0, #0xa] - ldrne r2, [lr, #0x0] - strne r2, [r3, r1] - mov r1, #0x0 - str r1, [lr, #0x0] - str r1, [lr, #0x4] - ldrh r1, [r0, #0x8] - sub r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndRemoveListObject - - arm_func_start NNS_FndInsertListObject -NNS_FndInsertListObject: ; 0x020ADB18 - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r1, #0x0 - bne _020ADB38 - mov r1, r2 - bl NNS_FndAppendListObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADB38: - ldr r3, [r0, #0x0] - cmp r1, r3 - bne _020ADB54 - mov r1, r2 - bl NNS_FndPrependListObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADB54: - ldrh lr, [r0, #0xa] - ldr r3, [r1, lr] - add r12, r2, lr - str r3, [r2, lr] - str r1, [r12, #0x4] - add r3, r3, lr - str r2, [r3, #0x4] - ldrh r3, [r0, #0xa] - str r2, [r1, r3] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndInsertListObject - - arm_func_start NNS_FndPrependListObject -NNS_FndPrependListObject: ; 0x020ADB8C - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, [r0, #0x0] - cmp r2, #0x0 - bne _020ADBAC - bl SetFirstObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADBAC: - ldrh r3, [r0, #0xa] - mov r2, #0x0 - str r2, [r1, r3] - ldr r2, [r0, #0x0] - add r3, r1, r3 - str r2, [r3, #0x4] - ldrh r2, [r0, #0xa] - ldr r3, [r0, #0x0] - str r1, [r3, r2] - str r1, [r0, #0x0] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndPrependListObject - - arm_func_start NNS_FndAppendListObject -NNS_FndAppendListObject: ; 0x020ADBE8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, [r0, #0x0] - cmp r2, #0x0 - bne _020ADC08 - bl SetFirstObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADC08: - ldrh r12, [r0, #0xa] - ldr r3, [r0, #0x4] - mov r2, #0x0 - str r3, [r1, r12] - add r3, r1, r12 - str r2, [r3, #0x4] - ldrh r2, [r0, #0xa] - ldr r3, [r0, #0x4] - add r2, r3, r2 - str r1, [r2, #0x4] - str r1, [r0, #0x4] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndAppendListObject - - arm_func_start SetFirstObject -SetFirstObject: ; 0x020ADC48 - ldrh r3, [r0, #0xa] - mov r2, #0x0 - add r12, r1, r3 - str r2, [r12, #0x4] - str r2, [r1, r3] - str r1, [r0, #0x0] - str r1, [r0, #0x4] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - bx lr - arm_func_end SetFirstObject - - arm_func_start NNS_FndInitList -NNS_FndInitList: ; 0x020ADC74 - mov r2, #0x0 - str r2, [r0, #0x0] - str r2, [r0, #0x4] - strh r2, [r0, #0x8] - strh r1, [r0, #0xa] - bx lr - arm_func_end NNS_FndInitList diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 2520aab2..664007f1 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -13,7 +13,7 @@ static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 opti void *NNS_FndGetNextListObject(NNSFndList *, void *); -NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) { NNSiFndHeapHead * pHead = NULL; @@ -30,7 +30,7 @@ NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) return NULL; } -NNSFndList* FindListContainHeap(const void * memBlock) +static NNSFndList* FindListContainHeap(const void * memBlock) { NNSFndList* ret = &sRootList; NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); diff --git a/arm9/lib/libnns/src/NNS_FND_list.c b/arm9/lib/libnns/src/NNS_FND_list.c new file mode 100644 index 00000000..d4dd7620 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_list.c @@ -0,0 +1,128 @@ +#include "nitro.h" +#include "NNS_FND_list.h" + +#define OBJ_TO_LINK(list, obj) ((NNSFndLink*)((void*)(obj) + (list)->offset)) + +void NNS_FndInitList(NNSFndList* list, s32 alignment) +{ + list->headObject = NULL; + list->tailObject = NULL; + list->numObjects = 0; + list->offset = (u16)alignment; +} + +static void SetFirstObject(NNSFndList* list, void* object) +{ + NNSFndLink* tail = OBJ_TO_LINK(list, object); + tail->nextObject = NULL; + tail->prevObject = NULL; + list->headObject = object; + list->tailObject = object; + list->numObjects++; +} + +void NNS_FndAppendListObject(NNSFndList* list, void* object) +{ + if (list->headObject == NULL) + { + SetFirstObject(list, object); + } + else + { + NNSFndLink *tail = OBJ_TO_LINK(list, object); + tail->prevObject = list->tailObject; + tail->nextObject = NULL; + OBJ_TO_LINK(list, list->tailObject)->nextObject = object; + list->tailObject = object; + list->numObjects++; + } +} + +void NNS_FndPrependListObject(NNSFndList* list, void* object) +{ + if (list->headObject == NULL) + { + SetFirstObject(list, object); + } + else + { + NNSFndLink *tail = OBJ_TO_LINK(list, object); + tail->prevObject = NULL; + tail->nextObject = list->headObject; + OBJ_TO_LINK(list, list->headObject)->prevObject = object; + list->headObject = object; + list->numObjects++; + } +} + +void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) +{ + if (where == NULL) + { + NNS_FndAppendListObject(list, object); + } + + else if (where == list->headObject) + { + NNS_FndPrependListObject(list, object); + } + else + { + NNSFndLink* tail = OBJ_TO_LINK(list, object); + void* prevObject = OBJ_TO_LINK(list, where)->prevObject; + NNSFndLink* head = OBJ_TO_LINK(list, prevObject); + tail->prevObject = prevObject; + tail->nextObject = where; + head->nextObject = object; + OBJ_TO_LINK(list, where)->prevObject = object; + list->numObjects++; + } +} + +void NNS_FndRemoveListObject(NNSFndList* list, void* object) +{ + NNSFndLink* node = OBJ_TO_LINK(list, object); + if (node->prevObject == NULL) + { + list->headObject = node->nextObject; + } + else + { + OBJ_TO_LINK(list, node->prevObject)->nextObject = node->nextObject; + } + if (node->nextObject == NULL) + { + list->tailObject = node->prevObject; + } + else + { + OBJ_TO_LINK(list, node->nextObject)->prevObject = node->prevObject; + } + node->prevObject = NULL; + node->nextObject = NULL; + list->numObjects--; +} + +void * NNS_FndGetNextListObject(NNSFndList* list, void* object) +{ + if (object == NULL) + { + return list->headObject; + } + else + { + return OBJ_TO_LINK(list, object)->nextObject; + } +} + +void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) +{ + if (object == NULL) + { + return list->tailObject; + } + else + { + return OBJ_TO_LINK(list, object)->prevObject; + } +} -- cgit v1.2.3 From 20f4d403e487ac1f67d4bdff6e22c91e7d4e68ad Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 10:06:44 -0400 Subject: Fix Makefile --- arm9/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arm9/Makefile b/arm9/Makefile index 9203117b..e3c573b7 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -194,7 +194,7 @@ ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(ASM_DIRS) $(LIB $(BUILD_DIR)/lib/%.o: MWCCVERSION = 1.2/sp2p3 $(BUILD_DIR)/lib/%.o: CFLAGS = -O4,p -gccext,on -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -interworking -DFS_IMPLEMENT -enum int -W all -i ../include -ir ../include-mw -ir lib/libc/include -ir lib/libnns/include -ir lib/NitroSDK/include -$(BUILD_DIR)/lib/%.o: MWCCVERSION = 1.2/sp3 +$(BUILD_DIR)/lib/libnns/%.o: MWCCVERSION = 1.2/sp3 # FIXME: Using -ipa file breaks .rodata alignment $(BUILD_DIR)/src/math_util.o: CFLAGS = -O4,p -gccext,on -proc arm946e -fp soft -lang c99 -Cpp_exceptions off $(foreach dir,$(INCLUDE_DIRS),-i $(dir)) $(foreach dir,$(INCLUDE_RECURSIVE_DIRS),-ir $(dir)) -interworking -DFS_IMPLEMENT -enum int -W all -D$(GAME_VERSION) -D$(GAME_LANGUAGE) -- cgit v1.2.3 From db7cbefcdf746fbc34179f33c0930ebd07ee6f0a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 19:51:52 -0400 Subject: NNS_FND_expheap, 1 --- arm9/arm9.lsf | 1 + arm9/asm/NNS_FND_expheap.s | 583 --------------------------- arm9/asm/NNS_FND_expheap_s.s | 526 ++++++++++++++++++++++++ arm9/lib/libnns/include/NNS_FND_heapcommon.h | 64 +++ arm9/lib/libnns/src/NNS_FND_expheap.c | 92 +++++ arm9/lib/libnns/src/NNS_FND_heapcommon.c | 8 +- 6 files changed, 684 insertions(+), 590 deletions(-) delete mode 100644 arm9/asm/NNS_FND_expheap.s create mode 100644 arm9/asm/NNS_FND_expheap_s.s create mode 100644 arm9/lib/libnns/src/NNS_FND_expheap.c diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index 8287f133..74e31f79 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -358,6 +358,7 @@ Static arm9 ### Nitro System SDK ### Object NNS_FND_list.o Object NNS_FND_heapcommon.o + Object NNS_FND_expheap_s.o Object NNS_FND_expheap.o Object NNS_FND_frameheap.o Object NNS_FND_allocator.o diff --git a/arm9/asm/NNS_FND_expheap.s b/arm9/asm/NNS_FND_expheap.s deleted file mode 100644 index e94dba38..00000000 --- a/arm9/asm/NNS_FND_expheap.s +++ /dev/null @@ -1,583 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .extern NNSi_FndInitHeapHead - .extern NNSi_FndFinalizeHeap - .text - - arm_func_start NNS_FndGetSizeForMBlockExpHeap -NNS_FndGetSizeForMBlockExpHeap: ; 0x020ADDC0 - ldr r0, [r0, #-0xc] - bx lr - arm_func_end NNS_FndGetSizeForMBlockExpHeap - - arm_func_start NNS_FndGetTotalFreeSizeForExpHeap -NNS_FndGetTotalFreeSizeForExpHeap: ; 0x020ADDC8 - ldr r2, [r0, #0x24] - mov r0, #0x0 - cmp r2, #0x0 - bxeq lr -_020ADDD8: - ldr r1, [r2, #0x4] - ldr r2, [r2, #0xc] - add r0, r0, r1 - cmp r2, #0x0 - bne _020ADDD8 - bx lr - arm_func_end NNS_FndGetTotalFreeSizeForExpHeap - - arm_func_start NNS_FndFreeToExpHeap -NNS_FndFreeToExpHeap: ; 0x020ADDF0 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0xc - sub r4, r1, #0x10 - add r5, r0, #0x24 - add r0, sp, #0x0 - mov r1, r4 - bl GetRegionOfMBlock - mov r1, r4 - add r0, r5, #0x8 - bl RemoveMBlock - add r1, sp, #0x0 - mov r0, r5 - bl RecycleRegion - add sp, sp, #0xc - ldmia sp!, {r4-r5,pc} - arm_func_end NNS_FndFreeToExpHeap - - arm_func_start NNS_FndResizeForMBlockExpHeap -NNS_FndResizeForMBlockExpHeap: ; 0x020ADE2C - stmdb sp!, {r4-r10,lr} - sub sp, sp, #0x10 - mov r4, r1 - mov r10, r2 - sub r6, r4, #0x10 - add r1, r10, #0x3 - mov r5, r0 - ldr r8, [r6, #0x4] - bic r10, r1, #0x3 - cmp r10, r8 - add r7, r5, #0x24 - addeq sp, sp, #0x10 - moveq r0, r10 - ldmeqia sp!, {r4-r10,pc} - cmp r10, r8 - bls _020ADF60 - ldr r9, [r7, #0x0] - add r0, r6, #0x10 - cmp r9, #0x0 - add r0, r8, r0 - beq _020ADE94 -_020ADE80: - cmp r9, r0 - beq _020ADE94 - ldr r9, [r9, #0xc] - cmp r9, #0x0 - bne _020ADE80 -_020ADE94: - cmp r9, #0x0 - beq _020ADEB0 - ldr r0, [r9, #0x4] - add r1, r8, #0x10 - add r0, r1, r0 - cmp r10, r0 - bls _020ADEBC -_020ADEB0: - add sp, sp, #0x10 - mov r0, #0x0 - ldmia sp!, {r4-r10,pc} -_020ADEBC: - add r0, sp, #0x0 - mov r1, r9 - bl GetRegionOfMBlock - mov r0, r7 - mov r1, r9 - bl RemoveMBlock - ldr r2, [sp, #0x4] - add r3, r10, r4 - ldr r9, [sp, #0x0] - sub r1, r2, r3 - str r3, [sp, #0x0] - cmp r1, #0x10 - strcc r2, [sp, #0x0] - mov r8, r0 - ldr r0, [sp, #0x0] - sub r0, r0, r4 - str r0, [r6, #0x4] - ldr r1, [sp, #0x4] - ldr r0, [sp, #0x0] - sub r0, r1, r0 - cmp r0, #0x10 - blo _020ADF30 - ldr r1, _020ADF9C ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r8 - bl InsertMBlock -_020ADF30: - ldr r0, [r5, #0x20] - ldr r1, [sp, #0x0] - and r0, r0, #0xff - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - sub r2, r1, r9 - ands r0, r0, #0x1 - beq _020ADF90 - mov r1, r9 - mov r0, #0x0 - bl MIi_CpuClear32 - b _020ADF90 -_020ADF60: - add r0, r10, r4 - str r0, [sp, #0x8] - ldr r1, [r6, #0x4] - add r0, r6, #0x10 - add r0, r1, r0 - str r0, [sp, #0xc] - add r1, sp, #0x8 - mov r0, r7 - str r10, [r6, #0x4] - bl RecycleRegion - cmp r0, #0x0 - streq r8, [r6, #0x4] -_020ADF90: - ldr r0, [r6, #0x4] - add sp, sp, #0x10 - ldmia sp!, {r4-r10,pc} - .balign 4 -_020ADF9C: .word 0x00004652 - arm_func_end NNS_FndResizeForMBlockExpHeap - - arm_func_start NNS_FndAllocFromExpHeapEx -NNS_FndAllocFromExpHeapEx: ; 0x020ADFA0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r1, #0x0 - moveq r1, #0x1 - add r1, r1, #0x3 - cmp r2, #0x0 - bic r1, r1, #0x3 - blt _020ADFCC - bl AllocFromHead - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADFCC: - rsb r2, r2, #0x0 - bl AllocFromTail - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndAllocFromExpHeapEx - - arm_func_start NNS_FndDestroyExpHeap -NNS_FndDestroyExpHeap: ; 0x020ADFDC - ldr ip, _020ADFE4 ; =NNSi_FndFinalizeHeap - bx r12 - .balign 4 -_020ADFE4: .word NNSi_FndFinalizeHeap - arm_func_end NNS_FndDestroyExpHeap - - arm_func_start NNS_FndCreateExpHeapEx -NNS_FndCreateExpHeapEx: ; 0x020ADFE8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - add r1, r1, r0 - add r0, r0, #0x3 - bic r1, r1, #0x3 - bic r0, r0, #0x3 - cmp r0, r1 - bhi _020AE014 - sub r3, r1, r0 - cmp r3, #0x4c - bhs _020AE020 -_020AE014: - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {pc} -_020AE020: - bl InitExpHeap - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndCreateExpHeapEx - - arm_func_start RecycleRegion -RecycleRegion: - stmdb sp!, {r4-r6,lr} - sub sp, sp, #0x8 - mov r5, r1 - ldr r2, [r5, #0x0] - ldr r1, [r5, #0x4] - mov r6, r0 - str r2, [sp, #0x0] - str r1, [sp, #0x4] - ldr r1, [r6, #0x0] - mov r4, #0x0 - cmp r1, #0x0 - beq _020AE0A0 - ldr r0, [r5, #0x0] -_020AE060: - cmp r1, r0 - movcc r4, r1 - blo _020AE094 - ldr r0, [r5, #0x4] - cmp r1, r0 - bne _020AE0A0 - ldr r2, [r1, #0x4] - add r0, r1, #0x10 - add r2, r2, r0 - mov r0, r6 - str r2, [sp, #0x4] - bl RemoveMBlock - b _020AE0A0 -_020AE094: - ldr r1, [r1, #0xc] - cmp r1, #0x0 - bne _020AE060 -_020AE0A0: - cmp r4, #0x0 - beq _020AE0D4 - ldr r2, [r4, #0x4] - add r1, r4, #0x10 - ldr r0, [r5, #0x0] - add r1, r2, r1 - cmp r1, r0 - bne _020AE0D4 - mov r0, r6 - mov r1, r4 - str r4, [sp, #0x0] - bl RemoveMBlock - mov r4, r0 -_020AE0D4: - ldr r1, [sp, #0x4] - ldr r0, [sp, #0x0] - sub r0, r1, r0 - cmp r0, #0x10 - addcc sp, sp, #0x8 - movcc r0, #0x0 - ldmccia sp!, {r4-r6,pc} - ldr r1, _020AE118 ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r6 - mov r2, r4 - bl InsertMBlock - mov r0, #0x1 - add sp, sp, #0x8 - ldmia sp!, {r4-r6,pc} - .balign 4 -_020AE118: .word 0x00004652 - arm_func_end RecycleRegion - - local_arm_func_start AllocFromTail -AllocFromTail: ; 0x020AE11C - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - add r0, r0, #0x24 - ldrh r4, [r0, #0x12] - mov r3, r1 - mvn lr, #0x0 - and r1, r4, #0x1 - mov r1, r1, lsl #0x10 - movs r1, r1, lsr #0x10 - moveq r5, #0x1 - mov r1, #0x0 - ldr r4, [r0, #0x4] - movne r5, #0x0 - mov r12, r1 - cmp r4, #0x0 - beq _020AE1B0 - sub r2, r2, #0x1 - mvn r2, r2 -_020AE164: - ldr r8, [r4, #0x4] - add r9, r4, #0x10 - add r6, r8, r9 - sub r6, r6, r3 - and r7, r2, r6 - subs r6, r7, r9 - bmi _020AE1A4 - cmp lr, r8 - bls _020AE1A4 - mov r1, r4 - mov lr, r8 - mov r12, r7 - cmp r5, #0x0 - bne _020AE1B0 - cmp r8, r3 - beq _020AE1B0 -_020AE1A4: - ldr r4, [r4, #0x8] - cmp r4, #0x0 - bne _020AE164 -_020AE1B0: - cmp r1, #0x0 - addeq sp, sp, #0x4 - moveq r0, #0x0 - ldmeqia sp!, {r4-r9,pc} - mov r4, #0x1 - mov r2, r12 - str r4, [sp, #0x0] - bl AllocUsedBlockFromFreeBlock - add sp, sp, #0x4 - ldmia sp!, {r4-r9,pc} - arm_func_end AllocFromTail - - local_arm_func_start AllocFromHead -AllocFromHead: ; 0x020AE1D8 - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - add r0, r0, #0x24 - ldrh r4, [r0, #0x12] - mov r3, r1 - ldr r5, [r0, #0x0] - and r1, r4, #0x1 - mov r1, r1, lsl #0x10 - movs r1, r1, lsr #0x10 - moveq r6, #0x1 - mov r1, #0x0 - movne r6, #0x0 - mov lr, r1 - cmp r5, #0x0 - mvn r4, #0x0 - beq _020AE270 - sub r12, r2, #0x1 - mvn r2, r12 -_020AE220: - add r8, r5, #0x10 - add r7, r12, r8 - and r9, r2, r7 - sub r7, r9, r8 - ldr r8, [r5, #0x4] - add r7, r3, r7 - cmp r8, r7 - blo _020AE264 - cmp r4, r8 - bls _020AE264 - mov r1, r5 - mov r4, r8 - mov lr, r9 - cmp r6, #0x0 - bne _020AE270 - cmp r8, r3 - beq _020AE270 -_020AE264: - ldr r5, [r5, #0xc] - cmp r5, #0x0 - bne _020AE220 -_020AE270: - cmp r1, #0x0 - addeq sp, sp, #0x4 - moveq r0, #0x0 - ldmeqia sp!, {r4-r9,pc} - mov r4, #0x0 - mov r2, lr - str r4, [sp, #0x0] - bl AllocUsedBlockFromFreeBlock - add sp, sp, #0x4 - ldmia sp!, {r4-r9,pc} - arm_func_end AllocFromHead - - arm_func_start AllocUsedBlockFromFreeBlock -AllocUsedBlockFromFreeBlock: ; 0x020AE298 - stmdb sp!, {r4-r8,lr} - sub sp, sp, #0x18 - mov r7, r0 - add r0, sp, #0x0 - mov r8, r1 - mov r6, r2 - mov r5, r3 - bl GetRegionOfMBlock - ldr r3, [sp, #0x4] - sub r4, r6, #0x10 - add r2, r5, r6 - mov r0, r7 - mov r1, r8 - str r4, [sp, #0x4] - str r3, [sp, #0xc] - str r2, [sp, #0x8] - bl RemoveMBlock - ldr r2, [sp, #0x0] - ldr r1, [sp, #0x4] - mov r5, r0 - sub r0, r1, r2 - cmp r0, #0x10 - strcc r2, [sp, #0x4] - blo _020AE318 - ldr r1, _020AE418 ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r5 - bl InsertMBlock - mov r5, r0 -_020AE318: - ldr r1, [sp, #0xc] - ldr r0, [sp, #0x8] - sub r0, r1, r0 - cmp r0, #0x10 - strcc r1, [sp, #0x8] - blo _020AE34C - ldr r1, _020AE418 ; =0x00004652 - add r0, sp, #0x8 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r5 - bl InsertMBlock -_020AE34C: - ldr r0, [r7, #-0x4] - ldr r1, [sp, #0x4] - and r0, r0, #0xff - mov r0, r0, lsl #0x10 - ldr r2, [sp, #0x8] - mov r0, r0, lsr #0x10 - sub r2, r2, r1 - ands r0, r0, #0x1 - beq _020AE378 - mov r0, #0x0 - bl MIi_CpuClear32 -_020AE378: - ldr r2, [sp, #0x8] - ldr r1, _020AE41C ; =0x00005544 - add r0, sp, #0x10 - str r4, [sp, #0x10] - str r2, [sp, #0x14] - bl InitMBlock - mov r1, r0 - ldrh r3, [r1, #0x2] - ldrh r2, [sp, #0x30] - add r0, r7, #0x8 - bic r3, r3, #0x8000 - strh r3, [r1, #0x2] - ldrh r3, [r1, #0x2] - and r2, r2, #0x1 - orr r2, r3, r2, lsl #0xf - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - ldr r3, [sp, #0x4] - bic r2, r2, #0x7f00 - strh r2, [r1, #0x2] - sub r2, r1, r3 - mov r2, r2, lsl #0x10 - mov r2, r2, lsr #0x10 - ldrh r3, [r1, #0x2] - and r2, r2, #0x7f - orr r2, r3, r2, lsl #0x8 - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - ldrh r3, [r7, #0x10] - bic r2, r2, #0xff - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - and r3, r3, #0xff - orr r2, r2, r3 - strh r2, [r1, #0x2] - ldr r2, [r7, #0xc] - bl InsertMBlock - mov r0, r6 - add sp, sp, #0x18 - ldmia sp!, {r4-r8,pc} - .balign 4 -_020AE418: .word 0x00004652 -_020AE41C: .word 0x00005544 - arm_func_end AllocUsedBlockFromFreeBlock - - arm_func_start InitExpHeap -InitExpHeap: ; 0x020AE420 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0xc - mov r5, r0 - mov r3, r1 - add r4, r5, #0x24 - str r2, [sp, #0x0] - ldr r1, _020AE498 ; =0x45585048 - add r2, r4, #0x14 - bl NNSi_FndInitHeapHead - mov r0, #0x0 - strh r0, [r4, #0x10] - strh r0, [r4, #0x12] - ldrh r2, [r4, #0x12] - ldr r1, _020AE49C ; =0x00004652 - add r0, sp, #0x4 - bic r2, r2, #0x1 - strh r2, [r4, #0x12] - ldr r2, [r5, #0x18] - str r2, [sp, #0x4] - ldr r2, [r5, #0x1c] - str r2, [sp, #0x8] - bl InitMBlock - str r0, [r5, #0x24] - str r0, [r4, #0x4] - mov r1, #0x0 - str r1, [r4, #0x8] - mov r0, r5 - str r1, [r4, #0xc] - add sp, sp, #0xc - ldmia sp!, {r4-r5,pc} - .balign 4 -_020AE498: .word 0x45585048 -_020AE49C: .word 0x00004652 - arm_func_end InitExpHeap - - arm_func_start InitMBlock -InitMBlock: ; 0x020AE4A0 - ldr r3, [r0, #0x0] - mov r2, #0x0 - strh r1, [r3, #0x0] - strh r2, [r3, #0x2] - ldr r1, [r0, #0x4] - add r0, r3, #0x10 - sub r0, r1, r0 - str r0, [r3, #0x4] - str r2, [r3, #0x8] - mov r0, r3 - str r2, [r3, #0xc] - bx lr - arm_func_end InitMBlock - - arm_func_start InsertMBlock -InsertMBlock: ; 0x020AE4D0 - str r2, [r1, #0x8] - cmp r2, #0x0 - ldrne r3, [r2, #0xc] - strne r1, [r2, #0xc] - ldreq r3, [r0, #0x0] - streq r1, [r0, #0x0] - str r3, [r1, #0xc] - cmp r3, #0x0 - strne r1, [r3, #0x8] - streq r1, [r0, #0x4] - mov r0, r1 - bx lr - arm_func_end InsertMBlock - - arm_func_start RemoveMBlock -RemoveMBlock: ; 0x020AE500 - ldr r2, [r1, #0x8] - ldr r1, [r1, #0xc] - cmp r2, #0x0 - strne r1, [r2, #0xc] - streq r1, [r0, #0x0] - cmp r1, #0x0 - strne r2, [r1, #0x8] - streq r2, [r0, #0x4] - mov r0, r2 - bx lr - arm_func_end RemoveMBlock - - arm_func_start GetRegionOfMBlock -GetRegionOfMBlock: ; 0x020AE528 - ldrh r2, [r1, #0x2] - add r3, r1, #0x10 - mov r2, r2, asr #0x8 - and r2, r2, #0x7f - mov r2, r2, lsl #0x10 - sub r2, r1, r2, lsr #0x10 - str r2, [r0, #0x0] - ldr r1, [r1, #0x4] - add r1, r1, r3 - str r1, [r0, #0x4] - bx lr - arm_func_end GetRegionOfMBlock diff --git a/arm9/asm/NNS_FND_expheap_s.s b/arm9/asm/NNS_FND_expheap_s.s new file mode 100644 index 00000000..54a26a2f --- /dev/null +++ b/arm9/asm/NNS_FND_expheap_s.s @@ -0,0 +1,526 @@ + .include "asm/macros.inc" + .include "global.inc" + .extern NNSi_FndInitHeapHead + .extern NNSi_FndFinalizeHeap + .extern GetRegionOfMBlock + .extern RemoveMBlock + .extern InsertMBlock + .extern InitMBlock + .text + + arm_func_start NNS_FndGetSizeForMBlockExpHeap +NNS_FndGetSizeForMBlockExpHeap: ; 0x020ADDC0 + ldr r0, [r0, #-0xc] + bx lr + arm_func_end NNS_FndGetSizeForMBlockExpHeap + + arm_func_start NNS_FndGetTotalFreeSizeForExpHeap +NNS_FndGetTotalFreeSizeForExpHeap: ; 0x020ADDC8 + ldr r2, [r0, #0x24] + mov r0, #0x0 + cmp r2, #0x0 + bxeq lr +_020ADDD8: + ldr r1, [r2, #0x4] + ldr r2, [r2, #0xc] + add r0, r0, r1 + cmp r2, #0x0 + bne _020ADDD8 + bx lr + arm_func_end NNS_FndGetTotalFreeSizeForExpHeap + + arm_func_start NNS_FndFreeToExpHeap +NNS_FndFreeToExpHeap: ; 0x020ADDF0 + stmdb sp!, {r4-r5,lr} + sub sp, sp, #0xc + sub r4, r1, #0x10 + add r5, r0, #0x24 + add r0, sp, #0x0 + mov r1, r4 + bl GetRegionOfMBlock + mov r1, r4 + add r0, r5, #0x8 + bl RemoveMBlock + add r1, sp, #0x0 + mov r0, r5 + bl RecycleRegion + add sp, sp, #0xc + ldmia sp!, {r4-r5,pc} + arm_func_end NNS_FndFreeToExpHeap + + arm_func_start NNS_FndResizeForMBlockExpHeap +NNS_FndResizeForMBlockExpHeap: ; 0x020ADE2C + stmdb sp!, {r4-r10,lr} + sub sp, sp, #0x10 + mov r4, r1 + mov r10, r2 + sub r6, r4, #0x10 + add r1, r10, #0x3 + mov r5, r0 + ldr r8, [r6, #0x4] + bic r10, r1, #0x3 + cmp r10, r8 + add r7, r5, #0x24 + addeq sp, sp, #0x10 + moveq r0, r10 + ldmeqia sp!, {r4-r10,pc} + cmp r10, r8 + bls _020ADF60 + ldr r9, [r7, #0x0] + add r0, r6, #0x10 + cmp r9, #0x0 + add r0, r8, r0 + beq _020ADE94 +_020ADE80: + cmp r9, r0 + beq _020ADE94 + ldr r9, [r9, #0xc] + cmp r9, #0x0 + bne _020ADE80 +_020ADE94: + cmp r9, #0x0 + beq _020ADEB0 + ldr r0, [r9, #0x4] + add r1, r8, #0x10 + add r0, r1, r0 + cmp r10, r0 + bls _020ADEBC +_020ADEB0: + add sp, sp, #0x10 + mov r0, #0x0 + ldmia sp!, {r4-r10,pc} +_020ADEBC: + add r0, sp, #0x0 + mov r1, r9 + bl GetRegionOfMBlock + mov r0, r7 + mov r1, r9 + bl RemoveMBlock + ldr r2, [sp, #0x4] + add r3, r10, r4 + ldr r9, [sp, #0x0] + sub r1, r2, r3 + str r3, [sp, #0x0] + cmp r1, #0x10 + strcc r2, [sp, #0x0] + mov r8, r0 + ldr r0, [sp, #0x0] + sub r0, r0, r4 + str r0, [r6, #0x4] + ldr r1, [sp, #0x4] + ldr r0, [sp, #0x0] + sub r0, r1, r0 + cmp r0, #0x10 + blo _020ADF30 + ldr r1, _020ADF9C ; =0x00004652 + add r0, sp, #0x0 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r8 + bl InsertMBlock +_020ADF30: + ldr r0, [r5, #0x20] + ldr r1, [sp, #0x0] + and r0, r0, #0xff + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + sub r2, r1, r9 + ands r0, r0, #0x1 + beq _020ADF90 + mov r1, r9 + mov r0, #0x0 + bl MIi_CpuClear32 + b _020ADF90 +_020ADF60: + add r0, r10, r4 + str r0, [sp, #0x8] + ldr r1, [r6, #0x4] + add r0, r6, #0x10 + add r0, r1, r0 + str r0, [sp, #0xc] + add r1, sp, #0x8 + mov r0, r7 + str r10, [r6, #0x4] + bl RecycleRegion + cmp r0, #0x0 + streq r8, [r6, #0x4] +_020ADF90: + ldr r0, [r6, #0x4] + add sp, sp, #0x10 + ldmia sp!, {r4-r10,pc} + .balign 4 +_020ADF9C: .word 0x00004652 + arm_func_end NNS_FndResizeForMBlockExpHeap + + arm_func_start NNS_FndAllocFromExpHeapEx +NNS_FndAllocFromExpHeapEx: ; 0x020ADFA0 + stmdb sp!, {lr} + sub sp, sp, #0x4 + cmp r1, #0x0 + moveq r1, #0x1 + add r1, r1, #0x3 + cmp r2, #0x0 + bic r1, r1, #0x3 + blt _020ADFCC + bl AllocFromHead + add sp, sp, #0x4 + ldmia sp!, {pc} +_020ADFCC: + rsb r2, r2, #0x0 + bl AllocFromTail + add sp, sp, #0x4 + ldmia sp!, {pc} + arm_func_end NNS_FndAllocFromExpHeapEx + + arm_func_start NNS_FndDestroyExpHeap +NNS_FndDestroyExpHeap: ; 0x020ADFDC + ldr ip, _020ADFE4 ; =NNSi_FndFinalizeHeap + bx r12 + .balign 4 +_020ADFE4: .word NNSi_FndFinalizeHeap + arm_func_end NNS_FndDestroyExpHeap + + arm_func_start NNS_FndCreateExpHeapEx +NNS_FndCreateExpHeapEx: ; 0x020ADFE8 + stmdb sp!, {lr} + sub sp, sp, #0x4 + add r1, r1, r0 + add r0, r0, #0x3 + bic r1, r1, #0x3 + bic r0, r0, #0x3 + cmp r0, r1 + bhi _020AE014 + sub r3, r1, r0 + cmp r3, #0x4c + bhs _020AE020 +_020AE014: + add sp, sp, #0x4 + mov r0, #0x0 + ldmia sp!, {pc} +_020AE020: + bl InitExpHeap + add sp, sp, #0x4 + ldmia sp!, {pc} + arm_func_end NNS_FndCreateExpHeapEx + + arm_func_start RecycleRegion +RecycleRegion: + stmdb sp!, {r4-r6,lr} + sub sp, sp, #0x8 + mov r5, r1 + ldr r2, [r5, #0x0] + ldr r1, [r5, #0x4] + mov r6, r0 + str r2, [sp, #0x0] + str r1, [sp, #0x4] + ldr r1, [r6, #0x0] + mov r4, #0x0 + cmp r1, #0x0 + beq _020AE0A0 + ldr r0, [r5, #0x0] +_020AE060: + cmp r1, r0 + movcc r4, r1 + blo _020AE094 + ldr r0, [r5, #0x4] + cmp r1, r0 + bne _020AE0A0 + ldr r2, [r1, #0x4] + add r0, r1, #0x10 + add r2, r2, r0 + mov r0, r6 + str r2, [sp, #0x4] + bl RemoveMBlock + b _020AE0A0 +_020AE094: + ldr r1, [r1, #0xc] + cmp r1, #0x0 + bne _020AE060 +_020AE0A0: + cmp r4, #0x0 + beq _020AE0D4 + ldr r2, [r4, #0x4] + add r1, r4, #0x10 + ldr r0, [r5, #0x0] + add r1, r2, r1 + cmp r1, r0 + bne _020AE0D4 + mov r0, r6 + mov r1, r4 + str r4, [sp, #0x0] + bl RemoveMBlock + mov r4, r0 +_020AE0D4: + ldr r1, [sp, #0x4] + ldr r0, [sp, #0x0] + sub r0, r1, r0 + cmp r0, #0x10 + addcc sp, sp, #0x8 + movcc r0, #0x0 + ldmccia sp!, {r4-r6,pc} + ldr r1, _020AE118 ; =0x00004652 + add r0, sp, #0x0 + bl InitMBlock + mov r1, r0 + mov r0, r6 + mov r2, r4 + bl InsertMBlock + mov r0, #0x1 + add sp, sp, #0x8 + ldmia sp!, {r4-r6,pc} + .balign 4 +_020AE118: .word 0x00004652 + arm_func_end RecycleRegion + + local_arm_func_start AllocFromTail +AllocFromTail: ; 0x020AE11C + stmdb sp!, {r4-r9,lr} + sub sp, sp, #0x4 + add r0, r0, #0x24 + ldrh r4, [r0, #0x12] + mov r3, r1 + mvn lr, #0x0 + and r1, r4, #0x1 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + moveq r5, #0x1 + mov r1, #0x0 + ldr r4, [r0, #0x4] + movne r5, #0x0 + mov r12, r1 + cmp r4, #0x0 + beq _020AE1B0 + sub r2, r2, #0x1 + mvn r2, r2 +_020AE164: + ldr r8, [r4, #0x4] + add r9, r4, #0x10 + add r6, r8, r9 + sub r6, r6, r3 + and r7, r2, r6 + subs r6, r7, r9 + bmi _020AE1A4 + cmp lr, r8 + bls _020AE1A4 + mov r1, r4 + mov lr, r8 + mov r12, r7 + cmp r5, #0x0 + bne _020AE1B0 + cmp r8, r3 + beq _020AE1B0 +_020AE1A4: + ldr r4, [r4, #0x8] + cmp r4, #0x0 + bne _020AE164 +_020AE1B0: + cmp r1, #0x0 + addeq sp, sp, #0x4 + moveq r0, #0x0 + ldmeqia sp!, {r4-r9,pc} + mov r4, #0x1 + mov r2, r12 + str r4, [sp, #0x0] + bl AllocUsedBlockFromFreeBlock + add sp, sp, #0x4 + ldmia sp!, {r4-r9,pc} + arm_func_end AllocFromTail + + local_arm_func_start AllocFromHead +AllocFromHead: ; 0x020AE1D8 + stmdb sp!, {r4-r9,lr} + sub sp, sp, #0x4 + add r0, r0, #0x24 + ldrh r4, [r0, #0x12] + mov r3, r1 + ldr r5, [r0, #0x0] + and r1, r4, #0x1 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + moveq r6, #0x1 + mov r1, #0x0 + movne r6, #0x0 + mov lr, r1 + cmp r5, #0x0 + mvn r4, #0x0 + beq _020AE270 + sub r12, r2, #0x1 + mvn r2, r12 +_020AE220: + add r8, r5, #0x10 + add r7, r12, r8 + and r9, r2, r7 + sub r7, r9, r8 + ldr r8, [r5, #0x4] + add r7, r3, r7 + cmp r8, r7 + blo _020AE264 + cmp r4, r8 + bls _020AE264 + mov r1, r5 + mov r4, r8 + mov lr, r9 + cmp r6, #0x0 + bne _020AE270 + cmp r8, r3 + beq _020AE270 +_020AE264: + ldr r5, [r5, #0xc] + cmp r5, #0x0 + bne _020AE220 +_020AE270: + cmp r1, #0x0 + addeq sp, sp, #0x4 + moveq r0, #0x0 + ldmeqia sp!, {r4-r9,pc} + mov r4, #0x0 + mov r2, lr + str r4, [sp, #0x0] + bl AllocUsedBlockFromFreeBlock + add sp, sp, #0x4 + ldmia sp!, {r4-r9,pc} + arm_func_end AllocFromHead + + arm_func_start AllocUsedBlockFromFreeBlock +AllocUsedBlockFromFreeBlock: ; 0x020AE298 + stmdb sp!, {r4-r8,lr} + sub sp, sp, #0x18 + mov r7, r0 + add r0, sp, #0x0 + mov r8, r1 + mov r6, r2 + mov r5, r3 + bl GetRegionOfMBlock + ldr r3, [sp, #0x4] + sub r4, r6, #0x10 + add r2, r5, r6 + mov r0, r7 + mov r1, r8 + str r4, [sp, #0x4] + str r3, [sp, #0xc] + str r2, [sp, #0x8] + bl RemoveMBlock + ldr r2, [sp, #0x0] + ldr r1, [sp, #0x4] + mov r5, r0 + sub r0, r1, r2 + cmp r0, #0x10 + strcc r2, [sp, #0x4] + blo _020AE318 + ldr r1, _020AE418 ; =0x00004652 + add r0, sp, #0x0 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r5 + bl InsertMBlock + mov r5, r0 +_020AE318: + ldr r1, [sp, #0xc] + ldr r0, [sp, #0x8] + sub r0, r1, r0 + cmp r0, #0x10 + strcc r1, [sp, #0x8] + blo _020AE34C + ldr r1, _020AE418 ; =0x00004652 + add r0, sp, #0x8 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r5 + bl InsertMBlock +_020AE34C: + ldr r0, [r7, #-0x4] + ldr r1, [sp, #0x4] + and r0, r0, #0xff + mov r0, r0, lsl #0x10 + ldr r2, [sp, #0x8] + mov r0, r0, lsr #0x10 + sub r2, r2, r1 + ands r0, r0, #0x1 + beq _020AE378 + mov r0, #0x0 + bl MIi_CpuClear32 +_020AE378: + ldr r2, [sp, #0x8] + ldr r1, _020AE41C ; =0x00005544 + add r0, sp, #0x10 + str r4, [sp, #0x10] + str r2, [sp, #0x14] + bl InitMBlock + mov r1, r0 + ldrh r3, [r1, #0x2] + ldrh r2, [sp, #0x30] + add r0, r7, #0x8 + bic r3, r3, #0x8000 + strh r3, [r1, #0x2] + ldrh r3, [r1, #0x2] + and r2, r2, #0x1 + orr r2, r3, r2, lsl #0xf + strh r2, [r1, #0x2] + ldrh r2, [r1, #0x2] + ldr r3, [sp, #0x4] + bic r2, r2, #0x7f00 + strh r2, [r1, #0x2] + sub r2, r1, r3 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + ldrh r3, [r1, #0x2] + and r2, r2, #0x7f + orr r2, r3, r2, lsl #0x8 + strh r2, [r1, #0x2] + ldrh r2, [r1, #0x2] + ldrh r3, [r7, #0x10] + bic r2, r2, #0xff + strh r2, [r1, #0x2] + ldrh r2, [r1, #0x2] + and r3, r3, #0xff + orr r2, r2, r3 + strh r2, [r1, #0x2] + ldr r2, [r7, #0xc] + bl InsertMBlock + mov r0, r6 + add sp, sp, #0x18 + ldmia sp!, {r4-r8,pc} + .balign 4 +_020AE418: .word 0x00004652 +_020AE41C: .word 0x00005544 + arm_func_end AllocUsedBlockFromFreeBlock + + arm_func_start InitExpHeap +InitExpHeap: ; 0x020AE420 + stmdb sp!, {r4-r5,lr} + sub sp, sp, #0xc + mov r5, r0 + mov r3, r1 + add r4, r5, #0x24 + str r2, [sp, #0x0] + ldr r1, _020AE498 ; =0x45585048 + add r2, r4, #0x14 + bl NNSi_FndInitHeapHead + mov r0, #0x0 + strh r0, [r4, #0x10] + strh r0, [r4, #0x12] + ldrh r2, [r4, #0x12] + ldr r1, _020AE49C ; =0x00004652 + add r0, sp, #0x4 + bic r2, r2, #0x1 + strh r2, [r4, #0x12] + ldr r2, [r5, #0x18] + str r2, [sp, #0x4] + ldr r2, [r5, #0x1c] + str r2, [sp, #0x8] + bl InitMBlock + str r0, [r5, #0x24] + str r0, [r4, #0x4] + mov r1, #0x0 + str r1, [r4, #0x8] + mov r0, r5 + str r1, [r4, #0xc] + add sp, sp, #0xc + ldmia sp!, {r4-r5,pc} + .balign 4 +_020AE498: .word 0x45585048 +_020AE49C: .word 0x00004652 + arm_func_end InitExpHeap diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index e6fab69c..8128e74b 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -7,6 +7,18 @@ typedef struct NNSiFndHeapHead NNSiFndHeapHead; +typedef s32 NNSiIntPtr; +typedef u32 NNSiUIntPtr; + +#define NNSi_FndGetBitValue(data, st, bits) (((data) >>(st)) & ((1 <<(bits)) -1)) +#define NNSi_FndSetBitValue(data, st, bits, val) do { \ + u32 maskBits = (u32)((1 << (bits)) - 1); \ + u32 newVal = (val) & maskBits; \ + (void)(maskBits <<= st); \ + (data) &= ~maskBits; \ + (data) |= newVal << (st); \ +} while (FALSE); + struct NNSiFndHeapHead { u32 signature; @@ -23,4 +35,56 @@ struct NNSiFndHeapHead typedef NNSiFndHeapHead* NNSFndHeapHandle; // Type to represent heap handle +static inline NNSiUIntPtr NNSiGetUIntPtr(const void* ptr) +{ + return (NNSiUIntPtr)ptr; +} + +static inline u32 GetOffsetFromPtr(const void* start, const void* end) +{ + return NNSiGetUIntPtr(end) - NNSiGetUIntPtr(start); +} + +static inline void* AddU32ToPtr(void* ptr, u32 val) +{ + return (void*)( NNSiGetUIntPtr(ptr) + val ); +} + +static inline const void* AddU32ToCPtr(const void* ptr, u32 val) +{ + return (const void*)( NNSiGetUIntPtr(ptr) + val ); +} + +static inline void* SubU32ToPtr(void* ptr, u32 val) +{ + return (void*)(NNSiGetUIntPtr(ptr) - val); +} + +static inline const void* SubU32ToCPtr(const void* ptr, u32 val) +{ + return (const void*)(NNSiGetUIntPtr(ptr) - val); +} + +static inline int ComparePtr(const void* a, const void* b) +{ + const u8* wa = a; + const u8* wb = b; + + return wa - wb; +} + + +static inline u16 GetOptForHeap(const NNSiFndHeapHead* pHeapHd) +{ + return (u16)NNSi_FndGetBitValue(pHeapHd->attribute, 0, 8); +} + +static inline void SetOptForHeap( + NNSiFndHeapHead* pHeapHd, + u16 optFlag + ) +{ + NNSi_FndSetBitValue(pHeapHd->attribute, 0, 8, optFlag); +} + #endif //GUARD_NNS_FND_HEAPCOMMON_H diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c new file mode 100644 index 00000000..70e3886a --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -0,0 +1,92 @@ +#include "global.h" +#include "NNS_FND_expheap.h" + +typedef struct NNSiMemRegion { + void* start; + void* end; +} NNSiMemRegion; + +static inline u16 GetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* block) +{ + return NNSi_FndGetBitValue(block->attribute, 8, 7); +} + +static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) +{ + return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); +} + +static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) +{ + return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); +} + +void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) +{ + region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); + region->end = GetMBlockEndAddr(block); +} + +NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +{ + NNSiFndExpHeapMBlockHead* const prev = block->pMBHeadPrev; + NNSiFndExpHeapMBlockHead* const next = block->pMBHeadNext; + + if (prev != NULL) + { + prev->pMBHeadNext = next; + } + else + { + list->head = next; + } + + if (next != NULL) + { + next->pMBHeadPrev = prev; + } + else + { + list->tail = prev; + } + + return prev; +} + +NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) +{ + NNSiFndExpHeapMBlockHead* next; + target->pMBHeadPrev = prev; + if (prev != NULL) + { + next = prev->pMBHeadNext; + prev->pMBHeadNext = target; + } + else + { + next = list->head; + list->head = target; + } + target->pMBHeadNext = next; + if (next != NULL) + { + next->pMBHeadPrev = target; + } + else + { + list->tail = target; + } + + return target; +} + +NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) +{ + NNSiFndExpHeapMBlockHead* block = pRegion->start; + block->signature = signature; + block->attribute = 0; + block->blockSize = GetOffsetFromPtr(GetMemPtrForMBlock(block), pRegion->end); + block->pMBHeadPrev = NULL; + block->pMBHeadNext = NULL; + return block; +} diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 664007f1..07b8e9cf 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -5,12 +5,6 @@ BOOL sRootListInitialized; NNSFndList sRootList; -static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 option_flag) -{ - pHead->attribute &= ~0xFF; - pHead->attribute |= option_flag; -} - void *NNS_FndGetNextListObject(NNSFndList *, void *); static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) @@ -45,7 +39,7 @@ void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart pHead->heapStart = heapStart; pHead->heapEnd = heapEnd; pHead->attribute = 0; - NNSi_FndHeapHeadSetOptionFlag(pHead, optionFlag); + SetOptForHeap(pHead, optionFlag); NNS_FndInitList(&pHead->childList, 4); if (!sRootListInitialized) { -- cgit v1.2.3 From 963a657ad585ac3bb70d8a0f78e35ea54145eacc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 08:14:19 -0400 Subject: InitExpHeap --- arm9/asm/NNS_FND_expheap_s.s | 38 +-------------------------- arm9/lib/libnns/include/NNS_FND_heapcommon.h | 2 ++ arm9/lib/libnns/src/NNS_FND_expheap.c | 39 ++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/arm9/asm/NNS_FND_expheap_s.s b/arm9/asm/NNS_FND_expheap_s.s index 54a26a2f..48ec1fe4 100644 --- a/arm9/asm/NNS_FND_expheap_s.s +++ b/arm9/asm/NNS_FND_expheap_s.s @@ -6,6 +6,7 @@ .extern RemoveMBlock .extern InsertMBlock .extern InitMBlock + .extern InitExpHeap .text arm_func_start NNS_FndGetSizeForMBlockExpHeap @@ -487,40 +488,3 @@ _020AE378: _020AE418: .word 0x00004652 _020AE41C: .word 0x00005544 arm_func_end AllocUsedBlockFromFreeBlock - - arm_func_start InitExpHeap -InitExpHeap: ; 0x020AE420 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0xc - mov r5, r0 - mov r3, r1 - add r4, r5, #0x24 - str r2, [sp, #0x0] - ldr r1, _020AE498 ; =0x45585048 - add r2, r4, #0x14 - bl NNSi_FndInitHeapHead - mov r0, #0x0 - strh r0, [r4, #0x10] - strh r0, [r4, #0x12] - ldrh r2, [r4, #0x12] - ldr r1, _020AE49C ; =0x00004652 - add r0, sp, #0x4 - bic r2, r2, #0x1 - strh r2, [r4, #0x12] - ldr r2, [r5, #0x18] - str r2, [sp, #0x4] - ldr r2, [r5, #0x1c] - str r2, [sp, #0x8] - bl InitMBlock - str r0, [r5, #0x24] - str r0, [r4, #0x4] - mov r1, #0x0 - str r1, [r4, #0x8] - mov r0, r5 - str r1, [r4, #0xc] - add sp, sp, #0xc - ldmia sp!, {r4-r5,pc} - .balign 4 -_020AE498: .word 0x45585048 -_020AE49C: .word 0x00004652 - arm_func_end InitExpHeap diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index 8128e74b..22a6bfdf 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -87,4 +87,6 @@ static inline void SetOptForHeap( NNSi_FndSetBitValue(pHeapHd->attribute, 0, 8, optFlag); } +void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag); + #endif //GUARD_NNS_FND_HEAPCOMMON_H diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index 70e3886a..eee4f9ca 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -21,6 +21,16 @@ static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); } +static inline void SetAllocMode(NNSiFndExpHeapHead* pExHeapHd, u16 mode) +{ + NNSi_FndSetBitValue(pExHeapHd->feature, 0, 1, mode); +} + +static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHeapHead(NNSiFndHeapHead* pHHead) +{ + return AddU32ToPtr(pHHead, sizeof(NNSiFndHeapHead)); +} + void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) { region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); @@ -90,3 +100,32 @@ NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature block->pMBHeadNext = NULL; return block; } + +static inline NNSiFndExpHeapMBlockHead* InitFreeMBlock(const NNSiMemRegion* region) +{ + return InitMBlock(region, 0x4652); +} + +NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) +{ + NNSiFndHeapHead* pHeapHd = (NNSiFndHeapHead*)startAddress; + NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); + NNSi_FndInitHeapHead(pHeapHd, 0x45585048, AddU32ToPtr(pExpHeapHd, sizeof(NNSiFndExpHeapHead)), endAddress, optFlag); + pExpHeapHd->groupID = 0; + pExpHeapHd->feature = 0; + SetAllocMode(pExpHeapHd, 0); + + NNSiFndExpHeapMBlockHead* pMBHead; + NNSiMemRegion region; + + region.start = pHeapHd->heapStart; + region.end = pHeapHd->heapEnd; + pMBHead = InitFreeMBlock(®ion); + + pExpHeapHd->mbFreeList.head = pMBHead; + pExpHeapHd->mbFreeList.tail = pMBHead; + pExpHeapHd->mbUsedList.head = NULL; + pExpHeapHd->mbUsedList.tail = NULL; + + return pHeapHd; +} -- cgit v1.2.3 From bcf0ab205d42d5653215da7b19ece57d74438417 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 18:46:22 -0400 Subject: AllocUsedBlockFromFreeBlock --- arm9/asm/NNS_FND_expheap_s.s | 107 +-------------------------- arm9/lib/libnns/include/NNS_FND_heapcommon.h | 9 +++ arm9/lib/libnns/src/NNS_FND_expheap.c | 73 ++++++++++++++++++ 3 files changed, 83 insertions(+), 106 deletions(-) diff --git a/arm9/asm/NNS_FND_expheap_s.s b/arm9/asm/NNS_FND_expheap_s.s index 48ec1fe4..494e3c21 100644 --- a/arm9/asm/NNS_FND_expheap_s.s +++ b/arm9/asm/NNS_FND_expheap_s.s @@ -7,6 +7,7 @@ .extern InsertMBlock .extern InitMBlock .extern InitExpHeap + .extern AllocUsedBlockFromFreeBlock .text arm_func_start NNS_FndGetSizeForMBlockExpHeap @@ -382,109 +383,3 @@ _020AE270: add sp, sp, #0x4 ldmia sp!, {r4-r9,pc} arm_func_end AllocFromHead - - arm_func_start AllocUsedBlockFromFreeBlock -AllocUsedBlockFromFreeBlock: ; 0x020AE298 - stmdb sp!, {r4-r8,lr} - sub sp, sp, #0x18 - mov r7, r0 - add r0, sp, #0x0 - mov r8, r1 - mov r6, r2 - mov r5, r3 - bl GetRegionOfMBlock - ldr r3, [sp, #0x4] - sub r4, r6, #0x10 - add r2, r5, r6 - mov r0, r7 - mov r1, r8 - str r4, [sp, #0x4] - str r3, [sp, #0xc] - str r2, [sp, #0x8] - bl RemoveMBlock - ldr r2, [sp, #0x0] - ldr r1, [sp, #0x4] - mov r5, r0 - sub r0, r1, r2 - cmp r0, #0x10 - strcc r2, [sp, #0x4] - blo _020AE318 - ldr r1, _020AE418 ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r5 - bl InsertMBlock - mov r5, r0 -_020AE318: - ldr r1, [sp, #0xc] - ldr r0, [sp, #0x8] - sub r0, r1, r0 - cmp r0, #0x10 - strcc r1, [sp, #0x8] - blo _020AE34C - ldr r1, _020AE418 ; =0x00004652 - add r0, sp, #0x8 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r5 - bl InsertMBlock -_020AE34C: - ldr r0, [r7, #-0x4] - ldr r1, [sp, #0x4] - and r0, r0, #0xff - mov r0, r0, lsl #0x10 - ldr r2, [sp, #0x8] - mov r0, r0, lsr #0x10 - sub r2, r2, r1 - ands r0, r0, #0x1 - beq _020AE378 - mov r0, #0x0 - bl MIi_CpuClear32 -_020AE378: - ldr r2, [sp, #0x8] - ldr r1, _020AE41C ; =0x00005544 - add r0, sp, #0x10 - str r4, [sp, #0x10] - str r2, [sp, #0x14] - bl InitMBlock - mov r1, r0 - ldrh r3, [r1, #0x2] - ldrh r2, [sp, #0x30] - add r0, r7, #0x8 - bic r3, r3, #0x8000 - strh r3, [r1, #0x2] - ldrh r3, [r1, #0x2] - and r2, r2, #0x1 - orr r2, r3, r2, lsl #0xf - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - ldr r3, [sp, #0x4] - bic r2, r2, #0x7f00 - strh r2, [r1, #0x2] - sub r2, r1, r3 - mov r2, r2, lsl #0x10 - mov r2, r2, lsr #0x10 - ldrh r3, [r1, #0x2] - and r2, r2, #0x7f - orr r2, r3, r2, lsl #0x8 - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - ldrh r3, [r7, #0x10] - bic r2, r2, #0xff - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - and r3, r3, #0xff - orr r2, r2, r3 - strh r2, [r1, #0x2] - ldr r2, [r7, #0xc] - bl InsertMBlock - mov r0, r6 - add sp, sp, #0x18 - ldmia sp!, {r4-r8,pc} - .balign 4 -_020AE418: .word 0x00004652 -_020AE41C: .word 0x00005544 - arm_func_end AllocUsedBlockFromFreeBlock diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index 22a6bfdf..77473efe 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -2,9 +2,12 @@ #define GUARD_NNS_FND_HEAPCOMMON_H #include "NNS_FND_list.h" +#include "MI_memory.h" #define NNS_FND_HEAP_DEFAULT_ALIGNMENT 4 +#define NNS_FndGetFillValForHeap(type) (0) + typedef struct NNSiFndHeapHead NNSiFndHeapHead; typedef s32 NNSiIntPtr; @@ -87,6 +90,12 @@ static inline void SetOptForHeap( NNSi_FndSetBitValue(pHeapHd->attribute, 0, 8, optFlag); } +static inline void FillAllocMemory(NNSiFndHeapHead* pHeapHd, void* address, u32 size) +{ + if (GetOptForHeap(pHeapHd) & 1) + MI_CpuFill32(address, NNS_FndGetFillValForHeap(0), size); +} + void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag); #endif //GUARD_NNS_FND_HEAPCOMMON_H diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index eee4f9ca..f5a74dc4 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -11,6 +11,21 @@ static inline u16 GetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* block) return NNSi_FndGetBitValue(block->attribute, 8, 7); } +static inline void SetAllocDirForMBlock(NNSiFndExpHeapMBlockHead* pEHMBHead, u16 direction) +{ + NNSi_FndSetBitValue(pEHMBHead->attribute, 15, 1, direction); +} + +static inline void SetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* pEHMBHead, u16 alignment) +{ + NNSi_FndSetBitValue(pEHMBHead->attribute, 8, 7, alignment); +} + +static inline void SetGroupIDForMBlock(NNSiFndExpHeapMBlockHead* pEHMBHead, u16 groupID) +{ + NNSi_FndSetBitValue(pEHMBHead->attribute, 0, 8, groupID); +} + static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) { return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); @@ -31,6 +46,11 @@ static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHeapHead(NNSiFndHeapHead* return AddU32ToPtr(pHHead, sizeof(NNSiFndHeapHead)); } +static inline NNSiFndHeapHead* GetHeapHeadPtrFromExpHeapHead(NNSiFndExpHeapHead* pEHHead) +{ + return SubU32ToPtr(pEHHead, sizeof(NNSiFndHeapHead)); +} + void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) { region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); @@ -129,3 +149,56 @@ NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) return pHeapHd; } + +static inline void AppendMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +{ + (void) InsertMBlock(list, block, list->tail); +} + +void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) +{ + NNSiMemRegion freeRgnT; + NNSiMemRegion freeRgnB; + NNSiFndExpHeapMBlockHead* pMBHeadFreePrev; + + GetRegionOfMBlock(&freeRgnT, pMBHeadFree); + + freeRgnB.end = freeRgnT.end; + freeRgnB.start = AddU32ToPtr(mblock, size); + freeRgnT.end = SubU32ToPtr(mblock, sizeof(NNSiFndExpHeapMBlockHead)); + + pMBHeadFreePrev = RemoveMBlock(&pEHHead->mbFreeList, pMBHeadFree); + + if (GetOffsetFromPtr(freeRgnT.start, freeRgnT.end) < sizeof(NNSiFndExpHeapMBlockHead)) + { + freeRgnT.end = freeRgnT.start; + } + else + { + pMBHeadFreePrev = InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&freeRgnT), pMBHeadFreePrev); + } + if (GetOffsetFromPtr(freeRgnB.start, freeRgnB.end) < sizeof(NNSiFndExpHeapMBlockHead)) + { + freeRgnB.start= freeRgnB.end; + } + else + { + (void)InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&freeRgnB), pMBHeadFreePrev); + } + + FillAllocMemory(GetHeapHeadPtrFromExpHeapHead(pEHHead), freeRgnT.end, GetOffsetFromPtr(freeRgnT.end, freeRgnB.start)); + + NNSiFndExpHeapMBlockHead* pMBHeadNewUsed; + NNSiMemRegion region; + + region.start = SubU32ToPtr(mblock, sizeof(NNSiFndExpHeapMBlockHead)); + region.end = freeRgnB.start; + + pMBHeadNewUsed = InitMBlock(®ion, 0x5544); + SetAllocDirForMBlock(pMBHeadNewUsed, direction); + SetAlignmentForMBlock(pMBHeadNewUsed, (u16)GetOffsetFromPtr(freeRgnT.end, pMBHeadNewUsed)); + SetGroupIDForMBlock(pMBHeadNewUsed, pEHHead->groupID); + AppendMBlock(&pEHHead->mbUsedList, pMBHeadNewUsed); + + return mblock; +} -- cgit v1.2.3 From cb6f5a1c7ad38e09cb47d402b2b5d78fdd5965cc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 21:00:20 -0400 Subject: AllocFromHead, ALlocFromTail --- arm9/asm/NNS_FND_expheap_s.s | 111 +-------------------------- arm9/lib/libnns/include/NNS_FND_heapcommon.h | 8 ++ arm9/lib/libnns/src/NNS_FND_expheap.c | 65 ++++++++++++++++ 3 files changed, 75 insertions(+), 109 deletions(-) diff --git a/arm9/asm/NNS_FND_expheap_s.s b/arm9/asm/NNS_FND_expheap_s.s index 494e3c21..d173bef0 100644 --- a/arm9/asm/NNS_FND_expheap_s.s +++ b/arm9/asm/NNS_FND_expheap_s.s @@ -8,6 +8,8 @@ .extern InitMBlock .extern InitExpHeap .extern AllocUsedBlockFromFreeBlock + .extern AllocFromHead + .extern AllocFromTail .text arm_func_start NNS_FndGetSizeForMBlockExpHeap @@ -274,112 +276,3 @@ _020AE0D4: .balign 4 _020AE118: .word 0x00004652 arm_func_end RecycleRegion - - local_arm_func_start AllocFromTail -AllocFromTail: ; 0x020AE11C - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - add r0, r0, #0x24 - ldrh r4, [r0, #0x12] - mov r3, r1 - mvn lr, #0x0 - and r1, r4, #0x1 - mov r1, r1, lsl #0x10 - movs r1, r1, lsr #0x10 - moveq r5, #0x1 - mov r1, #0x0 - ldr r4, [r0, #0x4] - movne r5, #0x0 - mov r12, r1 - cmp r4, #0x0 - beq _020AE1B0 - sub r2, r2, #0x1 - mvn r2, r2 -_020AE164: - ldr r8, [r4, #0x4] - add r9, r4, #0x10 - add r6, r8, r9 - sub r6, r6, r3 - and r7, r2, r6 - subs r6, r7, r9 - bmi _020AE1A4 - cmp lr, r8 - bls _020AE1A4 - mov r1, r4 - mov lr, r8 - mov r12, r7 - cmp r5, #0x0 - bne _020AE1B0 - cmp r8, r3 - beq _020AE1B0 -_020AE1A4: - ldr r4, [r4, #0x8] - cmp r4, #0x0 - bne _020AE164 -_020AE1B0: - cmp r1, #0x0 - addeq sp, sp, #0x4 - moveq r0, #0x0 - ldmeqia sp!, {r4-r9,pc} - mov r4, #0x1 - mov r2, r12 - str r4, [sp, #0x0] - bl AllocUsedBlockFromFreeBlock - add sp, sp, #0x4 - ldmia sp!, {r4-r9,pc} - arm_func_end AllocFromTail - - local_arm_func_start AllocFromHead -AllocFromHead: ; 0x020AE1D8 - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - add r0, r0, #0x24 - ldrh r4, [r0, #0x12] - mov r3, r1 - ldr r5, [r0, #0x0] - and r1, r4, #0x1 - mov r1, r1, lsl #0x10 - movs r1, r1, lsr #0x10 - moveq r6, #0x1 - mov r1, #0x0 - movne r6, #0x0 - mov lr, r1 - cmp r5, #0x0 - mvn r4, #0x0 - beq _020AE270 - sub r12, r2, #0x1 - mvn r2, r12 -_020AE220: - add r8, r5, #0x10 - add r7, r12, r8 - and r9, r2, r7 - sub r7, r9, r8 - ldr r8, [r5, #0x4] - add r7, r3, r7 - cmp r8, r7 - blo _020AE264 - cmp r4, r8 - bls _020AE264 - mov r1, r5 - mov r4, r8 - mov lr, r9 - cmp r6, #0x0 - bne _020AE270 - cmp r8, r3 - beq _020AE270 -_020AE264: - ldr r5, [r5, #0xc] - cmp r5, #0x0 - bne _020AE220 -_020AE270: - cmp r1, #0x0 - addeq sp, sp, #0x4 - moveq r0, #0x0 - ldmeqia sp!, {r4-r9,pc} - mov r4, #0x0 - mov r2, lr - str r4, [sp, #0x0] - bl AllocUsedBlockFromFreeBlock - add sp, sp, #0x4 - ldmia sp!, {r4-r9,pc} - arm_func_end AllocFromHead diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index 77473efe..f35bf097 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -98,4 +98,12 @@ static inline void FillAllocMemory(NNSiFndHeapHead* pHeapHd, void* address, u32 void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag); +#define NNSi_FndRoundUp(value, alignment) (((value) + (alignment - 1)) & ~(alignment - 1)) + +#define NNSi_FndRoundUpPtr(ptr, alignment) ((void*)NNSi_FndRoundUp(NNSiGetUIntPtr(ptr), alignment)) + +#define NNSi_FndRoundDown(value, alignment) ((value) & ~(alignment - 1)) + +#define NNSi_FndRoundDownPtr(ptr, alignment) ((void*)NNSi_FndRoundDown(NNSiGetUIntPtr(ptr), alignment)) + #endif //GUARD_NNS_FND_HEAPCOMMON_H diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index f5a74dc4..31ea5fbe 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -36,6 +36,11 @@ static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); } +static inline u16 GetAllocMode(NNSiFndExpHeapHead* pExHeapHd) +{ + return NNSi_FndGetBitValue(pExHeapHd->feature, 0, 1); +} + static inline void SetAllocMode(NNSiFndExpHeapHead* pExHeapHd, u16 mode) { NNSi_FndSetBitValue(pExHeapHd->feature, 0, 1, mode); @@ -202,3 +207,63 @@ void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBl return mblock; } + +void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +{ + NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); + const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; + NNSiFndExpHeapMBlockHead* pMBlkHd = NULL; + NNSiFndExpHeapMBlockHead* pMBlkHdFound = NULL; + u32 foundSize = 0xFFFFFFFF; + void* foundMBlock = NULL; + + for (pMBlkHd = pExpHeapHd->mbFreeList.head; pMBlkHd; pMBlkHd = pMBlkHd->pMBHeadNext) + { + void *const mblock = GetMemPtrForMBlock(pMBlkHd); + void *const reqMBlock = NNSi_FndRoundUpPtr(mblock, alignment); + const u32 offset = GetOffsetFromPtr(mblock, reqMBlock); + if (pMBlkHd->blockSize >= size + offset && foundSize > pMBlkHd->blockSize) + { + pMBlkHdFound = pMBlkHd; + foundSize = pMBlkHd->blockSize; + foundMBlock = reqMBlock; + if (bAllocFirst || foundSize == size) + break; + } + } + + if (!pMBlkHdFound) + return NULL; + + return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 0); +} + +void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +{ + NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); + const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; + NNSiFndExpHeapMBlockHead* pMBlkHd = NULL; + NNSiFndExpHeapMBlockHead* pMBlkHdFound = NULL; + u32 foundSize = 0xFFFFFFFF; + void* foundMBlock = NULL; + + for (pMBlkHd = pExpHeapHd->mbFreeList.tail; pMBlkHd; pMBlkHd = pMBlkHd->pMBHeadPrev) + { + void *const mblock = GetMemPtrForMBlock(pMBlkHd); + void *const mBlockEnd = AddU32ToPtr(mblock, pMBlkHd->blockSize); + void *const reqMBlock = NNSi_FndRoundDownPtr(SubU32ToPtr(mBlockEnd, size), alignment); + if (ComparePtr(reqMBlock, mblock) >= 0 && foundSize > pMBlkHd->blockSize) + { + pMBlkHdFound = pMBlkHd; + foundSize = pMBlkHd->blockSize; + foundMBlock = reqMBlock; + if (bAllocFirst || foundSize == size) + break; + } + } + + if (!pMBlkHdFound) + return NULL; + + return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1); +} -- cgit v1.2.3 From 676ebab3d6ad726b3e154c994c4fcfdbb186ed22 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 21 Aug 2021 11:02:05 -0400 Subject: through NNS_FndAllocFromExpHeapEx --- arm9/asm/NNS_FND_expheap_s.s | 121 +-------------------------- arm9/lib/libnns/include/NNS_FND_expheap.h | 4 +- arm9/lib/libnns/include/NNS_FND_heapcommon.h | 2 + arm9/lib/libnns/src/NNS_FND_expheap.c | 116 +++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 122 deletions(-) diff --git a/arm9/asm/NNS_FND_expheap_s.s b/arm9/asm/NNS_FND_expheap_s.s index d173bef0..d4d958db 100644 --- a/arm9/asm/NNS_FND_expheap_s.s +++ b/arm9/asm/NNS_FND_expheap_s.s @@ -10,6 +10,7 @@ .extern AllocUsedBlockFromFreeBlock .extern AllocFromHead .extern AllocFromTail + .extern RecycleRegion .text arm_func_start NNS_FndGetSizeForMBlockExpHeap @@ -156,123 +157,3 @@ _020ADF90: .balign 4 _020ADF9C: .word 0x00004652 arm_func_end NNS_FndResizeForMBlockExpHeap - - arm_func_start NNS_FndAllocFromExpHeapEx -NNS_FndAllocFromExpHeapEx: ; 0x020ADFA0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r1, #0x0 - moveq r1, #0x1 - add r1, r1, #0x3 - cmp r2, #0x0 - bic r1, r1, #0x3 - blt _020ADFCC - bl AllocFromHead - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADFCC: - rsb r2, r2, #0x0 - bl AllocFromTail - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndAllocFromExpHeapEx - - arm_func_start NNS_FndDestroyExpHeap -NNS_FndDestroyExpHeap: ; 0x020ADFDC - ldr ip, _020ADFE4 ; =NNSi_FndFinalizeHeap - bx r12 - .balign 4 -_020ADFE4: .word NNSi_FndFinalizeHeap - arm_func_end NNS_FndDestroyExpHeap - - arm_func_start NNS_FndCreateExpHeapEx -NNS_FndCreateExpHeapEx: ; 0x020ADFE8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - add r1, r1, r0 - add r0, r0, #0x3 - bic r1, r1, #0x3 - bic r0, r0, #0x3 - cmp r0, r1 - bhi _020AE014 - sub r3, r1, r0 - cmp r3, #0x4c - bhs _020AE020 -_020AE014: - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {pc} -_020AE020: - bl InitExpHeap - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndCreateExpHeapEx - - arm_func_start RecycleRegion -RecycleRegion: - stmdb sp!, {r4-r6,lr} - sub sp, sp, #0x8 - mov r5, r1 - ldr r2, [r5, #0x0] - ldr r1, [r5, #0x4] - mov r6, r0 - str r2, [sp, #0x0] - str r1, [sp, #0x4] - ldr r1, [r6, #0x0] - mov r4, #0x0 - cmp r1, #0x0 - beq _020AE0A0 - ldr r0, [r5, #0x0] -_020AE060: - cmp r1, r0 - movcc r4, r1 - blo _020AE094 - ldr r0, [r5, #0x4] - cmp r1, r0 - bne _020AE0A0 - ldr r2, [r1, #0x4] - add r0, r1, #0x10 - add r2, r2, r0 - mov r0, r6 - str r2, [sp, #0x4] - bl RemoveMBlock - b _020AE0A0 -_020AE094: - ldr r1, [r1, #0xc] - cmp r1, #0x0 - bne _020AE060 -_020AE0A0: - cmp r4, #0x0 - beq _020AE0D4 - ldr r2, [r4, #0x4] - add r1, r4, #0x10 - ldr r0, [r5, #0x0] - add r1, r2, r1 - cmp r1, r0 - bne _020AE0D4 - mov r0, r6 - mov r1, r4 - str r4, [sp, #0x0] - bl RemoveMBlock - mov r4, r0 -_020AE0D4: - ldr r1, [sp, #0x4] - ldr r0, [sp, #0x0] - sub r0, r1, r0 - cmp r0, #0x10 - addcc sp, sp, #0x8 - movcc r0, #0x0 - ldmccia sp!, {r4-r6,pc} - ldr r1, _020AE118 ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r6 - mov r2, r4 - bl InsertMBlock - mov r0, #0x1 - add sp, sp, #0x8 - ldmia sp!, {r4-r6,pc} - .balign 4 -_020AE118: .word 0x00004652 - arm_func_end RecycleRegion diff --git a/arm9/lib/libnns/include/NNS_FND_expheap.h b/arm9/lib/libnns/include/NNS_FND_expheap.h index bdc3fcc4..acf33bd4 100644 --- a/arm9/lib/libnns/include/NNS_FND_expheap.h +++ b/arm9/lib/libnns/include/NNS_FND_expheap.h @@ -38,13 +38,13 @@ struct NNSiFndExpHeapHead u16 feature; // Attribute }; -NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u32 optFlag); +NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag); void *NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle heap, u32 size, int alignment); void NNS_FndDestroyExpHeap(NNSFndHeapHandle heap); void NNS_FndFreeToExpHeap(NNSFndHeapHandle heap, void *memBlock); u32 NNS_FndGetTotalFreeSizeForExpHeap(NNSFndHeapHandle heap); u32 NNS_FndGetSizeForMBlockExpHeap(const void *memBlock); -void NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size); +u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size); #define NNS_FndCreateExpHeap(startAddress, size) \ NNS_FndCreateExpHeapEx(startAddress, size, 0) diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index f35bf097..e3124e81 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -98,6 +98,8 @@ static inline void FillAllocMemory(NNSiFndHeapHead* pHeapHd, void* address, u32 void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag); +void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead); + #define NNSi_FndRoundUp(value, alignment) (((value) + (alignment - 1)) & ~(alignment - 1)) #define NNSi_FndRoundUpPtr(ptr, alignment) ((void*)NNSi_FndRoundUp(NNSiGetUIntPtr(ptr), alignment)) diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index 31ea5fbe..15657c43 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -31,6 +31,11 @@ static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); } +static inline void* GetMBlockHeadPtr(void* block) +{ + return SubU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); +} + static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) { return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); @@ -51,6 +56,11 @@ static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHeapHead(NNSiFndHeapHead* return AddU32ToPtr(pHHead, sizeof(NNSiFndHeapHead)); } +static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHandle(NNSFndHeapHandle heap) +{ + return GetExpHeapHeadPtrFromHeapHead(heap); +} + static inline NNSiFndHeapHead* GetHeapHeadPtrFromExpHeapHead(NNSiFndExpHeapHead* pEHHead) { return SubU32ToPtr(pEHHead, sizeof(NNSiFndHeapHead)); @@ -267,3 +277,109 @@ void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1); } + +BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) +{ + NNSiFndExpHeapMBlockHead* pBlkPtrFree = NULL; + NNSiMemRegion freeRgn = *pRegion; + NNSiFndExpHeapMBlockHead* pBlk; + for (pBlk = pEHHead->mbFreeList.head; pBlk; pBlk = pBlk->pMBHeadNext) + { + if (pBlk < (NNSiFndExpHeapMBlockHead*)pRegion->start) + { + pBlkPtrFree = pBlk; + continue; + } + if (pBlk == pRegion->end) + { + freeRgn.end = GetMBlockEndAddr(pBlk); + (void)RemoveMBlock(&pEHHead->mbFreeList, pBlk); + } + break; + } + if (pBlkPtrFree && GetMBlockEndAddr(pBlkPtrFree) == pRegion->start) + { + freeRgn.start = pBlkPtrFree; + pBlkPtrFree = RemoveMBlock(&pEHHead->mbFreeList, pBlkPtrFree); + } + if (GetOffsetFromPtr(freeRgn.start, freeRgn.end) < sizeof(NNSiFndExpHeapMBlockHead)) + return FALSE; + InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&freeRgn), pBlkPtrFree); + return TRUE; +} + +NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag) +{ + void* endAddress = NNSi_FndRoundDownPtr(AddU32ToPtr(startAddress, size), 4); + startAddress = NNSi_FndRoundUpPtr(startAddress, 4); + if (NNSiGetUIntPtr(startAddress) > NNSiGetUIntPtr(endAddress) || GetOffsetFromPtr(startAddress, endAddress) < sizeof(NNSiFndHeapHead) + sizeof(NNSiFndExpHeapHead) + sizeof(NNSiFndExpHeapMBlockHead) + 4) + return NULL; + return InitExpHeap(startAddress, endAddress, optFlag); +} + +void NNS_FndDestroyExpHeap(NNSFndHeapHandle handle) +{ + NNSi_FndFinalizeHeap(handle); +} + +void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment) +{ + if (size == 0) + size = 1; + size = NNSi_FndRoundUp(size, 4); + if (alignment >= 0) + return AllocFromHead(handle, size, alignment); + else + return AllocFromTail(handle, size, -alignment); +} + +/* +u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size) +{ + NNSiFndExpHeapHead* pEHHead; + NNSiFndExpHeapMBlockHead* pMBHead; + pEHHead = GetExpHeapHeadPtrFromHandle(heap); + pMBHead = GetMBlockHeadPtr(memBlock); + size = NNSi_FndRoundUp(size, 4); + if (size == pMBHead->blockSize) + return size; + if (size > pMBHead->blockSize) + { + void* crUsedEnd = GetMBlockEndAddr(pMBHead); + NNSiFndExpHeapMBlockHead* block; + for (block = pEHHead->mbFreeList.head; block; block = block->pMBHeadNext) + { + if (block == crUsedEnd) + break; + } + if (!block || size > pMBHead->blockSize + sizeof(NNSiFndExpHeapMBlockHead) + block->blockSize) + return 0; + + NNSiMemRegion rgnNewFree; + void* oldFreeStart; + NNSiFndExpHeapMBlockHead* nextBlockPrev; + + GetRegionOfMBlock(&rgnNewFree, block); + nextBlockPrev = RemoveMBlock(&pEHHead->mbFreeList, block); + oldFreeStart = rgnNewFree.start; + rgnNewFree.start = AddU32ToPtr(memBlock, size); + if (GetOffsetFromPtr(rgnNewFree.start, rgnNewFree.end) < sizeof(NNSiFndExpHeapMBlockHead)) + rgnNewFree.start = rgnNewFree.end; + pMBHead->blockSize = GetOffsetFromPtr(memBlock, rgnNewFree.start); + if (GetOffsetFromPtr(rgnNewFree.start, rgnNewFree.end) >= sizeof(NNSiFndExpHeapMBlockHead)) + (void)InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&rgnNewFree), nextBlockPrev); + FillAllocMemory(heap, oldFreeStart, GetOffsetFromPtr(oldFreeStart, rgnNewFree.start)); + } + else + { + NNSiMemRegion rgnNewFree; + const u32 oldBlockSize = pMBHead->blockSize; + rgnNewFree.start = AddU32ToPtr(memBlock, size); + rgnNewFree.end = GetMBlockEndAddr(pMBHead); + pMBHead->blockSize = size; + if (!RecycleRegion(pEHHead, &rgnNewFree)) + pMBHead->blockSize = oldBlockSize; + } + return pMBHead->blockSize; +} +*/ -- cgit v1.2.3 From 6a0b937064907c1790447f7ddd0c60e66e49cd70 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 21 Aug 2021 18:42:30 -0400 Subject: nitrogfx compatibility with MSVCC --- tools/nitrogfx/Makefile | 2 +- tools/nitrogfx/gfx.c | 15 ++++++++------- tools/nitrogfx/global.h | 6 ++++++ tools/nitrogfx/huff.c | 28 ++++++++++++++-------------- tools/nitrogfx/main.c | 6 ++++-- 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/tools/nitrogfx/Makefile b/tools/nitrogfx/Makefile index eadf2be5..18ecdbba 100644 --- a/tools/nitrogfx/Makefile +++ b/tools/nitrogfx/Makefile @@ -1,6 +1,6 @@ CC = gcc -CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK +CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK -D_CRT_SECURE_NO_WARNINGS LIBS = -lpng -lz diff --git a/tools/nitrogfx/gfx.c b/tools/nitrogfx/gfx.c index f5ff30e7..ee7e0d6f 100644 --- a/tools/nitrogfx/gfx.c +++ b/tools/nitrogfx/gfx.c @@ -101,7 +101,7 @@ static uint32_t ConvertFromScanned4Bpp(unsigned char *src, unsigned char *dest, uint16_t val = (src[i - 1] << 8) | src[i - 2]; val ^= (encValue & 0xFFFF); src[i - 1] = (val >> 8); - src[i - 2] = val; + src[i - 2] = (unsigned char)val; encValue = encValue * 1103515245; encValue = encValue + 24691; } @@ -225,7 +225,7 @@ static void ConvertToScanned4Bpp(unsigned char *src, unsigned char *dest, int fi encValue = (encValue - 24691) * 4005161829; val ^= (encValue & 0xFFFF); dest[i] = (val >> 8); - dest[i - 1] = val; + dest[i - 1] = (unsigned char)val; } } @@ -704,7 +704,7 @@ void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, in fwrite(palHeader, 1, 0x18, fp); - unsigned char colours[colourNum * 2]; + unsigned char * colours = malloc(colourNum * 2); //palette data for (int i = 0; i < colourNum; i++) { @@ -733,6 +733,7 @@ void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, in } fwrite(colours, 1, colourNum * 2, fp); + free(colours); fclose(fp); } @@ -750,7 +751,7 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) { for (int j = 0; j < options->labelCount; j++) { - totalSize += strlen(options->labels[j]) + 5; //strlen + terminator + pointer + totalSize += (unsigned)strlen(options->labels[j]) + 5; //strlen + terminator + pointer } } @@ -865,7 +866,7 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) unsigned int lablSize = 8; for (int j = 0; j < options->labelCount; j++) { - lablSize += strlen(options->labels[j]) + 5; + lablSize += (unsigned)strlen(options->labels[j]) + 5; } unsigned char *labl = malloc(lablSize); @@ -884,14 +885,14 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) labl[i + 8] = position & 0xff; labl[i + 9] = position >> 8; - position += strlen(options->labels[j]) + 1; + position += (unsigned)strlen(options->labels[j]) + 1; i += 4; } for (int j = 0; j < options->labelCount; j++) { strcpy((char *) (labl + (i + 8)), options->labels[j]); - i += strlen(options->labels[j]) + 1; + i += (int)strlen(options->labels[j]) + 1; } fwrite(labl, 1, lablSize, fp); diff --git a/tools/nitrogfx/global.h b/tools/nitrogfx/global.h index 65dd351d..32378a9f 100644 --- a/tools/nitrogfx/global.h +++ b/tools/nitrogfx/global.h @@ -28,4 +28,10 @@ do { \ #endif // _MSC_VER +#define PTR_ADD(ptr, value) ((void*)((uintptr_t)(ptr) + (value))) +#define PTR_SUB(ptr, value) ((void*)((uintptr_t)(ptr) - (value))) +#define PTR_IADD(ptr, value) do { (ptr) = PTR_ADD(ptr, value); } while (0) +#define PTR_ISUB(ptr, value) do { (ptr) = PTR_SUB(ptr, value); } while (0) +#define PTR_DIFF(right, left) ((uintptr_t)(right) - (uintptr_t)(left)) + #endif // GLOBAL_H diff --git a/tools/nitrogfx/huff.c b/tools/nitrogfx/huff.c index 143ed79b..d718fb71 100644 --- a/tools/nitrogfx/huff.c +++ b/tools/nitrogfx/huff.c @@ -34,17 +34,17 @@ int msort_r(void * data, size_t count, size_t size, cmpfun cmp, void * buffer) { case 2: // Swap the two entries if the right one compares higher. - if (cmp(data, data + size) > 0) { + if (cmp(data, PTR_ADD(data, size)) > 0) { memcpy(buffer, data, size); - memcpy(data, data + size, size); - memcpy(data + size, buffer, size); + memcpy(data, PTR_ADD(data, size), size); + memcpy(PTR_ADD(data, size), buffer, size); } break; default: // Merge sort out-of-place. leftPtr = data; - leftEnd = rightPtr = data + count / 2 * size; - rightEnd = data + count * size; + leftEnd = rightPtr = PTR_ADD(data, count / 2 * size); + rightEnd = PTR_ADD(data, count * size); // Sort the left half if (!msort_r(leftPtr, count / 2, size, cmp, buffer)) @@ -58,11 +58,11 @@ int msort_r(void * data, size_t count, size_t size, cmpfun cmp, void * buffer) { i = 0; do { if (cmp(leftPtr, rightPtr) <= 0) { - memcpy(buffer + i * size, leftPtr, size); - leftPtr += size; + memcpy(PTR_ADD(buffer, i * size), leftPtr, size); + PTR_IADD(leftPtr, size); } else { - memcpy(buffer + i * size, rightPtr, size); - rightPtr += size; + memcpy(PTR_ADD(buffer, i * size), rightPtr, size); + PTR_IADD(rightPtr, size); } } while (++i < count && leftPtr < leftEnd && rightPtr < rightEnd); @@ -70,10 +70,10 @@ int msort_r(void * data, size_t count, size_t size, cmpfun cmp, void * buffer) { // Copy the remainder if (i < count) { if (leftPtr < leftEnd) { - memcpy(buffer + i * size, leftPtr, leftEnd - leftPtr); + memcpy(PTR_ADD(buffer, i * size), leftPtr, PTR_DIFF(leftEnd, leftPtr)); } else { - memcpy(buffer + i * size, rightPtr, rightEnd - rightPtr); + memcpy(PTR_ADD(buffer, i * size), rightPtr, PTR_DIFF(rightEnd, rightPtr)); } } @@ -163,7 +163,7 @@ static void write_tree(unsigned char * dest, HuffNode_t * tree, int nitems, stru if (currNode->header.isLeaf) { dest[5 + i] = traversal[i].leaf.key; } else { - dest[5 + i] = (((currNode->branch.right - traversal - i) / 2) - 1); + dest[5 + i] = (unsigned char)(((currNode->branch.right - traversal - i) / 2) - 1); if (currNode->branch.left->header.isLeaf) dest[5 + i] |= 0x80; if (currNode->branch.right->header.isLeaf) @@ -194,8 +194,8 @@ static inline void read_32_le(unsigned char * src, int * srcPos, uint32_t * buff } static void write_bits(unsigned char * dest, int * destPos, struct BitEncoding * encoding, int value, uint32_t * buff, int * buffBits) { - int nbits = encoding[value].nbits; - uint32_t bitstring = encoding[value].bitstring; + int nbits = (int)encoding[value].nbits; + uint32_t bitstring = (uint32_t)encoding[value].bitstring; if (*buffBits + nbits >= 32) { int diff = *buffBits + nbits - 32; diff --git a/tools/nitrogfx/main.c b/tools/nitrogfx/main.c index 171cb5f3..b2d3352a 100644 --- a/tools/nitrogfx/main.c +++ b/tools/nitrogfx/main.c @@ -63,13 +63,14 @@ void ConvertNtrToPng(char *inputPath, char *outputPath, struct GbaToPngOptions * if (key) { - char string[strlen(outputPath) + 5]; + char* string = malloc(strlen(outputPath) + 5); sprintf(string, "%s.key", outputPath); FILE *fp = fopen(string, "wb"); if (fp == NULL) FATAL_ERROR("Failed to open key file for writing.\n"); fwrite(&key, 4, 1, fp); fclose(fp); + free(string); } image.hasTransparency = options->hasTransparency; @@ -103,7 +104,7 @@ void ConvertPngToNtr(char *inputPath, char *outputPath, struct PngToNtrOptions * uint32_t key = 0; if (options->scanned) { - char string[strlen(inputPath) + 5]; + char* string = malloc(strlen(inputPath) + 5); sprintf(string, "%s.key", inputPath); FILE *fp2 = fopen(string, "rb"); if (fp2 == NULL) @@ -112,6 +113,7 @@ void ConvertPngToNtr(char *inputPath, char *outputPath, struct PngToNtrOptions * if (count != 1) FATAL_ERROR("Not a valid key file.\n"); fclose(fp2); + free(string); } WriteNtrImage(outputPath, options->numTiles, image.bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette, options->clobberSize, options->byteOrder, options->version101, options->sopc, options->scanned, key); -- cgit v1.2.3 From 71a3c2e14a52026811fd50396275b0efe0ce9101 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 22 Aug 2021 14:30:54 -0400 Subject: Port bin2obj from NitroSDK --- .gitignore | 2 +- tools/bin2obj/.gitignore | 1 + tools/bin2obj/Makefile | 13 ++ tools/bin2obj/bin2obj.cpp | 295 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 310 insertions(+), 1 deletion(-) create mode 100644 tools/bin2obj/.gitignore create mode 100644 tools/bin2obj/Makefile create mode 100644 tools/bin2obj/bin2obj.cpp diff --git a/.gitignore b/.gitignore index c10cf159..b4dda926 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ arm*/build/** # CLion folders .idea/ -cmake-build-debug/ +cmake-build-*/ # ROM *.srl diff --git a/tools/bin2obj/.gitignore b/tools/bin2obj/.gitignore new file mode 100644 index 00000000..2fa716c9 --- /dev/null +++ b/tools/bin2obj/.gitignore @@ -0,0 +1 @@ +bin2obj diff --git a/tools/bin2obj/Makefile b/tools/bin2obj/Makefile new file mode 100644 index 00000000..760a66e2 --- /dev/null +++ b/tools/bin2obj/Makefile @@ -0,0 +1,13 @@ +CXX := g++ +CXXFLAGS := -O2 -g -std=c++17 + +.PHONY: all clean + +all: bin2obj + @: + +clean: + $(RM) bin2obj bin2obj.exe + +bin2obj: bin2obj.cpp + $(CXX) $(CXXFLAGS) -o $@ $< diff --git a/tools/bin2obj/bin2obj.cpp b/tools/bin2obj/bin2obj.cpp new file mode 100644 index 00000000..6963438d --- /dev/null +++ b/tools/bin2obj/bin2obj.cpp @@ -0,0 +1,295 @@ +#include +#include +#include +#include +extern "C" { +#include +} + +enum Proc : unsigned char { + PROC_ARM = EM_ARM, + PROC_PPC = EM_PPC, +}; + +enum Endian : unsigned char { + END_LITTLE = ELFDATA2LSB, + END_BIG = ELFDATA2MSB, +}; + +enum Shndx { + SHNDX_SHSTRTAB = 1, + SHNDX_SYMTAB, + SHNDX_STRTAB, + SHNDX_PROGBITS, +}; + +static inline void usage() { + std::cout << "Usage: bin2obj [-b|--begin SYMBOL_BEGIN]" << std::endl; + std::cout << " [-e|--end SYMBOL_END]" << std::endl; + std::cout << " [-C|--compatible]" << std::endl; + std::cout << " [-a|--align ALIGNMENT]" << std::endl; + std::cout << " [-r|--readonly]" << std::endl; + std::cout << " [-s|--section SECTION]" << std::endl; + std::cout << " [-m|--machine [arm|ppc]]" << std::endl; + std::cout << " [-B|--big-endian]" << std::endl; + std::cout << " [-L|--little-endian] BINARY_FILE OBJECT_FILE" << std::endl; + std::cout << std::endl; + std::cout << " -b or --begin Set symbol name for top of binary. (*)" << std::endl; + std::cout << " -e or --end Set symbol name for bottom of binary. (*)" << std::endl; + std::cout << " -C or --compatible Use compatible symbols with BinToElf.exe." << std::endl; + std::cout << " Same as \"-b _binary_%f -e _binary_%f_end\"." << std::endl; + std::cout << " -a or --align Set binary data alignment in bytes." << std::endl; + std::cout << " -r or --readonly Handle binary data as readonly." << std::endl; + std::cout << " -s or --section Set section name." << std::endl; + std::cout << " -m or --machine [arm|ppc] Machine arch [arm|ppc].(default=arm)" << std::endl; + std::cout << " -B or --big-endian Output in big endian format." << std::endl; + std::cout << " -L or --little-endian Output in little endian format." << std::endl; + std::cout << std::endl; + std::cout << " (*) special % rules for symbols (ex. binary_file = \"filename.dat\")" << std::endl; + std::cout << " %f,%t replaced to file name of binary (%f = \"filename.dat\")" << std::endl; + std::cout << " %b replaced to base name of binary (%b = \"filename\")" << std::endl; + std::cout << " %e replaced to extension of binary (%e = \"dat\")" << std::endl; +} + +std::string& ntrsprintf(std::string& templ, std::string binfname) { + size_t pos; + if ((pos = binfname.rfind('/')) != std::string::npos) { + binfname = binfname.substr(pos + 1); + } + size_t extpos = binfname.rfind('.'); + if (extpos == std::string::npos) extpos = binfname.length() - 1; + if ((pos = templ.find("%f")) != std::string::npos || (pos = templ.find("%t")) != std::string::npos) { + templ = templ.substr(0, pos) + binfname + templ.substr(pos + 2); + } + if ((pos = templ.find("%b")) != std::string::npos) { + templ = templ.substr(0, pos) + binfname.substr(0, extpos) + templ.substr(pos + 2); + } + if ((pos = templ.find("%e")) != std::string::npos) { + templ = templ.substr(0, pos) + binfname.substr(extpos + 1) + templ.substr(pos + 2); + } + return templ; +} + +int main(int argc, char** argv) { + std::vector args(argv + 1, argv + argc); + std::vector posargs; + std::string sym_begin; + std::string sym_end; + bool compatible = false; + int alignment = 4; + bool readonly = false; + std::string section; + Proc proc = PROC_ARM; + Endian endian = END_LITTLE; + + for (auto arg_i = args.cbegin(); arg_i < args.cend(); arg_i++) { + const std::string cur_arg = *arg_i; + if (cur_arg == "-b" || cur_arg == "--begin") { + arg_i++; + sym_begin = *arg_i; + } else if (cur_arg == "-e" || cur_arg == "--end") { + arg_i++; + sym_end = *arg_i; + } else if (cur_arg == "-C" || cur_arg == "--compatible") { + compatible = true; + } else if (cur_arg == "-a" || cur_arg == "--align") { + arg_i++; + try { + alignment = std::stoi(*arg_i); + } catch (std::invalid_argument& e) { + if (e.what() == static_cast("stoi")) { + std::cerr << "Invalid integer value for " << cur_arg << ": " << *arg_i << std::endl; + } else { + std::cerr << "Unexpected error while parsing value for " << cur_arg << ": " << e.what() << std::endl; + } + return 1; + } + } else if (cur_arg == "-r" || cur_arg == "--readonly") { + readonly = true; + } else if (cur_arg == "-s" || cur_arg == "--section") { + arg_i++; + section = *arg_i; + } else if (cur_arg == "-m" || cur_arg == "--machine") { + arg_i++; + if (*arg_i == "arm") { + proc = PROC_ARM; + } else if (*arg_i == "ppc") { + proc = PROC_PPC; + } else { + std::cerr << "Invalid argument for " << cur_arg << ": " << *arg_i << std::endl; + return 1; + } + } else if (cur_arg == "-B" || cur_arg == "--big-endian") { + endian = END_BIG; + } else if (cur_arg == "-L" || cur_arg == "--little-endian") { + endian = END_LITTLE; + } else { + posargs.push_back(cur_arg); + } + } + + if (posargs.size() < 2) { + usage(); + std::cerr << "Missing required position argument: " << (posargs.empty() ? "BINARY_FILE" : "OBJECT_FILE") << std::endl; + return 1; + } else if (posargs.size() > 2) { + usage(); + std::cerr << "Unrecognized arguments (first one: " << posargs[2] << ")" << std::endl; + return 1; + } + if (compatible) { + sym_begin = "_binary_%f"; + sym_end = "_binary_%f_end"; + } + if (sym_begin.empty()) { + sym_begin = "%b_begin"; + } + if (sym_end.empty()) { + sym_end = "%b_end"; + } + sym_begin = ntrsprintf(sym_begin, posargs[0]); + sym_end = ntrsprintf(sym_end, posargs[0]); + if (section.empty()) { + section = readonly ? ".rodata" : ".data"; + } + if (alignment == 0) { + alignment = 1; + } else { + int i; + for (i = 0; i < 10; i++) { + if ((alignment >> i) & 1) { + if ((alignment >> i) & ~1) { + std::cerr << "Alignment must be a power of 2" << std::endl; + return 1; + } + break; + } + } + if (i == 10) { + std::cerr << "Alignment exceeds maximum value of 512" << std::endl; + return 1; + } + } + if (alignment < 4) { + alignment = 4; + } + std::ifstream binfile(posargs[0], std::ios::binary | std::ios::ate); + if (!binfile.good()) { + std::cerr << "Unable to open file " << posargs[0] << " for reading" << std::endl; + return 1; + } + std::ofstream objfile(posargs[1], std::ios::binary); + if (!objfile.good()) { + binfile.close(); + std::cerr << "Unable to open file " << posargs[1] << " for writing" << std::endl; + return 1; + } + size_t filesize = binfile.tellg(); + binfile.seekg(0); + + // Elf header + Elf32_Ehdr ehdr = { + .e_ident = { + ELFMAG0, // EI_MAG0 + ELFMAG1, // EI_MAG1 + ELFMAG2, // EI_MAG2 + ELFMAG3, // EI_MAG3 + ELFCLASS32, // EI_CLASS + endian, // EI_DATA + EV_CURRENT, // EI_VERSION + ELFOSABI_NONE, // EI_OSABI + 0, // EI_ABIVERSION + }, + .e_type = ET_REL, + .e_machine = proc, + .e_version = EV_CURRENT, + .e_shoff = sizeof(Elf32_Ehdr), + .e_ehsize = sizeof(Elf32_Ehdr), + .e_shentsize = sizeof(Elf32_Shdr), + .e_shnum = 5, + .e_shstrndx = 1, + }; + + // Five sections: NULL, user section, symtab, strtab, shstrtab + Elf32_Shdr shdr[5] = {}; + + size_t sh_name = 1; + shdr[SHNDX_SHSTRTAB].sh_type = SHT_STRTAB; + shdr[SHNDX_SHSTRTAB].sh_offset = ehdr.e_shoff + 5 * sizeof(Elf32_Shdr); + shdr[SHNDX_SHSTRTAB].sh_name = sh_name; + sh_name += std::string(".shstrtab").length() + 1; + shdr[SHNDX_SYMTAB].sh_type = SHT_SYMTAB; + shdr[SHNDX_SYMTAB].sh_link = SHNDX_STRTAB; + shdr[SHNDX_SYMTAB].sh_info = 2; + shdr[SHNDX_SYMTAB].sh_addralign = 4; + shdr[SHNDX_SYMTAB].sh_name = sh_name; + shdr[SHNDX_SYMTAB].sh_entsize = sizeof(Elf32_Sym); + sh_name += std::string(".symtab").length() + 1; + shdr[SHNDX_STRTAB].sh_type = SHT_STRTAB; + shdr[SHNDX_STRTAB].sh_addralign = 1; + shdr[SHNDX_STRTAB].sh_name = sh_name; + sh_name += std::string(".strtab").length() + 1; + shdr[SHNDX_PROGBITS].sh_type = SHT_PROGBITS; + shdr[SHNDX_PROGBITS].sh_flags = SHF_ALLOC | (readonly ? 0 : SHF_WRITE); + shdr[SHNDX_PROGBITS].sh_addralign = alignment; + shdr[SHNDX_PROGBITS].sh_name = sh_name; + sh_name += section.length() + 1; + shdr[SHNDX_SHSTRTAB].sh_size = sh_name; + sh_name = (sh_name + 3) & ~3; + shdr[SHNDX_SYMTAB].sh_offset = shdr[SHNDX_SHSTRTAB].sh_offset + sh_name; + shdr[SHNDX_SYMTAB].sh_size = 3 * sizeof(Elf32_Sym); + shdr[SHNDX_STRTAB].sh_offset = shdr[SHNDX_SYMTAB].sh_offset + shdr[SHNDX_SYMTAB].sh_size; + size_t st_name = sym_begin.length() + sym_end.length() + 3; + shdr[SHNDX_STRTAB].sh_size = st_name; + st_name = (st_name + 3) & ~3; + shdr[SHNDX_PROGBITS].sh_offset = shdr[SHNDX_STRTAB].sh_offset + st_name; + shdr[SHNDX_PROGBITS].sh_size = filesize; + + // symtab + Elf32_Sym syms[3] = {}; + // begin + syms[1].st_info = ELF32_ST_INFO(STB_GLOBAL, STT_OBJECT); + syms[1].st_shndx = SHNDX_PROGBITS; + syms[1].st_size = filesize; + syms[1].st_value = 0; + syms[1].st_name = 1; + // end + syms[2].st_info = ELF32_ST_INFO(STB_GLOBAL, STT_OBJECT); + syms[2].st_shndx = SHNDX_PROGBITS; + syms[2].st_size = 0; + syms[2].st_value = filesize; + syms[2].st_name = sym_begin.length() + 2; + + // Write to file + char zeroes[3] = {0, 0, 0}; + unsigned padding; + // Elf header + objfile.write((char*)&ehdr, sizeof(ehdr)); + // Section headers + objfile.write((char*)shdr, sizeof(shdr)); + // Section string table + objfile.write(zeroes, 1); + objfile.write(".shstrtab", sizeof(".shstrtab")); + objfile.write(".symtab", sizeof(".symtab")); + objfile.write(".strtab", sizeof(".strtab")); + objfile.write(section.c_str(), static_cast(section.length() + 1)); + padding = (4 - (sizeof(".shstrtab") + sizeof(".symtab") + sizeof(".strtab") + section.length() + 2)) & 3; + objfile.write(zeroes, padding); + // Symbol table + objfile.write((char*)syms, sizeof(syms)); + // String table + objfile.write(zeroes, 1); + objfile.write(sym_begin.c_str(), static_cast(sym_begin.length() + 1)); + objfile.write(sym_end.c_str(), static_cast(sym_end.length() + 1)); + padding = (4 - (sym_begin.length() + sym_end.length() + 3)) & 3; + objfile.write(zeroes, padding); + // Data + char* rdbuf = new char[filesize]; + binfile.read(rdbuf, static_cast(filesize)); + objfile.write(rdbuf, static_cast(filesize)); + delete[] rdbuf; + + binfile.close(); + objfile.close(); + return 0; +} -- cgit v1.2.3 From c17dcd24d24b9309ce2c1da1c709816afbea975b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 28 Aug 2021 15:09:57 -0400 Subject: ARM_FUNC --- arm9/lib/libnns/src/NNS_FND_allocator.c | 10 +++++----- arm9/lib/libnns/src/NNS_FND_expheap.c | 26 +++++++++++++------------- arm9/lib/libnns/src/NNS_FND_heapcommon.c | 10 +++++----- arm9/lib/libnns/src/NNS_FND_list.c | 16 ++++++++-------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/arm9/lib/libnns/src/NNS_FND_allocator.c b/arm9/lib/libnns/src/NNS_FND_allocator.c index 31d0eb70..c459c3d0 100644 --- a/arm9/lib/libnns/src/NNS_FND_allocator.c +++ b/arm9/lib/libnns/src/NNS_FND_allocator.c @@ -2,27 +2,27 @@ #include "NNS_FND_allocator.h" #include "NNS_FND_expheap.h" -void *AllocatorAllocForExpHeap(NNSFndAllocator * pAllocator, u32 size) +ARM_FUNC void *AllocatorAllocForExpHeap(NNSFndAllocator * pAllocator, u32 size) { return NNS_FndAllocFromExpHeapEx(pAllocator->pHeap, size, pAllocator->heapParam1); } -void AllocatorFreeForExpHeap(NNSFndAllocator * pAllocator, void *memBlock) +ARM_FUNC void AllocatorFreeForExpHeap(NNSFndAllocator * pAllocator, void *memBlock) { NNS_FndFreeToExpHeap(pAllocator->pHeap, memBlock); } -void *NNS_FndAllocFromAllocator(NNSFndAllocator * pAllocator, u32 size) +ARM_FUNC void *NNS_FndAllocFromAllocator(NNSFndAllocator * pAllocator, u32 size) { return pAllocator->pFunc->pfAlloc(pAllocator, size); } -void NNS_FndFreeToAllocator(NNSFndAllocator * pAllocator, void *memBlock) +ARM_FUNC void NNS_FndFreeToAllocator(NNSFndAllocator * pAllocator, void *memBlock) { pAllocator->pFunc->pfFree(pAllocator, memBlock); } -void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle pHeap, int alignment) +ARM_FUNC void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle pHeap, int alignment) { static const NNSFndAllocatorFunc pFunc = {AllocatorAllocForExpHeap, AllocatorFreeForExpHeap}; pAllocator->pFunc = &pFunc; diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index 15657c43..62a4deb4 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -66,13 +66,13 @@ static inline NNSiFndHeapHead* GetHeapHeadPtrFromExpHeapHead(NNSiFndExpHeapHead* return SubU32ToPtr(pEHHead, sizeof(NNSiFndHeapHead)); } -void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) +ARM_FUNC void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) { region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); region->end = GetMBlockEndAddr(block); } -NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +ARM_FUNC NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) { NNSiFndExpHeapMBlockHead* const prev = block->pMBHeadPrev; NNSiFndExpHeapMBlockHead* const next = block->pMBHeadNext; @@ -98,7 +98,7 @@ NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHea return prev; } -NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) +ARM_FUNC NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) { NNSiFndExpHeapMBlockHead* next; target->pMBHeadPrev = prev; @@ -125,7 +125,7 @@ NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHea return target; } -NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) +ARM_FUNC NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) { NNSiFndExpHeapMBlockHead* block = pRegion->start; block->signature = signature; @@ -141,7 +141,7 @@ static inline NNSiFndExpHeapMBlockHead* InitFreeMBlock(const NNSiMemRegion* regi return InitMBlock(region, 0x4652); } -NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) +ARM_FUNC NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) { NNSiFndHeapHead* pHeapHd = (NNSiFndHeapHead*)startAddress; NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); @@ -170,7 +170,7 @@ static inline void AppendMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlock (void) InsertMBlock(list, block, list->tail); } -void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) +ARM_FUNC void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) { NNSiMemRegion freeRgnT; NNSiMemRegion freeRgnB; @@ -218,7 +218,7 @@ void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBl return mblock; } -void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +ARM_FUNC void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) { NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; @@ -248,7 +248,7 @@ void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 0); } -void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +ARM_FUNC void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) { NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; @@ -278,7 +278,7 @@ void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1); } -BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) +ARM_FUNC BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) { NNSiFndExpHeapMBlockHead* pBlkPtrFree = NULL; NNSiMemRegion freeRgn = *pRegion; @@ -308,7 +308,7 @@ BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) return TRUE; } -NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag) +ARM_FUNC NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag) { void* endAddress = NNSi_FndRoundDownPtr(AddU32ToPtr(startAddress, size), 4); startAddress = NNSi_FndRoundUpPtr(startAddress, 4); @@ -317,12 +317,12 @@ NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFla return InitExpHeap(startAddress, endAddress, optFlag); } -void NNS_FndDestroyExpHeap(NNSFndHeapHandle handle) +ARM_FUNC void NNS_FndDestroyExpHeap(NNSFndHeapHandle handle) { NNSi_FndFinalizeHeap(handle); } -void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment) +ARM_FUNC void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment) { if (size == 0) size = 1; @@ -334,7 +334,7 @@ void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment } /* -u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size) +ARM_FUNC u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size) { NNSiFndExpHeapHead* pEHHead; NNSiFndExpHeapMBlockHead* pMBHead; diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 07b8e9cf..73646030 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -5,9 +5,9 @@ BOOL sRootListInitialized; NNSFndList sRootList; -void *NNS_FndGetNextListObject(NNSFndList *, void *); +ARM_FUNC void *NNS_FndGetNextListObject(NNSFndList *, void *); -static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +ARM_FUNC static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) { NNSiFndHeapHead * pHead = NULL; @@ -24,7 +24,7 @@ static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBloc return NULL; } -static NNSFndList* FindListContainHeap(const void * memBlock) +ARM_FUNC static NNSFndList* FindListContainHeap(const void * memBlock) { NNSFndList* ret = &sRootList; NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); @@ -33,7 +33,7 @@ static NNSFndList* FindListContainHeap(const void * memBlock) return ret; } -void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag) +ARM_FUNC void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag) { pHead->signature = signature; pHead->heapStart = heapStart; @@ -49,7 +49,7 @@ void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart NNS_FndAppendListObject(FindListContainHeap(pHead), pHead); } -void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead) +ARM_FUNC void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead) { NNS_FndRemoveListObject(FindListContainHeap(pHead), pHead); } diff --git a/arm9/lib/libnns/src/NNS_FND_list.c b/arm9/lib/libnns/src/NNS_FND_list.c index d4dd7620..fdab8188 100644 --- a/arm9/lib/libnns/src/NNS_FND_list.c +++ b/arm9/lib/libnns/src/NNS_FND_list.c @@ -3,7 +3,7 @@ #define OBJ_TO_LINK(list, obj) ((NNSFndLink*)((void*)(obj) + (list)->offset)) -void NNS_FndInitList(NNSFndList* list, s32 alignment) +ARM_FUNC void NNS_FndInitList(NNSFndList* list, s32 alignment) { list->headObject = NULL; list->tailObject = NULL; @@ -11,7 +11,7 @@ void NNS_FndInitList(NNSFndList* list, s32 alignment) list->offset = (u16)alignment; } -static void SetFirstObject(NNSFndList* list, void* object) +ARM_FUNC static void SetFirstObject(NNSFndList* list, void* object) { NNSFndLink* tail = OBJ_TO_LINK(list, object); tail->nextObject = NULL; @@ -21,7 +21,7 @@ static void SetFirstObject(NNSFndList* list, void* object) list->numObjects++; } -void NNS_FndAppendListObject(NNSFndList* list, void* object) +ARM_FUNC void NNS_FndAppendListObject(NNSFndList* list, void* object) { if (list->headObject == NULL) { @@ -38,7 +38,7 @@ void NNS_FndAppendListObject(NNSFndList* list, void* object) } } -void NNS_FndPrependListObject(NNSFndList* list, void* object) +ARM_FUNC void NNS_FndPrependListObject(NNSFndList* list, void* object) { if (list->headObject == NULL) { @@ -55,7 +55,7 @@ void NNS_FndPrependListObject(NNSFndList* list, void* object) } } -void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) +ARM_FUNC void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) { if (where == NULL) { @@ -79,7 +79,7 @@ void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) } } -void NNS_FndRemoveListObject(NNSFndList* list, void* object) +ARM_FUNC void NNS_FndRemoveListObject(NNSFndList* list, void* object) { NNSFndLink* node = OBJ_TO_LINK(list, object); if (node->prevObject == NULL) @@ -103,7 +103,7 @@ void NNS_FndRemoveListObject(NNSFndList* list, void* object) list->numObjects--; } -void * NNS_FndGetNextListObject(NNSFndList* list, void* object) +ARM_FUNC void * NNS_FndGetNextListObject(NNSFndList* list, void* object) { if (object == NULL) { @@ -115,7 +115,7 @@ void * NNS_FndGetNextListObject(NNSFndList* list, void* object) } } -void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) +ARM_FUNC void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) { if (object == NULL) { -- cgit v1.2.3