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$
|
$Author$
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
|
#include <sysmenu/sysmenu_lib.h>
|
||||||
|
|
||||||
// const data------------------------------------------------------------------
|
// const data------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,9 @@ static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
|||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
static OSThread s_thread;
|
static OSThread s_thread;
|
||||||
|
static OSThread s_auth_thread;
|
||||||
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
|
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
|
||||||
|
static AuthResult s_authResult = AUTH_RESULT_PROCESSING; // ROM検証結果
|
||||||
|
|
||||||
// const data------------------------------------------------------------------
|
// const data------------------------------------------------------------------
|
||||||
static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = {
|
static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = {
|
||||||
@ -516,6 +518,8 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
|||||||
|
|
||||||
SYSMi_EnableHotSW( FALSE );
|
SYSMi_EnableHotSW( FALSE );
|
||||||
|
|
||||||
|
// 一応、アプリロード開始前に検証結果をPROCESSINGにセット
|
||||||
|
s_authResult = AUTH_RESULT_PROCESSING;
|
||||||
// アプリ未ロード状態なら、ロード開始
|
// アプリ未ロード状態なら、ロード開始
|
||||||
if( !pBootTitle->flags.isAppLoadCompleted ) {
|
if( !pBootTitle->flags.isAppLoadCompleted ) {
|
||||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE;
|
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 TRUE;
|
||||||
}
|
}
|
||||||
return OS_IsThreadTerminated( &s_thread );
|
return OS_IsThreadTerminated( &s_thread );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
||||||
{
|
{
|
||||||
// [TODO:] NANDアプリの場合、NAM_CheckTitleLaunchRights()を呼んでチェック
|
// [TODO:] NANDアプリの場合、NAM_CheckTitleLaunchRights()を呼んでチェック
|
||||||
@ -707,28 +711,29 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
|||||||
return AUTH_RESULT_SUCCEEDED;
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ロード済みの指定タイトルの認証とブートを行う
|
static void SYSMi_AuthenticateTitleThreadFunc( TitleProperty *pBootTitle )
|
||||||
AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
|
|
||||||
{
|
{
|
||||||
AuthResult res;
|
|
||||||
|
|
||||||
// ロード中
|
// ロード中
|
||||||
if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
if( !SYSM_IsLoadTitleFinished() ) {
|
||||||
return AUTH_RESULT_PROCESSING;
|
s_authResult = AUTH_RESULT_PROCESSING;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// ロード成功?
|
// ロード成功?
|
||||||
if( SYSMi_GetWork()->flags.common.isLoadSucceeded == FALSE )
|
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 ) ) {
|
if( !SYSMi_CheckTitlePointer( pBootTitle ) ) {
|
||||||
return AUTH_RESULT_TITLE_POINTER_ERROR;
|
s_authResult = AUTH_RESULT_TITLE_POINTER_ERROR;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
// エントリアドレスの正当性をチェック
|
// エントリアドレスの正当性をチェック
|
||||||
if( !SYSMi_CheckEntryAddress() ) {
|
if( !SYSMi_CheckEntryAddress() ) {
|
||||||
return AUTH_RESULT_ENTRY_ADDRESS_ERROR;
|
s_authResult = AUTH_RESULT_ENTRY_ADDRESS_ERROR;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#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)->platform_code ) == 0 ) &&
|
||||||
( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->fat_size ) > 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ヘッダ認証
|
// ※ROMヘッダ認証
|
||||||
res = SYSMi_AuthenticateTWLHeader( pBootTitle );
|
s_authResult = SYSMi_AuthenticateTWLHeader( pBootTitle );
|
||||||
if( res != AUTH_RESULT_SUCCEEDED )
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ロード済みの指定タイトルを別スレッドで検証開始する
|
||||||
|
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;
|
break;
|
||||||
case LOADING:
|
case LOADING:
|
||||||
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
if( SYSM_IsLoadTitleFinished() ) {
|
||||||
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
SYSM_StartAuthenticateTitle( pBootTitle );
|
||||||
state = AUTHENTICATE;
|
state = AUTHENTICATE;
|
||||||
}
|
}
|
||||||
|
if( !direct_boot )
|
||||||
|
{
|
||||||
|
(void)LauncherFadeout( s_titleList ); // ダイレクトブートでないときはフェードアウトも行う
|
||||||
|
}
|
||||||
if( ( end == 0 ) &&
|
if( ( end == 0 ) &&
|
||||||
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
SYSM_IsLoadTitleFinished() ) {
|
||||||
end = OS_GetTick();
|
end = OS_GetTick();
|
||||||
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AUTHENTICATE:
|
case AUTHENTICATE:
|
||||||
switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時:never return
|
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
||||||
case AUTH_RESULT_TITLE_LOAD_FAILED:
|
SYSM_IsAuthenticateTitleFinished() )
|
||||||
case AUTH_RESULT_TITLE_POINTER_ERROR:
|
{
|
||||||
case AUTH_RESULT_AUTHENTICATE_FAILED:
|
switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時:never return
|
||||||
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
|
case AUTH_RESULT_TITLE_LOAD_FAILED:
|
||||||
state = STOP;
|
case AUTH_RESULT_TITLE_POINTER_ERROR:
|
||||||
break;
|
case AUTH_RESULT_AUTHENTICATE_FAILED:
|
||||||
|
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
|
||||||
|
state = STOP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STOP: // ’âŽ~
|
case STOP: // ’âŽ~
|
||||||
|
|||||||
@ -22,7 +22,6 @@
|
|||||||
#include <twl/nam.h>
|
#include <twl/nam.h>
|
||||||
#include <twl/os/common/format_rom.h>
|
#include <twl/os/common/format_rom.h>
|
||||||
#include <twl/os/common/banner.h>
|
#include <twl/os/common/banner.h>
|
||||||
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
|
|
||||||
#include <sysmenu/reloc_info/common/reloc_info.h>
|
#include <sysmenu/reloc_info/common/reloc_info.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -94,8 +93,10 @@ extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); /
|
|||||||
|
|
||||||
// アプリ起動
|
// アプリ起動
|
||||||
extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード開始
|
extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード開始
|
||||||
extern BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
|
extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
|
||||||
extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート
|
extern void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドで検証開始
|
||||||
|
extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthenticateTitleで起動したスレッドが終了したかどうかを確認
|
||||||
|
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをブート
|
||||||
// 成功時は、never return.
|
// 成功時は、never return.
|
||||||
// デバイス制御
|
// デバイス制御
|
||||||
extern void SYSM_CaribrateTP( void ); // タッチパネルキャリブレーション
|
extern void SYSM_CaribrateTP( void ); // タッチパネルキャリブレーション
|
||||||
|
|||||||
@ -82,7 +82,7 @@ typedef struct ISD_RomEmuInfo {
|
|||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// SYSM共有ワーク構造体
|
// SYSM共有ワーク構造体
|
||||||
typedef struct SYSM_work {
|
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 {
|
||||||
struct {
|
struct {
|
||||||
vu32 isFatalError :1; // FATALエラー
|
vu32 isFatalError :1; // FATALエラー
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user