mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
OSi_Bootの引数をROMヘッダのポインタにした
*_Loader()を公開した git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@122 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
6961a271d9
commit
5f227a2270
@ -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 );
|
||||
}
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
@ -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 <twl/code32.h>
|
||||
|
||||
Description: clear work area
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <nitro/code32.h>
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
|
||||
#include <firm.h>
|
||||
#include <firm/format/from_brom.h>
|
||||
#include <firm/format/format_rom.h>
|
||||
|
||||
#include <nitro/hw/common/armArch.h>
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user