タイトルリストの作成方式変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1096 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-04-10 02:10:12 +00:00
parent 5d40bc12f8
commit 5f9914777a
3 changed files with 76 additions and 53 deletions

View File

@ -59,7 +59,7 @@ static void SYSMi_EnableHotSW( BOOL enable );
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ); static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
static void SYSMi_Relocate( void ); static void SYSMi_Relocate( void );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
static void SYSMi_makeTitleIdList( TitleProperty *pTitleList ); static void SYSMi_makeTitleIdList( void );
// global variable------------------------------------------------------------- // global variable-------------------------------------------------------------
// static variable------------------------------------------------------------- // static variable-------------------------------------------------------------
@ -72,6 +72,9 @@ static MbAuthCode s_authcode;
static BOOL s_loadstart = FALSE; static BOOL s_loadstart = FALSE;
static NAMTitleId *s_pTitleIDList = NULL;
static int s_listLength = 0;
// const data------------------------------------------------------------------ // const data------------------------------------------------------------------
static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = { static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = {
OS_BOOTTYPE_ILLEGAL, // ILLEGAL OS_BOOTTYPE_ILLEGAL, // ILLEGAL
@ -221,51 +224,70 @@ BOOL SYSMi_CopyCardBanner( void )
return retval; return retval;
} }
// NANDタイトルリストの取得 // インポートされているすべてのNANDアプリを列挙したリストの準備
// listNumにはカード部分も含めたリストの長さを与える // SYSM_GetNandTitleListおよびSYSM_TryToBootTitle前に呼ぶ必要あり
BOOL SYSM_InitNandTitleList( void )
{
OSTick start;
if( s_pTitleIDList != NULL ) return TRUE;
// インポートされているタイトルの取得
start = OS_GetTick();
s_listLength = NAM_GetNumTitles();
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
s_pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * s_listLength );
if( s_pTitleIDList == NULL ) {
OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
return FALSE;
}
start = OS_GetTick();
(void)NAM_GetTitleList( s_pTitleIDList, (u32)s_listLength );
OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
return TRUE;
}
// NANDアプリリストの解放
void SYSM_FreeNandTitleList( void )
{
if(s_pTitleIDList != NULL)
{
SYSM_Free( s_pTitleIDList );
s_pTitleIDList = NULL;
}
}
// ローンチ対象となるNANDタイトルリストの取得
// listNumには、pTitleList_Nandの長さを与える
// 得られる最大のタイトル数は、(LAUNCHER_TITLE_LIST_NUM - 1)に制限される(ランチャーが表示できる最大数からカードぶんを引いた数)
// return:取得したNANDタイトルの数 // return:取得したNANDタイトルの数
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
{ {
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。 // filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
// とりあえずALL // とりあえずALL
OSTick start;
int l; int l;
int getNum;
int validNum = 0; int validNum = 0;
NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM ]; NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];// ローンチ可能なタイトルリストの一時置き場
NAMTitleId *pTitleIDList = NULL;
if( s_pTitleIDList == NULL ) return -1;
if( listNum > LAUNCHER_TITLE_LIST_NUM ) {
OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM );
}
// インストールされているタイトルの取得
start = OS_GetTick();
getNum = NAM_GetNumTitles();
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * getNum );
if( pTitleIDList == NULL ) {
OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
return 0;
}
start = OS_GetTick();
(void)NAM_GetTitleList( pTitleIDList, (u32)getNum );
OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
// 取得したタイトルがローンチ対象かどうかをチェック // 取得したタイトルがローンチ対象かどうかをチェック
for( l = 0; l < getNum; l++ ) { for( l = 0; l < s_listLength; l++ ) {
// "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加 // "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加
if( ( pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) { if( ( s_pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) {
titleIDArray[ validNum ] = pTitleIDList[ l ]; titleIDArray[ validNum ] = s_pTitleIDList[ l ];
SYSMi_ReadBanner_NAND( pTitleIDList[ l ], &s_bannerBuf[ validNum ] ); SYSMi_ReadBanner_NAND( s_pTitleIDList[ l ], &s_bannerBuf[ validNum ] );
validNum++; validNum++;
if( !( validNum < LAUNCHER_TITLE_LIST_NUM - 1 ) )// 最大(LAUNCHER_TITLE_LIST_NUM - 1)まで
{
break;
}
} }
} }
SYSM_Free( pTitleIDList );
// 念のため残り領域を0クリア // 念のため残り領域を0クリア
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM; l++ ) { for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM - 1; l++ ) {
titleIDArray[ l ] = 0; titleIDArray[ l ] = 0;
} }
@ -274,6 +296,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
listNum--; // カードのぶん引いておく listNum--; // カードのぶん引いておく
// 引数に与えられたリストの長さ-1 と、ローンチ可能タイトルリストの長さの比較
listNum = ( validNum < listNum ) ? validNum : listNum; listNum = ( validNum < listNum ) ? validNum : listNum;
for(l=0;l<listNum;l++) for(l=0;l<listNum;l++)
@ -1019,7 +1042,7 @@ BOOL SYSM_IsAuthenticateTitleFinished( void )
} }
// ロード済みの指定タイトルの認証とブートを行う // ロード済みの指定タイトルの認証とブートを行う
AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList ) AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle )
{ {
if(s_authResult != AUTH_RESULT_SUCCEEDED) if(s_authResult != AUTH_RESULT_SUCCEEDED)
{ {
@ -1045,7 +1068,8 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitle
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ]; ( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ];
// タイトルIDリストの作成 // タイトルIDリストの作成
SYSMi_makeTitleIdList( pTitleList ); SYSMi_makeTitleIdList();
SYSM_FreeNandTitleList();
BOOT_Ready(); // never return. BOOT_Ready(); // never return.
@ -1053,16 +1077,21 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitle
} }
// タイトルIDリストの作成 // タイトルIDリストの作成
static void SYSMi_makeTitleIdList( TitleProperty *pTitleList ) static void SYSMi_makeTitleIdList( void )
{ {
// [TODO:]現在ランチャーで表示できるタイトル(ブート可能タイトル)のみ // [TODO:]現在ブート不可タイトルについても入れるようにしているが
// リストに入れるようになっているが // これで良いのか?
// ブート不可タイトルについても対応する必要あり?(特にセキュアアプリの場合)
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST; OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF; ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF;
int l; int l;
u8 count = 0; u8 count = 0;
if( s_pTitleIDList == NULL )
{
OS_TPrintf("SYSMi_makeTitleIdList failed: SYSM_InitNandTitleList() is not called.\n");
return;
}
// とりあえずゼロクリア // とりあえずゼロクリア
MI_CpuClear8( (void *)HW_OS_TITLE_ID_LIST, HW_OS_TITLE_ID_LIST_SIZE ); MI_CpuClear8( (void *)HW_OS_TITLE_ID_LIST, HW_OS_TITLE_ID_LIST_SIZE );
@ -1071,17 +1100,8 @@ static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
{ {
return; return;
} }
/*
// ランチャーで作成したリストを使わないバージョン
NAMTitleId *pTitleIDList = NULL;
s32 getNum;
// インストールされているタイトルの取得 for(l=-1;l<s_listLength;l++) // -1はカードアプリの特別処理用
getNum = NAM_GetNumTitles();
pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * getNum ); // Free忘れず
(void)NAM_GetTitleList( pTitleIDList, (u32)getNum );
*/
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
{ {
ROM_Header_Short e_hs; ROM_Header_Short e_hs;
ROM_Header_Short *pe_hs; ROM_Header_Short *pe_hs;
@ -1091,7 +1111,7 @@ static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
FSFile file[1]; FSFile file[1];
BOOL bSuccess; BOOL bSuccess;
s32 readLen; s32 readLen;
if(l==0) if(l==-1)
{ {
// カードアプリ // カードアプリ
if(SYSM_IsExistCard()) if(SYSM_IsExistCard())
@ -1100,12 +1120,12 @@ static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
} }
}else }else
{ {
if(pTitleList[l].titleID == NULL) if(s_pTitleIDList[l] == NULL)
{ {
continue; continue;
} }
// romヘッダ読み込み // romヘッダ読み込み
NAM_GetTitleBootContentPathFast(path, pTitleList[l].titleID); NAM_GetTitleBootContentPathFast(path, s_pTitleIDList[l]);
FS_InitFile( file ); FS_InitFile( file );
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess ) if( ! bSuccess )

View File

@ -145,6 +145,9 @@ void TwlMain( void )
{ {
deleteTmp(); deleteTmp();
} }
// NANDタイトルリストの準備
SYSM_InitNandTitleList();
// 「ダイレクトブートでない」なら // 「ダイレクトブートでない」なら
if( !pBootTitle ) { if( !pBootTitle ) {
@ -289,7 +292,7 @@ void TwlMain( void )
// FATALエラー処理 // FATALエラー処理
} }
switch ( SYSM_TryToBootTitle( pBootTitle, s_titleList ) ) { // アプリ認証結果取得orブート 成功時never return switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時never return
case AUTH_RESULT_TITLE_LOAD_FAILED: case AUTH_RESULT_TITLE_LOAD_FAILED:
case AUTH_RESULT_TITLE_POINTER_ERROR: case AUTH_RESULT_TITLE_POINTER_ERROR:
case AUTH_RESULT_AUTHENTICATE_FAILED: case AUTH_RESULT_AUTHENTICATE_FAILED:

View File

@ -92,6 +92,8 @@ extern TitleProperty *SYSM_ReadParameters( void ); //
// アプリ情報取得 // アプリ情報取得
extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // カードアプリタイトルリストの取得 extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // カードアプリタイトルリストの取得
extern BOOL SYSM_InitNandTitleList( void ); // NANDアプリタイトルリスト取得準備
extern void SYSM_FreeNandTitleList( void ); // NANDアプリタイトルリスト
extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得 extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得
// アプリ起動 // アプリ起動
@ -99,9 +101,7 @@ extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); //
extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認 extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
extern void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドで検証開始 extern void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドで検証開始
extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthenticateTitleで起動したスレッドが終了したかどうかを確認 extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthenticateTitleで起動したスレッドが終了したかどうかを確認
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList ); extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ); // pBootTitleで指定したタイトルをブート。成功時は、never return.
// pBootTitleで指定したタイトルをブート
// 成功時は、never return.
extern void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデクリプト開始 extern void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデクリプト開始
// デバイス制御 // デバイス制御