(更新:Akabane Jumpei)

・HOTSWライブラリで計算したハッシュ値を共有ワークに格納する時・読み出す時で排他制御をするようにした
・HOTSW抑制の通知をPXIを使って受け取るように変更
・PXIにHOTSW用のタグを1つ予約

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@752 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-27 04:52:49 +00:00
parent 6062f664fe
commit d4086b0c54
7 changed files with 138 additions and 78 deletions

View File

@ -272,8 +272,6 @@ typedef struct CardBootFunction {
HotSwState (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size);
} CardBootFunction;
#ifdef __cplusplus
} /* extern "C" */
#endif

View File

@ -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

View File

@ -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 );
}
}
}

View File

@ -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

View File

@ -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);

View File

@ -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,

View File

@ -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; // <20>í<EFBFBD>œ—\’è
vu16 nextHotSWStatus :1; // <20>í<EFBFBD>œ—\’è
vu16 :8;
vu16 isValidCardBanner :1; // バナーデータ更新?
vu16 is1stCardChecked :1; // カードデータの1stチェック完了
vu16 :10;
vu8 isCardStateChanged; // カード状態更新フラグ
}hotsw;
}flags; // 7B