REBOOTコアコードとコアスタック間の隙間をクリア。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@966 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-03-26 11:07:43 +00:00
parent 44bc866851
commit a2d0a36d99
2 changed files with 16 additions and 18 deletions

View File

@ -34,15 +34,13 @@
#define MAINP_SEND_IF 0x2000 #define MAINP_SEND_IF 0x2000
#define reg_MI_MC_SWP (*(REGType8v *) ( REG_MC1_ADDR + 1 ) ) #define reg_MI_MC_SWP (*(REGType8v *) ( REG_MC1_ADDR + 1 ) )
#ifdef ISDBG_MB_CHILD_ #define PRE_CLEAR_NUM_MAX (5*2)
#define PRE_CLEAR_NUM_MAX (6*2)
#else
#define PRE_CLEAR_NUM_MAX (4*2)
#endif
#define COPY_NUM_MAX (5*3) #define COPY_NUM_MAX (5*3)
#define POST_CLEAR_NUM_MAX (12 + 4*2) #define POST_CLEAR_NUM_MAX (12 + 4*2)
#define CLRLIST_OWN_ARM7_WRAM_SIZE_IDX 1
#define CLRLIST_REBOOT_STACK_PAD_SIZE_IDX (2*3+1)
// extern data------------------------------------------------------- // extern data-------------------------------------------------------
// function's prototype---------------------------------------------- // function's prototype----------------------------------------------
@ -104,9 +102,11 @@ void BOOT_Init( void )
BOOL BOOT_WaitStart( void ) BOOL BOOT_WaitStart( void )
{ {
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) { if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
ROM_Header *th; // TWL拡張ROMヘッダDSアプリには無い // 最適化されるとポインタを初期化しただけでは何もコードは生成されません
ROM_Header *dh; // DS互換ROMヘッダ ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
BOOL isNtrMode; BOOL isNtrMode;
// ヘッダ情報再配置 // ヘッダ情報再配置
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL ) if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL )
{ {
@ -121,8 +121,6 @@ BOOL BOOT_WaitStart( void )
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_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 ); MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
} }
th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。 (void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。 (void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
@ -218,7 +216,8 @@ BOOL BOOT_WaitStart( void )
SYSM_OWN_ARM7_WRAM_ADDR, NULL, // SYSM_OWN_ARM7_WRAM_ADDRSDK_AUTOLOAD_WRAM_STARTはリンカから与えられるので定数でない SYSM_OWN_ARM7_WRAM_ADDR, NULL, // SYSM_OWN_ARM7_WRAM_ADDRSDK_AUTOLOAD_WRAM_STARTはリンカから与えられるので定数でない
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR, 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, SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
HW_WRAM_BASE, HW_WRAM_SIZE, // 共有WRAM  Launcherの特殊配置なので、BASEからサイズぶん OS_BOOT_CODE_BUF_END, 1, // REBOOTコアコードとスタックの隙間サイズはメモリリスト完成後に差し替えるNULLではREBOOT_GetCoreStackSizeが失敗する
HW_WRAM_BASE, HW_WRAM_SIZE, // 共有WRAM  Launcherの特殊配置なので、BASEからサイズぶん
NULL, NULL,
// copy forward // copy forward
NULL, NULL,
@ -228,7 +227,7 @@ BOOL BOOT_WaitStart( void )
NULL, NULL,
}; };
mem_list[1] = SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR; mem_list[CLRLIST_OWN_ARM7_WRAM_SIZE_IDX] = SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR;
// copy forwardリスト設定 // copy forwardリスト設定
mem_list[list_count++] = SYSM_TWL_MOUNT_INFO_TMP_BUFFER; mem_list[list_count++] = SYSM_TWL_MOUNT_INFO_TMP_BUFFER;
@ -275,6 +274,8 @@ BOOL BOOT_WaitStart( void )
mem_list[list_count++] = post_clear_list[l+1] - post_clear_list[l]; mem_list[list_count++] = post_clear_list[l+1] - post_clear_list[l];
} }
mem_list[list_count] = NULL; mem_list[list_count] = NULL;
// REBOOTコアコードとスタックの隙間サイズを算出
mem_list[CLRLIST_REBOOT_STACK_PAD_SIZE_IDX] = OS_BOOT_STACK_TOP - REBOOT_GetCoreStackSize(mem_list) - OS_BOOT_CODE_BUF_END;
// サウンド停止 // サウンド停止
SND_Shutdown(); SND_Shutdown();

View File

@ -59,8 +59,9 @@ static void ie_subphandler( void )
// ブート準備をして、ARM7からの通知を待つ。 // ブート準備をして、ARM7からの通知を待つ。
void BOOT_Ready( void ) void BOOT_Ready( void )
{ {
ROM_Header *th; // TWL拡張ROMヘッダDSアプリには無い // 最適化されるとポインタを初期化しただけでは何もコードは生成されません
ROM_Header *dh; // DS互換ROMヘッダ ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
BOOL isNtrMode; BOOL isNtrMode;
int i; int i;
@ -85,10 +86,6 @@ void BOOT_Ready( void )
// ※もうFIFOはクリア済みなので、使わない。 // ※もうFIFOはクリア済みなので、使わない。
// ARM7からの通知待ち // ARM7からの通知待ち
OS_WaitIrq( 1, OS_IE_SUBP ); OS_WaitIrq( 1, OS_IE_SUBP );
// 同期後にヘッダ取得
th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL拡張ROMヘッダDSアプリには無い
dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ
OS_TPrintf( "INTR SUBP passed!!\n" ); OS_TPrintf( "INTR SUBP passed!!\n" );
// 割り込みをクリアして最終ブートシーケンスへ。 // 割り込みをクリアして最終ブートシーケンスへ。