ブートにrebootライブラリを使うように修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@219 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2007-11-20 05:09:15 +00:00
parent 827c27ae42
commit 3ba5bc6a35
7 changed files with 79 additions and 224 deletions

View File

@ -22,14 +22,16 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = \
os \
gcd \
mi \
init \
os \
pxi \
mi \
fatfs \
aes \
pm \
gcd \
$(TWLSDK_ROOT)/build/libraries/reboot \
# syscall \
# nvram \
# acsign \

View File

@ -65,7 +65,7 @@ static int menu_fd = -1;
*---------------------------------------------------------------------------*/
BOOL FATFS_OpenRecentMenu( int driveno )
{
char *menufile = (char*)L"A:\\title_e\\00010001\\43414d54\\content\\12123434.app";
char *menufile = (char*)L"A:\\title\\00010001\\4d454e55\\content\\12123434.app";
if (driveno < 0 || driveno >= 26)
{
return FALSE;
@ -168,7 +168,7 @@ BOOL FATFS_LoadBuffer(u32 offset, u32 size)
static int count = 0;
// seek first
// OS_TPrintf("po_lseek(offset=%X);\n", offset);
//OS_TPrintf("po_lseek(offset=0x%x);\n", offset);
if (po_lseek(menu_fd, (s32)offset, PSEEK_SET) < 0)
{
return FALSE;
@ -189,11 +189,29 @@ BOOL FATFS_LoadBuffer(u32 offset, u32 size)
// x3...: after to wait ARM9
profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick());
#endif
// OS_TPrintf("po_read(dest=%X, unit=%X);\n", dest, unit);
if (po_read(menu_fd, (u8*)dest, (int)unit) < 0) // reading
//OS_TPrintf("po_read(dest=%p, unit=0x%x);\n", dest, unit);
#if 0 /* 0: 2KBƒoƒOƒpƒbƒ` */
if (po_read(menu_fd, (u8*)dest, (int)unit) < 0) // reading
{
return FALSE;
}
#else
{
u32 done = 0;
while (done < unit)
{
u8* dest2 = dest + done;
u32 unit2 = (unit - done) < 2048 ? (unit - done) : 2048;
//OS_TPrintf(" po_read(dest=%p, unit=0x%x) ... ", dest2, unit2);
if (po_read(menu_fd, (u8*)dest2, (int)unit2) < 0) // reading
{
return FALSE;
}
done += unit2;
//OS_TPrintf("done\n");
}
}
#endif
#ifdef PROFILE_ENABLE
// x4...: before PXI
profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick());
@ -508,5 +526,5 @@ BOOL FATFS_LoadStatic( void )
*---------------------------------------------------------------------------*/
void FATFS_Boot( void )
{
OSi_Boot( rh );
OS_BootWithRomHeaderFromFIRM( rh );
}

View File

@ -120,7 +120,7 @@ static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate
}
/*---------------------------------------------------------------------------*
Name: MIi_LoadBuffer
Name: MI_LoadBuffer
Description: receive data from ARM7 and store(move) via WRAM[B]
@ -187,8 +187,8 @@ BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx)
u8* s = src + done;
u8* d = dest + done;
u32 u = unit < done + HASH_UNIT ? unit - done : HASH_UNIT;
MI_CpuCopyFast( s, d, u );
SVC_SHA1Update( ctx, s, u );
MI_CpuCopyFast( s, d, u );
}
}
else
@ -290,6 +290,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
#endif
if ( result )
{
DC_FlushRange( rh, HW_TWL_ROM_HEADER_BUF_SIZE );
PXI_NotifyID( FIRM_PXI_ID_AUTH_HEADER );
PXI_SendDataByFifo( PXI_FIFO_TAG_DATA, sd.aes_key_seed, AES_BLOCK_SIZE );
// DSŒÝŠ·ƒwƒbƒ_ƒRƒs<C692>[
@ -505,5 +506,5 @@ BOOL MI_LoadStatic( void )
*---------------------------------------------------------------------------*/
void MI_Boot( void )
{
OSi_Boot( rh );
OS_BootWithRomHeaderFromFIRM( rh );
}

View File

