mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ランチャーからアプリブートする際のメモリクリアリスト生成方法の変更
0x02000000から0x03000000のうち、 ROMをロードした場所、ARM9ブートコード、TWLシステム領域、アプリ間パラメータ(TWLアプリのみ)、4MB末及び8MB末に配置されるアプリROMヘッダ(NTRアプリのみ) 以外の場所はすべてクリアするようにした。 (TODO ついマジックナンバーでアドレスを入れてしまったので定数化) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@471 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
4b18b6b6c9
commit
b90147d53c
@ -35,18 +35,40 @@
|
||||
#endif
|
||||
|
||||
#define COPY_NUM_MAX (4*3)
|
||||
#define POST_CLEAR_NUM_MAX (4*2)
|
||||
#define POST_CLEAR_NUM_MAX (12 + 4*2)
|
||||
|
||||
// extern data-------------------------------------------------------
|
||||
|
||||
// function's prototype----------------------------------------------
|
||||
|
||||
static void BOOTi_ClearREG_RAM( void );
|
||||
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
|
||||
|
||||
// global variables--------------------------------------------------
|
||||
|
||||
// static variables--------------------------------------------------
|
||||
|
||||
//TODO 定数への置き換え
|
||||
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
0x2000400, 0x2280000,
|
||||
0x2380000, 0x23fee00,
|
||||
0x23ff000, 0x2800000,
|
||||
0x2e73000, 0x2ffc000,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
0x2000000, 0x2000100,
|
||||
0x2000400, 0x2280000,
|
||||
0x2380000, 0x23fee00,
|
||||
0x23ff000, 0x23ffe00,
|
||||
0x2400000, 0x27ffe00,
|
||||
0x2e73000, 0x2ffc000,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// const data--------------------------------------------------------
|
||||
|
||||
void BOOT_Init( void )
|
||||
@ -82,6 +104,7 @@ BOOL BOOT_WaitStart( void )
|
||||
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
||||
int list_count = PRE_CLEAR_NUM_MAX + 1;
|
||||
int l;
|
||||
u32 *post_clear_list;
|
||||
// メモリリストの設定
|
||||
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
@ -129,13 +152,21 @@ BOOL BOOT_WaitStart( void )
|
||||
mem_list[list_count++] = NULL;
|
||||
|
||||
// post clearリスト設定
|
||||
for( l=0; l<RELOCATE_INFO_NUM ; l++ )
|
||||
if ( dh->s.platform_code )
|
||||
{
|
||||
if( SYSMi_GetWork()->romRelocateInfo[l].post_clear_addr != NULL )
|
||||
{
|
||||
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].post_clear_addr;
|
||||
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].post_clear_length;
|
||||
}
|
||||
post_clear_list = twl_post_clear_list;
|
||||
BOOTi_CutAwayRegionList( post_clear_list, (u32)th->s.main_ltd_ram_address, (u32)th->s.main_ltd_ram_address + th->s.main_ltd_size);
|
||||
BOOTi_CutAwayRegionList( post_clear_list, (u32)th->s.sub_ltd_ram_address, (u32)th->s.sub_ltd_ram_address + th->s.sub_ltd_size);
|
||||
}else
|
||||
{
|
||||
post_clear_list = nitro_post_clear_list;
|
||||
}
|
||||
BOOTi_CutAwayRegionList( post_clear_list, (u32)dh->s.main_ram_address, (u32)dh->s.main_ram_address + dh->s.main_size);
|
||||
BOOTi_CutAwayRegionList( post_clear_list, (u32)dh->s.sub_ram_address, (u32)dh->s.sub_ram_address + dh->s.sub_size);
|
||||
for( l=0; post_clear_list[l]!=NULL ; l+=2 )
|
||||
{
|
||||
mem_list[list_count++] = post_clear_list[l];
|
||||
mem_list[list_count++] = post_clear_list[l+1] - post_clear_list[l];
|
||||
}
|
||||
mem_list[list_count] = NULL;
|
||||
|
||||
@ -191,3 +222,74 @@ static void BOOTi_ClearREG_RAM( void )
|
||||
(void)OS_ResetRequestIrqMask((u32)~0);
|
||||
(void)OS_ResetRequestIrqMaskEx((u32)~0);
|
||||
}
|
||||
|
||||
// 単純リスト要素削除
|
||||
static void BOOTi_DeliteElementFromList( u32 *list, u32 index )
|
||||
{
|
||||
int l;
|
||||
for( l=(int)index; list[l]!=NULL; l++ )
|
||||
{
|
||||
list[l] = list[l+1];
|
||||
}
|
||||
}
|
||||
|
||||
// 単純リスト要素追加
|
||||
static void BOOTi_InsertElementToList( u32 *list, u32 index, u32 value )
|
||||
{
|
||||
int l = (int)index;
|
||||
while(list[l]!=NULL)
|
||||
{
|
||||
l++;
|
||||
}
|
||||
list[l+1] = NULL;
|
||||
for( ; index<l; l-- )
|
||||
{
|
||||
list[l] = list[l-1];
|
||||
}
|
||||
list[l] = value;
|
||||
}
|
||||
|
||||
// {first1, last1, first2, last2, ... , NULL}という形式の領域リストから
|
||||
// {start, end}の領域を切り取ったリストを返す関数
|
||||
// 引数に与えるリストは要素が最大2追加されるため、十分な大きさが必要
|
||||
// また、領域リストの要素は、最後尾のNULL以外昇順に並んでいる必要がある。
|
||||
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end )
|
||||
{
|
||||
int l, m, n;
|
||||
if( end <= start ) return;
|
||||
for( l=0; regionlist[l]!=NULL; l++ )
|
||||
{
|
||||
if( regionlist[l] >= start )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
for( m=l; regionlist[m]!=NULL; m++ )
|
||||
{
|
||||
if( regionlist[m] > end )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
// この時点でregionlist[l]およびregionlist[m]は、start <= regionlist[l], end < regionlist[m]で、且つ最も小さな値
|
||||
|
||||
if( m % 2 == 1 )
|
||||
{
|
||||
BOOTi_InsertElementToList( regionlist, (u32)m, end );
|
||||
// endをリストに追加した場合、mは追加した要素を指すように
|
||||
}
|
||||
if( l % 2 == 1 )
|
||||
{
|
||||
BOOTi_InsertElementToList( regionlist, (u32)l, start );
|
||||
m++;
|
||||
// startをリストに追加した場合、mは1増える
|
||||
l++;
|
||||
// startをリストに追加した場合、lは追加した要素の次の要素を指すように
|
||||
}
|
||||
|
||||
// regionlist[l]からregionlist[m-1]までの要素を消す
|
||||
for( n=l; l<m; l++ )
|
||||
{
|
||||
BOOTi_DeliteElementFromList( regionlist, (u32)n );
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user