From d4086b0c545cca30de65f8e87dc80560c6ece7b4 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 27 Feb 2008 04:52:49 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BBHOTSW=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA?= =?UTF-8?q?=E3=81=A7=E8=A8=88=E7=AE=97=E3=81=97=E3=81=9F=E3=83=8F=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A5=E5=80=A4=E3=82=92=E5=85=B1=E6=9C=89=E3=83=AF?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E3=81=AB=E6=A0=BC=E7=B4=8D=E3=81=99=E3=82=8B?= =?UTF-8?q?=E6=99=82=E3=83=BB=E8=AA=AD=E3=81=BF=E5=87=BA=E3=81=99=E6=99=82?= =?UTF-8?q?=E3=81=A7=E6=8E=92=E4=BB=96=E5=88=B6=E5=BE=A1=E3=82=92=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=20?= =?UTF-8?q?=E3=83=BBHOTSW=E6=8A=91=E5=88=B6=E3=81=AE=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E3=82=92PXI=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=A6=E5=8F=97?= =?UTF-8?q?=E3=81=91=E5=8F=96=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20=E3=83=BBPXI=E3=81=ABHOTSW=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=82=921=E3=81=A4=E4=BA=88=E7=B4=84?= 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@752 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/hotswTypes.h | 2 - .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 134 +++++++++++------- .../sysmenu/ARM9/src/title.c | 38 +++-- build/systemMenu_RED/Launcher/ARM9/src/main.c | 5 +- include/sysmenu/hotsw/common/hotsw.h | 28 ++++ include/sysmenu/sysmenu_lib/common/pxi.h | 1 + .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 8 +- 7 files changed, 138 insertions(+), 78 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index fdba3b67..b3493378 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -272,8 +272,6 @@ typedef struct CardBootFunction { HotSwState (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size); } CardBootFunction; - - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index ad3ee608..a1ed9b28 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -23,6 +23,7 @@ #include <../build/libraries/mb/common/include/mb_fileinfo.h> //#define HOTSW_FORCE_CARD_B +#define DEBUG_MODE // define ------------------------------------------------------------------- #define CHATTERING_COUNTER 0x100 @@ -38,9 +39,10 @@ #define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ #define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度 -#define HOTSW_MSG_BUFFER_NUM 32 // 受信バッファの数 +#define HOTSW_MSG_BUFFER_NUM 40 // 受信バッファの数 #define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数 #define HOTSW_PULLED_MSG_NUM 16 // 抜け割り込み送信メッセージの数 +#define HOTSW_CTRL_MSG_NUM 8 // PXI割り込み送信メッセージの数 #define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF @@ -62,9 +64,11 @@ typedef struct CardThreadData{ u32 idx_insert; u32 idx_pulledOut; + u32 idx_ctrl; - OSMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; - OSMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; + HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; + HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; + HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM]; OSMessageQueue hotswQueue; OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM]; } @@ -84,6 +88,7 @@ static void SetInterrupt(void); static void InterruptCallbackCard(void); static void InterruptCallbackCardDet(void); static void InterruptCallbackCardData(void); +static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err); static void LockHotSwRsc(OSLockWord* word); static void UnlockHotSwRsc(OSLockWord* word); @@ -186,6 +191,10 @@ void HOTSW_Init(void) { OS_InitTick(); OS_InitThread(); + + // PXI初期化 + PXI_Init(); + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi); // 割り込みマスクの設定 SetInterrupt(); @@ -251,7 +260,7 @@ void HOTSW_Init(void) // カードが挿さってあったらスレッドを起動する - if(HOTSW_IsCardAccessible()){ + if(HOTSW_IsCardExist()){ // メッセージ送信 OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); @@ -301,10 +310,6 @@ static HotSwState LoadCardData(void) s_cbData.pBootSegBuf = s_pBootSegBuffer; s_cbData.pSecureSegBuf = s_pSecureSegBuffer; - // バッファのクリア - MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); - MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); - // ブート処理開始 if(HOTSW_IsCardAccessible()){ // カード側でKey Tableをロードする @@ -317,12 +322,7 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM - if(s_cbData.id_nml & 0x80000000){ - s_cbData.cardType = DS_CARD_TYPE_2; - } - else{ - s_cbData.cardType = DS_CARD_TYPE_1; - } + s_cbData.cardType = (s_cbData.id_nml & 0x80000000) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; { u8 i; @@ -370,7 +370,6 @@ static HotSwState LoadCardData(void) if( retval == HOTSW_SUCCESS ) { // NTRカードかTWLカードか -#define DEBUG_MODE #ifdef DEBUG_MODE if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset) #else @@ -514,8 +513,8 @@ static HotSwState LoadBannerData(void) else{ // バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK) SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; + SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; - SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; return retval; } @@ -600,8 +599,6 @@ static HotSwState LoadStaticModule(void) u8 sha1data[DIGEST_SIZE_SHA1]; SVCHMACSHA1Context hash; - // ハッシュコンテキスト計算開始を通知 - // クリア MI_CpuClear8(sha1data, sizeof(sha1data)); @@ -611,12 +608,16 @@ static HotSwState LoadStaticModule(void) // セキュア領域先頭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との排他制御、ここまで + UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); } + //#define MY_DEBUG #ifdef MY_DEBUG // Arm9常駐モジュール Hash値のチェック @@ -1148,23 +1149,29 @@ static void McThread(void *arg) { #pragma unused( arg ) - u32 hotswCount = UNDEF_CODE; - BOOL isPulledOut = TRUE; - HotSwState retval; - OSMessage *msg; + u32 hotswCount = UNDEF_CODE; + BOOL isPulledOut = TRUE; + HotSwState retval; + HotSwMessage *msg; while(1){ OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); +// OS_TPrintf("msg -> value : %x msg -> ctrl : %x msg -> type : %x\n", msg->value, msg->ctrl, msg->type); + // カードデータロード完了フラグを下ろす SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = FALSE; + + if( msg->ctrl == TRUE ) { + SYSMi_GetWork()->flags.hotsw.isEnableHotSW = msg->value; +// HOTSW_Finalize(); + } while(1){ // 活線挿抜抑制フラグが立っていたら処理しない if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) { -//#ifdef DEBUG_USED_CARD_SLOT_B_ SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; -//#endif + OS_PutString("### HotSw is restrained...\n"); break; } @@ -1174,27 +1181,12 @@ static void McThread(void *arg) if(!isPulledOut){ // 抜き差しがなかったか判定 if(CARDi_IsPulledOutEx(hotswCount)){ - u16 id = (u16)OS_GetLockID(); - (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - if( SYSMi_GetWork()->flags.hotsw.reqChangeHotSW ) { - SYSMi_GetWork()->flags.hotsw.isEnableHotSW = SYSMi_GetWork()->flags.hotsw.nextHotSWStatus; - SYSMi_GetWork()->flags.hotsw.reqChangeHotSW = 0; - SYSMi_GetWork()->flags.hotsw.nextHotSWStatus = 0; -// HOTSW_Finalize(); - } - (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - OS_ReleaseLockID( id ); - // フラグケア - { - u16 id = (u16)OS_GetLockID(); - (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); - SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; - SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; - (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); - OS_ReleaseLockID( id ); - } - + LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); + SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; + UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); + // 新しいカードのIDを入れる SYSMi_GetWork()->nCardID = s_cbData.id_gam; @@ -1232,28 +1224,28 @@ static void McThread(void *arg) if(isPulledOut){ // フラグケア { - u16 id = (u16)OS_GetLockID(); - (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; + LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); + SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; - (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - OS_ReleaseLockID( id ); + UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); } - + // カードブート用構造体の初期化 MI_CpuClear32(&s_cbData, sizeof(CardBootData)); + // バッファのクリア + MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); + MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); + break; } isPulledOut = TRUE; } } -//#ifdef DEBUG_USED_CARD_SLOT_B_ SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; -//#endif - } + } // while loop } /*---------------------------------------------------------------------------* @@ -1263,6 +1255,10 @@ static void McThread(void *arg) *---------------------------------------------------------------------------*/ static void InterruptCallbackCard(void) { + s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].ctrl = FALSE; + s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].value = 0; + s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLOUT; + // メッセージ送信 OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK); @@ -1281,6 +1277,10 @@ static void InterruptCallbackCardDet(void) { // SDKのカード状態をリセットする CARDi_ResetSlotStatus(); + + s_ctData.hotswInsertMsg[s_ctData.idx_insert].ctrl = FALSE; + s_ctData.hotswInsertMsg[s_ctData.idx_insert].value = 0; + s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT; // メッセージ送信 OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); @@ -1302,6 +1302,30 @@ static void InterruptCallbackCardData(void) OS_WakeupThreadDirect(&s_ctData.thread); } +/*---------------------------------------------------------------------------* + Name: InterruptCallbackPxi + + Description: PXI割り込みハンドラ + *---------------------------------------------------------------------------*/ +static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused(tag) +#pragma unused(err) + HotSwPxiMessage d; + + d.data = data; + + s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; + s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].value = d.msg.value; + s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].type = HOTSW_CONTROL; + + // メッセージ送信 + OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPxiMsg[s_ctData.idx_ctrl], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント + s_ctData.idx_ctrl = (s_ctData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; +} + /*---------------------------------------------------------------------------* Name: SetHotSwState diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index ec83c64d..bd0602a6 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -767,11 +767,21 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) // カード読み込み時、work2に暗号化オブジェクト部分のハッシュ計算済みのコンテキストが保存されるので // それを用いてARM9_STATIC残りの部分を計算 SVCHMACSHA1Context ctx; + u16 id; + SVC_HMACSHA1Init( &ctx, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1 ); - // [TODO] ARM7とのhmac_sha1_contextの排他制御開始 + + // ARM7とのhmac_sha1_contextの排他制御開始 + id = (u16)OS_GetLockID(); + (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); + SYSMi_GetWork2()->hmac_sha1_context.sha1_ctx.sha_block = ctx.sha1_ctx.sha_block;// この関数ポインタだけARM7とARM9で変えないとダメ ctx = SYSMi_GetWork2()->hmac_sha1_context; // SYSMi_GetWork2は非キャッシュなのでスタック(DTCMまたはキャッシュ領域)へコピー - // [TODO] ARM7とのhmac_sha1_contextの排他制御終了 + + // ARM7とのhmac_sha1_contextの排他制御終了 + (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); + OS_ReleaseLockID( id ); + SVC_HMACSHA1Update( &ctx, (const void*)((u32)module_addr[l] + ARM9_ENCRYPT_DEF_SIZE), (module_size[l] - ARM9_ENCRYPT_DEF_SIZE) ); @@ -1057,22 +1067,20 @@ void SYSMi_EnableHotSW( BOOL enable ) } { - u16 id = (u16)OS_GetLockID(); - (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - if( !SYSMi_GetWork()->flags.hotsw.isBusyHotSW ) { - // ARM7側がビジーでなければ、直接書き換え - SYSMi_GetWork()->flags.hotsw.isEnableHotSW = enable; - }else { - // ARM7側がビジーなら、変更要求をしてARM7が値を書き換えてくれるのを待つ。 - SYSMi_GetWork()->flags.hotsw.reqChangeHotSW = 1; - SYSMi_GetWork()->flags.hotsw.nextHotSWStatus = enable; - } - (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - OS_ReleaseLockID( id ); + HotSwPxiMessage msg; + + msg.msg.value = enable; + msg.msg.ctrl = TRUE; + + while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS) + { + // do nothing + } + } // 値が変化するまでスリープして待つ。 while( SYSMi_GetWork()->flags.hotsw.isEnableHotSW != enable ) { OS_Sleep( 2 ); } -} +} \ 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 17290408..02b61d48 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -100,7 +100,10 @@ void TwlMain( void ) (void)OS_EnableInterrupts(); SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。 - + while ( ! PXI_IsCallbackReady( PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7 ) ) + { + } + FS_Init( FS_DMA_NOT_USE ); #ifdef DEBUG_LAUNCHER_DUMP diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index 7e312405..24ff94ba 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -25,6 +25,34 @@ extern "C" { #define SYSM_HOTSW_ENABLE_ROMEMU +// enum ------------------------------------------------------------------- +// スレッドに送るメッセージのステート +typedef enum HotSwMessageType{ + HOTSW_INSERT = 0, + HOTSW_PULLOUT, + HOTSW_CONTROL +} HotSwMessageType; + +// union ------------------------------------------------------------------- +// PXI用メッセージ +typedef union HotSwPxiMessage{ + struct { + u32 value :1; + u32 ctrl :1; + u32 :30; + } msg; + u32 data; +} HotSwPxiMessage; + +// struct ------------------------------------------------------------------- +// スレッド用メッセージ +typedef struct HotSwMessage{ + u32 value; + BOOL ctrl; + HotSwMessageType type; +} HotSwMessage; + + // Function prototype ------------------------------------------------------- // 活栓挿抜処理の初期化 void HOTSW_Init(void); diff --git a/include/sysmenu/sysmenu_lib/common/pxi.h b/include/sysmenu/sysmenu_lib/common/pxi.h index eb0be5ef..c7606145 100644 --- a/include/sysmenu/sysmenu_lib/common/pxi.h +++ b/include/sysmenu/sysmenu_lib/common/pxi.h @@ -29,6 +29,7 @@ extern "C" { //---------------------------------------------------------------------- #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) typedef enum SYSMPXICommand { SYSM_PXI_COMM_BL_BRIGHT = 0, diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 0a85382f..bb382eee 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -99,11 +99,9 @@ typedef struct SYSM_work { vu16 isEnableHotSW :1; // 活線挿抜有効? vu16 isBusyHotSW :1; // 活線挿抜処理中? vu16 isCardLoadCompleted :1; // カードからデータロード完了? - vu16 isValidCardBanner :1; - vu16 is1stCardChecked :1; - vu16 reqChangeHotSW :1; // 削除予定 - vu16 nextHotSWStatus :1; // 削除予定 - vu16 :8; + vu16 isValidCardBanner :1; // バナーデータ更新? + vu16 is1stCardChecked :1; // カードデータの1stチェック完了? + vu16 :10; vu8 isCardStateChanged; // カード状態更新フラグ }hotsw; }flags; // 7B