TwlIPL/build/libraries/os/common/os_boot.c
yutaka ba33ee2fbf 最新SDK対応
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@276 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2007-11-28 00:14:11 +00:00

116 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
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 "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 *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;
REBOOTTarget target = REBOOT_TARGET_NAND_MENU;
BOOL scfg = TRUE; // no touch
BOOL jtag = FALSE; // no touch
static u32 clr_list[32];
int i = 0;
/* Ž©<C5BD>gÌ static & bss ̃NƒŠƒA */
clr_list[i++] = (u32)SDK_STATIC_START;
clr_list[i++] = (u32)SDK_STATIC_BSS_END-(u32)SDK_STATIC_START;
#ifdef SDK_ARM9
/* ITCMSƒNƒŠƒA */
clr_list[i++] = (u32)HW_ITCM;
clr_list[i++] = (u32)HW_ITCM_SIZE;
/* PSEG1 Reserved—̈æÌƒNƒŠƒA (Žbè) */
clr_list[i++] = (u32)HW_MAIN_MEM_SHARED; // 0x02fff000 - 0x02fff7ff
clr_list[i++] = (u32)HW_PSEG1_RESERVED_0_END - (u32)HW_MAIN_MEM_SHARED;
clr_list[i++] = (u32)HW_PSEG1_RESERVED_1; // 0x02fffa00 - 0x02fffa7f
clr_list[i++] = (u32)HW_PSEG1_RESERVED_1_END - (u32)HW_PSEG1_RESERVED_1;
/* System Shared—̈æÌƒNƒŠƒA (Žbè) */
clr_list[i++] = (u32)HW_BOOT_CHECK_INFO_BUF; // 0x02fffc00 - 0x02fffc1f
clr_list[i++] = (u32)HW_BOOT_CHECK_INFO_BUF_END - (u32)HW_BOOT_CHECK_INFO_BUF;
clr_list[i++] = (u32)HW_BOOT_SHAKEHAND_9; // 0x02fffc24 - 0x02fffd7f
clr_list[i++] = (u32)HW_NVRAM_USER_INFO_END - (u32)HW_BOOT_SHAKEHAND_9;
clr_list[i++] = (u32)HW_ARENA_INFO_BUF; // 0x02fffda0 - 0x02fffdff
clr_list[i++] = (u32)HW_ROM_HEADER_BUF - (u32)HW_ARENA_INFO_BUF;
clr_list[i++] = (u32)HW_PXI_SIGNAL_PARAM_ARM9; // 0x02ffff80 - 0x02fffffd
clr_list[i++] = (u32)HW_CMD_AREA - (u32)HW_PXI_SIGNAL_PARAM_ARM9;
#else // SDK_ARM7
/* REBOOT_ExecuteÌCODEÆSTACKÌŒ„ŠÔðƒNƒŠƒA */
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 + OS_BOOT_CODE_SIZE;
clr_list[i++] = (u32)stack_top - OS_BOOT_STACK_SIZE_MIN - sizeof(clr_list) - (u32)OS_BOOT_CODE_BUF - OS_BOOT_CODE_SIZE;
}
#endif // SDK_ARM7
clr_list[i++] = NULL;
REBOOT_Execute(entry, wram_reg, clr_list, code_buf, stack_top, target, scfg, jtag);
OS_Terminate();
}
/*---------------------------------------------------------------------------*
Name: OSi_FromBromToMenu
Description: convert OSFromBromBuf to OSFromFirmBuf
Arguments: None
Returns: FALSE if FromBrom is broken
*---------------------------------------------------------------------------*/
BOOL OSi_FromBromToMenu( void )
{
OSFromBromBuf* 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) );
return result;
}