TwlIPL/build/libraries/os/common/os_boot.c
yutaka 863a0d5c6a 量産鍵の場合に開発機でブートしないようにした。
ランチャーブート時だけでなくOS_InitFIRMの最後にも判定するようにした。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1599 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-06-11 08:02:14 +00:00

173 lines
6.8 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;
#ifdef SDK_ARM9
// <20><><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>[<5B><><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>[<5B>^<5E>̃R<CC83>s<EFBFBD>[<5B><><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD>̐ݒ<CC90>
*(u32 *)HW_PRELOAD_PARAMETER_ADDR = HW_PARAM_TWL_SETTINGS_DATA_DEFAULT;
#endif
// 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
#else // !FIRM_USE_PRODUCT_KEYS
// <20>ʎY<CA8E><59><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD>͊J<CD8A><4A><EFBFBD>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
#endif // !FIRM_USE_PRODUCT_KEYS
{
OS_Terminate();
}
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;
}