From 5f227a2270c00835c604dd44ffeb3353dbccf516 Mon Sep 17 00:00:00 2001 From: yutaka Date: Thu, 8 Nov 2007 07:49:40 +0000 Subject: [PATCH] =?UTF-8?q?OSi=5FBoot=E3=81=AE=E5=BC=95=E6=95=B0=E3=82=92R?= =?UTF-8?q?OM=E3=83=98=E3=83=83=E3=83=80=E3=81=AE=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=BF=E3=81=AB=E3=81=97=E3=81=9F=20*=5FLoader()?= =?UTF-8?q?=E3=82=92=E5=85=AC=E9=96=8B=E3=81=97=E3=81=9F?= 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@122 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries/fatfs/ARM7/src/fatfs_loader.c | 25 ++++++- build/libraries/mi/ARM9/mi_loader.c | 12 +-- build/libraries/os/common/os_boot.c | 73 +++++++------------ include/firm/fatfs/ARM7/fatfs_loader.h | 58 +++++++++++++++ include/firm/hw/ARM7/mmap_firm.h | 7 +- include/firm/hw/ARM9/mmap_firm.h | 6 +- include/firm/mi/ARM9/mi_loader.h | 42 +++++++++++ include/firm/os/common/boot.h | 6 +- 8 files changed, 161 insertions(+), 68 deletions(-) diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index 03ee058b..9d94c662 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -100,6 +100,22 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile ) return TRUE; } +/*---------------------------------------------------------------------------* + Name: FATFS_GetSrlDescriptor + + Description: open specified menu file + + 任意のファイルをオープンし、ファイルIDをmenu_fdにセットします。 + + Arguments: None + + Returns: int + *---------------------------------------------------------------------------*/ +int FATFS_GetSrlDescriptor( void ) +{ + return menu_fd; +} + #define HEADER_SIZE 0x1000 #define AUTH_SIZE ROM_HEADER_SIGN_TARGET_SIZE @@ -136,12 +152,17 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile ) destとsizeを通知するという形でOKではないか? (で完了したら返事を返す) + 補足2: + 一度に複数スロットを使えそうな場合は、一気にpo_readした方が速い。 + ARM9からデータ内容を触る予定がないなら、本APIを使わず、普通に + 直接メインメモリに転送した方が速い。 + 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) +BOOL FATFS_LoadBuffer(u32 offset, u32 size) { u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE; static int count = 0; @@ -487,5 +508,5 @@ BOOL FATFS_LoadStatic( void ) *---------------------------------------------------------------------------*/ void FATFS_Boot( void ) { - OSi_Boot( rh->s.sub_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data ); + OSi_Boot( rh ); } diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c index 803976cd..ece53cc4 100644 --- a/build/libraries/mi/ARM9/mi_loader.c +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -159,7 +159,7 @@ static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate Returns: TRUE if success *---------------------------------------------------------------------------*/ -static BOOL MIi_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx) +BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx) { u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE; static int count = 0; @@ -247,7 +247,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key ) ((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_HEADER), FALSE) || ((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) || #endif - !MIi_LoadBuffer( (u8*)rh, AUTH_SIZE, &ctx ) ) + !MI_LoadBuffer( (u8*)rh, AUTH_SIZE, &ctx ) ) { return FALSE; } @@ -258,7 +258,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key ) profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif // load header (remain) - if ( !MIi_LoadBuffer( (u8*)rh + AUTH_SIZE, HEADER_SIZE - AUTH_SIZE, NULL ) ) + if ( !MI_LoadBuffer( (u8*)rh + AUTH_SIZE, HEADER_SIZE - AUTH_SIZE, NULL ) ) { return FALSE; } @@ -347,7 +347,7 @@ static u32 MIi_GetTransferSize( u32 offset, u32 size ) Description: receive module from ARM7 and store(move) via WRAM[B] - MIi_LoadBufferの上位APIです。 + MI_LoadBufferの上位APIです。 AES境界をまたぐ場合は、2回のLoadBufferに分割します。 @@ -372,7 +372,7 @@ static /*inline*/ BOOL MIi_LoadModule(void* dest, u32 offset, u32 size, const u8 while ( size > 0 ) { u32 unit = MIi_GetTransferSize( offset, size ); - if ( !MIi_LoadBuffer( dest, unit, &ctx.sha1_ctx ) ) // UpdateはSHA1と同じ処理 + if ( !MI_LoadBuffer( dest, unit, &ctx.sha1_ctx ) ) // UpdateはSHA1と同じ処理 { return FALSE; } @@ -505,5 +505,5 @@ BOOL MI_LoadStatic( void ) *---------------------------------------------------------------------------*/ void MI_Boot( void ) { - OSi_Boot( rh->s.main_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data ); + OSi_Boot( rh ); } diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index 103efb1a..620dfcdd 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -31,35 +31,27 @@ なので、OSi_BootCoreは次のプログラムですぐに壊されそうなところを使う #endif -void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ); +void OSi_BootCore( ROM_Header* rom_header ); /*---------------------------------------------------------------------------* Name: OSi_Boot Description: boot firm - Arguments: entry : entry point - w : wram settings + Arguments: rom_header : ROM header Returns: None *---------------------------------------------------------------------------*/ -void OSi_Boot( void* entry, MIHeader_WramRegs* w ) +void OSi_Boot( ROM_Header* rom_header ) { - OSEntryPoint p = (OSEntryPoint)entry; - void (*OSBootCore)( OSEntryPoint p, MIHeader_WramRegs* w ); + void (*OSBootCore)( ROM_Header* rom_header ); (void)OS_DisableInterrupts(); OSi_Finalize(); + OSBootCore = (void*)HW_FIRM_BOOT_CORE; + MI_CpuCopyFast( OSi_BootCore, OSBootCore, HW_FIRM_BOOT_CORE_SIZE ); -#ifdef SDK_ARM9 - OSBootCore = (void*)HW_ITCM; -#else // SDK_ARM7 - OSBootCore = (void*)(HW_PRV_WRAM_SVC_STACK - 0x200); -#endif // SDK_ARM7 - - MI_CpuCopyFast( OSi_BootCore, OSBootCore, 0x200 ); - - OSBootCore(p, w); + OSBootCore(rom_header); } /*---------------------------------------------------------------------------* @@ -103,39 +95,17 @@ void OSi_Finalize(void) #endif // SDK_ARM9 } -extern void SDK_STATIC_DATA_START(void); // static data start address -extern void SDK_STATIC_BSS_END(void); // static bss end address +extern void SDK_STATIC_START(void); // static start address +extern void SDK_STATIC_END(void); // static end address -/*---------------------------------------------------------------------------* - Name: OSi_ClearWorkArea +#include - Description: clear work area - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -#include -asm void OSi_ClearWorkArea( void ) +asm void OSi_BootCore( ROM_Header* rom_header ) { - mov r11, lr - - // clear stack with r4-r9 - mov r0, #0 - ldr r1, =SDK_STATIC_DATA_START - ldr r2, =SDK_STATIC_BSS_END - sub r2, r2, r1 - bl MIi_CpuClearFast - - bx r11 -} - -asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) -{ - mov r11, r0 - mov r10, r1 #ifdef SDK_ARM9 + add r10, r0, #0x180 // rom_header->s.main_wram_config_data + ldr r11, [r0, #0x24] // rom_header->s.main_entry_address // wait for request of wram map ldr r3, =REG_SUBPINTF_ADDR @@ -171,6 +141,8 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) str r0, [r3] #else // ARM7 + add r10, r0, #0x1a0 // rom_header->s.sub_wram_config_data + ldr r11, [r0, #0x34] // rom_header->s.sub_entry_address // request wram map ldr r3, =REG_MAINPINTF_ADDR @@ -188,7 +160,6 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) str r0, [r3] // r10- => r9-r2 - add r10, r10, #32 ldr r9, =REG_MBK6_ADDR add r2, r9, #15 @1: @@ -199,12 +170,22 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) #endif - // clear stack with r4-r9 + // clear something all mov r0, #0 #if 0 + // clear stack ldr r1, =HW_FIRM_STACK ldr r2, =HW_FIRM_STACK_SIZE - bl MIi_CpuClearFast +@10: cmp r1, r2 + strcc r0, [r1], #4 + bcc @10 + + // clear static text, data, and bss + ldr r1, =SDK_STATIC_START + ldr r2, =SDK_STATIC_END +@20: cmp r1, r2 + strcc r0, [r1], #4 + bcc @20 #endif mov lr, r11 diff --git a/include/firm/fatfs/ARM7/fatfs_loader.h b/include/firm/fatfs/ARM7/fatfs_loader.h index 74b80d8d..64553d12 100644 --- a/include/firm/fatfs/ARM7/fatfs_loader.h +++ b/include/firm/fatfs/ARM7/fatfs_loader.h @@ -46,6 +46,64 @@ BOOL FATFS_OpenRecentMenu( int driveno ); *---------------------------------------------------------------------------*/ BOOL FATFS_OpenSpecifiedSrl( const char* menufile ); +/*---------------------------------------------------------------------------* + Name: FATFS_GetSrlDescriptor + + Description: open specified menu file + + 任意のファイルをオープンし、ファイルIDをmenu_fdにセットします。 + + Arguments: None + + Returns: int + *---------------------------------------------------------------------------*/ +int FATFS_GetSrlDescriptor( void ); + +/*---------------------------------------------------------------------------* + 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ヘッダ部分は元から知っているはず) + + 補足: + ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを + 前提にしているが、汎用的にするには(独立ライブラリ化するなら)、 + 送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック + &スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に + destとsizeを通知するという形でOKではないか? + (で完了したら返事を返す) + + 補足2: + 一度に複数スロットを使えそうな場合は、一気にpo_readした方が速い。 + ARM9からデータ内容を触る予定がないなら、本APIを使わず、普通に + 直接メインメモリに転送した方が速い。 + + Arguments: offset offset of the file to load (512 bytes alignment) + size size to load + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL FATFS_LoadBuffer(u32 offset, u32 size); + /*---------------------------------------------------------------------------* Name: FATFS_LoadHeader diff --git a/include/firm/hw/ARM7/mmap_firm.h b/include/firm/hw/ARM7/mmap_firm.h index d93fe220..02f5ced4 100644 --- a/include/firm/hw/ARM7/mmap_firm.h +++ b/include/firm/hw/ARM7/mmap_firm.h @@ -26,11 +26,6 @@ extern "C" { #define HW_FIRM_END (HW_FIRM + HW_FIRM_SIZE) #define HW_FIRM_SIZE (HW_WRAM_0_SIZE + HW_WRAM_1_SIZE + HW_WRAM_A_SIZE_MAX + HW_WRAM_B_SIZE_MAX) -//------------------------------------- FIRM_WRAM_ABC -#define HW_FIRM_WRAM_A_MAP_END (HW_WRAM_AREA_END - HW_PRV_WRAM_SIZE) -#define HW_FIRM_WRAM_B_MAP_END HW_FIRM_WRAM_A_MAP_END -#define HW_FIRM_WRAM_C_MAP_END HW_FIRM_WRAM_A_MAP_END - //------------------------------------- HW_FIRM_FROM_BROM_BUF #define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE) #define HW_FIRM_FROM_BROM_BUF_END (HW_WRAM_AREA_END - 0x1000) // END - 4KB @@ -42,7 +37,7 @@ extern "C" { #define HW_FIRM_APP_BUF_SIZE 0x00800000 // 8MB //------------------------------------- HW_FIRM_BOOT_CORE -#define HW_FIRM_BOOT_CORE HW_EXT_WRAM +#define HW_FIRM_BOOT_CORE HW_FIRM_FROM_BROM_BUF_END #define HW_FIRM_BOOT_CORE_END (HW_FIRM_BOOT_CORE + HW_FIRM_BOOT_CORE_SIZE) #define HW_FIRM_BOOT_CORE_SIZE 0x200 // 512B diff --git a/include/firm/hw/ARM9/mmap_firm.h b/include/firm/hw/ARM9/mmap_firm.h index 6a96de0d..3eb2920f 100644 --- a/include/firm/hw/ARM9/mmap_firm.h +++ b/include/firm/hw/ARM9/mmap_firm.h @@ -26,11 +26,6 @@ extern "C" { #define HW_FIRM_END (HW_FIRM + HW_FIRM_SIZE) #define HW_FIRM_SIZE HW_WRAM_C_SIZE_MAX -//------------------------------------- FIRM_WRAM_ABC -#define HW_FIRM_WRAM_A_MAP_END HW_WRAM_AREA_END -#define HW_FIRM_WRAM_B_MAP_END HW_FIRM_WRAM_A_MAP_END -#define HW_FIRM_WRAM_C_MAP_END HW_FIRM_WRAM_A_MAP_END - //------------------------------------- HW_FIRM_FROM_BROM_BUF #define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE) #define HW_FIRM_FROM_BROM_BUF_END (HW_ITCM_END - 0x1000) // END - 4KB @@ -46,6 +41,7 @@ extern "C" { #define HW_FIRM_BOOT_CORE_END (HW_FIRM_BOOT_CORE + HW_FIRM_BOOT_CORE_SIZE) #define HW_FIRM_BOOT_CORE_SIZE 0x200 // 512B + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/firm/mi/ARM9/mi_loader.h b/include/firm/mi/ARM9/mi_loader.h index 0fa3274d..86350ba3 100644 --- a/include/firm/mi/ARM9/mi_loader.h +++ b/include/firm/mi/ARM9/mi_loader.h @@ -24,6 +24,48 @@ extern "C" { #endif +/*---------------------------------------------------------------------------* + Name: MIi_LoadBuffer + + Description: receive data from ARM7 and store(move) via WRAM[B] + + LoadBufferメカニズムで、ファイルの内容をARM7から受け取ります。 + 引数でSVCSHA1Contextを指定していた場合、コピーのついでに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ヘッダ部分は元から知っているはず) + + 補足: + ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを + 前提にしているが、汎用的にするには(独立ライブラリ化するなら)、 + 送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック + &スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に + destとsizeを通知するという形でOKではないか? + (で完了したら返事を返す) + + Arguments: dest destination address for received data + size size to load + ctx context for SHA1 if execute SVC_SHA1Update + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx); + /*---------------------------------------------------------------------------* Name: MI_LoadHeader diff --git a/include/firm/os/common/boot.h b/include/firm/os/common/boot.h index 2c78f4a2..a16a91df 100644 --- a/include/firm/os/common/boot.h +++ b/include/firm/os/common/boot.h @@ -19,6 +19,7 @@ #include #include +#include #include @@ -34,12 +35,11 @@ typedef void (*OSEntryPoint) (void); Description: boot firm - Arguments: entry : entry point - w : wram settings + Arguments: rom_header : ROM header Returns: None *---------------------------------------------------------------------------*/ -void OSi_Boot( void* entry, MIHeader_WramRegs* w ); +void OSi_Boot( ROM_Header* rom_header ); /*---------------------------------------------------------------------------* Name: OSi_Finalize