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_ClearREG_RAM( void );
|
||||||
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
|
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
|
||||||
static void BOOTi_CheckTitleBlackList( ROM_Header_Short *pROMH );
|
static void BOOTi_CheckTitleBlackList( ROM_Header_Short *pROMH );
|
||||||
|
static void BOOTi_RebootCallback( void** entryp, void* mem_list, REBOOTTarget* target );
|
||||||
|
|
||||||
// global variables--------------------------------------------------
|
// global variables--------------------------------------------------
|
||||||
|
|
||||||
// static 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] =
|
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||||||
{
|
{
|
||||||
HW_MAIN_MEM_PARAMETER_BUF_END, SYSM_OWN_ARM7_MMEM_ADDR,
|
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 *th = (ROM_Header *)SYSM_APP_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
||||||
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
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;
|
BOOL isNtrMode;
|
||||||
|
|
||||||
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
||||||
@ -156,33 +196,11 @@ BOOL BOOT_WaitStart( void )
|
|||||||
|
|
||||||
// SDK共通リブート
|
// SDK共通リブート
|
||||||
{
|
{
|
||||||
REBOOTTarget target = REBOOT_TARGET_TWL_SYSTEM;
|
|
||||||
int list_count = PRE_CLEAR_NUM_MAX + 1;
|
int list_count = PRE_CLEAR_NUM_MAX + 1;
|
||||||
int l;
|
int l;
|
||||||
u32 *post_clear_list;
|
u32 *post_clear_list;
|
||||||
|
|
||||||
// [TODO] WRAM_0_1はちゃんと消えてる?blowfishやaes鍵を引き渡しているので心配
|
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||||
|
|
||||||
// メモリリストの設定
|
|
||||||
// [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,
|
|
||||||
};
|
|
||||||
|
|
||||||
// copy forwardリスト設定
|
// copy forwardリスト設定
|
||||||
// マウント情報
|
// マウント情報
|
||||||
@ -258,16 +276,16 @@ BOOL BOOT_WaitStart( void )
|
|||||||
{
|
{
|
||||||
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
|
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_TWL_SECURE;
|
*target = REBOOT_TARGET_TWL_SECURE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_TWL_SYSTEM;
|
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_TWL_APP;
|
*target = REBOOT_TARGET_TWL_APP;
|
||||||
}
|
}
|
||||||
#ifdef SYSMENU_DISABLE_TWL_BOOT
|
#ifdef SYSMENU_DISABLE_TWL_BOOT
|
||||||
while (1)
|
while (1)
|
||||||
@ -277,7 +295,7 @@ BOOL BOOT_WaitStart( void )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_DS_APP;
|
*target = REBOOT_TARGET_DS_APP;
|
||||||
}
|
}
|
||||||
|
|
||||||
// I2S停止(MCLKは動作継続)
|
// I2S停止(MCLKは動作継続)
|
||||||
@ -315,14 +333,7 @@ BOOL BOOT_WaitStart( void )
|
|||||||
OS_Terminate();
|
OS_Terminate();
|
||||||
}
|
}
|
||||||
#endif // FIRM_USE_PRODUCT_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
|
#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 )
|
static void BOOTi_ClearREG_RAM( void )
|
||||||
|
|||||||
@ -35,11 +35,31 @@
|
|||||||
|
|
||||||
// function's prototype----------------------------------------------
|
// function's prototype----------------------------------------------
|
||||||
static void BOOTi_ClearREG_RAM( void );
|
static void BOOTi_ClearREG_RAM( void );
|
||||||
|
static void BOOTi_RebootCallback( void** entryp, void* mem_list, REBOOTTarget* target );
|
||||||
|
|
||||||
// global variables--------------------------------------------------
|
// global variables--------------------------------------------------
|
||||||
|
|
||||||
// static 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--------------------------------------------------------
|
// const data--------------------------------------------------------
|
||||||
void BOOT_Init( void )
|
void BOOT_Init( void )
|
||||||
{
|
{
|
||||||
@ -52,20 +72,34 @@ static void ie_subphandler( void )
|
|||||||
OS_SetIrqCheckFlag( OS_IE_SUBP );
|
OS_SetIrqCheckFlag( OS_IE_SUBP );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ブート準備をして、ARM7からの通知を待つ。
|
|
||||||
void BOOT_Ready( void )
|
void BOOT_Ready( void )
|
||||||
{
|
{
|
||||||
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
// 最適化されるとポインタを初期化しただけでは何もコードは生成されません
|
||||||
ROM_Header *th = (ROM_Header *)SYSM_APP_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
ROM_Header *th = (ROM_Header *)SYSM_APP_ROM_HEADER_BUF; // TWL拡張ROMヘッダ(DSアプリには無い)
|
||||||
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
ROM_Header *dh = (ROM_Header *)(SYSMi_GetWork()->romHeaderNTR); // DS互換ROMヘッダ
|
||||||
BOOL isNtrMode;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// HOTSW終了処理待ち
|
// HOTSW終了処理待ち
|
||||||
while( ! HOTSW_isFinalized() ) {
|
while( ! HOTSW_isFinalized() ) {
|
||||||
OS_Sleep( 1 );
|
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();
|
// SYSMi_CheckEntryAddress();
|
||||||
|
|
||||||
@ -129,24 +163,7 @@ void BOOT_Ready( void )
|
|||||||
|
|
||||||
// SDK共通リブート
|
// SDK共通リブート
|
||||||
{
|
{
|
||||||
// メモリリストの設定
|
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||||
// [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;
|
|
||||||
|
|
||||||
// アプリケーション選択
|
// アプリケーション選択
|
||||||
if ( ! isNtrMode )
|
if ( ! isNtrMode )
|
||||||
@ -155,16 +172,16 @@ void BOOT_Ready( void )
|
|||||||
{
|
{
|
||||||
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
|
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_TWL_SECURE;
|
*target = REBOOT_TARGET_TWL_SECURE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_TWL_SYSTEM;
|
*target = REBOOT_TARGET_TWL_SYSTEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_TWL_APP;
|
*target = REBOOT_TARGET_TWL_APP;
|
||||||
}
|
}
|
||||||
#ifdef SYSMENU_DISABLE_TWL_BOOT
|
#ifdef SYSMENU_DISABLE_TWL_BOOT
|
||||||
OS_Terminate();
|
OS_Terminate();
|
||||||
@ -172,7 +189,7 @@ void BOOT_Ready( void )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target = REBOOT_TARGET_DS_APP;
|
*target = REBOOT_TARGET_DS_APP;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(FIRM_USE_PRODUCT_KEYS) || defined(SYSMENU_DISABLE_RETAIL_BOOT)
|
#if !defined(FIRM_USE_PRODUCT_KEYS) || defined(SYSMENU_DISABLE_RETAIL_BOOT)
|
||||||
@ -185,7 +202,7 @@ void BOOT_Ready( void )
|
|||||||
|
|
||||||
// USG以前のDSアプリには無線パッチを適用
|
// USG以前のDSアプリには無線パッチを適用
|
||||||
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
// (キャッシュ領域の排他制御簡略化のためARM9で行う)
|
||||||
if ( target == REBOOT_TARGET_DS_APP )
|
if ( *target == REBOOT_TARGET_DS_APP )
|
||||||
{
|
{
|
||||||
DS_InsertWLPatch( dh );
|
DS_InsertWLPatch( dh );
|
||||||
}
|
}
|
||||||
@ -199,11 +216,6 @@ void BOOT_Ready( void )
|
|||||||
OSFromFirmBuf* fromFirm = (void*)HW_FIRM_FROM_FIRM_BUF;
|
OSFromFirmBuf* fromFirm = (void*)HW_FIRM_FROM_FIRM_BUF;
|
||||||
MI_CpuClearFast(fromFirm, sizeof(OSFromFirmBuf));
|
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