(CARD以外の)staticモジュール読み込みサイズを16バイトアライメントに補正するよう変更。

検証時にAESデクリプト処理が走るように変更(AES有効なROMは未検証)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1071 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-04-07 06:27:04 +00:00
parent b10ba5b19d
commit d72fc7e87b
3 changed files with 18 additions and 8 deletions

View File

@ -71,6 +71,8 @@ static u32 load_region_check_list[RELOCATE_INFO_NUM][RELOCATE_INFO_NUM * 2 - 1]
static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
( u32 *dest, u32 length, RomSegmentRange default_region, u32 *check_dest, Relocate_Info *info ) ( u32 *dest, u32 length, RomSegmentRange default_region, u32 *check_dest, Relocate_Info *info )
{ {
u32 ori_len = length;
length = MATH_ROUNDUP( length, 16 );// AES暗号化領域の関係で、再配置必要性のチェックに使うlengthは16バイトアライメントに補正
MI_CpuClearFast( info, sizeof(Relocate_Info) ); MI_CpuClearFast( info, sizeof(Relocate_Info) );
if( default_region.end - default_region.start < length ) return FALSE;// サイズオーバー if( default_region.end - default_region.start < length ) return FALSE;// サイズオーバー
if( !( default_region.start <= *dest && *dest + length <= default_region.end ) ) if( !( default_region.start <= *dest && *dest + length <= default_region.end ) )
@ -82,15 +84,17 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
check_dest += 2; check_dest += 2;
} }
// ここから先はlengthでなくori_lenを使用
// ここまで来ていれば再配置可 // ここまで来ていれば再配置可
// 後方コピーフラグOFF // 後方コピーフラグOFF
info->rev = FALSE; info->rev = FALSE;
if( default_region.start < *dest + length && *dest + length <= default_region.end ) if( default_region.start < *dest + ori_len && *dest + ori_len <= default_region.end )
{ {
// デフォルト配置領域の先頭部に、再配置先の後部が被っている // デフォルト配置領域の先頭部に、再配置先の後部が被っている
// ポストクリア情報 // ポストクリア情報
info->post_clear_addr = *dest + length; info->post_clear_addr = *dest + ori_len;
info->post_clear_length = default_region.end - (*dest + length); info->post_clear_length = default_region.end - (*dest + ori_len);
} }
else if( default_region.start <= *dest && *dest < default_region.end ) else if( default_region.start <= *dest && *dest < default_region.end )
{ {
@ -98,7 +102,7 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
// ポストクリア情報 // ポストクリア情報
info->post_clear_addr = default_region.start; info->post_clear_addr = default_region.start;
info->post_clear_length = *dest - default_region.start; info->post_clear_length = *dest - default_region.start;
if( *dest < default_region.start + length ) if( *dest < default_region.start + ori_len )
{ {
// 更に、デフォルト配置領域にロードしたデータの最後尾と再配置先の先頭部が被っている // 更に、デフォルト配置領域にロードしたデータの最後尾と再配置先の先頭部が被っている
// 後方コピーフラグON // 後方コピーフラグON
@ -113,7 +117,7 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
} }
info->src = default_region.start; info->src = default_region.start;
info->dest = *dest; info->dest = *dest;
info->length = length; info->length = ori_len;
*dest = default_region.start; *dest = default_region.start;
}else }else
{ {

View File

@ -483,7 +483,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
for (i = region_header; i < region_max; ++i) for (i = region_header; i < region_max; ++i)
{ {
u32 len = length[i]; u32 len = MATH_ROUNDUP( length[i], 16 );// AES暗号化領域の関係で、ロードサイズは16バイトアライメントに補正
if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域 if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域
@ -498,7 +498,7 @@ OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]);
readLen = FS_ReadFile(file, (void *)destaddr[i], (s32)len); readLen = FS_ReadFile(file, (void *)destaddr[i], (s32)len);
if( readLen != (s32)len ) if( readLen < 0 )
{ {
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file); FS_CloseFile(file);
@ -887,6 +887,11 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
if( hs->platform_code & PLATFORM_CODE_FLAG_TWL ) if( hs->platform_code & PLATFORM_CODE_FLAG_TWL )
{ {
// TWLアプリ // TWLアプリ
// TWLアプリの場合はAES暗号化されている部分をデクリプトする
SYSM_StartDecryptAESRegion( hs );
// 認証処理
switch( pBootTitle->flags.bootType ) switch( pBootTitle->flags.bootType )
{ {
case LAUNCHER_BOOTTYPE_NAND: case LAUNCHER_BOOTTYPE_NAND:

View File

@ -210,7 +210,8 @@ static void SYSMi_CallbackDecryptAESRegion(PXIFifoTag tag, u32 data, BOOL err)
} }
// 鍵ロードして暗号化領域の復号開始 // 鍵ロードして暗号化領域の復号開始
ReplaceWithAes( SYSMi_GetWork()->addr_AESregion[l], SYSMi_GetWork()->size_AESregion[l] ); ReplaceWithAes( SYSMi_GetWork()->addr_AESregion[l], SYSMi_GetWork()->size_AESregion[l] );
// DMA転送なのでキャッシュケアは不要のはず……AES_DmaSendとRecvの仕様を要確認 // DMA転送なのでARM9のためのキャッシュフラッシュは不要のはず
// もうARM7側でも再配置まで触らないのでキャッシュ破棄する必要もないはず
} }
// ARM9に完了通知 // ARM9に完了通知