diff --git a/build/libraries/fatfs/ARM7/src/fatfs_firm.c b/build/libraries/fatfs/ARM7/src/fatfs_firm.c index a790c165..d56ec693 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_firm.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_firm.c @@ -31,6 +31,8 @@ extern u32 NAND_FAT_PARTITION_COUNT; /* 専用DMA関数 + MI_NDmaライブラリが全然足りないので、APIを追加 + 最終的には標準ライブラリだけで全部できて欲しい */ //---------------- register setting static inline void MIi_SetSrc( u32 ndmaNo, u32 src ) @@ -94,6 +96,18 @@ extern volatile SDMC_ERR_CODE SDCARD_ErrStatus; extern s16 SDCARD_SDHCFlag; /* SDHCカードフラグ */ extern SDPortContext* SDNandContext; /* NAND初期化パラメータ */ +/*---------------------------------------------------------------------------* + Name: WaitFifoFull + + Description: waiting to fill the SD FIFO + + SDカードからの読み込みデータがFIFOから読み込める状態になるまで + ストールします。 + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ static inline void WaitFifoFull( void ) { while( (*SDIF_CNT & SDIF_CNT_FULL) == 0 ) @@ -105,6 +119,18 @@ static inline void WaitFifoFull( void ) } } +/*---------------------------------------------------------------------------* + Name: StartToRead + + Description: start to read from SD I/F + + SDカードからの読み込みの開始処理を行います。 + + Arguments: block begining sector to transfer + count number of setctors to transfer + + Returns: None + *---------------------------------------------------------------------------*/ static void StartToRead(u32 block, u32 count) { *SDIF_FSC = count; @@ -125,6 +151,17 @@ static void StartToRead(u32 block, u32 count) } } +/*---------------------------------------------------------------------------* + Name: StopToRead + + Description: stop to read from SD I/F + + SDカードからの読み込みの完了処理を行います。 + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ static void StopToRead( void ) { if( !SD_CheckFPGAReg( SD_STOP,SD_STOP_SEC_ENABLE ) ){ @@ -153,6 +190,15 @@ static AESCounter aesCounter; Description: enable AES data path + 次に読み込むデータがAES暗号化されていることを、外部から + IO関数に通知するためのAPIです。 + + このAPIを呼び出した直後に読み込むデータのAESの初期値を指定 + しておけば、以後のシーケンシャルな呼び出しでの初期値は自動 + 計算されます。 + ランダムアクセスを行う場合は、そのたびにこのAPIを呼び出す + 必要があります。 + Arguments: counter initial counter value Returns: None @@ -168,6 +214,9 @@ void FATFS_EnableAES( const AESCounter* pCounter ) Description: bypass AES + 次に読み込むデータがAES暗号化されていないことを、外部から + IO関数に通知するためのAPIです。 + Arguments: None Returns: None @@ -182,6 +231,10 @@ void FATFS_DisableAES( void ) Description: normal read + 普通にNAND/SDカードを読み込みます。 + + 割り込み禁止状態で高速に動作する仕様になっています。 + Arguments: block: source sector number in NAND dest: dest address (4 bytes alignment) count: sectors to transfer @@ -205,6 +258,12 @@ static u16 ReadNormal(u32 block, void *dest, u16 count) Description: AES read + AESをかけながらNAND/SDカードを読み込みます。 + AESの鍵の設定はあらかじめ行っておく必要があります。 + AESの初期値の設定は、FATFS_EnableAESの引数から計算されます。 + + 割り込み禁止状態で高速に動作する仕様になっています。 + Arguments: block: source sector number in NAND dest: dest address (4 bytes alignment) count: sectors to transfer @@ -272,6 +331,10 @@ err: Description: 上位層からのセクタリード/ライト要求を受ける + Readに対してのみ、独自の関数を使用するドライバのIO関数です。 + AESの有無の判定は断片化時に未検証です。 + (間に論理領域の読み込みが挟まる可能性があるかも) + Arguments: driveno : ドライブ番号 block : 開始ブロック番号 buffer : @@ -307,6 +370,8 @@ static BOOL nandRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOO Description: 上位層からのセクタリード/ライト要求を受ける + Readに対してのみ、独自の関数を使用するドライバのIO関数です。 + Arguments: driveno : ドライブ番号 block : 開始ブロック番号 buffer : @@ -342,6 +407,8 @@ static BOOL sdmcRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOO Description: sdmcドライバをドライブに割り当てる + 独自のIO関数を使用するように初期化します。 + Arguments: driveno : ドライブ番号 Returns: @@ -395,6 +462,8 @@ static BOOL nandRtfsAttachFirm( int driveno, int partition_no) Description: sdmcドライバをドライブに割り当てる + 独自のIO関数を使用するように初期化します。 + Arguments: driveno : ドライブ番号 Returns: @@ -426,7 +495,14 @@ static BOOL sdmcRtfsAttachFirm( int driveno) Description: init file system - Arguments: None + FATFSを初期化します。 + 標準のFATFS_Initの使用しない部分を省略しているだけです。 + 以前のNANDコンテキストが残っているなら、初期化時間を著しく + 短縮できます。 + FATFS用のメモリヒープ(OS_ARENA_MAIN_SUBPRIVの関連とヒープ)は + あらかじめ確保しておいてください。 + + Arguments: nandContext context of nand driver's previous life Returns: None *---------------------------------------------------------------------------*/ @@ -452,9 +528,15 @@ BOOL FATFS_InitFIRM( void* nandContext ) /*---------------------------------------------------------------------------* Name: FATFS_MountDriveFirm - Description: mount nand partition + Description: mount specified partition - Arguments: None + 指定したデバイスの指定したパーティションを指定したドライブに + マウントします。NANDまたはSDカードのみ対応しています。 + このAPIでマウントした場合、独自のIO関数を使用するようになります。 + + Arguments: driveno drive number "A:" is 0 + media media type + partition_no pertition number Returns: None *---------------------------------------------------------------------------*/ diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index 3ede3296..14fabf51 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -22,6 +22,25 @@ #include #include +/* + PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。 + 利用するためには、main.cかどこかに、u32 profile[256]; u32 pf_cnt; を + 定義する必要があります。 +*/ +//#define PROFILE_ENABLE + +#ifdef SDK_FINALROM // FINALROMで無効化 +#undef PROFILE_ENABLE +#endif + +#ifdef PROFILE_ENABLE +#define PROFILE_PXI_SEND 1000000000 +#define PROFILE_PXI_RECV 2000000000 +extern u32 profile[]; +extern u32 pf_cnt; +#endif + + #define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0 static ROM_Header* const rh= (ROM_Header*)(HW_MAIN_MEM_SYSTEM_END - 0x2000); @@ -31,6 +50,10 @@ static int menu_fd = -1; Name: FATFS_OpenRecentMenu Description: open recent menu file + システムメニューのファイルを特定し、オープンし、ファイルIDを + menu_fdにセットします。 + 最終的には、固定のタイトルメタデータを読み込み、eTicketの処理 + をして、システムメニューのファイルを特定することになる予定。 Arguments: driveno drive number ('A' is 0) @@ -53,15 +76,17 @@ BOOL FATFS_OpenRecentMenu( int driveno ) } /*---------------------------------------------------------------------------* - Name: FATFS_OpenSpecifiedMenu + Name: FATFS_OpenSpecifiedSrl Description: open specified menu file + 任意のファイルをオープンし、ファイルIDをmenu_fdにセットします。 + Arguments: menufile target filename Returns: None *---------------------------------------------------------------------------*/ -BOOL FATFS_OpenSpecifiedMenu( const char* menufile ) +BOOL FATFS_OpenSpecifiedSrl( const char* menufile ) { menu_fd = po_open((u8*)menufile, PO_BINARY, 0); if (menu_fd < 0) @@ -74,13 +99,36 @@ BOOL FATFS_OpenSpecifiedMenu( const char* menufile ) #define HEADER_SIZE 0x1000 #define AUTH_SIZE ROM_HEADER_SIGN_TARGET_SIZE -#ifndef SDK_FINALROM -#define PROFILE_PXI_SEND 1000000000 -#define PROFILE_PXI_RECV 2000000000 -extern u32 profile[]; -extern u32 pf_cnt; -#endif +/*---------------------------------------------------------------------------* + Name: FATFS_LoadBuffer + Description: load data and pass to ARM9 via WRAM[B] + + LoadBufferメカニズムで、FAT中のファイルの内容をARM9に転送します。 + + [LoadBufferメカニズム] + WRAM[B]を利用して、ARM7,ARM9間のデータ転送を行います。 + WRAM[B]の各スロットをバケツリレー方式で渡します。 + 1スロット分のデータまたは全データが格納できたとき、ARM9へ + FIRM_PXI_ID_LOAD_PIRIODを送信します。 + データ残がある場合は次のスロットの処理に移ります。 + 2回目以降の呼び出しでは、前回最後のスロットの続きから使用します。 + 使用したいスロットがARM9側に割り当てられているときは、ARM7側に + なるまでストールします。 + + [使用条件] + WRAM[B]をロックせず、初期状態としてARM7側に倒しておくこと。 + + [注意点] + offsetとsizeはARM9に通知されません。別の経路で同期を取ってください。 + SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。 + (ROMヘッダ部分は元から知っているはず) + + Arguments: offset offset of the file to load (512 bytes alignment) + size size to load + + Returns: None + *---------------------------------------------------------------------------*/ static BOOL FATFS_LoadBuffer(u32 offset, u32 size) { u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE; @@ -91,7 +139,7 @@ static BOOL FATFS_LoadBuffer(u32 offset, u32 size) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // x2: after Seek profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif @@ -104,7 +152,7 @@ OS_TPrintf("%s: dest=%X, unit=%X\n", __func__, dest, unit); while (MI_GetWramBankMaster_B(count) != MI_WRAM_ARM7) // waiting to be master { } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // x3...: after to wait ARM9 profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif @@ -112,7 +160,7 @@ OS_TPrintf("%s: dest=%X, unit=%X\n", __func__, dest, unit); { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // x4...: before PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_PIRIOD; // checkpoint @@ -127,7 +175,16 @@ OS_TPrintf("%s: dest=%X, unit=%X\n", __func__, dest, unit); /*---------------------------------------------------------------------------* Name: FATFS_LoadHeader - Description: load menu header + Description: load header + + SRLのROMヘッダ部分を読み込み、ARM9に渡します。 + 送信前に、ARM9へ FIRM_PXI_ID_LOAD_HEADER を送信します。 + 送信後、ARM9から FIRM_PXI_ID_AUTH_HEADER を受信します。 + この時点で、メインメモリの所定の位置にROMヘッダが格納されたと + 想定します。 + 問題なければ、seedデータを16バイト受信します。 + 受け取ったseedはSeedAとKeyCに設定されます。 + makerom.TWLまたはIPLの仕様に依存します。 Arguments: None @@ -141,7 +198,7 @@ BOOL FATFS_LoadHeader( void ) return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 10: before PXI pf_cnt = 10; profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_HEADER; // checkpoint @@ -151,12 +208,12 @@ BOOL FATFS_LoadHeader( void ) PXI_NotifyID( FIRM_PXI_ID_LOAD_HEADER ); FATFS_DisableAES(); if (!FATFS_LoadBuffer(0, AUTH_SIZE) || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 12: after to load half ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || #endif !FATFS_LoadBuffer(AUTH_SIZE, HEADER_SIZE - AUTH_SIZE) || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 1x: after to load remain ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || #endif @@ -164,7 +221,7 @@ BOOL FATFS_LoadHeader( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 1x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_RECV | FIRM_PXI_ID_AUTH_HEADER; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -195,6 +252,9 @@ BOOL FATFS_LoadHeader( void ) Description: get counter + offsetに対応したAESのカウンタ値を計算します。 + makerom.TWL内のコードに依存します。 + Arguments: offset offset from head of ROM_Header Returns: counter @@ -213,6 +273,17 @@ static AESCounter* FATFSi_GetCounter( u32 offset ) Description: setup whiere to use AES + AES暗号化されたデータを読み込むためのセットアップを行います。 + fatfs_sdmc.cのドライバを使用していることが条件となります。 + (TwlSDK標準で行う場合は、その仕様に合わせて修正が必要!) + + このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが + 格納されている必要があります。 + + 鍵の選択も行っていますが、鍵の設定は別の場所で行っておく + 必要があります。 + makerom.TWLまたはIPLの使用に依存します。 + Arguments: offset offset of region from head of ROM_Header size size of region @@ -243,20 +314,28 @@ static void FATFSi_SetupAES( u32 offset, u32 size ) /*---------------------------------------------------------------------------* - Name: FATFS_LoadMenu + Name: FATFS_LoadStatic - Description: load menu binary + Description: load static binary + + ARM9/ARM7のStaticおよびLTD Staticを読み込みます。 + 送信前に、ARM9へFIRM_PXI_ID_LOAD_*_STATICを送信します。 + 送信後は、ARM9からFIRM_PXI_ID_AUTH_*_STATICを受信します。 + サイズが0の場合は、そのパートのPXI通信すら行いません。 + + このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが + 格納されている必要があります。 Arguments: None Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL FATFS_LoadMenu( void ) +BOOL FATFS_LoadStatic( void ) { // load ARM9 static region without AES if ( rh->s.main_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 30: before PXI pf_cnt = 30; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -269,7 +348,7 @@ BOOL FATFS_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 3x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_RECV | FIRM_PXI_ID_AUTH_ARM9_STATIC; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -278,7 +357,7 @@ BOOL FATFS_LoadMenu( void ) // load ARM7 static region without AES if ( rh->s.sub_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 50: before PXI pf_cnt = 50; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -291,7 +370,7 @@ BOOL FATFS_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 5x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_RECV | FIRM_PXI_ID_AUTH_ARM7_STATIC; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -300,7 +379,7 @@ BOOL FATFS_LoadMenu( void ) // load ARM9 extended static region with AES if ( rh->s.main_ltd_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 70: before PXI pf_cnt = 70; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -313,7 +392,7 @@ BOOL FATFS_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 7x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_RECV | FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -322,7 +401,7 @@ BOOL FATFS_LoadMenu( void ) // load ARM7 extended static region with AES if ( rh->s.sub_ltd_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 90: before PXI pf_cnt = 90; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -335,7 +414,7 @@ BOOL FATFS_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 9x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_RECV | FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -345,15 +424,20 @@ BOOL FATFS_LoadMenu( void ) } /*---------------------------------------------------------------------------* - Name: FATFS_BootMenu + Name: FATFS_Boot - Description: boot menu + Description: boot + + ROMヘッダの情報を引数に、OSi_Bootを呼び出すだけです。 + + このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが + 格納されている必要があります。 Arguments: None Returns: None *---------------------------------------------------------------------------*/ -void FATFS_BootMenu( void ) +void FATFS_Boot( void ) { OSi_Boot( rh->s.sub_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data ); } diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c index 73b1072b..0529cb9f 100644 --- a/build/libraries/mi/ARM9/mi_loader.c +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -19,6 +19,25 @@ #include #include +/* + PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。 + 利用するためには、main.cかどこかに、u32 profile[256]; u32 pf_cnt; を + 定義する必要があります。 +*/ +//#define PROFILE_ENABLE + +#ifdef SDK_FINALROM // FINALROMで無効化 +#undef PROFILE_ENABLE +#endif + +#ifdef PROFILE_ENABLE +#define PROFILE_PXI_SEND 1000000000 +#define PROFILE_PXI_RECV 2000000000 +extern u32 profile[]; +extern u32 pf_cnt; +#endif + + #define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0 static ROM_Header* const rh = (ROM_Header*)HW_TWL_ROM_HEADER_BUF; @@ -31,6 +50,7 @@ static ROM_Header* const rh = (ROM_Header*)HW_TWL_ROM_HEADER_BUF; /* SHA1 + ほぼMATHライブラリやDGTライブラリと同じだが、システムコールを使っている */ typedef struct SHA1_CTX // 実際には、サイズが同じなら中身は何でも良い @@ -77,6 +97,7 @@ static inline void SHA1_Calc(u8* md, const void* data, u32 len) /* HMAC (SHA1) + ほぼMATHライブラリやDGTライブラリと同じだが、システムコールを使っている */ #define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8) @@ -187,6 +208,21 @@ static const u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { 0x87, 0x46, 0x58, 0x24, }; +/*---------------------------------------------------------------------------* + Name: CheckRomCertificate + + Description: check the certification in the ROM + + ROMヘッダに付加された証明書のチェックを行います。 + makerom.TWL内のコードに依存します。 + + Arguments: pool pointer to the pool info for SVC_DecryptoSign + pCert pointer to the certification + pCAPubKey pointer to the public key for the certification + gameCode initial code + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ static BOOL CheckRomCertificate( int* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode ) { u8 digest[DIGEST_SIZE_SHA1]; @@ -219,13 +255,38 @@ static BOOL CheckRomCertificate( int* pool, const RomCertificate *pCert, const v return result; } -#ifndef SDK_FINALROM -#define PROFILE_PXI_SEND 1000000000 -#define PROFILE_PXI_RECV 2000000000 -extern u32 profile[]; -extern u32 pf_cnt; -#endif +/*---------------------------------------------------------------------------* + Name: MI_LoadBuffer + Description: receive data from ARM7 and store(move) via WRAM[B] + + LoadBufferメカニズムで、ファイルの内容をARM7から受け取ります。 + 引数でSHA1_CTXを指定していた場合、コピーのついでにSHA1の計算も + 行います。 + + [LoadBufferメカニズム] + WRAM[B]を利用して、ARM7,ARM9間のデータ転送を行います。 + WRAM[B]の各スロットをバケツリレー方式で渡します。 + 1スロット分のデータまたは全データが格納されたとき、ARM7から + FIRM_PXI_ID_LOAD_PIRIODを受信します。 + ARM9は受信後にそのスロットの使用権をARM9に変更してデータを + 取り出し、完了後にメモリをクリアして(セキュリティ)、使用権を + ARM7に戻します。 + + [使用条件] + WRAM[B]をロックせず、初期状態としてARM7側に倒しておくこと。 + + [注意点] + offsetとsizeはARM7から通知されません。別の経路で同期を取ってください。 + SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。 + (ROMヘッダ部分は元から知っているはず) + + Arguments: dest destination address for received data + size size to load + ctx context for SHA1 if execute SHA1_Update + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ static BOOL MI_LoadBuffer(u8* dest, u32 size, SHA1_CTX *ctx) { u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE; @@ -239,7 +300,7 @@ OS_TPrintf("%s: src=%X, unit=%X\n", __func__, src, unit); { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // x2...: after PXI profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_PIRIOD; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -271,6 +332,23 @@ OS_TPrintf("%s: src=%X, unit=%X\n", __func__, src, unit); return TRUE; } +/*---------------------------------------------------------------------------* + Name: MI_LoadModule + + Description: receive module from ARM7 and store(move) via WRAM[B] + + MI_LoadBufferの上位APIで、引数にSHA1のハッシュ値を渡すことで + SHA1ハッシュチェックを行います。 + + すでにハッシュ値が分かっていて、ちょうどSHA1の計算範囲全体を + 読み込む場合に便利です。 + + Arguments: dest destination address for received data + size size to load + digest digest to compare + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ static /*inline*/ BOOL MI_LoadModule(void* dest, u32 size, const u8 digest[DIGEST_SIZE_SHA1]) { HMAC_CTX ctx; @@ -284,7 +362,7 @@ static /*inline*/ BOOL MI_LoadModule(void* dest, u32 size, const u8 digest[DIGES return FALSE; } HMAC_GetHash(&ctx, md); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // xx: after SHA1 profile[pf_cnt++] = (u32)20202020; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -305,6 +383,14 @@ static /*inline*/ BOOL MI_LoadModule(void* dest, u32 size, const u8 digest[DIGES Description: load header + SRLのROMヘッダ部分をARM7から受け取り、認証します。 + 受信前に、ARM7から FIRM_PXI_ID_LOAD_HEADER を受信します。 + 受信後、認証が通ったならARM7へ FIRM_PXI_ID_AUTH_HEADER を送信 + します。それ以前に、メインメモリの所定の位置にROMヘッダが格納 + されていなければなりません。 + 続けて、seedデータを16バイト送信します。 + makerom.TWLまたはIPLの仕様に依存します。 + Arguments: pool pointer to the pool info for SVC_DecryptoSign rsa_key key address @@ -320,12 +406,12 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key ) SHA1_Init(&ctx); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE pf_cnt = 10; #endif // load header (hash target) if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_HEADER || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 10: after PXI ((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_HEADER), FALSE) || ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || @@ -335,7 +421,7 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key ) return FALSE; } SHA1_GetHash(&ctx, md); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 1x: after HMAC profile[pf_cnt++] = (u32)2020202020; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -365,7 +451,7 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key ) result = FALSE; } } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 1x: after RSA, before PXI profile[pf_cnt++] = (u32)128128128; // checkpoint profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -385,26 +471,34 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key ) } /*---------------------------------------------------------------------------* - Name: MI_LoadMenu + Name: MI_LoadStatic - Description: load menu program + Description: load static binary + + ARM9/ARM7のStaticおよびLTD Staticを受信します。 + 受信前に、ARM7からFIRM_PXI_ID_LOAD_*_STATICを受信します。 + 受信後、認証が通ったならARM7へFIRM_PXI_ID_AUTH_*_STATICを送信 + します。サイズが0の場合は、そのパートのPXI通信すら行いません。 + + このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが + 格納されている必要があります。 Arguments: None Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL MI_LoadMenu( void ) +BOOL MI_LoadStatic( void ) { // load ARM9 static region if ( rh->s.main_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 30: before PXI pf_cnt = 30; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM9_STATIC || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 31: after PXI ((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_ARM9_STATIC), FALSE) || ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || @@ -413,7 +507,7 @@ BOOL MI_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 3x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_AUTH_ARM9_STATIC; // checkpoint #endif @@ -423,13 +517,13 @@ BOOL MI_LoadMenu( void ) // load ARM7 static region if ( rh->s.sub_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 50: before PXI pf_cnt = 50; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM7_STATIC || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 51: after PXI ((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_ARM7_STATIC), FALSE) || ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || @@ -438,7 +532,7 @@ BOOL MI_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 5x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_AUTH_ARM7_STATIC; // checkpoint #endif @@ -448,13 +542,13 @@ BOOL MI_LoadMenu( void ) // load ARM9 extended static region if ( rh->s.main_ltd_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 70: before PXI pf_cnt = 70; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 71: after PXI ((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC), FALSE) || ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || @@ -463,7 +557,7 @@ BOOL MI_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 7x: after PXI profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC; // checkpoint #endif @@ -472,13 +566,13 @@ BOOL MI_LoadMenu( void ) // load ARM7 extended static region if ( rh->s.sub_ltd_size > 0 ) { -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 90: before PXI pf_cnt = 90; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC || -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 91: after PXI ((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC), FALSE) || ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || @@ -487,7 +581,7 @@ BOOL MI_LoadMenu( void ) { return FALSE; } -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 9x: before PXI profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC; // checkpoint #endif @@ -497,15 +591,20 @@ BOOL MI_LoadMenu( void ) } /*---------------------------------------------------------------------------* - Name: MI_BootMenu + Name: MI_Boot - Description: boot menu + Description: boot + + ROMヘッダの情報を引数に、OSi_Bootを呼び出すだけです。 + + このAPIを呼び出す前に、メインメモリの所定の位置にROMヘッダが + 格納されている必要があります。 Arguments: None Returns: None *---------------------------------------------------------------------------*/ -void MI_BootMenu( void ) +void MI_Boot( void ) { OSi_Boot( rh->s.main_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data ); } diff --git a/build/nandfirm/menu-launcher/ARM7/main.c b/build/nandfirm/menu-launcher/ARM7/main.c index 835f6998..61a956e0 100644 --- a/build/nandfirm/menu-launcher/ARM7/main.c +++ b/build/nandfirm/menu-launcher/ARM7/main.c @@ -154,16 +154,16 @@ void TwlSpMain( void ) #endif OS_SetDebugLED(++step); - if ( FATFS_LoadHeader() && FATFS_LoadMenu() ) + if ( FATFS_LoadHeader() && FATFS_LoadStatic() ) { #ifndef SDK_FINALROM - // 127: before BootMenu + // 127: before Boot pf_cnt = PRFILE_MAX-1; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_SetDebugLED(++step); - FATFS_BootMenu(); + FATFS_Boot(); } } } diff --git a/build/nandfirm/menu-launcher/ARM9/main.c b/build/nandfirm/menu-launcher/ARM9/main.c index f1676bb8..f03e26e4 100644 --- a/build/nandfirm/menu-launcher/ARM9/main.c +++ b/build/nandfirm/menu-launcher/ARM9/main.c @@ -25,9 +25,17 @@ static u8 acHeap[RSA_HEAP_SIZE] __attribute__ ((aligned (32))); static int acPool[3]; /* - Profile + PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。 + 利用するためには、main.cかどこかに、u32 profile[256]; u32 pf_cnt = 0; を + 定義する必要があります。 */ -#ifndef SDK_FINALROM +#define PROFILE_ENABLE + +#ifdef SDK_FINALROM // FINALROMで無効化 +#undef PROFILE_ENABLE +#endif + +#ifdef PROFILE_ENABLE #define PRFILE_MAX 128 u32 profile[PRFILE_MAX]; u32 pf_cnt = 0; @@ -89,13 +97,13 @@ void TwlMain( void ) { PreInit(); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 0: before PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_InitFIRM(); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE OS_InitTick(); // 1: after PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -104,15 +112,15 @@ void TwlMain( void ) SVC_InitSignHeap( acPool, acHeap, sizeof(acHeap) ); // load menu - if ( MI_LoadHeader( acPool, RSA_KEY_ADDR ) && CheckHeader() && MI_LoadMenu() ) + if ( MI_LoadHeader( acPool, RSA_KEY_ADDR ) && CheckHeader() && MI_LoadStatic() ) { -#ifndef SDK_FINALROM - // 127: before BootMenu +#ifdef PROFILE_ENABLE + // 127: before Boot pf_cnt = PRFILE_MAX-1; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif - MI_BootMenu(); + MI_Boot(); } EraseAll(); diff --git a/build/nandfirm/sdmc-launcher/ARM7/main.c b/build/nandfirm/sdmc-launcher/ARM7/main.c index bf39d5e9..2cd75c89 100644 --- a/build/nandfirm/sdmc-launcher/ARM7/main.c +++ b/build/nandfirm/sdmc-launcher/ARM7/main.c @@ -148,19 +148,19 @@ void TwlSpMain( void ) switch ( PAD_Read() & PAD_KEYPORT_MASK ) { case 0: - result = FATFS_OpenSpecifiedMenu( MENU_FILE ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE ); break; case PAD_BUTTON_A: - result = FATFS_OpenSpecifiedMenu( MENU_FILE_A ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_A ); break; case PAD_BUTTON_B: - result = FATFS_OpenSpecifiedMenu( MENU_FILE_B ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_B ); break; case PAD_BUTTON_L: - result = FATFS_OpenSpecifiedMenu( MENU_FILE_L ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_L ); break; case PAD_BUTTON_R: - result = FATFS_OpenSpecifiedMenu( MENU_FILE_R ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_R ); break; default: OS_SetDebugLED( (u8)(PAD_Read() & PAD_KEYPORT_MASK) ); @@ -176,16 +176,16 @@ void TwlSpMain( void ) #endif OS_SetDebugLED(++step); - if ( FATFS_LoadHeader() && FATFS_LoadMenu() ) + if ( FATFS_LoadHeader() && FATFS_LoadStatic() ) { #ifndef SDK_FINALROM - // 127: before BootMenu + // 127: before Boot pf_cnt = PRFILE_MAX-1; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_SetDebugLED(++step); - FATFS_BootMenu(); + FATFS_Boot(); } } } diff --git a/build/nandfirm/sdmc-launcher/ARM9/main.c b/build/nandfirm/sdmc-launcher/ARM9/main.c index 04b58a9e..0a65e3f9 100644 --- a/build/nandfirm/sdmc-launcher/ARM9/main.c +++ b/build/nandfirm/sdmc-launcher/ARM9/main.c @@ -114,15 +114,15 @@ void TwlMain( void ) SVC_InitSignHeap( acPool, acHeap, sizeof(acHeap) ); // load menu - if ( MI_LoadHeader( acPool, RSA_KEY_ADDR ) && CheckHeader() && MI_LoadMenu() ) + if ( MI_LoadHeader( acPool, RSA_KEY_ADDR ) && CheckHeader() && MI_LoadStatic() ) { #ifndef SDK_FINALROM - // 127: before BootMenu + // 127: before Boot pf_cnt = PRFILE_MAX-1; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif - MI_BootMenu(); + MI_Boot(); } EraseAll(); diff --git a/include/firm/fatfs/ARM7/fatfs_loader.h b/include/firm/fatfs/ARM7/fatfs_loader.h index ac0d1405..74b80d8d 100644 --- a/include/firm/fatfs/ARM7/fatfs_loader.h +++ b/include/firm/fatfs/ARM7/fatfs_loader.h @@ -36,7 +36,7 @@ extern "C" { BOOL FATFS_OpenRecentMenu( int driveno ); /*---------------------------------------------------------------------------* - Name: FATFS_OpenSpecifiedMenu + Name: FATFS_OpenSpecifiedSrl Description: open specified menu file @@ -44,7 +44,7 @@ BOOL FATFS_OpenRecentMenu( int driveno ); Returns: None *---------------------------------------------------------------------------*/ -BOOL FATFS_OpenSpecifiedMenu( const char* menufile ); +BOOL FATFS_OpenSpecifiedSrl( const char* menufile ); /*---------------------------------------------------------------------------* Name: FATFS_LoadHeader @@ -58,26 +58,26 @@ BOOL FATFS_OpenSpecifiedMenu( const char* menufile ); BOOL FATFS_LoadHeader( void ); /*---------------------------------------------------------------------------* - Name: FATFS_LoadMenu + Name: FATFS_LoadStatic - Description: load menu binary + Description: load static binary Arguments: None Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL FATFS_LoadMenu( void ); +BOOL FATFS_LoadStatic( void ); /*---------------------------------------------------------------------------* - Name: FATFS_BootMenu + Name: FATFS_Boot - Description: boot menu + Description: boot Arguments: None Returns: None *---------------------------------------------------------------------------*/ -void FATFS_BootMenu( void ); +void FATFS_Boot( void ); #ifdef __cplusplus diff --git a/include/firm/mi/ARM9/mi_loader.h b/include/firm/mi/ARM9/mi_loader.h index 4eb02dd3..94ece9fd 100644 --- a/include/firm/mi/ARM9/mi_loader.h +++ b/include/firm/mi/ARM9/mi_loader.h @@ -37,26 +37,26 @@ extern "C" { BOOL MI_LoadHeader( int* pool, const void* rsa_key ); /*---------------------------------------------------------------------------* - Name: MI_LoadMenu + Name: MI_LoadStatic - Description: load menu program + Description: load static binary Arguments: None Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL MI_LoadMenu( void ); +BOOL MI_LoadStatic( void ); /*---------------------------------------------------------------------------* - Name: MI_BootMenu + Name: MI_Boot - Description: boot menu + Description: boot Arguments: None Returns: None *---------------------------------------------------------------------------*/ -void MI_BootMenu( void ); +void MI_Boot( void ); #ifdef __cplusplus } /* extern "C" */