mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
メモリクリア処理の一部をアプリロード終了直後に行うよう変更
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2309 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
8cb7a48f8e
commit
9972a85c77
@ -87,10 +87,9 @@ static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + COPY_HEADER_NUM_MAX +
|
||||
|
||||
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
HW_MAIN_MEM_PARAMETER_BUF_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
||||
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
||||
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
|
||||
SYSM_OWN_ARM9_MMEM_ADDR_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
|
||||
SYSM_TWL_ARM7_LOAD_MMEM_END, OS_BOOT_A9CODE_BUF,
|
||||
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_TWL_ARM9_LTD_LOAD_MMEM,
|
||||
SYSM_TWL_ARM7_LTD_LOAD_MMEM_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
|
||||
HW_EXCP_VECTOR_MAIN, HW_EXCP_VECTOR_MAIN + 4, // ARM9例外ベクタ
|
||||
HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ
|
||||
NULL,
|
||||
@ -98,10 +97,9 @@ static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||
|
||||
static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
HW_MAIN_MEM_PARAMETER_BUF, SYSM_OWN_ARM7_MMEM_ADDR,
|
||||
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
||||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_DBG_NTR_SYSTEM_BUF,
|
||||
SYSM_OWN_ARM9_MMEM_ADDR_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
|
||||
SYSM_NTR_ARM7_LOAD_MMEM_END, OS_BOOT_A9CODE_BUF,
|
||||
SYSM_TWL_ARM9_LTD_LOAD_MMEM_END, SYSM_DBG_NTR_SYSTEM_BUF,
|
||||
SYSM_TWL_ARM7_LTD_LOAD_MMEM_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
|
||||
HW_EXCP_VECTOR_MAIN, HW_EXCP_VECTOR_MAIN + 4, // ARM9例外ベクタ
|
||||
HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ
|
||||
NULL,
|
||||
@ -276,6 +274,7 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget*
|
||||
{
|
||||
post_clear_list = nitro_post_clear_list;
|
||||
// NTR-IPLと同様にシステム領域直前をクリアしておく
|
||||
// [TODO:] すでにpost_clear_listに含まれている気がする。要確認
|
||||
mem_list[list_count++] = 0x02800000 - OS_BOOT_SYS_CLR_SIZE;
|
||||
mem_list[list_count++] = OS_BOOT_SYS_CLR_SIZE - HW_MAIN_MEM_SHARED_SIZE;
|
||||
}
|
||||
@ -376,7 +375,7 @@ static void BOOTi_ClearREG_RAM( void )
|
||||
}
|
||||
|
||||
// 単純リスト要素削除
|
||||
static void BOOTi_DeliteElementFromList( u32 *list, u32 index )
|
||||
static void BOOTi_DeleteElementFromList( u32 *list, u32 index )
|
||||
{
|
||||
int l;
|
||||
for( l=(int)index; list[l]!=NULL; l++ )
|
||||
@ -442,7 +441,7 @@ static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end )
|
||||
// regionlist[l]からregionlist[m-1]までの要素を消す
|
||||
for( n=l; l<m; l++ )
|
||||
{
|
||||
BOOTi_DeliteElementFromList( regionlist, (u32)n );
|
||||
BOOTi_DeleteElementFromList( regionlist, (u32)n );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -94,6 +94,9 @@ static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
||||
static void SYSMi_makeTitleIdList( void );
|
||||
static BOOL SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head );
|
||||
static void SYSMi_applyPatchToBandBrothers( void );
|
||||
static void SYSMi_ClearRomLoadSegment( ROM_Header_Short *rhs );
|
||||
static void SYSMi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
|
||||
static void SYSMi_CpuClearFast( void *dest, u32 size );
|
||||
|
||||
// global variable-------------------------------------------------------------
|
||||
// static variable-------------------------------------------------------------
|
||||
@ -836,8 +839,12 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
|
||||
{
|
||||
(void)FS_CloseFile(file);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// モジュール最終ロード先領域のうち、現在空いている場所をクリア
|
||||
// [TODO:]とりあえずベタ書き。余裕があればスレッド化する。
|
||||
SYSMi_ClearRomLoadSegment( (ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF );
|
||||
|
||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
||||
return;
|
||||
|
||||
@ -848,6 +855,86 @@ ERROR:
|
||||
}
|
||||
}
|
||||
|
||||
// モジュール最終ロード先領域のうち、現在空いている場所をクリア
|
||||
#define CLEAR_LIST_LENGTH (8 + 1 + RELOCATE_INFO_NUM * 2)
|
||||
static void SYSMi_ClearRomLoadSegment( ROM_Header_Short *rhs )
|
||||
{
|
||||
int l;
|
||||
u32 twl_clear_list[CLEAR_LIST_LENGTH] = {
|
||||
SYSM_TWL_ARM9_LOAD_MMEM, SYSM_TWL_ARM9_LOAD_MMEM_END,
|
||||
SYSM_TWL_ARM7_LOAD_MMEM, SYSM_TWL_ARM7_LOAD_MMEM_END,
|
||||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END,
|
||||
SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END,
|
||||
NULL,
|
||||
};
|
||||
u32 nitro_clear_list[CLEAR_LIST_LENGTH] = {
|
||||
SYSM_NTR_ARM9_LOAD_MMEM, SYSM_NTR_ARM9_LOAD_MMEM_END,
|
||||
SYSM_NTR_ARM7_LOAD_MMEM, SYSM_NTR_ARM7_LOAD_MMEM_END,
|
||||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END,
|
||||
SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END,
|
||||
NULL,
|
||||
};
|
||||
u32 *clear_list;
|
||||
u32 length[RELOCATE_INFO_NUM];
|
||||
u32 dataExistAddr[RELOCATE_INFO_NUM];
|
||||
|
||||
length [0] = rhs->main_size;
|
||||
dataExistAddr[0] = (u32)rhs->main_ram_address;
|
||||
|
||||
length [1] = rhs->sub_size;
|
||||
dataExistAddr[1] = (u32)rhs->sub_ram_address;
|
||||
|
||||
if( !(rhs->platform_code & PLATFORM_CODE_FLAG_TWL) )
|
||||
{
|
||||
clear_list = nitro_clear_list;
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_list = twl_clear_list;
|
||||
length [2] = rhs->main_ltd_size;
|
||||
dataExistAddr[2] = (u32)rhs->main_ltd_ram_address;
|
||||
|
||||
length [3] = rhs->sub_ltd_size;
|
||||
dataExistAddr[3] = (u32)rhs->sub_ltd_ram_address;
|
||||
}
|
||||
|
||||
for( l=0; l<RELOCATE_INFO_NUM ; l++ )
|
||||
{
|
||||
if( !(rhs->platform_code & PLATFORM_CODE_FLAG_TWL) && l==2 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
// 再配置情報があればそちらの情報を取得
|
||||
if( SYSMi_GetWork()->romRelocateInfo[l].src != NULL )
|
||||
{
|
||||
length[l] = SYSMi_GetWork()->romRelocateInfo[l].length;
|
||||
dataExistAddr[l] = SYSMi_GetWork()->romRelocateInfo[l].src;
|
||||
}
|
||||
|
||||
// 領域の切り取り
|
||||
SYSMi_CutAwayRegionList( clear_list, dataExistAddr[l], dataExistAddr[l] + length[l] );
|
||||
}
|
||||
|
||||
// リストに従って消す
|
||||
for( l=0; l<CLEAR_LIST_LENGTH; l+=2 )
|
||||
{
|
||||
if( clear_list[l] == NULL ) break;
|
||||
SYSMi_CpuClearFast( (void *)clear_list[l], clear_list[l+1] - clear_list[l] );
|
||||
OS_TPrintf("ClearRomLoadSegment: %x-%x\n", clear_list[l], clear_list[l+1] );
|
||||
}
|
||||
}
|
||||
|
||||
static void SYSMi_CpuClearFast( void *dest, u32 size )
|
||||
{
|
||||
u32 align_dest = MATH_ROUNDUP( (u32)dest, 4 );
|
||||
u32 align_offset = align_dest - (u32)dest;
|
||||
u32 align_size = MATH_ROUNDDOWN( size - align_offset, 4);
|
||||
u32 align_size_offset = size - align_offset - align_size;
|
||||
|
||||
MI_CpuClear8( dest, align_offset );
|
||||
MI_CpuClearFast( (void *)align_dest, align_size );
|
||||
MI_CpuClear8( (void *)(align_dest + align_size), align_size_offset );
|
||||
}
|
||||
|
||||
// 指定タイトルを別スレッドでロード開始する
|
||||
void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
||||
@ -1936,3 +2023,72 @@ void CheckDigest( void )
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// 単純リスト要素削除
|
||||
static void SYSMi_DeleteElementFromList( u32 *list, u32 index )
|
||||
{
|
||||
int l;
|
||||
for( l=(int)index; list[l]!=NULL; l++ )
|
||||
{
|
||||
list[l] = list[l+1];
|
||||
}
|
||||
}
|
||||
// 単純リスト要素追加
|
||||
static void SYSMi_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 SYSMi_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 )
|
||||
{
|
||||
SYSMi_InsertElementToList( regionlist, (u32)m, end );
|
||||
// endをリストに追加した場合、mは追加した要素を指すように
|
||||
}
|
||||
if( l % 2 == 1 )
|
||||
{
|
||||
SYSMi_InsertElementToList( regionlist, (u32)l, start );
|
||||
m++;
|
||||
// startをリストに追加した場合、mは1増える
|
||||
l++;
|
||||
// startをリストに追加した場合、lは追加した要素の次の要素を指すように
|
||||
}
|
||||
|
||||
// regionlist[l]からregionlist[m-1]までの要素を消す
|
||||
for( n=l; l<m; l++ )
|
||||
{
|
||||
SYSMi_DeleteElementFromList( regionlist, (u32)n );
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user