diff --git a/build/gcdfirm/sdmc-launcher/ARM7/main.c b/build/gcdfirm/sdmc-launcher/ARM7/main.c index 791b1329..115c968a 100644 --- a/build/gcdfirm/sdmc-launcher/ARM7/main.c +++ b/build/gcdfirm/sdmc-launcher/ARM7/main.c @@ -83,6 +83,7 @@ static void PreInit(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); OS_BootFromFIRM(); diff --git a/build/gcdfirm/sdmc-launcher/ARM9/main.c b/build/gcdfirm/sdmc-launcher/ARM9/main.c index b64d5c3a..f3c128b9 100644 --- a/build/gcdfirm/sdmc-launcher/ARM9/main.c +++ b/build/gcdfirm/sdmc-launcher/ARM9/main.c @@ -109,14 +109,21 @@ static void PostInit(void) /*************************************************************** CheckHeader - ヘッダの内容がTWLアプリとして問題ないかチェック + ヘッダがシステムメニューとして問題ないかチェック ***************************************************************/ static BOOL CheckHeader(void) { static ROM_Header_Short* const rhs = (ROM_Header_Short*)HW_TWL_ROM_HEADER_BUF; - // TODO - // イニシャルコード + // イニシャルコードなど OS_TPrintf("Initial Code : %08X\n", *(u32*)rhs->game_code); + OS_TPrintf("Platform Code : %02X\n", rhs->platform_code); + OS_TPrintf("Codec Mode : %s\n", rhs->codec_mode ? "TWL" : "NITRO"); + OS_TPrintf("Sigunature : %s\n", rhs->enable_signature ? "AVAILABLE" : "NOT AVAILABLE"); + OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); + if ( rhs->enable_aes ) + { + OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); OS_TPrintf("ARM7 Entry point : %08X\n", rhs->sub_entry_address); @@ -133,6 +140,35 @@ static BOOL CheckHeader(void) OS_TPrintf("ARM7 LTD ROM address: %08X\n", rhs->sub_ltd_rom_offset); OS_TPrintf("ARM7 LTD RAM address: %08X\n", rhs->sub_ltd_ram_address); OS_TPrintf("ARM7 LTD size : %08X\n", rhs->sub_ltd_size); + // 順序ほぼ最適化済み +#ifndef FIRM_USE_TWLSDK_KEYS + if ( rhs->platform_code != PLATFORM_CODE_TWL_LIMITED || // TWL Limited only + !rhs->codec_mode || // TWL mode only + !rhs->enable_signature || // Should be use ROM header signature +#else + if ( // no check +#endif + // should be in main memory + HW_TWL_MAIN_MEM > (u32)rhs->main_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->main_ltd_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ltd_ram_address || + // should be in static area without Limited region + (u32)rhs->main_ram_address > (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address > (u32)rhs->sub_entry_address || + // should be in main memory (end address) + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ram_address + rhs->main_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ram_address + rhs->sub_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ltd_ram_address + rhs->main_ltd_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ltd_ram_address + rhs->sub_ltd_size || + // should be in static area without Limited region (end address) + (u32)rhs->main_ram_address + rhs->main_size <= (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address + rhs->sub_size <= (u32)rhs->sub_entry_address || + 0 ) + { + OS_TPrintf("Invalid ROM header for MENU Launcher!\n"); + return FALSE; + } return TRUE; } @@ -145,8 +181,10 @@ static BOOL CheckHeader(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); + MI_CpuClearFast( (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF ); OS_BootFromFIRM(); #endif } @@ -202,9 +240,10 @@ void TwlMain( void ) EraseAll(); // failed - while (1) - { - PXI_NotifyID( FIRM_PXI_ID_NULL ); - } + PXI_NotifyID( FIRM_PXI_ID_ERR ); + PXI_NotifyID( FIRM_PXI_ID_ERR ); + PXI_NotifyID( FIRM_PXI_ID_ERR ); + PXI_NotifyID( FIRM_PXI_ID_ERR ); + OS_Terminate(); } diff --git a/build/nandfirm/menu-launcher/ARM7/main.c b/build/nandfirm/menu-launcher/ARM7/main.c index 5fe49242..32e25a8e 100644 --- a/build/nandfirm/menu-launcher/ARM7/main.c +++ b/build/nandfirm/menu-launcher/ARM7/main.c @@ -111,6 +111,7 @@ static void PreInit(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); OS_BootFromFIRM(); diff --git a/build/nandfirm/menu-launcher/ARM9/main.c b/build/nandfirm/menu-launcher/ARM9/main.c index bd2faf25..6338a093 100644 --- a/build/nandfirm/menu-launcher/ARM9/main.c +++ b/build/nandfirm/menu-launcher/ARM9/main.c @@ -126,14 +126,20 @@ static void PostInit(void) CheckHeader ヘッダがシステムメニューとして問題ないかチェック - 先頭32Bは固定値と思われ (リマスターバージョンは違うかな) ***************************************************************/ static BOOL CheckHeader(void) { static ROM_Header_Short* const rhs = (ROM_Header_Short*)HW_TWL_ROM_HEADER_BUF; - // TODO - // イニシャルコード + // イニシャルコードなど OS_TPrintf("Initial Code : %08X\n", *(u32*)rhs->game_code); + OS_TPrintf("Platform Code : %02X\n", rhs->platform_code); + OS_TPrintf("Codec Mode : %s\n", rhs->codec_mode ? "TWL" : "NITRO"); + OS_TPrintf("Sigunature : %s\n", rhs->enable_signature ? "AVAILABLE" : "NOT AVAILABLE"); + OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); + if ( rhs->enable_aes ) + { + OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); OS_TPrintf("ARM7 Entry point : %08X\n", rhs->sub_entry_address); @@ -150,6 +156,32 @@ static BOOL CheckHeader(void) OS_TPrintf("ARM7 LTD ROM address: %08X\n", rhs->sub_ltd_rom_offset); OS_TPrintf("ARM7 LTD RAM address: %08X\n", rhs->sub_ltd_ram_address); OS_TPrintf("ARM7 LTD size : %08X\n", rhs->sub_ltd_size); + // 順序ほぼ最適化済み + if ( rhs->platform_code != PLATFORM_CODE_TWL_LIMITED || // TWL Limited only + !rhs->codec_mode || // TWL mode only + !rhs->enable_signature || // Should be use ROM header signature + (rhs->titleID_Hi & 0x0005) != 0x0005 || // check only NAND/SYSTEM bits (need?) + // should be in main memory + HW_TWL_MAIN_MEM > (u32)rhs->main_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->main_ltd_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ltd_ram_address || + // should be in static area without Limited region + (u32)rhs->main_ram_address > (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address > (u32)rhs->sub_entry_address || + // should be in main memory (end address) + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ram_address + rhs->main_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ram_address + rhs->sub_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ltd_ram_address + rhs->main_ltd_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ltd_ram_address + rhs->sub_ltd_size || + // should be in static area without Limited region (end address) + (u32)rhs->main_ram_address + rhs->main_size <= (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address + rhs->sub_size <= (u32)rhs->sub_entry_address || + 0 ) + { + OS_TPrintf("Invalid ROM header for MENU Launcher!\n"); + return FALSE; + } return TRUE; } @@ -162,8 +194,10 @@ static BOOL CheckHeader(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); + MI_CpuClearFast( (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF ); OS_BootFromFIRM(); #endif } diff --git a/build/nandfirm/menu-launcher2/ARM7/main.c b/build/nandfirm/menu-launcher2/ARM7/main.c index 68bb853e..89694e70 100644 --- a/build/nandfirm/menu-launcher2/ARM7/main.c +++ b/build/nandfirm/menu-launcher2/ARM7/main.c @@ -111,6 +111,7 @@ static void PreInit(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); OS_BootFromFIRM(); diff --git a/build/nandfirm/menu-launcher2/ARM9/main.c b/build/nandfirm/menu-launcher2/ARM9/main.c index 5f838097..8837ee2f 100644 --- a/build/nandfirm/menu-launcher2/ARM9/main.c +++ b/build/nandfirm/menu-launcher2/ARM9/main.c @@ -127,14 +127,20 @@ static void PostInit(void) CheckHeader ヘッダがシステムメニューとして問題ないかチェック - 先頭32Bは固定値と思われ (リマスターバージョンは違うかな) ***************************************************************/ static BOOL CheckHeader(void) { static ROM_Header_Short* const rhs = (ROM_Header_Short*)HW_TWL_ROM_HEADER_BUF; - // TODO - // イニシャルコード + // イニシャルコードなど OS_TPrintf("Initial Code : %08X\n", *(u32*)rhs->game_code); + OS_TPrintf("Platform Code : %02X\n", rhs->platform_code); + OS_TPrintf("Codec Mode : %s\n", rhs->codec_mode ? "TWL" : "NITRO"); + OS_TPrintf("Sigunature : %s\n", rhs->enable_signature ? "AVAILABLE" : "NOT AVAILABLE"); + OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); + if ( rhs->enable_aes ) + { + OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); OS_TPrintf("ARM7 Entry point : %08X\n", rhs->sub_entry_address); @@ -151,6 +157,32 @@ static BOOL CheckHeader(void) OS_TPrintf("ARM7 LTD ROM address: %08X\n", rhs->sub_ltd_rom_offset); OS_TPrintf("ARM7 LTD RAM address: %08X\n", rhs->sub_ltd_ram_address); OS_TPrintf("ARM7 LTD size : %08X\n", rhs->sub_ltd_size); + // 順序ほぼ最適化済み + if ( rhs->platform_code != PLATFORM_CODE_TWL_LIMITED || // TWL Limited only + !rhs->codec_mode || // TWL mode only + !rhs->enable_signature || // Should be use ROM header signature + (rhs->titleID_Hi & 0x0005) != 0x0005 || // check only NAND/SYSTEM bits (need?) + // should be in main memory + HW_TWL_MAIN_MEM > (u32)rhs->main_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->main_ltd_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ltd_ram_address || + // should be in static area without Limited region + (u32)rhs->main_ram_address > (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address > (u32)rhs->sub_entry_address || + // should be in main memory (end address) + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ram_address + rhs->main_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ram_address + rhs->sub_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ltd_ram_address + rhs->main_ltd_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ltd_ram_address + rhs->sub_ltd_size || + // should be in static area without Limited region (end address) + (u32)rhs->main_ram_address + rhs->main_size <= (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address + rhs->sub_size <= (u32)rhs->sub_entry_address || + 0 ) + { + OS_TPrintf("Invalid ROM header for MENU Launcher!\n"); + return FALSE; + } return TRUE; } @@ -163,8 +195,10 @@ static BOOL CheckHeader(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); + MI_CpuClearFast( (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF ); OS_BootFromFIRM(); #endif } diff --git a/build/nandfirm/sdmc-launcher/ARM7/main.c b/build/nandfirm/sdmc-launcher/ARM7/main.c index 682e57da..5acb062d 100644 --- a/build/nandfirm/sdmc-launcher/ARM7/main.c +++ b/build/nandfirm/sdmc-launcher/ARM7/main.c @@ -83,6 +83,7 @@ static void PreInit(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); OS_BootFromFIRM(); diff --git a/build/nandfirm/sdmc-launcher/ARM9/main.c b/build/nandfirm/sdmc-launcher/ARM9/main.c index b64d5c3a..f3c128b9 100644 --- a/build/nandfirm/sdmc-launcher/ARM9/main.c +++ b/build/nandfirm/sdmc-launcher/ARM9/main.c @@ -109,14 +109,21 @@ static void PostInit(void) /*************************************************************** CheckHeader - ヘッダの内容がTWLアプリとして問題ないかチェック + ヘッダがシステムメニューとして問題ないかチェック ***************************************************************/ static BOOL CheckHeader(void) { static ROM_Header_Short* const rhs = (ROM_Header_Short*)HW_TWL_ROM_HEADER_BUF; - // TODO - // イニシャルコード + // イニシャルコードなど OS_TPrintf("Initial Code : %08X\n", *(u32*)rhs->game_code); + OS_TPrintf("Platform Code : %02X\n", rhs->platform_code); + OS_TPrintf("Codec Mode : %s\n", rhs->codec_mode ? "TWL" : "NITRO"); + OS_TPrintf("Sigunature : %s\n", rhs->enable_signature ? "AVAILABLE" : "NOT AVAILABLE"); + OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); + if ( rhs->enable_aes ) + { + OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); OS_TPrintf("ARM7 Entry point : %08X\n", rhs->sub_entry_address); @@ -133,6 +140,35 @@ static BOOL CheckHeader(void) OS_TPrintf("ARM7 LTD ROM address: %08X\n", rhs->sub_ltd_rom_offset); OS_TPrintf("ARM7 LTD RAM address: %08X\n", rhs->sub_ltd_ram_address); OS_TPrintf("ARM7 LTD size : %08X\n", rhs->sub_ltd_size); + // 順序ほぼ最適化済み +#ifndef FIRM_USE_TWLSDK_KEYS + if ( rhs->platform_code != PLATFORM_CODE_TWL_LIMITED || // TWL Limited only + !rhs->codec_mode || // TWL mode only + !rhs->enable_signature || // Should be use ROM header signature +#else + if ( // no check +#endif + // should be in main memory + HW_TWL_MAIN_MEM > (u32)rhs->main_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->main_ltd_ram_address || + HW_TWL_MAIN_MEM > (u32)rhs->sub_ltd_ram_address || + // should be in static area without Limited region + (u32)rhs->main_ram_address > (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address > (u32)rhs->sub_entry_address || + // should be in main memory (end address) + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ram_address + rhs->main_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ram_address + rhs->sub_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->main_ltd_ram_address + rhs->main_ltd_size || + HW_TWL_MAIN_MEM_END <= (u32)rhs->sub_ltd_ram_address + rhs->sub_ltd_size || + // should be in static area without Limited region (end address) + (u32)rhs->main_ram_address + rhs->main_size <= (u32)rhs->main_entry_address || + (u32)rhs->sub_ram_address + rhs->sub_size <= (u32)rhs->sub_entry_address || + 0 ) + { + OS_TPrintf("Invalid ROM header for MENU Launcher!\n"); + return FALSE; + } return TRUE; } @@ -145,8 +181,10 @@ static BOOL CheckHeader(void) ***************************************************************/ static void EraseAll(void) { + MI_CpuClearFast( OSi_GetFromFirmAddr(), sizeof(OSFromFirmBuf) ); #ifdef SDK_FINALROM MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE ); + MI_CpuClearFast( (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF ); OS_BootFromFIRM(); #endif } @@ -202,9 +240,10 @@ void TwlMain( void ) EraseAll(); // failed - while (1) - { - PXI_NotifyID( FIRM_PXI_ID_NULL ); - } + PXI_NotifyID( FIRM_PXI_ID_ERR ); + PXI_NotifyID( FIRM_PXI_ID_ERR ); + PXI_NotifyID( FIRM_PXI_ID_ERR ); + PXI_NotifyID( FIRM_PXI_ID_ERR ); + OS_Terminate(); }