mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・FS_Initでハングアップしないように修正
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@322 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
51041cf86f
commit
8596bd4da8
@ -20,7 +20,8 @@
|
||||
|
||||
void FATFS_InitFIRM( void )
|
||||
{
|
||||
FATFSiCommandBuffer = (void*)FIRM_FATFS_COMMAND_BUFFER;
|
||||
MI_CpuClearFast( (void*)HW_FIRM_FATFS_COMMAND_BUFFER, HW_FIRM_FATFS_COMMAND_BUFFER_SIZE );
|
||||
FATFSiCommandBuffer = (void*)HW_FIRM_FATFS_COMMAND_BUFFER;
|
||||
FATFS_Init();
|
||||
}
|
||||
|
||||
|
||||
@ -40,7 +40,8 @@ static void ConvertPath( u16* dest, const char* src, u32 max)
|
||||
{
|
||||
if (len >= max) // もっと手前で止めても良い?
|
||||
{
|
||||
OS_TPanic("%s: Cannot detect ':' in %d charactors.\n", __func__, len);
|
||||
OS_TPrintf("%s: Cannot detect ':' in %d charactors.\n", __func__, len);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,7 +75,8 @@ static void ConvertPath( u16* dest, const char* src, u32 max)
|
||||
#ifndef SDK_FINALROM
|
||||
else if (src[len] & 0x80)
|
||||
{
|
||||
OS_TPanic("%s: Multi-byte charactor was detected (0x%02X).\n", __func__, src[len]);
|
||||
OS_TPrintf("%s: Multi-byte charactor was detected (0x%02X).\n", __func__, src[len]);
|
||||
dest[len] = (u16)src[len]; // ignore but maybe broken
|
||||
}
|
||||
#endif
|
||||
else
|
||||
@ -181,20 +183,21 @@ BOOL FS_LoadBuffer( int fd, u32 offset, u32 size )
|
||||
{
|
||||
static int count = 0;
|
||||
|
||||
if (fd < 0)
|
||||
if ( fd < 0 )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
// seek
|
||||
if ( FATFSi_rtfs_po_lseek(fd, (long)offset, PSEEK_SET) != (long)offset )
|
||||
if ( FATFSi_rtfs_po_lseek( fd, (long)offset, PSEEK_SET ) != (long)offset )
|
||||
{
|
||||
OS_TPrintf("Failed to seek file. (offset=0x%X)\n", offset);
|
||||
return FALSE;
|
||||
}
|
||||
while ( size > 0 )
|
||||
{
|
||||
u8* dest = (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;
|
||||
while ( MI_GetWramBankMaster_B(count) != MI_WRAM_ARM7 ) // wait to be ready
|
||||
while ( MI_GetWramBankMaster_B( count ) != MI_WRAM_ARM7 ) // wait to be ready
|
||||
{
|
||||
}
|
||||
#ifdef WORKAROUND_NAND_2KB_BUG
|
||||
@ -204,20 +207,22 @@ BOOL FS_LoadBuffer( int fd, u32 offset, u32 size )
|
||||
{
|
||||
u8* d = dest + done;
|
||||
u32 u = unit - done < 2048 ? unit - done : 2048;
|
||||
if ( FATFSi_rtfs_po_read(fd, (u8*)d, (int)u) != (int)u )
|
||||
if ( FATFSi_rtfs_po_read( fd, (u8*)d, (int)u ) != (int)u )
|
||||
{
|
||||
OS_TPrintf("Failed to read file. (dest=%p, size=0x%X)\n", d, u);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
if ( FATFSi_rtfs_po_read(fd, (u8*)dest, (int)unit) != (int)unit )
|
||||
if ( FATFSi_rtfs_po_read( fd, (u8*)dest, (int)unit ) != (int)unit )
|
||||
{
|
||||
OS_TPrintf("Failed to read file. (dest=%p, size=0x%X)\n", dest, unit);
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
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;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
@ -55,6 +55,23 @@ static const u8 defaultKey[ SVC_SHA1_BLOCK_SIZE ] =
|
||||
0x87, 0x46, 0x58, 0x24,
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: FS_InitFIRM
|
||||
|
||||
Description: initialize FS/FATFS for firm
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
void FS_InitFIRM( void )
|
||||
{
|
||||
MI_CpuClearFast( (void*)HW_FIRM_FS_TWMP_BUFFER, HW_FIRM_FS_TWMP_BUFFER_SIZE );
|
||||
FSiTemporaryBuffer = (void*)HW_FIRM_FS_TWMP_BUFFER;
|
||||
FATFS_InitFIRM();
|
||||
FS_Init( FS_DMA_NOT_USE );
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: FS_ResolveSrl
|
||||
|
||||
@ -174,7 +191,7 @@ BOOL FS_LoadBuffer( u8* dest, u32 size, SVCSHA1Context *ctx )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
MIi_SetWramBankMaster_B(count, MI_WRAM_ARM9);
|
||||
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM9 );
|
||||
if (ctx)
|
||||
{
|
||||
int done;
|
||||
@ -185,19 +202,19 @@ BOOL FS_LoadBuffer( u8* dest, u32 size, SVCSHA1Context *ctx )
|
||||
u32 u = unit - done < HASH_UNIT ? unit - done : HASH_UNIT;
|
||||
SVC_SHA1Update( ctx, s, u );
|
||||
MI_CpuCopyFast( s, d, u );
|
||||
MI_CpuClearFast( s, u );
|
||||
MI_CpuClearFast( s, u ); // OS_Bootでのクリアと比較する
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MI_CpuCopyFast( src, dest, unit );
|
||||
MI_CpuClearFast( src, unit );
|
||||
MI_CpuClearFast( src, unit ); // OS_Bootでのクリアと比較する
|
||||
}
|
||||
DC_FlushRange( src, unit );
|
||||
MIi_SetWramBankMaster_B(count, MI_WRAM_ARM7);
|
||||
count = (count + 1) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
size -= unit;
|
||||
dest += unit;
|
||||
MIi_SetWramBankMaster_B( count, MI_WRAM_ARM7 );
|
||||
count = ( count + 1 ) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@ -293,7 +310,6 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
||||
{
|
||||
SVCSHA1Context ctx;
|
||||
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||
u8 digest[SVC_SHA1_DIGEST_SIZE];
|
||||
SignatureData sd;
|
||||
|
||||
SVC_SHA1Init( &ctx );
|
||||
@ -319,12 +335,20 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
||||
|
||||
// ヘッダ署名チェック
|
||||
SVC_DecryptSign( pool, &sd, rh->signature, rsa_key );
|
||||
MI_CpuCopy8( sd.digest, digest, SVC_SHA1_DIGEST_SIZE ); // ダイジェストの取り出し
|
||||
|
||||
if ( !CheckDigest( md, sd.digest, TRUE, FALSE ) )
|
||||
{
|
||||
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// ダイジェスト以外のデータのチェックが必要!!
|
||||
|
||||
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
||||
return CheckDigest( md, digest, TRUE, TRUE );
|
||||
|
||||
// ROMヘッダのコピー
|
||||
MI_CpuCopyFast( rh, (void*)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
@ -419,14 +443,14 @@ static u32 GetSrlTransferSize( u32 offset, u32 size )
|
||||
{
|
||||
size = aes_end - offset;
|
||||
}
|
||||
AESi_WaitKey();
|
||||
//AESi_WaitKey(); // ドライバAPI経由?
|
||||
if ( rh->s.developer_encrypt )
|
||||
{
|
||||
AESi_LoadKey( AES_KEY_SLOT_C );
|
||||
//AESi_LoadKey( AES_KEY_SLOT_C ); // ドライバAPI経由?
|
||||
}
|
||||
else
|
||||
{
|
||||
AESi_LoadKey( AES_KEY_SLOT_A );
|
||||
//AESi_LoadKey( AES_KEY_SLOT_A ); // ドライバAPI経由?
|
||||
}
|
||||
GetAesCounter( &counter, offset );
|
||||
EnableAes( &counter );
|
||||
|
||||
@ -70,9 +70,9 @@ void OS_BootWithRomHeaderFromFIRM( ROM_Header* rom_header )
|
||||
mem_list[i++] = (u32)HW_ROM_HEADER_BUF - (u32)HW_ARENA_INFO_BUF;
|
||||
mem_list[i++] = (u32)HW_PXI_SIGNAL_PARAM_ARM9; // 0x02ffff80 - 0x02fffffd
|
||||
mem_list[i++] = (u32)HW_CMD_AREA - (u32)HW_PXI_SIGNAL_PARAM_ARM9;
|
||||
/* FATFSバッファ */
|
||||
mem_list[i++] = (u32)FIRM_FATFS_COMMAND_BUFFER; // 0x02ffc000 - 0x02ffc7ff
|
||||
mem_list[i++] = (u32)FIRM_FATFS_COMMAND_BUFFER_SIZE;
|
||||
/* FS/FATFSバッファ */
|
||||
mem_list[i++] = (u32)HW_FIRM_FATFS_COMMAND_BUFFER; // 0x02ff7800 - 0x02ffbfff
|
||||
mem_list[i++] = (u32)HW_FIRM_FS_TWMP_BUFFER_END - (u32)HW_FIRM_FATFS_COMMAND_BUFFER;
|
||||
#else // SDK_ARM7
|
||||
{ /* REBOOT_Execute‚ÌCODE‚ÆSTACK‚ÌŒ„ŠÔ‚ðƒNƒŠƒA */
|
||||
u32 stack_bottom = (u32)stack_top - OS_BOOT_STACK_SIZE_MIN - sizeof(mem_list);
|
||||
@ -105,7 +105,7 @@ void OS_BootWithRomHeaderFromFIRM( ROM_Header* rom_header )
|
||||
*---------------------------------------------------------------------------*/
|
||||
BOOL OSi_FromBromToMenu( void )
|
||||
{
|
||||
OSFromBromBuf* fromBromBuf = OSi_GetFromBromAddr();
|
||||
OSFromBromBuf* const fromBromBuf = OSi_GetFromBromAddr();
|
||||
BOOL result = TRUE;
|
||||
int i;
|
||||
// check offset (why not to omit by compiler?)
|
||||
|
||||
@ -19,16 +19,11 @@
|
||||
#define FIRM_FATFS_FATFS_FIRM_H_
|
||||
|
||||
#include <twl/types.h>
|
||||
#include <twl/fatfs/common/api.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define FIRM_FATFS_COMMAND_BUFFER (HW_MAIN_MEM + 0x00ffc000)
|
||||
#define FIRM_FATFS_COMMAND_BUFFER_SIZE FATFS_COMMAND_BUFFER_MAX
|
||||
#define FIRM_FATFS_COMMAND_BUFFER_END (FIRM_FATFS_COMMAND_BUFFER + FIRM_FATFS_COMMAND_BUFFER_SIZE)
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: FATFS_InitFIRM
|
||||
|
||||
|
||||
@ -19,12 +19,22 @@
|
||||
#define FIRM_FS_FS_FIRM_H_
|
||||
|
||||
#include <twl/types.h>
|
||||
#include <twl/aes/ARM7/lo.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: FS_InitFIRM
|
||||
|
||||
Description: initialize FS/FATFS for firm
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
void FS_InitFIRM( void );
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: FS_ResolveSrl
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user