blob: 70e3886ac9200cdb91781715a7cfa1be6ba4c141 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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;
}
|