diff --git a/build/libraries_sysmenu/sysmenu/ARM9/Makefile b/build/libraries_sysmenu/sysmenu/ARM9/Makefile index db3e0831..a6723c7c 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM9/Makefile @@ -50,6 +50,10 @@ ifdef DO_NOT_SHOW_LAUNCHER MACRO_FLAGS += -DDO_NOT_SHOW_LAUNCHER endif +ifndef LOAD_APP_VIA_PRIMAL_FS +MACRO_FLAGS += -DLOAD_APP_VIA_WRAM +endif + ifneq ($(DHT_TEST),) MACRO_FLAGS += -DDHT_TEST endif diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c b/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c index cf02074f..c12c3bfc 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c @@ -391,13 +391,19 @@ BOOL FS_ReadFileViaWram( FSFile *p_file, void *dst, s32 len, MIWramPos wram, s32 FSiWramWork.nums = MI_WRAM_ENUM_TO_SIZE( size ) * 1024 / FS_WRAM_SLOT_SIZE; // 必要に応じて7側にスイッチ可能なWRAMとして指定 - n = 1 << slot; - for(l=0;lARM9起動 result = FSi_ReadWram(dst, (u32)len, wram, slot, callback, arg); @@ -439,13 +445,19 @@ BOOL FS_WriteFileViaWram( FSFile *p_file, const void *src, s32 len, MIWramPos wr FSiWramWork.nums = MI_WRAM_ENUM_TO_SIZE( size ) * 1024 / FS_WRAM_SLOT_SIZE; // 必要に応じて7側にスイッチ可能なWRAMとして指定 - n = 1 << slot; - for(l=0;lWRAM起動 result = FSi_WriteWram(src, (u32)len, wram, slot, callback, arg); diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 4eb77ec3..aeaed99c 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -43,6 +43,9 @@ #define AUTH_KEY_BUFFER_LEN 128 #define MB_AUTH_SIGN_SIZE (128) /* digital sign size */ +#define WRAM_SLOT_FOR_FS 4 +#define WRAM_SIZE_FOR_FS MI_WRAM_SIZE_128KB + typedef struct MbAuthCode { char magic_code[2]; // マジックナンバー @@ -347,6 +350,11 @@ static s32 ReadFile(FSFile* pf, void* buffer, s32 size) // // ============================================================================ +static void SYSMi_CalcHashCallback(const void* addr, u32 len, void* arg) +{ + SVC_HMACSHA1Update( (SVCHMACSHA1Context *)arg, addr, len ); +} + static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ) { enum @@ -505,17 +513,19 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, } } - // [TODO:]新規Read関数の準備、とりあえずWRAMBをガメるつもりで実装 + // WRAM利用Read関数の準備、WRAMCの後半だけ解放しておく FS_InitWramTransfer(3); - MI_FreeWram_B( MI_WRAM_ARM7 ); - MI_FreeWram_B( MI_WRAM_ARM9 ); - MI_FreeWram_B( MI_WRAM_DSP ); - MI_CancelWram_B( MI_WRAM_ARM7 ); - MI_CancelWram_B( MI_WRAM_ARM9 ); - MI_CancelWram_B( MI_WRAM_DSP ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); for (i = region_header; i < region_max; ++i) { + SVCHMACSHA1Context ctx; + u8 calc_hash[SVC_SHA1_DIGEST_SIZE]; u32 len = MATH_ROUNDUP( length[i], SYSM_ALIGNMENT_LOAD_MODULE );// AES暗号化領域の関係で、ロードサイズは32バイトアライメントに補正 if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域 @@ -529,15 +539,20 @@ OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]); return; } +#ifdef LOAD_APP_VIA_WRAM +OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i); // [TODO:]ここで同時にハッシュ計算やAES処理もやってしまう予定 // 別スレッドで同じWRAM使おうとすると多分コケるので注意 - if ( !FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_B, 0, MI_WRAM_SIZE_128KB, NULL, NULL ) ) + SVC_HMACSHA1Init( &ctx, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1 ); + if ( !FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcHashCallback, &ctx ) ) { OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); FS_CloseFile(file); return; } -/* + SVC_HMACSHA1GetHash( &ctx, calc_hash ); +#else +OS_TPrintf("RebootSystem : Load VIA PRIMAL FS %d.\n", i); readLen = FS_ReadFile(file, (void *)destaddr[i], (s32)len); if( readLen < 0 ) @@ -546,14 +561,13 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); FS_CloseFile(file); return; } -*/ +#endif // LAUNCHER_READ_VIA_WRAM + } (void)FS_CloseFile(file); } - -OS_TPrintf("RebootSystem : Load Succeed.\n"); SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE; }