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:
nakasima 2008-06-05 02:21:06 +00:00
parent 9f245f47da
commit 9f862f9683
2 changed files with 88 additions and 65 deletions

View File

@ -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 )

View File

@ -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 );
}
}