mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
NandInitializerで使用していたUSE_PRODUCT_KEYと統合する。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1412 b08762b0-b915-fc4b-9d8c-17b2551a87ff
161 lines
6.4 KiB
C
161 lines
6.4 KiB
C
/*---------------------------------------------------------------------------*
|
||
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;
|
||
}
|