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:
yutaka 2007-11-08 07:49:40 +00:00
parent 6961a271d9
commit 5f227a2270
8 changed files with 161 additions and 68 deletions

View File

@ -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ではないか
()
使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 );
}

View File

@ -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境界をまたぐ場合は2LoadBufferに分割します
@ -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 );
}

View File

@ -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

View File

@ -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]
1ARM9へ
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ではないか
()
使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

View File

@ -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

View File

@ -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

View File

@ -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]
1ARM7から
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

View File

@ -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