(更新: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 <romEmulation.h>
#include <customNDma.h>
#include <../build/libraries/mb/common/include/mb_fileinfo.h> // MB_AUTHCODE_SIZE
//#define HOTSW_FORCE_CARD_B
@ -95,6 +96,7 @@ static HotSwState ReadRomEmulationData(void);
static HotSwState ReadIDNormal(void);
static HotSwState LoadStaticModule(void);
static HotSwState LoadCardData(void);
static HotSwState CheckCardAuthCode(void);
static void SetHotSwState(BOOL busy);
@ -222,7 +224,7 @@ void HOTSW_Init(void)
// Secure Segment バッファの設定
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
// カードが挿さってあったらスレッドを起動する
if(HOTSW_IsCardExist()){
// OS_PutString("Card Boot Start\n");
@ -248,6 +250,8 @@ void HOTSW_Init(void)
*
* BootSegmentBuffer SecureSegmentBufferの設定を行ってから
*
*
* [TODO:]InitでロックIDをがめておいて使うのでもOK
* ----------------------------------------------------------------- */
static HotSwState LoadCardData(void)
{
@ -257,8 +261,25 @@ static HotSwState LoadCardData(void)
start = OS_GetTick();
// カードのロック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();
McPowerOn();
#else // SDK_ARM9
@ -273,25 +294,9 @@ static HotSwState LoadCardData(void)
// バッファのクリア
MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize);
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()){
// カードのロック
#ifdef DEBUG_USED_CARD_SLOT_B_
LockExCard(s_cbData.lockID);
#else
OS_LockCard(s_cbData.lockID);
#endif
// カード側でKey Tableをロードする
retval = LoadTable();
@ -415,25 +420,28 @@ static HotSwState LoadCardData(void)
if(s_cbData.id_scr != s_cbData.id_gam){
return HOTSW_ID_CHECK_ERROR;
}
// 常駐モジュール残りを指定先に転送
retval = LoadStaticModule();
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
DecryptObjectFile();
}
// カードのロック開放
#ifdef DEBUG_USED_CARD_SLOT_B_
UnlockExCard(s_cbData.lockID);
#else
OS_UnlockCard(s_cbData.lockID);
#endif
// 認証コード読み込み&ワーク領域にコピー
retval = CheckCardAuthCode();
}
}
else{
retval = HOTSW_PULLED_OUT_ERROR;
}
// カードのロック開放
#ifdef DEBUG_USED_CARD_SLOT_B_
UnlockExCard(s_cbData.lockID);
#else
OS_UnlockCard(s_cbData.lockID);
#endif
// カードロックIDの開放
OS_ReleaseLockID( s_cbData.lockID );
@ -591,6 +599,39 @@ static HotSwState LoadStaticModule(void)
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関数