1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS
3   File:     os_arena.c
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-11-06#$
14   $Rev: 9235 $
15   $Author: yada $
16 
17  *---------------------------------------------------------------------------*/
18 #include <nitro.h>
19 
20 #define OSi_TRUNC(n, a)     (((u32) (n)) & ~((a) - 1))
21 #define OSi_ROUND(n, a)     (((u32) (n) + (a) - 1) & ~((a) - 1))
22 
23 #define OS_ERR_GETARENAHI_INIT     "OS_GetArenaHi: init in advance"
24 #define OS_ERR_GETARENAHI_INVALID  "OS_GetArenaHi: invalid arena (hi<lo)"
25 #define OS_ERR_GETARENALO_INIT     "OS_GetArenaLo: init in advance"
26 #define OS_ERR_GETARENALO_INVALID  "OS_GetArenaLo: invalid arena (hi<lo)"
27 
28 #define SDK_ARENAID_ASSERT( id )        SDK_ASSERT( (u32)id < OS_ARENA_MAX )
29 
30 
31 //---- Arena infomation Address ( allocated in Shared Memory )
32 #define OSi_GetArenaInfo()              (*(OSArenaInfo*)HW_ARENA_INFO_BUF)
33 
34 
35 //---- default Main Arena Address (for arm9)
36 #ifdef SDK_NITRO
37 // Nitro
38 extern void SDK_MAIN_ARENA_LO(void);
39 #define OSi_MAIN_ARENA_LO_DEFAULT               ((u32)SDK_MAIN_ARENA_LO)        // Defined by LCF
40 #define OSi_MAIN_ARENA_HI_DEFAULT               HW_MAIN_MEM_MAIN_END
41 #else
42 // Twl: nitro
43 extern void SDK_MAIN_ARENA_LO(void);
44 #define OSi_MAIN_ARENA_LO_DEFAULT_forNITRO      ((u32)SDK_MAIN_ARENA_LO)        // Defined by LCF
45 #define OSi_MAIN_ARENA_HI_DEFAULT_forNITRO      HW_MAIN_MEM_MAIN_END
46 // Twl: twl
47 extern void SDK_LTDMAIN_ARENA_LO(void);
48 #define OSi_MAIN_ARENA_LO_DEFAULT_forTWL        ((u32)SDK_LTDMAIN_ARENA_LO)     // Defined by LCF
49 #define OSi_MAIN_ARENA_HI_DEFAULT_forTWL        HW_TWL_MAIN_MEM_MAIN_END
50 #endif
51 
52 
53 //---- default Main Arena Address (for arm7)
54 #ifdef SDK_ARM7
55 #ifdef SDK_NITRO
56 //Nitro
57 extern void SDK_SUBPRIV_ARENA_LO(void);
58 #define OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT       ((u32)SDK_SUBPRIV_ARENA_LO)     // Defined by LCF
59 #define OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT       HW_MAIN_MEM_SUB_END
60 #else
61 //Twl: nitro
62 extern void SDK_SUBPRIV_ARENA_LO(void);
63 #define OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT_forNITRO ((u32)SDK_SUBPRIV_ARENA_LO)     // Defined by LCF
64 #define OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT_forNITRO HW_MAIN_MEM_SUB_END
65 //Twl: twl
66 #define OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT_forTWL  ((u32)SDK_SUBPRIV_ARENA_LO)     // Defined by LCF
67 #define OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT_forTWL   HW_TWL_MAIN_MEM_SUB_END
68 #endif
69 #endif
70 
71 
72 //---- default Extended Main Arena Address (for arm9)
73 #ifdef SDK_ARM9
74 #ifdef SDK_NITRO
75 //Nitro
76 extern void SDK_SECTION_ARENA_EX_START(void);
77 #define OSi_MAINEX_ARENA_LO_DEFAULT             ((u32)SDK_SECTION_ARENA_EX_START)       // Defined by LCF
78 #define OSi_MAINEX_ARENA_HI_DEFAULT             HW_MAIN_MEM_DEBUGGER
79 #else
80 //Twl: nitro
81 extern void SDK_SECTION_ARENA_EX_START(void);
82 #define OSi_MAINEX_ARENA_LO_DEFAULT_forNITRO    ((u32)SDK_SECTION_ARENA_EX_START)       // Defined by LCF
83 #define OSi_MAINEX_ARENA_HI_DEFAULT_forNITRO     HW_MAIN_MEM_DEBUGGER
84 //Twl: twl
85 extern void SDK_LTDMAIN_EX_ARENA_LO(void);
86 #define OSi_MAINEX_ARENA_LO_DEFAULT_forTWL      ((u32)SDK_LTDMAIN_EX_ARENA_LO)          // Defined by LCF
87 #define OSi_MAINEX_ARENA_HI_DEFAULT_forTWL       HW_TWL_MAIN_MEM_DEBUGGER
88 #endif
89 #endif
90 
91 
92 #ifdef SDK_ARM9
93 //---- default DTCM Arena Address (for arm9)
94 extern void SDK_SECTION_ARENA_DTCM_START(void);
95 #define OSi_DTCM_ARENA_LO_DEFAULT               ((u32)SDK_SECTION_ARENA_DTCM_START)     // Defined by LCF
96 
97 
98 //---- default ITCM Arena Address (for arm9)
99 extern void SDK_SECTION_ARENA_ITCM_START(void);
100 #define OSi_ITCM_ARENA_LO_DEFAULT               ((u32)SDK_SECTION_ARENA_ITCM_START)     // Defined by LCF
101 #endif
102 
103 
104 //---- default common WorkRAM (for Main-Proc) Arena Address
105 #define OSi_WRAM_MAIN_ARENA_LO_DEFAULT          HW_WRAM
106 #define OSi_WRAM_MAIN_ARENA_HI_DEFAULT          HW_WRAM
107 
108 
109 //---- default common WorkRAM (for Sub-Proc) Arena Address
110 #ifdef SDK_ARM7
111 extern void SDK_WRAM_ARENA_LO(void);
112 #define OSi_WRAM_SUB_ARENA_LO_DEFAULT           ((u32)SDK_WRAM_ARENA_LO)        // Defined by LCF
113 #define OSi_WRAM_SUB_ARENA_HI_DEFAULT           HW_WRAM_END
114 #endif
115 
116 
117 //---- default Sub-Proc Private WorkRAM Arena Address (for from ARM9)
118 #ifdef SDK_ARM7
119 #define OSi_WRAM_SUBPRIV_ARENA_LO_DEFAULT       HW_PRV_WRAM
120 #define OSi_WRAM_SUBPRIV_ARENA_HI_DEFAULT       HW_PRV_WRAM_END
121 #endif
122 
123 
124 //---- stack size indication from LCF
125 extern unsigned long SDK_SYS_STACKSIZE[];
126 #define OSi_SYS_STACKSIZE               ((int)SDK_SYS_STACKSIZE)
127 extern unsigned long SDK_IRQ_STACKSIZE[];
128 #define OSi_IRQ_STACKSIZE               ((int)SDK_IRQ_STACKSIZE)
129 
130 static BOOL OSi_Initialized = FALSE;
131 
132 #ifdef SDK_ARM9
133 #ifdef SDK_NITRO
134 // Nitro
135 #ifdef SDK_4M
136 BOOL    OSi_MainExArenaEnabled = FALSE;
137 #else
138 BOOL    OSi_MainExArenaEnabled = TRUE;
139 #endif
140 #else
141 // Twl
142 #ifdef SDK_16M
143 BOOL    OSi_MainExArenaEnabled = FALSE;
144 #else
145 BOOL    OSi_MainExArenaEnabled = TRUE;
146 #endif
147 #endif
148 #endif
149 
150 
151 //================================================================================
152 //        INIT
153 //================================================================================
154 #ifdef SDK_ARM9
155 /*---------------------------------------------------------------------------*
156   Name:         OS_InitArena
157 
158   Description:  Initialize Arena
159 
160   Arguments:    None.
161 
162   Returns:      None.
163  *---------------------------------------------------------------------------*/
OS_InitArena(void)164 void OS_InitArena(void)
165 {
166     //---- check if arena initialized
167     if (OSi_Initialized)
168     {
169         return;
170     }
171     OSi_Initialized = TRUE;
172 
173     //---------------- set Arena Lo/Hi addresses
174     //---- MainRam, Main-Processor private
175     OS_InitArenaHiAndLo(OS_ARENA_MAIN);
176 
177     //---- Extended MainRam (temporary. set in OS_InitArenaEx later.)
178     OS_SetArenaLo(OS_ARENA_MAINEX, (void *)0);
179     OS_SetArenaHi(OS_ARENA_MAINEX, (void *)0);
180 
181     //---- ITCM
182     OS_InitArenaHiAndLo(OS_ARENA_ITCM);
183 
184     //---- DTCM
185     OS_InitArenaHiAndLo(OS_ARENA_DTCM);
186 
187     //---- set Shared Memory Arena
188     OS_InitArenaHiAndLo(OS_ARENA_SHARED);
189 
190     //---- Work RAM, for Main-Processor
191     OS_InitArenaHiAndLo(OS_ARENA_WRAM_MAIN);
192 }
193 #endif
194 
195 #ifdef SDK_ARM7
196 /*---------------------------------------------------------------------------*
197   Name:         OS_InitArena
198 
199   Description:  Initialize WRAM_SUBPRIV_ARENA
200 
201   Arguments:    None.
202 
203   Returns:      None.
204  *---------------------------------------------------------------------------*/
OS_InitArena(void)205 void OS_InitArena(void)
206 {
207     //---- check if arena initialized
208     if (OSi_Initialized)
209     {
210         return;
211     }
212     OSi_Initialized = TRUE;
213 
214     //---------------- set Arena Lo/Hi addresses
215     //---- MainRam, Sub-Processor private
216     OS_InitArenaHiAndLo(OS_ARENA_MAIN_SUBPRIV);
217 
218     //---- Work RAM, for Sub-Processor
219     OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUB);
220 
221     //---- Sub-Processor private Work RAM
222     OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUBPRIV);
223 }
224 #endif
225 
226 #ifdef SDK_ARM9
227 /*---------------------------------------------------------------------------*
228   Name:         OS_InitArenaEx
229 
230   Description:  Initialize extended MainRam Arena
231                 OS_InitArena() must be called before
232 
233   Arguments:    None.
234 
235   Returns:      None.
236  *---------------------------------------------------------------------------*/
237 #ifndef SDK_FINALROM
238 // (subroutine for OS_InitArenaEx)
OSi_SetForMainPR(u32 consoleType)239 static inline void OSi_SetForMainPR( u32 consoleType )
240 {
241 	u32 size = OS_PR_SIZE_4MB;
242 
243 	if ( OSi_MainExArenaEnabled )
244 	{
245 		u32 type = consoleType & OS_CONSOLE_MASK;
246 
247 		if ( ( type == OS_CONSOLE_ISDEBUGGER ) ||
248 			 ( type == OS_CONSOLE_TWLDEBUGGER ) ||
249 			 ( type == OS_CONSOLE_TWL ) )
250 		{
251 			size = OS_PR_SIZE_8MB;
252 		}
253 	}
254 
255 	OS_SetProtectionRegionEx(1, HW_MAIN_MEM_MAIN, size);
256 
257 	//----[TODO] enlarge MainEx arena, if possible.
258 }
259 #endif
260 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
261 #ifdef SDK_TWL
262 #include <twl/ltdmain_begin.h>
263 void OSi_InitArenaEx_ltdmain(void);
OSi_InitArenaEx_ltdmain(void)264 void OSi_InitArenaEx_ltdmain(void)
265 {
266     u32 consoleType = OS_GetConsoleType();
267     u32 memSize = consoleType & OS_CONSOLE_SIZE_MASK;
268 
269 #ifdef SDK_FINALROM
270     // Protect extra main memory area
271     OS_SetProtectionRegionEx(3, HW_CTRDG_ROM, OS_PR_SIZE_64MB);
272 #else
273     if (OSi_MainExArenaEnabled && memSize == OS_CONSOLE_SIZE_32MB)
274     {
275         OSIntrMode enabled = OS_DisableInterrupts();
276 
277         OS_SetProtectionRegionEx(3, HW_CTRDG_ROM, OS_PR_SIZE_128MB);
278         //(void)OS_SetDPermissionsForProtectionRegion(OS_PR3_ACCESS_MASK, OS_PR3_ACCESS_RW);
279         //OS_EnableICacheForProtectionRegion(1<<3);
280         //OS_EnableDCacheForProtectionRegion(1<<3);
281         //OS_EnableWriteBufferForProtectionRegion(1<<3);
282 
283         (void)OS_RestoreInterrupts(enabled);
284     }
285     else
286     {
287         // Protect extra main memory area
288         OS_SetProtectionRegionEx(3, HW_CTRDG_ROM, OS_PR_SIZE_64MB);
289     }
290 #endif
291 }
292 #include <twl/ltdmain_end.h>
293 #endif
294 
OS_InitArenaEx(void)295 void OS_InitArenaEx(void)
296 {
297 	u32 consoleType = OS_GetConsoleType();
298 	u32 memSize = consoleType & OS_CONSOLE_SIZE_MASK;
299 
300     OS_InitArenaHiAndLo(OS_ARENA_MAINEX);
301 
302 #ifdef SDK_NITRO
303 	//---------------- Nitro
304 #ifdef SDK_FINALROM
305 	OS_SetProtectionRegionEx(1, HW_MAIN_MEM_MAIN, OS_PR_SIZE_4MB);
306 #else
307 	OSi_SetForMainPR( consoleType );
308 #endif
309 #else //ifdef SDK_NITRO
310 	//---------------- Twl
311 	if (! OS_IsRunOnTwl())
312 	{
313 		//---------------- Twl: nitro
314 #ifdef SDK_FINALROM
315 		OS_SetProtectionRegionEx(1, HW_MAIN_MEM_MAIN, OS_PR_SIZE_4MB);
316 #else
317 		OSi_SetForMainPR( consoleType );
318 #endif
319 		OS_SetProtectionRegionEx(2, HW_MAIN_MEM_IM_SHARED_END - HW_MAIN_MEM_IM_SHARED_SIZE, OS_PR_SIZE_4KB);
320 	}
321 	else
322 	{
323 		//---------------- Twl: twl
324         OSi_InitArenaEx_ltdmain();
325 	}
326 #endif //ifdef SDK_NITRO
327 }
328 #endif // ifdef SDK_ARM9
329 
330 //================================================================================
331 //        GET ARENA INFO
332 //================================================================================
333 /*---------------------------------------------------------------------------*
334   Name:         OS_GetArenaInfo
335 
336   Description:  Get the pointer of Arena structure
337 
338   Arguments:    None.
339 
340   Returns:      the pointer of Arena structure
341  *---------------------------------------------------------------------------*/
OS_GetArenaInfo(void)342 void   *OS_GetArenaInfo(void)
343 {
344     return (void *)&OSi_GetArenaInfo();
345 }
346 
347 /*---------------------------------------------------------------------------*
348   Name:         OS_GetArenaHi
349 
350   Description:  Get the high boundary of the arena
351 
352   Arguments:    id : arena ID
353 
354   Returns:      the high boundary of the arena
355  *---------------------------------------------------------------------------*/
OS_GetArenaHi(OSArenaId id)356 void   *OS_GetArenaHi(OSArenaId id)
357 {
358     SDK_ASSERT(OSi_Initialized);
359     SDK_ARENAID_ASSERT(id);
360     SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] != 0xffffffff, OS_ERR_GETARENALO_INIT);
361     SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] <= (u32)OSi_GetArenaInfo().hi[id],
362                   OS_ERR_GETARENALO_INVALID);
363 
364     return OSi_GetArenaInfo().hi[id];
365 }
366 
367 /*---------------------------------------------------------------------------*
368   Name:         OS_GetArenaLo
369 
370   Description:  Get the low boundary of the arena
371 
372   Arguments:    id : arena ID
373 
374   Returns:      the low boundary of the arena
375  *---------------------------------------------------------------------------*/
OS_GetArenaLo(OSArenaId id)376 void   *OS_GetArenaLo(OSArenaId id)
377 {
378     SDK_ASSERT(OSi_Initialized);
379     SDK_ARENAID_ASSERT(id);
380     SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] != 0xffffffff, OS_ERR_GETARENALO_INIT);
381     SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] <= (u32)OSi_GetArenaInfo().hi[id],
382                   OS_ERR_GETARENALO_INVALID);
383 
384     return OSi_GetArenaInfo().lo[id];
385 }
386 
387 /*---------------------------------------------------------------------------*
388   Name:         OS_GetInitArenaHi
389 
390   Description:  Get the initial high boundary of the arena
391 
392   Arguments:    id : arena ID
393 
394   Returns:      the initial high boundary of the arena
395  *---------------------------------------------------------------------------*/
OS_GetInitArenaHi(OSArenaId id)396 void   *OS_GetInitArenaHi(OSArenaId id)
397 {
398     SDK_ASSERT(OSi_Initialized);
399     SDK_ARENAID_ASSERT(id);
400 
401     switch (id)
402     {
403 #ifdef SDK_ARM9
404     case OS_ARENA_MAIN:
405 #ifdef SDK_NITRO
406         return (void *)OSi_MAIN_ARENA_HI_DEFAULT;
407 #else
408 		return (OS_IsRunOnTwl())?
409 			    (void *)OSi_MAIN_ARENA_HI_DEFAULT_forTWL:
410 				(void *)OSi_MAIN_ARENA_HI_DEFAULT_forNITRO;
411 #endif
412 
413     case OS_ARENA_MAINEX:
414 		if ( ! OSi_MainExArenaEnabled )
415 		{
416 			return 0;
417 		}
418 		else
419 		{
420 			u32 size = OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK;
421 #ifdef SDK_NITRO
422 			return (void*) ( (size == OS_CONSOLE_SIZE_4MB)? 0: OSi_MAINEX_ARENA_HI_DEFAULT );
423 #else
424 			return (OS_IsRunOnTwl())?
425 				(void*)( (size == OS_CONSOLE_SIZE_16MB)? 0: OSi_MAINEX_ARENA_HI_DEFAULT_forTWL ):
426 				(void*)( (size == OS_CONSOLE_SIZE_4MB)? 0: OSi_MAINEX_ARENA_HI_DEFAULT_forNITRO );
427 #endif
428 		}
429 
430     case OS_ARENA_ITCM:
431         return (void *)HW_ITCM_ARENA_HI_DEFAULT;
432 
433     case OS_ARENA_DTCM:
434         {
435             u32     irqStackLo;
436             u32     sysStackLo;
437 
438             irqStackLo = (u32)HW_DTCM_IRQ_STACK_END - OSi_IRQ_STACKSIZE;
439 
440             if (OSi_SYS_STACKSIZE == 0) // maximum SysStack in DTCM
441             {
442                 sysStackLo = HW_DTCM;
443                 if (sysStackLo < OSi_DTCM_ARENA_LO_DEFAULT)
444                 {
445                     sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT;
446                 }
447             }
448             else if (OSi_SYS_STACKSIZE < 0)
449             {
450                 sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT - OSi_SYS_STACKSIZE;
451             }
452             else
453             {
454                 sysStackLo = irqStackLo - OSi_SYS_STACKSIZE;
455             }
456             SDK_ASSERT((u32)OSi_DTCM_ARENA_LO_DEFAULT <= sysStackLo && sysStackLo < irqStackLo);
457             return (void *)sysStackLo;
458         }
459 
460     case OS_ARENA_SHARED:
461         return (void *)HW_SHARED_ARENA_HI_DEFAULT;
462 
463     case OS_ARENA_WRAM_MAIN:
464         return (void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT;
465 #else
466     case OS_ARENA_MAIN_SUBPRIV:
467 #ifdef SDK_NITRO
468         return (void *)OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT;
469 #else
470 		return (OS_IsRunOnTwl())?
471 			    (void *)OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT_forTWL:
472 				(void *)OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT_forNITRO;
473 #endif
474 
475     case OS_ARENA_WRAM_SUB:
476         return (void *)OSi_WRAM_SUB_ARENA_HI_DEFAULT;
477 
478     case OS_ARENA_WRAM_SUBPRIV:
479         {
480             u32     irqStackLo;
481             u32     sysStackLo;
482 
483             // ---- Sub-Processor private Work RAM
484             // decide sysStackLo
485             irqStackLo = (u32)HW_PRV_WRAM_IRQ_STACK_END - OSi_IRQ_STACKSIZE;
486             sysStackLo = (u32)HW_PRV_WRAM;
487 
488             //---- if program area is larger than the size of common wram
489             if ((u32)SDK_WRAM_ARENA_LO > (u32)HW_PRV_WRAM)
490             {
491                 sysStackLo = (u32)SDK_WRAM_ARENA_LO;
492             }
493 
494             if (OSi_SYS_STACKSIZE == 0) // maximum SysStack in SURPRIV-WRAM
495             {
496                 // do nothing
497             }
498             else if (OSi_SYS_STACKSIZE < 0)
499             {
500                 sysStackLo -= OSi_SYS_STACKSIZE;
501             }
502             else
503             {
504                 sysStackLo = irqStackLo - OSi_SYS_STACKSIZE;
505             }
506             SDK_ASSERT((u32)HW_PRV_WRAM <= sysStackLo && sysStackLo < irqStackLo);
507             return (void *)sysStackLo;
508         }
509 #endif
510 
511     default:
512         SDK_WARNING(0, "Bad arena id");
513     }
514 
515     return NULL;
516 }
517 
518 /*---------------------------------------------------------------------------*
519   Name:         OS_GetInitArenaLo
520 
521   Description:  Get the initial low boundary of the arena
522 
523   Arguments:    id : arena ID
524 
525   Returns:      the initial low boundary of the arena
526  *---------------------------------------------------------------------------*/
OS_GetInitArenaLo(OSArenaId id)527 void   *OS_GetInitArenaLo(OSArenaId id)
528 {
529     SDK_ASSERT(OSi_Initialized);
530     SDK_ARENAID_ASSERT(id);
531 
532     switch (id)
533     {
534 #ifdef SDK_ARM9
535     case OS_ARENA_MAIN:
536 
537 #ifdef SDK_NITRO
538         return (void *)OSi_MAIN_ARENA_LO_DEFAULT;
539 #else
540 		return (OS_IsRunOnTwl())?
541 			    (void *)OSi_MAIN_ARENA_LO_DEFAULT_forTWL:
542 				(void *)OSi_MAIN_ARENA_LO_DEFAULT_forNITRO;
543 #endif
544 
545     case OS_ARENA_MAINEX:
546 		if ( ! OSi_MainExArenaEnabled )
547 		{
548 			return (void*)0;
549 		}
550 		else
551 		{
552 			u32 size = OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK;
553 #ifdef SDK_NITRO
554 			return (void*)( (size == OS_CONSOLE_SIZE_4MB)? 0: OSi_MAINEX_ARENA_LO_DEFAULT );
555 #else
556 			return (OS_IsRunOnTwl())?
557 				(void*)( (size == OS_CONSOLE_SIZE_16MB)? 0: OSi_MAINEX_ARENA_LO_DEFAULT_forTWL ):
558 				(void*)( (size == OS_CONSOLE_SIZE_4MB)? 0: OSi_MAINEX_ARENA_LO_DEFAULT_forNITRO );
559 #endif
560 		}
561     case OS_ARENA_ITCM:
562         return (void *)OSi_ITCM_ARENA_LO_DEFAULT;
563 
564     case OS_ARENA_DTCM:
565         return (void *)OSi_DTCM_ARENA_LO_DEFAULT;
566 
567     case OS_ARENA_SHARED:
568         return (void *)HW_SHARED_ARENA_LO_DEFAULT;
569 
570     case OS_ARENA_WRAM_MAIN:
571         return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT;
572 #else
573     case OS_ARENA_MAIN_SUBPRIV:
574 #ifdef SDK_NITRO
575         return (void *)OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT;
576 #else
577 		return (OS_IsRunOnTwl())?
578 			    (void *)OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT_forTWL:
579 				(void *)OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT_forNITRO;
580 
581 #endif
582     case OS_ARENA_WRAM_SUB:
583         {
584             u32     wramSubLo = OSi_WRAM_SUB_ARENA_LO_DEFAULT;
585             if ((u32)HW_WRAM_END < (u32)wramSubLo)
586             {
587                 wramSubLo = (u32)HW_WRAM_END;
588             }
589             return (void *)wramSubLo;
590         }
591     case OS_ARENA_WRAM_SUBPRIV:
592         {
593             u32     privWramLo = OSi_WRAM_SUBPRIV_ARENA_LO_DEFAULT;
594             if ((u32)SDK_WRAM_ARENA_LO > (u32)privWramLo)
595             {
596                 privWramLo = (u32)SDK_WRAM_ARENA_LO;
597             }
598             return (void *)privWramLo;
599         }
600 #endif
601     default:
602         SDK_WARNING(0, "Bad arena id");
603     }
604 
605     return NULL;
606 }
607 
608 //================================================================================
609 //        SET ARENA INFO
610 //================================================================================
611 /*---------------------------------------------------------------------------*
612   Name:         OS_SetArenaHi
613 
614   Description:  Set the high boundary of the arena
615 
616   Arguments:    id    : arena ID
617                 newHi : New high boundary of the arena.
618 
619   Returns:      None.
620  *---------------------------------------------------------------------------*/
OS_SetArenaHi(OSArenaId id,void * newHi)621 void OS_SetArenaHi(OSArenaId id, void *newHi)
622 {
623     SDK_ASSERT(OSi_Initialized);
624     SDK_ARENAID_ASSERT(id);
625 
626     OSi_GetArenaInfo().hi[id] = newHi;
627 }
628 
629 /*---------------------------------------------------------------------------*
630   Name:         OS_GetArenaLo
631 
632   Description:  Set the low boundary of the arena
633 
634   Arguments:    id    : arena ID
635                 newLo : New low boundary of the arena.
636 
637   Returns:      None.
638  *---------------------------------------------------------------------------*/
OS_SetArenaLo(OSArenaId id,void * newLo)639 void OS_SetArenaLo(OSArenaId id, void *newLo)
640 {
641     SDK_ASSERT(OSi_Initialized);
642     SDK_ARENAID_ASSERT(id);
643 
644     OSi_GetArenaInfo().lo[id] = newLo;
645 }
646 
647 
648 //================================================================================
649 //        ALLOC
650 //================================================================================
651 /*---------------------------------------------------------------------------*
652   Name:         OS_AllocFromArenaLo
653 
654   Description:  Allocates /size/ bytes from the low boundary of the arena.
655                 Some additional memory will also be consumed from arena for
656                 the alignment.
657 
658   Arguments:    id    : arena ID
659                 size  : Size of object to be allocated
660                 align : Alignment of object and new arena boundary to
661                         be set (must be power of 2).
662 
663   Returns:      a pointer to the allocated space aligned with /align/ bytes
664                 boundaries. The new low boundary of the arena is also
665                 aligned with /align/ bytes boundaries.
666 
667                 NULL if cannot allocate.
668  *---------------------------------------------------------------------------*/
OS_AllocFromArenaLo(OSArenaId id,u32 size,u32 align)669 void   *OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align)
670 {
671     void   *ptr;
672     u8     *arenaLo;
673 
674     ptr = OS_GetArenaLo(id);
675     if (!ptr)
676     {
677         return NULL;
678     }
679 
680     arenaLo = ptr = (void *)OSi_ROUND(ptr, align);
681     arenaLo += size;
682     arenaLo = (u8 *)OSi_ROUND(arenaLo, align);
683 
684     if (arenaLo > OS_GetArenaHi(id))
685     {
686         return NULL;
687     }
688 
689     OS_SetArenaLo(id, arenaLo);
690 
691     return ptr;
692 }
693 
694 /*---------------------------------------------------------------------------*
695   Name:         OS_AllocFromArenaHi
696 
697   Description:  Allocates /size/ bytes from the high boundary of the arena.
698                 Some additional memory will also be consumed from arena for
699                 the alignment.
700 
701   Arguments:    id    : arena ID
702                 size  : Size of object to be allocated
703                 align : Alignment of object and new arena boundary to
704                         be set (must be power of 2).
705 
706   Returns:      a pointer to the allocated space aligned with /align/ bytes
707                 boundaries. The new high boundary of the arena is also
708                 aligned with /align/ bytes boundaries.
709 
710                 NULL if cannot allocate.
711  *---------------------------------------------------------------------------*/
OS_AllocFromArenaHi(OSArenaId id,u32 size,u32 align)712 void   *OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align)
713 {
714     void   *ptr;
715     u8     *arenaHi;
716 
717     arenaHi = OS_GetArenaHi(id);
718     if (!arenaHi)
719     {
720         return NULL;
721     }
722 
723     arenaHi = (u8 *)OSi_TRUNC(arenaHi, align);
724     arenaHi -= size;
725     arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align);
726 
727     if (arenaHi < OS_GetArenaLo(id))
728     {
729         return NULL;
730     }
731 
732     OS_SetArenaHi(id, arenaHi);
733 
734     return ptr;
735 }
736 
737 #ifdef SDK_ARM9
738 /*---------------------------------------------------------------------------*
739   Name:         OS_EnableMainExArena
740 
741   Description:  Set extended main memory arena enable.
742                 This function should be called before OS_Init().
743 
744   Arguments:    None
745 
746   Returns:      None
747  *---------------------------------------------------------------------------*/
OS_EnableMainExArena(void)748 void OS_EnableMainExArena(void)
749 {
750     SDK_ASSERT(!OSi_Initialized);
751 
752     OSi_MainExArenaEnabled = TRUE;
753 }
754 
755 /*---------------------------------------------------------------------------*
756   Name:         OS_DisableMainExArena
757 
758   Description:  Set extended main memory arena disable.
759                 This function should be called before OS_Init().
760 
761   Arguments:    None
762 
763   Returns:      None
764  *---------------------------------------------------------------------------*/
OS_DisableMainExArena(void)765 void OS_DisableMainExArena(void)
766 {
767     SDK_ASSERT(!OSi_Initialized);
768 
769     OSi_MainExArenaEnabled = FALSE;
770 }
771 #endif
772 
773 
774 #ifndef SDK_FINALROM
775 //================================================================================
776 //   DUMP ARENA INFO
777 //================================================================================
778 /*---------------------------------------------------------------------------*
779   Name:         OS_DumpArenaInfo
780 
781   Description:  display arena info
782 
783   Arguments:    id         : arena id
784                 isInfoLine : whether display explanation line or not.
785                               TRUE  ... display
786                               FALSE ... not display.
787 
788   Returns:      None
789  *---------------------------------------------------------------------------*/
OS_DumpArenaInfo(OSArenaId id,BOOL isInfoLine)790 void OS_DumpArenaInfo( OSArenaId id, BOOL isInfoLine )
791 {
792 	static const char* arenaName[] = {
793 		"MainRAM-Main", "MainRAM-Sub ", "MainRAM-EX  ",
794 		"ITCM        ",	"DTCM        ",	"SharedMemory",
795 		"WRAM-Main   ",	"WRAM-Sub    ",	"WRAM-Subpriv"
796 	};
797 
798 	SDK_ASSERT( 0<=id && id<=sizeof(arenaName)/sizeof(char*) );
799 
800 	if ( isInfoLine )
801 	{
802 		OS_Printf(" NAME         ID   LO addr   HI addr     size\n" );
803 	}
804 
805     OS_Printf("%12s   %1d  %8x  %8x  %8x\n",
806 			  arenaName[(int)id],
807 			  id,
808 			  OS_GetArenaLo(id),
809 			  OS_GetArenaHi(id),
810 			  (u32)OS_GetArenaHi(id) - (u32)OS_GetArenaLo(id) );
811 }
812 
813 /*---------------------------------------------------------------------------*
814   Name:         OS_DumpAllArenaInfo
815 
816   Description:  display each arena info
817 
818   Arguments:    None
819 
820   Returns:      None
821  *---------------------------------------------------------------------------*/
OS_DumpAllArenaInfo(void)822 void OS_DumpAllArenaInfo(void)
823 {
824 	static const OSArenaId id[] =
825 	{ OS_ARENA_MAIN, OS_ARENA_MAIN_SUBPRIV, OS_ARENA_MAINEX,
826 	  OS_ARENA_ITCM, OS_ARENA_DTCM, OS_ARENA_SHARED,
827 	  OS_ARENA_WRAM_MAIN, OS_ARENA_WRAM_SUB, OS_ARENA_WRAM_SUBPRIV };
828 
829 	int n;
830 	BOOL isInfoLine = TRUE;
831 
832 	//---- display all arena info
833 	for( n=0; n<sizeof(id)/sizeof(OSArenaId); n++ )
834 	{
835 		OS_DumpArenaInfo( id[n], isInfoLine );
836 		isInfoLine = FALSE;
837 	}
838 
839 	OS_Printf("\n");
840 }
841 #endif  // ifndef SDK_FINALROM
842 
843 /*---------------------------------------------------------------------------*
844   Name:         OS_GetArenaResource
845 
846   Description:  store resources of arena to specified pointer
847 
848   Arguments:    resource       pointer to store arena resources
849 
850   Returns:      TRUE  ... success (always return this now)
851                 FALSE ... fail
852  *---------------------------------------------------------------------------*/
OS_GetArenaResource(OSArenaResource * resource)853 BOOL    OS_GetArenaResource(OSArenaResource *resource)
854 {
855 	int n;
856     OSIntrMode enabled = OS_DisableInterrupts();
857 
858 	for( n=0; n<OS_ARENA_MAX; n++ )
859 	{
860 		resource->info.lo[n] = OSi_GetArenaInfo().lo[n];
861 		resource->info.hi[n] = OSi_GetArenaInfo().hi[n];
862 	}
863 
864     (void)OS_RestoreInterrupts(enabled);
865 	return TRUE;
866 }
867