@ -14,193 +14,59 @@
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <firm/os.h>
#include <firm/mi.h>
#include <firm/pxi.h>
#ifdef SDK_ARM9
#include <firm/os/ARM9/os_cache_tag.h>
#else
#include <twl/aes/ARM7/lo.h>
#endif
#include "reboot.h"
#if 0
:
OSi_BootCoreのコピー先決定
(ITCM,DTCM,STACK,STATICなど (OSBootCore, OSFromFirmBufは残す))
OSBootCoreはできれば次のプログラムですぐに壊されそうなところを使う
#endif
void OSi_BootCore( ROM_Header* rom_header );
extern void SDK_STATIC_START(void); // static and bss start address
extern void SDK_STATIC_BSS_END(void); // static and bss end address
/*---------------------------------------------------------------------------*
Name: OSi_Boot
Name: OS_BootWithRomHeaderFromFIRM
Description: boot firm
Description: boot with ROM header
Arguments: rom_header : ROM header
Returns: None
*---------------------------------------------------------------------------*/
void OSi_Boot( ROM_Header* rom_header )
void OS_BootWithRomHeaderFromFIRM( ROM_Header* rom_header )
{
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 );
OSBootCore(rom_header);
}
/*---------------------------------------------------------------------------*
Name: OSi_Finalize
Description: finalize
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void OSi_Finalize(void)
{
(void)OS_DisableInterrupts();
(void)OS_DisableIrq();
reg_OS_IE = 0;
reg_OS_IF = 0xffffffff;
#ifdef SDK_ARM7
reg_OS_IE2 = 0;
reg_OS_IF2 = 0xffff;
// set init check flag by bootrom
SVC_CpuClear( REG_OS_PAUSE_CHK_MASK, (void*)REG_PAUSE_ADDR, sizeof(u16), 16 );
#else // SDK_ARM9
// set init check flag
reg_OS_PAUSE = REG_OS_PAUSE_CHK_MASK;
*(u64*)HW_INIT_LOCK_BUF = 0;
DC_Disable();
DC_FlushAll();
DC_WaitWriteBufferEmpty();
IC_Disable();
IC_InvalidateAll();
// clear cache
IC_ClearTagAll();
IC_ClearInstructionAll();
DC_ClearTagAll();
DC_ClearDataAll();
OS_DisableProtectionUnit();
#endif // SDK_ARM9
}
extern void SDK_STATIC_START(void); // static start address
extern void SDK_STATIC_END(void); // static end address
#include <twl/code32.h>
asm void OSi_BootCore( ROM_Header* rom_header )
{
#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
mov r2, #REG_PXI_SUBPINTF_A7STATUS_MASK
@0:
ldr r0, [r3]
and r0, r0, r2
cmp r0, r2
bne @0
// r10- => r9-r2
ldr r9, =REG_MBK1_ADDR
add r2, r9, #32
@1:
ldr r3, [r10], #4
str r3, [r9], #4
cmp r9, r2
blt @1
// notify wram map
ldr r3, =REG_SUBPINTF_ADDR
mov r0, #REG_PXI_SUBPINTF_A9STATUS_MASK
str r0, [r3]
// wait for finalizing pxi
ldr r3, =REG_SUBPINTF_ADDR
@2:
ldr r0, [r3]
and r0, r0, #REG_PXI_SUBPINTF_A7STATUS_MASK
cmp r0, #0
bne @2
// finalize pxi
mov r0, #0
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
mov r0, #REG_PXI_MAINPINTF_A7STATUS_MASK
str r0, [r3]
// wait for wram map
mov r2, #REG_PXI_MAINPINTF_A9STATUS_MASK
@0:
ldr r0, [r3]
and r0, r0, r2
cmp r0, r2
bne @0
// finalize pxi
mov r0, #0
str r0, [r3]
// r10- => r9-r2
ldr r9, =REG_MBK6_ADDR
add r2, r9, #15
@1:
ldr r3, [r10], #4
str r3, [r9], #4
cmp r9, r2
blt @1
void *entry = rom_header->s.main_entry_address;
void *code_buf = (void*)OS_BOOT_CODE_BUF; // 0x023fee00
void *stack_top = (void*)(HW_DTCM_END - HW_DTCM_SYSRV_SIZE - HW_SVC_STACK_SIZE - (u32)SDK_IRQ_STACKSIZE);
#else
void *entry = rom_header->s.sub_entry_address;
void *code_buf = (void*)OS_BOOT_CODE_BUF; // 0x03fff600
void *stack_top = (void*)(HW_WRAM_AREA_END - HW_PRV_WRAM_SYSRV_SIZE - HW_SVC_STACK_SIZE - (u32)SDK_IRQ_STACKSIZE);
#endif
void *wram_reg = rom_header->s.main_wram_config_data;
BOOL scfg = TRUE; // no touch
BOOL jtag = FALSE; // no touch
static u32 clr_list[32];
int i = 0;
// clear something all
mov r0, #0
#if 0
// clear stack
ldr r1, =HW_FIRM_STACK
ldr r2, =HW_FIRM_STACK_SIZE
@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
/* 自身の static & bss のクリア */
clr_list[i++] = (u32)SDK_STATIC_START;
clr_list[i++] = (u32)SDK_STATIC_BSS_END-(u32)SDK_STATIC_START;
#ifdef SDK_ARM9
/* ITCM全クリア */
clr_list[i++] = (u32)HW_ITCM;
clr_list[i++] = (u32)HW_ITCM_SIZE;
#else
/* CODEとSTACKの隙間をクリア */
if ((u32)stack_top > (u32)OS_BOOT_CODE_BUF - OS_BOOT_CODE_SIZE - OS_BOOT_STACK_SIZE_MIN - sizeof(clr_list))
{
clr_list[i++] = (u32)OS_BOOT_CODE_BUF + (u32)OS_BOOT_CODE_SIZE;
clr_list[i++] = (u32)stack_top - (u32)OS_BOOT_CODE_BUF - OS_BOOT_CODE_SIZE - OS_BOOT_STACK_SIZE_MIN - sizeof(clr_list);
}
#endif
mov lr, r11
// clear registers
#if 0
ldr sp, =HW_FIRM_STACK
ldmia sp, {r0-r12,sp}
#endif
bx lr
clr_list[i++] = NULL;
REBOOT_Execute(entry, wram_reg, clr_list, code_buf, stack_top, scfg, jtag);
OS_Terminate();
}
#include <twl/codereset.h>
/*---------------------------------------------------------------------------*
Name: OSi_FromBromToMenu

View File

@ -46,16 +46,6 @@ extern "C" {
#define HW_FIRM_FROM_FIRM_BUF_END (HW_WRAM_AREA_END - 0x1000) // END - 4KB
#define HW_FIRM_FROM_FIRM_BUF_SIZE 0x2C00 // 11KB
//------------------------------------- FIRM_APP_BUF
#define HW_FIRM_APP_BUF (HW_MAIN_MEM_HI_EX_END - HW_FIRM_APP_BUF_SIZE)
#define HW_FIRM_APP_BUF_END (HW_FIRM_APP_BUF + HW_FIRM_APP_BUF_SIZE)
#define HW_FIRM_APP_BUF_SIZE 0x00800000 // 8MB
//------------------------------------- FIRM_BOOT_CORE
#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
#ifdef __cplusplus
} /* extern "C" */

