mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
fix protection region.
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@46 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
parent
83f32093bc
commit
86a9a4fd0e
@ -428,22 +428,22 @@ static asm void init_cp15(void)
|
||||
mcr p15, 0, r0, c7, c10, 4
|
||||
|
||||
/*
|
||||
; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 0: IO_VRAM: Base = 0x04000000, Size = 64MB, I:NC NB / D:NC NB, I:RW / D:RW
|
||||
; Region 1Rel: MAIN_MEM: Base = 0x02000000, Size = 16MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW
|
||||
; Region 1Dbg: MAIN_MEM: Base = 0x02000000, Size = 16MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
|
||||
; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 0: IO_VRAM: Base = 0x04000000, Size = 64MB, I:NC NB / D:NC NB, I:RW / D:RW
|
||||
; Region 1Rel: MAIN_MEM+WRAM: Base = 0x02000000, Size = 32MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW
|
||||
; Region 1Dbg: MAIN_MEM+WRAM: Base = 0x02000000, Size = 32MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
|
||||
; (* Size will be arranged in OS_InitArena(). )
|
||||
; Region 2Rel: SOUND_DATA: Base = 0x02380000, Size = 512KB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 2D4M: SOUND_DATA: Base = 0x02300000, Size = 1MB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 2D8M: SOUND_DATA: Base = 0x02600000, Size = 2MB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 3: MAIN_MEM_HI: Base = 0x08000000, Size = 256MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
|
||||
; Region 3: CARTRIDGE: Base = 0x08000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW
|
||||
; Region 4: DTCM: Base = SOUND_DATA, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW
|
||||
; Region 5: ITCM: Base = 0x01000000, Size = 16MB, I:NC NB / D:NC NB, I:RW / D:RW
|
||||
; Region 2Rel: SOUND_DATA: Base = 0x02380000, Size = 512KB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 2D4M: SOUND_DATA: Base = 0x02300000, Size = 1MB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 2D8M: SOUND_DATA: Base = 0x02600000, Size = 2MB, I:NC NB / D:NC NB, I:NA / D:NA
|
||||
; Region 3: MAIN_MEM_HI: Base = 0x08000000, Size = 256MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
|
||||
; Region 3: CARTRIDGE: Base = 0x08000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW
|
||||
; Region 4: DTCM: Base = SOUND_DATA, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW
|
||||
; Region 5: ITCM: Base = 0x01000000, Size = 16MB, I:NC NB / D:NC NB, I:RW / D:RW
|
||||
|
||||
; Region 6: BIOS: Base = 0xffff0000, Size = 32KB, I:Cach NB / D:Cach NB, I:RO / D:RO
|
||||
; Region 7: SHARE_WORK: Base = 0x027ff000, Size = 4KB, I:NC NB / D:NC NB, I:NA / D:RW
|
||||
;(Region 7: DBG_RESERVE: Base = 0x02700000, Size = 1MB, I:NC NB / D:NC NB, I:RW / D:RW)
|
||||
; Region 6: BIOS: Base = 0xffff0000, Size = 32KB, I:Cach NB / D:Cach NB, I:RO / D:RO
|
||||
; Region 7: SHARE_WORK: Base = 0x027ff000, Size = 4KB, I:NC NB / D:NC NB, I:NA / D:RW
|
||||
;(Region 7: DBG_RESERVE: Base = 0x02700000, Size = 1MB, I:NC NB / D:NC NB, I:RW / D:RW)
|
||||
*/
|
||||
#define SET_PROTECTION_A( id, adr, siz ) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE)
|
||||
#define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0
|
||||
@ -462,8 +462,8 @@ static asm void init_cp15(void)
|
||||
SET_PROTECTION_B( c0, HW_IOREG, 64MB )
|
||||
|
||||
//---- メインメモリ
|
||||
SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 16MB )
|
||||
SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 16MB )
|
||||
SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 32MB )
|
||||
SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 32MB )
|
||||
|
||||
//---- サウンドデータ領域
|
||||
#if HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x1000
|
||||
|
||||
@ -16,8 +16,6 @@
|
||||
|
||||
#include <twl/mi.h>
|
||||
|
||||
static BOOL isArbitrated = FALSE;
|
||||
|
||||
static u32 intervalTable[] =
|
||||
{
|
||||
1, 1, 1, 1,
|
||||
@ -42,8 +40,6 @@ void MIi_SetExDmaArbiter( MIExDmaArbitration arb, MIExDmaYieldCycles yld )
|
||||
|
||||
reg_MI_DMAGBL = (u32)(arb | yld);
|
||||
|
||||
isArbitrated = TRUE;
|
||||
|
||||
(void)OS_RestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
|
||||
752
build/libraries/os/common/os_arena.c
Normal file
752
build/libraries/os/common/os_arena.c
Normal file
@ -0,0 +1,752 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: NitroSDK - OS
|
||||
File: os_arena.c
|
||||
|
||||
Copyright 2003-2006 Nintendo. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Log: os_arena.c,v $
|
||||
Revision 1.44 2006/01/18 05:46:04 okubata_ryoma
|
||||
do-indentの修正
|
||||
|
||||
Revision 1.43 2006/01/18 02:11:30 kitase_hirotake
|
||||
do-indent
|
||||
|
||||
Revision 1.42 2005/10/18 10:42:36 yada
|
||||
modified about getting arena HI of PREV_WRAM in ARM7
|
||||
|
||||
Revision 1.41 2005/09/06 04:57:41 yada
|
||||
fix arena default hi address on DTCM
|
||||
|
||||
Revision 1.40 2005/08/26 11:49:31 yada
|
||||
ARENALO is considered for DTCM, ITCM, MAINEX autoload
|
||||
|
||||
Revision 1.39 2005/05/25 04:03:05 terui
|
||||
MB 子機の場合でもメインメモリを8MBに設定できるように修正
|
||||
|
||||
Revision 1.38 2005/04/14 06:46:13 yasu
|
||||
Multiboot 子機の場合、使用可能メモリを 4MB に制限するようにした
|
||||
|
||||
Revision 1.37 2005/04/13 13:00:10 terui
|
||||
OS_InitArenaEx関数内で、4M設定時にARM7専用リージョンの位置を0x027e0000 から 0x023e0000に変更するように修正。
|
||||
|
||||
Revision 1.36 2005/02/28 09:57:43 seiki_masashi
|
||||
fix a debug message.
|
||||
|
||||
Revision 1.35 2005/02/28 05:26:28 yosizaki
|
||||
do-indent.
|
||||
|
||||
Revision 1.34 2004/12/21 11:24:27 yada
|
||||
add OS_EnableMainExArena() / OS_DisableMainExArena()
|
||||
|
||||
Revision 1.33 2004/11/02 11:58:22 yada
|
||||
fix a little
|
||||
|
||||
Revision 1.32 2004/10/04 06:16:53 yada
|
||||
protection region for MainRAM is set to 4MB if specified
|
||||
|
||||
Revision 1.31 2004/08/31 01:02:51 yada
|
||||
add functions to get/set initial setting in specified arena
|
||||
|
||||
Revision 1.30 2004/08/18 02:45:44 yada
|
||||
change sub-processor private arena of mainRAM
|
||||
|
||||
Revision 1.29 2004/07/29 07:25:56 yada
|
||||
remove OS_Printf() in OS_GetArenaLo()
|
||||
|
||||
Revision 1.28 2004/07/20 11:41:23 yada
|
||||
in case sysStack=0 (means maximum size), DTCM arena lo
|
||||
was set to HW_DTCM. fix to SDK_AUTOLOAD_DTCM_BSS_END.
|
||||
|
||||
Revision 1.27 2004/07/12 12:25:21 yasu
|
||||
Fix arena setting
|
||||
|
||||
Revision 1.26 2004/07/10 04:07:56 yasu
|
||||
Add short comment
|
||||
|
||||
Revision 1.25 2004/07/08 02:22:21 yada
|
||||
add OS_InitArenaEx(), setting for extended mainRam arena
|
||||
|
||||
Revision 1.24 2004/07/01 09:40:31 yasu
|
||||
add TARGET_ROM
|
||||
|
||||
Revision 1.23 2004/05/27 04:40:25 yada
|
||||
change setting arena rule for ARM7
|
||||
|
||||
Revision 1.22 2004/04/14 00:07:33 yada
|
||||
add checkcode in allocation memory from arena
|
||||
|
||||
Revision 1.21 2004/02/20 12:23:47 yada
|
||||
初期化バグ修正
|
||||
|
||||
Revision 1.20 2004/02/19 08:41:41 yada
|
||||
ARM7 と ARM9 の初期化を分けた
|
||||
|
||||
Revision 1.19 2004/02/16 09:39:46 yada
|
||||
Sysスタック修正
|
||||
|
||||
Revision 1.18 2004/02/14 08:23:12 yasu
|
||||
comment out TCM arena setting code on ARM7 due to pass nightly build
|
||||
|
||||
Revision 1.17 2004/02/14 07:05:47 yasu
|
||||
fix indent level
|
||||
|
||||
Revision 1.16 2004/02/13 10:38:26 yada
|
||||
ARENAを6個から9個に
|
||||
|
||||
Revision 1.15 2004/02/13 04:05:36 yada
|
||||
ARM9とAMR7 の場合わけ考慮
|
||||
|
||||
Revision 1.14 2004/02/05 07:09:02 yasu
|
||||
change SDK prefix iris -> nitro
|
||||
|
||||
Revision 1.13 2004/01/18 01:25:40 yada
|
||||
インデント等の整形のみ
|
||||
|
||||
Revision 1.12 2004/01/16 11:47:20 yada
|
||||
arena情報の位置を動かしたことによる修正
|
||||
|
||||
Revision 1.11 2004/01/16 08:10:03 yada
|
||||
DTCMアリーナ設定のASSERT修正
|
||||
|
||||
Revision 1.10 2004/01/16 07:25:26 yada
|
||||
arena の initialized フラグ位置修正
|
||||
|
||||
Revision 1.9 2004/01/16 04:07:39 yada
|
||||
idle Thread のスタックを lcf定義から取るように変更
|
||||
|
||||
Revision 1.8 2004/01/15 12:13:55 yada
|
||||
SystemWork にアリーナ構造体を取るようにした
|
||||
|
||||
Revision 1.7 2004/01/15 10:07:25 yasu
|
||||
Use SDK_MAIN_ARENA_LO from LCF to resolve arena region
|
||||
|
||||
Revision 1.6 2004/01/07 02:52:04 yada
|
||||
小変更
|
||||
|
||||
Revision 1.5 2004/01/07 01:42:40 yada
|
||||
arena初期化部分の変更
|
||||
|
||||
Revision 1.4 2004/01/05 04:28:24 yada
|
||||
各アリーナの仮初期化を入れた
|
||||
|
||||
Revision 1.3 2003/12/26 08:21:13 yada
|
||||
Assert 中の不具合修正
|
||||
|
||||
Revision 1.2 2003/12/26 08:11:35 yada
|
||||
IDの型を int -> OSArenaId に
|
||||
|
||||
Revision 1.1 2003/12/26 06:42:33 yada
|
||||
初版
|
||||
|
||||
|
||||
$NoKeywords: $
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <nitro.h>
|
||||
|
||||
#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1))
|
||||
#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1))
|
||||
|
||||
#define OS_ERR_GETARENAHI_INIT "OS_GetArenaHi: init in advance"
|
||||
#define OS_ERR_GETARENAHI_INVALID "OS_GetArenaHi: invalid arena (hi<lo)"
|
||||
#define OS_ERR_GETARENALO_INIT "OS_GetArenaLo: init in advance"
|
||||
#define OS_ERR_GETARENALO_INVALID "OS_GetArenaLo: invalid arena (hi<lo)"
|
||||
|
||||
#define SDK_ARENAID_ASSERT( id ) SDK_ASSERT( (u32)id < OS_ARENA_MAX )
|
||||
|
||||
|
||||
//---- Arena infomation Address ( allocated in Shared Memory )
|
||||
#define OSi_GetArenaInfo() (*(OSArenaInfo*)HW_ARENA_INFO_BUF)
|
||||
|
||||
|
||||
//---- default Main Arena Address (for arm9)
|
||||
extern void SDK_MAIN_ARENA_LO(void);
|
||||
#define OSi_MAIN_ARENA_LO_DEFAULT ((u32)SDK_MAIN_ARENA_LO) // Defined by LCF
|
||||
#define OSi_MAIN_ARENA_HI_DEFAULT HW_MAIN_MEM_MAIN_END
|
||||
|
||||
//---- default Main Arena Address (for arm7)
|
||||
#ifdef SDK_ARM7
|
||||
extern void SDK_SUBPRIV_ARENA_LO(void);
|
||||
#define OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT ((u32)SDK_SUBPRIV_ARENA_LO) // Defined by LCF
|
||||
#define OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT HW_MAIN_MEM_SUB_END
|
||||
#endif
|
||||
|
||||
//---- default Extended Main Arena Address (for arm9)
|
||||
#ifdef SDK_ARM9
|
||||
extern void SDK_SECTION_ARENA_EX_START(void);
|
||||
#define OSi_MAINEX_ARENA_LO_DEFAULT ((u32)SDK_SECTION_ARENA_EX_START) // Defined by LCF
|
||||
#define OSi_MAINEX_ARENA_HI_DEFAULT HW_MAIN_MEM_DEBUGGER
|
||||
#endif
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
//---- default DTCM Arena Address (for arm9)
|
||||
extern void SDK_SECTION_ARENA_DTCM_START(void);
|
||||
#define OSi_DTCM_ARENA_LO_DEFAULT ((u32)SDK_SECTION_ARENA_DTCM_START) // Defined by LCF
|
||||
|
||||
//---- default ITCM Arena Address (for arm9)
|
||||
extern void SDK_SECTION_ARENA_ITCM_START(void);
|
||||
#define OSi_ITCM_ARENA_LO_DEFAULT ((u32)SDK_SECTION_ARENA_ITCM_START) // Defined by LCF
|
||||
#endif
|
||||
|
||||
//---- default common WorkRAM (for Main-Proc) Arena Address
|
||||
#define OSi_WRAM_MAIN_ARENA_LO_DEFAULT HW_WRAM
|
||||
#define OSi_WRAM_MAIN_ARENA_HI_DEFAULT HW_WRAM
|
||||
|
||||
//---- default common WorkRAM (for Sub-Proc) Arena Address
|
||||
#ifdef SDK_ARM7
|
||||
extern void SDK_WRAM_ARENA_LO(void);
|
||||
#define OSi_WRAM_SUB_ARENA_LO_DEFAULT ((u32)SDK_WRAM_ARENA_LO) // Defined by LCF
|
||||
#define OSi_WRAM_SUB_ARENA_HI_DEFAULT HW_WRAM_END
|
||||
#endif
|
||||
|
||||
//---- default Sub-Proc Private WorkRAM Arena Address (for from ARM9)
|
||||
#ifdef SDK_ARM7
|
||||
#define OSi_WRAM_SUBPRIV_ARENA_LO_DEFAULT HW_PRV_WRAM
|
||||
#define OSi_WRAM_SUBPRIV_ARENA_HI_DEFAULT HW_PRV_WRAM_END
|
||||
#endif
|
||||
|
||||
//---- stack size indication from LCF
|
||||
extern void SDK_SYS_STACKSIZE(void);
|
||||
#define OSi_SYS_STACKSIZE ((int)SDK_SYS_STACKSIZE)
|
||||
extern void SDK_IRQ_STACKSIZE(void);
|
||||
#define OSi_IRQ_STACKSIZE ((int)SDK_IRQ_STACKSIZE)
|
||||
|
||||
static BOOL OSi_Initialized = FALSE;
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
#ifdef SDK_4M
|
||||
BOOL OSi_MainExArenaEnabled = FALSE;
|
||||
#else
|
||||
BOOL OSi_MainExArenaEnabled = TRUE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//================================================================================
|
||||
// INIT
|
||||
//================================================================================
|
||||
#ifdef SDK_ARM9
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_InitArena
|
||||
|
||||
Description: Initialize Arena
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_InitArena(void)
|
||||
{
|
||||
//---- check if arena initialized
|
||||
if (OSi_Initialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
OSi_Initialized = TRUE;
|
||||
|
||||
//---------------- set Arena Lo/Hi addresses
|
||||
//---- MainRam, Main-Processor private
|
||||
OS_InitArenaHiAndLo(OS_ARENA_MAIN);
|
||||
|
||||
//---- Extended MainRam (temporary. set in OS_InitArenaEx later.)
|
||||
OS_SetArenaLo(OS_ARENA_MAINEX, (void *)0);
|
||||
OS_SetArenaHi(OS_ARENA_MAINEX, (void *)0);
|
||||
|
||||
//---- ITCM
|
||||
OS_InitArenaHiAndLo(OS_ARENA_ITCM);
|
||||
|
||||
//---- DTCM
|
||||
OS_InitArenaHiAndLo(OS_ARENA_DTCM);
|
||||
|
||||
//---- set Shared Memory Arena
|
||||
OS_InitArenaHiAndLo(OS_ARENA_SHARED);
|
||||
|
||||
//---- Work RAM, for Main-Processor
|
||||
OS_InitArenaHiAndLo(OS_ARENA_WRAM_MAIN);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SDK_ARM7
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_InitArena
|
||||
|
||||
Description: Initialize WRAM_SUBPRIV_ARENA
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_InitArena(void)
|
||||
{
|
||||
//---- check if arena initialized
|
||||
if (OSi_Initialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
OSi_Initialized = TRUE;
|
||||
|
||||
//---------------- set Arena Lo/Hi addresses
|
||||
//---- MainRam, Sub-Processor private
|
||||
OS_InitArenaHiAndLo(OS_ARENA_MAIN_SUBPRIV);
|
||||
|
||||
//---- Work RAM, for Sub-Processor
|
||||
OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUB);
|
||||
|
||||
//---- Sub-Processor private Work RAM
|
||||
OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUBPRIV);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_InitArenaEx
|
||||
|
||||
Description: Initialize extended MainRam Arena
|
||||
OS_InitArena() must be called before
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_InitArenaEx(void)
|
||||
{
|
||||
OS_InitArenaHiAndLo(OS_ARENA_MAINEX);
|
||||
|
||||
/*
|
||||
* MB 子機の場合でも、デバッグ目的でメインメモリを 8M に拡張して
|
||||
* メインメモリ上の拡張アリーナを使用できるように修正。
|
||||
* MB 子機において、オートロードが実行される前の段階で
|
||||
* 重要な情報が格納されている 0x023fe000周辺のメモリ領域から本当に必要な
|
||||
* 情報を抽出しつつ 0x027ffa80 周辺に退避するという対策が入ったため
|
||||
* 0x023fe000 周辺を保護する必要がなくなった事を受けての修正です。
|
||||
*/
|
||||
if (!OSi_MainExArenaEnabled ||
|
||||
((OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB))
|
||||
{
|
||||
//---- no Extended MainRam arena
|
||||
// OS_SetProtectionRegion(1, HW_MAIN_MEM_MAIN, 4MB);
|
||||
//---- Move exclusive area for ARM7
|
||||
#if HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x1000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 4KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x2000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 8KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x4000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 16KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x8000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 32KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x10000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 64KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x20000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 128KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x40000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 256KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x80000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 512KB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x100000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 1MB);
|
||||
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x200000
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 2MB);
|
||||
#else
|
||||
#pragma message(ERROR: Size unmatch HW_MAIN_MEM_MAIN_END)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif // ifdef SDK_ARM9
|
||||
|
||||
//================================================================================
|
||||
// GET ARENA INFO
|
||||
//================================================================================
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_GetArenaInfo
|
||||
|
||||
Description: Get the pointer of Arena structure
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: the pointer of Arena structure
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_GetArenaInfo(void)
|
||||
{
|
||||
return (void *)&OSi_GetArenaInfo();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_GetArenaHi
|
||||
|
||||
Description: Get the high boundary of the arena
|
||||
|
||||
Arguments: id : arena ID
|
||||
|
||||
Returns: the high boundary of the arena
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_GetArenaHi(OSArenaId id)
|
||||
{
|
||||
SDK_ASSERT(OSi_Initialized);
|
||||
SDK_ARENAID_ASSERT(id);
|
||||
SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] != 0xffffffff, OS_ERR_GETARENALO_INIT);
|
||||
SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] <= (u32)OSi_GetArenaInfo().hi[id],
|
||||
OS_ERR_GETARENALO_INVALID);
|
||||
|
||||
return OSi_GetArenaInfo().hi[id];
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_GetArenaLo
|
||||
|
||||
Description: Get the low boundary of the arena
|
||||
|
||||
Arguments: id : arena ID
|
||||
|
||||
Returns: the low boundary of the arena
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_GetArenaLo(OSArenaId id)
|
||||
{
|
||||
SDK_ASSERT(OSi_Initialized);
|
||||
SDK_ARENAID_ASSERT(id);
|
||||
SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] != 0xffffffff, OS_ERR_GETARENALO_INIT);
|
||||
SDK_ASSERTMSG((u32)OSi_GetArenaInfo().lo[id] <= (u32)OSi_GetArenaInfo().hi[id],
|
||||
OS_ERR_GETARENALO_INVALID);
|
||||
|
||||
return OSi_GetArenaInfo().lo[id];
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_GetInitArenaHi
|
||||
|
||||
Description: Get the initial high boundary of the arena
|
||||
|
||||
Arguments: id : arena ID
|
||||
|
||||
Returns: the initial high boundary of the arena
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_GetInitArenaHi(OSArenaId id)
|
||||
{
|
||||
SDK_ASSERT(OSi_Initialized);
|
||||
SDK_ARENAID_ASSERT(id);
|
||||
|
||||
switch (id)
|
||||
{
|
||||
#ifdef SDK_ARM9
|
||||
case OS_ARENA_MAIN:
|
||||
return (void *)OSi_MAIN_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_MAINEX:
|
||||
if (!OSi_MainExArenaEnabled ||
|
||||
((OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB))
|
||||
{
|
||||
return (void *)0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (void *)OSi_MAINEX_ARENA_HI_DEFAULT;
|
||||
}
|
||||
case OS_ARENA_ITCM:
|
||||
return (void *)HW_ITCM_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_DTCM:
|
||||
{
|
||||
u32 irqStackLo;
|
||||
u32 sysStackLo;
|
||||
|
||||
irqStackLo = (u32)HW_DTCM_IRQ_STACK_END - OSi_IRQ_STACKSIZE;
|
||||
|
||||
if (OSi_SYS_STACKSIZE == 0) // maximum SysStack in DTCM
|
||||
{
|
||||
sysStackLo = HW_DTCM;
|
||||
if (sysStackLo < OSi_DTCM_ARENA_LO_DEFAULT)
|
||||
{
|
||||
sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT;
|
||||
}
|
||||
}
|
||||
else if (OSi_SYS_STACKSIZE < 0)
|
||||
{
|
||||
sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT - OSi_SYS_STACKSIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sysStackLo = irqStackLo - OSi_SYS_STACKSIZE;
|
||||
}
|
||||
SDK_ASSERT((u32)OSi_DTCM_ARENA_LO_DEFAULT <= sysStackLo && sysStackLo < irqStackLo);
|
||||
return (void *)sysStackLo;
|
||||
}
|
||||
case OS_ARENA_SHARED:
|
||||
return (void *)HW_SHARED_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_WRAM_MAIN:
|
||||
return (void *)(void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT;
|
||||
#else
|
||||
case OS_ARENA_MAIN_SUBPRIV:
|
||||
return (void *)OSi_MAIN_SUBPRIV_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_WRAM_SUB:
|
||||
return (void *)OSi_WRAM_SUB_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_WRAM_SUBPRIV:
|
||||
{
|
||||
u32 irqStackLo;
|
||||
u32 sysStackLo;
|
||||
|
||||
// ---- Sub-Processor private Work RAM
|
||||
// decide sysStackLo
|
||||
irqStackLo = (u32)HW_PRV_WRAM_IRQ_STACK_END - OSi_IRQ_STACKSIZE;
|
||||
sysStackLo = (u32)HW_PRV_WRAM;
|
||||
|
||||
//---- if program area is larger than the size of common wram
|
||||
if ((u32)SDK_WRAM_ARENA_LO > (u32)HW_PRV_WRAM)
|
||||
{
|
||||
sysStackLo = (u32)SDK_WRAM_ARENA_LO;
|
||||
}
|
||||
|
||||
if (OSi_SYS_STACKSIZE == 0) // maximum SysStack in SURPRIV-WRAM
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
else if (OSi_SYS_STACKSIZE < 0)
|
||||
{
|
||||
sysStackLo -= OSi_SYS_STACKSIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sysStackLo = irqStackLo - OSi_SYS_STACKSIZE;
|
||||
}
|
||||
SDK_ASSERT((u32)HW_PRV_WRAM <= sysStackLo && sysStackLo < irqStackLo);
|
||||
return (void *)sysStackLo;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
SDK_WARNING(0, "Bad arena id");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_GetInitArenaLo
|
||||
|
||||
Description: Get the initial low boundary of the arena
|
||||
|
||||
Arguments: id : arena ID
|
||||
|
||||
Returns: the initial low boundary of the arena
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_GetInitArenaLo(OSArenaId id)
|
||||
{
|
||||
SDK_ASSERT(OSi_Initialized);
|
||||
SDK_ARENAID_ASSERT(id);
|
||||
|
||||
switch (id)
|
||||
{
|
||||
#ifdef SDK_ARM9
|
||||
case OS_ARENA_MAIN:
|
||||
return (void *)OSi_MAIN_ARENA_LO_DEFAULT;
|
||||
case OS_ARENA_MAINEX:
|
||||
if (!OSi_MainExArenaEnabled ||
|
||||
((OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB))
|
||||
{
|
||||
return (void *)0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (void *)OSi_MAINEX_ARENA_LO_DEFAULT;
|
||||
}
|
||||
case OS_ARENA_ITCM:
|
||||
return (void *)OSi_ITCM_ARENA_LO_DEFAULT;
|
||||
case OS_ARENA_DTCM:
|
||||
return (void *)OSi_DTCM_ARENA_LO_DEFAULT;
|
||||
case OS_ARENA_SHARED:
|
||||
return (void *)HW_SHARED_ARENA_LO_DEFAULT;
|
||||
case OS_ARENA_WRAM_MAIN:
|
||||
return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT;
|
||||
#else
|
||||
case OS_ARENA_MAIN_SUBPRIV:
|
||||
return (void *)OSi_MAIN_SUBPRIV_ARENA_LO_DEFAULT;
|
||||
case OS_ARENA_WRAM_SUB:
|
||||
{
|
||||
u32 wramSubLo = OSi_WRAM_SUB_ARENA_LO_DEFAULT;
|
||||
if ((u32)HW_WRAM_END < (u32)wramSubLo)
|
||||
{
|
||||
wramSubLo = (u32)HW_WRAM_END;
|
||||
}
|
||||
return (void *)wramSubLo;
|
||||
}
|
||||
case OS_ARENA_WRAM_SUBPRIV:
|
||||
{
|
||||
u32 privWramLo = OSi_WRAM_SUBPRIV_ARENA_LO_DEFAULT;
|
||||
if ((u32)SDK_WRAM_ARENA_LO > (u32)privWramLo)
|
||||
{
|
||||
privWramLo = (u32)SDK_WRAM_ARENA_LO;
|
||||
}
|
||||
return (void *)privWramLo;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
SDK_WARNING(0, "Bad arena id");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
// SET ARENA INFO
|
||||
//================================================================================
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_SetArenaHi
|
||||
|
||||
Description: Set the high boundary of the arena
|
||||
|
||||
Arguments: id : arena ID
|
||||
newHi : New high boundary of the arena.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_SetArenaHi(OSArenaId id, void *newHi)
|
||||
{
|
||||
SDK_ASSERT(OSi_Initialized);
|
||||
SDK_ARENAID_ASSERT(id);
|
||||
|
||||
OSi_GetArenaInfo().hi[id] = newHi;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_GetArenaLo
|
||||
|
||||
Description: Set the low boundary of the arena
|
||||
|
||||
Arguments: id : arena ID
|
||||
newLo : New low boundary of the arena.
|
||||
|
||||
Returns: None.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_SetArenaLo(OSArenaId id, void *newLo)
|
||||
{
|
||||
SDK_ASSERT(OSi_Initialized);
|
||||
SDK_ARENAID_ASSERT(id);
|
||||
|
||||
OSi_GetArenaInfo().lo[id] = newLo;
|
||||
}
|
||||
|
||||
|
||||
//================================================================================
|
||||
// ALLOC
|
||||
//================================================================================
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_AllocFromArenaLo
|
||||
|
||||
Description: Allocates /size/ bytes from the low boundary of the arena.
|
||||
Some additional memory will also be consumed from arena for
|
||||
the alignment.
|
||||
|
||||
Arguments: id : arena ID
|
||||
size : Size of object to be allocated
|
||||
align : Alignment of object and new arena boundary to
|
||||
be set (must be power of 2).
|
||||
|
||||
Returns: a pointer to the allocated space aligned with /align/ bytes
|
||||
boundaries. The new low boundary of the arena is also
|
||||
aligned with /align/ bytes boundaries.
|
||||
|
||||
NULL if cannot allocate.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align)
|
||||
{
|
||||
void *ptr;
|
||||
u8 *arenaLo;
|
||||
|
||||
ptr = OS_GetArenaLo(id);
|
||||
if (!ptr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arenaLo = ptr = (void *)OSi_ROUND(ptr, align);
|
||||
arenaLo += size;
|
||||
arenaLo = (u8 *)OSi_ROUND(arenaLo, align);
|
||||
|
||||
if (arenaLo > OS_GetArenaHi(id))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
OS_SetArenaLo(id, arenaLo);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_AllocFromArenaHi
|
||||
|
||||
Description: Allocates /size/ bytes from the high boundary of the arena.
|
||||
Some additional memory will also be consumed from arena for
|
||||
the alignment.
|
||||
|
||||
Arguments: id : arena ID
|
||||
size : Size of object to be allocated
|
||||
align : Alignment of object and new arena boundary to
|
||||
be set (must be power of 2).
|
||||
|
||||
Returns: a pointer to the allocated space aligned with /align/ bytes
|
||||
boundaries. The new high boundary of the arena is also
|
||||
aligned with /align/ bytes boundaries.
|
||||
|
||||
NULL if cannot allocate.
|
||||
*---------------------------------------------------------------------------*/
|
||||
void *OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align)
|
||||
{
|
||||
void *ptr;
|
||||
u8 *arenaHi;
|
||||
|
||||
arenaHi = OS_GetArenaHi(id);
|
||||
if (!arenaHi)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arenaHi = (u8 *)OSi_TRUNC(arenaHi, align);
|
||||
arenaHi -= size;
|
||||
arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align);
|
||||
|
||||
if (arenaHi < OS_GetArenaLo(id))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
OS_SetArenaHi(id, arenaHi);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_EnableMainExArena
|
||||
|
||||
Description: Set extended main memory arena enable.
|
||||
This function should be called before OS_Init().
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_EnableMainExArena(void)
|
||||
{
|
||||
SDK_ASSERT(!OSi_Initialized);
|
||||
|
||||
OSi_MainExArenaEnabled = TRUE;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: OS_DisableMainExArena
|
||||
|
||||
Description: Set extended main memory arena disable.
|
||||
This function should be called before OS_Init().
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
void OS_DisableMainExArena(void)
|
||||
{
|
||||
SDK_ASSERT(!OSi_Initialized);
|
||||
|
||||
OSi_MainExArenaEnabled = FALSE;
|
||||
}
|
||||
#endif
|
||||
@ -16,7 +16,7 @@
|
||||
#ifndef TWL_MI_EXDMA_H_
|
||||
#define TWL_MI_EXDMA_H_
|
||||
|
||||
#include <nitro/misc.h>
|
||||
#include <twl/misc.h>
|
||||
#include <twl/types.h>
|
||||
#include <twl/memorymap.h>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user