From 963a657ad585ac3bb70d8a0f78e35ea54145eacc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 08:14:19 -0400 Subject: InitExpHeap --- arm9/lib/libnns/include/NNS_FND_heapcommon.h | 2 ++ arm9/lib/libnns/src/NNS_FND_expheap.c | 39 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'arm9/lib/libnns') 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