diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c index 7de6e4ee..7d52a461 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c @@ -35,10 +35,10 @@ // extern data----------------------------------------------------------------- // function's prototype-------------------------------------------------------- -static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID ); -static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ); -static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); -static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); +static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID ); +static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ); +static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); +static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- @@ -74,16 +74,16 @@ void SYSMi_SetLauncherMountInfo( void ) NAMTitleId titleID = TITLE_ID_LAUNCHER; // ※とりあえず自身はROMブートで。[TODO:]後で修正 -// SYSMi_SetBootSRLPath( OS_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。 +// SYSMi_SetBootSRLPath( LAUNCHER_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。 // セーブデータ有無によるマウント情報の編集 // ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。 - SYSMi_ModifySaveDataMountForLauncher( OS_BOOTTYPE_NAND, + SYSMi_ModifySaveDataMountForLauncher( LAUNCHER_BOOTTYPE_NAND, titleID, &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] ); // マウント情報のセット - SYSMi_SetMountInfoCore( OS_BOOTTYPE_NAND, + SYSMi_SetMountInfoCore( LAUNCHER_BOOTTYPE_NAND, titleID, &s_defaultMountList[0] ); } @@ -98,16 +98,16 @@ void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle ) } // 起動アプリのSRLパスをセット - SYSMi_SetBootSRLPath( (OSBootType)pBootTitle->flags.bootType, + SYSMi_SetBootSRLPath( (LauncherBootType)pBootTitle->flags.bootType, pBootTitle->titleID ); // セーブデータ有無によるマウント情報の編集 - SYSMi_ModifySaveDataMount( (OSBootType)pBootTitle->flags.bootType, + SYSMi_ModifySaveDataMount( (LauncherBootType)pBootTitle->flags.bootType, pBootTitle->titleID, &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] ); // マウント情報のセット - SYSMi_SetMountInfoCore( (OSBootType)pBootTitle->flags.bootType, + SYSMi_SetMountInfoCore( (LauncherBootType)pBootTitle->flags.bootType, pBootTitle->titleID, &s_defaultMountList[0] ); @@ -121,18 +121,18 @@ void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle ) // 起動SRLパスをシステム領域にセット -static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID ) +static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID ) { static char path[ FS_ENTRY_LONGNAME_MAX ]; switch( bootType ) { - case OS_BOOTTYPE_NAND: + case LAUNCHER_BOOTTYPE_NAND: if( NAM_GetTitleBootContentPathFast( path, titleID ) != NAM_OK ) { OS_TPrintf( "ERROR: BootContentPath Get failed.\n" ); } break; - case OS_BOOTTYPE_TEMP: + case LAUNCHER_BOOTTYPE_TEMP: STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", titleID ); break; default: @@ -151,7 +151,7 @@ static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID ) // マウント情報をシステム領域に書き込み -static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ) +static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ) { #pragma unused(bootType) @@ -185,16 +185,16 @@ static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSM // タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。 -static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ) +static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ) { int i; // ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。 // セーブデータ有無を判定して、パスをセット - if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時 + if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時 ( titleID & TITLEID_MEDIA_NAND_FLAG ) ) || - ( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 + ( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 ( titleID & TITLEID_MEDIA_NAND_FLAG ) && ( SYSMi_GetWork()->isOnDebugger ) ) ) { @@ -229,16 +229,16 @@ static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, // タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。 -static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ) +static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ) { int i; // ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。 // セーブデータ有無を判定して、パスをセット - if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時 + if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時 ( titleID & TITLEID_MEDIA_NAND_FLAG ) ) || - ( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 + ( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 ( titleID & TITLEID_MEDIA_NAND_FLAG ) && ( SYSMi_GetWork()->isOnDebugger ) ) ) { diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 5f369596..380bc5b5 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -157,6 +157,7 @@ TitleProperty *SYSM_ReadParameters( void ) if( !LCFG_ReadHWSecureInfo() ) { OS_TPrintf( "HW Secure Info Broken!\n" ); SYSMi_GetWork()->isBrokenHWSecureInfo = TRUE; + SYSMi_GetWork()->isFatalError = TRUE; } //----------------------------------------------------- @@ -209,7 +210,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void ) s_bootTitle.flags.isAppLoadCompleted = TRUE; s_bootTitle.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす s_bootTitle.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす - s_bootTitle.flags.bootType = OS_BOOTTYPE_ROM; + s_bootTitle.flags.bootType = LAUNCHER_BOOTTYPE_ROM; s_bootTitle.flags.isValid = TRUE; s_bootTitle.titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo ); SYSM_SetLogoDemoSkip( s_bootTitle.flags.isLogoSkip ); @@ -228,7 +229,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void ) !LCFG_TSD_IsSetUserColor() || !LCFG_TSD_IsSetNickname() ) { s_bootTitle.titleID = TITLE_ID_MACHINE_SETTINGS; - s_bootTitle.flags.bootType = OS_BOOTTYPE_NAND; + s_bootTitle.flags.bootType = LAUNCHER_BOOTTYPE_NAND; s_bootTitle.flags.isValid = TRUE; return &s_bootTitle; } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 9c2f77de..9f813c46 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -36,6 +36,13 @@ static OSThread s_thread; static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32); // const data------------------------------------------------------------------ +static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = { + OS_BOOTTYPE_ILLEGAL, // ILLEGAL + OS_BOOTTYPE_ROM, // ROM + OS_BOOTTYPE_NAND, // TEMP + OS_BOOTTYPE_NAND, // NAND + OS_BOOTTYPE_MEMORY, // MEMORY +}; // ============================================================================ // @@ -81,41 +88,13 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ) } // タイトル情報フラグのセット - pTitleList_Card->flags.bootType = OS_BOOTTYPE_ROM; + pTitleList_Card->flags.bootType = LAUNCHER_BOOTTYPE_ROM; pTitleList_Card->titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo ); return retval; } -// 指定ファイルリード -static s32 ReadFile(FSFile* pf, void* buffer, s32 size) -{ - u8* p = (u8*)buffer; - s32 remain = size; - - while( remain > 0 ) - { - const s32 len = MATH_IMin(1024, remain); - const s32 readLen = FS_ReadFile(pf, p, len); - - if( readLen < 0 ) - { - return readLen; - } - if( readLen != len ) - { - return size - remain + readLen; - } - - remain -= readLen; - p += readLen; - } - - return size; -} - - // NANDタイトルリストの取得 int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) { @@ -214,7 +193,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l]; if( titleIdArray[l] ) { pTitleList_Nand[l+1].flags.isValid = TRUE; - pTitleList_Nand[l+1].flags.bootType = OS_BOOTTYPE_NAND; + pTitleList_Nand[l+1].flags.bootType = LAUNCHER_BOOTTYPE_NAND; } } // return : *TitleProperty Array @@ -222,6 +201,34 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) } +// 指定ファイルリード +static s32 ReadFile(FSFile* pf, void* buffer, s32 size) +{ + u8* p = (u8*)buffer; + s32 remain = size; + + while( remain > 0 ) + { + const s32 len = MATH_IMin(1024, remain); + const s32 readLen = FS_ReadFile(pf, p, len); + + if( readLen < 0 ) + { + return readLen; + } + if( readLen != len ) + { + return size - remain + readLen; + } + + remain -= readLen; + p += readLen; + } + + return size; +} + + // ============================================================================ // // アプリ起動 @@ -250,22 +257,21 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ) FSFile file[1]; BOOL bSuccess; BOOL isTwlApp = TRUE; - if(pBootTitle->flags.bootType == OS_BOOTTYPE_NAND) - { + + switch( pBootTitle->flags.bootType ) + { + case LAUNCHER_BOOTTYPE_NAND: // NAND NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID); - } - else if(pBootTitle->flags.bootType == OS_BOOTTYPE_ROM) - { + break; + case LAUNCHER_BOOTTYPE_ROM: // TODO:CARD未読の場合の処理 - } - else if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP) - { + break; + case LAUNCHER_BOOTTYPE_TEMP: // tmpフォルダ STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID ); - } - else - { + break; + default: // unknown return; } @@ -394,7 +400,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); (void)FS_CloseFile(file); - if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP) + if(pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP) { // tmpアプリの場合はファイル削除 // TODO:その他読み込み等の失敗時にもDeleteする必要あり? @@ -432,7 +438,7 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) SYSMi_GetWork()->isLoadSucceeded = TRUE; } - if( pBootTitle->flags.bootType == OS_BOOTTYPE_ROM ) { + if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) { SYSMi_GetWork()->isCardBoot = TRUE; }else if(pBootTitle->flags.isAppLoadCompleted) { @@ -525,6 +531,14 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) } #endif + // BOOTTYPE_MEMORYでNTRモードのFSありでブートすると、旧NitroSDKでビルドされたアプリの場合、 + // ROMアーカイブにカードが割り当てられて、FSで関係ないカードにアクセスにいってしまうので、それを防止する。 + if( ( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_MEMORY ) && + ( ( (( 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; + } // ※ROMヘッダ認証 @@ -533,16 +547,14 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) SYSMi_SetBootAppMountInfo( pBootTitle ); // HW_WM_BOOT_BUFへのブート情報セット - { - OSBootInfo *pBootInfo = (OSBootInfo *)OS_GetBootInfo(); - pBootInfo->boot_type = (OSBootType)pBootTitle->flags.bootType; - } + ( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ]; BOOT_Ready(); // never return. return AUTH_RESULT_SUCCEEDED; } + #if 0 // 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 // もしかすると使わないかも diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 0ceeaa51..c09d4745 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -509,7 +509,7 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList ) u16 dummy; u16 tp_lr = 3; TitleProperty *ret = NULL; - LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; + LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; // バックライト関係のキー処理 ProcessBackLightPads(); diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c index bfc01ef6..108d912a 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c @@ -188,7 +188,7 @@ int MachineSettingMain( void ) { BOOL tp_select; - LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; + LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; ReadTP(); diff --git a/build/tests/AppliCooperation/CooperationA/ARM9/src/CooperationA.c b/build/tests/AppliCooperation/CooperationA/ARM9/src/CooperationA.c index b84aec28..5150591d 100644 --- a/build/tests/AppliCooperation/CooperationA/ARM9/src/CooperationA.c +++ b/build/tests/AppliCooperation/CooperationA/ARM9/src/CooperationA.c @@ -439,7 +439,7 @@ static void MenuScene(void) { BOOL tp_select = FALSE; static TPData tgt = (TPData){0,0,0,0}; - LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; + LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; ReadTP(); diff --git a/build/tests/AppliCooperation/CooperationB/ARM9/src/CooperationB.c b/build/tests/AppliCooperation/CooperationB/ARM9/src/CooperationB.c index 4956ccde..88336125 100644 --- a/build/tests/AppliCooperation/CooperationB/ARM9/src/CooperationB.c +++ b/build/tests/AppliCooperation/CooperationB/ARM9/src/CooperationB.c @@ -124,7 +124,7 @@ static void MenuInit( void ) static void MenuScene(void) { BOOL tp_select = FALSE; - LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; + LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; ReadTP(); diff --git a/build/tests/AppliCooperation/CooperationC/ARM9/src/CooperationC.c b/build/tests/AppliCooperation/CooperationC/ARM9/src/CooperationC.c index 75db8886..47e542c3 100644 --- a/build/tests/AppliCooperation/CooperationC/ARM9/src/CooperationC.c +++ b/build/tests/AppliCooperation/CooperationC/ARM9/src/CooperationC.c @@ -439,7 +439,7 @@ static void MenuScene(void) { BOOL tp_select = FALSE; static TPData tgt = (TPData){0,0,0,0}; - LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; + LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0}; ReadTP(); diff --git a/build/tests/ExecPreLoadedApp/ARM9/src/ExecPreLoadedApp.c b/build/tests/ExecPreLoadedApp/ARM9/src/ExecPreLoadedApp.c index 82bad73b..b86adc2f 100644 --- a/build/tests/ExecPreLoadedApp/ARM9/src/ExecPreLoadedApp.c +++ b/build/tests/ExecPreLoadedApp/ARM9/src/ExecPreLoadedApp.c @@ -134,7 +134,7 @@ static BOOL LoadTitle( NAMTitleId bootTitleID ) static void MenuScene(void) { BOOL tp_select = FALSE; - LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, TRUE, FALSE, 0}; + LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, TRUE, FALSE, 0}; ReadTP(); diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index 02e536dd..5e04d7d3 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -65,7 +65,8 @@ typedef enum AuthResult { AUTH_RESULT_TITLE_LOAD_FAILED = 2, AUTH_RESULT_TITLE_POINTER_ERROR = 3, AUTH_RESULT_AUTHENTICATE_FAILED = 4, - AUTH_RESULT_ENTRY_ADDRESS_ERROR = 5 + AUTH_RESULT_ENTRY_ADDRESS_ERROR = 5, + AUTH_RESULT_TITLE_BOOTTYPE_ERROR = 6 }AuthResult; diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 4103440f..a6aaf7ea 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -70,6 +70,7 @@ typedef struct ISD_RomEmuInfo { // SYSM共有ワーク構造体 typedef struct SYSM_work { Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報(arm9,arm7それぞれltdとflxで最大4つ) + vu32 isFatalError :1; // FATALエラー vu32 isARM9Start :1; // ARM9スタートフラグ vu32 isHotStart :1; // Hot/Coldスタート判定 vu32 isValidLauncherParam :1; // リセットパラメータ有効 @@ -86,9 +87,9 @@ typedef struct SYSM_work { #ifdef DEBUG_USED_CARD_SLOT_B_ vu32 isValidCardBanner :1; vu32 is1stCardChecked :1; - vu32 rsv :18; + vu32 rsv :17; #else - vu32 rsv :20; + vu32 rsv :19; #endif u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16(ARM9側でコピーして使用する側)