アプリロード関係の変更

・ビルドスイッチでアプリロード時のアルゴリズムを切り替えられるよう変更
  (LOAD_APP_VIA_PRIMAL_FS定義で普通のReadを使用)
 ・WRAM経由READでWRAMCの後半を使うように変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1170 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-04-17 06:08:43 +00:00
parent 59658b9740
commit b93e15429f
3 changed files with 50 additions and 20 deletions

View File

@ -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

View File

@ -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;l<FSiWramWork.nums-1;l++)
n = 0;
for(l=0;l<FSiWramWork.nums;l++)
{
n = n << 1;
n += 1;
n += (1 << slot);
}
if( wram == MI_WRAM_B )
{
FSi_SetSwitchableWramSlots(n,0);
}else if ( wram == MI_WRAM_C )
{
FSi_SetSwitchableWramSlots(0,n);
}
FSi_SetSwitchableWramSlots(n,0);
// WRAM->ARM9起動
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;l<FSiWramWork.nums-1;l++)
n = 0;
for(l=0;l<FSiWramWork.nums;l++)
{
n = n << 1;
n += 1;
n += (1 << slot);
}
if( wram == MI_WRAM_B )
{
FSi_SetSwitchableWramSlots(n,0);
}else if ( wram == MI_WRAM_C )
{
FSi_SetSwitchableWramSlots(0,n);
}
FSi_SetSwitchableWramSlots(n,0);
// ARM9->WRAM起動
result = FSi_WriteWram(src, (u32)len, wram, slot, callback, arg);

View File

@ -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;
}