diff --git a/build/gcdfirm/sdmc-launcher-writer/ARM7/main.c b/build/gcdfirm/sdmc-launcher-writer/ARM7/main.c index 79887536..6df1eeef 100644 --- a/build/gcdfirm/sdmc-launcher-writer/ARM7/main.c +++ b/build/gcdfirm/sdmc-launcher-writer/ARM7/main.c @@ -85,7 +85,6 @@ static u8 version = 0; ***************************************************************/ static void PreInit(void) { - GCDHeader* const gh = &OSi_GetFromBromAddr()->header.gcd; /* バッテリー残量チェック */ @@ -100,8 +99,8 @@ static void PreInit(void) #endif } } - MI_CpuCopyFast( gh, (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); -// MI_CpuCopyFast( gh, (void*)HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE ); + // GCDヘッダコピー + MI_CpuCopyFast( OSi_GetFromBromAddr(), (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); // FromBrom全消去 MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); } @@ -153,7 +152,7 @@ static void PostInit(void) ***************************************************************/ static void EraseAll(void) { - GCDHeader* const gh = &OSi_GetFromBromAddr()->header.gcd; + GCDHeader* const gh = (GCDHeader*)HW_ROM_HEADER_BUF; AESi_ResetAesKeyA(); AESi_ResetAesKeyB(); AESi_ResetAesKeyC(); @@ -161,6 +160,7 @@ static void EraseAll(void) } extern SDMC_ERR_CODE FATFSi_sdmcGoIdle(u16 ports, void (*func1)(),void (*func2)()); + void TwlSpMain( void ) { GCDHeader* const gh = &OSi_GetFromBromAddr()->header.gcd; diff --git a/build/libraries/fs/ARM9/src/fs_firm.c b/build/libraries/fs/ARM9/src/fs_firm.c index d0a19bd1..399cfc64 100644 --- a/build/libraries/fs/ARM9/src/fs_firm.c +++ b/build/libraries/fs/ARM9/src/fs_firm.c @@ -193,6 +193,39 @@ BOOL FS_ResolveSrl( OSTitleId titleId ) return TRUE; } +/*---------------------------------------------------------------------------* + Name: FS_ResolveSrlList + + Description: resolve srl filename with list and store to + HW_TWL_FS_BOOT_SRL_PATH_BUF + + Arguments: titleIdList pointer to title id array for srl file + nums number of title id + + Returns: -1 if failed, otherwise succeeded titile id number + *---------------------------------------------------------------------------*/ +int FS_ResolveSrlList( const OSTitleId* titleIdList, u32 nums ) +{ + int i; + MI_CpuClearFast( (char*)HW_TWL_FS_BOOT_SRL_PATH_BUF, HW_FIRM_FS_BOOT_SRL_PATH_BUF_SIZE ); + if ( !titleIdList || !nums || ES_ERR_OK != ES_InitLib() ) + { + return FALSE; + } + for ( i = 0; i < nums; i++ ) + { + if ( ES_ERR_OK == ES_GetContentPath(titleIdList[i], CONTENT_INDEX_BOOT, (char*)HW_TWL_FS_BOOT_SRL_PATH_BUF) ) + { + break; + } + } + if ( ES_ERR_OK != ES_CloseLib() ) + { + return FALSE; + } + return (i == nums ? -1 : i); +} + /*---------------------------------------------------------------------------* Name: FS_ResolveSrlUnsecured diff --git a/build/libraries/fs/ARM9/src/fs_loader.c b/build/libraries/fs/ARM9/src/fs_loader.c index 072130c4..b9a119fd 100644 --- a/build/libraries/fs/ARM9/src/fs_loader.c +++ b/build/libraries/fs/ARM9/src/fs_loader.c @@ -21,10 +21,6 @@ #define FS_HEADER_AUTH_SIZE 0xe00 -#define MODULE_ALIGNMENT 0x10 // 16バイト単位で読み込む -//#define MODULE_ALIGNMENT 0x200 // 512バイト単位で読み込む -#define RoundUpModuleSize(value) (((value) + MODULE_ALIGNMENT - 1) & -MODULE_ALIGNMENT) - #define HASH_UNIT 0x1000 static ROM_Header* const rh = (ROM_Header*)HW_TWL_ROM_HEADER_BUF; @@ -198,11 +194,11 @@ static u32 GetTransferSize( u32 offset, u32 size ) { if ( rh->s.enable_aes ) { - u32 end = offset + RoundUpModuleSize(size); + u32 end = offset + size; u32 aes_offset = rh->s.aes_target_rom_offset; - u32 aes_end = aes_offset + RoundUpModuleSize(rh->s.aes_target_size); + u32 aes_end = aes_offset + rh->s.aes_target_size; u32 aes_offset2 = rh->s.aes_target2_rom_offset; - u32 aes_end2 = aes_offset2 + RoundUpModuleSize(rh->s.aes_target2_size); + u32 aes_end2 = aes_offset2 + rh->s.aes_target2_size; if ( offset >= aes_offset && offset < aes_end ) { diff --git a/build/nandfirm/menu-launcher/ARM7/main.c b/build/nandfirm/menu-launcher/ARM7/main.c index 89c87dda..de68498c 100644 --- a/build/nandfirm/menu-launcher/ARM7/main.c +++ b/build/nandfirm/menu-launcher/ARM7/main.c @@ -33,7 +33,7 @@ PRINT_MEMORY_ADDR を定義すると、そのアドレスからSPrintfを行います(このファイルのみ) FINALROM版でもコードが残るので注意してください。 */ -//#define PRINT_MEMORY_ADDR 0x02FFC800 +#define PRINT_MEMORY_ADDR 0x02FFC800 #ifdef PROFILE_ENABLE diff --git a/build/nandfirm/menu-launcher/ARM9/main.c b/build/nandfirm/menu-launcher/ARM9/main.c index ee96cbe5..54e3aa72 100644 --- a/build/nandfirm/menu-launcher/ARM9/main.c +++ b/build/nandfirm/menu-launcher/ARM9/main.c @@ -54,7 +54,7 @@ static SVCSignHeapContext acPool; PRINT_MEMORY_ADDR を定義すると、そのアドレスからSPrintfを行います(このファイルのみ) FINALROM版でもコードが残るので注意してください。 */ -//#define PRINT_MEMORY_ADDR 0x02FFC200 +#define PRINT_MEMORY_ADDR 0x02FFC200 //#ifdef SDK_FINALROM // FINALROMで無効化 //#undef PROFILE_ENABLE @@ -115,41 +115,32 @@ static void PostInit(void) /*************************************************************** TryResolveSrl - NANDに格納された情報からランチャーSRLを解決する + リストからランチャーSRLを解決する ***************************************************************/ static BOOL TryResolveSrl(void) { - OSTitleId titleId = MENU_TITLE_ID_HI << 32; + OSTitleId titleIdList[] = + { + MENU_TITLE_ID_HI << 32, // titleId_Lo is resolved by HWSecureInfo + MENU_TITLE_ID + }; + int num; if ( !LCFG_ReadHWSecureInfo() ) { OS_TPrintf("Failed to load HWSecureInfo.\n"); return FALSE; } - LCFG_THW_GetLauncherTitleID_Lo( (u8*)&titleId ); + LCFG_THW_GetLauncherTitleID_Lo( (u8*)&titleIdList[0] ); // 4: after LCFG_ReadHWSecureInfo PUSH_PROFILE(); - if ( !FS_ResolveSrl( titleId ) ) + num = FS_ResolveSrlList( titleIdList, sizeof(titleIdList)/sizeof(titleIdList[0]) ); + if ( num < 0 ) { - OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", titleId); + OS_TPrintf("Failed to call FS_ResolveSrlList().\n"); return FALSE; } - OS_TPrintf("Launcher Title ID: 0x%016llx\n", titleId); - return TRUE; -} -/*************************************************************** - RetryResolveSrl - - デフォルト設定からランチャーSRLを解決する -***************************************************************/ -static BOOL RetryResolveSrl(void) -{ - if ( !FS_ResolveSrl( MENU_TITLE_ID ) ) - { - OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID); - return FALSE; - } - OS_TPrintf("Launcher Title ID: 0x%016llx\n", MENU_TITLE_ID); + OS_TPrintf("Launcher Title ID: 0x%016llx\n", titleIdList[num]); return TRUE; } @@ -170,6 +161,16 @@ static BOOL CheckHeader(void) if ( rhs->enable_aes ) { OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + if ( rhs->aes_target_size ) + { + OS_TPrintf("AES address : %08X\n", rhs->aes_target_rom_offset); + OS_TPrintf("AES size : %08X\n", rhs->aes_target_size); + } + if ( rhs->aes_target2_size ) + { + OS_TPrintf("AES2 address : %08X\n", rhs->aes_target2_rom_offset); + OS_TPrintf("AES2 size : %08X\n", rhs->aes_target2_size); + } } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); @@ -259,7 +260,7 @@ void TwlMain( void ) // 3: after PostInit PUSH_PROFILE(); - if ( !TryResolveSrl() && !RetryResolveSrl() ) + if ( !TryResolveSrl() ) { goto end; } diff --git a/include/firm/fs/ARM9/fs_firm.h b/include/firm/fs/ARM9/fs_firm.h index 21e772b0..fc9dd5d6 100644 --- a/include/firm/fs/ARM9/fs_firm.h +++ b/include/firm/fs/ARM9/fs_firm.h @@ -62,6 +62,19 @@ BOOL FS_GetTitleBootContentPathFast(char* buf, OSTitleId titleId); *---------------------------------------------------------------------------*/ BOOL FS_ResolveSrl( OSTitleId titleId ); +/*---------------------------------------------------------------------------* + Name: FS_ResolveSrlList + + Description: resolve srl filename with list and store to + HW_TWL_FS_BOOT_SRL_PATH_BUF + + Arguments: titleIdList pointer to title id array for srl file + nums number of title id + + Returns: -1 if failed, otherwise succeeded titile id number + *---------------------------------------------------------------------------*/ +int FS_ResolveSrlList( const OSTitleId* titleIdList, u32 nums ); + /*---------------------------------------------------------------------------* Name: FS_ResolveSrlUnsecured