mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
全部ARM9側でFS_ReadFileする版の作成(100msec遅い)
一時バッファ利用版AES対応 (未検証) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@328 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
765a4dfc96
commit
ab0344e274
@ -18,6 +18,7 @@
|
|||||||
#include <symbols.h>
|
#include <symbols.h>
|
||||||
#include <firm.h>
|
#include <firm.h>
|
||||||
#include <rtfs.h>
|
#include <rtfs.h>
|
||||||
|
#include <twl/aes/common/aes.h>
|
||||||
|
|
||||||
//#define WORKAROUND_NAND_2KB_BUG
|
//#define WORKAROUND_NAND_2KB_BUG
|
||||||
|
|
||||||
@ -29,6 +30,10 @@
|
|||||||
|
|
||||||
static ROM_Header* const rh= (ROM_Header*)HW_TWL_ROM_HEADER_BUF;
|
static ROM_Header* const rh= (ROM_Header*)HW_TWL_ROM_HEADER_BUF;
|
||||||
|
|
||||||
|
static BOOL aesFlag;
|
||||||
|
static AESCounter aesCounter;
|
||||||
|
static u8 aesBuffer[HW_FIRM_LOAD_BUFFER_UNIT_SIZE] ATTRIBUTE_ALIGN(32);
|
||||||
|
|
||||||
static void ConvertPath( u16* dest, const char* src, u32 max)
|
static void ConvertPath( u16* dest, const char* src, u32 max)
|
||||||
{
|
{
|
||||||
dest[0] = 0;
|
dest[0] = 0;
|
||||||
@ -112,18 +117,29 @@ int FS_OpenSrl( void )
|
|||||||
return FATFSi_rtfs_po_open((u8*)fatpath, 0, 0);
|
return FATFSi_rtfs_po_open((u8*)fatpath, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EnableAes( AESCounter* pCounter ) // ドライバAPIと置き換える
|
#define DMA_SEND 2
|
||||||
{
|
#define DMA_RECV 3
|
||||||
(void)pCounter;
|
static void CopyWithAes( const void* src, void* dest, u32 size )
|
||||||
}
|
|
||||||
static void DisableAes( void ) // ドライバAPIと置き換える
|
|
||||||
{
|
{
|
||||||
|
AESi_Reset();
|
||||||
|
AESi_Reset();
|
||||||
|
AESi_DmaSend( DMA_SEND, src, size, NULL, NULL );
|
||||||
|
AESi_DmaRecv( DMA_RECV, dest, size, NULL, NULL );
|
||||||
|
AESi_SetCounter( &aesCounter );
|
||||||
|
AESi_Run( AES_MODE_CTR, 0, size / AES_BLOCK_SIZE, NULL, NULL );
|
||||||
|
AES_AddToCounter( &aesCounter, size / AES_BLOCK_SIZE );
|
||||||
|
MI_WaitNDma( DMA_RECV );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GetAesCounter( AESCounter* pCounter, u32 offset )
|
static void EnableAes( u32 offset )
|
||||||
{
|
{
|
||||||
MI_CpuCopy32( rh->s.main_static_digest, pCounter, AES_BLOCK_SIZE );
|
aesFlag = TRUE;
|
||||||
AESi_AddCounter( pCounter, offset - rh->s.aes_target_rom_offset );
|
MI_CpuCopy8( rh->s.main_static_digest, &aesCounter, AES_BLOCK_SIZE );
|
||||||
|
AES_AddToCounter( &aesCounter, (offset - rh->s.aes_target_rom_offset) / AES_BLOCK_SIZE );
|
||||||
|
}
|
||||||
|
static void DisableAes( void )
|
||||||
|
{
|
||||||
|
aesFlag = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 GetTransferSize( u32 offset, u32 size )
|
static u32 GetTransferSize( u32 offset, u32 size )
|
||||||
@ -135,12 +151,10 @@ static u32 GetTransferSize( u32 offset, u32 size )
|
|||||||
{
|
{
|
||||||
if ( offset >= aes_offset && offset < aes_end )
|
if ( offset >= aes_offset && offset < aes_end )
|
||||||
{
|
{
|
||||||
AESCounter counter;
|
|
||||||
if ( end > aes_end )
|
if ( end > aes_end )
|
||||||
{
|
{
|
||||||
size = aes_end - offset;
|
size = aes_end - offset;
|
||||||
}
|
}
|
||||||
AESi_WaitKey();
|
|
||||||
if (rh->s.developer_encrypt)
|
if (rh->s.developer_encrypt)
|
||||||
{
|
{
|
||||||
AESi_LoadKey( AES_KEY_SLOT_C );
|
AESi_LoadKey( AES_KEY_SLOT_C );
|
||||||
@ -149,8 +163,7 @@ static u32 GetTransferSize( u32 offset, u32 size )
|
|||||||
{
|
{
|
||||||
AESi_LoadKey( AES_KEY_SLOT_A );
|
AESi_LoadKey( AES_KEY_SLOT_A );
|
||||||
}
|
}
|
||||||
GetAesCounter( &counter, offset );
|
EnableAes( offset );
|
||||||
EnableAes( &counter );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -195,7 +208,8 @@ BOOL FS_LoadBuffer( int fd, u32 offset, u32 size )
|
|||||||
}
|
}
|
||||||
while ( size > 0 )
|
while ( size > 0 )
|
||||||
{
|
{
|
||||||
u8* dest = (u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
u8* dest = aesFlag ? aesBuffer :
|
||||||
|
(u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||||
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||||
while ( MI_GetWramBankMaster_B( count ) != MI_WRAM_ARM7 ) // wait to be ready
|
while ( MI_GetWramBankMaster_B( count ) != MI_WRAM_ARM7 ) // wait to be ready
|
||||||
{
|
{
|
||||||
@ -221,6 +235,10 @@ BOOL FS_LoadBuffer( int fd, u32 offset, u32 size )
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if ( aesFlag )
|
||||||
|
{
|
||||||
|
CopyWithAes( dest, (u8*)HW_FIRM_LOAD_BUFFER_BASE + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE, unit );
|
||||||
|
}
|
||||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_PIRIOD );
|
PXI_NotifyID( FIRM_PXI_ID_LOAD_PIRIOD );
|
||||||
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||||
size -= unit;
|
size -= unit;
|
||||||
@ -277,6 +295,7 @@ BOOL FS_LoadHeader( int fd )
|
|||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,6 +55,8 @@ static const u8 defaultKey[ SVC_SHA1_BLOCK_SIZE ] =
|
|||||||
0x87, 0x46, 0x58, 0x24,
|
0x87, 0x46, 0x58, 0x24,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static AESKey FSiAesKeySeed;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: FS_InitFIRM
|
Name: FS_InitFIRM
|
||||||
|
|
||||||
@ -72,6 +74,34 @@ void FS_InitFIRM( void )
|
|||||||
FS_Init( FS_DMA_NOT_USE );
|
FS_Init( FS_DMA_NOT_USE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_GetAesKeySeed
|
||||||
|
|
||||||
|
Description: retreive aes key seed in the signature
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: pointer to seed
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
AESKey* const FS_GetAesKeySeed( void )
|
||||||
|
{
|
||||||
|
return &FSiAesKeySeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_DeleteAesKeySeed
|
||||||
|
|
||||||
|
Description: delete aes key seed in the signature
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void FS_DeleteAesKeySeed( void )
|
||||||
|
{
|
||||||
|
MI_CpuClear8( &FSiAesKeySeed, sizeof(FSiAesKeySeed) );
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: FS_ResolveSrl
|
Name: FS_ResolveSrl
|
||||||
|
|
||||||
@ -344,6 +374,9 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
|||||||
|
|
||||||
// ダイジェスト以外のデータのチェックが必要!!
|
// ダイジェスト以外のデータのチェックが必要!!
|
||||||
|
|
||||||
|
// Œ®‚̕ۑ¶
|
||||||
|
MI_CpuCopy8( (AESKey*)sd.aes_key_seed, &FSiAesKeySeed, sizeof(FSiAesKeySeed) );
|
||||||
|
|
||||||
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
||||||
|
|
||||||
// ROMヘッダのコピー
|
// ROMヘッダのコピー
|
||||||
@ -397,19 +430,44 @@ BOOL FS_LoadStatic( void )
|
|||||||
/*
|
/*
|
||||||
以下、LoadBufferを使わない版 (通常FS APIを使用する)
|
以下、LoadBufferを使わない版 (通常FS APIを使用する)
|
||||||
*/
|
*/
|
||||||
|
#include <twl/aes.h>
|
||||||
|
|
||||||
static void EnableAes( AESCounter* pCounter ) // ドライバAPIと置き換える
|
static BOOL aesFlag;
|
||||||
{
|
static AESCounter aesCounter;
|
||||||
(void)pCounter;
|
static u8* const aesBuffer = (u8*)HW_FIRM_FS_AES_BUFFER; // 0x2ff0000
|
||||||
}
|
|
||||||
static void DisableAes( void ) // ドライバAPIと置き換える
|
static void AesCallback( AESResult result, void* arg )
|
||||||
{
|
{
|
||||||
|
BOOL* pFlag = (BOOL*)arg;
|
||||||
|
*pFlag = TRUE;
|
||||||
|
if (result != AES_RESULT_SUCCESS)
|
||||||
|
{
|
||||||
|
OS_TPrintf("Failed to decrypt by AES (%d)\n", result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GetAesCounter( AESCounter* pCounter, u32 offset )
|
static void CopyWithAes( const void* src, void* dest, u32 size )
|
||||||
{
|
{
|
||||||
MI_CpuCopy32( rh->s.main_static_digest, pCounter, AES_BLOCK_SIZE );
|
volatile BOOL aesBusy = TRUE;
|
||||||
AESi_AddCounter( pCounter, offset - rh->s.aes_target_rom_offset );
|
if ( AES_RESULT_SUCCESS == AES_CtrDecrypt( rh->s.developer_encrypt ? AES_KEY_TYPE_RAW : AES_KEY_TYPE_APP,
|
||||||
|
&aesCounter, src, size, dest, AesCallback, (void*)&aesBusy) )
|
||||||
|
{
|
||||||
|
while (aesBusy)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AES_AddToCounter( &aesCounter, size / AES_BLOCK_SIZE );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void EnableAes( u32 offset )
|
||||||
|
{
|
||||||
|
aesFlag = TRUE;
|
||||||
|
MI_CpuCopy8( rh->s.main_static_digest, &aesCounter, AES_BLOCK_SIZE );
|
||||||
|
AES_AddToCounter( &aesCounter, (offset - rh->s.aes_target_rom_offset) / AES_BLOCK_SIZE );
|
||||||
|
}
|
||||||
|
static void DisableAes( void )
|
||||||
|
{
|
||||||
|
aesFlag = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -438,22 +496,23 @@ static u32 GetSrlTransferSize( u32 offset, u32 size )
|
|||||||
{
|
{
|
||||||
if ( offset >= aes_offset && offset < aes_end )
|
if ( offset >= aes_offset && offset < aes_end )
|
||||||
{
|
{
|
||||||
AESCounter counter;
|
|
||||||
if ( end > aes_end )
|
if ( end > aes_end )
|
||||||
{
|
{
|
||||||
size = aes_end - offset;
|
size = aes_end - offset;
|
||||||
}
|
}
|
||||||
//AESi_WaitKey(); // ドライバAPI経由?
|
if ( size >= HW_FIRM_FS_AES_BUFFER_SIZE )
|
||||||
|
{
|
||||||
|
size = HW_FIRM_FS_AES_BUFFER_SIZE;
|
||||||
|
}
|
||||||
if ( rh->s.developer_encrypt )
|
if ( rh->s.developer_encrypt )
|
||||||
{
|
{
|
||||||
//AESi_LoadKey( AES_KEY_SLOT_C ); // ドライバAPI経由?
|
AES_SetKey( AES_KEY_TYPE_RAW, FS_GetAesKeySeed() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//AESi_LoadKey( AES_KEY_SLOT_A ); // ドライバAPI経由?
|
AES_SetKey( AES_KEY_TYPE_APP, FS_GetAesKeySeed() );
|
||||||
}
|
}
|
||||||
GetAesCounter( &counter, offset );
|
EnableAes( offset );
|
||||||
EnableAes( &counter );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -499,9 +558,21 @@ BOOL FS_LoadSrlModule( FSFile *pFile, u8* dest, u32 offset, u32 size, const u8 d
|
|||||||
while ( size > 0 )
|
while ( size > 0 )
|
||||||
{
|
{
|
||||||
u32 unit = GetSrlTransferSize( offset, size );
|
u32 unit = GetSrlTransferSize( offset, size );
|
||||||
if ( !FS_ReadFile( pFile, dest, (s32)unit ) )
|
if (aesFlag)
|
||||||
{
|
{
|
||||||
return FALSE;
|
if ( !FS_ReadFile( pFile, aesBuffer, (s32)unit ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
DC_FlushRange( aesBuffer, unit );
|
||||||
|
CopyWithAes( aesBuffer, dest, unit );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !FS_ReadFile( pFile, dest, (s32)unit ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dest += unit;
|
dest += unit;
|
||||||
offset += unit;
|
offset += unit;
|
||||||
@ -569,6 +640,9 @@ BOOL FS_LoadSrlHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_
|
|||||||
|
|
||||||
// ダイジェスト以外のデータのチェックが必要!!
|
// ダイジェスト以外のデータのチェックが必要!!
|
||||||
|
|
||||||
|
// Œ®‚̕ۑ¶
|
||||||
|
MI_CpuCopy8( (AESKey*)sd.aes_key_seed, &FSiAesKeySeed, sizeof(FSiAesKeySeed) );
|
||||||
|
|
||||||
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
||||||
return CheckDigest( md, digest, TRUE, TRUE );
|
return CheckDigest( md, digest, TRUE, TRUE );
|
||||||
}
|
}
|
||||||
|
|||||||
@ -177,11 +177,13 @@ void PXI_NotifyID( FIRMPxiID id )
|
|||||||
while ( 0 > PXI_SendWordByFifo( PXI_FIFO_TAG_USER_1, id, 0 ) )
|
while ( 0 > PXI_SendWordByFifo( PXI_FIFO_TAG_USER_1, id, 0 ) )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
OS_TPrintf("[ARM9] Notify: %d\n", (u8)id);
|
OS_TPrintf("[ARM9] Notify: %d\n", (u8)id);
|
||||||
#else
|
#else
|
||||||
OS_TPrintf("[ARM7] Notify: %d\n", (u8)id);
|
OS_TPrintf("[ARM7] Notify: %d\n", (u8)id);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -204,10 +206,12 @@ FIRMPxiID PXI_RecvID( void )
|
|||||||
work.rp = ( work.rp + 1 ) % PXI_FIRM_ID_MAX;
|
work.rp = ( work.rp + 1 ) % PXI_FIRM_ID_MAX;
|
||||||
id = (FIRMPxiID)work.id[work.rp];
|
id = (FIRMPxiID)work.id[work.rp];
|
||||||
OS_RestoreInterrupts( enabled );
|
OS_RestoreInterrupts( enabled );
|
||||||
|
#if 0
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
OS_TPrintf("[ARM9] Received: %d\n", id);
|
OS_TPrintf("[ARM9] Received: %d\n", id);
|
||||||
#else
|
#else
|
||||||
OS_TPrintf("[ARM7] Received: %d\n", id);
|
OS_TPrintf("[ARM7] Received: %d\n", id);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,7 @@ SUBDIRS = \
|
|||||||
nandfirm-print \
|
nandfirm-print \
|
||||||
sdmc-launcher \
|
sdmc-launcher \
|
||||||
menu-launcher \
|
menu-launcher \
|
||||||
|
menu-launcher2 \
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,6 @@
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#include <firm.h>
|
#include <firm.h>
|
||||||
#include <twl/mcu.h>
|
#include <twl/mcu.h>
|
||||||
#include <twl/os/ARM7/debugLED.h>
|
|
||||||
|
|
||||||
#define FATFS_HEAP_SIZE (1024) // FATFS用ヒープ (サイズ調整必要)
|
#define FATFS_HEAP_SIZE (1024) // FATFS用ヒープ (サイズ調整必要)
|
||||||
|
|
||||||
@ -141,14 +140,6 @@ static BOOL FsInit(void)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 systemId;
|
|
||||||
static void PxiSystemCallback( PXIFifoTag tag, u32 data, BOOL err )
|
|
||||||
{
|
|
||||||
(void)tag;
|
|
||||||
(void)err;
|
|
||||||
systemId = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void IdleThread(void* arg)
|
static void IdleThread(void* arg)
|
||||||
{
|
{
|
||||||
OS_EnableInterrupts();
|
OS_EnableInterrupts();
|
||||||
@ -210,11 +201,6 @@ PXI_RecvID();
|
|||||||
SetDebugLED(0x01);
|
SetDebugLED(0x01);
|
||||||
PXI_RecvID();
|
PXI_RecvID();
|
||||||
SetDebugLED(0x02);
|
SetDebugLED(0x02);
|
||||||
PXI_RecvID();
|
|
||||||
SetDebugLED(0x03);
|
|
||||||
PXI_RecvID();
|
|
||||||
SetDebugLED(0x04);
|
|
||||||
|
|
||||||
|
|
||||||
if ( PXI_RecvID() != FIRM_PXI_ID_SET_PATH )
|
if ( PXI_RecvID() != FIRM_PXI_ID_SET_PATH )
|
||||||
{
|
{
|
||||||
@ -266,15 +252,24 @@ SetDebugLED(0x04);
|
|||||||
|
|
||||||
PM_BackLightOn( FALSE );
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
AESi_InitKeysFIRM();
|
||||||
|
AESi_RecvSeed();
|
||||||
|
|
||||||
|
// 9: after AESi_RecvSeed
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x8b
|
||||||
|
|
||||||
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
if ( !FS_LoadStatic( fd ) )
|
if ( !FS_LoadStatic( fd ) )
|
||||||
{
|
{
|
||||||
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
OS_TPrintf("Failed to call FS_LoadStatic().\n");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 9: after FS_LoadStatic
|
// 10: after FS_LoadStatic
|
||||||
PUSH_PROFILE();
|
PUSH_PROFILE();
|
||||||
SetDebugLED(++step); // 0x8b
|
SetDebugLED(++step); // 0x8c
|
||||||
|
|
||||||
PM_BackLightOn( FALSE );
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
@ -284,7 +279,7 @@ SetDebugLED(0x04);
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10: after PXI
|
// 11: after PXI
|
||||||
PUSH_PROFILE();
|
PUSH_PROFILE();
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
{
|
{
|
||||||
|
|||||||
@ -98,26 +98,16 @@ static void PreInit(void)
|
|||||||
/***************************************************************
|
/***************************************************************
|
||||||
PostInit
|
PostInit
|
||||||
|
|
||||||
FS_LoadHeader前にかなり(数100msec)時間があるので、可能なら
|
各種初期化
|
||||||
OS_Init後にいろいろ処理したい!
|
|
||||||
メインメモリの初期化
|
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
static void PostInit(void)
|
static void PostInit(void)
|
||||||
{
|
{
|
||||||
/*
|
// RSA用ヒープ設定
|
||||||
メインメモリ関連
|
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
|
||||||
*/
|
// HMAC用鍵準備
|
||||||
// ARM9領域を全クリア
|
FS_SetDigestKey( NULL );
|
||||||
if ( (u8)OS_GetResetParameter() )
|
// FS/FATFS初期化
|
||||||
{
|
FS_InitFIRM();
|
||||||
MI_CpuClearFast( (void*)HW_FIRM_RESET_BUF_END, HW_TWL_MAIN_MEM_MAIN_END-HW_FIRM_RESET_BUF_END );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MI_CpuClearFast( (void*)HW_MAIN_MEM_MAIN, HW_MAIN_MEM_MAIN_SIZE );
|
|
||||||
}
|
|
||||||
|
|
||||||
DC_FlushAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
@ -183,39 +173,25 @@ void TwlMain( void )
|
|||||||
// 1: after PXI
|
// 1: after PXI
|
||||||
PUSH_PROFILE();
|
PUSH_PROFILE();
|
||||||
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
||||||
//PostInit();
|
|
||||||
|
PostInit();
|
||||||
|
|
||||||
// 2: after PostInit
|
// 2: after PostInit
|
||||||
PUSH_PROFILE();
|
PUSH_PROFILE();
|
||||||
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
||||||
|
|
||||||
// RSA用ヒープ設定
|
|
||||||
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
|
|
||||||
// HMAC用鍵準備
|
|
||||||
FS_SetDigestKey( NULL );
|
|
||||||
|
|
||||||
// 3: after SVC_InitSignHeap
|
|
||||||
PUSH_PROFILE();
|
|
||||||
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
|
||||||
|
|
||||||
FS_InitFIRM();
|
|
||||||
|
|
||||||
// 4: after FS_Init
|
|
||||||
PUSH_PROFILE();
|
|
||||||
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
|
||||||
|
|
||||||
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
||||||
{
|
{
|
||||||
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5: 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 );
|
||||||
|
|
||||||
// 6: 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() )
|
||||||
@ -224,12 +200,18 @@ PXI_NotifyID( FIRM_PXI_ID_NULL );
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7: 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 );
|
||||||
|
|
||||||
// 8: after PXI
|
// 6: after PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
AESi_SendSeed( FS_GetAesKeySeed() );
|
||||||
|
FS_DeleteAesKeySeed();
|
||||||
|
|
||||||
|
// 7: after AESi_SendSeed
|
||||||
PUSH_PROFILE();
|
PUSH_PROFILE();
|
||||||
|
|
||||||
if ( !FS_LoadStatic() )
|
if ( !FS_LoadStatic() )
|
||||||
@ -238,12 +220,12 @@ PXI_NotifyID( FIRM_PXI_ID_NULL );
|
|||||||
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
|
||||||
{
|
{
|
||||||
|
|||||||
51
build/nandfirm/menu-launcher2/ARM7/Makefile
Normal file
51
build/nandfirm/menu-launcher2/ARM7/Makefile
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlFirm - tools - menu-launcher2
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev:$
|
||||||
|
# $Author:$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TWL_PROC = ARM7
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
LINCLUDES = ../include
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TARGET_BIN = menu_launcher2_7.tef
|
||||||
|
|
||||||
|
SRCS = main.c
|
||||||
|
|
||||||
|
CRT0_O = crt0_firm.o
|
||||||
|
|
||||||
|
#LCFILE_TEMPLATE = $(FIRM_SPECDIR)/$(TWL_PROC)-$(TWL_PLATFORM)-PARTNER.lcf.template
|
||||||
|
|
||||||
|
#SRCDIR = # using default
|
||||||
|
#LCFILE = # using default
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
LLIBRARIES += libaes_sp$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037c0000'
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
280
build/nandfirm/menu-launcher2/ARM7/main.c
Normal file
280
build/nandfirm/menu-launcher2/ARM7/main.c
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlFirm - nandfirm - menu-launcher2
|
||||||
|
File: main.c
|
||||||
|
|
||||||
|
Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <firm.h>
|
||||||
|
#include <twl/mcu.h>
|
||||||
|
#include <twl/aes.h>
|
||||||
|
|
||||||
|
#define FATFS_HEAP_SIZE (1024) // FATFS用ヒープ (サイズ調整必要)
|
||||||
|
|
||||||
|
#define THREAD_PRIO_FS 15
|
||||||
|
#define THREAD_PRIO_FATFS 8
|
||||||
|
#define FS_DMA_NO 3
|
||||||
|
|
||||||
|
static u8 fatfsHeap[FATFS_HEAP_SIZE] __attribute__ ((aligned (32)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。
|
||||||
|
利用するためには、main.cかどこかに、u32 profile[256]; u32 pf_cnt = 0; を
|
||||||
|
定義する必要があります。
|
||||||
|
*/
|
||||||
|
#define PROFILE_ENABLE
|
||||||
|
|
||||||
|
/*
|
||||||
|
デバッグLEDをFINALROMとは別にOn/Offできます。
|
||||||
|
*/
|
||||||
|
#define USE_DEBUG_LED
|
||||||
|
|
||||||
|
//#ifdef SDK_FINALROM // FINALROMで無効化
|
||||||
|
//#undef PROFILE_ENABLE
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
#ifdef PROFILE_ENABLE
|
||||||
|
#define PROFILE_MAX 16
|
||||||
|
u32 profile[PROFILE_MAX];
|
||||||
|
u32 pf_cnt = 0;
|
||||||
|
#define PUSH_PROFILE() (profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()))
|
||||||
|
#else
|
||||||
|
#define PUSH_PROFILE() ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_DEBUG_LED
|
||||||
|
static u8 step = 0x80;
|
||||||
|
#define InitDebugLED() I2Ci_WriteRegister(I2C_SLAVE_DEBUG_LED, 0x03, 0x00)
|
||||||
|
#define SetDebugLED(pattern) I2Ci_WriteRegister(I2C_SLAVE_DEBUG_LED, 0x01, (pattern));
|
||||||
|
#else
|
||||||
|
#define InitDebugLED() ((void)0)
|
||||||
|
#define SetDebugLED(pattern) ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
PreInit
|
||||||
|
|
||||||
|
FromBootの対応&メインメモリの初期化
|
||||||
|
OS_Init前なので注意 (ARM9によるメインメモリ初期化で消されないように注意)
|
||||||
|
***************************************************************/
|
||||||
|
static void PreInit(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
FromBrom関連
|
||||||
|
*/
|
||||||
|
if ( !OSi_FromBromToMenu() )
|
||||||
|
{
|
||||||
|
OS_Terminate();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
リセットパラメータ(1バイト)を共有領域(4バイト)にコピー
|
||||||
|
*/
|
||||||
|
#define FIRM_AVAILABLE_BIT 0x80000000UL
|
||||||
|
*(u32*)HW_RESET_PARAMETER_BUF = (u32)MCUi_ReadRegister( MCU_REG_TEMP_ADDR ) | FIRM_AVAILABLE_BIT;
|
||||||
|
/*
|
||||||
|
バッテリー残量チェック
|
||||||
|
*/
|
||||||
|
//if ( MCUi_ReadRegister( MCU_REG_BATTELY ) < 0x02 )
|
||||||
|
//if ( MCUi_ReadRegister( MCU_REG_IRQ ) & MCU_IRQ_NO_BATTELY )
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
EraseAll
|
||||||
|
|
||||||
|
不正終了しました
|
||||||
|
いろいろ消してください
|
||||||
|
DSモードにして終わるのがよいか?
|
||||||
|
***************************************************************/
|
||||||
|
static void EraseAll(void)
|
||||||
|
{
|
||||||
|
#ifdef SDK_FINALROM
|
||||||
|
MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE );
|
||||||
|
OS_BootFromFIRM();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
FsInit
|
||||||
|
|
||||||
|
FS周りの初期化
|
||||||
|
***************************************************************/
|
||||||
|
extern void* SDNandContext; /* NAND初期化パラメータ */
|
||||||
|
static BOOL FsInit(void)
|
||||||
|
{
|
||||||
|
/* FATFSライブラリ用にカレントヒープに設定 */
|
||||||
|
/* WRAM上のfatfsHeapをメインメモリヒープとして登録している */
|
||||||
|
{
|
||||||
|
OSHeapHandle hh;
|
||||||
|
u8 *lo = (u8*)fatfsHeap;
|
||||||
|
u8 *hi = (u8*)fatfsHeap + FATFS_HEAP_SIZE;
|
||||||
|
lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1);
|
||||||
|
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo);
|
||||||
|
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, OS_GetSubPrivArenaLo(), hi);
|
||||||
|
OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3: after OS_CreateHeap
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x85
|
||||||
|
|
||||||
|
SDNandContext = &OSi_GetFromFirmAddr()->SDNandContext;
|
||||||
|
|
||||||
|
//FS_Init( FS_DMA_NO ); // just CARD_Init
|
||||||
|
//FS_CreateReadServerThread( THREAD_PRIO_FS ); // just CARD_SetThreadPriority
|
||||||
|
|
||||||
|
if ( !FATFS_Init( FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwlSpMain( void )
|
||||||
|
{
|
||||||
|
InitDebugLED();
|
||||||
|
SetDebugLED(++step); // 0x81
|
||||||
|
|
||||||
|
PreInit();
|
||||||
|
|
||||||
|
// 0: before PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x82
|
||||||
|
|
||||||
|
OS_InitFIRM();
|
||||||
|
OS_EnableIrq();
|
||||||
|
OS_EnableInterrupts();
|
||||||
|
|
||||||
|
// 1: after PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x83
|
||||||
|
|
||||||
|
PM_InitFIRM();
|
||||||
|
AES_Init();
|
||||||
|
|
||||||
|
// 2: after PM_InitFIRM
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x84
|
||||||
|
|
||||||
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
if ( !FsInit() )
|
||||||
|
{
|
||||||
|
OS_TPrintf("Failed to call FsInit().\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4: after FS_Init
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x86
|
||||||
|
|
||||||
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
PXI_RecvID();
|
||||||
|
SetDebugLED(0x01);
|
||||||
|
PXI_RecvID();
|
||||||
|
SetDebugLED(0x02);
|
||||||
|
|
||||||
|
// 5:
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x87
|
||||||
|
|
||||||
|
//PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
// 6:
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x88
|
||||||
|
|
||||||
|
//PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
// 7:
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x89
|
||||||
|
|
||||||
|
//PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
if ( PXI_RecvID() != FIRM_PXI_ID_DONE_HEADER )
|
||||||
|
{
|
||||||
|
OS_TPrintf("PXI_RecvID() was received invalid value (!=FIRM_PXI_ID_DONE_HEADER).\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8: after PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x8a
|
||||||
|
|
||||||
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
AESi_InitKeysFIRM();
|
||||||
|
AESi_RecvSeed();
|
||||||
|
|
||||||
|
// 9: after AESi_RecvSeed
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x8b
|
||||||
|
|
||||||
|
PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
// 10:
|
||||||
|
PUSH_PROFILE();
|
||||||
|
SetDebugLED(++step); // 0x8c
|
||||||
|
|
||||||
|
//PM_BackLightOn( FALSE );
|
||||||
|
|
||||||
|
if ( PXI_RecvID() != FIRM_PXI_ID_DONE_STATIC )
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
MI_CpuCopy8( profile, (void*)0x02000080, sizeof(profile) );
|
||||||
|
PXI_RecvID();
|
||||||
|
OS_TPrintf("\n[ARM7] Begin\n");
|
||||||
|
for (i = 0; i < PROFILE_MAX; i++)
|
||||||
|
{
|
||||||
|
// OS_TPrintf("0x%08X\n", profile[i]);
|
||||||
|
if ( !profile[i] ) break;
|
||||||
|
OS_TPrintf("%2d: %7d usec", i, profile[i]);
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
OS_TPrintf(" ( %7d usec )\n", profile[i]-profile[i-1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OS_TPrintf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OS_TPrintf("\n[ARM7] End\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
SetDebugLED( 0 );
|
||||||
|
PM_BackLightOn( TRUE ); // last chance
|
||||||
|
|
||||||
|
OS_BootFromFIRM();
|
||||||
|
|
||||||
|
end:
|
||||||
|
SetDebugLED( (u8)(0xF0 | step));
|
||||||
|
|
||||||
|
EraseAll();
|
||||||
|
|
||||||
|
// failed
|
||||||
|
// while (1)
|
||||||
|
{
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_ERR );
|
||||||
|
}
|
||||||
|
OS_Terminate();
|
||||||
|
}
|
||||||
|
|
||||||
55
build/nandfirm/menu-launcher2/ARM9/Makefile
Normal file
55
build/nandfirm/menu-launcher2/ARM9/Makefile
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlFirm - nandfirm - menu-launcher2
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev:$
|
||||||
|
# $Author:$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
LINCLUDES = ../include
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TARGET_BIN = menu_launcher2_9.srl
|
||||||
|
|
||||||
|
SRCS = main.c
|
||||||
|
|
||||||
|
CRT0_O = crt0_firm.o
|
||||||
|
|
||||||
|
MAKEROM_ARM7 = ../ARM7/bin/$(TWL_BUILDTYPE_ARM7)/menu_launcher2_7.tef
|
||||||
|
MAKEROM_ARM7_BASE = $(basename $(MAKEROM_ARM7))
|
||||||
|
|
||||||
|
#LCFILE_TEMPLATE = $(FIRM_SPECDIR)/$(TWL_PROC)-$(TWL_PLATFORM)-PARTNER.lcf.template
|
||||||
|
|
||||||
|
#SRCDIR = # using default
|
||||||
|
#LCFILE = # using default
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
# no thumb version
|
||||||
|
|
||||||
|
#LLIBRARIES += libese$(TWL_LIBSUFFIX).a
|
||||||
|
LLIBRARIES += libese.TWL$(ARCHGEN_TYPE).a
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
273
build/nandfirm/menu-launcher2/ARM9/main.c
Normal file
273
build/nandfirm/menu-launcher2/ARM9/main.c
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlFirm - nandfirm - menu-launcher2
|
||||||
|
File: main.c
|
||||||
|
|
||||||
|
Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <firm.h>
|
||||||
|
#include <twl/aes.h>
|
||||||
|
|
||||||
|
/* 鍵はどこへ? */
|
||||||
|
#if 0
|
||||||
|
#define RSA_KEY_ADDR OSi_GetFromFirmAddr()->rsa_pubkey[7]
|
||||||
|
#else
|
||||||
|
#define RSA_KEY_ADDR rsa_key
|
||||||
|
static const u8 rsa_key[128] =
|
||||||
|
{
|
||||||
|
0xdf, 0x56, 0x30,
|
||||||
|
0xc9, 0xae, 0x05, 0x55, 0xe8, 0xdf, 0xbe, 0xe6, 0xb9, 0x30, 0xb9, 0x76, 0x93, 0xb4, 0xc2, 0x20,
|
||||||
|
0xe7, 0xae, 0x4c, 0x3e, 0xc3, 0xed, 0x27, 0xcf, 0x5d, 0x4f, 0xb5, 0x7d, 0xde, 0x38, 0xbc, 0xfe,
|
||||||
|
0x25, 0x32, 0xd8, 0x23, 0x98, 0x52, 0xb5, 0xda, 0xf7, 0x39, 0xdc, 0xb3, 0x0a, 0x94, 0x7a, 0x2b,
|
||||||
|
0x79, 0xe6, 0xe0, 0x4c, 0xbc, 0x21, 0xbd, 0x59, 0xb2, 0xc7, 0xf1, 0xc0, 0xf1, 0xfb, 0x29, 0x75,
|
||||||
|
0xa1, 0x21, 0x93, 0x01, 0x29, 0x1c, 0x9a, 0xe1, 0x2d, 0x55, 0xfc, 0x7b, 0xb8, 0xcb, 0x07, 0x33,
|
||||||
|
0xc5, 0x91, 0x0d, 0xc8, 0x45, 0x59, 0xef, 0xbe, 0x58, 0xc7, 0xc1, 0x1d, 0xd5, 0xf2, 0xcf, 0x1f,
|
||||||
|
0xe0, 0x6d, 0x21, 0x00, 0xcd, 0x42, 0xd8, 0x84, 0x85, 0xe3, 0xb2, 0x02, 0x1a, 0xa5, 0x89, 0x02,
|
||||||
|
0xa1, 0x96, 0xc6, 0xf7, 0x61, 0x68, 0x66, 0xe6, 0x65, 0x12, 0xb7, 0xf1, 0x49
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define RSA_HEAP_SIZE (4*1024) // RSA用ヒープサイズ (サイズ調整必要)
|
||||||
|
|
||||||
|
static u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32)));
|
||||||
|
static SVCSignHeapContext acPool;
|
||||||
|
|
||||||
|
#define MENU_TITLE_ID 0x0001000152434e4cULL
|
||||||
|
|
||||||
|
/*
|
||||||
|
PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。
|
||||||
|
利用するためには、main.cかどこかに、u32 profile[256]; u32 pf_cnt = 0; を
|
||||||
|
定義する必要があります。
|
||||||
|
*/
|
||||||
|
#define PROFILE_ENABLE
|
||||||
|
|
||||||
|
//#ifdef SDK_FINALROM // FINALROMで無効化
|
||||||
|
//#undef PROFILE_ENABLE
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
#ifdef PROFILE_ENABLE
|
||||||
|
#define PROFILE_MAX 16
|
||||||
|
u32 profile[PROFILE_MAX];
|
||||||
|
u32 pf_cnt = 0;
|
||||||
|
#define PUSH_PROFILE() (profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()))
|
||||||
|
#else
|
||||||
|
#define PUSH_PROFILE() ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
PreInit
|
||||||
|
|
||||||
|
FromBootの対応&OS_Init前に必要なメインメモリの初期化
|
||||||
|
***************************************************************/
|
||||||
|
static void PreInit(void)
|
||||||
|
{
|
||||||
|
static const OSMountInfo firmSettings[] =
|
||||||
|
{
|
||||||
|
{ 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand", "/" },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
メインメモリ関連
|
||||||
|
*/
|
||||||
|
// SHARED領域クリア
|
||||||
|
MI_CpuClearFast((void *)HW_WRAM_EX_LOCK_BUF, (HW_WRAM_EX_LOCK_BUF_END - HW_WRAM_EX_LOCK_BUF));
|
||||||
|
MI_CpuClearFast((void *)HW_BIOS_EXCP_STACK_MAIN, (HW_REAL_TIME_CLOCK_BUF - HW_BIOS_EXCP_STACK_MAIN));
|
||||||
|
MI_CpuClearFast((void *)HW_PXI_SIGNAL_PARAM_ARM9, (HW_MMEMCHECKER_MAIN - HW_PXI_SIGNAL_PARAM_ARM9));
|
||||||
|
MI_CpuClearFast((void*)HW_ROM_HEADER_BUF, (HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF));
|
||||||
|
|
||||||
|
// FS_MOUNT領域の初期化
|
||||||
|
MI_CpuCopy8(firmSettings, (char*)HW_TWL_FS_MOUNT_INFO_BUF, sizeof(firmSettings));
|
||||||
|
|
||||||
|
/*
|
||||||
|
FromBrom関連
|
||||||
|
*/
|
||||||
|
if ( !OSi_FromBromToMenu() )
|
||||||
|
{
|
||||||
|
OS_Terminate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
PostInit
|
||||||
|
|
||||||
|
各種初期化
|
||||||
|
***************************************************************/
|
||||||
|
static void PostInit(void)
|
||||||
|
{
|
||||||
|
AES_Init();
|
||||||
|
// RSA用ヒープ設定
|
||||||
|
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
|
||||||
|
// HMAC用鍵準備
|
||||||
|
FS_SetDigestKey( NULL );
|
||||||
|
// FS/FATFS初期化
|
||||||
|
FS_InitFIRM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
CheckHeader
|
||||||
|
|
||||||
|
ヘッダがシステムメニューとして問題ないかチェック
|
||||||
|
先頭32Bは固定値と思われ (リマスターバージョンは違うかな)
|
||||||
|
***************************************************************/
|
||||||
|
static BOOL CheckHeader(void)
|
||||||
|
{
|
||||||
|
static ROM_Header_Short* const rhs = (ROM_Header_Short*)HW_TWL_ROM_HEADER_BUF;
|
||||||
|
// TODO
|
||||||
|
// イニシャルコード
|
||||||
|
OS_TPrintf("Initial Code : %08X\n", rhs->game_code);
|
||||||
|
// エントリポイント
|
||||||
|
OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address);
|
||||||
|
OS_TPrintf("ARM7 Entry point : %08X\n", rhs->sub_entry_address);
|
||||||
|
// ロード範囲
|
||||||
|
OS_TPrintf("ARM9 ROM address : %08X\n", rhs->main_rom_offset);
|
||||||
|
OS_TPrintf("ARM9 RAM address : %08X\n", rhs->main_ram_address);
|
||||||
|
OS_TPrintf("ARM9 size : %08X\n", rhs->main_size);
|
||||||
|
OS_TPrintf("ARM7 ROM address : %08X\n", rhs->sub_rom_offset);
|
||||||
|
OS_TPrintf("ARM7 RAM address : %08X\n", rhs->sub_ram_address);
|
||||||
|
OS_TPrintf("ARM7 size : %08X\n", rhs->sub_size);
|
||||||
|
OS_TPrintf("ARM9 LTD ROM address: %08X\n", rhs->main_ltd_rom_offset);
|
||||||
|
OS_TPrintf("ARM9 LTD RAM address: %08X\n", rhs->main_ltd_ram_address);
|
||||||
|
OS_TPrintf("ARM9 LTD size : %08X\n", rhs->main_ltd_size);
|
||||||
|
OS_TPrintf("ARM7 LTD ROM address: %08X\n", rhs->sub_ltd_rom_offset);
|
||||||
|
OS_TPrintf("ARM7 LTD RAM address: %08X\n", rhs->sub_ltd_ram_address);
|
||||||
|
OS_TPrintf("ARM7 LTD size : %08X\n", rhs->sub_ltd_size);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
EraseAll
|
||||||
|
|
||||||
|
不正終了しました
|
||||||
|
いろいろ消してください
|
||||||
|
DSモードにして終わるのがよいか?
|
||||||
|
***************************************************************/
|
||||||
|
static void EraseAll(void)
|
||||||
|
{
|
||||||
|
#ifdef SDK_FINALROM
|
||||||
|
MI_CpuClearFast( (void*)HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE );
|
||||||
|
OS_BootFromFIRM();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwlMain( void )
|
||||||
|
{
|
||||||
|
FSFile file;
|
||||||
|
|
||||||
|
PreInit();
|
||||||
|
|
||||||
|
// 0: before PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
OS_InitFIRM();
|
||||||
|
OS_EnableIrq();
|
||||||
|
OS_EnableInterrupts();
|
||||||
|
|
||||||
|
#ifdef PROFILE_ENABLE
|
||||||
|
OS_InitTick();
|
||||||
|
#endif
|
||||||
|
// 1: after PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
||||||
|
|
||||||
|
PostInit();
|
||||||
|
|
||||||
|
// 2: after PostInit
|
||||||
|
PUSH_PROFILE();
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
||||||
|
|
||||||
|
if ( !FS_ResolveSrl( MENU_TITLE_ID ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("Failed to call FS_ResolveSrl( 0x%016llx ).\n", MENU_TITLE_ID);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3: after FS_ResolveSrl
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
if ( !FS_OpenSrl( &file ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("Failed to call FS_OpenSrl().\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4: after FS_OpenSrl
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
if ( !FS_LoadSrlHeader( &file, &acPool, RSA_KEY_ADDR ) || !CheckHeader() )
|
||||||
|
{
|
||||||
|
OS_TPrintf("Failed to call FS_LoadSrlHeader() and/or CheckHeader().\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5: after FS_LoadSrlHeader
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_DONE_HEADER );
|
||||||
|
|
||||||
|
// 6: after PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
AESi_SendSeed( FS_GetAesKeySeed() );
|
||||||
|
|
||||||
|
// 7: after AESi_SendSeed
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
if ( !FS_LoadSrlStatic( &file ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("Failed to call FS_LoadSrlStatic().\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8: after FS_LoadSrlStatic
|
||||||
|
PUSH_PROFILE();
|
||||||
|
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_DONE_STATIC );
|
||||||
|
|
||||||
|
// 9: after PXI
|
||||||
|
PUSH_PROFILE();
|
||||||
|
#ifdef PROFILE_ENABLE
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
OS_TPrintf("\n[ARM9] Begin\n");
|
||||||
|
for (i = 0; i < PROFILE_MAX; i++)
|
||||||
|
{
|
||||||
|
// OS_TPrintf("0x%08X\n", profile[i]);
|
||||||
|
if ( !profile[i] ) break;
|
||||||
|
OS_TPrintf("%2d: %7d usec", i, profile[i]);
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
OS_TPrintf(" ( %7d usec )\n", profile[i]-profile[i-1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OS_TPrintf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OS_TPrintf("\n[ARM9] End\n");
|
||||||
|
MI_CpuCopy8( profile, (void*)0x02000000, sizeof(profile) );
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
OS_BootFromFIRM();
|
||||||
|
|
||||||
|
end:
|
||||||
|
EraseAll();
|
||||||
|
|
||||||
|
// failed
|
||||||
|
// while (1)
|
||||||
|
{
|
||||||
|
PXI_NotifyID( FIRM_PXI_ID_ERR );
|
||||||
|
}
|
||||||
|
OS_Terminate();
|
||||||
|
}
|
||||||
|
|
||||||
52
build/nandfirm/menu-launcher2/Makefile
Normal file
52
build/nandfirm/menu-launcher2/Makefile
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlFirm - nandfirm - menu-launcher2
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev:$
|
||||||
|
# $Author:$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# if you have valid keys, set environment value like below
|
||||||
|
#export TWL_KEYSDIR='$(FIRM_ROOT)/../twl_firmware/bootrom/build/keys'
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS = \
|
||||||
|
wram_regs \
|
||||||
|
ARM7 \
|
||||||
|
ARM9 \
|
||||||
|
|
||||||
|
TARGET_FIRM_BIN = menu_launcher2-$(TWL_BUILD_TYPE)$(CODEGEN_ARCH).nand
|
||||||
|
BINDIR = .
|
||||||
|
MAKEFIRM_ARM9 = ARM9/bin/$(TWL_BUILDTYPE_ARM9)/menu_launcher2_9.tef
|
||||||
|
MAKEFIRM_ARM7 = ARM7/bin/$(TWL_BUILDTYPE_ARM7)/menu_launcher2_7.tef
|
||||||
|
MAKEFIRM_RSA_PRVKEY = $(TWL_KEYSDIR)/rsa/private_nand.der
|
||||||
|
LDEPENDS_BIN += wram_regs/wram_regs.rbin
|
||||||
|
|
||||||
|
MAKEFIRM_FLAGS += -p
|
||||||
|
FIRM_SPEC = nandfirm.nandsf
|
||||||
|
|
||||||
|
LDIRT_CLEAN += $(TARGETS) \
|
||||||
|
rsa_public.sbin \
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGET_BIN)
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
24
build/nandfirm/menu-launcher2/nandfirm.nandsf
Normal file
24
build/nandfirm/menu-launcher2/nandfirm.nandsf
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#NANDSF --- Nandfirm Spec File
|
||||||
|
|
||||||
|
VERSION : GENERATE
|
||||||
|
|
||||||
|
RSA_KEY : $(MAKEFIRM_RSA_PRVKEY)
|
||||||
|
OUT_KEY : rsa_public.sbin
|
||||||
|
|
||||||
|
WRAM_RBIN: ./wram_regs/wram_regs.rbin
|
||||||
|
|
||||||
|
MIRROR_OFS: 0x100000
|
||||||
|
|
||||||
|
DECOMP_PROC : ARM9 # ARM9 or ARM7
|
||||||
|
|
||||||
|
ARM9_COMP : FALSE # TRUE or FALSE, should be before ARM9_SBIN
|
||||||
|
ARM9_SBIN : $(MAKEFIRM_ARM9).TWL.FLX.sbin
|
||||||
|
ARM9_ELF : $(MAKEFIRM_ARM9).tef
|
||||||
|
|
||||||
|
ARM7_COMP : FALSE # TRUE or FALSE, should be before ARM7_SBIN
|
||||||
|
ARM7_SBIN : $(MAKEFIRM_ARM7).TWL.FLX.sbin
|
||||||
|
ARM7_ELF : $(MAKEFIRM_ARM7).tef
|
||||||
|
|
||||||
|
ARM9_X2 : TRUE # TRUE or FALSE
|
||||||
|
|
||||||
|
NCD_ROMOFS : 0x0f00
|
||||||
57
build/nandfirm/menu-launcher2/wram_regs/Makefile
Normal file
57
build/nandfirm/menu-launcher2/wram_regs/Makefile
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlFirm - nandfirm - menu-launcher2
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev:$
|
||||||
|
# $Author:$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
override TARGET_PLATFORM := TWL
|
||||||
|
override TARGET_CODEGEN := ARM
|
||||||
|
override TWL_ARCHGEN := LIMITED
|
||||||
|
|
||||||
|
override TARGET_FINALROM := TRUE
|
||||||
|
override TARGET_RELEASE :=
|
||||||
|
override TARGET_DEBUG :=
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
LINCLUDES = ../include
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TARGET_BIN = wram_regs.rbin
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
wram_regs.c \
|
||||||
|
|
||||||
|
#SRCDIR = # using default
|
||||||
|
#LCFILE = # using default
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_DIR = .
|
||||||
|
INSTALL_TARGETS = $(BINDIR)/$(TARGET_BIN)
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
91
build/nandfirm/menu-launcher2/wram_regs/wram_regs.c
Normal file
91
build/nandfirm/menu-launcher2/wram_regs/wram_regs.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlFirm - tools - nandfirm
|
||||||
|
File: wram_regs.c
|
||||||
|
|
||||||
|
Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <twl/mi.h>
|
||||||
|
#include <firm/format/wram_regs.h>
|
||||||
|
|
||||||
|
MIHeader_WramRegs wram_regs_init =
|
||||||
|
{
|
||||||
|
// ARM9
|
||||||
|
{
|
||||||
|
REG_MI_MBK_A0_FIELD( 1, MI_WRAM_A_OFFSET_0KB , MI_WRAM_ARM9 ),
|
||||||
|
REG_MI_MBK_A1_FIELD( 1, MI_WRAM_A_OFFSET_64KB , MI_WRAM_ARM9 ),
|
||||||
|
REG_MI_MBK_A2_FIELD( 1, MI_WRAM_A_OFFSET_128KB, MI_WRAM_ARM9 ),
|
||||||
|
REG_MI_MBK_A3_FIELD( 1, MI_WRAM_A_OFFSET_192KB, MI_WRAM_ARM9 ),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
REG_MI_MBK_B0_FIELD( 1, MI_WRAM_BC_OFFSET_0KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B1_FIELD( 1, MI_WRAM_BC_OFFSET_32KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B2_FIELD( 1, MI_WRAM_BC_OFFSET_64KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B3_FIELD( 1, MI_WRAM_BC_OFFSET_96KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B4_FIELD( 1, MI_WRAM_BC_OFFSET_128KB, MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B5_FIELD( 1, MI_WRAM_BC_OFFSET_160KB, MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B6_FIELD( 1, MI_WRAM_BC_OFFSET_192KB, MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_B7_FIELD( 1, MI_WRAM_BC_OFFSET_224KB, MI_WRAM_ARM7 ),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
REG_MI_MBK_C0_FIELD( 1, MI_WRAM_BC_OFFSET_0KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C1_FIELD( 1, MI_WRAM_BC_OFFSET_32KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C2_FIELD( 1, MI_WRAM_BC_OFFSET_64KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C3_FIELD( 1, MI_WRAM_BC_OFFSET_96KB , MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C4_FIELD( 1, MI_WRAM_BC_OFFSET_128KB, MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C5_FIELD( 1, MI_WRAM_BC_OFFSET_160KB, MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C6_FIELD( 1, MI_WRAM_BC_OFFSET_192KB, MI_WRAM_ARM7 ),
|
||||||
|
REG_MI_MBK_C7_FIELD( 1, MI_WRAM_BC_OFFSET_224KB, MI_WRAM_ARM7 ),
|
||||||
|
},
|
||||||
|
REG_MI_MBK6_FIELD( REG_WRAM_MAP_CONV_ADDR( 6, A, EADDR, HW_WRAM_AREA_HALF ),
|
||||||
|
MI_WRAM_IMAGE_256KB,
|
||||||
|
REG_WRAM_MAP_CONV_ADDR( 6, A, SADDR, HW_WRAM_AREA_HALF - HW_WRAM_A_SIZE )
|
||||||
|
),
|
||||||
|
REG_MI_MBK7_FIELD( REG_WRAM_MAP_CONV_ADDR( 7, B, EADDR, HW_WRAM_AREA + HW_WRAM_B_SIZE ),
|
||||||
|
MI_WRAM_IMAGE_256KB,
|
||||||
|
REG_WRAM_MAP_CONV_ADDR( 7, B, SADDR, HW_WRAM_AREA )
|
||||||
|
),
|
||||||
|
REG_MI_MBK8_FIELD( REG_WRAM_MAP_CONV_ADDR( 8, C, EADDR, MI_WRAM_MAP_NULL ),
|
||||||
|
MI_WRAM_IMAGE_256KB,
|
||||||
|
REG_WRAM_MAP_CONV_ADDR( 8, C, SADDR, MI_WRAM_MAP_NULL )
|
||||||
|
),
|
||||||
|
|
||||||
|
// ARM7
|
||||||
|
REG_MI_MBK6_FIELD( REG_WRAM_MAP_CONV_ADDR( 6, A, EADDR, MI_WRAM_MAP_NULL ),
|
||||||
|
MI_WRAM_IMAGE_256KB,
|
||||||
|
REG_WRAM_MAP_CONV_ADDR( 6, A, SADDR, MI_WRAM_MAP_NULL )
|
||||||
|
),
|
||||||
|
REG_MI_MBK7_FIELD( REG_WRAM_MAP_CONV_ADDR( 7, B, EADDR, HW_WRAM_AREA + HW_WRAM_B_SIZE ),
|
||||||
|
MI_WRAM_IMAGE_256KB,
|
||||||
|
REG_WRAM_MAP_CONV_ADDR( 7, B, SADDR, HW_WRAM_AREA )
|
||||||
|
),
|
||||||
|
REG_MI_MBK8_FIELD( REG_WRAM_MAP_CONV_ADDR( 8, C, EADDR, HW_WRAM_AREA_HALF - HW_WRAM_SIZE ),
|
||||||
|
MI_WRAM_IMAGE_256KB,
|
||||||
|
REG_WRAM_MAP_CONV_ADDR( 8, C, SADDR, HW_WRAM_AREA_HALF - HW_WRAM_SIZE - HW_WRAM_C_SIZE )
|
||||||
|
),
|
||||||
|
|
||||||
|
// WRAM Lock
|
||||||
|
{
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
|
||||||
|
// WRAM-0/1
|
||||||
|
3,
|
||||||
|
|
||||||
|
// VRAM-C
|
||||||
|
7,
|
||||||
|
// VRAM-D
|
||||||
|
7,
|
||||||
|
};
|
||||||
|
|
||||||
@ -18,6 +18,8 @@
|
|||||||
#ifndef TWL_AES_AES_INIT_H_
|
#ifndef TWL_AES_AES_INIT_H_
|
||||||
#define TWL_AES_AES_INIT_H_
|
#define TWL_AES_AES_INIT_H_
|
||||||
|
|
||||||
|
#include <twl/os/common/format_rom.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -37,6 +39,21 @@ extern "C" {
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void AESi_InitKeysForApp( u8 game_code[4] );
|
void AESi_InitKeysForApp( u8 game_code[4] );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: AESi_InitKeysFIRM
|
||||||
|
|
||||||
|
Description: set IDs depending on the application.
|
||||||
|
you SHOULD NOT touch any ID registers after this call.
|
||||||
|
|
||||||
|
Arguments: game_code game code
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static inline void AESi_InitKeysFIRM( void )
|
||||||
|
{
|
||||||
|
AESi_InitKeysForApp( (u8*)((ROM_Header_Short*)HW_TWL_ROM_HEADER_BUF)->game_code );
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: AESi_RecvSeed
|
Name: AESi_RecvSeed
|
||||||
|
|
||||||
|
|||||||
@ -37,9 +37,8 @@ extern "C" {
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static inline void AESi_SendSeed( AESKey *pSeed )
|
static inline void AESi_SendSeed( const AESKey *pSeed )
|
||||||
{
|
{
|
||||||
// PXI_SendDataByFifo( PXI_FIFO_TAG_DATA, pSeed, AES_BLOCK_SIZE );
|
|
||||||
PXI_SendStream( pSeed, AES_BLOCK_SIZE );
|
PXI_SendStream( pSeed, AES_BLOCK_SIZE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -35,6 +35,28 @@ extern "C" {
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void FS_InitFIRM( void );
|
void FS_InitFIRM( void );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_GetAesKeySeed
|
||||||
|
|
||||||
|
Description: retreive aes key seed in the signature
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: pointer to seed
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
AESKey* const FS_GetAesKeySeed( void );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_DeleteAesKeySeed
|
||||||
|
|
||||||
|
Description: delete aes key seed in the signature
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void FS_DeleteAesKeySeed( void );
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: FS_ResolveSrl
|
Name: FS_ResolveSrl
|
||||||
|
|
||||||
|
|||||||
@ -32,6 +32,10 @@ extern "C" {
|
|||||||
#define HW_FIRM_LOAD_BUFFER_END (HW_FIRM_LOAD_BUFFER_BASE + HW_FIRM_LOAD_BUFFER_SIZE)
|
#define HW_FIRM_LOAD_BUFFER_END (HW_FIRM_LOAD_BUFFER_BASE + HW_FIRM_LOAD_BUFFER_SIZE)
|
||||||
|
|
||||||
//------------------------------------- FS/FATFS
|
//------------------------------------- FS/FATFS
|
||||||
|
#define HW_FIRM_FS_AES_BUFFER 0x2ff0000
|
||||||
|
#define HW_FIRM_FS_AES_BUFFER_SIZE (HW_FIRM_FS_AES_BUFFER_END - HW_FIRM_FS_AES_BUFFER)
|
||||||
|
#define HW_FIRM_FS_AES_BUFFER_END HW_FIRM_FATFS_COMMAND_BUFFER_END
|
||||||
|
|
||||||
#define HW_FIRM_FATFS_COMMAND_BUFFER (HW_FIRM_FATFS_COMMAND_BUFFER_END - HW_FIRM_FATFS_COMMAND_BUFFER_SIZE)
|
#define HW_FIRM_FATFS_COMMAND_BUFFER (HW_FIRM_FATFS_COMMAND_BUFFER_END - HW_FIRM_FATFS_COMMAND_BUFFER_SIZE)
|
||||||
#define HW_FIRM_FATFS_COMMAND_BUFFER_SIZE FATFS_COMMAND_BUFFER_MAX // 0x800
|
#define HW_FIRM_FATFS_COMMAND_BUFFER_SIZE FATFS_COMMAND_BUFFER_MAX // 0x800
|
||||||
#define HW_FIRM_FATFS_COMMAND_BUFFER_END HW_FIRM_FS_TWMP_BUFFER // 0x02ff8000
|
#define HW_FIRM_FATFS_COMMAND_BUFFER_END HW_FIRM_FS_TWMP_BUFFER // 0x02ff8000
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user