mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ランチャーからアプリ起動時のヘッダ検証処理をスレッド化
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@649 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
149112e6ab
commit
d66199876e
@ -15,7 +15,7 @@
|
||||
$Author$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
|
||||
#include <sysmenu/sysmenu_lib.h>
|
||||
|
||||
// const data------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
// マウント情報の登録
|
||||
|
||||
@ -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: // ’âŽ~
|
||||
|
||||
@ -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 ); // タッチパネルキャリブレーション
|
||||
|
||||
@ -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エラー
|
||||
|
||||
Loading…
Reference in New Issue
Block a user