mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
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:
parent
0cf9aaad4f
commit
5cb584744c
@ -100,34 +100,22 @@ BOOL BOOT_WaitStart( void )
|
|||||||
{
|
{
|
||||||
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
|
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
|
||||||
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
||||||
ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
ROM_Header *th = (ROM_Header *)SYSM_CARD_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
||||||
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
||||||
BOOL isNtrMode;
|
BOOL isNtrMode;
|
||||||
|
|
||||||
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
||||||
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
|
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
|
||||||
(void)OS_SetIrqMaskEx(0);
|
(void)OS_SetIrqMaskEx(0);
|
||||||
|
|
||||||
// ヘッダ情報再配置
|
// NTR-ROMヘッダへのパッチ処理のためコピー
|
||||||
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL )
|
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, dh, HW_CARD_ROM_HEADER_SIZE );
|
||||||
{
|
|
||||||
// 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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ブラックリストをチェックし、起動制限をかける
|
// ブラックリストをチェックし、起動制限をかける
|
||||||
BOOTi_CheckTitleBlackList();
|
BOOTi_CheckTitleBlackList();
|
||||||
|
|
||||||
// マウント情報を一時的にSYSM_TWL_MOUNT_INFO_TMP_BUFFERに登録
|
// マウント情報を一時的にSYSM_TWL_MOUNT_INFO_TMP_BUFFERに登録
|
||||||
// ここまでにHW_TWL_ROM_HEADER_BUFのヘッダが次のアプリのものに変更されている必要あり
|
// ここまでにSYSM_CARD_ROM_HEADER_BUFのキャッシュがライトバックされている必要あり
|
||||||
SYSMi_SetBootAppMountInfo( &SYSMi_GetWork2()->bootTitleProperty );
|
SYSMi_SetBootAppMountInfo( &SYSMi_GetWork2()->bootTitleProperty );
|
||||||
|
|
||||||
// FSによってshared領域にコピーされたランチャー自身のマウントパスのクリア
|
// FSによってshared領域にコピーされたランチャー自身のマウントパスのクリア
|
||||||
@ -161,7 +149,6 @@ BOOL BOOT_WaitStart( void )
|
|||||||
// メモリリストの設定
|
// メモリリストの設定
|
||||||
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域(WRAMにある)を消さないように注意。
|
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域(WRAMにある)を消さないように注意。
|
||||||
// WRAMリマップ後の消し漏れやバッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
|
// WRAMリマップ後の消し漏れやバッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
|
||||||
// [TODO:] DSPの使っているWRAMをどこからどこまで消すか?
|
|
||||||
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
|
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
|
||||||
{
|
{
|
||||||
// pre clear
|
// pre clear
|
||||||
@ -303,6 +290,8 @@ BOOL BOOT_WaitStart( void )
|
|||||||
#endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
|
#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 );
|
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 )
|
static void BOOTi_CheckTitleBlackList( void )
|
||||||
{
|
{
|
||||||
const TitleBlackList *pBlackList = &s_blackList[ 0 ];
|
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 ) {
|
while( pBlackList->rom_version >= 0 ) {
|
||||||
if( ( pBlackList->titleID == pROMH->titleID ) &&
|
if( ( pBlackList->titleID == pROMH->titleID ) &&
|
||||||
|
|||||||
@ -56,11 +56,11 @@ static void ie_subphandler( void )
|
|||||||
void BOOT_Ready( void )
|
void BOOT_Ready( void )
|
||||||
{
|
{
|
||||||
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
||||||
ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
ROM_Header *th = (ROM_Header *)SYSM_CARD_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
||||||
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
||||||
BOOL isNtrMode;
|
BOOL isNtrMode;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
|
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
|
||||||
// SYSMi_CheckEntryAddress();
|
// SYSMi_CheckEntryAddress();
|
||||||
|
|
||||||
@ -182,7 +182,7 @@ void BOOT_Ready( void )
|
|||||||
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
||||||
if ( target == REBOOT_TARGET_DS_APP )
|
if ( target == REBOOT_TARGET_DS_APP )
|
||||||
{
|
{
|
||||||
DS_InsertWLPatch();
|
DS_InsertWLPatch( dh );
|
||||||
}
|
}
|
||||||
|
|
||||||
// デバッガによるROMエミュレーション時はNTR-ROMヘッダバッファの
|
// デバッガによる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 );
|
OS_Boot( dh->s.main_entry_address, mem_list, target );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,6 +86,7 @@ static const u32 patch3_code[] = {
|
|||||||
|
|
||||||
// static variables-----------------------------------------------------
|
// static variables-----------------------------------------------------
|
||||||
static u32 mbSignBuf[MB_AUTHCODE_SIZE / sizeof(u32)] __attribute__ ((aligned(32)));
|
static u32 mbSignBuf[MB_AUTHCODE_SIZE / sizeof(u32)] __attribute__ ((aligned(32)));
|
||||||
|
static ROM_Header *dh; // DS互換ROMヘッダ
|
||||||
|
|
||||||
// function's description-----------------------------------------------
|
// 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バージョンがパッチ対象?
|
// SDKバージョンがパッチ対象?
|
||||||
if( DSi_IsPatchedSDKVersion() ) {
|
if( DSi_IsPatchedSDKVersion() ) {
|
||||||
// patch1, patch3をサーチ
|
// patch1, patch3をサーチ
|
||||||
@ -112,7 +115,7 @@ void DS_InsertWLPatch( void )
|
|||||||
}
|
}
|
||||||
// パッチ対象コードが見つかったら、パッチコードをセット。
|
// パッチ対象コードが見つかったら、パッチコードをセット。
|
||||||
if( patch_addr ) {
|
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()で事前に調査。
|
if( SYSMi_GetWork()->cloneBootMode == SYSM_CLONE_BOOT_MODE ) { // ※クローンブートかどうかはDS_CheckROMCloneBoot()で事前に調査。
|
||||||
// クローンブートならば、直パッチ
|
// クローンブートならば、直パッチ
|
||||||
SVC_CpuCopyFast( patchp, patch_addr, DS_WLPATCH_SIZE );
|
SVC_CpuCopyFast( patchp, patch_addr, DS_WLPATCH_SIZE );
|
||||||
@ -131,7 +134,6 @@ void DS_InsertWLPatch( void )
|
|||||||
// パッチベースアドレスの取得
|
// パッチベースアドレスの取得
|
||||||
static void* DSi_GetPatchBaseAddr( 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;
|
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 )
|
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;
|
u32 *tgtp;
|
||||||
int tgt_word_size;
|
int tgt_word_size;
|
||||||
|
|
||||||
@ -222,7 +223,6 @@ static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_o
|
|||||||
// パッチコードをシステムのRED予約領域にセット
|
// パッチコードをシステムのRED予約領域にセット
|
||||||
static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp )
|
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 *dstp = (u32 *)HW_RED_RESERVED;
|
||||||
u32 *srcp = (u32 *)&DSi_CopyWLPatch;
|
u32 *srcp = (u32 *)&DSi_CopyWLPatch;
|
||||||
int i;
|
int i;
|
||||||
@ -287,7 +287,6 @@ asm void DSi_CopyWLPatch( void )
|
|||||||
// クローンブート判定
|
// クローンブート判定
|
||||||
void DS_CheckROMCloneBoot( void )
|
void DS_CheckROMCloneBoot( void )
|
||||||
{
|
{
|
||||||
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
|
||||||
s32 lockCardID;
|
s32 lockCardID;
|
||||||
u8 *buffp = (u8 *)&mbSignBuf;
|
u8 *buffp = (u8 *)&mbSignBuf;
|
||||||
u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000;
|
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:カードなし」
|
// NITROカード存在チェック 「リターン 1:カード認識 0:カードなし」
|
||||||
static int DSi_ExistNitroCard(void)
|
static int DSi_ExistNitroCard(void)
|
||||||
{
|
{
|
||||||
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
|
|
||||||
if((dh->s.nintendo_logo_crc16 == 0xcf56)
|
if((dh->s.nintendo_logo_crc16 == 0xcf56)
|
||||||
&&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) {
|
&&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) {
|
||||||
return TRUE; // NITROカードあり(NintendoロゴCRC、カードヘッダCRCが正しい場合)
|
return TRUE; // NITROカードあり(NintendoロゴCRC、カードヘッダCRCが正しい場合)
|
||||||
|
|||||||
@ -105,7 +105,7 @@ void SYSMi_SetLauncherMountInfo( void )
|
|||||||
void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
|
void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
|
||||||
{
|
{
|
||||||
OSMountInfo mountListBuffer[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4);
|
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対応でない場合は、何もセットせずにリターン
|
// アプリがTWL対応でない場合は、何もセットせずにリターン
|
||||||
if( ( pROMH->platform_code ) == 0 ) {
|
if( ( pROMH->platform_code ) == 0 ) {
|
||||||
return;
|
return;
|
||||||
@ -225,8 +225,8 @@ static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId tit
|
|||||||
) {
|
) {
|
||||||
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
|
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
|
||||||
u32 saveDataSize[ 2 ];
|
u32 saveDataSize[ 2 ];
|
||||||
saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size;
|
saveDataSize[ 0 ] = (( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF)->private_save_data_size;
|
||||||
saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size;
|
saveDataSize[ 1 ] = (( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF)->public_save_data_size;
|
||||||
|
|
||||||
// セーブデータのファイルパスを取得
|
// セーブデータのファイルパスを取得
|
||||||
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );
|
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );
|
||||||
|
|||||||
@ -28,7 +28,7 @@ extern "C" {
|
|||||||
#define DS_WLPATCH_SIZE (5*4)
|
#define DS_WLPATCH_SIZE (5*4)
|
||||||
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
|
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
|
||||||
|
|
||||||
void DS_InsertWLPatch( void );
|
void DS_InsertWLPatch( void* romHeaderNTR );
|
||||||
void DS_CheckROMCloneBoot( void );
|
void DS_CheckROMCloneBoot( void );
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -140,6 +140,7 @@ typedef struct SYSM_work {
|
|||||||
u8 cloneBootMode;
|
u8 cloneBootMode;
|
||||||
|
|
||||||
CardReadParam cardReadParam; // カードリードパラメータ
|
CardReadParam cardReadParam; // カードリードパラメータ
|
||||||
|
u32 romHeaderNTR[HW_CARD_ROM_HEADER_SIZE/sizeof(u32)]; // NTR-ROMヘッダ一時バッファ
|
||||||
|
|
||||||
LauncherParam launcherParam;
|
LauncherParam launcherParam;
|
||||||
SYSMRomEmuInfo romEmuInfo;
|
SYSMRomEmuInfo romEmuInfo;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user