View File

@ -29,7 +29,8 @@ extern "C" {
//------------------------------------- FIRM_RESET_BUF
#define HW_FIRM_RESET_BUF HW_MAIN_MEM
#define HW_FIRM_RESET_BUF_END (HW_FIRM_RESET_BUF + HW_FIRM_RESET_BUF_SIZE)
#define HW_FIRM_RESET_BUF_SIZE 0x400 // 12KB
//#define HW_FIRM_RESET_BUF_SIZE 0x400 // 12KB
#define HW_FIRM_RESET_BUF_SIZE 0x800000 // 8MB
//------------------------------------- FIRM_FROM_BROM_BUF
#define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE)
@ -41,16 +42,6 @@ extern "C" {
#define HW_FIRM_FROM_FIRM_BUF_END (HW_ITCM_END - 0x1000) // END - 4KB
#define HW_FIRM_FROM_FIRM_BUF_SIZE 0x2C00 // 11KB
//------------------------------------- FIRM_APP_BUF
#define HW_FIRM_APP_BUF (HW_MAIN_MEM_HI_EX_END - HW_FIRM_APP_BUF_SIZE)
#define HW_FIRM_APP_BUF_END (HW_FIRM_APP_BUF + HW_FIRM_APP_BUF_SIZE)
#define HW_FIRM_APP_BUF_SIZE 0x00800000 // 8MB
//------------------------------------- FIRM_BOOT_CORE
#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
#ifdef __cplusplus
} /* extern "C" */

View File

@ -22,47 +22,34 @@
#include <firm/format/from_firm.h>
#include <twl/os/common/format_rom.h>
#include <nitro/hw/common/armArch.h>
#ifdef __cplusplus
extern "C" {
#endif
//---- entry point type
typedef void (*OSEntryPoint) (void);
/*---------------------------------------------------------------------------*
Name: OSi_Boot
Name: OS_BootWithRomHeaderFromFIRM
Description: boot firm
Description: boot with ROM header
Arguments: rom_header : ROM header
Returns: None
*---------------------------------------------------------------------------*/
void OSi_Boot( ROM_Header* rom_header );
void OS_BootWithRomHeaderFromFIRM( ROM_Header* rom_header );
/*---------------------------------------------------------------------------*
Name: OSi_Finalize
Name: OS_BootDefault
Description: finalize
Description: boot system menu using ROM_Header in HW_TWL_ROM_HEADER_BUF
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void OSi_Finalize(void);
/*---------------------------------------------------------------------------*
Name: OSi_ClearWorkArea
Description: clear work area
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void OSi_ClearWorkArea( void );
static inline void OS_BootFromFIRM( void )
{
OS_BootWithRomHeaderFromFIRM( (ROM_Header*)HW_TWL_ROM_HEADER_BUF );
}
/*---------------------------------------------------------------------------*
Name: OSi_FromBromToMenu