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] =
|
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||||
{
|
{
|
||||||
HW_MAIN_MEM_PARAMETER_BUF_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
SYSM_TWL_ARM7_LOAD_MMEM_END, OS_BOOT_A9CODE_BUF,
|
||||||
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_TWL_ARM9_LTD_LOAD_MMEM,
|
||||||
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
|
SYSM_TWL_ARM7_LTD_LOAD_MMEM_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
|
||||||
SYSM_OWN_ARM9_MMEM_ADDR_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_MAIN, HW_EXCP_VECTOR_MAIN + 4, // ARM9例外ベクタ
|
||||||
HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ
|
HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ
|
||||||
NULL,
|
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] =
|
static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||||
{
|
{
|
||||||
HW_MAIN_MEM_PARAMETER_BUF, SYSM_OWN_ARM7_MMEM_ADDR,
|
SYSM_NTR_ARM7_LOAD_MMEM_END, OS_BOOT_A9CODE_BUF,
|
||||||
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
|
SYSM_TWL_ARM9_LTD_LOAD_MMEM_END, SYSM_DBG_NTR_SYSTEM_BUF,
|
||||||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, 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,
|
||||||
SYSM_OWN_ARM9_MMEM_ADDR_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_MAIN, HW_EXCP_VECTOR_MAIN + 4, // ARM9例外ベクタ
|
||||||
HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ
|
HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ
|
||||||
NULL,
|
NULL,
|
||||||
@ -276,6 +274,7 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget*
|
|||||||
{
|
{
|
||||||
post_clear_list = nitro_post_clear_list;
|
post_clear_list = nitro_post_clear_list;
|
||||||
// NTR-IPLと同様にシステム領域直前をクリアしておく
|
// NTR-IPLと同様にシステム領域直前をクリアしておく
|
||||||
|
// [TODO:] すでにpost_clear_listに含まれている気がする。要確認
|
||||||
mem_list[list_count++] = 0x02800000 - OS_BOOT_SYS_CLR_SIZE;
|
mem_list[list_count++] = 0x02800000 - OS_BOOT_SYS_CLR_SIZE;
|
||||||
mem_list[list_count++] = OS_BOOT_SYS_CLR_SIZE - HW_MAIN_MEM_SHARED_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;
|
int l;
|
||||||
for( l=(int)index; list[l]!=NULL; 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]までの要素を消す
|
// regionlist[l]からregionlist[m-1]までの要素を消す
|
||||||
for( n=l; l<m; l++ )
|
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 void SYSMi_makeTitleIdList( void );
|
||||||
static BOOL SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head );
|
static BOOL SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head );
|
||||||
static void SYSMi_applyPatchToBandBrothers( void );
|
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-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
@ -836,8 +839,12 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
|
|||||||
{
|
{
|
||||||
(void)FS_CloseFile(file);
|
(void)FS_CloseFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// モジュール最終ロード先領域のうち、現在空いている場所をクリア
|
||||||
|
// [TODO:]とりあえずベタ書き。余裕があればスレッド化する。
|
||||||
|
SYSMi_ClearRomLoadSegment( (ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF );
|
||||||
|
|
||||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
||||||
return;
|
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 )
|
void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
||||||
@ -1936,3 +2023,72 @@ void CheckDigest( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#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