(更新:Akabane Jumpei)

・カードバスのロックIDとカードリソースの排他制御用ロックIDをHOTSW_Init時に取得して、IDを持ち続けるように変更
・カードからデータを読む関数で、一番最初に発生したエラーを返すように変更
・排他制御のロックは、TryLockを使い、ロックできなかった場合は1ms待ってから再度ロックを試行するように変更
・今まではロムヘッダの読み込みとCRCチェックまでしかARM9と排他制御していなかったのを、バナーファイルを読み込みフラグの処理が終わるまで排他制御し続けるように修正
・各種コメント追加

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@740 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-26 02:04:12 +00:00
parent 00efdd6242
commit 6446c51808

View File

@ -20,7 +20,7 @@
#include <dsCardType2.h> #include <dsCardType2.h>
#include <romEmulation.h> #include <romEmulation.h>
#include <customNDma.h> #include <customNDma.h>
#include <../build/libraries/mb/common/include/mb_fileinfo.h> // MB_AUTHCODE_SIZE #include <../build/libraries/mb/common/include/mb_fileinfo.h>
//#define HOTSW_FORCE_CARD_B //#define HOTSW_FORCE_CARD_B
@ -85,6 +85,9 @@ static void InterruptCallbackCard(void);
static void InterruptCallbackCardDet(void); static void InterruptCallbackCardDet(void);
static void InterruptCallbackCardData(void); static void InterruptCallbackCardData(void);
static void LockHotSwRsc(OSLockWord* word);
static void UnlockHotSwRsc(OSLockWord* word);
static void McThread(void *arg); static void McThread(void *arg);
static void McPowerOn(void); static void McPowerOn(void);
static void McPowerOff(void); static void McPowerOff(void);
@ -95,6 +98,7 @@ static void DecryptObjectFile(void);
static HotSwState LoadTable(void); static HotSwState LoadTable(void);
static HotSwState ReadRomEmulationData(void); static HotSwState ReadRomEmulationData(void);
static HotSwState ReadIDNormal(void); static HotSwState ReadIDNormal(void);
static HotSwState LoadBannerData(void);
static HotSwState LoadStaticModule(void); static HotSwState LoadStaticModule(void);
static HotSwState LoadCardData(void); static HotSwState LoadCardData(void);
static HotSwState CheckCardAuthCode(void); static HotSwState CheckCardAuthCode(void);
@ -116,6 +120,9 @@ static void ShowRomHeaderData(void);
static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj"; static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj";
static char *rom_emu_info ATTRIBUTE_ALIGN(4) = "TWLD"; static char *rom_emu_info ATTRIBUTE_ALIGN(4) = "TWLD";
static u16 s_RscLockID;
static u16 s_CardLockID;
static u32 s_SecureSegBufSize, s_BootSegBufSize; static u32 s_SecureSegBufSize, s_BootSegBufSize;
static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく
@ -204,6 +211,22 @@ void HOTSW_Init(void)
// カードスレッド用構造体の初期化 // カードスレッド用構造体の初期化
MI_CpuClear8(&s_ctData, sizeof(CardThreadData)); MI_CpuClear8(&s_ctData, sizeof(CardThreadData));
// HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける)
{
s32 tempLockID;
// ARM9と排他制御用のロックIDの取得
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
OS_PutString("Error - Can't Get Lock ID\n");
}
s_RscLockID = (u16)tempLockID;
// カードアクセス用のロックIDの取得
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
OS_PutString("Error - Can't Get Lock ID\n");
}
s_CardLockID = (u16)tempLockID;
}
// カードブート用スレッドの生成 // カードブート用スレッドの生成
OS_CreateThread(&s_ctData.thread, OS_CreateThread(&s_ctData.thread,
@ -226,10 +249,9 @@ void HOTSW_Init(void)
// Secure Segment バッファの設定 // Secure Segment バッファの設定
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
// カードが挿さってあったらスレッドを起動する // カードが挿さってあったらスレッドを起動する
if(HOTSW_IsCardExist()){ if(HOTSW_IsCardExist()){
// OS_PutString("Card Boot Start\n");
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
@ -237,10 +259,7 @@ void HOTSW_Init(void)
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
} }
else{ else{
// OS_PutString("No Card...\n");
//#ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
//#endif
} }
} }
@ -257,25 +276,16 @@ void HOTSW_Init(void)
static HotSwState LoadCardData(void) static HotSwState LoadCardData(void)
{ {
OSTick start; OSTick start;
s32 tempLockID;
HotSwState retval = HOTSW_SUCCESS; HotSwState retval = HOTSW_SUCCESS;
HotSwState state = HOTSW_SUCCESS;
start = OS_GetTick(); start = OS_GetTick();
// カードのロックIDを取得
tempLockID = OS_GetLockID();
if(tempLockID == OS_LOCK_ID_ERROR){
return HOTSW_CARD_LOCK_ERROR;
}
else{
s_cbData.lockID = (u16)tempLockID;
}
// カードのロック // カードのロック
#ifndef DEBUG_USED_CARD_SLOT_B_ #ifndef DEBUG_USED_CARD_SLOT_B_
CARD_LockRom(s_cbData.lockID); CARD_LockRom(s_CardLockID);
#else #else
LockExCard(s_cbData.lockID); LockExCard(s_CardLockID);
#endif #endif
// カード電源リセット // カード電源リセット
@ -297,36 +307,40 @@ static HotSwState LoadCardData(void)
// ブート処理開始 // ブート処理開始
if(HOTSW_IsCardExist()){ if(HOTSW_IsCardExist()){
// Arm9との排他制御用ロックIDを取得する
u16 id = (u16)OS_GetLockID();
// カード側でKey Tableをロードする // カード側でKey Tableをロードする
retval = LoadTable(); state = LoadTable();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Normal Mode ---------------------- // ---------------------- Normal Mode ----------------------
// カードID読み込み // カードID読み込み
retval = ReadIDNormal(); state = ReadIDNormal();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
if(s_cbData.id_nml & 0x80000000){ if(s_cbData.id_nml & 0x80000000){
s_cbData.cardType = DS_CARD_TYPE_2; s_cbData.cardType = DS_CARD_TYPE_2;
// OS_TPrintf("Card Type2\n");
} }
else{ else{
s_cbData.cardType = DS_CARD_TYPE_1; s_cbData.cardType = DS_CARD_TYPE_1;
// OS_TPrintf("Card Type1\n");
} }
{ {
u8 i; u8 i;
u8 *romEmuInf = (u8 *)s_cbData.romEmuBuf; u8 *romEmuInf = (u8 *)s_cbData.romEmuBuf;
// ※最低限ARM9と排他制御しないといけない範囲はこれだけ // バナーリードが完了して、フラグ処理が終わるまでARM9と排他制御する
u16 id = (u16)OS_GetLockID(); LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
// Boot Segment読み込み // Boot Segment読み込み
retval = s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData); state = s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// Romエミュレーション情報を取得 // Romエミュレーション情報を取得
retval = ReadRomEmulationData(); state = ReadRomEmulationData();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// 取得したRomエミュレーション情報を比較 // 取得したRomエミュレーション情報を比較
s_cbData.debuggerFlg = TRUE; s_cbData.debuggerFlg = TRUE;
@ -353,17 +367,20 @@ static HotSwState LoadCardData(void)
if( ( 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 ) ){ ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){
retval = HOTSW_CRC_CHECK_ERROR; retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval;
} }
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
OS_ReleaseLockID( id );
} }
if( retval == HOTSW_SUCCESS ) { if( retval == HOTSW_SUCCESS ) {
// NTRカードかTWLカードか // NTRカードかTWLカードか
if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ #define DEBUG_MODE
// OS_TPrintf("TWL Card.\n"); #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)
#endif
{
OS_TPrintf("TWL Card.\n");
s_cbData.twlFlg = TRUE; s_cbData.twlFlg = TRUE;
} }
else{ else{
@ -373,80 +390,95 @@ static HotSwState LoadCardData(void)
// SecureコマンドのPNG_ONコマンドetc用のレイテンシを求める(Latency1とLatency2を足す) // 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初期化 // Key Table初期化
GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8); GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8);
// コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成 // コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成
GenVA_VB_VD(); GenVA_VB_VD();
// セキュアモードに移行 // セキュアモードに移行
retval = s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData); state = s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Secure Mode ---------------------- // ---------------------- Secure Mode ----------------------
// PNG設定 // PNG設定
retval = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// DS側符号生成回路初期値設定 (レジスタ設定) // DS側符号生成回路初期値設定 (レジスタ設定)
SetMCSCR(); SetMCSCR();
// ID読み込み // ID読み込み
retval = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードIDの比較をして、一致しなければFALSEを返す // カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_nml != s_cbData.id_scr){ if(s_cbData.id_nml != s_cbData.id_scr){
retval = HOTSW_ID_CHECK_ERROR; retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
} }
if(retval == HOTSW_SUCCESS){ if(retval == HOTSW_SUCCESS){
// Secure領域のSegment読み込み // Secure領域のSegment読み込み
retval = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
} }
// ゲームモードに移行 // ゲームモードに移行
retval = 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;
if(retval != HOTSW_SUCCESS){
goto error;
}
// ---------------------- Game Mode ---------------------- // ---------------------- Game Mode ----------------------
// ID読み込み // ID読み込み
retval = s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); state = s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// バナーファイルの読み込み
state = LoadBannerData();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで)
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
// カードIDの比較をして、一致しなければFALSEを返す // カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_scr != s_cbData.id_gam){ if(s_cbData.id_scr != s_cbData.id_gam){
retval = HOTSW_ID_CHECK_ERROR; retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
goto error; goto error;
} }
// 常駐モジュール残りを指定先に転送 // 常駐モジュール残りを指定先に転送
retval = LoadStaticModule(); state = LoadStaticModule();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
DecryptObjectFile(); DecryptObjectFile();
// 認証コード読み込み&ワーク領域にコピー // 認証コード読み込み&ワーク領域にコピー
retval = CheckCardAuthCode(); 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);
}
} }
else{ else{
retval = HOTSW_PULLED_OUT_ERROR; retval = (retval == HOTSW_SUCCESS) ? HOTSW_PULLED_OUT_ERROR : retval;
} }
goto end; goto end;
error: error:
OS_TPrintf("ng... retval : %d\n", retval); OS_TPrintf("ng... retval : %d\n", retval);
end: end:
// カードのロック開放
#ifndef DEBUG_USED_CARD_SLOT_B_
CARD_UnlockRom(s_cbData.lockID);
#else
UnlockExCard(s_cbData.lockID);
#endif
// カードロックIDの開放 // カードのロック開放(※ロックIDは開放せずに持ち続ける)
OS_ReleaseLockID( s_cbData.lockID ); #ifndef DEBUG_USED_CARD_SLOT_B_
CARD_UnlockRom(s_CardLockID);
#else
UnlockExCard(s_CardLockID);
#endif
// OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); // OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
@ -463,6 +495,43 @@ void* HOTSW_GetRomEmulationBuffer(void)
return s_cbData.romEmuBuf; return s_cbData.romEmuBuf;
} }
/* -----------------------------------------------------------------
* LoadBannerData関数
*
*
*
*
* ----------------------------------------------------------------- */
static HotSwState LoadBannerData(void)
{
BOOL state;
HotSwState retval = HOTSW_SUCCESS;
// バナーリード
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.banner_offset,
(u32 *)SYSM_CARD_BANNER_BUF,
sizeof(TWLBannerFile) );
}
else{
// バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK)
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
SYSMi_GetWork()->flags.common.isExistCard = TRUE;
return retval;
}
// バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK)
state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE;
SYSMi_GetWork()->flags.common.isValidCardBanner = state;
SYSMi_GetWork()->flags.common.isCardStateChanged = state;
SYSMi_GetWork()->flags.common.isExistCard = state;
return retval;
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* LoadStaticModule関数 * LoadStaticModule関数
* *
@ -473,38 +542,15 @@ void* HOTSW_GetRomEmulationBuffer(void)
static HotSwState LoadStaticModule(void) static HotSwState LoadStaticModule(void)
{ {
HotSwState retval = HOTSW_SUCCESS; HotSwState retval = HOTSW_SUCCESS;
HotSwState state = HOTSW_SUCCESS;
//#ifdef DEBUG_USED_CARD_SLOT_B_
// バナーリード
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
// OS_TPrintf(" - Banner Loading...\n");
retval = s_funcTable[s_cbData.cardType].ReadPage_G(
&s_cbData,
s_cbData.pBootSegBuf->rh.s.banner_offset,
(u32 *)SYSM_CARD_BANNER_BUF,
sizeof(TWLBannerFile) );
}
if(retval != HOTSW_SUCCESS){
return retval;
}
if(HOTSW_IsCardExist())
{
SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
SYSMi_GetWork()->flags.common.isExistCard = TRUE;
}
//#endif
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address; s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送 // 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg); SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE); s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
if(retval != HOTSW_SUCCESS){ if(retval != HOTSW_SUCCESS){
return retval; return retval;
@ -513,10 +559,8 @@ static HotSwState LoadStaticModule(void)
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address; s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg); SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size);
s_cbData.pBootSegBuf->rh.s.sub_rom_offset, retval = (retval == HOTSW_SUCCESS) ? state : retval;
(u32 *)s_cbData.arm7Stc,
s_cbData.pBootSegBuf->rh.s.sub_size);
if(retval != HOTSW_SUCCESS){ if(retval != HOTSW_SUCCESS){
return retval; return retval;
@ -529,15 +573,15 @@ static HotSwState LoadStaticModule(void)
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address; s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送※TWLカード対応していないので、注意 // 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送※TWLカード対応していないので、注意
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE); SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size);
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, retval = (retval == HOTSW_SUCCESS) ? state : retval;
(u32 *)SYSM_CARD_TWL_SECURE_BUF,
size);
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size); s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
} }
if(retval != HOTSW_SUCCESS){ if(retval != HOTSW_SUCCESS){
@ -547,10 +591,8 @@ static HotSwState LoadStaticModule(void)
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;
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE); SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, state = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, retval = (retval == HOTSW_SUCCESS) ? state : retval;
(u32 *)s_cbData.arm7Ltd,
s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
if(retval != HOTSW_SUCCESS){ if(retval != HOTSW_SUCCESS){
return retval; return retval;
@ -561,9 +603,11 @@ static HotSwState LoadStaticModule(void)
u8 sha1data[DIGEST_SIZE_SHA1]; u8 sha1data[DIGEST_SIZE_SHA1];
SVCHMACSHA1Context hash; 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) );
@ -572,31 +616,37 @@ static HotSwState LoadStaticModule(void)
// ハッシュコンテキストをWork領域にコピー // ハッシュコンテキストをWork領域にコピー
MI_CpuCopy8( &hash, &SYSMi_GetWork2()->hmac_sha1_context, sizeof(SVCHMACSHA1Context) ); MI_CpuCopy8( &hash, &SYSMi_GetWork2()->hmac_sha1_context, sizeof(SVCHMACSHA1Context) );
// ハッシュコンテキスト計算終了を通知
} }
#define MY_DEBUG
#ifdef MY_DEBUG
// Arm9常駐モジュール Hash値のチェック // Arm9常駐モジュール Hash値のチェック
if(!CheckArm9HashValue()){ if(!CheckArm9HashValue()){
retval = HOTSW_HASH_CHECK_ERROR; state = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm9 Static Module Hash Check Error...\n"); OS_PutString("×Arm9 Static Module Hash Check Error...\n");
} }
// Arm7常駐モジュール Hash値のチェック // Arm7常駐モジュール Hash値のチェック
if(!CheckArm7HashValue()){ if(!CheckArm7HashValue()){
retval = HOTSW_HASH_CHECK_ERROR; state = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm7 Static Module Hash Check Error...\n"); OS_PutString("×Arm7 Static Module Hash Check Error...\n");
} }
// Arm9拡張常駐モジュール Hash値のチェック // Arm9拡張常駐モジュール Hash値のチェック
if(!CheckExtArm9HashValue()){ if(!CheckExtArm9HashValue()){
retval = HOTSW_HASH_CHECK_ERROR; state = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n");
} }
// Arm7拡張常駐モジュール Hash値のチェック // Arm7拡張常駐モジュール Hash値のチェック
if(!CheckExtArm7HashValue()){ if(!CheckExtArm7HashValue()){
retval = HOTSW_HASH_CHECK_ERROR; state = HOTSW_HASH_CHECK_ERROR;
OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n"); OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n");
} }
retval = (retval == HOTSW_SUCCESS) ? state : retval;
#endif
} }
return retval; return retval;
@ -654,8 +704,6 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size)
// バッファの初期化 // バッファの初期化
MI_CpuClear8(s_pBootSegBuffer, size); MI_CpuClear8(s_pBootSegBuffer, size);
OS_TPrintf("*** Boot Segm Address : 0x%08x\n", s_pBootSegBuffer);
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
@ -676,11 +724,8 @@ void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size)
// バッファの初期化 // バッファの初期化
MI_CpuClear8(s_pSecureSegBuffer, size); MI_CpuClear8(s_pSecureSegBuffer, size);
OS_TPrintf("*** Scr Seg Buf Address : 0x%08x\n", s_pSecureSegBuffer);
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* GenVA_VB_VD関数 * GenVA_VB_VD関数
* *
@ -870,6 +915,30 @@ static void DecryptObjectFile(void)
MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); MI_CpuCopy32(pEncBuf, pEncDes, (u32)size);
} }
/* -----------------------------------------------------------------
* LockHotSwRsc関数
*
*  lockを行う
* ----------------------------------------------------------------- */
static void LockHotSwRsc(OSLockWord* word)
{
while(OS_TryLockByWord( s_RscLockID, word, NULL ) != OS_LOCK_SUCCESS){
OS_Sleep(1);
}
// OS_TPrintf("++ lock id : %d wordLockFlg : %d wordOwnerID : %d\n", s_RscLockID, word->lockFlag, word->ownerID);
}
/* -----------------------------------------------------------------
* UnlockHotSwRsc関数
*
*  Unlockを行う
* ----------------------------------------------------------------- */
static void UnlockHotSwRsc(OSLockWord* word)
{
OS_UnlockByWord( s_RscLockID, word, NULL );
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* HOTSW_IsCardExist関数 * HOTSW_IsCardExist関数
* *
@ -979,7 +1048,8 @@ static void McPowerOn(void)
} }
if(CmpMcSlotMode(SLOT_STATUS_MODE_00) == TRUE){ if(CmpMcSlotMode(SLOT_STATUS_MODE_00) == TRUE){
// 100ms待ち [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。
// VDDの安定期間待ち
OS_Sleep(100); OS_Sleep(100);
// SCFG_MC1 の Slot Status の M1,M0 を 01 にする // SCFG_MC1 の Slot Status の M1,M0 を 01 にする
@ -989,13 +1059,16 @@ static void McPowerOn(void)
// SCFG_MC1 の Slot Status の M1,M0 を 10 にする // SCFG_MC1 の Slot Status の M1,M0 を 10 にする
SetMcSlotMode(SLOT_STATUS_MODE_10); SetMcSlotMode(SLOT_STATUS_MODE_10);
// 1ms待ち
// [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。
// RESBを上げるまでの待ち時間
OS_Sleep(1); OS_Sleep(1);
// リセットをhighに (RESB = 1にする) // リセットをhighに (RESB = 1にする)
reg_HOTSW_MCCNT1 = RESB_MASK; reg_HOTSW_MCCNT1 = RESB_MASK;
// [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。
// カードへ最初のコマンドを送るまでの待ち時間
OS_Sleep(100); OS_Sleep(100);
} }
} }
@ -1101,10 +1174,10 @@ static void McThread(void *arg)
// フラグケア // フラグケア
{ {
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL );
SYSMi_GetWork()->flags.common.isExistCard = TRUE; SYSMi_GetWork()->flags.common.isExistCard = TRUE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL );
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
} }
@ -1182,7 +1255,7 @@ static void InterruptCallbackCard(void)
// メッセージインデックスをインクリメント // メッセージインデックスをインクリメント
s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
OS_TPrintf("○ - idx_pulledOut : %d\n", s_ctData.idx_pulledOut); OS_TPrintf("○ - idx_pullout : %d Slot B state : 0x%08x\n", s_ctData.idx_pulledOut, reg_MI_MC1);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -1201,7 +1274,7 @@ static void InterruptCallbackCardDet(void)
// メッセージインデックスをインクリメント // メッセージインデックスをインクリメント
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
OS_TPrintf("● - idx_insert : %d\n", s_ctData.idx_insert); OS_TPrintf("● - idx_insert : %d Slot B state : 0x%08x\n", s_ctData.idx_insert, reg_MI_MC1);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -1222,13 +1295,11 @@ static void InterruptCallbackCardData(void)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void SetHotSwState(BOOL busy) static void SetHotSwState(BOOL busy)
{ {
u16 id = (u16)OS_GetLockID(); LockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
SYSMi_GetWork()->flags.common.isBusyHotSW = busy ? 1 : 0; SYSMi_GetWork()->flags.common.isBusyHotSW = busy ? 1 : 0;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
OS_ReleaseLockID( id );
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*