diff --git a/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c b/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c index 6eb05a6b..f53d15d6 100644 --- a/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c +++ b/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c @@ -71,6 +71,8 @@ static u32 load_region_check_list[RELOCATE_INFO_NUM][RELOCATE_INFO_NUM * 2 - 1] static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx ( 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) ); if( default_region.end - default_region.start < length ) return FALSE;// サイズオーバー if( !( default_region.start <= *dest && *dest + length <= default_region.end ) ) @@ -82,15 +84,17 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx check_dest += 2; } + // ここから先はlengthでなくori_lenを使用 + // ここまで来ていれば再配置可 // 後方コピーフラグOFF 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_length = default_region.end - (*dest + length); + info->post_clear_addr = *dest + ori_len; + info->post_clear_length = default_region.end - (*dest + ori_len); } 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_length = *dest - default_region.start; - if( *dest < default_region.start + length ) + if( *dest < default_region.start + ori_len ) { // 更に、デフォルト配置領域にロードしたデータの最後尾と再配置先の先頭部が被っている // 後方コピーフラグON @@ -113,7 +117,7 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx } info->src = default_region.start; info->dest = *dest; - info->length = length; + info->length = ori_len; *dest = default_region.start; }else { diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 4f581422..1caaa3ce 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -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) { - u32 len = length[i]; + u32 len = MATH_ROUNDUP( length[i], 16 );// AES暗号化領域の関係で、ロードサイズは16バイトアライメントに補正 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); - if( readLen != (s32)len ) + if( readLen < 0 ) { OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); FS_CloseFile(file); @@ -887,6 +887,11 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle) if( hs->platform_code & PLATFORM_CODE_FLAG_TWL ) { // TWLアプリ + + // TWLアプリの場合はAES暗号化されている部分をデクリプトする + SYSM_StartDecryptAESRegion( hs ); + + // 認証処理 switch( pBootTitle->flags.bootType ) { case LAUNCHER_BOOTTYPE_NAND: diff --git a/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c b/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c index c91c0db0..9a1764a1 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c +++ b/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c @@ -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] ); - // DMA転送なのでキャッシュケアは不要のはず……AES_DmaSendとRecvの仕様を要確認 + // DMA転送なのでARM9のためのキャッシュフラッシュは不要のはず + // もうARM7側でも再配置まで触らないのでキャッシュ破棄する必要もないはず } // ARM9に完了通知