summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2021-08-20 08:14:19 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2021-08-20 08:14:19 -0400
commit963a657ad585ac3bb70d8a0f78e35ea54145eacc (patch)
tree7bd82beb247796328cbe3d1a1b8610712a15d2b6 /arm9/lib
parentde1e71e9c852c007f40341644e8e922ff6e3b2ca (diff)
InitExpHeap
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/libnns/include/NNS_FND_heapcommon.h2
-rw-r--r--arm9/lib/libnns/src/NNS_FND_expheap.c39
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(&region);
+
+ pExpHeapHd->mbFreeList.head = pMBHead;
+ pExpHeapHd->mbFreeList.tail = pMBHead;
+ pExpHeapHd->mbUsedList.head = NULL;
+ pExpHeapHd->mbUsedList.tail = NULL;
+
+ return pHeapHd;
+}