mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ブートにrebootライブラリを使うように修正
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@219 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
827c27ae42
commit
3ba5bc6a35
@ -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 \
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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" */
|
||||
|
||||
@ -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" */
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user