diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 9c82a4f3..4b5e32d6 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -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 ) diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index f9419e0b..2b237d8c 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -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 ); } }