ランチャーからのTWLアプリブート前にタイトルIDリストを生成、格納するよう変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@909 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-03-19 02:01:11 +00:00
parent 165be5da68
commit bab56841b2
3 changed files with 134 additions and 4 deletions

View File

@ -56,6 +56,7 @@ static void SYSMi_EnableHotSW( BOOL enable );
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
static void SYSMi_Relocate( void );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
static void SYSMi_makeTitleIdList( TitleProperty *pTitleList );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
@ -260,6 +261,8 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
// 最終リストに対して、カードアプリ部分を除いた部分をクリア
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
listNum--; // カードのぶん引いておく
listNum = ( validNum < listNum ) ? validNum : listNum;
for(l=0;l<listNum;l++)
@ -779,7 +782,7 @@ static AuthResult SYSMi_AuthenticateNTRNandAppHeader( TitleProperty *pBootTitle)
// NTR版ダウンロードアプリTMPアプリのヘッダ認証処理
static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTitle)
{
#pragma unused(pBootTitle)
ROM_Header *head;
OSTick start;
start = OS_GetTick();
@ -982,7 +985,7 @@ BOOL SYSM_IsAuthenticateTitleFinished( void )
}
// ロード済みの指定タイトルの認証とブートを行う
AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle )
AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList )
{
if(s_authResult != AUTH_RESULT_SUCCEEDED)
{
@ -997,11 +1000,137 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle )
// HW_WM_BOOT_BUFへのブート情報セット
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ];
// タイトルIDリストの作成
SYSMi_makeTitleIdList( pTitleList );
BOOT_Ready(); // never return.
return AUTH_RESULT_SUCCEEDED;
}
// タイトルIDリストの作成
static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
{
// [TODO:]現在ランチャーで表示できるタイトル(ブート可能タイトル)のみ
// リストに入れるようになっているが
// ブート不可タイトルについても対応する必要あり?(特にセキュアアプリの場合)
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
ROM_Header_Short *hs = ( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF;
int l;
u8 count = 0;
// とりあえずゼロクリア
MI_CpuClear8( (void *)HW_OS_TITLE_ID_LIST, HW_OS_TITLE_ID_LIST_SIZE );
// これから起動するアプリがTWLアプリでない
if( !hs->platform_code )
{
return;
}
/*
// ランチャーで作成したリストを使わないバージョン
NAMTitleId *pTitleIDList = NULL;
s32 getNum;
// インストールされているタイトルの取得
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 *pe_hs;
int m;
BOOL same_maker_code = TRUE;
char path[256];
FSFile file[1];
BOOL bSuccess;
s32 readLen;
if(l==0)
{
// カードアプリ
if(SYSM_IsExistCard())
{
pe_hs = (ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BAK;// BAKの値を使う
}
}else
{
if(pTitleList[l].titleID == NULL)
{
continue;
}
// romヘッダ読み込み
NAM_GetTitleBootContentPathFast(path, pTitleList[l].titleID);
FS_InitFile( file );
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
{
OS_TPrintf("SYSMi_makeTitleIdList failed: cant open file(%s)\n",path);
FS_CloseFile(file);
continue;
}
bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSMi_makeTitleIdList failed: cant seek file(0)\n");
FS_CloseFile(file);
continue;
}
readLen = FS_ReadFile(file, &e_hs, (s32)sizeof(e_hs));
if( readLen != (s32)sizeof(e_hs) )
{
OS_TPrintf("SYSMi_makeTitleIdList failed: cant read file(%p, %d, %d, %d)\n", e_hs, 0, sizeof(e_hs), readLen);
FS_CloseFile(file);
continue;
}
FS_CloseFile(file);
pe_hs = (ROM_Header_Short *)&e_hs;
}
for(m=0;m<MAKER_CODE_MAX;m++)
{
if(hs->maker_code[m] != pe_hs->maker_code[m])
{
same_maker_code = FALSE;
}
}
// セキュアアプリの場合か、メーカーコードが同じ場合は
if( (hs->titleID & TITLE_ID_HI_SECURE_FLAG_MASK) ||
( same_maker_code ) )
{
// リストに追加
list->TitleID[count] = pTitleList[l].titleID;
// sameMakerFlagをON
list->sameMakerFlag[count/8] |= (u8)(0x1 << (count%8));
// Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON
if(pe_hs->public_save_data_size != 0)
{
list->publicFlag[count/8] |= (u8)(0x1 << (count%8));
}
if(pe_hs->private_save_data_size != 0)
{
list->privateFlag[count/8] |= (u8)(0x1 << (count%8));
}
}
// ジャンプ可能ならば
if( pe_hs->permit_landing_normal_jump )
{
// リストに追加してジャンプ可能フラグON
list->TitleID[count] = pTitleList[l].titleID;
list->appJumpFlag[count/8] |= (u8)(0x1 << (count%8));
}
// ここまでのうちに、list->TitleID[count]が編集されていたらcountインクリメント
if( list->TitleID[count] != NULL )
{
count++;
}
}
list->num = count;
}
#if 0
// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。

View File

@ -282,7 +282,7 @@ void TwlMain( void )
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
SYSM_IsAuthenticateTitleFinished() )
{
switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時never return
switch ( SYSM_TryToBootTitle( pBootTitle, s_titleList ) ) { // アプリ認証結果取得orブート 成功時never return
case AUTH_RESULT_TITLE_LOAD_FAILED:
case AUTH_RESULT_TITLE_POINTER_ERROR:
case AUTH_RESULT_AUTHENTICATE_FAILED:

View File

@ -104,7 +104,8 @@ extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); //
extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
extern void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドで検証開始
extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthenticateTitleで起動したスレッドが終了したかどうかを確認
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをブート
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList );
// pBootTitleで指定したタイトルをブート
// 成功時は、never return.
// デバイス制御
extern void SYSM_CaribrateTP( void ); // タッチパネルキャリブレーション