アプリロード処理の整理。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1278 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-04-30 06:52:31 +00:00
parent 07841a7981
commit 27dc8904cb
3 changed files with 62 additions and 42 deletions

View File

@ -346,7 +346,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot1( void )
SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT )
){ ){
s_bootTitleBuf.flags.isAppRelocate = TRUE; s_bootTitleBuf.flags.isAppRelocate = TRUE;
s_bootTitleBuf.flags.isAppLoadCompleted = TRUE; s_bootTitleBuf.flags.isAppLoadCompleted = FALSE;
s_bootTitleBuf.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす s_bootTitleBuf.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
s_bootTitleBuf.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす s_bootTitleBuf.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_ROM; s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_ROM;
@ -400,7 +400,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot2( void )
if( SYSM_IsExistCard() ) if( SYSM_IsExistCard() )
{ {
s_bootTitleBuf.flags.isAppRelocate = TRUE; s_bootTitleBuf.flags.isAppRelocate = TRUE;
s_bootTitleBuf.flags.isAppLoadCompleted = TRUE; s_bootTitleBuf.flags.isAppLoadCompleted = FALSE;
s_bootTitleBuf.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす s_bootTitleBuf.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
s_bootTitleBuf.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす s_bootTitleBuf.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_ROM; s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_ROM;

View File

@ -73,7 +73,7 @@ extern const u8 g_devPubKey[ 4 ][ 0x80 ];
static s32 ReadFile( FSFile* pf, void* buffer, s32 size ); static s32 ReadFile( FSFile* pf, void* buffer, s32 size );
static void SYSMi_EnableHotSW( BOOL enable ); 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_AppendRelocateInfoCardSecureArea( void );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
static void SYSMi_makeTitleIdList( void ); static void SYSMi_makeTitleIdList( void );
@ -156,10 +156,13 @@ static inline u16 SCFG_GetBondingOption(void)
return (u16)(*(u8*)(HW_SYS_CONF_BUF+HWi_WSYS08_OFFSET) & HWi_WSYS08_OP_OPT_MASK); return (u16)(*(u8*)(HW_SYS_CONF_BUF+HWi_WSYS08_OFFSET) & HWi_WSYS08_OP_OPT_MASK);
} }
// ============================================================================ // ============================================================================
// //
//
// 情報取得 // 情報取得
// //
//
// ============================================================================ // ============================================================================
// カードタイトルの取得 // カードタイトルの取得
@ -197,7 +200,7 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ]; pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ];
pTitleList_Card->flags.isValid = TRUE; pTitleList_Card->flags.isValid = TRUE;
pTitleList_Card->flags.isAppLoadCompleted = TRUE; pTitleList_Card->flags.isAppLoadCompleted = FALSE;
pTitleList_Card->flags.isAppRelocate = TRUE; pTitleList_Card->flags.isAppRelocate = TRUE;
} }
@ -360,7 +363,9 @@ static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
// ============================================================================ // ============================================================================
// //
// アプリ起動 //
// アプリロード
//
// //
// ============================================================================ // ============================================================================
@ -427,7 +432,7 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
if( ! bSuccess ) if( ! bSuccess )
{ {
OS_TPrintf("RebootSystem failed: cant open file\n"); OS_TPrintf("RebootSystem failed: cant open file\n");
return; goto ERROR;
} }
{ {
@ -446,8 +451,7 @@ OS_TPrintf("RebootSystem failed: cant open file\n");
if( ! bSuccess ) if( ! bSuccess )
{ {
OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
FS_CloseFile(file); goto ERROR;
return;
} }
readLen = FS_ReadFile(file, header, (s32)sizeof(header)); readLen = FS_ReadFile(file, header, (s32)sizeof(header));
@ -455,8 +459,7 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
if( readLen != (s32)sizeof(header) ) if( readLen != (s32)sizeof(header) )
{ {
OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen); OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen);
FS_CloseFile(file); goto ERROR;
return;
} }
if( head->s.nintendo_logo_crc16 != 0xCF56 ) if( head->s.nintendo_logo_crc16 != 0xCF56 )
@ -471,8 +474,7 @@ OS_TPrintf("%02X ", header[i * 0x10 + j]);
OS_TPrintf("\n"); OS_TPrintf("\n");
} }
OS_TPrintf("RebootSystem failed: logo CRC error\n"); OS_TPrintf("RebootSystem failed: logo CRC error\n");
FS_CloseFile(file); goto ERROR;
return;
} }
if( !(head->s.platform_code & PLATFORM_CODE_FLAG_TWL) ) if( !(head->s.platform_code & PLATFORM_CODE_FLAG_TWL) )
@ -488,15 +490,13 @@ OS_TPrintf("RebootSystem failed: logo CRC error\n");
if( ! bSuccess ) if( ! bSuccess )
{ {
OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
FS_CloseFile(file); goto ERROR;
return;
} }
readLen = FS_ReadFile(file, &s_authcode, (s32)sizeof(s_authcode)); readLen = FS_ReadFile(file, &s_authcode, (s32)sizeof(s_authcode));
if( readLen != (s32)sizeof(s_authcode) ) if( readLen != (s32)sizeof(s_authcode) )
{ {
OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, 0, sizeof(s_authcode), readLen); OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, 0, sizeof(s_authcode), readLen);
FS_CloseFile(file); goto ERROR;
return;
} }
} }
} }
@ -535,8 +535,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
&(SYSMi_GetWork()->romRelocateInfo[i]), isTwlApp ) ) &(SYSMi_GetWork()->romRelocateInfo[i]), isTwlApp ) )
{ {
OS_TPrintf("RebootSystem failed: ROM Load Region error\n"); OS_TPrintf("RebootSystem failed: ROM Load Region error\n");
FS_CloseFile(file); goto ERROR;
return;
} }
} }
@ -565,8 +564,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
if( ! bSuccess ) if( ! bSuccess )
{ {
OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]); OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]);
FS_CloseFile(file); goto ERROR;
return;
} }
#ifdef LOAD_APP_VIA_WRAM #ifdef LOAD_APP_VIA_WRAM
@ -598,8 +596,7 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i);
if ( !result ) if ( !result )
{ {
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file); goto ERROR;
return;
} }
#else #else
OS_TPrintf("RebootSystem : Load VIA PRIMAL FS %d.\n", i); OS_TPrintf("RebootSystem : Load VIA PRIMAL FS %d.\n", i);
@ -608,8 +605,7 @@ OS_TPrintf("RebootSystem : Load VIA PRIMAL FS %d.\n", i);
if( readLen < 0 ) if( readLen < 0 )
{ {
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file); goto ERROR;
return;
} }
#endif // LOAD_APP_VIA_WRAM #endif // LOAD_APP_VIA_WRAM
@ -625,6 +621,10 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
} }
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
return;
ERROR:
(void)FS_CloseFile(file);
} }
@ -645,18 +645,20 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
s_authResult = AUTH_RESULT_PROCESSING; s_authResult = AUTH_RESULT_PROCESSING;
// アプリ未ロード状態なら、ロード開始 // アプリ未ロード状態なら、ロード開始
if( !pBootTitle->flags.isAppLoadCompleted ) { if( !pBootTitle->flags.isAppLoadCompleted ) {
SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE; SYSMi_GetWork()->flags.common.isLoadFinished = FALSE;
OS_InitThread();
OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO ); if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) {
OS_WakeupThreadDirect( &s_thread ); SYSMi_AppendRelocateInfoCardSecureArea();
}else if( pBootTitle->flags.isAppRelocate ) { }else {
// アプリロード済みで、再配置要求ありなら、再配置(カードのみ対応) SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE;
SYSMi_Relocate(); OS_InitThread();
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE; OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
}else OS_WakeupThreadDirect( &s_thread );
{ }
// アプリロード済みで、再配置要求なし }else {
// アプリロード済み
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
SYSMi_GetWork()->flags.common.isLoadFinished = TRUE;
} }
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) { if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) {
@ -668,8 +670,8 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
} }
// カードアプリケーションの再配置 // カードアプリセキュア領域を再配置情報に追加
static void SYSMi_Relocate( void ) static void SYSMi_AppendRelocateInfoCardSecureArea( void )
{ {
u32 size; u32 size;
u32 *dest ; u32 *dest ;
@ -690,15 +692,32 @@ static void SYSMi_Relocate( void )
} }
} }
// アプリロード済み // アプリロード済みかどうかをチェック
BOOL SYSM_IsLoadTitleFinished( void ) BOOL SYSM_IsLoadTitleFinished( void )
{ {
if( SYSMi_GetWork()->flags.common.isLoadSucceeded ) { // ロード済みの時は、常にTRUE
return TRUE; if( !SYSMi_GetWork()->flags.common.isLoadFinished ) {
if( SYSMi_GetWork()->flags.common.isCardBoot ) {
// カードブートの時は、HOTSWライブラリのロード完了をチェック。
SYSMi_GetWork()->flags.common.isLoadFinished = SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted;
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
}else {
// NANDブートの時は、ロードスレッドの完了をチェック。
SYSMi_GetWork()->flags.common.isLoadFinished = OS_IsThreadTerminated( &s_thread );
}
} }
return OS_IsThreadTerminated( &s_thread ); return SYSMi_GetWork()->flags.common.isLoadFinished ? TRUE : FALSE;
} }
// ============================================================================
//
//
// アプリ認証
//
//
// ============================================================================
// TWLアプリおよびNTR拡張NANDアプリ共通のヘッダ認証処理 // TWLアプリおよびNTR拡張NANDアプリ共通のヘッダ認証処理
static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
{ {

View File

@ -87,7 +87,8 @@ typedef struct SYSM_work {
vu32 isValidTSD :1; // NITRO設定データ無効フラグ vu32 isValidTSD :1; // NITRO設定データ無効フラグ
vu32 isLogoSkip :1; // ロゴデモスキップ vu32 isLogoSkip :1; // ロゴデモスキップ
vu32 isHeaderLoadCompleted :1; // アプリヘッダロード完了? vu32 isHeaderLoadCompleted :1; // アプリヘッダロード完了?
vu32 isLoadSucceeded :1; // アプリロード完了? vu32 isLoadFinished :1; // アプリロード完了?
vu32 isLoadSucceeded :1; // アプリロード成功?
vu32 isCardBoot :1; // カードブートか? vu32 isCardBoot :1; // カードブートか?
vu32 isInitialSettings :1; // 初回起動シーケンスか? vu32 isInitialSettings :1; // 初回起動シーケンスか?
vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。 vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。