TwlIPL/build/libraries/os/common/os_boot.c
yosiokat ddc4a65782 ビルドスイッチFIRM_USE_TWLSDK_KEYSをFIRM_USE_PRODUCT_KEYSに変更し、
NandInitializerで使用していたUSE_PRODUCT_KEYと統合する。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1412 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-05-20 02:27:38 +00:00

161 lines
6.4 KiB
C
Raw Blame History

/*---------------------------------------------------------------------------*
Project: TwlFirm - OS
File: os_boot.c
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <firm/os.h>
#include <firm/fs.h>
#include "reboot.h"
extern void SDK_STATIC_START(void); // static and bss start address
extern void SDK_STATIC_BSS_END(void); // static and bss end address
/*---------------------------------------------------------------------------*
Name: OS_BootWithRomHeaderFromFIRM
Description: boot with ROM header
Arguments: rom_header : ROM header
Returns: None
*---------------------------------------------------------------------------*/
void OS_BootWithRomHeaderFromFIRM( ROM_Header* rom_header )
{
#ifdef SDK_ARM9
void *entry = rom_header->s.main_entry_address;
void *const code_buf = (void*)OS_BOOT_CODE_BUF; // 0x023fee00
void *const stack_top = (void*)OS_BOOT_STACK_TOP; // (HW_DTCM_END - HW_DTCM_SYSRV_SIZE - HW_SVC_STACK_SIZE)
#else
void *entry = rom_header->s.sub_entry_address;
void *const code_buf = (void*)OS_BOOT_CODE_BUF; // 0x03fff600
void *const stack_top = (void*)OS_BOOT_STACK_TOP; // (HW_WRAM_AREA_END - HW_PRV_WRAM_SYSRV_SIZE - HW_SVC_STACK_SIZE)
#endif
void *const wram_reg = rom_header->s.main_wram_config_data;
REBOOTTarget target = rom_header->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK ? REBOOT_TARGET_TWL_SECURE : (rom_header->s.titleID_Hi & TITLE_ID_HI_APP_TYPE_MASK ? REBOOT_TARGET_TWL_SYSTEM : REBOOT_TARGET_TWL_APP);
BOOL scfg = TRUE; // no touch
BOOL set_jtag = FALSE; // no touch
BOOL forbid_jtag = FALSE; // no touch
BOOL psram_4mb = FALSE; // no touch
static u32 mem_list[32];
int i = 0;
// pre clear
/* <20><><EFBFBD>g<EFBFBD><67> static & bss <20>̃N<CC83><4E><EFBFBD>A */
mem_list[i++] = (u32)SDK_STATIC_START;
mem_list[i++] = (u32)SDK_STATIC_BSS_END-(u32)SDK_STATIC_START;
#ifdef SDK_ARM9
/* ITCM<43>S<EFBFBD>N<EFBFBD><4E><EFBFBD>A (FromFrim<69><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) */
mem_list[i++] = HW_ITCM;
mem_list[i++] = HW_FIRM_FROM_FIRM_BUF - HW_ITCM;
mem_list[i++] = HW_FIRM_FROM_FIRM_BUF_END;
mem_list[i++] = HW_ITCM_END - HW_FIRM_FROM_FIRM_BUF_END;
/* FS/FATFS<46>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>̃N<CC83><4E><EFBFBD>A */
mem_list[i++] = (u32)HW_FIRM_FATFS_COMMAND_BUFFER; // 0x02ff7800 - 0x02ffbfff
mem_list[i++] = (u32)HW_FIRM_FS_TEMP_BUFFER_END - (u32)HW_FIRM_FATFS_COMMAND_BUFFER;
/* <20><EFBFBD><EA9594><EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>̃N<CC83><4E><EFBFBD>A (<28><><EFBFBD>Ǘ<EFBFBD>.xls<6C>Q<EFBFBD><51>) */
mem_list[i++] = (u32)OSi_GetFromFirmAddr()->rsa_pubkey[0];
mem_list[i++] = ACS_PUBKEY_LEN;
#else // SDK_ARM7
/* FS_Loader<65>p<EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>̃N<CC83><4E><EFBFBD>A */
mem_list[i++] = HW_FIRM_LOAD_BUFFER_BASE;
mem_list[i++] = HW_FIRM_LOAD_BUFFER_UNIT_SIZE * HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
{ /* REBOOT_Execute<74><65>CODE<44><45>STACK<43>̌<EFBFBD><CC8C>Ԃ<EFBFBD><D482>N<EFBFBD><4E><EFBFBD>A */
u32 stack_bottom = (u32)stack_top - OS_BOOT_STACK_SIZE_MIN - sizeof(mem_list);
u32 code_buf_end = OS_BOOT_CODE_BUF + OS_BOOT_CODE_SIZE;
SDK_ASSERT( stack_bottom > code_buf_end );
mem_list[i++] = code_buf_end;
mem_list[i++] = stack_bottom - code_buf_end;
}
/* <20><EFBFBD><EA9594><EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>̃N<CC83><4E><EFBFBD>A (<28><><EFBFBD>Ǘ<EFBFBD>.xls<6C>Q<EFBFBD><51>) */
mem_list[i++] = (u32)OSi_GetFromFirmAddr()->aes_key[2];
mem_list[i++] = ACS_AES_LEN;
#endif // SDK_ARM7
mem_list[i++] = NULL;
// copy forward
#ifdef SDK_ARM7
// MountInfo (<28>ړ<EFBFBD><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD>H)
mem_list[i++] = HW_TWL_FS_MOUNT_INFO_BUF;
mem_list[i++] = (u32)rom_header->s.sub_mount_info_ram_address;
mem_list[i++] = HW_FIRM_FS_MOUNT_INFO_BUF_SIZE;
// srl<72>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
mem_list[i++] = HW_TWL_FS_BOOT_SRL_PATH_BUF;
mem_list[i++] = (u32)rom_header->s.sub_mount_info_ram_address + HW_FIRM_FS_MOUNT_INFO_BUF_SIZE;
mem_list[i++] = HW_FIRM_FS_BOOT_SRL_PATH_BUF_SIZE;
#endif
mem_list[i++] = NULL;
// copy backward
mem_list[i++] = NULL;
// post clear
#ifdef SDK_ARM7
// MountInfo (<28>ړ<EFBFBD><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD>H)
mem_list[i++] = HW_TWL_FS_MOUNT_INFO_BUF;
mem_list[i++] = HW_FIRM_FS_MOUNT_INFO_BUF_SIZE;
// srl<72>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>
mem_list[i++] = HW_TWL_FS_BOOT_SRL_PATH_BUF;
mem_list[i++] = HW_FIRM_FS_BOOT_SRL_PATH_BUF_SIZE;
#endif
mem_list[i++] = NULL;
SDK_ASSERT(i <= sizeof(mem_list)/sizeof(mem_list[0]));
#ifndef FIRM_USE_PRODUCT_KEYS
// <20>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD>͗ʎY<CA8E>pCPU<50>ł̓u<CD83>[<5B>g<EFBFBD><67><EFBFBD>Ȃ<EFBFBD>
#ifdef SDK_ARM9
if ( ! ((*(u8*)OS_CHIPTYPE_DEBUGGER_ADDR & OS_CHIPTYPE_DEBUGGER_MASK)) )
#else // SDK_ARM7
if ( ! ((*(u8*)HWi_WSYS08_ADDR & HWi_WSYS08_OP_OPT_MASK)) )
#endif // SDK_ARM7
{
OS_Terminate();
}
#endif // FIRM_USE_PRODUCT_KEYS
REBOOT_Execute(entry, wram_reg, mem_list, code_buf, stack_top, target, scfg, set_jtag, forbid_jtag, psram_4mb);
OS_Terminate();
}
/*---------------------------------------------------------------------------*
Name: OSi_FromBromToMenu
Description: convert OSFromBromBuf to OSFromFirmBuf
Arguments: None
Returns: FALSE if FromBrom is broken
*---------------------------------------------------------------------------*/
BOOL OSi_FromBromToMenu( void )
{
OSFromBromBuf* const fromBromBuf = OSi_GetFromBromAddr();
BOOL result = TRUE;
int i;
// check offset (why not to omit by compiler?)
if ( OSi_GetFromFirmAddr()->rsa_pubkey != fromBromBuf->rsa_pubkey ) // same area without header
{
result = FALSE;
}
// check unused signature area
for (i = 0; i < sizeof(fromBromBuf->hash_table_hash); i++) // check all values are same
{
if (fromBromBuf->hash_table_hash[i] != 0x00)
{
result = FALSE;
}
}
// clear out of OSFromFirmBuf area
MI_CpuClearFast( fromBromBuf->header.max, sizeof(fromBromBuf->header.max) );
#ifdef SDK_ARM7
MI_CpuCopyFast( &fromBromBuf->SDNandContext, (void*)HW_SD_NAND_CONTEXT_BUF, sizeof(SDPortContextData) );
MI_CpuClearFast( &fromBromBuf->SDNandContext, sizeof(SDPortContextData) );
#endif
return result;
}