(更新:Akabane Jumpei)

・カードロック位置を修正
・Clone Boot判定を追加

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@700 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-20 01:54:26 +00:00
parent 5955f2c920
commit fd89b0dbbf

View File

@ -20,6 +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
//#define HOTSW_FORCE_CARD_B //#define HOTSW_FORCE_CARD_B
@ -95,6 +96,7 @@ static HotSwState ReadRomEmulationData(void);
static HotSwState ReadIDNormal(void); static HotSwState ReadIDNormal(void);
static HotSwState LoadStaticModule(void); static HotSwState LoadStaticModule(void);
static HotSwState LoadCardData(void); static HotSwState LoadCardData(void);
static HotSwState CheckCardAuthCode(void);
static void SetHotSwState(BOOL busy); static void SetHotSwState(BOOL busy);
@ -248,6 +250,8 @@ void HOTSW_Init(void)
* *
* BootSegmentBuffer SecureSegmentBufferの設定を行ってから * BootSegmentBuffer SecureSegmentBufferの設定を行ってから
* *
*
* [TODO:]InitでロックIDをがめておいて使うのでもOK
* ----------------------------------------------------------------- */ * ----------------------------------------------------------------- */
static HotSwState LoadCardData(void) static HotSwState LoadCardData(void)
{ {
@ -257,8 +261,25 @@ static HotSwState LoadCardData(void)
start = OS_GetTick(); start = OS_GetTick();
#ifdef SDK_ARM7 // カードのロックIDを取得
tempLockID = OS_GetLockID();
if(tempLockID == OS_LOCK_ID_ERROR){
return HOTSW_CARD_LOCK_ERROR;
}
else{
s_cbData.lockID = (u16)tempLockID;
}
// カードのロック
#ifdef DEBUG_USED_CARD_SLOT_B_
LockExCard(s_cbData.lockID);
#else
OS_LockCard(s_cbData.lockID);
#endif
// カード電源リセット // カード電源リセット
#ifdef SDK_ARM7
// [TODO:] リセットしている間はカードをロックする
McPowerOff(); McPowerOff();
McPowerOn(); McPowerOn();
#else // SDK_ARM9 #else // SDK_ARM9
@ -274,24 +295,8 @@ static HotSwState LoadCardData(void)
MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize);
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
// カードのロックIDを取得
tempLockID = OS_GetLockID();
if(tempLockID == OS_LOCK_ID_ERROR){
return HOTSW_CARD_LOCK_ERROR;
}
else{
s_cbData.lockID = (u16)tempLockID;
}
// ブート処理開始 // ブート処理開始
if(HOTSW_IsCardExist()){ if(HOTSW_IsCardExist()){
// カードのロック
#ifdef DEBUG_USED_CARD_SLOT_B_
LockExCard(s_cbData.lockID);
#else
OS_LockCard(s_cbData.lockID);
#endif
// カード側でKey Tableをロードする // カード側でKey Tableをロードする
retval = LoadTable(); retval = LoadTable();
@ -421,6 +426,13 @@ static HotSwState LoadCardData(void)
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
DecryptObjectFile(); DecryptObjectFile();
// 認証コード読み込み&ワーク領域にコピー
retval = CheckCardAuthCode();
}
}
else{
retval = HOTSW_PULLED_OUT_ERROR;
} }
// カードのロック開放 // カードのロック開放
@ -429,10 +441,6 @@ static HotSwState LoadCardData(void)
#else #else
OS_UnlockCard(s_cbData.lockID); OS_UnlockCard(s_cbData.lockID);
#endif #endif
}
else{
retval = HOTSW_PULLED_OUT_ERROR;
}
// カードロックIDの開放 // カードロックIDの開放
OS_ReleaseLockID( s_cbData.lockID ); OS_ReleaseLockID( s_cbData.lockID );
@ -591,6 +599,39 @@ static HotSwState LoadStaticModule(void)
return retval; return retval;
} }
/* -----------------------------------------------------------------
* CheckCardAuthCode関数
*
* Rom Headerの認証コードアドレスを読んで
*
*
* ----------------------------------------------------------------- */
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;
u8 *p = (u8 *)authBuf;
if(!HOTSW_IsCardExist()){
return HOTSW_PULLED_OUT_ERROR;
}
retval = s_funcTable[s_cbData.cardType].ReadPage_G( &s_cbData, page_offset, authBuf, MB_AUTHCODE_SIZE );
p += auth_offset & 0x000001FF;
if( *p++ == 'a' && *p == 'c' ) {
OS_PutString(" ☆ Clone Boot Mode\n");
SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE;
}else {
OS_PutString(" □ Other Boot Mode\n");
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE;
}
return retval;
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* HOTSW_SetBootSegmentBuffer関数 * HOTSW_SetBootSegmentBuffer関数