diff --git a/build/libraries_sysmenu/hotsw/ARM7/Makefile b/build/libraries_sysmenu/hotsw/ARM7/Makefile index 092ee1f6..821d9615 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/Makefile +++ b/build/libraries_sysmenu/hotsw/ARM7/Makefile @@ -38,6 +38,11 @@ SRCS = blowfish.c \ TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a +ifneq ($(DHT_TEST),) +SRCDIR += ../../../tests/CheckDSHashTable/src +SRCS += dht.c +MACRO_FLAGS += -DDHT_TEST +endif include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 79853d79..251e7bde 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -10,18 +10,18 @@ not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include <../build/libraries/mb/common/include/mb_fileinfo.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include <../build/libraries/mb/common/include/mb_fileinfo.h> #define DEBUG_MODE @@ -29,28 +29,28 @@ //#define HOWSW_ENABLE_DEEP_SLEEP_WHILE_INSERT_CARD // define ------------------------------------------------------------------- -#define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us) -#define COUNTER_A 0x51C // 20ms分 ( 0x51C * 15.3us = 20012us) +#define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us) +#define COUNTER_A 0x51C // 20ms分 ( 0x51C * 15.3us = 20012us) -#define CARD_EXIST_CHECK_INTERVAL 200 +#define CARD_EXIST_CHECK_INTERVAL 200 -#define UNDEF_CODE 0xe7ffdeff // 未定義コード -#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB +#define UNDEF_CODE 0xe7ffdeff // 未定義コード +#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB -#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8) +#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8) -#define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF +#define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF -#define HOTSW_DSTV_GAME_CODE 'JSNU' +#define HOTSW_DSTV_GAME_CODE 'JSNU' #ifdef SDK_ARM9 -#define reg_HOTSW_EXMEMCNT reg_MI_EXMEMCNT -#define HOTSW_EXMEMCNT_SELB_MASK REG_MI_EXMEMCNT_MPB_MASK -#define HOTSW_EXMEMCNT_SELB_SHIFT REG_MI_EXMEMCNT_MPB_SHIFT +#define reg_HOTSW_EXMEMCNT reg_MI_EXMEMCNT +#define HOTSW_EXMEMCNT_SELB_MASK REG_MI_EXMEMCNT_MPB_MASK +#define HOTSW_EXMEMCNT_SELB_SHIFT REG_MI_EXMEMCNT_MPB_SHIFT #else // SDK_ARM7 -#define reg_HOTSW_EXMEMCNT reg_MI_EXMEMCNT_L -#define HOTSW_EXMEMCNT_SELB_MASK 0x0400 -#define HOTSW_EXMEMCNT_SELB_SHIFT 10 +#define reg_HOTSW_EXMEMCNT reg_MI_EXMEMCNT_L +#define HOTSW_EXMEMCNT_SELB_MASK 0x0400 +#define HOTSW_EXMEMCNT_SELB_SHIFT 10 #endif // Function prototype ------------------------------------------------------- @@ -80,7 +80,7 @@ static void McPowerOn(void); static void McPowerOff(void); static void SetMCSCR(void); -static BOOL isTwlModeLoad(void); +static BOOL isTwlModeLoad(void); static HotSwState ReadSecureModeCardData(void); static void GenVA_VB_VD(void); @@ -109,77 +109,88 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode); // Static Values ------------------------------------------------------------ #include -static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj"; +static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj"; -static u16 s_RscLockID; -static u16 s_CardLockID; -static u16 s_bondingOp; +static u16 s_RscLockID; +static u16 s_CardLockID; +static u16 s_bondingOp; -static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize; +static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize; -static BootSegmentData *s_pBootSegBuffer; -static u32 *s_pSecureSegBuffer; -static u32 *s_pSecure2SegBuffer; +static BootSegmentData *s_pBootSegBuffer; +static u32 *s_pSecureSegBuffer; +static u32 *s_pSecure2SegBuffer; -static CardBootData s_cbData; +static CardBootData s_cbData; static SYSMRomEmuInfo s_romEmuInfo; static BOOL debuggerFlg; -static BOOL s_IsPulledOut = TRUE; -static BOOL s_isHotSwBusy = FALSE; +static BOOL s_IsPulledOut = TRUE; +static BOOL s_isHotSwBusy = FALSE; // HMACSHA1の鍵 static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { 0x21, 0x06, 0xc0, 0xde, - 0xba, 0x98, 0xce, 0x3f, - 0xa6, 0x92, 0xe3, 0x9d, - 0x46, 0xf2, 0xed, 0x01, + 0xba, 0x98, 0xce, 0x3f, + 0xa6, 0x92, 0xe3, 0x9d, + 0x46, 0xf2, 0xed, 0x01, - 0x76, 0xe3, 0xcc, 0x08, - 0x56, 0x23, 0x63, 0xfa, - 0xca, 0xd4, 0xec, 0xdf, - 0x9a, 0x62, 0x78, 0x34, + 0x76, 0xe3, 0xcc, 0x08, + 0x56, 0x23, 0x63, 0xfa, + 0xca, 0xd4, 0xec, 0xdf, + 0x9a, 0x62, 0x78, 0x34, - 0x8f, 0x6d, 0x63, 0x3c, - 0xfe, 0x22, 0xca, 0x92, - 0x20, 0x88, 0x97, 0x23, - 0xd2, 0xcf, 0xae, 0xc2, + 0x8f, 0x6d, 0x63, 0x3c, + 0xfe, 0x22, 0xca, 0x92, + 0x20, 0x88, 0x97, 0x23, + 0xd2, 0xcf, 0xae, 0xc2, - 0x32, 0x67, 0x8d, 0xfe, - 0xca, 0x83, 0x64, 0x98, - 0xac, 0xfd, 0x3e, 0x37, - 0x87, 0x46, 0x58, 0x24 + 0x32, 0x67, 0x8d, 0xfe, + 0xca, 0x83, 0x64, 0x98, + 0xac, 0xfd, 0x3e, 0x37, + 0x87, 0x46, 0x58, 0x24 }; static CardSecureModeFunction s_funcTable[] = { - // DS Card Type 1 + // DS Card Type 1 { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, - // DS Card Type 2 - { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, - // TWL Card Type 1 + // DS Card Type 2 { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, - // RomEmulation + // TWL Card Type 1 + { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, + // RomEmulation {ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU} }; +#ifdef DHT_TEST +#include +DHTFile* dht; +static void* ov_buffer = (void*)0x02e80000; +static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg) +{ + HotSwState retval = ReadPageGame((CardBootData*)arg, (u32)offset, dest, (u32)length); + return (retval == HOTSW_SUCCESS); +} +#endif + // Global Values ------------------------------------------------------------ -BLOWFISH_CTX HotSwBlowfishInitTableBufDS; -CardThreadData HotSwThreadData; +BLOWFISH_CTX HotSwBlowfishInitTableBufDS; +CardThreadData HotSwThreadData; #include // =========================================================================== -// Function Describe +// Function Describe // =========================================================================== /*---------------------------------------------------------------------------* Name: HOTSW_Init - Description: + Description: *---------------------------------------------------------------------------*/ void HOTSW_Init(u32 threadPrio) { - OS_InitTick(); + OS_InitTick(); OS_InitThread(); #ifndef USE_LOCAL_KEYTABLE @@ -187,50 +198,50 @@ void HOTSW_Init(u32 threadPrio) MI_CpuCopyFast((void *)HW_WRAM_0_LTD, &HotSwBlowfishInitTableBufDS, sizeof(BLOWFISH_CTX)); #endif // PXI初期化 - PXI_Init(); - PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi); - - // 割り込みマスクの設定 - SetInterrupt(); + PXI_Init(); + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi); + + // 割り込みマスクの設定 + SetInterrupt(); // 割り込みの有効化 (void)OS_EnableIrq(); (void)OS_EnableInterrupts(); - // チャッタリングカウンタの値を設定 + // チャッタリングカウンタの値を設定 reg_MI_MC1 = (u32)((reg_MI_MC1 & ~REG_MI_MC1_CC_MASK) | (CHATTERING_COUNTER << REG_MI_MC1_CC_SHIFT)); - // Counter-Aの値を設定 + // Counter-Aの値を設定 reg_MI_MC2 = COUNTER_A; - // Bonding Optionの取得 + // Bonding Optionの取得 s_bondingOp = SCFG_REG_GetBondingOption(); - - // 構造体の初期化 - MI_CpuClear8(&s_cbData, sizeof(CardBootData)); + + // 構造体の初期化 + MI_CpuClear8(&s_cbData, sizeof(CardBootData)); // カードスレッド用構造体の初期化 - MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData)); + MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData)); - // HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける) + // HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける) { s32 tempLockID; // ARM9と排他制御用のロックIDの取得 while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){ - OS_PutString("Error - Can't Get Lock ID\n"); + OS_PutString("Error - Can't Get Lock ID\n"); } - s_RscLockID = (u16)tempLockID; + s_RscLockID = (u16)tempLockID; // カードアクセス用のロックIDの取得 while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){ - OS_PutString("Error - Can't Get Lock ID\n"); + OS_PutString("Error - Can't Get Lock ID\n"); } - s_CardLockID = (u16)tempLockID; + s_CardLockID = (u16)tempLockID; } - - // カードデータロード用スレッドの生成 - OS_CreateThread(&HotSwThreadData.hotswThread, + + // カードデータロード用スレッドの生成 + OS_CreateThread(&HotSwThreadData.hotswThread, HotSwThread, NULL, HotSwThreadData.hotswStack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), @@ -238,45 +249,45 @@ void HOTSW_Init(u32 threadPrio) threadPrio ); - // カードの状態監視用スレッドの生成 ( DSテレビ対策 ) + // カードの状態監視用スレッドの生成 ( DSテレビ対策 ) // [TODO] 優先度の設定 - OS_CreateThread(&HotSwThreadData.monitorThread, + OS_CreateThread(&HotSwThreadData.monitorThread, MonitorThread, NULL, HotSwThreadData.monitorStack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), HOTSW_THREAD_STACK_SIZE, threadPrio ); - - // メッセージキューの初期化 - OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); // メッセージキューの初期化 - OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); - + OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); + + // メッセージキューの初期化 + OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); + // スレッド起動 OS_WakeupThreadDirect(&HotSwThreadData.hotswThread); - OS_WakeupThreadDirect(&HotSwThreadData.monitorThread); - + OS_WakeupThreadDirect(&HotSwThreadData.monitorThread); + // Boot Segment バッファの設定 - HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); + HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); // Secure1 Segment バッファの設定 HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); // Secure2 Segment バッファの設定 HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); - + // カードが挿さってあったらスレッドを起動する - if(HOTSW_IsCardExist()){ - // メッセージ送信 - OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); + if(HOTSW_IsCardExist()){ + // メッセージ送信 + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; - } + } else{ - SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; + SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; } } @@ -291,63 +302,63 @@ void HOTSW_Init(u32 threadPrio) *---------------------------------------------------------------------------*/ static HotSwState LoadCardData(void) { - OSTick start; - HotSwState retval = HOTSW_SUCCESS; + OSTick start; + HotSwState retval = HOTSW_SUCCESS; HotSwState state = HOTSW_SUCCESS; u32 romMode = HOTSW_ROM_MODE_NULL; start = OS_GetTick(); s_isHotSwBusy = TRUE; - - // カードのロック + + // カードのロック #ifndef DEBUG_USED_CARD_SLOT_B_ - CARD_LockRom(s_CardLockID); + CARD_LockRom(s_CardLockID); #else - LockExCard(s_CardLockID); + LockExCard(s_CardLockID); #endif // カード電源リセット - McPowerOff(); + McPowerOff(); #ifndef HOWSW_ENABLE_DEEP_SLEEP_WHILE_INSERT_CARD MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, FALSE ); #endif - McPowerOn(); - - // バッファを設定 + McPowerOn(); + + // バッファを設定 s_cbData.pBootSegBuf = s_pBootSegBuffer; s_cbData.pSecureSegBuf = s_pSecureSegBuffer; s_cbData.pSecure2SegBuf= s_pSecure2SegBuffer; // ロード処理開始 - if(HOTSW_IsCardAccessible()){ - s_cbData.modeType = HOTSW_MODE1; - - // カード側でKey Tableをロードする - state = LoadTable(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // ---------------------- Normal Mode ---------------------- - romMode = HOTSW_ROM_MODE_NORMAL; + if(HOTSW_IsCardAccessible()){ + s_cbData.modeType = HOTSW_MODE1; - // カードID読み込み - state = ReadIDNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM + // カード側でKey Tableをロードする + state = LoadTable(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // ---------------------- Normal Mode ---------------------- + romMode = HOTSW_ROM_MODE_NORMAL; + + // カードID読み込み + state = ReadIDNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; - - { + + { SYSMRomEmuInfo *romEmuInfo = (void *)&s_romEmuInfo; BOOL enableDeepSleep = TRUE; - - // バナーリードが完了して、フラグ処理が終わるまでARM9と排他制御する + + // バナーリードが完了して、フラグ処理が終わるまでARM9と排他制御する LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - - // Boot Segment読み込み - state = ReadBootSegNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - + + // Boot Segment読み込み + state = ReadBootSegNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + // ワンセグ差込み時はカードバス電源をディープスリープ(PFM)に入れない // (スリープ時シャットダウン対策。カードロード中にスリープしても良いように早目に設定) if ( *(u32*)(s_cbData.pBootSegBuf->rh.s.game_code) == HOTSW_DSTV_GAME_CODE ) @@ -355,156 +366,159 @@ static HotSwState LoadCardData(void) enableDeepSleep = FALSE; } MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, enableDeepSleep ); - + // ARM9/7で不整合が発生しないようにRomエミュレーション情報ロードは初回のみ if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked ) { - // Romエミュレーション情報を取得 - state = ReadRomEmulationInfo(&s_romEmuInfo); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + // Romエミュレーション情報を取得 + state = ReadRomEmulationInfo(&s_romEmuInfo); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // 取得したRomエミュレーション情報を比較 + debuggerFlg = TRUE; + if ( romEmuInfo->magic_code != SYSM_ROMEMU_INFO_MAGIC_CODE ){ + debuggerFlg = FALSE; + } + } - // 取得したRomエミュレーション情報を比較 - debuggerFlg = TRUE; - if ( romEmuInfo->magic_code != SYSM_ROMEMU_INFO_MAGIC_CODE ){ - debuggerFlg = FALSE; - } - } - // 初回のRomエミュレーション情報を使用 if(HOTSWi_IsRomEmulation()){ - OS_PutString("Read Emulation ROM\n"); - s_cbData.cardType = ROM_EMULATION; + OS_PutString("Read Emulation ROM\n"); + s_cbData.cardType = ROM_EMULATION; s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK; OS_TPrintf("SYSMi_GetWork()->gameCommondParam : 0x%08x\n", s_cbData.gameCommondParam); } else{ - s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param; + s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param; } - SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam; - - // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 - SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); - OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n", - SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 ); - - if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || - ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ - retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; - } - } - - if( retval == HOTSW_SUCCESS ) { - // NTRカードかTWLカードか + SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam; + + // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 + SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); + OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n", + SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 ); + + if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || + ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ + retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; + } + } + + if( retval == HOTSW_SUCCESS ) { + // NTRカードかTWLカードか #ifdef DEBUG_MODE if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset) #else - if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02) + if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02) #endif { - OS_TPrintf("TWL Card.\n"); - s_cbData.twlFlg = TRUE; - } + OS_TPrintf("TWL Card.\n"); + s_cbData.twlFlg = TRUE; + } else{ +#ifdef DHT_TEST + if ( !s_cbData.pBootSegBuf->rh.s.enable_signature ) +#endif // NTRカードの場合はRomHeaderバッファの1ページ目以降をクリアしておく。 MI_CpuClearFast((void *)(SYSM_CARD_ROM_HEADER_BAK + PAGE_SIZE), SYSM_CARD_ROM_HEADER_SIZE - PAGE_SIZE); } // SecureコマンドのPNG_ONコマンドetc用のレイテンシを求める(Latency1とLatency2を足す) - s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param); + s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param); - // Key Table初期化 - MakeBlowfishTableDS(&s_cbData, 8); + // Key Table初期化 + MakeBlowfishTableDS(&s_cbData, 8); - // コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成 + // コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成 GenVA_VB_VD(); - // セキュアモードに移行 - state = ChangeModeNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + // セキュアモードに移行 + state = ChangeModeNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; - // ---------------------- Secure Mode ---------------------- - romMode = HOTSW_ROM_MODE_SECURE; + // ---------------------- Secure Mode ---------------------- + romMode = HOTSW_ROM_MODE_SECURE; - // SecureモードのIDとSecureSegmentを読み込む - state = ReadSecureModeCardData(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + // SecureモードのIDとSecureSegmentを読み込む + state = ReadSecureModeCardData(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; - // ★TWLカード対応 一旦リセット後Secure2モードに移行 + // ★TWLカード対応 一旦リセット後Secure2モードに移行 // SCFG if((s_cbData.isLoadTypeTwl = isTwlModeLoad()) == TRUE){ OS_PutString("Read Mode : TwlCard\n"); - + // Mode2に移行する準備 - s_cbData.modeType = HOTSW_MODE2; + s_cbData.modeType = HOTSW_MODE2; // ---------------------- Reset ---------------------- - McPowerOff(); - McPowerOn(); + McPowerOff(); + McPowerOn(); // ---------------------- Normal Mode ---------------------- state = ReadIDNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // 先頭1Page分だけでOK。データは読み捨てバッファに + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // 先頭1Page分だけでOK。データは読み捨てバッファに state = ReadBootSegNormal(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - // Key Table初期化 - MakeBlowfishTableDS(&s_cbData, 8); + // Key Table初期化 + MakeBlowfishTableDS(&s_cbData, 8); - // コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成 - GenVA_VB_VD(); + // コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成 + GenVA_VB_VD(); - // セキュア2モードに移行 + // セキュア2モードに移行 state = ChangeModeNormal2(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - // ---------------------- Secure2 Mode ---------------------- - // Secure2モードのIDとSecureSegmentを読み込む - state = ReadSecureModeCardData(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + // ---------------------- Secure2 Mode ---------------------- + // Secure2モードのIDとSecureSegmentを読み込む + state = ReadSecureModeCardData(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; } - // ゲームモードに移行 - state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); + // ゲームモードに移行 + state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - // ---------------------- Game Mode ---------------------- - romMode = HOTSW_ROM_MODE_GAME; + // ---------------------- Game Mode ---------------------- + romMode = HOTSW_ROM_MODE_GAME; - // ID読み込み - state = ReadIDGame(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // バナーファイルの読み込み - state = LoadBannerData(); + // ID読み込み + state = ReadIDGame(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - // 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで) + // バナーファイルの読み込み + state = LoadBannerData(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで) UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); // カードIDの比較をして、一致しなければFALSEを返す if(s_cbData.id_scr != s_cbData.id_gam){ retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; - goto end; + goto end; } - // 常駐モジュール残りを指定先に転送 - state = LoadStaticModule(); + // 常駐モジュール残りを指定先に転送 + state = LoadStaticModule(); retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 - (void)DecryptObjectFile(); - // 認証コード読み込み&ワーク領域にコピー - state = CheckCardAuthCode(); + // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 + (void)DecryptObjectFile(); + + // 認証コード読み込み&ワーク領域にコピー + state = CheckCardAuthCode(); retval = (retval == HOTSW_SUCCESS) ? state : retval; - } + } else{ - // 排他制御ここまで(※CRCチェックまでにミスがあったら、ここで開放する) - UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - - OS_TPrintf("ng... Card Data Load Skip ( state : %d )\n", retval); + // 排他制御ここまで(※CRCチェックまでにミスがあったら、ここで開放する) + UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); + + OS_TPrintf("ng... Card Data Load Skip ( state : %d )\n", retval); } } else{ @@ -513,29 +527,29 @@ static HotSwState LoadCardData(void) } end: - if( retval == HOTSW_SUCCESS ) - { + if( retval == HOTSW_SUCCESS ) + { // バッドブロックを置換 - state = HOTSWi_RefreshBadBlock(romMode); + state = HOTSWi_RefreshBadBlock(romMode); retval = (retval == HOTSW_SUCCESS) ? state : retval; - } + } // カードDMA終了確認 HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); // カードアクセス終了確認 - HOTSW_WaitCardCtrl(); + HOTSW_WaitCardCtrl(); - // カードのロック開放(※ロックIDは開放せずに持ち続ける) + // カードのロック開放(※ロックIDは開放せずに持ち続ける) #ifndef DEBUG_USED_CARD_SLOT_B_ - CARD_UnlockRom(s_CardLockID); + CARD_UnlockRom(s_CardLockID); #else - UnlockExCard(s_CardLockID); + UnlockExCard(s_CardLockID); #endif - s_isHotSwBusy = FALSE; - -// OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); + s_isHotSwBusy = FALSE; + +// OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); return retval; } @@ -546,52 +560,52 @@ end: Description: カードのロードをTWLモードで行うかDSモードで行うかを決める - + ■ Bonding Op = 0 (製品版) - ソフトウェア |     DSカード | TWLカード - ------------------------------------------------------------------------ - DS用 | DSカード読みシーケンス | DSカード読みシーケンス(※1) - TWL用 | 不正カードフラグ立て | TWLカード読みシーケンス - ハイブリット | 不正カードフラグ立て | TWLカード読みシーケンス + ソフトウェア |     DSカード | TWLカード + ------------------------------------------------------------------------ + DS用 | DSカード読みシーケンス | DSカード読みシーケンス(※1) + TWL用 | 不正カードフラグ立て | TWLカード読みシーケンス + ハイブリット | 不正カードフラグ立て | TWLカード読みシーケンス ■ Bonding Op = 0以外 (開発用) - ソフトウェア |     DSカード | TWLカード - ------------------------------------------------------------------------ - DS用 | DSカード読みシーケンス | DSカード読みシーケンス(※1) - TWL用 | DSカード読みシーケンス | TWLカード読みシーケンス - ハイブリット | DSカード読みシーケンス | TWLカード読みシーケンス + ソフトウェア |     DSカード | TWLカード + ------------------------------------------------------------------------ + DS用 | DSカード読みシーケンス | DSカード読みシーケンス(※1) + TWL用 | DSカード読みシーケンス | TWLカード読みシーケンス + ハイブリット | DSカード読みシーケンス | TWLカード読みシーケンス ※1 [TODO] 動作に関してはカードGと相談して決める *---------------------------------------------------------------------------*/ -static BOOL isTwlModeLoad(void) +static BOOL isTwlModeLoad(void) { // TWLカード - if(s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ + if(s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ // PlatformCodeがTwl or Hybridの場合 if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ OS_PutString("TWL Card : TWL Application : Read Sequence -> TWL\n"); - return TRUE; + return TRUE; } else{ // [TODO] 仕様確認 OS_PutString("TWL Card : NTR Application : Read Sequence -> NTR\n"); - return FALSE; + return FALSE; } } // DSカード else{ // 製品版の場合 - if(s_bondingOp == SCFG_OP_PRODUCT){ - // PlatformCodeがTwl or Hybridの場合 + if(s_bondingOp == SCFG_OP_PRODUCT){ + // PlatformCodeがTwl or Hybridの場合 if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ OS_PutString("NTR Card : TWL Application : Illegal Card\n"); - s_cbData.illegalCardFlg = TRUE; + s_cbData.illegalCardFlg = TRUE; return FALSE; } else{ OS_PutString("NTR Card : NTR Application : Read Sequence -> NTR\n"); - return FALSE; + return FALSE; } } // 開発用の場合 @@ -612,28 +626,28 @@ static BOOL isTwlModeLoad(void) *---------------------------------------------------------------------------*/ static HotSwState ReadSecureModeCardData(void) { - HotSwState retval = HOTSW_SUCCESS; + HotSwState retval = HOTSW_SUCCESS; HotSwState state = HOTSW_SUCCESS; - - // PNG設定 - state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); + + // PNG設定 + state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - // DS側符号生成回路初期値設定 (レジスタ設定) - SetMCSCR(); + // DS側符号生成回路初期値設定 (レジスタ設定) + SetMCSCR(); - // ID読み込み - state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); + // ID読み込み + state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - + // カードIDの比較をして、一致しなければFALSEを返す if(s_cbData.id_nml != s_cbData.id_scr){ retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; } if(retval == HOTSW_SUCCESS){ - // Secure領域のSegment読み込み - state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); + // Secure領域のSegment読み込み + state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; } @@ -651,38 +665,38 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode) HotSwState retval = HOTSW_SUCCESS; HotSwState state = HOTSW_SUCCESS; - HotSwState (*pReadStatus)(CardBootData *cbd); - HotSwState (*pRefreshBadBlock)(CardBootData *cbd); + HotSwState (*pReadStatus)(CardBootData *cbd); + HotSwState (*pRefreshBadBlock)(CardBootData *cbd); - if ( ! ( romMode == HOTSW_ROM_MODE_NORMAL || romMode == HOTSW_ROM_MODE_GAME ) ) - { - return HOTSW_SUCCESS; - } + if ( ! ( romMode == HOTSW_ROM_MODE_NORMAL || romMode == HOTSW_ROM_MODE_GAME ) ) + { + return HOTSW_SUCCESS; + } - if ( romMode == HOTSW_ROM_MODE_NORMAL ) - { - pReadStatus = ReadStatusNormal; - pRefreshBadBlock = RefreshBadBlockNormal; - } - else - if ( romMode == HOTSW_ROM_MODE_GAME ) - { - pReadStatus = ReadStatusGame; - pRefreshBadBlock = RefreshBadBlockGame; - } + if ( romMode == HOTSW_ROM_MODE_NORMAL ) + { + pReadStatus = ReadStatusNormal; + pRefreshBadBlock = RefreshBadBlockNormal; + } + else + if ( romMode == HOTSW_ROM_MODE_GAME ) + { + pReadStatus = ReadStatusGame; + pRefreshBadBlock = RefreshBadBlockGame; + } // ステータス対応ROMのみステータス読み込み - if ( s_cbData.id_nml & HOTSW_ROMID_RFSSUP_MASK ) + if ( s_cbData.id_nml & HOTSW_ROMID_RFSSUP_MASK ) { state = pReadStatus(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; - // 要求レベルに関わらずバッドブロックを置換(製品カードでは滅多に発生しない) - if ( s_cbData.romStatus & (HOTSW_ROMST_RFS_WARN_L1_MASK | HOTSW_ROMST_RFS_WARN_L2_MASK) ) - { - state = pRefreshBadBlock(&s_cbData); + // 要求レベルに関わらずバッドブロックを置換(製品カードでは滅多に発生しない) + if ( s_cbData.romStatus & (HOTSW_ROMST_RFS_WARN_L1_MASK | HOTSW_ROMST_RFS_WARN_L2_MASK) ) + { + state = pRefreshBadBlock(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; } - } + } return retval; } @@ -695,7 +709,7 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode) *---------------------------------------------------------------------------*/ BOOL HOTSWi_IsRunOnDebugger(void) { - return debuggerFlg; + return debuggerFlg; } @@ -706,7 +720,7 @@ BOOL HOTSWi_IsRunOnDebugger(void) *---------------------------------------------------------------------------*/ BOOL HOTSWi_IsRomEmulation(void) { - return debuggerFlg && + return debuggerFlg && #ifndef DEBUG_USED_CARD_SLOT_B_ s_romEmuInfo.isEnableSlot1; #else @@ -725,23 +739,23 @@ BOOL HOTSWi_IsRomEmulation(void) static HotSwState LoadBannerData(void) { BOOL state; - HotSwState retval = HOTSW_SUCCESS; + HotSwState retval = HOTSW_SUCCESS; - // バナーリード - if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { - retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset, - (u32 *)SYSM_CARD_BANNER_BUF, - sizeof(TWLBannerFile) ); + // バナーリード + if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { + retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset, + (u32 *)SYSM_CARD_BANNER_BUF, + sizeof(TWLBannerFile) ); // バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK) state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = state; - SYSMi_GetWork()->flags.hotsw.isExistCard = state; - } + SYSMi_GetWork()->flags.hotsw.isExistCard = state; + } else{ // バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK) SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; - SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; + SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; } if ( SYSMi_GetWork()->flags.hotsw.isExistCard ) @@ -753,17 +767,17 @@ static HotSwState LoadBannerData(void) SYSMi_GetWork()->flags.hotsw.isInspectCard = FALSE; } - // デバッガ情報 - if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && debuggerFlg ) - { - MI_CpuCopy8( &s_romEmuInfo, &(SYSMi_GetWork()->romEmuInfo), ROM_EMULATION_DATA_SIZE ); - SYSMi_GetWork()->flags.hotsw.isOnDebugger = debuggerFlg; - } + // デバッガ情報 + if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && debuggerFlg ) + { + MI_CpuCopy8( &s_romEmuInfo, &(SYSMi_GetWork()->romEmuInfo), ROM_EMULATION_DATA_SIZE ); + SYSMi_GetWork()->flags.hotsw.isOnDebugger = debuggerFlg; + } SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; - return retval; + return retval; } @@ -776,107 +790,158 @@ static HotSwState LoadBannerData(void) *---------------------------------------------------------------------------*/ static HotSwState LoadStaticModule(void) { - HotSwState retval = HOTSW_SUCCESS; + HotSwState retval = HOTSW_SUCCESS; HotSwState state = HOTSW_SUCCESS; u32 arm9StcEnd = s_cbData.pBootSegBuf->rh.s.main_rom_offset + s_cbData.pBootSegBuf->rh.s.main_size; u32 arm9LtdStcEnd = s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + s_cbData.pBootSegBuf->rh.s.main_ltd_size; - u32 secure2SegEnd = (u32)(s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset * TWLCARD_BORDER_OFFSET + SECURE_SEGMENT_SIZE); + u32 secure2SegEnd = (u32)(s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset * TWLCARD_BORDER_OFFSET + SECURE_SEGMENT_SIZE); // 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送 - s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address; + s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address; if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg)){ if(arm9StcEnd > SECURE_SEGMENT_END){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), MATH_ROUNDUP( arm9StcEnd, SYSM_ALIGNMENT_LOAD_MODULE ) - SECURE_SEGMENT_END); + state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), MATH_ROUNDUP( arm9StcEnd, SYSM_ALIGNMENT_LOAD_MODULE ) - SECURE_SEGMENT_END); retval = (retval == HOTSW_SUCCESS) ? state : retval; - } + } } else{ retval = (retval == HOTSW_SUCCESS) ? HOTSW_BUFFER_OVERRUN_ERROR : retval; } if(retval != HOTSW_SUCCESS){ - return retval; + return retval; } // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 - s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address; + s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address; if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC], s_cbData.twlFlg)){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, MATH_ROUNDUP( s_cbData.pBootSegBuf->rh.s.sub_size, SYSM_ALIGNMENT_LOAD_MODULE ) ); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, MATH_ROUNDUP( s_cbData.pBootSegBuf->rh.s.sub_size, SYSM_ALIGNMENT_LOAD_MODULE ) ); + retval = (retval == HOTSW_SUCCESS) ? state : retval; } else{ retval = (retval == HOTSW_SUCCESS) ? HOTSW_BUFFER_OVERRUN_ERROR : retval; } if(retval != HOTSW_SUCCESS){ - return retval; + return retval; } - - // 拡張常駐モジュールの読み込み - if( s_cbData.twlFlg ) { - u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; + // 拡張常駐モジュールの読み込み + if( s_cbData.twlFlg ) { + u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address; - // 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送 + // 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送 if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE)){ if(!s_cbData.isLoadTypeTwl){ - // Secure2領域読み - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, MATH_ROUNDUP( size, SYSM_ALIGNMENT_LOAD_MODULE )); + // Secure2領域読み + state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, MATH_ROUNDUP( size, SYSM_ALIGNMENT_LOAD_MODULE )); retval = (retval == HOTSW_SUCCESS) ? state : retval; } // (Arm9Ltd領域 - Secure2領域)分の読み込み - if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE, - (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), - MATH_ROUNDUP( s_cbData.pBootSegBuf->rh.s.main_ltd_size, SYSM_ALIGNMENT_LOAD_MODULE ) - size); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - } + if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { + state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE, + (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), + MATH_ROUNDUP( s_cbData.pBootSegBuf->rh.s.main_ltd_size, SYSM_ALIGNMENT_LOAD_MODULE ) - size); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + } } else{ retval = (retval == HOTSW_SUCCESS) ? HOTSW_BUFFER_OVERRUN_ERROR : retval; } - if(retval != HOTSW_SUCCESS){ - return retval; - } + if(retval != HOTSW_SUCCESS){ + return retval; + } // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 - s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address; + s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address; if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE)){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, MATH_ROUNDUP( s_cbData.pBootSegBuf->rh.s.sub_ltd_size, SYSM_ALIGNMENT_LOAD_MODULE ) ); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, MATH_ROUNDUP( s_cbData.pBootSegBuf->rh.s.sub_ltd_size, SYSM_ALIGNMENT_LOAD_MODULE ) ); + retval = (retval == HOTSW_SUCCESS) ? state : retval; } else{ retval = (retval == HOTSW_SUCCESS) ? HOTSW_BUFFER_OVERRUN_ERROR : retval; } - if(retval != HOTSW_SUCCESS){ - return retval; - } - - // セキュア領域先頭2K分のハッシュ値を求めて、Work領域にコピー + if(retval != HOTSW_SUCCESS){ + return retval; + } + + // セキュア領域先頭2K分のハッシュ値を求めて、Work領域にコピー { - SVCHMACSHA1Context hash; + SVCHMACSHA1Context hash; - // ハッシュ初期化 - SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); + // ハッシュ初期化 + SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); - // セキュア領域先頭2kb分UpDate - SVC_HMACSHA1Update( &hash, s_cbData.pSecureSegBuf, ENCRYPT_DEF_SIZE ); + // セキュア領域先頭2kb分UpDate + SVC_HMACSHA1Update( &hash, s_cbData.pSecureSegBuf, ENCRYPT_DEF_SIZE ); - // Arm9と排他制御する - LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - - // ハッシュコンテキストをWork領域にコピー - MI_CpuCopy8( &hash, &SYSMi_GetWork2()->hmac_sha1_context, sizeof(SVCHMACSHA1Context) ); + // Arm9と排他制御する + LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - // Arm9との排他制御、ここまで - UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); + // ハッシュコンテキストをWork領域にコピー + MI_CpuCopy8( &hash, &SYSMi_GetWork2()->hmac_sha1_context, sizeof(SVCHMACSHA1Context) ); + + // Arm9との排他制御、ここまで + UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); } #define MY_DEBUG #ifdef MY_DEBUG - (void)CheckStaticModuleHash(); + (void)CheckStaticModuleHash(); +#endif + } +#ifdef DHT_TEST + else + { + if ( !s_cbData.pBootSegBuf->rh.s.enable_signature ) + { + SVCHMACSHA1Context ctx; + const DHTDatabase* db; + + while (!dht) + { + OS_Sleep(1); + } + + OS_TPrintf("Search DHT..."); + db = DHT_GetDatabase(dht, &s_cbData.pBootSegBuf->rh.s); + if ( !db ) + { + OS_TPrintf(" Failed.\n"); + return HOTSW_HASH_CHECK_ERROR; + } + OS_TPrintf(" Done.\n"); + + OS_TPrintf("DHT Pahse1..."); + DHT_CheckHashPhase1Init(&ctx, (ROM_Header_Short*)s_cbData.pBootSegBuf); + if( s_cbData.pBootSegBuf->rh.s.main_size > SECURE_SEGMENT_SIZE ) + { + DHT_CheckHashPhase1Update(&ctx, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE); + DHT_CheckHashPhase1Update(&ctx, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE ); + } + else + { + DHT_CheckHashPhase1Update(&ctx, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_size); + } + + DHT_CheckHashPhase1Update(&ctx, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size); + if ( !DHT_CheckHashPhase1Final(&ctx, db) ) + { + OS_TPrintf(" Failed.\n"); + return HOTSW_HASH_CHECK_ERROR; + } + OS_TPrintf(" Done.\n"); + + OS_TPrintf("DHT Pahse2..."); + if ( !DHT_CheckHashPhase2(db, &s_cbData.pBootSegBuf->rh.s, ov_buffer, ReadImage, &s_cbData) ) + { + OS_TPrintf(" Failed.\n"); + return HOTSW_HASH_CHECK_ERROR; + } + OS_TPrintf(" Done.\n"); + } + } #endif - } return retval; } @@ -889,27 +954,27 @@ static HotSwState LoadStaticModule(void) *---------------------------------------------------------------------------*/ static HotSwState CheckCardAuthCode(void) { - u32 authBuf[PAGE_SIZE/sizeof(u32)]; - u32 auth_offset = s_cbData.pBootSegBuf->rh.s.rom_valid_size ? s_cbData.pBootSegBuf->rh.s.rom_valid_size : 0x01000000; - u32 page_offset = auth_offset & 0xFFFFFE00; - HotSwState retval = HOTSW_SUCCESS; + u32 authBuf[PAGE_SIZE/sizeof(u32)]; + u32 auth_offset = s_cbData.pBootSegBuf->rh.s.rom_valid_size ? s_cbData.pBootSegBuf->rh.s.rom_valid_size : 0x01000000; + u32 page_offset = auth_offset & 0xFFFFFE00; + HotSwState retval = HOTSW_SUCCESS; + + u8 *p = (u8 *)authBuf; - u8 *p = (u8 *)authBuf; - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; + return HOTSW_PULLED_OUT_ERROR; } - + retval = ReadPageGame( &s_cbData, page_offset, authBuf, MB_AUTHCODE_SIZE ); p += auth_offset & 0x000001FF; - if( *p++ == 'a' && *p == 'c' ) { + if( *p++ == 'a' && *p == 'c' ) { OS_PutString(" ☆ Clone Boot Mode\n"); - SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE; - }else { + SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE; + }else { OS_PutString(" □ Other Boot Mode\n"); - SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE; - } + SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE; + } return retval; } @@ -924,7 +989,7 @@ static HotSwState CheckCardAuthCode(void) *---------------------------------------------------------------------------*/ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size) { - SDK_ASSERT(size > BOOT_SEGMENT_SIZE); + SDK_ASSERT(size > BOOT_SEGMENT_SIZE); s_pBootSegBuffer = (BootSegmentData *)buf; s_BootSegBufSize = size; @@ -948,22 +1013,22 @@ void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) SDK_ASSERT(size > SECURE_SEGMENT_SIZE); if(type == HOTSW_MODE1){ - s_pSecureSegBuffer = (u32 *)buf; - s_SecureSegBufSize = size; + s_pSecureSegBuffer = (u32 *)buf; + s_SecureSegBufSize = size; - s_cbData.pSecureSegBuf = s_pSecureSegBuffer; - - // バッファの初期化 - MI_CpuClear8(s_pSecureSegBuffer, size); + s_cbData.pSecureSegBuf = s_pSecureSegBuffer; + + // バッファの初期化 + MI_CpuClear8(s_pSecureSegBuffer, size); } else{ - s_pSecure2SegBuffer = (u32 *)buf; - s_Secure2SegBufSize = size; + s_pSecure2SegBuffer = (u32 *)buf; + s_Secure2SegBufSize = size; - s_cbData.pSecure2SegBuf = s_pSecure2SegBuffer; - - // バッファの初期化 - MI_CpuClear8(s_pSecure2SegBuffer, size); + s_cbData.pSecure2SegBuf = s_pSecure2SegBuffer; + + // バッファの初期化 + MI_CpuClear8(s_pSecure2SegBuffer, size); } } @@ -976,14 +1041,14 @@ void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) static void GenVA_VB_VD(void) { u32 dummy = 0; - MATHRandContext32 rnd; - - // 乱数を初期化 VBlankカウンタ値を種とする。 - // [TODO] プログラムがV周期に同期しているためVカウンタでは固定値になりやすい - // (特にダイレクトブート)。 - // 起動する度に変化するパラメータと組み合わせるべき。 + MATHRandContext32 rnd; + + // 乱数を初期化 VBlankカウンタ値を種とする。 + // [TODO] プログラムがV周期に同期しているためVカウンタでは固定値になりやすい + // (特にダイレクトブート)。 + // 起動する度に変化するパラメータと組み合わせるべき。 MATH_InitRand32(&rnd, (u64)OS_GetVBlankCount()); - + s_cbData.vae = MATH_Rand32(&rnd, 0); s_cbData.vbi = MATH_Rand32(&rnd, 0); s_cbData.vd = MATH_Rand32(&rnd, 0); @@ -992,9 +1057,9 @@ static void GenVA_VB_VD(void) EncryptByBlowfish(&s_cbData.keyTable, &s_cbData.vae, &s_cbData.vbi); EncryptByBlowfish(&s_cbData.keyTable, &s_cbData.vd , &dummy); - s_cbData.vae &= 0xffffff; - s_cbData.vbi &= 0xfffff; - s_cbData.vd &= 0xffffff; + s_cbData.vae &= 0xffffff; + s_cbData.vbi &= 0xfffff; + s_cbData.vd &= 0xffffff; } @@ -1010,57 +1075,57 @@ static u32 encDestBuf[ENCRYPT_DEF_SIZE/sizeof(u32)]; static HotSwState DecryptObjectFile(void) { u8 i; - s32 restSize; - s32 size = (s32)s_cbData.pBootSegBuf->rh.s.main_size; - u32 *pEncBuf = encDestBuf; - u32 *pEncDes = s_cbData.pSecureSegBuf; + s32 restSize; + s32 size = (s32)s_cbData.pBootSegBuf->rh.s.main_size; + u32 *pEncBuf = encDestBuf; + u32 *pEncDes = s_cbData.pSecureSegBuf; BLOWFISH_CTX *tableBufp = &s_cbData.keyTable; - BOOL exist = TRUE; - HotSwState retval = HOTSW_SUCCESS; + BOOL exist = TRUE; + HotSwState retval = HOTSW_SUCCESS; - if (size > ENCRYPT_DEF_SIZE) { - size = ENCRYPT_DEF_SIZE; - } - restSize = size; + if (size > ENCRYPT_DEF_SIZE) { + size = ENCRYPT_DEF_SIZE; + } + restSize = size; // 読み込んだセキュア領域をバッファから一時バッファにコピー - MI_CpuCopy32(s_cbData.pSecureSegBuf, pEncBuf, (u32)size); - + MI_CpuCopy32(s_cbData.pSecureSegBuf, pEncBuf, (u32)size); + // セキュア領域先頭8バイトをBlowfishで複合化 - DecryptByBlowfish(&s_cbData.keyTable, &(pEncBuf)[1], &(pEncBuf)[0]); + DecryptByBlowfish(&s_cbData.keyTable, &(pEncBuf)[1], &(pEncBuf)[0]); // Key Tableを変換 - s_cbData.keyBuf[1] = (s_cbData.keyBuf[1] << 1); - s_cbData.keyBuf[2] = (s_cbData.keyBuf[2] >> 1); + s_cbData.keyBuf[1] = (s_cbData.keyBuf[1] << 1); + s_cbData.keyBuf[2] = (s_cbData.keyBuf[2] >> 1); InitBlowfishKeyAndTableDS(&s_cbData.keyTable, s_cbData.keyBuf, 8); // もう一度セキュア領域先頭8バイトをBlowfishで複合化 - DecryptByBlowfish(&s_cbData.keyTable, &(pEncBuf)[1], &(pEncBuf)[0]); - for ( i=0; i<8; i++ ){ + DecryptByBlowfish(&s_cbData.keyTable, &(pEncBuf)[1], &(pEncBuf)[0]); + for ( i=0; i<8; i++ ){ // 先頭8バイトが複合化の結果 "encryObj" となっていたら複合化成功 - if ( encrypt_object_key[i] != ((char*)pEncBuf)[i] ){ - exist = FALSE; - break; - } - } + if ( encrypt_object_key[i] != ((char*)pEncBuf)[i] ){ + exist = FALSE; + break; + } + } - // 暗号化オブジェクト有効時 - if ( exist ){ - u32 *bufp = pEncBuf; + // 暗号化オブジェクト有効時 + if ( exist ){ + u32 *bufp = pEncBuf; - bufp[0] = UNDEF_CODE; - bufp[1] = UNDEF_CODE; - while ((restSize -= 8) > 0) { - bufp += 2; // 復号処理 - DecryptByBlowfish(tableBufp, &(bufp)[1], &(bufp)[0]); - } - } - else{ - retval = HOTSW_DATA_DECRYPT_ERROR; + bufp[0] = UNDEF_CODE; + bufp[1] = UNDEF_CODE; + while ((restSize -= 8) > 0) { + bufp += 2; // 復号処理 + DecryptByBlowfish(tableBufp, &(bufp)[1], &(bufp)[0]); + } + } + else{ + retval = HOTSW_DATA_DECRYPT_ERROR; MI_NDmaFill( HOTSW_NDMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア - } - MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); + } + MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); return retval; } @@ -1074,7 +1139,7 @@ static HotSwState DecryptObjectFile(void) static void LockHotSwRsc(OSLockWord* word) { while(OS_TryLockByWord( s_RscLockID, word, NULL ) != OS_LOCK_SUCCESS){ - OS_Sleep(1); + OS_Sleep(1); } } @@ -1086,7 +1151,7 @@ static void LockHotSwRsc(OSLockWord* word) *---------------------------------------------------------------------------*/ static void UnlockHotSwRsc(OSLockWord* word) { - OS_UnlockByWord( s_RscLockID, word, NULL ); + OS_UnlockByWord( s_RscLockID, word, NULL ); } @@ -1151,7 +1216,7 @@ static BOOL IsSwap(void) *---------------------------------------------------------------------------*/ static u32 GetMcSlotShift(void) { - return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT); + return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT); } @@ -1212,72 +1277,72 @@ static BOOL CmpMcSlotMode(u32 mode) #else if((reg_MI_MC1 & GetMcSlotMask()) == (mode >> GetMcSlotShift())){ #endif - return TRUE; + return TRUE; } else{ - return FALSE; + return FALSE; } } /*---------------------------------------------------------------------------* - Name: McPowerOn + Name: McPowerOn Description: スロット電源ON *---------------------------------------------------------------------------*/ static void McPowerOn(void) { // Counter-Aカウンタ設定値到達まで待つ - while(CmpMcSlotMode(SLOT_STATUS_MODE_11) == TRUE){ - OS_Sleep(1); + while(CmpMcSlotMode(SLOT_STATUS_MODE_11) == TRUE){ + OS_Sleep(1); } if(CmpMcSlotMode(SLOT_STATUS_MODE_00) == TRUE){ - // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 + // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // VDDの安定期間待ち - OS_Sleep(100); - - // SCFG_MC1 の Slot Status の M1,M0 を 01 にする - SetMcSlotMode(SLOT_STATUS_MODE_01); - // 10ms待ち - OS_Sleep(10); + OS_Sleep(100); - // SCFG_MC1 の Slot Status の M1,M0 を 10 にする - SetMcSlotMode(SLOT_STATUS_MODE_10); + // SCFG_MC1 の Slot Status の M1,M0 を 01 にする + SetMcSlotMode(SLOT_STATUS_MODE_01); + // 10ms待ち + OS_Sleep(10); + + // SCFG_MC1 の Slot Status の M1,M0 を 10 にする + SetMcSlotMode(SLOT_STATUS_MODE_10); // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // RESBを上げるまでの待ち時間 - OS_Sleep(1); + OS_Sleep(1); - // リセットをhighに (RESB = 1にする) - reg_HOTSW_MCCNT1 = RESB_MASK; - - // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 + // リセットをhighに (RESB = 1にする) + reg_HOTSW_MCCNT1 = RESB_MASK; + + // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // カードへ最初のコマンドを送るまでの待ち時間 - OS_Sleep(120); + OS_Sleep(120); } } /*---------------------------------------------------------------------------* - Name: McPowerOff + Name: McPowerOff Description: スロット電源OFF *---------------------------------------------------------------------------*/ static void McPowerOff(void) { // Counter-Aカウンタ設定値到達まで待つ - while(CmpMcSlotMode(SLOT_STATUS_MODE_11) == TRUE){ - OS_Sleep(1); + while(CmpMcSlotMode(SLOT_STATUS_MODE_11) == TRUE){ + OS_Sleep(1); } - + if(CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){ - // SCFG_MC1 の Slot Status の M1,M0 を 11 にする - SetMcSlotMode(SLOT_STATUS_MODE_11); + // SCFG_MC1 の Slot Status の M1,M0 を 11 にする + SetMcSlotMode(SLOT_STATUS_MODE_11); // SCFG_MC1 の Slot Status の M1,M0 が 00 になるまでポーリング while(CmpMcSlotMode(SLOT_STATUS_MODE_00) == FALSE){ - OS_Sleep(1); + OS_Sleep(1); } } } @@ -1322,7 +1387,7 @@ void HOTSWi_TurnCardPowerOn(u32 slot) // RESBのLow期間 OS_SpinWait( OS_MSEC_TO_CPUCYC(1) ); - reg_MI_MCCNT1_B = REG_MI_MCCNT1_RESB_MASK; + reg_MI_MCCNT1_B = REG_MI_MCCNT1_RESB_MASK; // RESBのHigh期間 OS_SpinWait( OS_MSEC_TO_CPUCYC(100) ); @@ -1332,38 +1397,38 @@ void HOTSWi_TurnCardPowerOn(u32 slot) /*---------------------------------------------------------------------------* Name: SetMCSCR - + Description: 符号生成回路初期値設定レジスタを設定する ※注:この関数はセキュアモードで、sPNG_ONコマンドを実行してから呼び出してください。 *---------------------------------------------------------------------------*/ static void SetMCSCR(void) { - static u32 pnbL = 0x879b9b05; - static u8 pnbH = 0x5c; - static u8 pnaL1 = 0x60; - static u8 pnaL0Table[8] = { 0xe8, 0x4d, 0x5a, 0xb1, 0x17, 0x8f, 0x99, 0xd5 }; + static u32 pnbL = 0x879b9b05; + static u8 pnbH = 0x5c; + static u8 pnaL1 = 0x60; + static u8 pnaL0Table[8] = { 0xe8, 0x4d, 0x5a, 0xb1, 0x17, 0x8f, 0x99, 0xd5 }; u32 pnaL = s_cbData.vd << 15 | pnaL1 << 8 | pnaL0Table[(s_cbData.pBootSegBuf->rh.s.rom_type & 0x7)]; u8 pnaH = (u8)((s_cbData.vd >> 17) & 0x7f); // SCR A - reg_HOTSW_MCSCR0 = pnaL; + reg_HOTSW_MCSCR0 = pnaL; // SCR B - reg_HOTSW_MCSCR1 = pnbL; + reg_HOTSW_MCSCR1 = pnbL; // [d0 -d6 ] -> SCR A // [d16-d22] -> SCR B reg_HOTSW_MCSCR2 = (u32)(pnaH | pnbH << 16); - - // MCCNT1 レジスタ設定 (SCR = 1に) + + // MCCNT1 レジスタ設定 (SCR = 1に) reg_HOTSW_MCCNT1 = SCR_MASK; } /*---------------------------------------------------------------------------* - Name: HotSwThread + Name: HotSwThread Description: カード抜け・挿し処理スレッド @@ -1371,121 +1436,121 @@ static void SetMCSCR(void) *---------------------------------------------------------------------------*/ static void HotSwThread(void *arg) { - #pragma unused( arg ) + #pragma unused( arg ) + +// BOOL isPulledOut = TRUE; + HotSwState retval; + HotSwMessage *msg; -// BOOL isPulledOut = TRUE; - HotSwState retval; - HotSwMessage *msg; - while(1){ OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); if( msg->ctrl == TRUE ) { // [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。 - SYSMi_GetWork()->flags.hotsw.isEnableHotSW = msg->value; + SYSMi_GetWork()->flags.hotsw.isEnableHotSW = msg->value; // [TODO]カードがあるときとないときで場合分けしてFinalize処理を実装 - // PXIメッセージを「抑制」と「Finalize」で分けて処理 - // → 1.全てのレジスタをクリアする (カードがささっていない時) - // 2.一度電源を落としてNomalモードにする (NANDアプリ等を起動する場合) - // 3.必要なレジスタを残して、後はクリア (ささっているカードを起動する場合) - // + // PXIメッセージを「抑制」と「Finalize」で分けて処理 + // → 1.全てのレジスタをクリアする (カードがささっていない時) + // 2.一度電源を落としてNomalモードにする (NANDアプリ等を起動する場合) + // 3.必要なレジスタを残して、後はクリア (ささっているカードを起動する場合) + // // NANDアプリ起動時の終了処理が確認できたら、、BOOTAPIでKillThreadでスレッドを殺せるようにしておく。 // スレッドを殺す前に、IREQとDET割り込みを無効にしておく。 -// HOTSW_Finalize(); +// HOTSW_Finalize(); } - + while(1){ - // 活線挿抜抑制フラグが立っていたら処理しない - if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) { - SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; + // 活線挿抜抑制フラグが立っていたら処理しない + if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) { + SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; OS_PutString("### HotSw is restrained...\n"); - break; - } - + break; + } + // カードが挿さってたら if(HOTSW_IsCardExist()){ // 前の状態が挿し if(!s_IsPulledOut){ // 抜きがなかったか判定 if(CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){ - // フラグケア + // フラグケア LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - - SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; - SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; - - // 新しいカードのIDを入れる - SYSMi_GetWork()->nCardID = s_cbData.id_gam; - // カードデータロード完了フラグ - SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = TRUE; + SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; + + // 新しいカードのIDを入れる + SYSMi_GetWork()->nCardID = s_cbData.id_gam; + + // カードデータロード完了フラグ + SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = TRUE; UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - + OS_PutString("ok!\n"); - break; + break; } } // カード読み込み開始 // [TODO] エラー発生時に電源ON/OFFを繰り返さないため、 // 挿入時に一度しかロードしないように必要がある - retval = LoadCardData(); + retval = LoadCardData(); - // Debug表示 + // Debug表示 DebugPrintErrorMessage(retval); - + // カード読みが失敗していたらカードがないことにする if(retval != HOTSW_SUCCESS){ - LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; - SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; - SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; - UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - - // カードブート用構造体の初期化 - MI_CpuClear32(&s_cbData, sizeof(CardBootData)); + LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); + SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; + SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; + UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - // バッファのクリア - MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); - MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); + // カードブート用構造体の初期化 + MI_CpuClear32(&s_cbData, sizeof(CardBootData)); + + // バッファのクリア + MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); + MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile)); - - break; + + break; } - - // 状態フラグを更新 + + // 状態フラグを更新 s_IsPulledOut = FALSE; } - + // カードが抜けてたら else{ // フラグ処理 LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; + SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = FALSE; UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - - // カードブート用構造体の初期化 - MI_CpuClear32(&s_cbData, sizeof(CardBootData)); - // バッファのクリア - MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); - MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); + // カードブート用構造体の初期化 + MI_CpuClear32(&s_cbData, sizeof(CardBootData)); + + // バッファのクリア + MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); + MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile)); - + s_IsPulledOut = TRUE; - + // ワンセグのスリープ時シャットダウン対策を戻す MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE ); - break; + break; } } - SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; + SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; } // while loop } @@ -1496,70 +1561,70 @@ static void HotSwThread(void *arg) ・NANDアプリ起動時、カード電源OFF ・TWL NANDアプリなら - ゲームカードONフラグ(NANDのRomHeader TWL拡張諸フラグ)を見て、 - NANDアプリ起動後もカード電源(OFF後)ONにしてNormalモードにする + ゲームカードONフラグ(NANDのRomHeader TWL拡張諸フラグ)を見て、 + NANDアプリ起動後もカード電源(OFF後)ONにしてNormalモードにする ・NTR NANDアプリなら - カード種別問わず、GAMEモードに遷移(NTR互換のRomHeaderのみ読む) - 拡張領域残しておいてもよいかも - TWLカードがささっていて、Game2モードになっていたら、 - 電源OFFしてONして、Gameモードに遷移させる。 + カード種別問わず、GAMEモードに遷移(NTR互換のRomHeaderのみ読む) + 拡張領域残しておいてもよいかも + TWLカードがささっていて、Game2モードになっていたら、 + 電源OFFしてONして、Gameモードに遷移させる。 *---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------* - Name: MonitorThread + Name: MonitorThread Description: 実際のカード状態とHotSwThreadで状態を比べて、違いがあった場合は - メッセージを送る + メッセージを送る - s_IsPulledOut : True -> カードなし HOTSW_IsCardExist : True -> カードあり - False -> カードあり False -> カードなし + s_IsPulledOut : True -> カードなし HOTSW_IsCardExist : True -> カードあり + False -> カードあり False -> カードなし *---------------------------------------------------------------------------*/ static void MonitorThread(void *arg) { - #pragma unused( arg ) - - BOOL isPullOutNow; - + #pragma unused( arg ) + + BOOL isPullOutNow; + while(1){ // カードデータロード中は待機 do{ - OS_Sleep(CARD_EXIST_CHECK_INTERVAL); + OS_Sleep(CARD_EXIST_CHECK_INTERVAL); } while(s_isHotSwBusy); // 現在カードが抜けているか - isPullOutNow = !HOTSW_IsCardExist(); - + isPullOutNow = !HOTSW_IsCardExist(); + // 状態の比較 if(s_IsPulledOut != isPullOutNow){ - OSIntrMode enabled = OS_DisableInterrupts(); + OSIntrMode enabled = OS_DisableInterrupts(); // 本当は抜けてた場合 if(isPullOutNow){ - HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; - HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; - HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; - // メッセージをキューの先頭に入れる - OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); + // メッセージをキューの先頭に入れる + OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); - // メッセージインデックスをインクリメント - HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; + // メッセージインデックスをインクリメント + HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; } // 本当は挿さっていた場合 else{ - HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; - HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; - HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; - // メッセージをキューの先頭に入れる - OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); + // メッセージをキューの先頭に入れる + OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); - // メッセージインデックスをインクリメント - HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + // メッセージインデックスをインクリメント + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; } (void)OS_RestoreInterrupts( enabled ); @@ -1571,54 +1636,54 @@ static void MonitorThread(void *arg) /*---------------------------------------------------------------------------* - Name: InterruptCallbackCard + Name: InterruptCallbackCard Description: カードB抜け割り込みハンドラ *---------------------------------------------------------------------------*/ static void InterruptCallbackCard(void) { - HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; - - // メッセージ送信 + + // メッセージ送信 OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; -/* // スロットのモードを +/* // スロットのモードを if(GetMcSlotMode() == SLOT_STATUS_MODE_01 || GetMcSlotMode() == SLOT_STATUS_MODE_10){ - SetMcSlotMode(SLOT_STATUS_MODE_11); + SetMcSlotMode(SLOT_STATUS_MODE_11); }*/ - OS_PutString("○\n"); + OS_PutString("○\n"); } /*---------------------------------------------------------------------------* - Name: InterruptCallbackCardDet + Name: InterruptCallbackCardDet Description: カードB挿し割り込みハンドラ *---------------------------------------------------------------------------*/ static void InterruptCallbackCardDet(void) { - HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; - - // メッセージ送信 + + // メッセージ送信 OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); - // メッセージインデックスをインクリメント + // メッセージインデックスをインクリメント HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; - OS_PutString("●\n"); + OS_PutString("●\n"); } /*---------------------------------------------------------------------------* - Name: InterruptCallbackPxi + Name: InterruptCallbackPxi Description: PXI割り込みハンドラ *---------------------------------------------------------------------------*/ @@ -1626,24 +1691,24 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) { #pragma unused(tag) #pragma unused(err) - HotSwPxiMessage d; + HotSwPxiMessage d; + + d.data = data; - d.data = data; - HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; - HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].type = HOTSW_CONTROL; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].type = HOTSW_CONTROL; - // メッセージ送信 + // メッセージ送信 OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK); - // メッセージインデックスをインクリメント + // メッセージインデックスをインクリメント HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; } /*---------------------------------------------------------------------------* - Name: AllocateExCardBus + Name: AllocateExCardBus Description: アクセス権を設定する *---------------------------------------------------------------------------*/ @@ -1657,7 +1722,7 @@ static inline void SetExCardProcessor(MIProcessor proc) /*---------------------------------------------------------------------------* - Name: AllocateExCardBus + Name: AllocateExCardBus Description: スロットBへのアクセス権を設定する *---------------------------------------------------------------------------*/ @@ -1675,7 +1740,7 @@ static void AllocateExCardBus(void) /*---------------------------------------------------------------------------* - Name: FreeExCardBus + Name: FreeExCardBus Description: スロットBへのアクセス権を設定する *---------------------------------------------------------------------------*/ @@ -1688,7 +1753,7 @@ static void FreeExCardBus(void) /*---------------------------------------------------------------------------* - Name: LockSlotB + Name: LockSlotB Description: スロットBをロックする *---------------------------------------------------------------------------*/ @@ -1699,7 +1764,7 @@ static s32 LockExCard(u16 lockID) /*---------------------------------------------------------------------------* - Name: UnlockSlotB + Name: UnlockSlotB Description: スロットBをロックする *---------------------------------------------------------------------------*/ @@ -1710,21 +1775,21 @@ static s32 UnlockExCard(u16 lockID) /*---------------------------------------------------------------------------* - Name: SetInterruptCallback - SetInterruptCallbackEx + Name: SetInterruptCallback + SetInterruptCallbackEx Description: 割り込みコールバック関数と割り込み許可の設定を行う *---------------------------------------------------------------------------*/ static void SetInterruptCallback( OSIrqMask intr_bit, OSIrqFunction func ) { (void)OS_SetIrqFunction(intr_bit, func); - (void)OS_EnableIrqMask(intr_bit); + (void)OS_EnableIrqMask(intr_bit); } static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func ) { (void)OS_SetIrqFunctionEx(intr_bit, func); - (void)OS_EnableIrqMaskEx(intr_bit); + (void)OS_EnableIrqMaskEx(intr_bit); } @@ -1736,12 +1801,12 @@ static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func ) static void SetInterrupt(void) { #ifndef DEBUG_USED_CARD_SLOT_B_ - SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard ); - SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet ); + SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard ); + SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet ); (void)OS_EnableIrqMask(OS_IE_NDMA2); #else - SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard ); - SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet ); + SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard ); + SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet ); (void)OS_EnableIrqMask(OS_IE_NDMA2); #endif } @@ -1755,34 +1820,34 @@ static void SetInterrupt(void) *---------------------------------------------------------------------------*/ static HotSwState CheckStaticModuleHash(void) { - BOOL flg = TRUE; - + BOOL flg = TRUE; + // Arm9常駐モジュール Hash値のチェック if(!CheckArm9HashValue()){ flg = FALSE; - OS_PutString("×Arm9 Static Module Hash Check Error...\n"); + OS_PutString("×Arm9 Static Module Hash Check Error...\n"); } - + // Arm7常駐モジュール Hash値のチェック if(!CheckArm7HashValue()){ - flg = FALSE; + flg = FALSE; OS_PutString("×Arm7 Static Module Hash Check Error...\n"); } - - // Arm9拡張常駐モジュール Hash値のチェック + + // Arm9拡張常駐モジュール Hash値のチェック if(!CheckExtArm9HashValue()){ flg = FALSE; - OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); + OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); } - + // Arm7拡張常駐モジュール Hash値のチェック if(!CheckExtArm7HashValue()){ flg = FALSE; - OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n"); + OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n"); } if(flg){ - OS_PutString("*** Static Module Load was Completed!!\n"); + OS_PutString("*** Static Module Load was Completed!!\n"); } return flg ? HOTSW_SUCCESS : HOTSW_HASH_CHECK_ERROR; @@ -1790,31 +1855,31 @@ static HotSwState CheckStaticModuleHash(void) /*---------------------------------------------------------------------------* - Name: CheckArm7HashValue + Name: CheckArm7HashValue Description: Arm7常駐モジュールのハッシュチェック *---------------------------------------------------------------------------*/ static BOOL CheckArm7HashValue(void) { - u8 sha1data[DIGEST_SIZE_SHA1]; - BOOL retval = TRUE; + u8 sha1data[DIGEST_SIZE_SHA1]; + BOOL retval = TRUE; // クリア - MI_CpuClear8(sha1data, sizeof(sha1data)); + MI_CpuClear8(sha1data, sizeof(sha1data)); - // ARM7常駐モジュールのHash値照合 - SVC_CalcHMACSHA1( sha1data, + // ARM7常駐モジュールのHash値照合 + SVC_CalcHMACSHA1( sha1data, (u32 *)(s_cbData.arm7Stc), s_cbData.pBootSegBuf->rh.s.sub_size, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); - return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_static_digest ); + return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_static_digest ); } /*---------------------------------------------------------------------------* - Name: CheckArm9HashValue + Name: CheckArm9HashValue Description: Arm9常駐モジュールのハッシュチェック @@ -1822,87 +1887,87 @@ static BOOL CheckArm7HashValue(void) *---------------------------------------------------------------------------*/ static BOOL CheckArm9HashValue(void) { - u8 sha1data[DIGEST_SIZE_SHA1]; - BOOL retval = TRUE; + u8 sha1data[DIGEST_SIZE_SHA1]; + BOOL retval = TRUE; SVCHMACSHA1Context hash; // クリア - MI_CpuClear8(sha1data, sizeof(sha1data)); - + MI_CpuClear8(sha1data, sizeof(sha1data)); + // ハッシュ初期化 - SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); + SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); // セキュア領域分UpDate - SVC_HMACSHA1Update( &hash, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE ); + SVC_HMACSHA1Update( &hash, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE ); // ゲーム領域分UpDate - SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE ); - + SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE ); + // Hash値取得 SVC_HMACSHA1GetHash( &hash, sha1data ); - return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_static_digest ); + return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_static_digest ); } /*---------------------------------------------------------------------------* - Name: CheckExtArm7HashValue + Name: CheckExtArm7HashValue Description: Arm7拡張常駐モジュールのハッシュチェック *---------------------------------------------------------------------------*/ static BOOL CheckExtArm7HashValue(void) { - u8 sha1data[DIGEST_SIZE_SHA1]; - BOOL retval = TRUE; + u8 sha1data[DIGEST_SIZE_SHA1]; + BOOL retval = TRUE; // クリア - MI_CpuClear8(sha1data, sizeof(sha1data)); + MI_CpuClear8(sha1data, sizeof(sha1data)); - // ARM7常駐モジュールのHash値照合 - SVC_CalcHMACSHA1( sha1data, + // ARM7常駐モジュールのHash値照合 + SVC_CalcHMACSHA1( sha1data, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); - return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_ltd_static_digest ); + return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_ltd_static_digest ); } /*---------------------------------------------------------------------------* - Name: CheckExtArm9HashValue + Name: CheckExtArm9HashValue Description: Arm9拡張常駐モジュールのハッシュチェック *---------------------------------------------------------------------------*/ static BOOL CheckExtArm9HashValue(void) { - u8 sha1data[DIGEST_SIZE_SHA1]; - u32 size; - BOOL retval = TRUE; + u8 sha1data[DIGEST_SIZE_SHA1]; + u32 size; + BOOL retval = TRUE; SVCHMACSHA1Context hash; // Arm9拡張常駐モジュールのセキュア領域分のサイズを取得 - size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? - s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; - + size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? + s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; + // クリア - MI_CpuClear8(sha1data, sizeof(sha1data)); + MI_CpuClear8(sha1data, sizeof(sha1data)); // ハッシュ初期化 - SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); + SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); // セキュア領域分UpDate - SVC_HMACSHA1Update( &hash, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size ); + SVC_HMACSHA1Update( &hash, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size ); // ゲーム領域分UpDate (Arm9拡張常駐モジュールがSecure領域で収まってたらここは飛ばす) if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ){ - SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_ltd_size - size ); + SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_ltd_size - size ); } - + // Hash値取得 SVC_HMACSHA1GetHash( &hash, sha1data ); - return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest ); + return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest ); } @@ -1912,26 +1977,26 @@ static BOOL CheckExtArm9HashValue(void) // ************************************************************************** // -// Debug用表示関数 +// Debug用表示関数 // // ************************************************************************** /*---------------------------------------------------------------------------* Name: ShowRomHeaderData - Description: + Description: *---------------------------------------------------------------------------*/ static void ShowRomHeaderData(void) { - OS_TPrintf("\nDebug Data -------------------------------\n"); + OS_TPrintf("\nDebug Data -------------------------------\n"); OS_TPrintf("1. Normal Mode ID : 0x%08x\n" , s_cbData.id_nml); OS_TPrintf("2. Secure Mode ID : 0x%08x\n" , s_cbData.id_scr); OS_TPrintf("3. Game Mode ID : 0x%08x\n" , s_cbData.id_gam); - - OS_TPrintf("title Name : %s\n", s_pBootSegBuffer->rh.s.title_name); - OS_TPrintf("initial Code : %x\n\n", *(u32 *)s_pBootSegBuffer->rh.s.game_code); + + OS_TPrintf("title Name : %s\n", s_pBootSegBuffer->rh.s.title_name); + OS_TPrintf("initial Code : %x\n\n", *(u32 *)s_pBootSegBuffer->rh.s.game_code); OS_TPrintf("platform Code : 0x%02x\n\n", s_cbData.pBootSegBuf->rh.s.platform_code); - + OS_TPrintf("main rom offset : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_rom_offset); OS_TPrintf("main entry addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_entry_address); OS_TPrintf("main ram addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_ram_address); @@ -1951,30 +2016,30 @@ static void ShowRomHeaderData(void) OS_TPrintf("Ltd Sub ram addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address); OS_TPrintf("Ltd Sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ltd_size); } - + OS_TPrintf("------------------------------------------\n\n"); } /*---------------------------------------------------------------------------* Name: ShowRegisterData - Description: + Description: *---------------------------------------------------------------------------*/ static void ShowRegisterData(void) { OS_TPrintf("----------------------------------------------------------\n"); - OS_TPrintf("拡張機能制御レジスタ (MC_B(d24)) : %08x\n", reg_SCFG_EXT); - OS_TPrintf("MC I/F制御レジスタ1 (slot status) : %08x\n", reg_MI_MC1); - OS_TPrintf("MC I/F制御レジスタ2 (Counter-A) : %04x\n", reg_MI_MC2); - OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_HOTSW_MCCNT0); - OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_HOTSW_MCCNT1); + OS_TPrintf("拡張機能制御レジスタ (MC_B(d24)) : %08x\n", reg_SCFG_EXT); + OS_TPrintf("MC I/F制御レジスタ1 (slot status) : %08x\n", reg_MI_MC1); + OS_TPrintf("MC I/F制御レジスタ2 (Counter-A) : %04x\n", reg_MI_MC2); + OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_HOTSW_MCCNT0); + OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_HOTSW_MCCNT1); OS_TPrintf("----------------------------------------------------------\n"); } /*---------------------------------------------------------------------------* Name: DebugPrintErrorMessage - Description: + Description: *---------------------------------------------------------------------------*/ static void DebugPrintErrorMessage(HotSwState state) { @@ -2014,7 +2079,7 @@ static void DebugPrintErrorMessage(HotSwState state) case HOTSW_BUFFER_OVERRUN_ERROR: OS_PutString(" - Error 8 : Buffer OverRun\n"); break; - + case HOTSW_UNEXPECTED_ERROR: OS_PutString(" - Error 9 : Unexpected\n"); break; diff --git a/build/libraries_sysmenu/sysmenu/ARM7/Makefile b/build/libraries_sysmenu/sysmenu/ARM7/Makefile index ebdfc915..1fd5ad39 100644 --- a/build/libraries_sysmenu/sysmenu/ARM7/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM7/Makefile @@ -32,6 +32,10 @@ SRCS = status.c \ TARGET_LIB = libsysmenu_sp$(TWL_LIBSUFFIX).a +ifneq ($(DHT_TEST),) +MACRO_FLAGS += -DDHT_TEST +endif + include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs INSTALL_TARGETS = $(TARGETS) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/Makefile b/build/libraries_sysmenu/sysmenu/ARM9/Makefile index 59b63b7c..df9b2203 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM9/Makefile @@ -28,6 +28,7 @@ TWL_PROC = ARM9 REVISION_SRC = src/revision.c +SRCDIR = src SRCS = sysmenu_lib.c \ util.c \ ninLogoFunc.c \ @@ -48,6 +49,12 @@ ifdef DO_NOT_SHOW_LAUNCHER MACRO_FLAGS += -DDO_NOT_SHOW_LAUNCHER endif +ifneq ($(DHT_TEST),) +SRCDIR += ../../../tests/CheckDSHashTable/src +SRCS += dht.c +MACRO_FLAGS += -DDHT_TEST +endif + include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs INSTALL_TARGETS = $(TARGETS) diff --git a/build/libraries_sysmenu/sysmenu/common/src/pxi.c b/build/libraries_sysmenu/sysmenu/common/src/pxi.c index 5a89e38a..ab64ddb5 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/pxi.c +++ b/build/libraries_sysmenu/sysmenu/common/src/pxi.c @@ -24,19 +24,29 @@ #include #endif // SDK_ARM7 +#ifdef DHT_TEST +#include +#ifdef SDK_ARM9 +#define DS_HASH_TABLE_SIZE (128*1024) +static u8 dht_buffer[DS_HASH_TABLE_SIZE] ATTRIBUTE_ALIGN(256); +static DHTFile *const dht = (DHTFile*)dht_buffer; +#else +extern DHTFile* dht; +#endif +#endif // define data----------------------------------------------------------------- -#define SYSM_PXI_COMM_STAT_REQ 0 -#define SYSM_PXI_COMM_STAT_ACK 1 +#define SYSM_PXI_COMM_STAT_REQ 0 +#define SYSM_PXI_COMM_STAT_ACK 1 // PXIコマンド typedef union SYSMPXIPacket { - struct { - u16 data; - u8 cmd; // PXI_FIFOMESSAGE_BITSZ_DATA = 26 - u8 stat : 2; - }; - u32 raw; + struct { + u16 data; + u8 cmd; // PXI_FIFOMESSAGE_BITSZ_DATA = 26 + u8 stat : 2; + }; + u32 raw; }SYSMPXIPacket; @@ -82,7 +92,7 @@ void SYSM_InitPXI( u32 mcu_prio ) { } - while ( ! PXI_IsCallbackReady( PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7 ) ) + while ( ! PXI_IsCallbackReady( PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7 ) ) { } #endif // SDK_ARM9 @@ -90,132 +100,150 @@ void SYSM_InitPXI( u32 mcu_prio ) SYSM_InitDecryptAESPXICallback(); } +#ifdef DHT_TEST +#ifdef SDK_ARM9 +void SYSMi_PrepareDatabase(void) +{ + DHT_PrepareDatabase(dht); + DC_FlushRange(dht, DHT_GetDatabaseLength(dht)); + OS_TPrintf("[ARM9] dht address: %08X\n", dht); + SYSMi_SendPXICommand( SYSM_PXI_COMM_DS_HASH_TABLE, (u16)(((u32)dht - 0x2000000) >> 8) ); +} +#endif +#endif + // PXIコマンド送信 BOOL SYSMi_TrySendPXICommand( SYSMPXICommand cmd, u16 data ) { - SYSMPXIPacket packet; - - OSIntrMode saved = OS_DisableInterrupts(); - if( s_sending[cmd] ) - { - OS_RestoreInterrupts( saved ); - return FALSE; - } - s_sending[cmd] = TRUE; - OS_RestoreInterrupts( saved ); - - packet.stat = SYSM_PXI_COMM_STAT_REQ; - packet.cmd = cmd; - packet.data = data; - - while( PXI_SendWordByFifo( SYSMENU_PXI_FIFO_TAG, packet.raw, FALSE) != PXI_FIFO_SUCCESS ) - { - SVC_WaitByLoop(1); - } - - return TRUE; + SYSMPXIPacket packet; + + OSIntrMode saved = OS_DisableInterrupts(); + if( s_sending[cmd] ) + { + OS_RestoreInterrupts( saved ); + return FALSE; + } + s_sending[cmd] = TRUE; + OS_RestoreInterrupts( saved ); + + packet.stat = SYSM_PXI_COMM_STAT_REQ; + packet.cmd = cmd; + packet.data = data; + + while( PXI_SendWordByFifo( SYSMENU_PXI_FIFO_TAG, packet.raw, FALSE) != PXI_FIFO_SUCCESS ) + { + SVC_WaitByLoop(1); + } + + return TRUE; } BOOL SYSMi_SendPXICommand( SYSMPXICommand cmd, u16 data ) { - while( ! SYSMi_TrySendPXICommand( cmd, data ) ) - { - OS_WaitAnyIrq(); - } - while( s_sending[cmd] ) - { - OS_WaitAnyIrq(); - } - - return TRUE; + while( ! SYSMi_TrySendPXICommand( cmd, data ) ) + { + OS_WaitAnyIrq(); + } + while( s_sending[cmd] ) + { + OS_WaitAnyIrq(); + } + + return TRUE; } void SYSMi_PXIFifoRecvCallback( PXIFifoTag tag, u32 data, BOOL err ) { #pragma unused( tag, err ) - SYSMPXIPacket packet; - u8 cmd; - packet.raw = data; - cmd = packet.cmd; + SYSMPXIPacket packet; + u8 cmd; + packet.raw = data; + cmd = packet.cmd; - if( packet.stat == SYSM_PXI_COMM_STAT_ACK ) - { - s_sending[cmd] = FALSE; - } - if( packet.stat == SYSM_PXI_COMM_STAT_REQ ) - { - packet.stat = SYSM_PXI_COMM_STAT_ACK; - } + if( packet.stat == SYSM_PXI_COMM_STAT_ACK ) + { + s_sending[cmd] = FALSE; + } + if( packet.stat == SYSM_PXI_COMM_STAT_REQ ) + { + packet.stat = SYSM_PXI_COMM_STAT_ACK; + } #ifdef SDK_ARM7 - switch( cmd ) - { - case SYSM_PXI_COMM_BL_BRIGHT: + switch( cmd ) + { + case SYSM_PXI_COMM_BL_BRIGHT: #ifdef SDK_SUPPORT_PMIC_2 - if ( SYSMi_GetMcuVersion() <= 1 ) - { - PMi_SetRegister( REG_PMIC_BL_BRT_B_ADDR, (u8)packet.data ); - } - else + if ( SYSMi_GetMcuVersion() <= 1 ) + { + PMi_SetRegister( REG_PMIC_BL_BRT_B_ADDR, (u8)packet.data ); + } + else #endif // SDK_SUPPORT_PMIC_2 - { - MCU_WriteRegister( MCU_REG_BL_ADDR, (u8)packet.data ); - } - break; - default: + { + MCU_WriteRegister( MCU_REG_BL_ADDR, (u8)packet.data ); + } + break; +#ifdef DHT_TEST + case SYSM_PXI_COMM_DS_HASH_TABLE: + dht = (void*)(0x2000000 + (packet.data << 8)); + OS_TPrintf("[ARM7] dht address: %08X\n", dht); + break; +#endif + default: #ifndef SDK_FINALROM OS_Panic( "illegal SYSM pxi command." ); #else OS_Panic(""); #endif - break; - } + break; + } - // PXI応答返信 - PXI_SendWordByFifo( SYSMENU_PXI_FIFO_TAG, packet.raw, FALSE ); + // PXI応答返信 + PXI_SendWordByFifo( SYSMENU_PXI_FIFO_TAG, packet.raw, FALSE ); #endif // SDK_ARM7 #if 0 - + #ifdef SDK_ARM9 - - if( packet.stat == SYSM_PXI_COMM_STAT_ACK ) { - switch( data ) { - case SYSM_PXI_COMM_DISABLE_HOTSW: - SYSMi_GetWork()->flags.arm9.isEnableHotSW = 0; - break; - default: - break; - } - }else { // SYSM_PXI_COMM_STAT_REQ - switch( data ) { - default: - break; - } - } + + if( packet.stat == SYSM_PXI_COMM_STAT_ACK ) { + switch( data ) { + case SYSM_PXI_COMM_DISABLE_HOTSW: + SYSMi_GetWork()->flags.arm9.isEnableHotSW = 0; + break; + default: + break; + } + }else { // SYSM_PXI_COMM_STAT_REQ + switch( data ) { + default: + break; + } + } #else // !SDK_ARM9 - - if( packet.stat == SYSM_PXI_COMM_STAT_REQ ) { - switch( data ) { - case SYSM_PXI_COMM_DISABLE_HOTSW: - if( SYSMi_GetWork()->flags.arm7.isBusyHotSW ) { - SYSMi_GetWork()->flags.arm7.disableHotSW_REQ = 1; - }else { - SYSMi_GetWork()->flags.arm7.isEnableHotSW = 0; - // PXIで返信 - } - break; - default: - break; - } - }else { // SYSM_PXI_COMM_STAT_ACK - switch( data ) { - default: - break; - } - } + + if( packet.stat == SYSM_PXI_COMM_STAT_REQ ) { + switch( data ) { + case SYSM_PXI_COMM_DISABLE_HOTSW: + if( SYSMi_GetWork()->flags.arm7.isBusyHotSW ) { + SYSMi_GetWork()->flags.arm7.disableHotSW_REQ = 1; + }else { + SYSMi_GetWork()->flags.arm7.isEnableHotSW = 0; + // PXIで返信 + } + break; + default: + break; + } + }else { // SYSM_PXI_COMM_STAT_ACK + switch( data ) { + default: + break; + } + } #endif // SDK_ARM9 #endif } diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index b6262b33..e16931ac 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -92,6 +92,14 @@ ifdef DO_NOT_SHOW_LAUNCHER MACRO_FLAGS += -DDO_NOT_SHOW_LAUNCHER endif +ifneq ($(DHT_TEST),) +MACRO_FLAGS += -DDHT_TEST +MAKEROM_FLAGS += -DDS_HASH_TABLE_FILE=DSHashTable.bin \ + -DDS_HASH_TABLE_DIR=$(TWL_IPL_RED_PRIVATE_ROOT)/build/tools/MakeDSHashTable +else +MAKEROM_FLAGS += -DDS_HASH_TABLE_DIR=data +endif + include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot diff --git a/build/systemMenu_RED/Launcher/ARM9/main.rsf b/build/systemMenu_RED/Launcher/ARM9/main.rsf index 817df643..5be98de5 100644 --- a/build/systemMenu_RED/Launcher/ARM9/main.rsf +++ b/build/systemMenu_RED/Launcher/ARM9/main.rsf @@ -213,4 +213,7 @@ RomSpec HostRoot ../../data Root /data File NTR_IPL_font_m.NFTR NoCardBanner.bnr EmptyBanner.bnr NoBanner.bnr fanfare.32.wav + HostRoot $(DS_HASH_TABLE_DIR) + Root /sign + File $(DS_HASH_TABLE_FILE) } \ No newline at end of file diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index de16386d..43372a91 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -102,7 +102,7 @@ void TwlMain( void ) (void)OS_EnableInterrupts(); SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。 - + FS_Init( FS_DMA_NOT_USE ); #ifdef DEBUG_LAUNCHER_DUMP @@ -129,14 +129,18 @@ void TwlMain( void ) // 各種パラメータの取得------------ - pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード - - if( SYSM_IsFatalError() ) { - // FATALエラー処理 - } - if( !LCFG_TSD_IsFinishedInitialSetting() ) { - // 初回起動シーケンス判定 - } + pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード + +#ifdef DHT_TEST + SYSMi_PrepareDatabase(); +#endif + + if( SYSM_IsFatalError() ) { + // FATALエラー処理 + } + if( !LCFG_TSD_IsFinishedInitialSetting() ) { + // 初回起動シーケンス判定 + } (void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される) @@ -145,7 +149,7 @@ void TwlMain( void ) { deleteTmp(); } - + // NANDタイトルリストの準備 SYSM_InitNandTitleList(); @@ -186,16 +190,16 @@ void TwlMain( void ) } // ランチャー画面を絶対表示しないバージョン - if( SYSM_IsLauncherHidden() ) - { - if(direct_boot == FALSE) - { - state = STOP; - }else - { - state = LOAD_START; - } - } + if( SYSM_IsLauncherHidden() ) + { + if(direct_boot == FALSE) + { + state = STOP; + }else + { + state = LOAD_START; + } + } // チャンネルをロックする SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0); @@ -216,9 +220,9 @@ void TwlMain( void ) } #endif - if( SYSM_IsFatalError() ) { - // FATALエラー処理 - } + if( SYSM_IsFatalError() ) { + // FATALエラー処理 + } // メインループ-------------------- while( 1 ) { @@ -270,13 +274,13 @@ void TwlMain( void ) break; case LOADING: if( SYSM_IsLoadTitleFinished() ) { - SYSM_StartAuthenticateTitle( pBootTitle ); + SYSM_StartAuthenticateTitle( pBootTitle ); state = AUTHENTICATE; } - if( !direct_boot ) - { - (void)LauncherFadeout( s_titleList ); // ダイレクトブートでないときはフェードアウトも行う - } + if( !direct_boot ) + { + (void)LauncherFadeout( s_titleList ); // ダイレクトブートでないときはフェードアウトも行う + } if( ( end == 0 ) && SYSM_IsLoadTitleFinished() ) { end = OS_GetTick(); @@ -285,22 +289,22 @@ void TwlMain( void ) break; case AUTHENTICATE: if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && - PollingInstallWlanFirmware() && // アプリブート前に無線ファームのロードは完了しておく必要がある + PollingInstallWlanFirmware() && // アプリブート前に無線ファームのロードは完了しておく必要がある SYSM_IsAuthenticateTitleFinished() ) { - if( SYSM_IsFatalError() ) { - // FATALエラー処理 - } - - switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時:never return - case AUTH_RESULT_TITLE_LOAD_FAILED: - case AUTH_RESULT_TITLE_POINTER_ERROR: - case AUTH_RESULT_AUTHENTICATE_FAILED: - case AUTH_RESULT_ENTRY_ADDRESS_ERROR: - state = STOP; - // [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す - break; - } + if( SYSM_IsFatalError() ) { + // FATALエラー処理 + } + + switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時:never return + case AUTH_RESULT_TITLE_LOAD_FAILED: + case AUTH_RESULT_TITLE_POINTER_ERROR: + case AUTH_RESULT_AUTHENTICATE_FAILED: + case AUTH_RESULT_ENTRY_ADDRESS_ERROR: + state = STOP; + // [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す + break; + } } break; case STOP: // 停止 @@ -310,9 +314,9 @@ void TwlMain( void ) // カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得) (void)SYSM_GetCardTitleList( s_titleList ); - // 無線ファームロードのポーリング - (void)PollingInstallWlanFirmware(); - + // 無線ファームロードのポーリング + (void)PollingInstallWlanFirmware(); + // コマンドフラッシュ (void)SND_FlushCommand(SND_COMMAND_NOBLOCK); @@ -321,9 +325,9 @@ void TwlMain( void ) if ( PAD_DetectFold() ) { SYSM_GoSleepMode(); - } -#endif // DISABLE_SLEEP } +#endif // DISABLE_SLEEP +} } @@ -344,18 +348,18 @@ static void INTR_VBlank(void) // nandのtmpディレクトリの中身を消す static void deleteTmp() { - if( FS_DeleteFile( OS_TMP_APP_PATH ) ) - { - OS_TPrintf( "deleteTmp: deleted File '%s' \n", OS_TMP_APP_PATH ); - }else - { - FSResult res = FS_GetArchiveResultCode("nand"); - if( FS_RESULT_SUCCESS == res ) - { - OS_TPrintf( "deleteTmp: File '%s' not exists.\n", OS_TMP_APP_PATH ); - }else - { - OS_TPrintf( "deleteTmp: delete File '%s' failed. Error code = %d.\n", OS_TMP_APP_PATH, res ); - } - } + if( FS_DeleteFile( OS_TMP_APP_PATH ) ) + { + OS_TPrintf( "deleteTmp: deleted File '%s' \n", OS_TMP_APP_PATH ); + }else + { + FSResult res = FS_GetArchiveResultCode("nand"); + if( FS_RESULT_SUCCESS == res ) + { + OS_TPrintf( "deleteTmp: File '%s' not exists.\n", OS_TMP_APP_PATH ); + }else + { + OS_TPrintf( "deleteTmp: delete File '%s' failed. Error code = %d.\n", OS_TMP_APP_PATH, res ); + } + } } diff --git a/build/tests/CheckDSHashTable/src/dht.c b/build/tests/CheckDSHashTable/src/dht.c index 454656de..ddad0e12 100644 --- a/build/tests/CheckDSHashTable/src/dht.c +++ b/build/tests/CheckDSHashTable/src/dht.c @@ -52,6 +52,9 @@ static const u8 g_pubkey_DER[ 0xa2 ] = { static const u8 hmac_key[] = DHT_HMAC_KEY; +static DHTReadFunc ReadFunc; +static void* readArg; +#define PAGE_SIZE 512 /* 自家製bsearch @@ -102,15 +105,45 @@ static int CompareGameCodeAndVersion(const void* a, const void* b) /* データベースを読み込む (前準備) */ +u32 DHT_GetDatabaseLength(const DHTFile* pDHT) +{ + if ( pDHT->header.magic_code != DHT_MAGIC_CODE ) // magic codeチェック + { + OS_TPrintf("Invalid " HASH_PATH " magic code (magic=0x%08X).\n", pDHT->header.magic_code); + return 0; + } + return sizeof(DHTHeader) + pDHT->header.nums * sizeof(DHTDatabase); +} +BOOL DHT_CheckDatabase(const DHTFile* pDHT) +{ + SVCSignHeapContext pool; + u8 heap[4*1024]; + u8 md1[20]; + u8 md2[20]; + s32 result; + // ファイル署名取り出し + SVC_InitSignHeap(&pool, heap, sizeof(heap)); + SVC_DecryptSign(&pool, md1, pDHT->header.sign, &g_pubkey_DER[29]); + // ハッシュ計算 + SVC_CalcSHA1(md2, DHT_GET_SIGN_TARGET_ADDR(&pDHT->header), DHT_GET_SIGN_TARGET_SIZE(&pDHT->header)); + // 検証 + result = SVC_CompareSHA1(md1, md2); + if ( !result ) + { + OS_TPrintf("\n"); + OS_TPrintfEx("SIGN = % 20B\n", md1); + OS_TPrintfEx("HASH = % 20B\n", md2); + OS_TPrintf("Signature is not valid.\n"); + return FALSE; + } + return TRUE; +} + BOOL DHT_PrepareDatabase(DHTFile* pDHT) { FSFile file; u32 length; s32 result; - SVCSignHeapContext pool; - u8 heap[4*1024]; - u8 md1[20]; - u8 md2[20]; PROFILE_INIT(); // ファイルオープン @@ -128,21 +161,16 @@ BOOL DHT_PrepareDatabase(DHTFile* pDHT) OS_TPrintf("Cannot read the header of " HASH_PATH " (result=%d).\n", result); return FALSE; } - if ( pDHT->header.magic_code != DHT_MAGIC_CODE ) - { - OS_TPrintf("Invalid " HASH_PATH " magic code (magic=0x%08X).\n", pDHT->header.magic_code); - return FALSE; - } // サイズチェック PROFILE_COUNT(); length = FS_GetFileLength(&file); - if ( length != sizeof(DHTHeader) + pDHT->header.nums * sizeof(DHTDatabase) ) + if ( length != DHT_GetDatabaseLength(pDHT) ) { - OS_TPrintf("Invalid " HASH_PATH " size (%d != %d).\n", length, sizeof(DHTHeader) + pDHT->header.nums * sizeof(DHTDatabase)); + OS_TPrintf("Invalid " HASH_PATH " size (%d != %d).\n", length, DHT_GetDatabaseLength(pDHT)); return FALSE; } // databaseサイズの保存 - length = pDHT->header.nums * sizeof(DHTDatabase); + length -= sizeof(DHTHeader); // データベース読み込み PROFILE_COUNT(); result = FS_ReadFile(&file, pDHT->database, (s32)length); @@ -152,23 +180,11 @@ BOOL DHT_PrepareDatabase(DHTFile* pDHT) return FALSE; } FS_CloseFile(&file); - // ファイル署名取り出し + + // データベースの検証 PROFILE_COUNT(); - SVC_InitSignHeap(&pool, heap, sizeof(heap)); - SVC_DecryptSign(&pool, md1, pDHT->header.sign, &g_pubkey_DER[29]); - // ハッシュ計算 - PROFILE_COUNT(); - SVC_CalcSHA1(md2, DHT_GET_SIGN_TARGET_ADDR(&pDHT->header), DHT_GET_SIGN_TARGET_SIZE(&pDHT->header)); - // 検証 - PROFILE_COUNT(); - result = SVC_CompareSHA1(md1, md2); - if ( !result ) - { - OS_TPrintfEx("SIGN = % 20B\n", md1); - OS_TPrintfEx("HASH = % 20B\n", md2); - OS_TPrintf("Signature is not valid.\n"); - return FALSE; - } + result = DHT_CheckDatabase(pDHT); + // 結果報告 #ifdef PRINT_PROFILE PROFILE_COUNT(); @@ -177,12 +193,10 @@ BOOL DHT_PrepareDatabase(DHTFile* pDHT) OS_TPrintf("%10d msec for reading header.\n", (int)OS_TicksToMilliSeconds(profile[2]-profile[1])); OS_TPrintf("%10d msec for size check.\n", (int)OS_TicksToMilliSeconds(profile[3]-profile[2])); OS_TPrintf("%10d msec for reading database.\n", (int)OS_TicksToMilliSeconds(profile[4]-profile[3])); - OS_TPrintf("%10d msec for decrypt sign.\n", (int)OS_TicksToMilliSeconds(profile[5]-profile[4])); - OS_TPrintf("%10d msec for hashing database.\n", (int)OS_TicksToMilliSeconds(profile[6]-profile[5])); - OS_TPrintf("%10d msec for comparing hash.\n", (int)OS_TicksToMilliSeconds(profile[7]-profile[6])); - OS_TPrintf("\nTotal: %10d msec.\n", (int)OS_TicksToMilliSeconds(profile[7]-profile[0])); + OS_TPrintf("%10d msec for comparing hash.\n", (int)OS_TicksToMilliSeconds(profile[5]-profile[4])); + OS_TPrintf("\nTotal: %10d msec.\n", (int)OS_TicksToMilliSeconds(profile[5]-profile[0])); #endif - return TRUE; + return result; } /* ROMヘッダに対応するデータベースを手に入れる @@ -212,85 +226,73 @@ const DHTDatabase* DHT_GetDatabase(const DHTFile* pDHT, const ROM_Header_Short* ハッシュ計算 (1) 読み込み済みデータをチェックする */ -BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, const void* pARM9, const void* pARM7) +void DHT_CheckHashPhase1Init(SVCHMACSHA1Context* ctx, const ROM_Header_Short* pROMHeader) +{ + // 準備 + SVC_HMACSHA1Init(ctx, hmac_key, sizeof(hmac_key)); + // ヘッダ + SVC_HMACSHA1Update(ctx, pROMHeader, DHT_DS_HEADER_SIZE); +} +void DHT_CheckHashPhase1Update(SVCHMACSHA1Context* ctx, const void* ptr, u32 length) +{ + // ARM9 or ARM7 static + SVC_HMACSHA1Update(ctx, ptr, length); +} +BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const DHTDatabase *db) { - SVCHMACSHA1Context ctx; u8 md[20]; BOOL result; - PROFILE_INIT(); - - // 準備 - PROFILE_COUNT(); - SVC_HMACSHA1Init(&ctx, hmac_key, sizeof(hmac_key)); - // ヘッダ - PROFILE_COUNT(); - SVC_HMACSHA1Update(&ctx, pROMHeader, DHT_DS_HEADER_SIZE); - // ARM9 Static - PROFILE_COUNT(); - SVC_HMACSHA1Update(&ctx, pARM9, pROMHeader->main_size); - // ARM7 Static - PROFILE_COUNT(); - SVC_HMACSHA1Update(&ctx, pARM7, pROMHeader->sub_size); - // 検証 - PROFILE_COUNT(); - SVC_HMACSHA1GetHash(&ctx, md); + SVC_HMACSHA1GetHash(ctx, md); result = SVC_CompareSHA1(db->hash[0], md); if ( !result ) { + OS_TPrintf("\n"); OS_TPrintfEx("DB = % 20B\n", db->hash[0]); OS_TPrintfEx("HASH = % 20B\n", md); OS_TPrintf("%s: hash[0] is not valid.\n", __func__); } + return result; +} +BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, const void* pARM9, const void* pARM7) +{ + SVCHMACSHA1Context ctx; + BOOL result; + PROFILE_INIT(); + + // 準備&ヘッダ + PROFILE_COUNT(); + DHT_CheckHashPhase1Init(&ctx, pROMHeader); + + // ARM9 Static + PROFILE_COUNT(); + DHT_CheckHashPhase1Update(&ctx, pARM9, pROMHeader->main_size); + // ARM7 Static + PROFILE_COUNT(); + DHT_CheckHashPhase1Update(&ctx, pARM7, pROMHeader->sub_size); + // 検証 + PROFILE_COUNT(); + result = DHT_CheckHashPhase1Final(&ctx, db); // 結果報告 #ifdef PRINT_PROFILE PROFILE_COUNT(); OS_TPrintf("\nDone to check the hash (phase 1).\n"); - OS_TPrintf("%10d msec for preparing hash.\n", (int)OS_TicksToMilliSeconds(profile[1]-profile[0])); - OS_TPrintf("%10d msec for scanning header.\n", (int)OS_TicksToMilliSeconds(profile[2]-profile[1])); - OS_TPrintf("%10d msec for scanning ARM9.\n", (int)OS_TicksToMilliSeconds(profile[3]-profile[2])); - OS_TPrintf("%10d msec for scanning ARM7.\n", (int)OS_TicksToMilliSeconds(profile[4]-profile[3])); - OS_TPrintf("%10d msec for comparing hash.\n", (int)OS_TicksToMilliSeconds(profile[5]-profile[4])); - OS_TPrintf("\nTotal: %10d msec.\n", (int)OS_TicksToMilliSeconds(profile[5]-profile[0])); + OS_TPrintf("%10d msec for scanning header.\n", (int)OS_TicksToMilliSeconds(profile[1]-profile[0])); + OS_TPrintf("%10d msec for scanning ARM9.\n", (int)OS_TicksToMilliSeconds(profile[2]-profile[1])); + OS_TPrintf("%10d msec for scanning ARM7.\n", (int)OS_TicksToMilliSeconds(profile[3]-profile[2])); + OS_TPrintf("%10d msec for comparing hash.\n", (int)OS_TicksToMilliSeconds(profile[4]-profile[3])); + OS_TPrintf("\nTotal: %10d msec.\n", (int)OS_TicksToMilliSeconds(profile[4]-profile[0])); #endif return result; } + /* ハッシュ計算 (2) 対象領域の読み込みとチェックを行う FSを用いたテストの場合とCARDアプリの場合で異なる */ -#if 1 -// FS版 (fctx == FSFile*) -static BOOL ReadImage(void* fctx, void* dest, s32 offset, s32 length) +static BOOL ImageHMACSHA1Update(SVCHMACSHA1Context* ctx, s32 offset, s32 length, void* buffer) { - FSFile* fp = fctx; - s32 result; - if ( !FS_SeekFile(fp, offset, FS_SEEK_SET) ) - { - OS_TPrintf("Cannot seek to the offset (%d bytes).\n", offset); - return FALSE; - } - result = FS_ReadFile(fp, dest, length); - if ( result != length ) - { - OS_TPrintf("Cannot read the data (%d bytes).\n", length); - return FALSE; - } - return TRUE; -} -#else -// CARD版 (fctx == dma no) -static BOOL ReadImage(void* fctx, void* dest, s32 offset, s32 length) -{ - u32 dma = (u32)fctx; - CARD_ReadRom(dma, (void*)offset, dest, (u32)length); - return TRUE; -} -#endif - -static BOOL ImageHMACSHA1Update(SVCHMACSHA1Context* ctx, void* fctx, s32 offset, s32 length, void* buffer) -{ - if ( !ReadImage(fctx, buffer, offset, length) ) + if ( !ReadFunc(buffer, offset, length, readArg) ) { return FALSE; } @@ -298,25 +300,33 @@ static BOOL ImageHMACSHA1Update(SVCHMACSHA1Context* ctx, void* fctx, s32 offset, return TRUE; } -static BOOL GetOverlayInfo(int no, void* fctx, int fat_offset, int* pOffset, int* pLength) +static BOOL GetOverlayInfo(int no, int fat_offset, int* pOffset, int* pLength) { - ROM_FAT fat; - if ( !ReadImage(fctx, &fat, fat_offset + no * (s32)sizeof(ROM_FAT), sizeof(ROM_FAT)) ) + ROM_FAT *fat; + static u8 fat_cache[PAGE_SIZE]; + static int last_page = 0; + int page = (fat_offset + no * (s32)sizeof(ROM_FAT)) / PAGE_SIZE; + if ( last_page != page ) { - return FALSE; + if ( !ReadFunc(&fat_cache, page * PAGE_SIZE, PAGE_SIZE, readArg) ) + { + return FALSE; + } + last_page = page; } + fat = (ROM_FAT*)(fat_cache + fat_offset + no * sizeof(ROM_FAT) - page * PAGE_SIZE); if ( pOffset ) { - *pOffset = (s32)fat.top.offset; + *pOffset = (s32)fat->top.offset; } if ( pLength ) { - *pLength = (s32)(fat.bottom.offset - fat.top.offset); + *pLength = (s32)(fat->bottom.offset - fat->top.offset); } return TRUE; } -BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, void* fctx, void* buffer) +BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, void* buffer, DHTReadFunc func, void* arg) { int overlay_nums = (int)(pROMHeader->main_ovt_size / sizeof(ROM_OVT)); u8 md[20]; @@ -328,19 +338,26 @@ BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHead int total_sectors; int i; + if ( !func ) + { + return FALSE; + } + ReadFunc = func; + readArg = arg; + // 準備 PROFILE_COUNT(); SVC_HMACSHA1Init(&ctx, hmac_key, sizeof(hmac_key)); // OVT PROFILE_COUNT(); - if ( !ImageHMACSHA1Update(&ctx, fctx, (s32)pROMHeader->main_ovt_offset, (s32)pROMHeader->main_ovt_size, buffer) ) + if ( !ImageHMACSHA1Update(&ctx, (s32)pROMHeader->main_ovt_offset, (s32)pROMHeader->main_ovt_size, buffer) ) { OS_TPrintf("Cannot calc HMAC-SHA1 for OVT.\n"); return FALSE; } // FAT PROFILE_COUNT(); - if ( !ImageHMACSHA1Update(&ctx, fctx, (s32)pROMHeader->fat_offset, overlay_nums * (s32)sizeof(ROM_FAT), buffer) ) + if ( !ImageHMACSHA1Update(&ctx, (s32)pROMHeader->fat_offset, overlay_nums * (s32)sizeof(ROM_FAT), buffer) ) { OS_TPrintf("Cannot calc HMAC-SHA1 for %d of FAT.\n", overlay_nums); return FALSE; @@ -353,7 +370,7 @@ BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHead int max_sectors = (DHT_OVERLAY_MAX/512 - total_sectors) / (overlay_nums - i); int offset; int length; - if ( !GetOverlayInfo(i, fctx, (s32)pROMHeader->fat_offset, &offset, &length) ) + if ( !GetOverlayInfo(i, (s32)pROMHeader->fat_offset, &offset, &length) ) { OS_TPrintf("Cannot get %d of overlay info.\n", i); return FALSE; @@ -363,7 +380,7 @@ BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHead { length = max_sectors; } - if ( !ImageHMACSHA1Update(&ctx, fctx, offset, length * 512, buffer) ) + if ( !ImageHMACSHA1Update(&ctx, offset, length * 512, buffer) ) { OS_TPrintf("Cannot calc HMAC-SHA1 for %d of overlay.\n", i); return FALSE; @@ -385,6 +402,7 @@ BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHead } if ( !SVC_CompareSHA1(md, db->hash[1]) ) { + OS_TPrintf("\n"); OS_TPrintfEx("DB = % 20B\n", db->hash[1]); OS_TPrintfEx("HASH = % 20B\n", md); OS_TPrintf("%s: hash[1] is not valid.\n", __func__); diff --git a/build/tests/CheckDSHashTable/src/main.c b/build/tests/CheckDSHashTable/src/main.c index 2194d15b..944c8f65 100644 --- a/build/tests/CheckDSHashTable/src/main.c +++ b/build/tests/CheckDSHashTable/src/main.c @@ -47,6 +47,49 @@ static u8 rom_arm9[3*1024*1024] ATTRIBUTE_ALIGN(32); static u8 rom_arm7[1024*1024] ATTRIBUTE_ALIGN(32); #include +/* + デバイスアクセスAPI +*/ +#if 0 +// FS版 (fctx == FSFile*) +static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg) +{ + FSFile* fp = arg; + s32 result; + if ( !FS_SeekFile(fp, offset, FS_SEEK_SET) ) + { + OS_TPrintf("Cannot seek to the offset (%d bytes).\n", offset); + return FALSE; + } + result = FS_ReadFile(fp, dest, length); + if ( result != length ) + { + OS_TPrintf("Cannot read the data (%d bytes).\n", length); + return FALSE; + } + return TRUE; +} +#else +#ifdef SDK_ARM9 +#define PAGE_SIZE 512 +// CARD版 (fctx == dma no) +static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg) +{ + u32 dma = (u32)arg; + CARD_ReadRom(dma, (void*)offset, dest, (u32)length); + return TRUE; +} +#else +// HOTSW版 (fctx == CardBootData* cdb) +#include +#include +static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg) +{ + HotSwState retval = ReadPageGame((CardBootData*)arg, (u32)offset, dest, (u32)length); + return (retval == HOTSW_SUCCESS); +} +#endif +#endif static void VBlankIntr( void ) { @@ -116,7 +159,7 @@ static BOOL CheckValidation(FSFile* fp) return FALSE; } // ハッシュ計算 (2) - 隠蔽は難しいか - if ( !DHT_CheckHashPhase2(db, &rom_header, fp, ov_buffer) ) + if ( !DHT_CheckHashPhase2(db, &rom_header, ov_buffer, ReadImage, fp) ) { return FALSE; } diff --git a/include/sysmenu/dht/dht.h b/include/sysmenu/dht/dht.h index db5dbb97..7f79a945 100644 --- a/include/sysmenu/dht/dht.h +++ b/include/sysmenu/dht/dht.h @@ -25,10 +25,35 @@ extern "C" { #endif +typedef BOOL (*DHTReadFunc)(void* dest, s32 offset, s32 length, void* arg); + /*---------------------------------------------------------------------------* Name: DHT_PrepareDatabase - Description: 全データベースを読み込む + Description: 読み込み済みのデータベースのヘッダからサイズを返す + + Arguments: pDHT データベースヘッダの格納先 + + Returns: 正しそうなヘッダならサイズ、そうでないなら0 + *---------------------------------------------------------------------------*/ +u32 DHT_GetDatabaseLength(const DHTFile* pDHT); + +/*---------------------------------------------------------------------------* + Name: DHT_PrepareDatabase + + Description: 読み込み済みの全データベースの署名を検証する + + Arguments: pDHT データベースの格納先 + + Returns: 成功すればTRUE + *---------------------------------------------------------------------------*/ +BOOL DHT_CheckDatabase(const DHTFile* pDHT); + +/*---------------------------------------------------------------------------* + Name: DHT_PrepareDatabase + + Description: FS関数を利用して全データベースを読み込み検証まで行う + ファイル名は/sign/DSHashTable.bin固定 Arguments: pDHT 全データベースの格納先 @@ -48,6 +73,45 @@ BOOL DHT_PrepareDatabase(DHTFile* pDHT); *---------------------------------------------------------------------------*/ const DHTDatabase* DHT_GetDatabase(const DHTFile* pDHT, const ROM_Header_Short* pROMHeader); +/*---------------------------------------------------------------------------* + Name: DHT_CheckHashPhase1Init + + Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証の準備 + + Arguments: ctx 検証用のSVCHMACSHA1コンテキスト + pROMHeader 対象となるROMヘッダ格納先 + + Returns: None + *---------------------------------------------------------------------------*/ +void DHT_CheckHashPhase1Init(SVCHMACSHA1Context* ctx, const ROM_Header_Short* pROMHeader); + +/*---------------------------------------------------------------------------* + Name: DHT_CheckHashPhase1Update + + Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証のスタティック部分 + いくら分割しても良いが、ARM9スタティック、ARM7スタティックの順に + 呼び出すこと。 + + Arguments: ctx 検証用のSVCHMACSHA1コンテキスト + ptr 対象となるデータ領域 + length 対象となるデータサイズ + + Returns: None + *---------------------------------------------------------------------------*/ +void DHT_CheckHashPhase1Update(SVCHMACSHA1Context* ctx, const void* ptr, u32 length); + +/*---------------------------------------------------------------------------* + Name: DHT_CheckHashPhase1 + + Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証の結果判定 + + Arguments: ctx 検証用のSVCHMACSHA1コンテキスト + db 対象データベースへのポインタ + + Returns: 問題なければTRUE + *---------------------------------------------------------------------------*/ +BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const DHTDatabase *db); + /*---------------------------------------------------------------------------* Name: DHT_CheckHashPhase1 @@ -65,17 +129,19 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead /*---------------------------------------------------------------------------* Name: DHT_CheckHashPhase2 - Description: オー馬齢領域の検証 + Description: オーバーレイ領域の検証 + (デバイスのRead APIを登録できるべき) Arguments: db 対象データベースへのポインタ pROMHeader 対象となるROMヘッダ格納先 fctx (FS版) FSFile構造体へのポインタ (CARD版) dma番号をvoid*にキャストしたもの + (HOTSW版) CardBootData構造体へのポインタ buffer 本APIで使用するワーク (DHT_OVERLAY_MAXだけ必要) Returns: 問題なければTRUE *---------------------------------------------------------------------------*/ -BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, void* fctx, void* buffer); +BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, void* buffer, DHTReadFunc func, void* arg); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/sysmenu/sysmenu_lib/common/pxi.h b/include/sysmenu/sysmenu_lib/common/pxi.h index cef4d8c5..50a2559b 100644 --- a/include/sysmenu/sysmenu_lib/common/pxi.h +++ b/include/sysmenu/sysmenu_lib/common/pxi.h @@ -27,16 +27,20 @@ extern "C" { //---------------------------------------------------------------------- // PXIコマンド //---------------------------------------------------------------------- -#define SYSMENU_PXI_FIFO_TAG (PXI_MAX_FIFO_TAG - 1) -#define PXI_FIFO_TAG_MCUTEST (PXI_MAX_FIFO_TAG - 2) -#define PXI_FIFO_TAG_HOTSW (PXI_MAX_FIFO_TAG - 3) -#define PXI_FIFO_TAG_DECRYPTAES (PXI_MAX_FIFO_TAG - 4) + // (PXI_MAX_FIFO_TAG - 1) is used by SEA +#define PXI_FIFO_TAG_MCUTEST (PXI_MAX_FIFO_TAG - 2) +#define PXI_FIFO_TAG_HOTSW (PXI_MAX_FIFO_TAG - 3) +#define PXI_FIFO_TAG_DECRYPTAES (PXI_MAX_FIFO_TAG - 4) +#define SYSMENU_PXI_FIFO_TAG (PXI_MAX_FIFO_TAG - 5) typedef enum SYSMPXICommand { - SYSM_PXI_COMM_BL_BRIGHT = 0, - SYSM_PXI_COMM_DISABLE_HOTSW = 1, + SYSM_PXI_COMM_BL_BRIGHT = 0, + SYSM_PXI_COMM_DISABLE_HOTSW = 1, +#ifdef DHT_TEST + SYSM_PXI_COMM_DS_HASH_TABLE = 2, +#endif - SYSM_PXI_COMM_NUM + SYSM_PXI_COMM_NUM }SYSMPXICommand; /*---------------------------------------------------------------------------* @@ -50,6 +54,12 @@ void SYSM_InitPXI( void ); void SYSM_InitPXI( u32 mcu_prio ); #endif // SDK_ARM7 +#ifdef DHT_TEST +#ifdef SDK_ARM9 +void SYSMi_PrepareDatabase(void); +#endif +#endif + // PXIコマンド送信 BOOL SYSMi_TrySendPXICommand( SYSMPXICommand cmd, u16 data ); BOOL SYSMi_SendPXICommand( SYSMPXICommand command, u16 data );