From 5cb584744cdf222442d390cd1a3a9de0bfe129f2 Mon Sep 17 00:00:00 2001 From: nakasima Date: Wed, 14 May 2008 11:24:41 +0000 Subject: [PATCH] =?UTF-8?q?SDK=E3=81=AEROM=E3=83=98=E3=83=83=E3=83=80?= =?UTF-8?q?=E3=83=90=E3=83=83=E3=83=95=E3=82=A1=E3=81=B8=E3=81=AE=E3=82=B3?= =?UTF-8?q?=E3=83=94=E3=83=BC=E3=82=92REBOOT=E3=81=BE=E3=81=A7=E9=81=85?= =?UTF-8?q?=E5=BB=B6=EF=BC=88SDK=E3=81=AEExit=E5=87=A6=E7=90=86=E3=82=92RE?= =?UTF-8?q?BOOT=E3=81=A7=E3=82=82=E5=88=A9=E7=94=A8=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=9F=E3=82=81=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1345 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 29 ++++++------------- .../libraries_sysmenu/boot/ARM9/src/bootAPI.c | 10 ++++--- .../ds/common/src/ds_wlpatch.c | 12 ++++---- .../sysmenu/common/src/mountInfo.c | 6 ++-- include/sysmenu/ds/common/ds.h | 2 +- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 1 + 6 files changed, 25 insertions(+), 35 deletions(-) diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index b44f406a..ceb7a58a 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -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 ) && diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index 3538f27f..d54f3e0b 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -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 ); } } diff --git a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c index c5b66993..c0590710 100644 --- a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c +++ b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c @@ -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が正しい場合) diff --git a/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c index eb09c200..d9b06807 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c +++ b/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c @@ -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 ); diff --git a/include/sysmenu/ds/common/ds.h b/include/sysmenu/ds/common/ds.h index e5419e9b..64693a01 100644 --- a/include/sysmenu/ds/common/ds.h +++ b/include/sysmenu/ds/common/ds.h @@ -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 ); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 8546079f..5abcf127 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -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;