ランチャーからアプリ起動時のヘッダ検証処理をスレッド化

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@649 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-02-13 07:02:03 +00:00
parent 149112e6ab
commit d66199876e
5 changed files with 72 additions and 32 deletions

View File

@ -15,7 +15,7 @@
$Author$
*---------------------------------------------------------------------------*/
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
#include <sysmenu/sysmenu_lib.h>
// const data------------------------------------------------------------------

View File

@ -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;
}
// マウント情報の登録

View File

@ -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: // ’âŽ~

View File

@ -22,7 +22,6 @@
#include <twl/nam.h>
#include <twl/os/common/format_rom.h>
#include <twl/os/common/banner.h>
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
#include <sysmenu/reloc_info/common/reloc_info.h>
#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 ); // タッチパネルキャリブレーション

View File

@ -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エラー