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:
yutaka 2008-01-25 08:18:54 +00:00
parent 4a3fc13fca
commit 256dd85977
11 changed files with 219 additions and 157 deletions

View File

@ -154,26 +154,28 @@ void TwlSpMain( void )
{ {
int fd; // menu file descriptor int fd; // menu file descriptor
#ifdef PROFILE_ENABLE
// 0: bootrom
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
InitDebugLED(); InitDebugLED();
SetDebugLED(++step); // 0x81 SetDebugLED(++step); // 0x81
PreInit(); PreInit();
// 1: after PreInit
// 0: before PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x82 SetDebugLED(++step); // 0x82
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
OS_EnableInterrupts(); OS_EnableInterrupts();
// 2: after OS_InitFIRM
// 1: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x83 SetDebugLED(++step); // 0x83
PostInit(); PostInit();
// 3: after PostInit
// 2: after PM_InitFIRM
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x84 SetDebugLED(++step); // 0x84
@ -185,8 +187,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FATFS_Init().\n"); OS_TPrintf("Failed to call FATFS_Init().\n");
goto end; goto end;
} }
// 4: after FATFS_Init
// 3: after FS_Init
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x85 SetDebugLED(++step); // 0x85
@ -197,8 +198,7 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n");
goto end; goto end;
} }
// 5: after PXI
// 4: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x86 SetDebugLED(++step); // 0x86
@ -209,8 +209,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_OpenSrl().\n"); OS_TPrintf("Failed to call FS_OpenSrl().\n");
goto end; goto end;
} }
// 6: after FS_OpenSrl
// 5: after FS_OpenSrl
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x87 SetDebugLED(++step); // 0x87
@ -221,8 +220,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_LoadHeader().\n"); OS_TPrintf("Failed to call FS_LoadHeader().\n");
goto end; goto end;
} }
// 7: after FS_LoadHeader
// 6: after FS_LoadHeader
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x88 SetDebugLED(++step); // 0x88
@ -233,8 +231,7 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
goto end; goto end;
} }
// 8: after PXI
// 7: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x89 SetDebugLED(++step); // 0x89
@ -242,8 +239,7 @@ void TwlSpMain( void )
AESi_InitKeysFIRM(); AESi_InitKeysFIRM();
AESi_RecvSeed( rh->s.developer_encrypt ); AESi_RecvSeed( rh->s.developer_encrypt );
// 9: after AESi_RecvSeed
// 8: after AESi_RecvSeed
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8a SetDebugLED(++step); // 0x8a
@ -254,8 +250,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;
} }
// 10: after FS_LoadStatic
// 9: after FS_LoadStatic
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8b SetDebugLED(++step); // 0x8b
@ -266,9 +261,9 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
goto end; goto end;
} }
// 11: after PXI
// 10: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -207,10 +207,16 @@ static void EraseAll(void)
void TwlMain( void ) void TwlMain( void )
{ {
PreInit(); #ifdef PROFILE_ENABLE
// 0: bootrom
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
// 0: before PXI PreInit();
PUSH_PROFILE(); #ifdef PROFILE_ENABLE
// 1: before OS_InitFIRM
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
@ -219,22 +225,19 @@ void TwlMain( void )
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
OS_InitTick(); OS_InitTick();
#endif #endif
// 1: after PXI // 2: after OS_InitTick
PUSH_PROFILE(); PUSH_PROFILE();
PostInit(); PostInit();
// 3: after PostInit
// 2: after PostInit
PUSH_PROFILE(); PUSH_PROFILE();
STD_CopyString((char*)HW_TWL_FS_BOOT_SRL_PATH_BUF, MENU_FILE); STD_CopyString((char*)HW_TWL_FS_BOOT_SRL_PATH_BUF, MENU_FILE);
// 4: after STD_CopyString
// 3: after FS_ResolveSrl
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_SET_PATH ); PXI_NotifyID( FIRM_PXI_ID_SET_PATH );
// 5: after PXI
// 4: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() ) 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"); OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
} }
// 6: after FS_LoadHeader
// 5: after FS_LoadHeader
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER ); PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
// 7: after PXI
// 6: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
AESi_SendSeed( FS_GetAesKeySeed() ); AESi_SendSeed( FS_GetAesKeySeed() );
FS_DeleteAesKeySeed(); FS_DeleteAesKeySeed();
// 8: after AESi_SendSeed
// 7: after AESi_SendSeed
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadStatic() ) if ( !FS_LoadStatic() )
@ -262,14 +262,13 @@ void TwlMain( void )
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;
} }
// 9: after FS_LoadStatic
// 8: after FS_LoadStatic
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC ); PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
// 10: after PXI
// 9: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -91,6 +91,14 @@ void OS_InitFIRM(void)
//---- Init Card //---- Init Card
#ifndef SDK_SMALL_BUILD #ifndef SDK_SMALL_BUILD
// CARD_Init(); // CARD_Init();
#endif
//---- init System config
#ifdef SDK_TWL
// if (OS_IsRunOnTwl() == TRUE)
// {
SCFG_Init();
// }
#endif #endif
//---- Init Power Manager //---- Init Power Manager
@ -142,6 +150,14 @@ void OS_InitFIRM(void)
//---- Init Cartridge //---- Init Cartridge
#ifndef SDK_TEG #ifndef SDK_TEG
// CTRDG_Init(); // CTRDG_Init();
#endif
//---- init System config
#ifdef SDK_TWL
// if (OS_IsRunOnTwl() == TRUE)
// {
SCFG_Init();
// }
#endif #endif
#endif // SDK_ARM9 #endif // SDK_ARM9

