SDKのROMヘッダバッファへのコピーをREBOOTまで遅延(SDKのExit処理をREBOOTでも利用するため)。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1345 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-05-14 11:24:41 +00:00
parent 0cf9aaad4f
commit 5cb584744c
6 changed files with 25 additions and 35 deletions

View File

@ -100,34 +100,22 @@ BOOL BOOT_WaitStart( void )
{
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
ROM_Header *th = (ROM_Header *)SYSM_CARD_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
BOOL isNtrMode;
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
(void)OS_SetIrqMaskEx(0);
// ヘッダ情報再配置
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL )
{
// TWL-ROMヘッダ情報の再配置
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE );
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
}else {
// NTRモード
// TWL-ROMヘッダ情報の再配置
// ランチャーのROMヘッダが残っている非コピー領域もクリア
MI_CpuClearFast( (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE );
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
}
// NTR-ROMヘッダへのパッチ処理のためコピー
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, dh, HW_CARD_ROM_HEADER_SIZE );
// ブラックリストをチェックし、起動制限をかける
BOOTi_CheckTitleBlackList();
// マウント情報を一時的にSYSM_TWL_MOUNT_INFO_TMP_BUFFERに登録
// ここまでにHW_TWL_ROM_HEADER_BUFのヘッダが次のアプリのものに変更されている必要あり
// ここまでにSYSM_CARD_ROM_HEADER_BUFのキャッシュがライトバックされている必要あり
SYSMi_SetBootAppMountInfo( &SYSMi_GetWork2()->bootTitleProperty );
// FSによってshared領域にコピーされたランチャー自身のマウントパスのクリア
@ -161,7 +149,6 @@ BOOL BOOT_WaitStart( void )
// メモリリストの設定
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域WRAMにあるを消さないように注意。
// WRAMリマップ後の消し漏れやバッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
// [TODO:] DSPの使っているWRAMをどこからどこまで消すか
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
{
// pre clear
@ -303,6 +290,8 @@ BOOL BOOT_WaitStart( void )
#endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
// リブート
REBOOTi_SetTwlRomHeaderAddr( th );
REBOOTi_SetRomHeaderAddr( dh );
OS_Boot( dh->s.sub_entry_address, mem_list, target );
}
}
@ -404,7 +393,7 @@ static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end )
static void BOOTi_CheckTitleBlackList( void )
{
const TitleBlackList *pBlackList = &s_blackList[ 0 ];
ROM_Header_Short *pROMH = (ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF;
ROM_Header_Short *pROMH = (ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF;
while( pBlackList->rom_version >= 0 ) {
if( ( pBlackList->titleID == pROMH->titleID ) &&

View File

@ -56,11 +56,11 @@ static void ie_subphandler( void )
void BOOT_Ready( void )
{
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
ROM_Header *th = (ROM_Header *)SYSM_CARD_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
BOOL isNtrMode;
int i;
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
// SYSMi_CheckEntryAddress();
@ -182,7 +182,7 @@ void BOOT_Ready( void )
// キャッシュ領域の排他制御簡略化のためARM9で行う
if ( target == REBOOT_TARGET_DS_APP )
{
DS_InsertWLPatch();
DS_InsertWLPatch( dh );
}
// デバッガによるROMエミュレーション時はNTR-ROMヘッダバッファの
@ -196,6 +196,8 @@ void BOOT_Ready( void )
}
// 起動するターゲットの種類を指定する必要あり
REBOOTi_SetTwlRomHeaderAddr( th );
REBOOTi_SetRomHeaderAddr( dh );
OS_Boot( dh->s.main_entry_address, mem_list, target );
}
}

View File

@ -86,6 +86,7 @@ static const u32 patch3_code[] = {
// static variables-----------------------------------------------------
static u32 mbSignBuf[MB_AUTHCODE_SIZE / sizeof(u32)] __attribute__ ((aligned(32)));
static ROM_Header *dh; // DS互換ROMヘッダ
// function's description-----------------------------------------------
@ -98,8 +99,10 @@ static u32 mbSignBuf[MB_AUTHCODE_SIZE / sizeof(u32)] __attribute__ ((aligned(32)
//----------------------------------------------------------------------
// パッチコードの挿入
void DS_InsertWLPatch( void )
void DS_InsertWLPatch( void* romHeaderNTR )
{
dh = romHeaderNTR;
// SDKバージョンがパッチ対象
if( DSi_IsPatchedSDKVersion() ) {
// patch1, patch3をサーチ
@ -112,7 +115,7 @@ void DS_InsertWLPatch( void )
}
// パッチ対象コードが見つかったら、パッチコードをセット。
if( patch_addr ) {
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
ROM_Header *dh = romHeaderNTR; // DS互換ROMヘッダ
if( SYSMi_GetWork()->cloneBootMode == SYSM_CLONE_BOOT_MODE ) { // ※クローンブートかどうかはDS_CheckROMCloneBoot()で事前に調査。
// クローンブートならば、直パッチ
SVC_CpuCopyFast( patchp, patch_addr, DS_WLPATCH_SIZE );
@ -131,7 +134,6 @@ void DS_InsertWLPatch( void )
// パッチベースアドレスの取得
static void* DSi_GetPatchBaseAddr( void )
{
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
void* p = (void*)SYSMi_GetWork()->romRelocateInfo[1].src;
// 再配置しない場合は
@ -177,7 +179,6 @@ static BOOL DSi_IsPatchedSDKVersion( void )
// バイナリサーチ
static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset )
{
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
u32 *tgtp;
int tgt_word_size;
@ -222,7 +223,6 @@ static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_o
// パッチコードをシステムのRED予約領域にセット
static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp )
{
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
u32 *dstp = (u32 *)HW_RED_RESERVED;
u32 *srcp = (u32 *)&DSi_CopyWLPatch;
int i;
@ -287,7 +287,6 @@ asm void DSi_CopyWLPatch( void )
// クローンブート判定
void DS_CheckROMCloneBoot( void )
{
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
s32 lockCardID;
u8 *buffp = (u8 *)&mbSignBuf;
u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000;
@ -316,7 +315,6 @@ void DS_CheckROMCloneBoot( void )
// NITROカード存在チェック 「リターン 1カード認識 0カードなし」
static int DSi_ExistNitroCard(void)
{
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
if((dh->s.nintendo_logo_crc16 == 0xcf56)
&&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) {
return TRUE; // NITROカードありNintendoロゴCRC、カードヘッダCRCが正しい場合

View File

@ -105,7 +105,7 @@ void SYSMi_SetLauncherMountInfo( void )
void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
{
OSMountInfo mountListBuffer[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4);
ROM_Header_Short *pROMH = ( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF;
ROM_Header_Short *pROMH = ( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF;
// アプリがTWL対応でない場合は、何もセットせずにリターン
if( ( pROMH->platform_code ) == 0 ) {
return;
@ -225,8 +225,8 @@ static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId tit
) {
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;
saveDataSize[ 0 ] = (( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF)->private_save_data_size;
saveDataSize[ 1 ] = (( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF)->public_save_data_size;
// セーブデータのファイルパスを取得
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );

View File

@ -28,7 +28,7 @@ extern "C" {
#define DS_WLPATCH_SIZE (5*4)
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
void DS_InsertWLPatch( void );
void DS_InsertWLPatch( void* romHeaderNTR );
void DS_CheckROMCloneBoot( void );

View File

@ -140,6 +140,7 @@ typedef struct SYSM_work {
u8 cloneBootMode;
CardReadParam cardReadParam; // カードリードパラメータ
u32 romHeaderNTR[HW_CARD_ROM_HEADER_SIZE/sizeof(u32)]; // NTR-ROMヘッダ一時バッファ
LauncherParam launcherParam;
SYSMRomEmuInfo romEmuInfo;