mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
デバイス依存のアライメントに対応
メインメモリチェックルーチンにチップタイプとJTAGのチェックコードを追加 (しかしこのルーチン自体呼んでいない) ARM7側だけオートロードルーチンを呼んでいたのでコメントアウト リセットチェックルーチンのコメントアウト git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@71 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
1978d0fde1
commit
9774cca464
@ -29,6 +29,10 @@
|
|||||||
*/
|
*/
|
||||||
//#define PROFILE_ENABLE
|
//#define PROFILE_ENABLE
|
||||||
|
|
||||||
|
#define MODULE_ALIGNMENT 0x10 // 16バイト単位で読み込む
|
||||||
|
//#define MODULE_ALIGNMENT 0x200 // 512バイト単位で読み込む
|
||||||
|
#define RoundUpModuleSize(value) (((value) + MODULE_ALIGNMENT - 1) & -MODULE_ALIGNMENT)
|
||||||
|
|
||||||
#ifdef SDK_FINALROM // FINALROMで無効化
|
#ifdef SDK_FINALROM // FINALROMで無効化
|
||||||
#undef PROFILE_ENABLE
|
#undef PROFILE_ENABLE
|
||||||
#endif
|
#endif
|
||||||
@ -43,7 +47,7 @@ extern u32 pf_cnt;
|
|||||||
|
|
||||||
#define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0
|
#define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0
|
||||||
|
|
||||||
static ROM_Header* const rh= (ROM_Header*)(HW_MAIN_MEM_SYSTEM_END - 0x2000);
|
static ROM_Header* const rh= (ROM_Header*)HW_TWL_ROM_HEADER_BUF;
|
||||||
static int menu_fd = -1;
|
static int menu_fd = -1;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -124,6 +128,14 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile )
|
|||||||
SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。
|
SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。
|
||||||
(ROMヘッダ部分は元から知っているはず)
|
(ROMヘッダ部分は元から知っているはず)
|
||||||
|
|
||||||
|
補足:
|
||||||
|
ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを
|
||||||
|
前提にしているが、汎用的にするには(独立ライブラリ化するなら)、
|
||||||
|
送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック
|
||||||
|
&スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に
|
||||||
|
destとsizeを通知するという形でOKではないか?
|
||||||
|
(で完了したら返事を返す)
|
||||||
|
|
||||||
Arguments: offset offset of the file to load (512 bytes alignment)
|
Arguments: offset offset of the file to load (512 bytes alignment)
|
||||||
size size to load
|
size size to load
|
||||||
|
|
||||||
@ -285,15 +297,15 @@ static AESCounter* FATFSi_GetCounter( u32 offset )
|
|||||||
makerom.TWLまたはIPLの使用に依存します。
|
makerom.TWLまたはIPLの使用に依存します。
|
||||||
|
|
||||||
Arguments: offset offset of region from head of ROM_Header
|
Arguments: offset offset of region from head of ROM_Header
|
||||||
size size of region
|
size size of region (for check only)
|
||||||
|
|
||||||
Returns: counter
|
Returns: counter
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static void FATFSi_SetupAES( u32 offset, u32 size )
|
static void FATFSi_SetupAES( u32 offset, u32 size )
|
||||||
{
|
{
|
||||||
if ( rh->s.enable_aes &&
|
u32 aes_end = rh->s.aes_target_rom_offset + RoundUpModuleSize(rh->s.aes_target_size);
|
||||||
offset >= rh->s.aes_target_rom_offset &&
|
u32 arg_end = offset + RoundUpModuleSize(size);
|
||||||
offset + size <= rh->s.aes_target_rom_offset + rh->s.aes_target_size )
|
if ( rh->s.enable_aes && offset >= rh->s.aes_target_rom_offset && arg_end <= aes_end )
|
||||||
{
|
{
|
||||||
AESi_WaitKey();
|
AESi_WaitKey();
|
||||||
if (rh->s.developer_encrypt)
|
if (rh->s.developer_encrypt)
|
||||||
@ -326,6 +338,9 @@ static void FATFSi_SetupAES( u32 offset, u32 size )
|
|||||||
このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが
|
このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが
|
||||||
格納されている必要があります。
|
格納されている必要があります。
|
||||||
|
|
||||||
|
ARM9側と異なり、デバイス依存のアライメント修正を行っています。
|
||||||
|
(サイズのみ)
|
||||||
|
|
||||||
Arguments: None
|
Arguments: None
|
||||||
|
|
||||||
Returns: TRUE if success
|
Returns: TRUE if success
|
||||||
@ -335,6 +350,7 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
// load ARM9 static region without AES
|
// load ARM9 static region without AES
|
||||||
if ( rh->s.main_size > 0 )
|
if ( rh->s.main_size > 0 )
|
||||||
{
|
{
|
||||||
|
u32 aligned = RoundUpModuleSize(rh->s.main_size);
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
// 30: before PXI
|
// 30: before PXI
|
||||||
pf_cnt = 0x30;
|
pf_cnt = 0x30;
|
||||||
@ -342,8 +358,8 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_STATIC; // checkpoint
|
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_STATIC; // checkpoint
|
||||||
#endif
|
#endif
|
||||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_STATIC );
|
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_STATIC );
|
||||||
FATFSi_SetupAES( rh->s.main_rom_offset, rh->s.main_size );
|
FATFSi_SetupAES( rh->s.main_rom_offset, aligned );
|
||||||
if ( !FATFS_LoadBuffer( rh->s.main_rom_offset, rh->s.main_size ) ||
|
if ( !FATFS_LoadBuffer( rh->s.main_rom_offset, aligned ) ||
|
||||||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_STATIC )
|
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_STATIC )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -357,6 +373,7 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
// load ARM7 static region without AES
|
// load ARM7 static region without AES
|
||||||
if ( rh->s.sub_size > 0 )
|
if ( rh->s.sub_size > 0 )
|
||||||
{
|
{
|
||||||
|
u32 aligned = RoundUpModuleSize(rh->s.sub_size);
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
// 50: before PXI
|
// 50: before PXI
|
||||||
pf_cnt = 0x50;
|
pf_cnt = 0x50;
|
||||||
@ -364,8 +381,8 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_STATIC; // checkpoint
|
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_STATIC; // checkpoint
|
||||||
#endif
|
#endif
|
||||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_STATIC );
|
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_STATIC );
|
||||||
FATFSi_SetupAES( rh->s.sub_rom_offset, rh->s.sub_size );
|
FATFSi_SetupAES( rh->s.sub_rom_offset, aligned );
|
||||||
if ( !FATFS_LoadBuffer( rh->s.sub_rom_offset, rh->s.sub_size ) ||
|
if ( !FATFS_LoadBuffer( rh->s.sub_rom_offset, aligned ) ||
|
||||||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_STATIC )
|
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_STATIC )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -379,6 +396,7 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
// load ARM9 extended static region with AES
|
// load ARM9 extended static region with AES
|
||||||
if ( rh->s.main_ltd_size > 0 )
|
if ( rh->s.main_ltd_size > 0 )
|
||||||
{
|
{
|
||||||
|
u32 aligned = RoundUpModuleSize(rh->s.main_ltd_size);
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
// 70: before PXI
|
// 70: before PXI
|
||||||
pf_cnt = 0x70;
|
pf_cnt = 0x70;
|
||||||
@ -386,8 +404,8 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC; // checkpoint
|
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC; // checkpoint
|
||||||
#endif
|
#endif
|
||||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC );
|
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC );
|
||||||
FATFSi_SetupAES( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size );
|
FATFSi_SetupAES( rh->s.main_ltd_rom_offset, aligned );
|
||||||
if ( !FATFS_LoadBuffer( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size ) ||
|
if ( !FATFS_LoadBuffer( rh->s.main_ltd_rom_offset, aligned ) ||
|
||||||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC )
|
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -401,6 +419,7 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
// load ARM7 extended static region with AES
|
// load ARM7 extended static region with AES
|
||||||
if ( rh->s.sub_ltd_size > 0 )
|
if ( rh->s.sub_ltd_size > 0 )
|
||||||
{
|
{
|
||||||
|
u32 aligned = RoundUpModuleSize(rh->s.sub_ltd_size);
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
// 90: before PXI
|
// 90: before PXI
|
||||||
pf_cnt = 0x90;
|
pf_cnt = 0x90;
|
||||||
@ -408,8 +427,8 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC; // checkpoint
|
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC; // checkpoint
|
||||||
#endif
|
#endif
|
||||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC );
|
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC );
|
||||||
FATFSi_SetupAES( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size );
|
FATFSi_SetupAES( rh->s.sub_ltd_rom_offset, aligned );
|
||||||
if ( !FATFS_LoadBuffer( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size ) ||
|
if ( !FATFS_LoadBuffer( rh->s.sub_ltd_rom_offset, aligned ) ||
|
||||||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC )
|
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|||||||
@ -86,7 +86,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
mov r0, #HW_PSR_SYS_MODE
|
mov r0, #HW_PSR_SYS_MODE
|
||||||
msr cpsr_csfx, r0
|
msr cpsr_csfx, r0
|
||||||
sub sp, r1, #4 // 4byte for stack check code
|
sub sp, r1, #4 // 4byte for stack check code
|
||||||
|
#if 0 // not used in FIRM
|
||||||
//---- read reset flag from pmic
|
//---- read reset flag from pmic
|
||||||
#ifdef TWL_PLATFORM_TS
|
#ifdef TWL_PLATFORM_TS
|
||||||
mov r0, #REG_PMIC_SW_FLAGS_ADDR
|
mov r0, #REG_PMIC_SW_FLAGS_ADDR
|
||||||
@ -98,7 +98,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
mov r0, #FIRM_PXI_ID_INIT_MMEM
|
mov r0, #FIRM_PXI_ID_INIT_MMEM
|
||||||
bl PXI_WaitByIntf
|
bl PXI_WaitByIntf
|
||||||
#endif // TWL_PLATFORM_TS
|
#endif // TWL_PLATFORM_TS
|
||||||
|
#endif
|
||||||
//---- wait for main memory mode into burst mode
|
//---- wait for main memory mode into burst mode
|
||||||
ldr r3, =REG_EXMEMCNT_L_ADDR
|
ldr r3, =REG_EXMEMCNT_L_ADDR
|
||||||
mov r1, #REG_MI_EXMEMCNT_L_ECE2_MASK
|
mov r1, #REG_MI_EXMEMCNT_L_ECE2_MASK
|
||||||
@ -127,7 +127,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//---- load autoload block and initialize bss
|
//---- load autoload block and initialize bss
|
||||||
bl do_autoload
|
//bl do_autoload
|
||||||
|
|
||||||
//---- fill static static bss with 0
|
//---- fill static static bss with 0
|
||||||
ldr r0, =_start_ModuleParams
|
ldr r0, =_start_ModuleParams
|
||||||
@ -139,7 +139,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
bcc @2
|
bcc @2
|
||||||
|
|
||||||
//---- detect main memory size
|
//---- detect main memory size
|
||||||
// bl detect_main_memory_size // shared memory will be cleared
|
//bl detect_main_memory_size
|
||||||
|
|
||||||
//---- set interrupt vector
|
//---- set interrupt vector
|
||||||
ldr r1, =HW_INTR_VECTOR_BUF
|
ldr r1, =HW_INTR_VECTOR_BUF
|
||||||
@ -266,6 +266,7 @@ SDK_WEAK_SYMBOL asm void _start_AutoloadDoneCallback( void* argv[] )
|
|||||||
|
|
||||||
static asm void detect_main_memory_size( void )
|
static asm void detect_main_memory_size( void )
|
||||||
{
|
{
|
||||||
|
#if 0 // NITRO hardware is not supported
|
||||||
mov r0, #OS_CONSOLE_SIZE_4MB
|
mov r0, #OS_CONSOLE_SIZE_4MB
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
|
|
||||||
@ -292,7 +293,9 @@ static asm void detect_main_memory_size( void )
|
|||||||
tst r12, #REG_SCFG_CLK_WRAMHCLK_MASK
|
tst r12, #REG_SCFG_CLK_WRAMHCLK_MASK
|
||||||
moveq r0, #OS_CONSOLE_SIZE_8MB
|
moveq r0, #OS_CONSOLE_SIZE_8MB
|
||||||
beq @4
|
beq @4
|
||||||
|
#else
|
||||||
|
ldr r2, =HW_MMEMCHECKER_SUB
|
||||||
|
#endif
|
||||||
//---- 16MB or 32MB
|
//---- 16MB or 32MB
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
add r3, r2, #OSi_IMAGE_DIFFERENCE2
|
add r3, r2, #OSi_IMAGE_DIFFERENCE2
|
||||||
@ -310,6 +313,21 @@ static asm void detect_main_memory_size( void )
|
|||||||
mov r0, #OS_CONSOLE_SIZE_16MB
|
mov r0, #OS_CONSOLE_SIZE_16MB
|
||||||
@4:
|
@4:
|
||||||
strh r0, [r2]
|
strh r0, [r2]
|
||||||
|
|
||||||
|
//---- detect chiptype
|
||||||
|
ldr r2, =REG_OP_ADDR
|
||||||
|
ldrh r0, [r2]
|
||||||
|
and r0, r0, #REG_SCFG_OP_OPT_MASK
|
||||||
|
|
||||||
|
//---- detect jtag
|
||||||
|
ldr r2, =REG_JTAG_ADDR
|
||||||
|
ldrh r1, [r2]
|
||||||
|
and r1, r1, #REG_SCFG_JTAG_CPUJE_MASK
|
||||||
|
orr r0, r0, r1, LSL #1
|
||||||
|
|
||||||
|
ldr r2, =HW_CHIPTYPE_FLAG
|
||||||
|
strb r0, [r2]
|
||||||
|
|
||||||
bx lr
|
bx lr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -89,14 +89,15 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
mov r0, #HW_PSR_SYS_MODE
|
mov r0, #HW_PSR_SYS_MODE
|
||||||
msr cpsr_csfx, r0
|
msr cpsr_csfx, r0
|
||||||
sub sp, r1, #4 // 4byte for stack check code
|
sub sp, r1, #4 // 4byte for stack check code
|
||||||
//---- read reset flag from pmic
|
|
||||||
|
|
||||||
|
//---- read reset flag from pmic
|
||||||
#ifdef TWL_PLATFORM_TS
|
#ifdef TWL_PLATFORM_TS
|
||||||
|
#if 0
|
||||||
@0: bl PXI_RecvByIntf
|
@0: bl PXI_RecvByIntf
|
||||||
cmp r0, #FIRM_PXI_ID_COLDBOOT
|
cmp r0, #FIRM_PXI_ID_COLDBOOT
|
||||||
cmpne r0, #FIRM_PXI_ID_WARMBOOT
|
cmpne r0, #FIRM_PXI_ID_WARMBOOT
|
||||||
bne @0
|
bne @0
|
||||||
|
#endif
|
||||||
//---- initialize Main Memory
|
//---- initialize Main Memory
|
||||||
cmp r0, #FIRM_PXI_ID_COLDBOOT
|
cmp r0, #FIRM_PXI_ID_COLDBOOT
|
||||||
moveq r0, #TRUE
|
moveq r0, #TRUE
|
||||||
|
|||||||
@ -145,6 +145,14 @@ static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate
|
|||||||
SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。
|
SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。
|
||||||
(ROMヘッダ部分は元から知っているはず)
|
(ROMヘッダ部分は元から知っているはず)
|
||||||
|
|
||||||
|
補足:
|
||||||
|
ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを
|
||||||
|
前提にしているが、汎用的にするには(独立ライブラリ化するなら)、
|
||||||
|
送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック
|
||||||
|
&スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に
|
||||||
|
destとsizeを通知するという形でOKではないか?
|
||||||
|
(で完了したら返事を返す)
|
||||||
|
|
||||||
Arguments: dest destination address for received data
|
Arguments: dest destination address for received data
|
||||||
size size to load
|
size size to load
|
||||||
ctx context for SHA1 if execute SVC_SHA1Update
|
ctx context for SHA1 if execute SVC_SHA1Update
|
||||||
@ -178,8 +186,8 @@ static BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx)
|
|||||||
u8* s = src + done;
|
u8* s = src + done;
|
||||||
u8* d = dest + done;
|
u8* d = dest + done;
|
||||||
u32 u = unit < done + HASH_UNIT ? unit - done : HASH_UNIT;
|
u32 u = unit < done + HASH_UNIT ? unit - done : HASH_UNIT;
|
||||||
SVC_SHA1Update( ctx, s, u );
|
|
||||||
MI_CpuCopyFast( s, d, u );
|
MI_CpuCopyFast( s, d, u );
|
||||||
|
SVC_SHA1Update( ctx, s, u );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user