mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
REBOOTでのPM_Exitコールバックを有効化。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1577 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
9f245f47da
commit
9f862f9683
@ -55,11 +55,36 @@ typedef struct TitleBlackList {
|
||||
static void BOOTi_ClearREG_RAM( void );
|
||||
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
|
||||
static void BOOTi_CheckTitleBlackList( ROM_Header_Short *pROMH );
|
||||
static void BOOTi_RebootCallback( void** entryp, void* mem_list, REBOOTTarget* target );
|
||||
|
||||
// global variables--------------------------------------------------
|
||||
|
||||
// static variables--------------------------------------------------
|
||||
|
||||
static volatile REBOOTTarget target;
|
||||
|
||||
// メモリリスト
|
||||
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域(WRAMにある)を消さないように注意。
|
||||
// WRAMリマップ後の消し漏れやバッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
|
||||
// [TODO] WRAM_0_1はちゃんと消えてる?blowfishやaes鍵を引き渡しているので心配
|
||||
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + COPY_HEADER_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
// pre clear
|
||||
HW_WRAM_B_OR_C_MIRROR, SYSM_OWN_ARM7_WRAM_ADDR_END - HW_WRAM_B_OR_C_MIRROR, // SYSM_OWN_ARM7_WRAM_ADDRとHW_WRAM_Bをまとめてクリア
|
||||
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
|
||||
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
|
||||
OS_BOOT_CODE_BUF_END, 1, // REBOOTコアコードとスタックの隙間サイズはメモリリスト完成後に差し替える(NULLではREBOOT_GetCoreStackSizeが失敗する)
|
||||
HW_WRAM_BASE, HW_WRAM_SIZE, // 共有WRAM Launcherの特殊配置なので、BASEからサイズぶん
|
||||
HW_WRAM_C, HW_WRAM_C_SIZE,
|
||||
NULL,
|
||||
// copy forward
|
||||
NULL,
|
||||
// copy backward
|
||||
NULL,
|
||||
// post clear
|
||||
NULL,
|
||||
};
|
||||
|
||||
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
HW_MAIN_MEM_PARAMETER_BUF_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
||||
@ -103,6 +128,21 @@ BOOL BOOT_WaitStart( void )
|
||||
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
||||
ROM_Header *th = (ROM_Header *)SYSM_APP_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
||||
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
||||
// リブート
|
||||
REBOOTi_SetTwlRomHeaderAddr( th );
|
||||
REBOOTi_SetRomHeaderAddr( dh );
|
||||
REBOOTi_SetPostFinalizeCallback( BOOTi_RebootCallback );
|
||||
OS_Boot( OS_BOOT_ENTRY_FROM_ROMHEADER, mem_list, target );
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* target )
|
||||
{
|
||||
#pragma unused(entryp)
|
||||
u32* mem_list = mem_list_v;
|
||||
ROM_Header *th = (void*)REBOOTi_GetTwlRomHeaderAddr();
|
||||
ROM_Header *dh = (void*)REBOOTi_GetRomHeaderAddr();
|
||||
BOOL isNtrMode;
|
||||
|
||||
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
||||
@ -156,33 +196,11 @@ BOOL BOOT_WaitStart( void )
|
||||
|
||||
// SDK共通リブート
|
||||
{
|
||||
REBOOTTarget target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
int list_count = PRE_CLEAR_NUM_MAX + 1;
|
||||
int l;
|
||||
u32 *post_clear_list;
|
||||
|
||||
// [TODO] WRAM_0_1はちゃんと消えてる?blowfishやaes鍵を引き渡しているので心配
|
||||
|
||||
// メモリリストの設定
|
||||
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域(WRAMにある)を消さないように注意。
|
||||
// WRAMリマップ後の消し漏れやバッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
|
||||
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + COPY_HEADER_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
|
||||
{
|
||||
// pre clear
|
||||
HW_WRAM_B_OR_C_MIRROR, SYSM_OWN_ARM7_WRAM_ADDR_END - HW_WRAM_B_OR_C_MIRROR, // SYSM_OWN_ARM7_WRAM_ADDRとHW_WRAM_Bをまとめてクリア
|
||||
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
|
||||
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
|
||||
OS_BOOT_CODE_BUF_END, 1, // REBOOTコアコードとスタックの隙間サイズはメモリリスト完成後に差し替える(NULLではREBOOT_GetCoreStackSizeが失敗する)
|
||||
HW_WRAM_BASE, HW_WRAM_SIZE, // 共有WRAM Launcherの特殊配置なので、BASEからサイズぶん
|
||||
HW_WRAM_C, HW_WRAM_C_SIZE,
|
||||
NULL,
|
||||
// copy forward
|
||||
NULL,
|
||||
// copy backward
|
||||
NULL,
|
||||
// post clear
|
||||
NULL,
|
||||
};
|
||||
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
|
||||
// copy forwardリスト設定
|
||||
// マウント情報
|
||||
@ -258,16 +276,16 @@ BOOL BOOT_WaitStart( void )
|
||||
{
|
||||
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
|
||||
{
|
||||
target = REBOOT_TARGET_TWL_SECURE;
|
||||
*target = REBOOT_TARGET_TWL_SECURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
target = REBOOT_TARGET_TWL_APP;
|
||||
*target = REBOOT_TARGET_TWL_APP;
|
||||
}
|
||||
#ifdef SYSMENU_DISABLE_TWL_BOOT
|
||||
while (1)
|
||||
@ -277,7 +295,7 @@ BOOL BOOT_WaitStart( void )
|
||||
}
|
||||
else
|
||||
{
|
||||
target = REBOOT_TARGET_DS_APP;
|
||||
*target = REBOOT_TARGET_DS_APP;
|
||||
}
|
||||
|
||||
// I2S停止(MCLKは動作継続)
|
||||
@ -315,14 +333,7 @@ BOOL BOOT_WaitStart( void )
|
||||
OS_Terminate();
|
||||
}
|
||||
#endif // FIRM_USE_PRODUCT_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
|
||||
|
||||
// リブート
|
||||
REBOOTi_SetTwlRomHeaderAddr( th );
|
||||
REBOOTi_SetRomHeaderAddr( dh );
|
||||
OS_Boot( dh->s.sub_entry_address, mem_list, target );
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void BOOTi_ClearREG_RAM( void )
|
||||
|
||||
@ -35,11 +35,31 @@
|
||||
|
||||
// function's prototype----------------------------------------------
|
||||
static void BOOTi_ClearREG_RAM( void );
|
||||
static void BOOTi_RebootCallback( void** entryp, void* mem_list, REBOOTTarget* target );
|
||||
|
||||
// global variables--------------------------------------------------
|
||||
|
||||
// static variables--------------------------------------------------
|
||||
|
||||
static REBOOTTarget target;
|
||||
|
||||
// メモリリスト
|
||||
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域(ITCMにある)を消さないように注意。
|
||||
// バッファオーバランのリスク回避のため不要な鍵はpre clearで消す。
|
||||
static u32 mem_list[] =
|
||||
{
|
||||
// pre clear
|
||||
HW_ITCM, HW_ITCM_SIZE,
|
||||
//HW_DTCM, HW_DTCM_SIZE,
|
||||
NULL,
|
||||
// copy forward
|
||||
NULL,
|
||||
// copy backward
|
||||
NULL,
|
||||
// post clear
|
||||
NULL,
|
||||
};
|
||||
|
||||
// const data--------------------------------------------------------
|
||||
void BOOT_Init( void )
|
||||
{
|
||||
@ -52,20 +72,34 @@ static void ie_subphandler( void )
|
||||
OS_SetIrqCheckFlag( OS_IE_SUBP );
|
||||
}
|
||||
|
||||
// ブート準備をして、ARM7からの通知を待つ。
|
||||
void BOOT_Ready( void )
|
||||
{
|
||||
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
||||
ROM_Header *th = (ROM_Header *)SYSM_APP_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
||||
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
||||
BOOL isNtrMode;
|
||||
int i;
|
||||
|
||||
// HOTSW終了処理待ち
|
||||
while( ! HOTSW_isFinalized() ) {
|
||||
OS_Sleep( 1 );
|
||||
}
|
||||
|
||||
// リブート
|
||||
REBOOTi_SetTwlRomHeaderAddr( th );
|
||||
REBOOTi_SetRomHeaderAddr( dh );
|
||||
REBOOTi_SetPostFinalizeCallback( BOOTi_RebootCallback );
|
||||
OS_Boot( OS_BOOT_ENTRY_FROM_ROMHEADER, mem_list, target );
|
||||
}
|
||||
|
||||
// ブート準備をして、ARM7からの通知を待つ。
|
||||
static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* target )
|
||||
{
|
||||
#pragma unused(entryp)
|
||||
u32* mem_list = mem_list_v;
|
||||
ROM_Header *th = (void*)REBOOTi_GetTwlRomHeaderAddr();
|
||||
ROM_Header *dh = (void*)REBOOTi_GetRomHeaderAddr();
|
||||
BOOL isNtrMode;
|
||||
int i;
|
||||
|
||||
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
|
||||
// SYSMi_CheckEntryAddress();
|
||||
|
||||
@ -129,24 +163,7 @@ void BOOT_Ready( void )
|
||||
|
||||
// SDK共通リブート
|
||||
{
|
||||
// メモリリストの設定
|
||||
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域(ITCMにある)を消さないように注意。
|
||||
// バッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
|
||||
static u32 mem_list[] =
|
||||
{
|
||||
// pre clear
|
||||
HW_ITCM, HW_ITCM_SIZE,
|
||||
//HW_DTCM, HW_DTCM_SIZE,
|
||||
NULL,
|
||||
// copy forward
|
||||
NULL,
|
||||
// copy backward
|
||||
NULL,
|
||||
// post clear
|
||||
NULL,
|
||||
};
|
||||
|
||||
REBOOTTarget target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
|
||||
// アプリケーション選択
|
||||
if ( ! isNtrMode )
|
||||
@ -155,16 +172,16 @@ void BOOT_Ready( void )
|
||||
{
|
||||
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
|
||||
{
|
||||
target = REBOOT_TARGET_TWL_SECURE;
|
||||
*target = REBOOT_TARGET_TWL_SECURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
target = REBOOT_TARGET_TWL_APP;
|
||||
*target = REBOOT_TARGET_TWL_APP;
|
||||
}
|
||||
#ifdef SYSMENU_DISABLE_TWL_BOOT
|
||||
OS_Terminate();
|
||||
@ -172,7 +189,7 @@ void BOOT_Ready( void )
|
||||
}
|
||||
else
|
||||
{
|
||||
target = REBOOT_TARGET_DS_APP;
|
||||
*target = REBOOT_TARGET_DS_APP;
|
||||
}
|
||||
|
||||
#if !defined(FIRM_USE_PRODUCT_KEYS) || defined(SYSMENU_DISABLE_RETAIL_BOOT)
|
||||
@ -185,7 +202,7 @@ void BOOT_Ready( void )
|
||||
|
||||
// USG以前のDSアプリには無線パッチを適用
|
||||
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
||||
if ( target == REBOOT_TARGET_DS_APP )
|
||||
if ( *target == REBOOT_TARGET_DS_APP )
|
||||
{
|
||||
DS_InsertWLPatch( dh );
|
||||
}
|
||||
@ -199,11 +216,6 @@ void BOOT_Ready( void )
|
||||
OSFromFirmBuf* fromFirm = (void*)HW_FIRM_FROM_FIRM_BUF;
|
||||
MI_CpuClearFast(fromFirm, sizeof(OSFromFirmBuf));
|
||||
}
|
||||
|
||||
// 起動するターゲットの種類を指定する必要あり
|
||||
REBOOTi_SetTwlRomHeaderAddr( th );
|
||||
REBOOTi_SetRomHeaderAddr( dh );
|
||||
OS_Boot( dh->s.main_entry_address, mem_list, target );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user