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 ) {
|
||||
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
||||
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 ) &&
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@ -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が正しい場合)
|
||||
|
||||
@ -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 );
|
||||
|
||||
@ -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 );
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user