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