mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・検査器ブートチェック
・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:
parent
cc0385ef90
commit
8874af65e4
@ -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{
|
||||
|
||||
@ -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();
|
||||
}
|
||||
//-----------------------------------------------------
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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Á
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user