・MountInfoのバグ修正。

・ISデバッガv0.40で、エミュレーションROM情報がデバッガで起動したアプリでも読めてしまうため、
 SYSMi_CheckShortcutBoot関数でのISデバッガ判定に「JTAG有効か?」の条件を復活させる。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@499 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-01-23 01:50:41 +00:00
parent 1761c262d0
commit 08e5305a93
3 changed files with 55 additions and 7 deletions

View File

@ -41,6 +41,7 @@ void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle );
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 );
// global variable-------------------------------------------------------------
@ -84,9 +85,10 @@ void SYSMi_SetLauncherMountInfo( void )
// SYSMi_SetBootSRLPath( OS_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
// セーブデータ有無によるマウント情報の編集
SYSMi_ModifySaveDataMount( OS_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。
SYSMi_ModifySaveDataMountForLauncher( OS_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// マウント情報のセット
SYSMi_SetMountInfoCore( OS_BOOTTYPE_NAND,
@ -233,3 +235,47 @@ static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID,
}
}
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
u32 titleID_Hi = (u32)( titleID >> 32 ); // u64で論理演算はできない
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID_Hi & TITLEID_HI_MEDIA_NAND_FLAG ) ) ||
( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID_Hi & TITLEID_HI_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->isOnDebugger ) )
) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ];
saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size;
saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size;
// セーブデータのファイルパスを取得
STD_TSNPrintf( saveFilePath[ 0 ], FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/data/private.sav", (u32)( titleID >> 32 ), titleID );
STD_TSNPrintf( saveFilePath[ 1 ], FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/data/public.sav", (u32)( titleID >> 32 ), titleID );
// "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録
for( i = 0; i < 2; i++ ) {
if( saveDataSize[ i ] ) {
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
}else {
pMountTgt->drive[ 0 ] = 0;
}
pMountTgt++;
}
}else {
// タイトルID指定なしのカードアプリの場合は、セーブデータ無効
for( i = 0; i < 2; i++ ) {
pMountTgt->drive[ 0 ] = 0;
}
}
}

View File

@ -218,7 +218,8 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
// 検査カード起動
//-----------------------------------------------------
if( SYSM_IsExistCard() ) {
if( SYSMi_GetWork()->isOnDebugger ||
if( ( SYSMi_GetWork()->isOnDebugger && // ISデバッガが有効かつJTAGがまだ有効でない時
!( *(u8 *)( HW_SYS_CONF_BUF + HWi_WSYS09_OFFSET ) & HWi_WSYS09_JTAG_CPUJE_MASK ) ) ||
SYSM_IsInspectCard() ||
( ( PAD_Read() & PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) ==
PAD_PRODUCTION_SHORTCUT_CARD_BOOT )
@ -724,6 +725,7 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
// TWL-ROMヘッダ情報の再配置
MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
// NTR-ROMヘッダ情報の再配置は、rebootライブラリで行う。
}
}
}

View File

@ -75,10 +75,10 @@ void TwlMain( void )
OSTick start, end = 0;
BOOL direct_boot = FALSE;
OS_Init();
// システムメニュー初期化----------
SYSM_SetArena();
SYSM_Init( Alloc, Free ); // OS_Initは、本関数内でコールしているので、コールする必要なし。
SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。
OS_Init();
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
// OS初期化------------------------
OS_InitTick();