mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
SCFG_Initを呼ぶようにした、
ランチャーのタイトルIDをHWSecureInfoから取得するようにした(失敗するとLNCRでリトライ)、 プロファイル周りの修正 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@519 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
4a3fc13fca
commit
256dd85977
@ -154,26 +154,28 @@ void TwlSpMain( void )
|
||||
{
|
||||
int fd; // menu file descriptor
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 0: bootrom
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
InitDebugLED();
|
||||
SetDebugLED(++step); // 0x81
|
||||
|
||||
PreInit();
|
||||
|
||||
// 0: before PXI
|
||||
// 1: after PreInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x82
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
OS_EnableInterrupts();
|
||||
|
||||
// 1: after PXI
|
||||
// 2: after OS_InitFIRM
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x83
|
||||
|
||||
PostInit();
|
||||
|
||||
// 2: after PM_InitFIRM
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x84
|
||||
|
||||
@ -185,8 +187,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FATFS_Init().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 3: after FS_Init
|
||||
// 4: after FATFS_Init
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x85
|
||||
|
||||
@ -197,8 +198,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 4: after PXI
|
||||
// 5: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x86
|
||||
|
||||
@ -209,8 +209,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_OpenSrl().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 5: after FS_OpenSrl
|
||||
// 6: after FS_OpenSrl
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x87
|
||||
|
||||
@ -221,8 +220,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 6: after FS_LoadHeader
|
||||
// 7: after FS_LoadHeader
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x88
|
||||
|
||||
@ -233,8 +231,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 7: after PXI
|
||||
// 8: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x89
|
||||
|
||||
@ -242,8 +239,7 @@ void TwlSpMain( void )
|
||||
|
||||
AESi_InitKeysFIRM();
|
||||
AESi_RecvSeed( rh->s.developer_encrypt );
|
||||
|
||||
// 8: after AESi_RecvSeed
|
||||
// 9: after AESi_RecvSeed
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8a
|
||||
|
||||
@ -254,8 +250,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 9: after FS_LoadStatic
|
||||
// 10: after FS_LoadStatic
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8b
|
||||
|
||||
@ -266,9 +261,9 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 10: after PXI
|
||||
// 11: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -207,10 +207,16 @@ static void EraseAll(void)
|
||||
|
||||
void TwlMain( void )
|
||||
{
|
||||
PreInit();
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 0: bootrom
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
// 0: before PXI
|
||||
PUSH_PROFILE();
|
||||
PreInit();
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 1: before OS_InitFIRM
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
@ -219,22 +225,19 @@ void TwlMain( void )
|
||||
#ifdef PROFILE_ENABLE
|
||||
OS_InitTick();
|
||||
#endif
|
||||
// 1: after PXI
|
||||
// 2: after OS_InitTick
|
||||
PUSH_PROFILE();
|
||||
|
||||
PostInit();
|
||||
|
||||
// 2: after PostInit
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
|
||||
STD_CopyString((char*)HW_TWL_FS_BOOT_SRL_PATH_BUF, MENU_FILE);
|
||||
|
||||
// 3: after FS_ResolveSrl
|
||||
// 4: after STD_CopyString
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_SET_PATH );
|
||||
|
||||
// 4: after PXI
|
||||
// 5: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() )
|
||||
@ -242,19 +245,16 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 5: after FS_LoadHeader
|
||||
// 6: after FS_LoadHeader
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
|
||||
|
||||
// 6: after PXI
|
||||
// 7: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
AESi_SendSeed( FS_GetAesKeySeed() );
|
||||
FS_DeleteAesKeySeed();
|
||||
|
||||
// 7: after AESi_SendSeed
|
||||
// 8: after AESi_SendSeed
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadStatic() )
|
||||
@ -262,14 +262,13 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 8: after FS_LoadStatic
|
||||
// 9: after FS_LoadStatic
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
|
||||
|
||||
// 9: after PXI
|
||||
// 10: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -91,6 +91,14 @@ void OS_InitFIRM(void)
|
||||
//---- Init Card
|
||||
#ifndef SDK_SMALL_BUILD
|
||||
// CARD_Init();
|
||||
#endif
|
||||
|
||||
//---- init System config
|
||||
#ifdef SDK_TWL
|
||||
// if (OS_IsRunOnTwl() == TRUE)
|
||||
// {
|
||||
SCFG_Init();
|
||||
// }
|
||||
#endif
|
||||
|
||||
//---- Init Power Manager
|
||||
@ -142,6 +150,14 @@ void OS_InitFIRM(void)
|
||||
//---- Init Cartridge
|
||||
#ifndef SDK_TEG
|
||||
// CTRDG_Init();
|
||||
#endif
|
||||
|
||||
//---- init System config
|
||||
#ifdef SDK_TWL
|
||||
// if (OS_IsRunOnTwl() == TRUE)
|
||||
// {
|
||||
SCFG_Init();
|
||||
// }
|
||||
#endif
|
||||
|
||||
#endif // SDK_ARM9
|
||||
|
||||
@ -162,22 +162,19 @@ void TwlSpMain( void )
|
||||
SetDebugLED(++step); // 0x81
|
||||
|
||||
PreInit();
|
||||
|
||||
// 1: before PXI
|
||||
// 1: after PreInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x82
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
OS_EnableInterrupts();
|
||||
|
||||
// 2: after PXI
|
||||
// 2: after OS_InitFIRM
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x83
|
||||
|
||||
PostInit();
|
||||
|
||||
// 3: after PM_InitFIRM
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x84
|
||||
|
||||
@ -189,8 +186,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FATFS_Init().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 4: after FS_Init
|
||||
// 4: after FATFS_Init
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x85
|
||||
|
||||
@ -201,7 +197,6 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 5: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x86
|
||||
@ -213,7 +208,6 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_OpenSrl().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 6: after FS_OpenSrl
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x87
|
||||
@ -225,7 +219,6 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 7: after FS_LoadHeader
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x88
|
||||
@ -237,7 +230,6 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 8: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x89
|
||||
@ -246,7 +238,6 @@ void TwlSpMain( void )
|
||||
|
||||
AESi_InitKeysFIRM();
|
||||
AESi_RecvSeed( rh->s.developer_encrypt );
|
||||
|
||||
// 9: after AESi_RecvSeed
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8a
|
||||
@ -258,7 +249,6 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 10: after FS_LoadStatic
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8b
|
||||
@ -270,9 +260,9 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 11: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -47,6 +47,7 @@ LLIBRARIES += libes.TWL$(ARCHGEN_TYPE).a libboc.TWL$(ARCHGEN_TYPE).a
|
||||
else
|
||||
LLIBRARIES += ../Release/libes.TWL$(ARCHGEN_TYPE).a ../Release/libboc.TWL$(ARCHGEN_TYPE).a
|
||||
endif
|
||||
LLIBRARIES += liblcfg$(TWL_LIBSUFFIX).a
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
$Author$
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <firm.h>
|
||||
#include <twl/lcfg.h>
|
||||
|
||||
#ifndef FIRM_USE_TWLSDK_KEYS
|
||||
#define RSA_KEY_ADDR OSi_GetFromFirmAddr()->rsa_pubkey[0] // 鍵管理.xls参照
|
||||
@ -39,7 +40,9 @@ static const u8 rsa_key[128] =
|
||||
static u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32)));
|
||||
static SVCSignHeapContext acPool;
|
||||
|
||||
#define MENU_TITLE_ID 0x000300074c4e4352ULL
|
||||
#define MENU_TITLE_ID_HI 0x00030007ULL
|
||||
#define MENU_TITLE_ID_LO 0x4c4e4352ULL
|
||||
#define MENU_TITLE_ID (MENU_TITLE_ID_HI << 32 | MENU_TITLE_ID_LO)
|
||||
|
||||
/*
|
||||
PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。
|
||||
@ -122,6 +125,48 @@ static void PostInit(void)
|
||||
FS_InitFIRM();
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
TryResolveSrl
|
||||
|
||||
NANDに格納された情報からランチャーSRLを解決する
|
||||
***************************************************************/
|
||||
static BOOL TryResolveSrl(void)
|
||||
{
|
||||
u64 titleId = MENU_TITLE_ID_HI << 32;
|
||||
if ( !LCFG_ReadHWSecureInfo() )
|
||||
{
|
||||
OS_TPrintf("Failed to load HWSecureInfo.\n");
|
||||
return FALSE;
|
||||
}
|
||||
LCFG_THW_GetLauncherGameCode( (u8*)&titleId );
|
||||
|
||||
// 4: after LCFG_ReadHWSecureInfo
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_ResolveSrl( titleId ) )
|
||||
{
|
||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", titleId);
|
||||
return FALSE;
|
||||
}
|
||||
OS_TPrintf("Launcher Title ID: 0x%016llx\n", titleId);
|
||||
return TRUE;
|
||||
}
|
||||
/***************************************************************
|
||||
RetryResolveSrl
|
||||
|
||||
デフォルト設定からランチャーSRLを解決する
|
||||
***************************************************************/
|
||||
static BOOL RetryResolveSrl(void)
|
||||
{
|
||||
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
||||
{
|
||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
||||
return FALSE;
|
||||
}
|
||||
OS_TPrintf("Launcher Title ID: 0x%016llx\n", MENU_TITLE_ID);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
CheckHeader
|
||||
|
||||
@ -208,11 +253,12 @@ void TwlMain( void )
|
||||
// 0: bootrom
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
PreInit();
|
||||
|
||||
// 1: before PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 1: before OS_InitFIRM
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
OS_EnableInterrupts();
|
||||
@ -224,22 +270,18 @@ void TwlMain( void )
|
||||
PUSH_PROFILE();
|
||||
|
||||
PostInit();
|
||||
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
||||
if ( !TryResolveSrl() && !RetryResolveSrl() )
|
||||
{
|
||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 4: after FS_ResolveSrl
|
||||
// 5: after FS_ResolveSrl
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_SET_PATH );
|
||||
|
||||
// 5: after PXI
|
||||
// 6: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() )
|
||||
@ -247,19 +289,16 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 6: after FS_LoadHeader
|
||||
// 7: after FS_LoadHeader
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
|
||||
|
||||
// 7: after PXI
|
||||
// 8: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
AESi_SendSeed( FS_GetAesKeySeed() );
|
||||
FS_DeleteAesKeySeed();
|
||||
|
||||
// 8: after AESi_SendSeed
|
||||
// 9: after AESi_SendSeed
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadStatic() )
|
||||
@ -267,14 +306,13 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 9: after FS_LoadStatic
|
||||
// 10: after FS_LoadStatic
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
|
||||
|
||||
// 10: after PXI
|
||||
// 11: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -160,22 +160,19 @@ void TwlSpMain( void )
|
||||
SetDebugLED(++step); // 0x81
|
||||
|
||||
PreInit();
|
||||
|
||||
// 1: before PXI
|
||||
// 1: after PreInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x82
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
OS_EnableInterrupts();
|
||||
|
||||
// 2: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x83
|
||||
|
||||
PostInit();
|
||||
|
||||
// 3: after PM_InitFIRM
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x84
|
||||
|
||||
@ -187,25 +184,21 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FATFS_Init().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 4: after FS_Init
|
||||
// 4: after FATFS_Init
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x85
|
||||
|
||||
PM_BackLightOn( FALSE );
|
||||
|
||||
// 5:
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x86
|
||||
|
||||
//PM_BackLightOn( FALSE );
|
||||
|
||||
// 6:
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x87
|
||||
|
||||
//PM_BackLightOn( FALSE );
|
||||
|
||||
// 7:
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x88
|
||||
@ -217,7 +210,6 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 8: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x89
|
||||
@ -226,13 +218,11 @@ void TwlSpMain( void )
|
||||
|
||||
AESi_InitKeysFIRM();
|
||||
AESi_RecvSeed( rh->s.developer_encrypt );
|
||||
|
||||
// 9: after AESi_RecvSeed
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8a
|
||||
|
||||
PM_BackLightOn( FALSE );
|
||||
|
||||
// 10:
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8b
|
||||
@ -244,9 +234,9 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 11: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -45,6 +45,7 @@ LLIBRARIES += libes.TWL$(ARCHGEN_TYPE).a libboc.TWL$(ARCHGEN_TYPE).a
|
||||
else
|
||||
LLIBRARIES += ../Release/libes.TWL$(ARCHGEN_TYPE).a ../Release/libboc.TWL$(ARCHGEN_TYPE).a
|
||||
endif
|
||||
LLIBRARIES += liblcfg$(TWL_LIBSUFFIX).a
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <firm.h>
|
||||
#include <twl/aes.h>
|
||||
#include <twl/lcfg.h>
|
||||
|
||||
#ifndef FIRM_USE_TWLSDK_KEYS
|
||||
#define RSA_KEY_ADDR OSi_GetFromFirmAddr()->rsa_pubkey[0] // 鍵管理.xls参照
|
||||
@ -40,7 +41,9 @@ static const u8 rsa_key[128] =
|
||||
static u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32)));
|
||||
static SVCSignHeapContext acPool;
|
||||
|
||||
#define MENU_TITLE_ID 0x000300074c4e4352ULL
|
||||
#define MENU_TITLE_ID_HI 0x00030007ULL
|
||||
#define MENU_TITLE_ID_LO 0x4c4e4352ULL
|
||||
#define MENU_TITLE_ID (MENU_TITLE_ID_HI << 32 | MENU_TITLE_ID_LO)
|
||||
|
||||
/*
|
||||
PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。
|
||||
@ -123,6 +126,47 @@ static void PostInit(void)
|
||||
FS_InitFIRM();
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
TryResolveSrl
|
||||
|
||||
NANDに格納された情報からランチャーSRLを解決する
|
||||
***************************************************************/
|
||||
static BOOL TryResolveSrl(void)
|
||||
{
|
||||
u64 titleId = MENU_TITLE_ID_HI << 32;
|
||||
if ( !LCFG_ReadHWSecureInfo() )
|
||||
{
|
||||
OS_TPrintf("Failed to load HWSecureInfo.\n");
|
||||
return FALSE;
|
||||
}
|
||||
LCFG_THW_GetLauncherGameCode( (u8*)&titleId );
|
||||
// 4: after LCFG_ReadHWSecureInfo
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_ResolveSrl( titleId ) )
|
||||
{
|
||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", titleId);
|
||||
return FALSE;
|
||||
}
|
||||
OS_TPrintf("Launcher Title ID: 0x%016llx\n", titleId);
|
||||
return TRUE;
|
||||
}
|
||||
/***************************************************************
|
||||
RetryResolveSrl
|
||||
|
||||
デフォルト設定からランチャーSRLを解決する
|
||||
***************************************************************/
|
||||
static BOOL RetryResolveSrl(void)
|
||||
{
|
||||
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
||||
{
|
||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
||||
return FALSE;
|
||||
}
|
||||
OS_TPrintf("Launcher Title ID: 0x%016llx\n", MENU_TITLE_ID);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
CheckHeader
|
||||
|
||||
@ -211,10 +255,12 @@ void TwlMain( void )
|
||||
// 0: bootrom
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
PreInit();
|
||||
|
||||
// 1: before PXI
|
||||
PUSH_PROFILE();
|
||||
PreInit();
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 1: before OS_InitFIRM
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
@ -223,21 +269,18 @@ void TwlMain( void )
|
||||
#ifdef PROFILE_ENABLE
|
||||
OS_InitTick();
|
||||
#endif
|
||||
// 2: after PXI
|
||||
// 2: after OS_InitTick
|
||||
PUSH_PROFILE();
|
||||
|
||||
PostInit();
|
||||
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
||||
if ( !TryResolveSrl() && !RetryResolveSrl() )
|
||||
{
|
||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 4: after FS_ResolveSrl
|
||||
// 5: after FS_ResolveSrl
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_OpenSrl( &file ) )
|
||||
@ -245,8 +288,7 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_OpenSrl().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 5: after FS_OpenSrl
|
||||
// 6: after FS_OpenSrl
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadSrlHeader( &file, &acPool, RSA_KEY_ADDR ) || !CheckHeader() )
|
||||
@ -254,18 +296,15 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadSrlHeader() and/or CheckHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 6: after FS_LoadSrlHeader
|
||||
// 7: after FS_LoadSrlHeader
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
|
||||
|
||||
// 7: after PXI
|
||||
// 8: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
AESi_SendSeed( FS_GetAesKeySeed() );
|
||||
|
||||
// 8: after AESi_SendSeed
|
||||
// 9: after AESi_SendSeed
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadSrlStatic( &file ) )
|
||||
@ -273,14 +312,13 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadSrlStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 9: after FS_LoadSrlStatic
|
||||
// 10: after FS_LoadSrlStatic
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
|
||||
|
||||
// 10: after PXI
|
||||
// 11: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -153,26 +153,28 @@ void TwlSpMain( void )
|
||||
{
|
||||
int fd; // menu file descriptor
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 0: bootrom
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
InitDebugLED();
|
||||
SetDebugLED(++step); // 0x81
|
||||
|
||||
PreInit();
|
||||
|
||||
// 0: before PXI
|
||||
// 1: after PreInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x82
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
OS_EnableInterrupts();
|
||||
|
||||
// 1: after PXI
|
||||
// 2: after OS_InitFIRM
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x83
|
||||
|
||||
PostInit();
|
||||
|
||||
// 2: after PM_InitFIRM
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x84
|
||||
|
||||
@ -184,8 +186,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FATFS_Init().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 3: after FS_Init
|
||||
// 4: after FATFS_Init
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x85
|
||||
|
||||
@ -196,8 +197,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 4: after PXI
|
||||
// 5: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x86
|
||||
|
||||
@ -208,8 +208,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_OpenSrl().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 5: after FS_OpenSrl
|
||||
// 6: after FS_OpenSrl
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x87
|
||||
|
||||
@ -220,8 +219,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 6: after FS_LoadHeader
|
||||
// 7: after FS_LoadHeader
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x88
|
||||
|
||||
@ -232,8 +230,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 7: after PXI
|
||||
// 8: after PXI
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x89
|
||||
|
||||
@ -241,8 +238,7 @@ void TwlSpMain( void )
|
||||
|
||||
AESi_InitKeysFIRM();
|
||||
AESi_RecvSeed( rh->s.developer_encrypt );
|
||||
|
||||
// 8: after AESi_RecvSeed
|
||||
// 9: after AESi_RecvSeed
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8a
|
||||
|
||||
@ -253,8 +249,7 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 9: after FS_LoadStatic
|
||||
// 10: after FS_LoadStatic
|
||||
PUSH_PROFILE();
|
||||
SetDebugLED(++step); // 0x8b
|
||||
|
||||
@ -265,9 +260,9 @@ void TwlSpMain( void )
|
||||
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 10: after PXI
|
||||
// 11: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -211,10 +211,16 @@ static void EraseAll(void)
|
||||
|
||||
void TwlMain( void )
|
||||
{
|
||||
PreInit();
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 0: bootrom
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
// 0: before PXI
|
||||
PUSH_PROFILE();
|
||||
PreInit();
|
||||
#ifdef PROFILE_ENABLE
|
||||
// 1: before Init
|
||||
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
|
||||
#endif
|
||||
|
||||
OS_InitFIRM();
|
||||
OS_EnableIrq();
|
||||
@ -223,12 +229,11 @@ void TwlMain( void )
|
||||
#ifdef PROFILE_ENABLE
|
||||
OS_InitTick();
|
||||
#endif
|
||||
// 1: after PXI
|
||||
// 2: after OS_InitTick
|
||||
PUSH_PROFILE();
|
||||
|
||||
PostInit();
|
||||
|
||||
// 2: after PostInit
|
||||
// 3: after PostInit
|
||||
PUSH_PROFILE();
|
||||
|
||||
switch ( PAD_Read() & PAD_KEYPORT_MASK )
|
||||
@ -252,13 +257,11 @@ void TwlMain( void )
|
||||
OS_TPrintf("Unknown pad pattern (%X).\n", PAD_Read() & PAD_KEYPORT_MASK);
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 3: after FS_ResolveSrl
|
||||
// 4: after FS_ResolveSrl
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_SET_PATH );
|
||||
|
||||
// 4: after PXI
|
||||
// 5: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() )
|
||||
@ -266,19 +269,16 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 5: after FS_LoadHeader
|
||||
// 6: after FS_LoadHeader
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
|
||||
|
||||
// 6: after PXI
|
||||
// 7: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
AESi_SendSeed( FS_GetAesKeySeed() );
|
||||
FS_DeleteAesKeySeed();
|
||||
|
||||
// 7: after AESi_SendSeed
|
||||
// 8: after AESi_SendSeed
|
||||
PUSH_PROFILE();
|
||||
|
||||
if ( !FS_LoadStatic() )
|
||||
@ -286,14 +286,13 @@ void TwlMain( void )
|
||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
// 8: after FS_LoadStatic
|
||||
// 9: after FS_LoadStatic
|
||||
PUSH_PROFILE();
|
||||
|
||||
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
|
||||
|
||||
// 9: after PXI
|
||||
// 10: after PXI
|
||||
PUSH_PROFILE();
|
||||
|
||||
#ifdef PROFILE_ENABLE
|
||||
{
|
||||
int i;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user