・検査器ブートチェック

・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_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_01600x0000_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{

View File

@ -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();
}
//-----------------------------------------------------

View File

@ -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

View File

@ -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     
    
  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----------------------
//#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_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;