アプリロード関係の変更

・ビルドスイッチでアプリロード時のアルゴリズムを切り替えられるよう変更
  (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 MACRO_FLAGS += -DDO_NOT_SHOW_LAUNCHER
endif endif
ifndef LOAD_APP_VIA_PRIMAL_FS
MACRO_FLAGS += -DLOAD_APP_VIA_WRAM
endif
ifneq ($(DHT_TEST),) ifneq ($(DHT_TEST),)
MACRO_FLAGS += -DDHT_TEST MACRO_FLAGS += -DDHT_TEST
endif 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; FSiWramWork.nums = MI_WRAM_ENUM_TO_SIZE( size ) * 1024 / FS_WRAM_SLOT_SIZE;
// 必要に応じて7側にスイッチ可能なWRAMとして指定 // 必要に応じて7側にスイッチ可能なWRAMとして指定
n = 1 << slot; n = 0;
for(l=0;l<FSiWramWork.nums-1;l++) for(l=0;l<FSiWramWork.nums;l++)
{ {
n = n << 1; 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起動 // WRAM->ARM9起動
result = FSi_ReadWram(dst, (u32)len, wram, slot, callback, arg); 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; FSiWramWork.nums = MI_WRAM_ENUM_TO_SIZE( size ) * 1024 / FS_WRAM_SLOT_SIZE;
// 必要に応じて7側にスイッチ可能なWRAMとして指定 // 必要に応じて7側にスイッチ可能なWRAMとして指定
n = 1 << slot; n = 0;
for(l=0;l<FSiWramWork.nums-1;l++) for(l=0;l<FSiWramWork.nums;l++)
{ {
n = n << 1; 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起動 // ARM9->WRAM起動
result = FSi_WriteWram(src, (u32)len, wram, slot, callback, arg); result = FSi_WriteWram(src, (u32)len, wram, slot, callback, arg);

View File

@ -43,6 +43,9 @@
#define AUTH_KEY_BUFFER_LEN 128 #define AUTH_KEY_BUFFER_LEN 128
#define MB_AUTH_SIGN_SIZE (128) /* digital sign size */ #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 typedef struct MbAuthCode
{ {
char magic_code[2]; // マジックナンバー 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 ) static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
{ {
enum 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); FS_InitWramTransfer(3);
MI_FreeWram_B( MI_WRAM_ARM7 ); MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 );
MI_FreeWram_B( MI_WRAM_ARM9 ); MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 );
MI_FreeWram_B( MI_WRAM_DSP ); MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP );
MI_CancelWram_B( MI_WRAM_ARM7 ); MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 );
MI_CancelWram_B( MI_WRAM_ARM9 ); MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 );
MI_CancelWram_B( MI_WRAM_DSP ); MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP );
for (i = region_header; i < region_max; ++i) 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バイトアライメントに補正 u32 len = MATH_ROUNDUP( length[i], SYSM_ALIGNMENT_LOAD_MODULE );// AES暗号化領域の関係で、ロードサイズは32バイトアライメントに補正
if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域 if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域
@ -529,15 +539,20 @@ OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]);
return; return;
} }
#ifdef LOAD_APP_VIA_WRAM
OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i);
// [TODO:]ここで同時にハッシュ計算やAES処理もやってしまう予定 // [TODO:]ここで同時にハッシュ計算やAES処理もやってしまう予定
// 別スレッドで同じWRAM使おうとすると多分コケるので注意 // 別スレッドで同じ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); OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file); FS_CloseFile(file);
return; 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); readLen = FS_ReadFile(file, (void *)destaddr[i], (s32)len);
if( readLen < 0 ) if( readLen < 0 )
@ -546,14 +561,13 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file); FS_CloseFile(file);
return; return;
} }
*/ #endif // LAUNCHER_READ_VIA_WRAM
} }
(void)FS_CloseFile(file); (void)FS_CloseFile(file);
} }
OS_TPrintf("RebootSystem : Load Succeed.\n");
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
} }