diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2021-08-20 08:14:19 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2021-08-20 08:14:19 -0400 |
commit | 963a657ad585ac3bb70d8a0f78e35ea54145eacc (patch) | |
tree | 7bd82beb247796328cbe3d1a1b8610712a15d2b6 /arm9/lib | |
parent | de1e71e9c852c007f40341644e8e922ff6e3b2ca (diff) |
InitExpHeap
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/libnns/include/NNS_FND_heapcommon.h | 2 | ||||
-rw-r--r-- | arm9/lib/libnns/src/NNS_FND_expheap.c | 39 |
2 files changed, 41 insertions, 0 deletions
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;
+}
|