View File

@ -162,22 +162,19 @@ void TwlSpMain( void )
SetDebugLED(++step); // 0x81 SetDebugLED(++step); // 0x81
PreInit(); PreInit();
// 1: after PreInit
// 1: before PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x82 SetDebugLED(++step); // 0x82
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
OS_EnableInterrupts(); OS_EnableInterrupts();
// 2: after OS_InitFIRM
// 2: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x83 SetDebugLED(++step); // 0x83
PostInit(); PostInit();
// 3: after PostInit
// 3: after PM_InitFIRM
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x84 SetDebugLED(++step); // 0x84
@ -189,8 +186,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FATFS_Init().\n"); OS_TPrintf("Failed to call FATFS_Init().\n");
goto end; goto end;
} }
// 4: after FATFS_Init
// 4: after FS_Init
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x85 SetDebugLED(++step); // 0x85
@ -201,7 +197,6 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n");
goto end; goto end;
} }
// 5: after PXI // 5: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x86 SetDebugLED(++step); // 0x86
@ -213,7 +208,6 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_OpenSrl().\n"); OS_TPrintf("Failed to call FS_OpenSrl().\n");
goto end; goto end;
} }
// 6: after FS_OpenSrl // 6: after FS_OpenSrl
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x87 SetDebugLED(++step); // 0x87
@ -225,7 +219,6 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_LoadHeader().\n"); OS_TPrintf("Failed to call FS_LoadHeader().\n");
goto end; goto end;
} }
// 7: after FS_LoadHeader // 7: after FS_LoadHeader
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x88 SetDebugLED(++step); // 0x88
@ -237,7 +230,6 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
goto end; goto end;
} }
// 8: after PXI // 8: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x89 SetDebugLED(++step); // 0x89
@ -246,7 +238,6 @@ void TwlSpMain( void )
AESi_InitKeysFIRM(); AESi_InitKeysFIRM();
AESi_RecvSeed( rh->s.developer_encrypt ); AESi_RecvSeed( rh->s.developer_encrypt );
// 9: after AESi_RecvSeed // 9: after AESi_RecvSeed
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8a SetDebugLED(++step); // 0x8a
@ -258,7 +249,6 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;
} }
// 10: after FS_LoadStatic // 10: after FS_LoadStatic
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8b SetDebugLED(++step); // 0x8b
@ -270,9 +260,9 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
goto end; goto end;
} }
// 11: after PXI // 11: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -47,6 +47,7 @@ LLIBRARIES += libes.TWL$(ARCHGEN_TYPE).a libboc.TWL$(ARCHGEN_TYPE).a
else else
LLIBRARIES += ../Release/libes.TWL$(ARCHGEN_TYPE).a ../Release/libboc.TWL$(ARCHGEN_TYPE).a LLIBRARIES += ../Release/libes.TWL$(ARCHGEN_TYPE).a ../Release/libboc.TWL$(ARCHGEN_TYPE).a
endif endif
LLIBRARIES += liblcfg$(TWL_LIBSUFFIX).a
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -15,6 +15,7 @@
$Author$ $Author$
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <firm.h> #include <firm.h>
#include <twl/lcfg.h>
#ifndef FIRM_USE_TWLSDK_KEYS #ifndef FIRM_USE_TWLSDK_KEYS
#define RSA_KEY_ADDR OSi_GetFromFirmAddr()->rsa_pubkey[0] // 鍵管理.xls参照 #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 u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32)));
static SVCSignHeapContext acPool; 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 PROFILE_ENABLE
@ -122,6 +125,48 @@ static void PostInit(void)
FS_InitFIRM(); 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 CheckHeader
@ -208,11 +253,12 @@ void TwlMain( void )
// 0: bootrom // 0: bootrom
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick()); profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif #endif
PreInit(); PreInit();
#ifdef PROFILE_ENABLE
// 1: before PXI // 1: before OS_InitFIRM
PUSH_PROFILE(); profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
OS_EnableInterrupts(); OS_EnableInterrupts();
@ -224,22 +270,18 @@ void TwlMain( void )
PUSH_PROFILE(); PUSH_PROFILE();
PostInit(); PostInit();
// 3: after PostInit // 3: after PostInit
PUSH_PROFILE(); 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; goto end;
} }
// 5: after FS_ResolveSrl
// 4: after FS_ResolveSrl
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_SET_PATH ); PXI_NotifyID( FIRM_PXI_ID_SET_PATH );
// 6: after PXI
// 5: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() ) 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"); OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
} }
// 7: after FS_LoadHeader
// 6: after FS_LoadHeader
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER ); PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
// 8: after PXI
// 7: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
AESi_SendSeed( FS_GetAesKeySeed() ); AESi_SendSeed( FS_GetAesKeySeed() );
FS_DeleteAesKeySeed(); FS_DeleteAesKeySeed();
// 9: after AESi_SendSeed
// 8: after AESi_SendSeed
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadStatic() ) if ( !FS_LoadStatic() )
@ -267,14 +306,13 @@ void TwlMain( void )
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;
} }
// 10: after FS_LoadStatic
// 9: after FS_LoadStatic
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC ); PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
// 11: after PXI
// 10: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -160,22 +160,19 @@ void TwlSpMain( void )
SetDebugLED(++step); // 0x81 SetDebugLED(++step); // 0x81
PreInit(); PreInit();
// 1: after PreInit
// 1: before PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x82 SetDebugLED(++step); // 0x82
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
OS_EnableInterrupts(); OS_EnableInterrupts();
// 2: after PXI // 2: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x83 SetDebugLED(++step); // 0x83
PostInit(); PostInit();
// 3: after PostInit
// 3: after PM_InitFIRM
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x84 SetDebugLED(++step); // 0x84
@ -187,25 +184,21 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FATFS_Init().\n"); OS_TPrintf("Failed to call FATFS_Init().\n");
goto end; goto end;
} }
// 4: after FATFS_Init
// 4: after FS_Init
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x85 SetDebugLED(++step); // 0x85
PM_BackLightOn( FALSE ); PM_BackLightOn( FALSE );
// 5: // 5:
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x86 SetDebugLED(++step); // 0x86
//PM_BackLightOn( FALSE ); //PM_BackLightOn( FALSE );
// 6: // 6:
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x87 SetDebugLED(++step); // 0x87
//PM_BackLightOn( FALSE ); //PM_BackLightOn( FALSE );
// 7: // 7:
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x88 SetDebugLED(++step); // 0x88
@ -217,7 +210,6 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
goto end; goto end;
} }
// 8: after PXI // 8: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x89 SetDebugLED(++step); // 0x89
@ -226,13 +218,11 @@ void TwlSpMain( void )
AESi_InitKeysFIRM(); AESi_InitKeysFIRM();
AESi_RecvSeed( rh->s.developer_encrypt ); AESi_RecvSeed( rh->s.developer_encrypt );
// 9: after AESi_RecvSeed // 9: after AESi_RecvSeed
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8a SetDebugLED(++step); // 0x8a
PM_BackLightOn( FALSE ); PM_BackLightOn( FALSE );
// 10: // 10:
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8b SetDebugLED(++step); // 0x8b
@ -244,9 +234,9 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
goto end; goto end;
} }
// 11: after PXI // 11: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -45,6 +45,7 @@ LLIBRARIES += libes.TWL$(ARCHGEN_TYPE).a libboc.TWL$(ARCHGEN_TYPE).a
else else
LLIBRARIES += ../Release/libes.TWL$(ARCHGEN_TYPE).a ../Release/libboc.TWL$(ARCHGEN_TYPE).a LLIBRARIES += ../Release/libes.TWL$(ARCHGEN_TYPE).a ../Release/libboc.TWL$(ARCHGEN_TYPE).a
endif endif
LLIBRARIES += liblcfg$(TWL_LIBSUFFIX).a
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -16,6 +16,7 @@
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <firm.h> #include <firm.h>
#include <twl/aes.h> #include <twl/aes.h>
#include <twl/lcfg.h>
#ifndef FIRM_USE_TWLSDK_KEYS #ifndef FIRM_USE_TWLSDK_KEYS
#define RSA_KEY_ADDR OSi_GetFromFirmAddr()->rsa_pubkey[0] // 鍵管理.xls参照 #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 u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32)));
static SVCSignHeapContext acPool; 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 PROFILE_ENABLE
@ -123,6 +126,47 @@ static void PostInit(void)
FS_InitFIRM(); 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 CheckHeader
@ -211,10 +255,12 @@ void TwlMain( void )
// 0: bootrom // 0: bootrom
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick()); profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif #endif
PreInit();
// 1: before PXI PreInit();
PUSH_PROFILE(); #ifdef PROFILE_ENABLE
// 1: before OS_InitFIRM
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
@ -223,21 +269,18 @@ void TwlMain( void )
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
OS_InitTick(); OS_InitTick();
#endif #endif
// 2: after PXI // 2: after OS_InitTick
PUSH_PROFILE(); PUSH_PROFILE();
PostInit(); PostInit();
// 3: after PostInit // 3: after PostInit
PUSH_PROFILE(); 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; goto end;
} }
// 5: after FS_ResolveSrl
// 4: after FS_ResolveSrl
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_OpenSrl( &file ) ) if ( !FS_OpenSrl( &file ) )
@ -245,8 +288,7 @@ void TwlMain( void )
OS_TPrintf("Failed to call FS_OpenSrl().\n"); OS_TPrintf("Failed to call FS_OpenSrl().\n");
goto end; goto end;
} }
// 6: after FS_OpenSrl
// 5: after FS_OpenSrl
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadSrlHeader( &file, &acPool, RSA_KEY_ADDR ) || !CheckHeader() ) 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"); OS_TPrintf("Failed to call FS_LoadSrlHeader() and/or CheckHeader().\n");
goto end; goto end;
} }
// 7: after FS_LoadSrlHeader
// 6: after FS_LoadSrlHeader
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER ); PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
// 8: after PXI
// 7: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
AESi_SendSeed( FS_GetAesKeySeed() ); AESi_SendSeed( FS_GetAesKeySeed() );
// 9: after AESi_SendSeed
// 8: after AESi_SendSeed
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadSrlStatic( &file ) ) if ( !FS_LoadSrlStatic( &file ) )
@ -273,14 +312,13 @@ void TwlMain( void )
OS_TPrintf("Failed to call FS_LoadSrlStatic().\n"); OS_TPrintf("Failed to call FS_LoadSrlStatic().\n");
goto end; goto end;
} }
// 10: after FS_LoadSrlStatic
// 9: after FS_LoadSrlStatic
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC ); PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
// 11: after PXI
// 10: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -153,26 +153,28 @@ void TwlSpMain( void )
{ {
int fd; // menu file descriptor int fd; // menu file descriptor
#ifdef PROFILE_ENABLE
// 0: bootrom
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
InitDebugLED(); InitDebugLED();
SetDebugLED(++step); // 0x81 SetDebugLED(++step); // 0x81
PreInit(); PreInit();
// 1: after PreInit
// 0: before PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x82 SetDebugLED(++step); // 0x82
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
OS_EnableInterrupts(); OS_EnableInterrupts();
// 2: after OS_InitFIRM
// 1: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x83 SetDebugLED(++step); // 0x83
PostInit(); PostInit();
// 3: after PostInit
// 2: after PM_InitFIRM
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x84 SetDebugLED(++step); // 0x84
@ -184,8 +186,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FATFS_Init().\n"); OS_TPrintf("Failed to call FATFS_Init().\n");
goto end; goto end;
} }
// 4: after FATFS_Init
// 3: after FS_Init
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x85 SetDebugLED(++step); // 0x85
@ -196,8 +197,7 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_SET_PATH).\n");
goto end; goto end;
} }
// 5: after PXI
// 4: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x86 SetDebugLED(++step); // 0x86
@ -208,8 +208,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_OpenSrl().\n"); OS_TPrintf("Failed to call FS_OpenSrl().\n");
goto end; goto end;
} }
// 6: after FS_OpenSrl
// 5: after FS_OpenSrl
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x87 SetDebugLED(++step); // 0x87
@ -220,8 +219,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_LoadHeader().\n"); OS_TPrintf("Failed to call FS_LoadHeader().\n");
goto end; goto end;
} }
// 7: after FS_LoadHeader
// 6: after FS_LoadHeader
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x88 SetDebugLED(++step); // 0x88
@ -232,8 +230,7 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
goto end; goto end;
} }
// 8: after PXI
// 7: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x89 SetDebugLED(++step); // 0x89
@ -241,8 +238,7 @@ void TwlSpMain( void )
AESi_InitKeysFIRM(); AESi_InitKeysFIRM();
AESi_RecvSeed( rh->s.developer_encrypt ); AESi_RecvSeed( rh->s.developer_encrypt );
// 9: after AESi_RecvSeed
// 8: after AESi_RecvSeed
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8a SetDebugLED(++step); // 0x8a
@ -253,8 +249,7 @@ void TwlSpMain( void )
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;
} }
// 10: after FS_LoadStatic
// 9: after FS_LoadStatic
PUSH_PROFILE(); PUSH_PROFILE();
SetDebugLED(++step); // 0x8b SetDebugLED(++step); // 0x8b
@ -265,9 +260,9 @@ void TwlSpMain( void )
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n"); OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_STATIC).\n");
goto end; goto end;
} }
// 11: after PXI
// 10: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;

