diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index a64fb2fc..b96a8192 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -25,6 +25,7 @@ //#define HOTSW_DISABLE_FORCE_CARD_OFF #define HOTSW_CHECK_CREATE_MONITOR_THREAD +#define HOTSW_CARD_TESTER_DEBUG // カード電源ONからROMヘッダロードまでの期間にスリープに入る時のワンセグ対策しない場合 //#define HOWSW_ENABLE_DEEP_SLEEP_WHILE_INSERT_CARD @@ -59,7 +60,12 @@ #define HOTSW_EXMEMCNT_SELB_SHIFT 10 #endif -// 本体セキュア情報の手前 6byte 分を間借りしてCRC情報を入れておく。 +// 本体セキュア情報の手前を間借りしてCRC情報を入れておく。 +#ifdef HOTSW_CARD_TESTER_DEBUG +#define HOTSW_SECURE_ID_BUFFER (HW_HW_SECURE_INFO - 0xc) +#define HOTSW_ERROR_BUFFER (HW_HW_SECURE_INFO - 0xa) +#endif +#define HOTSW_EXT_ROM_HEADER_CRC_BUFFER (HW_HW_SECURE_INFO - 0x8) #define HOTSW_ROM_HEADER_CRC_BUFFER (HW_HW_SECURE_INFO - 0x6) #define HOTSW_SECURE1_CRC_BUFFER (HW_HW_SECURE_INFO - 0x4) #define HOTSW_SECURE2_CRC_BUFFER (HW_HW_SECURE_INFO - 0x2) @@ -1926,7 +1932,8 @@ static void ForceNormalModeToFinalize(void) *---------------------------------------------------------------------------*/ static BOOL ChangeCardMode(BOOL forceNtrMode) { - HotSwState state; + HotSwState state = HOTSW_SUCCESS; + HotSwState retval = HOTSW_SUCCESS; // カードのロック CARD_LockRom(s_CardLockID); @@ -1943,11 +1950,19 @@ static BOOL ChangeCardMode(BOOL forceNtrMode) // ---------------------- Normal Mode ---------------------- state = LoadTable(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + state = ReadIDNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + state = ReadBootSegNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; // RomHeaderのCRC16の値を計算 - *(u16 *)HOTSW_ROM_HEADER_CRC_BUFFER = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); + *(u16 *)HOTSW_ROM_HEADER_CRC_BUFFER = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); + + // 拡張RomHeaderのCRC16の値を計算(0x0000_0160〜0x0000_0fff) + *(u16 *)HOTSW_EXT_ROM_HEADER_CRC_BUFFER = SVC_GetCRC16( 65535, (u8 *)((u8 *)s_cbData.pBootSegBuf + 0x160), 0x0ea0 ); if(s_isRomEmu){ s_cbData.cardType = ROM_EMULATION; @@ -1964,11 +1979,21 @@ static BOOL ChangeCardMode(BOOL forceNtrMode) MakeBlowfishTableDS(&s_cbData, 8); GenVA_VB_VD(); + state = ChangeModeNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Secure Mode ---------------------- state = ReadSecureModeCardData(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; +#ifdef HOTSW_CARD_TESTER_DEBUG + if(retval != HOTSW_SUCCESS) + { + *(u16 *)HOTSW_ERROR_BUFFER |= 0x0010; + } +#endif + // Secure SegmentのCRC16の計算と格納 *(u16 *)HOTSW_SECURE1_CRC_BUFFER = SVC_GetCRC16( 65535, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE ); @@ -1976,7 +2001,7 @@ static BOOL ChangeCardMode(BOOL forceNtrMode) // TWLカード → Game2モード // NTRカード → Gameモード // アプリジャンプ → Gameモード - if(!forceNtrMode && s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ + if(!forceNtrMode && (s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK) && (s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL)){ s_cbData.modeType = HOTSW_MODE2; OS_PutString("---------- Game2 Mode...\n"); @@ -1986,17 +2011,30 @@ static BOOL ChangeCardMode(BOOL forceNtrMode) McPowerOn(); // ---------------------- Normal Mode ---------------------- - state = ReadSecureModeCardData(); +// state = ReadSecureModeCardData(); + state = ReadBootSegNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; MakeBlowfishTableTWL(&s_cbData, 8, s_bondingOp); // s_bondingOpの値はHotSw_Initで格納される GenVA_VB_VD(); state = ChangeModeNormal2(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Secure2 Mode ---------------------- state = ReadSecureModeCardData(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; +#ifdef HOTSW_CARD_TESTER_DEBUG + *(u16 *)HOTSW_SECURE_ID_BUFFER = (u16)s_cbData.id_nml; + + if(retval != HOTSW_SUCCESS) + { + *(u16 *)HOTSW_ERROR_BUFFER |= 0x0100; + } +#endif + // Secure SegmentのCRC16の計算と格納 *(u16 *)HOTSW_SECURE2_CRC_BUFFER = SVC_GetCRC16( 65535, s_cbData.pSecure2SegBuf, SECURE_SEGMENT_SIZE ); } @@ -2005,14 +2043,23 @@ static BOOL ChangeCardMode(BOOL forceNtrMode) } state = s_funcTable[s_isRomEmu].ChangeMode_S(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Game2 Mode ---------------------- state = ReadIDGame(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; if(s_cbData.id_nml != s_cbData.id_gam){ - state = HOTSW_ID_CHECK_ERROR; + retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; } +#ifdef HOTSW_CARD_TESTER_DEBUG + if(retval != HOTSW_SUCCESS) + { + *(u16 *)HOTSW_ERROR_BUFFER |= 0x1000; + } +#endif + #ifdef USE_NEW_DMA HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO); #else @@ -2024,7 +2071,11 @@ static BOOL ChangeCardMode(BOOL forceNtrMode) // カードのアンロック CARD_UnlockRom(s_CardLockID); - if(state == HOTSW_SUCCESS){ +#ifdef HOTSW_CARD_TESTER_DEBUG + *(u16 *)HOTSW_ERROR_BUFFER |= retval; +#endif + + if(retval == HOTSW_SUCCESS){ return TRUE; } else{ diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index a3a98db6..87aeef9d 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -442,10 +442,10 @@ static TitleProperty *SYSMi_CheckShortcutBoot1( void ) // 量産工程用ショートカットキー or // 検査カード起動 //----------------------------------------------------- - if( SYSM_IsInspectCard() || + if( SYSM_IsInspectCard() /*|| ( ( PAD_Read() == SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) && ( !LCFG_TSD_IsFinishedBrokenTWLSettings() || !LCFG_TSD_IsFinishedInitialSetting() || !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) ) - ){ + */){ return SYSMi_ShortcutCardBootSub(); } //----------------------------------------------------- diff --git a/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher b/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher index ef26975c..cc428a9c 100644 --- a/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher +++ b/build/systemMenu_RED/Launcher/ARM9/commondefs.launcher @@ -24,7 +24,7 @@ export SYSM_DISABLE_WDS_SCAN = FALSE export SYSM_DISABLE_WLFIRM_LOAD = FALSE export SYSM_DISABLE_INITIAL_SETTINGS = TRUE export SYSM_IGNORE_WLFIRM_SIGNCHECK = FALSE -export SYSM_BUILD_FOR_PRODUCTION_TEST = FALSE +export SYSM_BUILD_FOR_PRODUCTION_TEST = TRUE # 2009/1/8 とりあえず修正 endif diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index f02059f6..61d9e474 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -39,6 +39,7 @@ // define data----------------------------------------------------------------- #define INIT_DEVICES_LIKE_UIG_LAUNCHER +#define FOR_TWL_CARD_TESTER_BUILD // デバッグ用時間計測スイッチ #define MEASURE_TIME 1 @@ -59,6 +60,10 @@ static void PrintPause(void); static void PrintError(void); static void PrintSystemMenuVersion( void ); static void CreateDummyWrapFile( void ); +#ifdef FOR_TWL_CARD_TESTER_BUILD +static BOOL IsRunOnChecker(void); +static asm void EnableAccessExMainMEM(void); +#endif // global variable------------------------------------------------------------- @@ -125,7 +130,9 @@ static const char *fatal_error_msg[FATAL_ERROR_MAX] = "LOAD_AUTH_HEADER_FAILED", "LOAD_NEVER_STARTED", "EJECT_CARD_AFTER_LOAD_START", - "TITLEID_COMPARE_FAILED_NTR" + "TITLEID_COMPARE_FAILED_NTR", + "NOT_FOUND_BOOT_APPLICATION", // 2009/1/8 追加 + "NOT_RUN_ON_CHECKER" // 2009/2/26 追加 }; //#define DEBUG_LAUNCHER_DUMP @@ -352,29 +359,36 @@ void TwlMain( void ) // ・NANDアプリリスト作成関数は同期版を使う sp_titleList = SYSM_GetNandTitleList(); +#ifdef FOR_TWL_CARD_TESTER_BUILD + // ・プロテクションユニットの変更 + EnableAccessExMainMEM(); + + // ・検査器で動作しているか調べる + if( !IsRunOnChecker() ) + { + UTL_SetFatalError( FATAL_ERROR_NOT_RUN_ON_CHECKER ); + } +#endif + // アプリジャンプでない場合 if( !pBootTitle ) { // 特定のNANDアプリがあるかどうかチェック u32 i; - u32 index = 0; - BOOL isCheckProgram = FALSE; for(i = 0; i < LAUNCHER_TITLE_LIST_NUM; i++){ TitleID_HiLo tempID = *(TitleID_HiLo *)(&sp_titleList[i].titleID); if(sp_titleList[i].titleID){ // 特定のNANDアプリがあった場合は if(tempID.Lo[0] == 'A' && tempID.Lo[1] == 'C' && tempID.Lo[2] == 'T' && tempID.Lo[3] == '0'){ - isCheckProgram = TRUE; - index = i; + pBootTitle = &sp_titleList[i]; + pBootTitle->flags.isLogoSkip = TRUE; } } } - // ・NANDアプリに検査プログラムがある → NANDアプリをダイレクトブート - // ・NANDアプリに検査プログラムがない → ランチャ起動 - if(isCheckProgram){ - pBootTitle = &sp_titleList[index]; - pBootTitle->flags.isLogoSkip = TRUE; + // // 2009/1/8 追加 特定のNANDアプリがなかった場合はFatal Errorを発生させる + if( !pBootTitle ){ + UTL_SetFatalError( FATAL_ERROR_NOT_FOUND_BOOT_APPLICATION ); } } // アプリジャンプの場合 @@ -457,11 +471,11 @@ void TwlMain( void ) } #ifdef SYSM_BUILD_FOR_PRODUCTION_TEST - if( !pBootTitle || +/* if( !pBootTitle || ( pBootTitle && ( pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_ROM ) ) ) { state = STOP; - } + }*/ #endif // SYSM_BUILD_FOR_PRODUCTION_TEST // チャンネルをロックする @@ -812,3 +826,62 @@ static void INTR_VBlank(void) OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット } + +/*---------------------------------------------------------------------------* + Desc: プログラムが検査器上で動作しているか? + 拡張メインメモリのアドレスにマッピングされた検査器レジスタを確認する。 + + Args: なし + + Rtns: ASCIIコードで"TCAT"がリード出来ればTRUEを返す。 +    値が異なる場合は検査器上で動作していないとみなし、FALSEを返す。 + *---------------------------------------------------------------------------*/ +#ifdef FOR_TWL_CARD_TESTER_BUILD +// 検査器のレジスタ定義 +#define REG_TCAT_CHECKER_ID_L ((vu16 *)0x0d000d00) +#define REG_TCAT_CHECKER_ID_H ((vu16 *)0x0d000d02) + +static BOOL IsRunOnChecker(void) +{ + const int correct_cid = 0x54434154; // ASCIIコード”TCAT” + u32 cid; + + cid = (*REG_TCAT_CHECKER_ID_L | (*REG_TCAT_CHECKER_ID_H << 16)); + + return (cid == correct_cid) ? TRUE : FALSE; +} +#endif + +/*---------------------------------------------------------------------------* + Desc: 拡張メインメモリ(c3)領域にアクセスするためにプロテクションユニットの変更      +    キャッシュ・ライトバッファは無効 + +  ※ポートチェッカの操作ミスでフリーズするのを避けるため、0x0c0000000から32MB分に設定 + + Args: なし + + Rtns: なし + *---------------------------------------------------------------------------*/ +#ifdef FOR_TWL_CARD_TESTER_BUILD +#define SET_PROTECTION_A( id, adr, siz ) ldconst r0, #(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE) +#define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0 +#define REGION_BIT(a, b, c, d, e, f, g, h) (((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7)) +static asm void EnableAccessExMainMEM(void){ + SET_PROTECTION_A( c3, 0x0c000000, 32MB ) + SET_PROTECTION_B( c3, 0x0c000000, 32MB ) + + /* 命令キャッシュ許可 */ + mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 1, 0) + mcr p15, 0, r0, c2, c0, 1 + + /* データキャッシュ許可 */ + mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 1, 0) + mcr p15, 0, r0, c2, c0, 0 + + /* ライトバッファ許可 */ + mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 0, 0) + mcr p15, 0, r0, c3, c0, 0 + + bx lr +} +#endif diff --git a/include/sysmenu.h b/include/sysmenu.h index 909e49df..9dc8a41b 100644 --- a/include/sysmenu.h +++ b/include/sysmenu.h @@ -19,6 +19,8 @@ // Compile switch---------------------- //#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。 +#define SYSM_DISABLE_WLFIRM_LOAD +#define SYSM_BUILD_FOR_PRODUCTION_TEST // 2009/1/8 追加 //------------------------------------- diff --git a/include/sysmenu/util.h b/include/sysmenu/util.h index 34df2d31..92ae61f2 100644 --- a/include/sysmenu/util.h +++ b/include/sysmenu/util.h @@ -81,7 +81,13 @@ typedef enum FatalErrorCode { FATAL_ERROR_EJECT_CARD_AFTER_LOAD_START = 49, FATAL_ERROR_TITLEID_COMPARE_FAILED_NTR = 50, - FATAL_ERROR_MAX = 51 + // 2009/1/ 8 追加 TWL Card Test Launcher のみ存在するFatal Error + FATAL_ERROR_NOT_FOUND_BOOT_APPLICATION = 51, + + // 2009/2/26 追加 検査器で動作していない場合のFatal Error + FATAL_ERROR_NOT_RUN_ON_CHECKER = 52, + + FATAL_ERROR_MAX = 53 }FatalErrorCode;