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