mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
再配置後clearリストの生成を実装(動作検証はrebootライブラリの修正待ち)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@306 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
83ece203e0
commit
565c57aedb
@ -120,7 +120,15 @@ BOOL BOOT_WaitStart( void )
|
||||
}
|
||||
mem_list[list_count++] = NULL;
|
||||
|
||||
// [TODO]post clearリスト設定
|
||||
// post clearリスト設定
|
||||
for( l=0; l<RELOCATE_INFO_NUM ; l++ )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
mem_list[list_count] = NULL;
|
||||
|
||||
// リブート
|
||||
|
||||
@ -549,21 +549,44 @@ BOOL SYSM_IsValidTSD( void )
|
||||
static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
|
||||
( u32 *dest, u32 length, RomSegmentRange default_region, u32 *check_dest, Relocate_Info *info )
|
||||
{
|
||||
if( default_region.end - default_region.start - 1 < length ) return FALSE;// サイズオーバー
|
||||
if( !( default_region.start <= *dest && *dest + length < default_region.end ) )
|
||||
if( default_region.end - default_region.start < length ) return FALSE;// サイズオーバー
|
||||
if( !( default_region.start <= *dest && *dest + length <= default_region.end ) )
|
||||
{
|
||||
// 再配置の必要あり
|
||||
while( *check_dest != NULL )
|
||||
{
|
||||
if( check_dest[0] <= *dest + length && *dest < check_dest[1] ) return FALSE;// チェック領域に被ったらNG
|
||||
if( check_dest[0] < *dest + length && *dest < check_dest[1] ) return FALSE;// チェック領域に被ったらNG
|
||||
check_dest += 2;
|
||||
}
|
||||
|
||||
// ここまで来ていれば再配置可能
|
||||
if( default_region.start <= *dest && *dest < default_region.end )
|
||||
// 後方コピーフラグOFF
|
||||
info->rev = FALSE;
|
||||
if( default_region.start < *dest + length && *dest + length <= default_region.end )
|
||||
{
|
||||
// デフォルト配置領域の後部に、再配置先の先頭部が被っているので、後方コピーフラグON
|
||||
info->rev = TRUE;
|
||||
// デフォルト配置領域の先頭部に、再配置先の後部が被っている
|
||||
// ポストクリア情報
|
||||
info->post_clear_addr = *dest + length;
|
||||
info->post_clear_length = default_region.end - (*dest + length);
|
||||
}
|
||||
else if( default_region.start <= *dest && *dest < default_region.end )
|
||||
{
|
||||
// デフォルト配置領域の後部に、再配置先の先頭部が被っている
|
||||
// ポストクリア情報
|
||||
info->post_clear_addr = default_region.start;
|
||||
info->post_clear_length = *dest - default_region.start;
|
||||
if( *dest < default_region.start + length )
|
||||
{
|
||||
// 更に、デフォルト配置領域にロードしたデータの最後尾と再配置先の先頭部が被っている
|
||||
// 後方コピーフラグON
|
||||
info->rev = TRUE;
|
||||
}
|
||||
}else
|
||||
{
|
||||
// まったく被っていない
|
||||
// ポストクリア情報
|
||||
info->post_clear_addr = default_region.start;
|
||||
info->post_clear_length = default_region.end - default_region.start;
|
||||
}
|
||||
info->src = default_region.start;
|
||||
info->dest = *dest;
|
||||
@ -575,6 +598,8 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
|
||||
info->src = NULL;
|
||||
info->dest = NULL;
|
||||
info->length = NULL;
|
||||
info->post_clear_addr = NULL;
|
||||
info->post_clear_length = NULL;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -54,6 +54,8 @@ typedef struct Relocate_Info
|
||||
u32 src;
|
||||
u32 dest;
|
||||
u32 length;
|
||||
u32 post_clear_addr;
|
||||
u32 post_clear_length;
|
||||
BOOL rev;
|
||||
}Relocate_Info;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user