diff --git a/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c b/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c index 950bfea7..6eb05a6b 100644 --- a/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c +++ b/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c @@ -15,7 +15,7 @@ $Author$ *---------------------------------------------------------------------------*/ -#include +#include // const data------------------------------------------------------------------ diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index deef2264..5b8bfa02 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -47,7 +47,9 @@ static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- static OSThread s_thread; +static OSThread s_auth_thread; static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32); +static AuthResult s_authResult = AUTH_RESULT_PROCESSING; // ROM検証結果 // const data------------------------------------------------------------------ static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = { @@ -516,6 +518,8 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) SYSMi_EnableHotSW( FALSE ); + // 一応、アプリロード開始前に検証結果をPROCESSINGにセット + s_authResult = AUTH_RESULT_PROCESSING; // アプリ未ロード状態なら、ロード開始 if( !pBootTitle->flags.isAppLoadCompleted ) { SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE; @@ -599,16 +603,16 @@ static void SYSMi_Relocate( void ) } } - // アプリロード済み? -BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ) +BOOL SYSM_IsLoadTitleFinished( void ) { - if( pBootTitle->flags.isAppLoadCompleted ) { + if( SYSMi_GetWork()->flags.common.isLoadSucceeded ) { return TRUE; } return OS_IsThreadTerminated( &s_thread ); } + static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) { // [TODO:] NANDアプリの場合、NAM_CheckTitleLaunchRights()を呼んでチェック @@ -707,28 +711,29 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) return AUTH_RESULT_SUCCEEDED; } -// ロード済みの指定タイトルの認証とブートを行う -AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) +static void SYSMi_AuthenticateTitleThreadFunc( TitleProperty *pBootTitle ) { - AuthResult res; - // ロード中 - if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) { - return AUTH_RESULT_PROCESSING; + if( !SYSM_IsLoadTitleFinished() ) { + s_authResult = AUTH_RESULT_PROCESSING; + return; } // ロード成功? if( SYSMi_GetWork()->flags.common.isLoadSucceeded == FALSE ) { - return AUTH_RESULT_TITLE_LOAD_FAILED; + s_authResult = AUTH_RESULT_TITLE_LOAD_FAILED; + return; } // パラメータチェック if( !SYSMi_CheckTitlePointer( pBootTitle ) ) { - return AUTH_RESULT_TITLE_POINTER_ERROR; + s_authResult = AUTH_RESULT_TITLE_POINTER_ERROR; + return; } #if 0 // エントリアドレスの正当性をチェック if( !SYSMi_CheckEntryAddress() ) { - return AUTH_RESULT_ENTRY_ADDRESS_ERROR; + s_authResult = AUTH_RESULT_ENTRY_ADDRESS_ERROR; + return; } #endif @@ -738,14 +743,41 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) ( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) == 0 ) && ( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->fat_size ) > 0 ) ) { - return AUTH_RESULT_TITLE_BOOTTYPE_ERROR; + s_authResult = AUTH_RESULT_TITLE_BOOTTYPE_ERROR; + return; } // ※ROMヘッダ認証 - res = SYSMi_AuthenticateTWLHeader( pBootTitle ); - if( res != AUTH_RESULT_SUCCEEDED ) + s_authResult = SYSMi_AuthenticateTWLHeader( pBootTitle ); +} + + +// ロード済みの指定タイトルを別スレッドで検証開始する +void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ) +{ + static u64 stack[ STACK_SIZE / sizeof(u64) ]; + s_authResult = AUTH_RESULT_PROCESSING; + OS_InitThread(); + OS_CreateThread( &s_auth_thread, (void (*)(void *))SYSMi_AuthenticateTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO ); + OS_WakeupThreadDirect( &s_auth_thread ); +} + +// 検証済み? +BOOL SYSM_IsAuthenticateTitleFinished( void ) +{ + if(s_authResult == AUTH_RESULT_SUCCEEDED) { - return res; + return TRUE; + } + return OS_IsThreadTerminated( &s_auth_thread ); +} + +// ロード済みの指定タイトルの認証とブートを行う +AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ) +{ + if(s_authResult != AUTH_RESULT_SUCCEEDED) + { + return s_authResult; } // マウント情報の登録 diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index e1ac4ef3..51b9668e 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -242,25 +242,32 @@ void TwlMain( void ) break; case LOADING: - if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && - SYSM_IsLoadTitleFinished( pBootTitle ) ) { + if( SYSM_IsLoadTitleFinished() ) { + SYSM_StartAuthenticateTitle( pBootTitle ); state = AUTHENTICATE; } - + if( !direct_boot ) + { + (void)LauncherFadeout( s_titleList ); // ダイレクトブートでないときはフェードアウトも行う + } if( ( end == 0 ) && - SYSM_IsLoadTitleFinished( pBootTitle ) ) { + SYSM_IsLoadTitleFinished() ) { end = OS_GetTick(); OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) ); } break; case AUTHENTICATE: - switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時:never return - case AUTH_RESULT_TITLE_LOAD_FAILED: - case AUTH_RESULT_TITLE_POINTER_ERROR: - case AUTH_RESULT_AUTHENTICATE_FAILED: - case AUTH_RESULT_ENTRY_ADDRESS_ERROR: - state = STOP; - break; + if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && + SYSM_IsAuthenticateTitleFinished() ) + { + switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時:never return + case AUTH_RESULT_TITLE_LOAD_FAILED: + case AUTH_RESULT_TITLE_POINTER_ERROR: + case AUTH_RESULT_AUTHENTICATE_FAILED: + case AUTH_RESULT_ENTRY_ADDRESS_ERROR: + state = STOP; + break; + } } break; case STOP: // 停止 diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index 71bb4937..71a6e34c 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #ifdef __cplusplus @@ -94,8 +93,10 @@ extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); / // アプリ起動 extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード開始 -extern BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認 -extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート +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をブート // 成功時は、never return. // デバイス制御 extern void SYSM_CaribrateTP( void ); // タッチパネルキャリブレーション diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 89100a22..65a3f7af 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -82,7 +82,7 @@ typedef struct ISD_RomEmuInfo { //---------------------------------------------------------------------- // SYSM共有ワーク構造体 typedef struct SYSM_work { - Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報(arm9,arm7それぞれltdとflxで最大4つ) + Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報(arm9,arm7それぞれltdとflxで最大4つ) struct { struct { vu32 isFatalError :1; // FATALエラー