View File

@ -211,10 +211,16 @@ static void EraseAll(void)
void TwlMain( void ) void TwlMain( void )
{ {
PreInit(); #ifdef PROFILE_ENABLE
// 0: bootrom
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
// 0: before PXI PreInit();
PUSH_PROFILE(); #ifdef PROFILE_ENABLE
// 1: before Init
profile[pf_cnt++] = OS_TicksToMicroSecondsBROM32(OS_GetTick());
#endif
OS_InitFIRM(); OS_InitFIRM();
OS_EnableIrq(); OS_EnableIrq();
@ -223,12 +229,11 @@ void TwlMain( void )
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
OS_InitTick(); OS_InitTick();
#endif #endif
// 1: after PXI // 2: after OS_InitTick
PUSH_PROFILE(); PUSH_PROFILE();
PostInit(); PostInit();
// 3: after PostInit
// 2: after PostInit
PUSH_PROFILE(); PUSH_PROFILE();
switch ( PAD_Read() & PAD_KEYPORT_MASK ) 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); OS_TPrintf("Unknown pad pattern (%X).\n", PAD_Read() & PAD_KEYPORT_MASK);
goto end; goto end;
} }
// 4: after FS_ResolveSrl
// 3: after FS_ResolveSrl
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_SET_PATH ); PXI_NotifyID( FIRM_PXI_ID_SET_PATH );
// 5: after PXI
// 4: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() ) 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"); OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
} }
// 6: after FS_LoadHeader
// 5: after FS_LoadHeader
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER ); PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
// 7: after PXI
// 6: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
AESi_SendSeed( FS_GetAesKeySeed() ); AESi_SendSeed( FS_GetAesKeySeed() );
FS_DeleteAesKeySeed(); FS_DeleteAesKeySeed();
// 8: after AESi_SendSeed
// 7: after AESi_SendSeed
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadStatic() ) if ( !FS_LoadStatic() )
@ -286,14 +286,13 @@ void TwlMain( void )
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;
} }
// 9: after FS_LoadStatic
// 8: after FS_LoadStatic
PUSH_PROFILE(); PUSH_PROFILE();
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC ); PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
// 10: after PXI
// 9: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
#ifdef PROFILE_ENABLE #ifdef PROFILE_ENABLE
{ {
int i; int i;