diff options
Diffstat (limited to 'arm9/lib/libnns/include')
-rw-r--r-- | arm9/lib/libnns/include/NNS_FND_expheap.h | 4 | ||||
-rw-r--r-- | arm9/lib/libnns/include/NNS_FND_heapcommon.h | 85 | ||||
-rw-r--r-- | arm9/lib/libnns/include/NNS_FND_list.h | 15 |
3 files changed, 102 insertions, 2 deletions
diff --git a/arm9/lib/libnns/include/NNS_FND_expheap.h b/arm9/lib/libnns/include/NNS_FND_expheap.h index bdc3fcc4..acf33bd4 100644 --- a/arm9/lib/libnns/include/NNS_FND_expheap.h +++ b/arm9/lib/libnns/include/NNS_FND_expheap.h @@ -38,13 +38,13 @@ struct NNSiFndExpHeapHead u16 feature; // Attribute }; -NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u32 optFlag); +NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag); void *NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle heap, u32 size, int alignment); void NNS_FndDestroyExpHeap(NNSFndHeapHandle heap); void NNS_FndFreeToExpHeap(NNSFndHeapHandle heap, void *memBlock); u32 NNS_FndGetTotalFreeSizeForExpHeap(NNSFndHeapHandle heap); u32 NNS_FndGetSizeForMBlockExpHeap(const void *memBlock); -void NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size); +u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size); #define NNS_FndCreateExpHeap(startAddress, size) \ NNS_FndCreateExpHeapEx(startAddress, size, 0) diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index e6fab69c..e3124e81 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -2,11 +2,26 @@ #define GUARD_NNS_FND_HEAPCOMMON_H #include "NNS_FND_list.h" +#include "MI_memory.h" #define NNS_FND_HEAP_DEFAULT_ALIGNMENT 4 +#define NNS_FndGetFillValForHeap(type) (0) + typedef struct NNSiFndHeapHead NNSiFndHeapHead; +typedef s32 NNSiIntPtr; +typedef u32 NNSiUIntPtr; + +#define NNSi_FndGetBitValue(data, st, bits) (((data) >>(st)) & ((1 <<(bits)) -1)) +#define NNSi_FndSetBitValue(data, st, bits, val) do { \ + u32 maskBits = (u32)((1 << (bits)) - 1); \ + u32 newVal = (val) & maskBits; \ + (void)(maskBits <<= st); \ + (data) &= ~maskBits; \ + (data) |= newVal << (st); \ +} while (FALSE); + struct NNSiFndHeapHead { u32 signature; @@ -23,4 +38,74 @@ struct NNSiFndHeapHead typedef NNSiFndHeapHead* NNSFndHeapHandle; // Type to represent heap handle +static inline NNSiUIntPtr NNSiGetUIntPtr(const void* ptr) +{ + return (NNSiUIntPtr)ptr; +} + +static inline u32 GetOffsetFromPtr(const void* start, const void* end) +{ + return NNSiGetUIntPtr(end) - NNSiGetUIntPtr(start); +} + +static inline void* AddU32ToPtr(void* ptr, u32 val) +{ + return (void*)( NNSiGetUIntPtr(ptr) + val ); +} + +static inline const void* AddU32ToCPtr(const void* ptr, u32 val) +{ + return (const void*)( NNSiGetUIntPtr(ptr) + val ); +} + +static inline void* SubU32ToPtr(void* ptr, u32 val) +{ + return (void*)(NNSiGetUIntPtr(ptr) - val); +} + +static inline const void* SubU32ToCPtr(const void* ptr, u32 val) +{ + return (const void*)(NNSiGetUIntPtr(ptr) - val); +} + +static inline int ComparePtr(const void* a, const void* b) +{ + const u8* wa = a; + const u8* wb = b; + + return wa - wb; +} + + +static inline u16 GetOptForHeap(const NNSiFndHeapHead* pHeapHd) +{ + return (u16)NNSi_FndGetBitValue(pHeapHd->attribute, 0, 8); +} + +static inline void SetOptForHeap( + NNSiFndHeapHead* pHeapHd, + u16 optFlag + ) +{ + NNSi_FndSetBitValue(pHeapHd->attribute, 0, 8, optFlag); +} + +static inline void FillAllocMemory(NNSiFndHeapHead* pHeapHd, void* address, u32 size) +{ + if (GetOptForHeap(pHeapHd) & 1) + MI_CpuFill32(address, NNS_FndGetFillValForHeap(0), size); +} + +void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag); + +void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead); + +#define NNSi_FndRoundUp(value, alignment) (((value) + (alignment - 1)) & ~(alignment - 1)) + +#define NNSi_FndRoundUpPtr(ptr, alignment) ((void*)NNSi_FndRoundUp(NNSiGetUIntPtr(ptr), alignment)) + +#define NNSi_FndRoundDown(value, alignment) ((value) & ~(alignment - 1)) + +#define NNSi_FndRoundDownPtr(ptr, alignment) ((void*)NNSi_FndRoundDown(NNSiGetUIntPtr(ptr), alignment)) + #endif //GUARD_NNS_FND_HEAPCOMMON_H diff --git a/arm9/lib/libnns/include/NNS_FND_list.h b/arm9/lib/libnns/include/NNS_FND_list.h index 5fec2fdf..4bba7882 100644 --- a/arm9/lib/libnns/include/NNS_FND_list.h +++ b/arm9/lib/libnns/include/NNS_FND_list.h @@ -17,4 +17,19 @@ typedef struct } NNSFndList; +void NNS_FndInitList( + NNSFndList *pList, + s32 alignment +); + +void NNS_FndAppendListObject( + NNSFndList *pList, + void* object +); + +void NNS_FndRemoveListObject( + NNSFndList *pList, + void* object +); + #endif //GUARD_NNS_FND_LIST_H |