summaryrefslogtreecommitdiff
path: root/arm9/lib/libnns/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/libnns/src')
-rw-r--r--arm9/lib/libnns/src/NNS_FND_expheap.c92
-rw-r--r--arm9/lib/libnns/src/NNS_FND_heapcommon.c8
2 files changed, 93 insertions, 7 deletions
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)
{