From 8596bd4da8f53359891016c21efaa1052db4372f Mon Sep 17 00:00:00 2001 From: yutaka Date: Thu, 6 Dec 2007 05:09:43 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BBFS=5FInit=E3=81=A7=E3=83=8F=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=A2=E3=83=83=E3=83=97=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@322 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries/fatfs/ARM9/src/fatfs_firm.c | 3 +- build/libraries/fs/ARM7/src/fs_firm.c | 21 ++++++---- build/libraries/fs/ARM9/src/fs_firm.c | 46 ++++++++++++++++----- build/libraries/os/common/os_boot.c | 8 ++-- include/firm/fatfs/ARM9/fatfs_firm.h | 5 --- include/firm/fs/ARM9/fs_firm.h | 12 +++++- 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/build/libraries/fatfs/ARM9/src/fatfs_firm.c b/build/libraries/fatfs/ARM9/src/fatfs_firm.c index ae52bd9d..71fca82f 100644 --- a/build/libraries/fatfs/ARM9/src/fatfs_firm.c +++ b/build/libraries/fatfs/ARM9/src/fatfs_firm.c @@ -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(); } diff --git a/build/libraries/fs/ARM7/src/fs_firm.c b/build/libraries/fs/ARM7/src/fs_firm.c index 215c84b7..8cb8396e 100644 --- a/build/libraries/fs/ARM7/src/fs_firm.c +++ b/build/libraries/fs/ARM7/src/fs_firm.c @@ -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; diff --git a/build/libraries/fs/ARM9/src/fs_firm.c b/build/libraries/fs/ARM9/src/fs_firm.c index 5ab4a417..4382bbea 100644 --- a/build/libraries/fs/ARM9/src/fs_firm.c +++ b/build/libraries/fs/ARM9/src/fs_firm.c @@ -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 ); diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index fb216f27..08344611 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -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の隙間をクリア */ 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?) diff --git a/include/firm/fatfs/ARM9/fatfs_firm.h b/include/firm/fatfs/ARM9/fatfs_firm.h index dd06df77..757b7a83 100644 --- a/include/firm/fatfs/ARM9/fatfs_firm.h +++ b/include/firm/fatfs/ARM9/fatfs_firm.h @@ -19,16 +19,11 @@ #define FIRM_FATFS_FATFS_FIRM_H_ #include -#include #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 diff --git a/include/firm/fs/ARM9/fs_firm.h b/include/firm/fs/ARM9/fs_firm.h index 76ae38a0..196e1e19 100644 --- a/include/firm/fs/ARM9/fs_firm.h +++ b/include/firm/fs/ARM9/fs_firm.h @@ -19,12 +19,22 @@ #define FIRM_FS_FS_FIRM_H_ #include -#include #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