66#include "error_message_reset.h"
77#include "unk_020366A0.h"
88
9- typedef struct {
9+ typedef struct HeapInfo {
1010 NNSFndHeapHandle * heapHandles ;
1111 NNSFndHeapHandle * parentHeapHandles ;
1212 void * * subHeapRawPtrs ;
@@ -18,43 +18,49 @@ typedef struct {
1818 u16 unallocatedHeapID ;
1919} HeapInfo ;
2020
21- typedef struct {
22- char filler_00 [12 ];
21+ typedef struct MemoryBlock {
22+ u8 filler_00 [12 ];
2323 u32 heapID : 8 ;
2424 u32 filler_0D : 24 ;
2525} MemoryBlock ;
2626
27- static int FindFirstAvailableHeapHandle (void );
28- static BOOL CreateHeapInternal (enum HeapID parent , enum HeapID child , u32 size , s32 alignment );
29- static void * AllocFromHeapInternal (NNSFndHeapHandle heap , u32 size , s32 alignment , u32 heapID );
27+ static HeapInfo sHeapInfo ;
3028
31- static HeapInfo sHeapInfo = { 0 } ;
29+ static BOOL CreateHeapInternal ( enum HeapID parent , enum HeapID child , u32 size , s32 alignment ) ;
3230
3331void Heap_InitSystem (const HeapParam * templates , u32 nTemplates , u32 totalNumHeaps , u32 preSize )
3432{
3533 void * ptr ;
3634 u32 i ;
3735 u32 usableHeaps = nTemplates + 24 ;
36+
3837 if (totalNumHeaps < usableHeaps ) {
3938 totalNumHeaps = usableHeaps ;
4039 }
4140
42- if (preSize ) {
43- while (preSize & 3 ) {
41+ if (preSize != 0 ) {
42+ // force align
43+ while (preSize % 4 != 0 ) {
4444 preSize ++ ;
4545 }
4646 OS_AllocFromMainArenaLo (preSize , 4 );
4747 }
4848
49- sHeapInfo .heapHandles = OS_AllocFromMainArenaLo ((sizeof (NNSFndHeapHandle ) * (usableHeaps + 1 )) + (sizeof (NNSFndHeapHandle ) * usableHeaps ) + (sizeof (void * ) * usableHeaps ) + (sizeof (u16 ) * (totalNumHeaps )) + totalNumHeaps , 4 );
49+ sHeapInfo .heapHandles = OS_AllocFromMainArenaLo (
50+ (usableHeaps + 1 ) * sizeof (NNSFndHeapHandle )
51+ + usableHeaps * sizeof (NNSFndHeapHandle )
52+ + usableHeaps * sizeof (void * )
53+ + totalNumHeaps * sizeof (u16 )
54+ + totalNumHeaps ,
55+ 4 );
5056 sHeapInfo .parentHeapHandles = sHeapInfo .heapHandles + (usableHeaps + 1 );
51- sHeapInfo .subHeapRawPtrs = (void * * )(( u8 * )( sHeapInfo .parentHeapHandles ) + ( sizeof ( NNSFndHeapHandle ) * usableHeaps ) );
52- sHeapInfo .numMemBlocks = (u16 * )(( u8 * )( sHeapInfo .subHeapRawPtrs ) + ( sizeof ( void * ) * usableHeaps ) );
53- sHeapInfo .heapIdxs = (u8 * )(sHeapInfo .numMemBlocks ) + ( sizeof ( u16 ) * ( totalNumHeaps ) );
54- sHeapInfo .totalNumHeaps = totalNumHeaps ;
55- sHeapInfo .nTemplates = nTemplates ;
56- sHeapInfo .unallocatedHeapID = usableHeaps ;
57- sHeapInfo .maxHeaps = usableHeaps ;
57+ sHeapInfo .subHeapRawPtrs = (void * * )(sHeapInfo .parentHeapHandles + usableHeaps );
58+ sHeapInfo .numMemBlocks = (u16 * )(sHeapInfo .subHeapRawPtrs + usableHeaps );
59+ sHeapInfo .heapIdxs = (u8 * )(sHeapInfo .numMemBlocks + totalNumHeaps );
60+ sHeapInfo .totalNumHeaps = ( u16 ) totalNumHeaps ;
61+ sHeapInfo .nTemplates = ( u16 ) nTemplates ;
62+ sHeapInfo .unallocatedHeapID = ( u16 ) usableHeaps ;
63+ sHeapInfo .maxHeaps = ( u16 ) usableHeaps ;
5864
5965 for (i = 0 ; i < nTemplates ; i ++ ) {
6066 switch (templates [i ].arena ) {
@@ -69,29 +75,31 @@ void Heap_InitSystem(const HeapParam *templates, u32 nTemplates, u32 totalNumHea
6975
7076 if (ptr != NULL ) {
7177 sHeapInfo .heapHandles [i ] = NNS_FndCreateExpHeap (ptr , templates [i ].size );
72- sHeapInfo .heapIdxs [i ] = i ;
78+ sHeapInfo .heapIdxs [i ] = ( u8 ) i ;
7379 } else {
7480 GF_ASSERT (FALSE);
7581 }
7682 }
7783
78- for (i = nTemplates ; i < ( usableHeaps + 1 ) ; i ++ ) {
84+ for (i = nTemplates ; i < usableHeaps + 1 ; i ++ ) {
7985 sHeapInfo .heapHandles [i ] = NNS_FND_HEAP_INVALID_HANDLE ;
80- sHeapInfo .heapIdxs [i ] = sHeapInfo .unallocatedHeapID ;
86+ sHeapInfo .heapIdxs [i ] = ( u8 ) sHeapInfo .unallocatedHeapID ;
8187 }
8288
8389 while (i < totalNumHeaps ) {
84- sHeapInfo .heapIdxs [i ++ ] = sHeapInfo .unallocatedHeapID ;
90+ sHeapInfo .heapIdxs [i ++ ] = ( u8 ) sHeapInfo .unallocatedHeapID ;
8591 }
8692
8793 for (i = 0 ; i < totalNumHeaps ; i ++ ) {
8894 sHeapInfo .numMemBlocks [i ] = 0 ;
8995 }
9096}
9197
92- static int FindFirstAvailableHeapHandle (void )
98+ static s32 FindFirstAvailableHeapHandle (void )
9399{
94- for (int i = sHeapInfo .nTemplates ; i < sHeapInfo .maxHeaps ; i ++ ) {
100+ s32 i ;
101+
102+ for (i = sHeapInfo .nTemplates ; i < sHeapInfo .maxHeaps ; i ++ ) {
95103 if (sHeapInfo .heapHandles [i ] == NNS_FND_HEAP_INVALID_HANDLE ) {
96104 return i ;
97105 }
@@ -114,22 +122,20 @@ static BOOL CreateHeapInternal(enum HeapID parent, enum HeapID child, u32 size,
114122{
115123 GF_ASSERT (OS_GetProcMode () != OS_PROCMODE_IRQ );
116124
117- if ( sHeapInfo . heapIdxs [ child ] == sHeapInfo .unallocatedHeapID ) {
118- NNSFndHeapHandle parentHeap = sHeapInfo . heapHandles [ sHeapInfo . heapIdxs [ parent ]];
119-
125+ u8 * ptr = sHeapInfo .heapIdxs ;
126+ if ( sHeapInfo . unallocatedHeapID == ptr [ child ]) {
127+ NNSFndHeapHandle parentHeap = sHeapInfo . heapHandles [ ptr [ parent ]];
120128 if (parentHeap != NNS_FND_HEAP_INVALID_HANDLE ) {
121129 void * newHeapAddr = NNS_FndAllocFromExpHeapEx (parentHeap , size , alignment );
122-
123130 if (newHeapAddr != NULL ) {
124- int i = FindFirstAvailableHeapHandle ();
125-
131+ s32 i = FindFirstAvailableHeapHandle ();
126132 if (i >= 0 ) {
127133 sHeapInfo .heapHandles [i ] = NNS_FndCreateExpHeap (newHeapAddr , size );
128134
129135 if (sHeapInfo .heapHandles [i ] != NNS_FND_HEAP_INVALID_HANDLE ) {
130136 sHeapInfo .parentHeapHandles [i ] = parentHeap ;
131137 sHeapInfo .subHeapRawPtrs [i ] = newHeapAddr ;
132- sHeapInfo .heapIdxs [child ] = i ;
138+ sHeapInfo .heapIdxs [child ] = ( u8 ) i ;
133139
134140 return TRUE;
135141 } else {
@@ -147,54 +153,47 @@ static BOOL CreateHeapInternal(enum HeapID parent, enum HeapID child, u32 size,
147153 } else {
148154 GF_ASSERT (FALSE);
149155 }
150-
151156 return FALSE;
152157}
153158
154159void Heap_Destroy (enum HeapID heapID )
155160{
156161 GF_ASSERT (OS_GetProcMode () != OS_PROCMODE_IRQ );
157162
158- u8 index = sHeapInfo .heapIdxs [heapID ];
159- NNSFndHeapHandle handle = sHeapInfo .heapHandles [index ];
163+ NNSFndHeapHandle handle = sHeapInfo .heapHandles [sHeapInfo .heapIdxs [heapID ]];
160164
161165 if (handle != NNS_FND_HEAP_INVALID_HANDLE ) {
162- NNSFndHeapHandle parentHeap ;
163- void * childRaw ;
164-
165166 NNS_FndDestroyExpHeap (handle );
166167
167- parentHeap = sHeapInfo .parentHeapHandles [ sHeapInfo . heapIdxs [heapID ] ];
168- childRaw = sHeapInfo .subHeapRawPtrs [ sHeapInfo . heapIdxs [ heapID ] ];
169-
170- if (( parentHeap != NNS_FND_HEAP_INVALID_HANDLE ) && ( childRaw != NULL ) ) {
168+ u8 index = sHeapInfo .heapIdxs [heapID ];
169+ NNSFndHeapHandle parentHeap = sHeapInfo .parentHeapHandles [ index ];
170+ void * childRaw = sHeapInfo . subHeapRawPtrs [ index ];
171+ if (parentHeap != NNS_FND_HEAP_INVALID_HANDLE && childRaw != NULL ) {
171172 NNS_FndFreeToExpHeap (parentHeap , childRaw );
172173 } else {
173174 GF_ASSERT (FALSE);
174175 }
175176
176- sHeapInfo .heapHandles [sHeapInfo .heapIdxs [heapID ]] = ( void * ) 0 ;
177- sHeapInfo .parentHeapHandles [sHeapInfo .heapIdxs [heapID ]] = ( void * ) 0 ;
178- sHeapInfo .subHeapRawPtrs [sHeapInfo .heapIdxs [heapID ]] = ( void * ) 0 ;
177+ sHeapInfo .heapHandles [sHeapInfo .heapIdxs [heapID ]] = NULL ;
178+ sHeapInfo .parentHeapHandles [sHeapInfo .heapIdxs [heapID ]] = NULL ;
179+ sHeapInfo .subHeapRawPtrs [sHeapInfo .heapIdxs [heapID ]] = NULL ;
179180
180- sHeapInfo .heapIdxs [heapID ] = sHeapInfo .unallocatedHeapID ;
181+ sHeapInfo .heapIdxs [heapID ] = ( u8 ) sHeapInfo .unallocatedHeapID ;
181182 }
182183}
183184
184- static void * AllocFromHeapInternal (NNSFndHeapHandle heap , u32 size , s32 alignment , u32 heapID )
185+ static void * AllocFromHeapInternal (NNSFndHeapHandle heap , u32 size , s32 alignment , enum HeapID heapID )
185186{
186- void * ptr ;
187- OSIntrMode intr_mode ;
188-
189187 GF_ASSERT (heap != NNS_FND_HEAP_INVALID_HANDLE );
190188
191- intr_mode = OS_DisableInterrupts ();
192- ptr = NNS_FndAllocFromExpHeapEx (heap , size + sizeof (MemoryBlock ), alignment );
193-
194- OS_RestoreInterrupts (intr_mode );
189+ OSIntrMode intrMode = OS_DisableInterrupts ();
190+ size += sizeof (MemoryBlock );
191+ void * ptr = NNS_FndAllocFromExpHeapEx (heap , size , alignment );
195192
193+ OS_RestoreInterrupts (intrMode );
196194 if (ptr != NULL ) {
197195 ((MemoryBlock * )ptr )-> heapID = heapID ;
196+
198197 ptr += sizeof (MemoryBlock );
199198 }
200199
@@ -212,10 +211,9 @@ void *Heap_Alloc(u32 heapID, u32 size)
212211{
213212 void * ptr = NULL ;
214213
215- if (heapID < sHeapInfo .totalNumHeaps ) {
214+ if (( u32 ) heapID < sHeapInfo .totalNumHeaps ) {
216215 u8 index = sHeapInfo .heapIdxs [heapID ];
217- NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
218- ptr = AllocFromHeapInternal (heap , size , 4 , heapID );
216+ ptr = AllocFromHeapInternal (sHeapInfo .heapHandles [index ], size , 4 , heapID );
219217 }
220218
221219 if (ptr != NULL ) {
@@ -231,10 +229,9 @@ void *Heap_AllocAtEnd(u32 heapID, u32 size)
231229{
232230 void * ptr = NULL ;
233231
234- if (heapID < sHeapInfo .totalNumHeaps ) {
232+ if (( u32 ) heapID < sHeapInfo .totalNumHeaps ) {
235233 u8 index = sHeapInfo .heapIdxs [heapID ];
236- NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
237- ptr = AllocFromHeapInternal (heap , size , -4 , heapID );
234+ ptr = AllocFromHeapInternal (sHeapInfo .heapHandles [index ], size , -4 , heapID );
238235 }
239236
240237 if (ptr != NULL ) {
@@ -249,9 +246,9 @@ void *Heap_AllocAtEnd(u32 heapID, u32 size)
249246void Heap_Free (void * ptr )
250247{
251248 ptr -= sizeof (MemoryBlock );
252- u32 heapID = ((MemoryBlock * )ptr )-> heapID ;
249+ enum HeapID heapID = ( enum HeapID ) ((MemoryBlock * )ptr )-> heapID ;
253250
254- if (heapID < sHeapInfo .totalNumHeaps ) {
251+ if (( u32 ) heapID < sHeapInfo .totalNumHeaps ) {
255252 u8 index = sHeapInfo .heapIdxs [heapID ];
256253 NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
257254
@@ -261,53 +258,46 @@ void Heap_Free(void *ptr)
261258 GF_heap_c_dummy_return_true (heapID );
262259 }
263260
264- GF_ASSERT (sHeapInfo .numMemBlocks [heapID ]);
261+ GF_ASSERT (sHeapInfo .numMemBlocks [heapID ] != 0 );
265262
266263 sHeapInfo .numMemBlocks [heapID ]-- ;
267264
268- {
269- OSIntrMode intrMode ;
270-
271- intrMode = OS_DisableInterrupts ();
272- NNS_FndFreeToExpHeap (heap , ptr );
273- OS_RestoreInterrupts (intrMode );
274- }
275- } else {
276- GF_ASSERT (FALSE);
265+ OSIntrMode intrMode = OS_DisableInterrupts ();
266+ NNS_FndFreeToExpHeap (heap , ptr );
267+ OS_RestoreInterrupts (intrMode );
268+ return ;
277269 }
270+
271+ GF_ASSERT (FALSE);
278272}
279273
280274void Heap_FreeExplicit (u32 heapID , void * ptr )
281275{
282276 GF_ASSERT (OS_GetProcMode () != OS_PROCMODE_IRQ );
283277
284- if (heapID < sHeapInfo .totalNumHeaps ) {
278+ if (( u32 ) heapID < sHeapInfo .totalNumHeaps ) {
285279 u8 index = sHeapInfo .heapIdxs [heapID ];
286280 NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
287281
288282 GF_ASSERT (heap != NNS_FND_HEAP_INVALID_HANDLE );
289283
290284 ptr -= sizeof (MemoryBlock );
291-
292- if (((MemoryBlock * )ptr )-> heapID != heapID ) {
293- GF_ASSERT (FALSE);
294- }
285+ GF_ASSERT (((MemoryBlock * )ptr )-> heapID == heapID );
295286
296287 NNS_FndFreeToExpHeap (heap , ptr );
297-
298- GF_ASSERT (sHeapInfo .numMemBlocks [heapID ]);
288+ GF_ASSERT (sHeapInfo .numMemBlocks [heapID ] != 0 );
299289 sHeapInfo .numMemBlocks [heapID ]-- ;
300- } else {
301- GF_ASSERT (FALSE);
290+ return ;
302291 }
292+
293+ GF_ASSERT (FALSE);
303294}
304295
305296u32 HeapExp_FndGetTotalFreeSize (u32 heapID )
306297{
307- if (heapID < sHeapInfo .totalNumHeaps ) {
298+ if (( u32 ) heapID < sHeapInfo .totalNumHeaps ) {
308299 u8 index = sHeapInfo .heapIdxs [heapID ];
309- NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
310- return NNS_FndGetTotalFreeSizeForExpHeap (heap );
300+ return NNS_FndGetTotalFreeSizeForExpHeap (sHeapInfo .heapHandles [index ]);
311301 }
312302
313303 GF_ASSERT (FALSE);
@@ -316,13 +306,13 @@ u32 HeapExp_FndGetTotalFreeSize(u32 heapID)
316306
317307void HeapExp_FndInitAllocator (NNSFndAllocator * pAllocator , u32 heapID , int alignment )
318308{
319- if (heapID < sHeapInfo .totalNumHeaps ) {
309+ if (( u32 ) heapID < sHeapInfo .totalNumHeaps ) {
320310 u8 index = sHeapInfo .heapIdxs [heapID ];
321- NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
322- NNS_FndInitAllocatorForExpHeap (pAllocator , heap , alignment );
323- } else {
324- GF_ASSERT (FALSE);
311+ NNS_FndInitAllocatorForExpHeap (pAllocator , sHeapInfo .heapHandles [index ], alignment );
312+ return ;
325313 }
314+
315+ GF_ASSERT (FALSE);
326316}
327317
328318void Heap_Realloc (void * ptr , u32 newSize )
@@ -335,12 +325,11 @@ void Heap_Realloc(void *ptr, u32 newSize)
335325 if (NNS_FndGetSizeForMBlockExpHeap (ptr ) >= newSize ) {
336326 u32 heapID = ((MemoryBlock * )ptr )-> heapID ;
337327 u8 index = sHeapInfo .heapIdxs [heapID ];
338- NNSFndHeapHandle heap = sHeapInfo .heapHandles [index ];
339328
340- NNS_FndResizeForMBlockExpHeap (heap , ptr , newSize );
341- } else {
342- GF_ASSERT (FALSE);
329+ NNS_FndResizeForMBlockExpHeap (sHeapInfo .heapHandles [index ], ptr , newSize );
330+ return ;
343331 }
332+ GF_ASSERT (FALSE);
344333}
345334
346335BOOL GF_heap_c_dummy_return_true (u32 heapID )
0 commit comments