diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 4c85733c..9b6c01f1 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -244,6 +244,8 @@ TwlSpMain(void) // RTCのリセットチェック static void ResetRTC( void ) { + SYSM_work* sw = SYSMi_GetWork(); + // ランチャーでリセットを検出するためにこの処理をしているが、RTC_Init内でも同じことをしているので、ちょっと無駄。 RTCRawStatus1 stat1; RTCRawStatus2 stat2; @@ -261,8 +263,11 @@ static void ResetRTC( void ) fout.fout = RTC_FOUT_DUTY_32KHZ; RTC_WriteFout(&fout); } - SYSMi_GetWork()->flags.common.isResetRTC = TRUE; + sw->flags.common.isResetRTC = TRUE; } + + // RTC初回データ読み込み + RTC_ReadDateTime(&sw->Rtc1stData); } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 251e7bde..054907e0 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -190,6 +190,8 @@ CardThreadData HotSwThreadData; *---------------------------------------------------------------------------*/ void HOTSW_Init(u32 threadPrio) { + SYSM_work* sw = SYSMi_GetWork(); + OS_InitTick(); OS_InitThread(); @@ -287,7 +289,7 @@ void HOTSW_Init(u32 threadPrio) HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; } else{ - SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; + sw->flags.hotsw.is1stCardChecked = TRUE; } } @@ -1040,14 +1042,15 @@ void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) *---------------------------------------------------------------------------*/ static void GenVA_VB_VD(void) { + SYSM_work* sw = SYSMi_GetWork(); u32 dummy = 0; - MATHRandContext32 rnd; - - // 乱数を初期化 VBlankカウンタ値を種とする。 - // [TODO] プログラムがV周期に同期しているためVカウンタでは固定値になりやすい - // (特にダイレクトブート)。 - // 起動する度に変化するパラメータと組み合わせるべき。 - MATH_InitRand32(&rnd, (u64)OS_GetVBlankCount()); + MATHRandContext32 rnd; + + // 乱数を初期化 + // チック&RTC初回ロード値を種とする。 + // (起動する度に変化するパラメータと組み合わせる。 + // Vカウンタは2130サイクル変化しないので固定値になりやすい。) + MATH_InitRand32(&rnd, OS_GetTick() ^ sw->Rtc1stData.words[0] ^ sw->Rtc1stData.words[1]); s_cbData.vae = MATH_Rand32(&rnd, 0); s_cbData.vbi = MATH_Rand32(&rnd, 0); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index e35d2433..6f3514e4 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -119,6 +119,7 @@ typedef struct SYSM_work { LauncherParam launcherParam; SYSMRomEmuInfo romEmuInfo; + RTCRawData Rtc1stData; // RTC初回ロード値 8byte BOOL isDeveloperAESMode; // 開発用セキュリティか?(製品版でFALSE) void *addr_AESregion[2]; // AES暗号化領域の格納アドレス