From fd89b0dbbf26e7429bf65dda38a8b92abca234d3 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 20 Feb 2008 01:54:26 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BB=E3=82=AB=E3=83=BC=E3=83=89=E3=83=AD=E3=83=83=E3=82=AF?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E3=82=92=E4=BF=AE=E6=AD=A3=20=E3=83=BBClone?= =?UTF-8?q?=20Boot=E5=88=A4=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@700 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 93 +++++++++++++------ 1 file changed, 67 insertions(+), 26 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 071ba5f0..926e6c7f 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -20,6 +20,7 @@ #include #include #include +#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関数