From 3ba5bc6a352fbd702339cd7e7c898aad450de196 Mon Sep 17 00:00:00 2001 From: yutaka Date: Tue, 20 Nov 2007 05:09:15 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=96=E3=83=BC=E3=83=88=E3=81=ABreboot?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= 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@219 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries/Makefile | 8 +- build/libraries/fatfs/ARM7/src/fatfs_loader.c | 28 ++- build/libraries/mi/ARM9/mi_loader.c | 7 +- build/libraries/os/common/os_boot.c | 206 +++--------------- include/firm/hw/ARM7/mmap_firm.h | 10 - include/firm/hw/ARM9/mmap_firm.h | 13 +- include/firm/os/common/boot.h | 31 +-- 7 files changed, 79 insertions(+), 224 deletions(-) diff --git a/build/libraries/Makefile b/build/libraries/Makefile index 43e0847f..75b8a3ac 100644 --- a/build/libraries/Makefile +++ b/build/libraries/Makefile @@ -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 \ diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index 4b484765..53161334 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -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バグパッチ */ + 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 ); } diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c index 88e56d2a..9758ba8a 100644 --- a/build/libraries/mi/ARM9/mi_loader.c +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -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互換ヘッダコピー @@ -505,5 +506,5 @@ BOOL MI_LoadStatic( void ) *---------------------------------------------------------------------------*/ void MI_Boot( void ) { - OSi_Boot( rh ); + OS_BootWithRomHeaderFromFIRM( rh ); } diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index 1a0063bd..44985ba9 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -14,193 +14,59 @@ $Rev$ $Author$ *---------------------------------------------------------------------------*/ + #include -#include -#include -#ifdef SDK_ARM9 -#include -#else -#include -#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 - -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 - /*---------------------------------------------------------------------------* Name: OSi_FromBromToMenu diff --git a/include/firm/hw/ARM7/mmap_firm.h b/include/firm/hw/ARM7/mmap_firm.h index 4eb5b7a7..0a4752ab 100644 --- a/include/firm/hw/ARM7/mmap_firm.h +++ b/include/firm/hw/ARM7/mmap_firm.h @@ -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" */ diff --git a/include/firm/hw/ARM9/mmap_firm.h b/include/firm/hw/ARM9/mmap_firm.h index 468a9a8f..9b2c9aec 100644 --- a/include/firm/hw/ARM9/mmap_firm.h +++ b/include/firm/hw/ARM9/mmap_firm.h @@ -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" */ diff --git a/include/firm/os/common/boot.h b/include/firm/os/common/boot.h index 9fbcf857..e09503f5 100644 --- a/include/firm/os/common/boot.h +++ b/include/firm/os/common/boot.h @@ -22,47 +22,34 @@ #include #include -#include - #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