・検査器ブートチェック

・Ext Rom Header CRCの計算サイズ修正
・Game2モードに移行する際のpage 0読みを正しく修正。
・hotswのfinalize処理のエラーチェックをしっかりと。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20081031_TwlCard_Tester@2810 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-04-22 00:24:01 +00:00
parent cc0385ef90
commit 8874af65e4
6 changed files with 155 additions and 23 deletions

View File

@ -25,6 +25,7 @@
//#define HOTSW_DISABLE_FORCE_CARD_OFF //#define HOTSW_DISABLE_FORCE_CARD_OFF
#define HOTSW_CHECK_CREATE_MONITOR_THREAD #define HOTSW_CHECK_CREATE_MONITOR_THREAD
#define HOTSW_CARD_TESTER_DEBUG
// カード電源ONからROMヘッダロードまでの期間にスリープに入る時のワンセグ対策しない場合 // カード電源ONからROMヘッダロードまでの期間にスリープに入る時のワンセグ対策しない場合
//#define HOWSW_ENABLE_DEEP_SLEEP_WHILE_INSERT_CARD //#define HOWSW_ENABLE_DEEP_SLEEP_WHILE_INSERT_CARD
@ -59,7 +60,12 @@
#define HOTSW_EXMEMCNT_SELB_SHIFT 10 #define HOTSW_EXMEMCNT_SELB_SHIFT 10
#endif #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_ROM_HEADER_CRC_BUFFER (HW_HW_SECURE_INFO - 0x6)
#define HOTSW_SECURE1_CRC_BUFFER (HW_HW_SECURE_INFO - 0x4) #define HOTSW_SECURE1_CRC_BUFFER (HW_HW_SECURE_INFO - 0x4)
#define HOTSW_SECURE2_CRC_BUFFER (HW_HW_SECURE_INFO - 0x2) #define HOTSW_SECURE2_CRC_BUFFER (HW_HW_SECURE_INFO - 0x2)
@ -1926,7 +1932,8 @@ static void ForceNormalModeToFinalize(void)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static BOOL ChangeCardMode(BOOL forceNtrMode) static BOOL ChangeCardMode(BOOL forceNtrMode)
{ {
HotSwState state; HotSwState state = HOTSW_SUCCESS;
HotSwState retval = HOTSW_SUCCESS;
// カードのロック // カードのロック
CARD_LockRom(s_CardLockID); CARD_LockRom(s_CardLockID);
@ -1943,11 +1950,19 @@ static BOOL ChangeCardMode(BOOL forceNtrMode)
// ---------------------- Normal Mode ---------------------- // ---------------------- Normal Mode ----------------------
state = LoadTable(); state = LoadTable();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
state = ReadIDNormal(&s_cbData); state = ReadIDNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
state = ReadBootSegNormal(&s_cbData); state = ReadBootSegNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// RomHeaderのCRC16の値を計算 // 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_01600x0000_0fff)
*(u16 *)HOTSW_EXT_ROM_HEADER_CRC_BUFFER = SVC_GetCRC16( 65535, (u8 *)((u8 *)s_cbData.pBootSegBuf + 0x160), 0x0ea0 );
if(s_isRomEmu){ if(s_isRomEmu){
s_cbData.cardType = ROM_EMULATION; s_cbData.cardType = ROM_EMULATION;
@ -1964,11 +1979,21 @@ static BOOL ChangeCardMode(BOOL forceNtrMode)
MakeBlowfishTableDS(&s_cbData, 8); MakeBlowfishTableDS(&s_cbData, 8);
GenVA_VB_VD(); GenVA_VB_VD();
state = ChangeModeNormal(&s_cbData); state = ChangeModeNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Secure Mode ---------------------- // ---------------------- Secure Mode ----------------------
state = ReadSecureModeCardData(); 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の計算と格納 // Secure SegmentのCRC16の計算と格納
*(u16 *)HOTSW_SECURE1_CRC_BUFFER = SVC_GetCRC16( 65535, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE ); *(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モード // TWLカード → Game2モード
// NTRカード → Gameモード // NTRカード → Gameモード
// アプリジャンプ → 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; s_cbData.modeType = HOTSW_MODE2;
OS_PutString("---------- Game2 Mode...\n"); OS_PutString("---------- Game2 Mode...\n");
@ -1986,17 +2011,30 @@ static BOOL ChangeCardMode(BOOL forceNtrMode)
McPowerOn(); McPowerOn();
// ---------------------- Normal Mode ---------------------- // ---------------------- 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で格納される MakeBlowfishTableTWL(&s_cbData, 8, s_bondingOp); // s_bondingOpの値はHotSw_Initで格納される
GenVA_VB_VD(); GenVA_VB_VD();
state = ChangeModeNormal2(&s_cbData); state = ChangeModeNormal2(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Secure2 Mode ---------------------- // ---------------------- Secure2 Mode ----------------------
state = ReadSecureModeCardData(); 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の計算と格納 // Secure SegmentのCRC16の計算と格納
*(u16 *)HOTSW_SECURE2_CRC_BUFFER = SVC_GetCRC16( 65535, s_cbData.pSecure2SegBuf, SECURE_SEGMENT_SIZE ); *(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); state = s_funcTable[s_isRomEmu].ChangeMode_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Game2 Mode ---------------------- // ---------------------- Game2 Mode ----------------------
state = ReadIDGame(&s_cbData); state = ReadIDGame(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
if(s_cbData.id_nml != s_cbData.id_gam){ 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 #ifdef USE_NEW_DMA
HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO); HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO);
#else #else
@ -2024,7 +2071,11 @@ static BOOL ChangeCardMode(BOOL forceNtrMode)
// カードのアンロック // カードのアンロック
CARD_UnlockRom(s_CardLockID); 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; return TRUE;
} }
else{ else{

View File

@ -442,10 +442,10 @@ static TitleProperty *SYSMi_CheckShortcutBoot1( void )
// 量産工程用ショートカットキー or // 量産工程用ショートカットキー or
// 検査カード起動 // 検査カード起動
//----------------------------------------------------- //-----------------------------------------------------
if( SYSM_IsInspectCard() || if( SYSM_IsInspectCard() /*||
( ( PAD_Read() == SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) && ( ( PAD_Read() == SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) &&
( !LCFG_TSD_IsFinishedBrokenTWLSettings() || !LCFG_TSD_IsFinishedInitialSetting() || !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) ) ( !LCFG_TSD_IsFinishedBrokenTWLSettings() || !LCFG_TSD_IsFinishedInitialSetting() || !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) )
){ */){
return SYSMi_ShortcutCardBootSub(); return SYSMi_ShortcutCardBootSub();
} }
//----------------------------------------------------- //-----------------------------------------------------

View File

@ -24,7 +24,7 @@ export SYSM_DISABLE_WDS_SCAN = FALSE
export SYSM_DISABLE_WLFIRM_LOAD = FALSE export SYSM_DISABLE_WLFIRM_LOAD = FALSE
export SYSM_DISABLE_INITIAL_SETTINGS = TRUE export SYSM_DISABLE_INITIAL_SETTINGS = TRUE
export SYSM_IGNORE_WLFIRM_SIGNCHECK = FALSE export SYSM_IGNORE_WLFIRM_SIGNCHECK = FALSE
export SYSM_BUILD_FOR_PRODUCTION_TEST = FALSE export SYSM_BUILD_FOR_PRODUCTION_TEST = TRUE # 2009/1/8 とりあえず修正
endif endif

View File

@ -39,6 +39,7 @@
// define data----------------------------------------------------------------- // define data-----------------------------------------------------------------
#define INIT_DEVICES_LIKE_UIG_LAUNCHER #define INIT_DEVICES_LIKE_UIG_LAUNCHER
#define FOR_TWL_CARD_TESTER_BUILD
// デバッグ用時間計測スイッチ // デバッグ用時間計測スイッチ
#define MEASURE_TIME 1 #define MEASURE_TIME 1
@ -59,6 +60,10 @@ static void PrintPause(void);
static void PrintError(void); static void PrintError(void);
static void PrintSystemMenuVersion( void ); static void PrintSystemMenuVersion( void );
static void CreateDummyWrapFile( void ); static void CreateDummyWrapFile( void );
#ifdef FOR_TWL_CARD_TESTER_BUILD
static BOOL IsRunOnChecker(void);
static asm void EnableAccessExMainMEM(void);
#endif
// global variable------------------------------------------------------------- // global variable-------------------------------------------------------------
@ -125,7 +130,9 @@ static const char *fatal_error_msg[FATAL_ERROR_MAX] =
"LOAD_AUTH_HEADER_FAILED", "LOAD_AUTH_HEADER_FAILED",
"LOAD_NEVER_STARTED", "LOAD_NEVER_STARTED",
"EJECT_CARD_AFTER_LOAD_START", "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 //#define DEBUG_LAUNCHER_DUMP
@ -352,29 +359,36 @@ void TwlMain( void )
// ・NANDアプリリスト作成関数は同期版を使う // ・NANDアプリリスト作成関数は同期版を使う
sp_titleList = SYSM_GetNandTitleList(); sp_titleList = SYSM_GetNandTitleList();
#ifdef FOR_TWL_CARD_TESTER_BUILD
// ・プロテクションユニットの変更
EnableAccessExMainMEM();
// ・検査器で動作しているか調べる
if( !IsRunOnChecker() )
{
UTL_SetFatalError( FATAL_ERROR_NOT_RUN_ON_CHECKER );
}
#endif
// アプリジャンプでない場合 // アプリジャンプでない場合
if( !pBootTitle ) { if( !pBootTitle ) {
// 特定のNANDアプリがあるかどうかチェック // 特定のNANDアプリがあるかどうかチェック
u32 i; u32 i;
u32 index = 0;
BOOL isCheckProgram = FALSE;
for(i = 0; i < LAUNCHER_TITLE_LIST_NUM; i++){ for(i = 0; i < LAUNCHER_TITLE_LIST_NUM; i++){
TitleID_HiLo tempID = *(TitleID_HiLo *)(&sp_titleList[i].titleID); TitleID_HiLo tempID = *(TitleID_HiLo *)(&sp_titleList[i].titleID);
if(sp_titleList[i].titleID){ if(sp_titleList[i].titleID){
// 特定のNANDアプリがあった場合は // 特定のNANDアプリがあった場合は
if(tempID.Lo[0] == 'A' && tempID.Lo[1] == 'C' && tempID.Lo[2] == 'T' && tempID.Lo[3] == '0'){ if(tempID.Lo[0] == 'A' && tempID.Lo[1] == 'C' && tempID.Lo[2] == 'T' && tempID.Lo[3] == '0'){
isCheckProgram = TRUE; pBootTitle = &sp_titleList[i];
index = i; pBootTitle->flags.isLogoSkip = TRUE;
} }
} }
} }
// ・NANDアプリに検査プログラムがある → NANDアプリをダイレクトブート // // 2009/1/8 追加 特定のNANDアプリがなかった場合はFatal Errorを発生させる
// ・NANDアプリに検査プログラムがない → ランチャ起動 if( !pBootTitle ){
if(isCheckProgram){ UTL_SetFatalError( FATAL_ERROR_NOT_FOUND_BOOT_APPLICATION );
pBootTitle = &sp_titleList[index];
pBootTitle->flags.isLogoSkip = TRUE;
} }
} }
// アプリジャンプの場合 // アプリジャンプの場合
@ -457,11 +471,11 @@ void TwlMain( void )
} }
#ifdef SYSM_BUILD_FOR_PRODUCTION_TEST #ifdef SYSM_BUILD_FOR_PRODUCTION_TEST
if( !pBootTitle || /* if( !pBootTitle ||
( pBootTitle && ( pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_ROM ) ) ( pBootTitle && ( pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_ROM ) )
) { ) {
state = STOP; state = STOP;
} }*/
#endif // SYSM_BUILD_FOR_PRODUCTION_TEST #endif // SYSM_BUILD_FOR_PRODUCTION_TEST
// チャンネルをロックする // チャンネルをロックする
@ -812,3 +826,62 @@ static void INTR_VBlank(void)
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット 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     
    
  0x0c000000032MB分に設定
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

View File

@ -19,6 +19,8 @@
// Compile switch---------------------- // Compile switch----------------------
//#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。 //#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。
#define SYSM_DISABLE_WLFIRM_LOAD
#define SYSM_BUILD_FOR_PRODUCTION_TEST // 2009/1/8 ’ljÁ
//------------------------------------- //-------------------------------------

View File

@ -81,7 +81,13 @@ typedef enum FatalErrorCode {
FATAL_ERROR_EJECT_CARD_AFTER_LOAD_START = 49, FATAL_ERROR_EJECT_CARD_AFTER_LOAD_START = 49,
FATAL_ERROR_TITLEID_COMPARE_FAILED_NTR = 50, 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; }FatalErrorCode;