diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index d54f3e0b..b0ada1da 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -61,6 +61,11 @@ void BOOT_Ready( void ) BOOL isNtrMode; int i; + // HOTSW終了処理待ち + while( ! HOTSW_isFinalized() ) { + OS_Sleep( 1 ); + } + // エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。 // SYSMi_CheckEntryAddress(); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index db5ac3d3..5c5ed835 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -1908,7 +1908,7 @@ static void FinalizeHotSw(HotSwApliType type) if(type == HOTSW_APLITYPE_CARD){ ClearUnnecessaryCardRegister(); - return; + goto final; } isCardExist = HOTSW_IsCardExist(); @@ -1918,7 +1918,7 @@ static void FinalizeHotSw(HotSwApliType type) // カードがなかったら、レジスタクリアしてリターン if(!isCardExist){ ClearAllCardRegister(); - return; + goto final; } switch(type){ @@ -1932,7 +1932,7 @@ static void FinalizeHotSw(HotSwApliType type) OS_PutString("Failed To Change Game Mode... Card Slot Power Off\n"); - return; + goto final; } break; @@ -1944,7 +1944,8 @@ static void FinalizeHotSw(HotSwApliType type) OS_Sleep(1); } - if(s_cbData.pBootSegBuf->rh.s.game_card_on){ + // NANDアプリヘッダはコピー済み + if(((ROM_Header*)SYSM_CARD_ROM_HEADER_BUF)->s.game_card_on){ McPowerOn(); s_cbData.modeType = HOTSW_MODE2; @@ -1967,6 +1968,10 @@ static void FinalizeHotSw(HotSwApliType type) // 必要なレジスタ以外クリア ClearUnnecessaryCardRegister(); + +final: + // 終了完了通知 + SYSMi_GetWork()->flags.hotsw.isFinalized = TRUE; } diff --git a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c index ac9dbf40..5cb98dc4 100644 --- a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c +++ b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c @@ -117,6 +117,17 @@ void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType ) } +/*---------------------------------------------------------------------------* + Name: HOTSW_isFinalized + + Description: 終了処理が完了したかを返す + *---------------------------------------------------------------------------*/ +BOOL HOTSW_isFinalized(void) +{ + return SYSMi_GetWork()->flags.hotsw.isFinalized; +} + + /*---------------------------------------------------------------------------* Name: HOTSW_isEnableHotSW @@ -124,7 +135,7 @@ void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType ) *---------------------------------------------------------------------------*/ BOOL HOTSW_isEnableHotSW(void) { - return SYSMi_GetWork()->flags.hotsw.isEnableHotSW ? TRUE : FALSE; + return SYSMi_GetWork()->flags.hotsw.isEnableHotSW; } @@ -135,7 +146,7 @@ BOOL HOTSW_isEnableHotSW(void) *---------------------------------------------------------------------------*/ BOOL HOTSW_isCardLoadCompleted(void) { - return SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted ? TRUE : FALSE; + return SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted; } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 41e47142..d8721bdb 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -401,6 +401,8 @@ static void SYSMi_FinalizeHotSWAsync( TitleProperty *pBootTitle, ROM_Header *hea { HotSwApliType hotsw_type; + DC_StoreRange( head, sizeof(ROM_Header) ); + switch( pBootTitle->flags.bootType ) { case LAUNCHER_BOOTTYPE_NAND: @@ -692,10 +694,10 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); { // ヘッダ読み込み完了フラグを立てる SYSMi_GetWork()->flags.common.isHeaderLoadCompleted = TRUE; - // WRAM経由ロードの場合はAES初期化 - (void)SYSM_InitDecryptAESRegion_W( (ROM_Header_Short *)destaddr[region_header] ); // HOTSW終了処理有効化 SYSMi_FinalizeHotSWAsync( pBootTitle, head ); + // WRAM経由ロードの場合はAES初期化 + (void)SYSM_InitDecryptAESRegion_W( (ROM_Header_Short *)destaddr[region_header] ); } } diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index c7819f4f..ab6cca51 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -107,6 +107,9 @@ BOOL HOTSW_isEnableHotSW(void); // カードアプリのロードが完了しているかを返す BOOL HOTSW_isCardLoadCompleted(void); +// 終了処理が完了したかを返す +BOOL HOTSW_isFinalized(void); + #ifdef USE_WRAM_LOAD // 活栓挿抜処理の初期化 void HOTSW_Init(); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index b16336c4..6dc7c7b3 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -124,6 +124,7 @@ typedef struct SYSM_work { vu16 isValidCardBanner :1; // バナーデータ更新? vu16 is1stCardChecked :1; // カードデータの1stチェック完了? vu16 isCardGameMode :1; // カードがゲームモードに遷移したか? + vu16 isFinalized :1; // HOTSW終了処理完了 vu16 :0; vu8 isCardStateChanged; // カード状態更新フラグ }hotsw;