TwlIPL/build/libraries_sysmenu/sysmenu/ARM9/src/title.c
yoshida_teruhisa e0577ff3ce TMPフォルダに保存したアプリを起動するサンプル
現状、ファイルを消す処理を入れていないのでTMPにアプリが残ります

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@510 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-01-24 02:48:49 +00:00

575 lines
18 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: TwlIPL
File: SYSM_lib.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 <twl.h>
#include <sysmenu.h>
#include <es.h>
#include "internal_api.h"
// define data-----------------------------------------------------------------
#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 )
// extern data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static s32 ReadFile( FSFile* pf, void* buffer, s32 size );
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
static void SYSMi_Relocate( void );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
static OSThread s_thread;
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
// const data------------------------------------------------------------------
static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = {
OS_BOOTTYPE_ILLEGAL, // ILLEGAL
OS_BOOTTYPE_ROM, // ROM
OS_BOOTTYPE_NAND, // TEMP
OS_BOOTTYPE_NAND, // NAND
OS_BOOTTYPE_MEMORY, // MEMORY
};
// ============================================================================
//
// <20>î•ñŽæ“¾
//
// ============================================================================
// ƒJ<C692>[ƒhƒ^ƒCƒgƒÌŽæ“¾
BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
{
BOOL retval = FALSE;
if( SYSMi_GetWork()->isCardStateChanged ) {
MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) );
// ROMƒwƒbƒ_ƒoƒbƒtƒ@̃Rƒs<C692>[
if( SYSM_IsExistCard() ) {
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7Æ”r¼<E28098>§Œä·é
DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); // ƒLƒƒƒbƒVƒ…ƒPƒA
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_CARD_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); // ROMƒwƒbƒ_ƒRƒs<C692>[
SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16; // ROMƒwƒbƒ_CRCƒRƒs<C692>[
SYSMi_GetWork()->isCardStateChanged = FALSE; // ƒJ<C692>[ƒh<C692>î•ñ<E280A2>X<EFBFBD>Vƒtƒ‰ƒOð—ŽÆ·
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7Æ”r¼<E28098>§Œä·é
OS_ReleaseLockID( id );
pTitleList_Card->flags.isValid = TRUE;
pTitleList_Card->flags.isAppLoadCompleted = TRUE;
pTitleList_Card->flags.isAppRelocate = TRUE;
pTitleList_Card->pBanner = NULL;
// ƒoƒi<C692>[ƒf<C692>[ƒ^̃Š<C692>[ƒh
if( SYSM_GetCardRomHeader()->banner_offset &&
SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ) ) {
pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ];
}else {
MI_CpuClearFast( &s_bannerBuf[ CARD_BANNER_INDEX ], sizeof(TWLBannerFile) );
}
}
retval = TRUE;
}
// ƒ^ƒCƒgƒ<C692>î•ñƒtƒ‰ƒÕZƒbƒg
pTitleList_Card->flags.bootType = LAUNCHER_BOOTTYPE_ROM;
pTitleList_Card->titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo );
return retval;
}
// NANDƒ^ƒCƒgƒƒŠƒXƒg̎擾
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
{
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, “™Ì<E2809A>ðŒ<C3B0>ðŽwèµÄƒ^ƒCƒgƒƒŠƒXƒgðŽæ“¾·é<E2809A>B
// Æè ¦¸ALL
OSTick start;
int l;
int gotten;
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
if( listNum > LAUNCHER_TITLE_LIST_NUM ) {
OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM );
}
start = OS_GetTick();
gotten = NAM_GetTitleList( &titleIdArray[ 0 ], LAUNCHER_TITLE_LIST_NUM - 1 );
OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
start = OS_GetTick();
gotten = NAM_GetNumTitles(); // [TODO:]{—ˆ¾Á½ç•K—vÈ¢ª<E2809A>AŒ»<C592>ÝÍNAM_GetTitleListªƒAƒvƒŠŒÂ<C592>ð¿áñƕԵĭêÈ¢ÌÅ<E2809A>B
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
for(l=0;l<gotten;l++)
{
//ƒwƒbƒ_©çƒoƒi<C692>[ð“ÇÝ<E2809A>žÞ
FSFile file[1];
BOOL bSuccess;
static const int PATH_LENGTH=1024;
char path[PATH_LENGTH];
static u8 header[HW_TWL_ROM_HEADER_BUF_SIZE] ATTRIBUTE_ALIGN(32);
s32 readLen;
s32 offset;
start = OS_GetTick();
readLen = NAM_GetTitleBootContentPathFast(path, titleIdArray[l]);
OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
if(readLen != NAM_OK){
OS_TPrintf("NAM_GetTitleBootContentPath failed %d,%lld,%d\n",l,titleIdArray[l],readLen);
}
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant open file %s\n",path);
return -1;
}
// ƒoƒi<C692>[ƒf<C692>[ƒ^ƒIƒtƒZƒbƒgð“ÇÝ<E2809A>žÞ
bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(0)\n");
FS_CloseFile(file);
return -1;
}
readLen = FS_ReadFile(file, &offset, sizeof(offset));
if( readLen != sizeof(offset) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file\n");
FS_CloseFile(file);
return -1;
}
bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(offset)\n");
FS_CloseFile(file);
return -1;
}
readLen = ReadFile(file, &s_bannerBuf[l], (s32)sizeof(TWLBannerFile));
if( readLen != (s32)sizeof(TWLBannerFile) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
FS_CloseFile(file);
return -1;
}
FS_CloseFile(file);
}
for(l=gotten;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
// ”O̽ß0ɃNƒŠƒA
titleIdArray[l] = 0;
}
// ƒJ<C692>[ƒhƒAƒvƒŠ•”•ªð<E2809A>œ¢½ƒŠƒXƒgƒNƒŠƒA
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
listNum = (gotten<listNum) ? gotten : listNum;
for(l=0;l<listNum;l++)
{
pTitleList_Nand[l+1].titleID = titleIdArray[l];
pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l];
if( titleIdArray[l] ) {
pTitleList_Nand[l+1].flags.isValid = TRUE;
pTitleList_Nand[l+1].flags.bootType = LAUNCHER_BOOTTYPE_NAND;
}
}
// return : *TitleProperty Array
return listNum;
}
// Žwèƒtƒ@ƒCƒƒŠ<C692>[ƒh
static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
{
u8* p = (u8*)buffer;
s32 remain = size;
while( remain > 0 )
{
const s32 len = MATH_IMin(1024, remain);
const s32 readLen = FS_ReadFile(pf, p, len);
if( readLen < 0 )
{
return readLen;
}
if( readLen != len )
{
return size - remain + readLen;
}
remain -= readLen;
p += readLen;
}
return size;
}
// ============================================================================
//
// ƒAƒvƒŠN“®
//
// ============================================================================
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
{
enum
{
region_header = 0,
region_arm9_ntr,
region_arm7_ntr,
region_arm9_twl,
region_arm7_twl,
region_max
};
// ƒ<>ƒCƒ“ƒ<E2809C>ƒƒŠÌƒNƒŠƒA
// DSƒ_ƒEƒ“ƒ<E2809C><C692>[ƒhƒvƒŒƒCÌŽžÍ<E2809A>AROMƒwƒbƒ_ðÞ”ð·é
// ƒAƒvƒŠƒ<C5A0><C692>[ƒh
// ƒAƒvƒŠ”F<E2809D>Ø
// ƒ<><C692>[ƒh
char path[256];
FSFile file[1];
BOOL bSuccess;
BOOL isTwlApp = TRUE;
switch( pBootTitle->flags.bootType )
{
case LAUNCHER_BOOTTYPE_NAND:
// NAND
NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID);
break;
case LAUNCHER_BOOTTYPE_ROM:
// TODO:CARD¢“ÇÌ<E2809A>ê<EFBFBD>Ì<E2809A>ˆ<CB86>
break;
case LAUNCHER_BOOTTYPE_TEMP:
// tmpƒtƒHƒƒ_
STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID );
break;
default:
// unknown
return;
}
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
{
OS_TPrintf("RebootSystem failed: cant open file\n");
return;
}
{
int i;
u32 source[region_max];
u32 length[region_max];
u32 destaddr[region_max];
static u8 header[HW_TWL_ROM_HEADER_BUF_SIZE] ATTRIBUTE_ALIGN(32);
s32 readLen;
// ܸROMƒwƒbƒ_ð“ÇÝ<E2809A>žÞ
// ({—ˆÈç±±ÅSRLÌ<E2809A>³“<E2809C>«”»è)
bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
FS_CloseFile(file);
return;
}
readLen = ReadFile(file, header, (s32)sizeof(header));
if( readLen != (s32)sizeof(header) )
{
OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen);
FS_CloseFile(file);
return;
}
if( header[0x15C] != 0x56 || header[0x15D] != 0xCF )
{
int i, j;
for( i = 0; i < 0x20; ++i )
{
for( j = 0; j < 0x10; ++j )
{
OS_TPrintf("%02X ", header[i * 0x10 + j]);
}
OS_TPrintf("\n");
}
OS_TPrintf("RebootSystem failed: logo CRC error\n");
FS_CloseFile(file);
return;
}
if( header[0x12] && 0x03 == 0 )
{
//NTR<54>ê—pROM
isTwlApp = FALSE;
}
// Še—̈æð“ÇÝ<E2809A>žÞ
source [region_header ] = 0x00000000;
length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE;
destaddr[region_header ] = HW_TWL_ROM_HEADER_BUF;
source [region_arm9_ntr] = *(const u32*)&header[0x020];
length [region_arm9_ntr] = *(const u32*)&header[0x02C];
destaddr[region_arm9_ntr] = *(const u32*)&header[0x028];
source [region_arm7_ntr] = *(const u32*)&header[0x030];
length [region_arm7_ntr] = *(const u32*)&header[0x03C];
destaddr[region_arm7_ntr] = *(const u32*)&header[0x038];
if( isTwlApp )
{
source [region_arm9_twl] = *(const u32*)&header[0x1C0];
length [region_arm9_twl] = *(const u32*)&header[0x1CC];
destaddr[region_arm9_twl] = *(const u32*)&header[0x1C8];
source [region_arm7_twl] = *(const u32*)&header[0x1D0];
length [region_arm7_twl] = *(const u32*)&header[0x1DC];
destaddr[region_arm7_twl] = *(const u32*)&header[0x1D8];
}
// —̈æ“ÇÝ<E2809A>žÝ<E2809A>æÌƒ`ƒFƒbƒNyÑ<E2809A>Ä”zu<E28099>î•ñƒf<C692>[ƒ^Ì<E2809A>ì<EFBFBD>¬
// ƒQ<C692>[ƒ€ƒJ<C692>[ƒhÌ<E2809A>Ä”zu<E28099>î•ñª<E2809A>«<E2809A>žÜêÄ¢éÌÅ<E2809A>AnandƒAƒvƒŠƒ<C5A0><C692>[ƒhOɈêUƒNƒŠƒA
MI_CpuClearFast(SYSMi_GetWork()->romRelocateInfo, sizeof(Relocate_Info) * RELOCATE_INFO_NUM);
for( i=0; i<RELOCATE_INFO_NUM; i++ )
{
if ( !isTwlApp && i >= ARM9_LTD_STATIC ) continue;// nitroÅÍ“ÇÝ<E2809A>žÜÈ¢—̈æ
if ( !SYSM_CheckLoadRegionAndSetRelocateInfo( (RomSegmentName)i, &(destaddr[i+region_arm9_ntr]), length[i+region_arm9_ntr],
&(SYSMi_GetWork()->romRelocateInfo[i]), isTwlApp ) )
{
OS_TPrintf("RebootSystem failed: ROM Load Region error\n");
FS_CloseFile(file);
return;
}
}
for (i = region_header; i < region_max; ++i)
{
u32 len = length[i];
if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroÅÍ“ÇÝ<E2809A>žÜÈ¢—̈æ
bSuccess = FS_SeekFile(file, (s32)source[i], FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]);
FS_CloseFile(file);
return;
}
readLen = ReadFile(file, (void *)destaddr[i], (s32)len);
if( readLen != (s32)len )
{
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file);
return;
}
}
(void)FS_CloseFile(file);
}
// ROMƒwƒbƒ_ƒoƒbƒtƒ@ðƒRƒs<C692>[
MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
SYSMi_GetWork()->isLoadSucceeded = TRUE;
}
// Žwèƒ^ƒCƒgƒð•ʃXƒŒƒbƒhŃ<C385><C692>[ƒhŠJŽn·é
void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
{
#define THREAD_PRIO 17
#define STACK_SIZE 0xc00
static u64 stack[ STACK_SIZE / sizeof(u64) ];
// ƒAƒvƒŠ¢ƒ<C2A2><C692>[ƒh<C692>óÔÈç<E2809A><41><C692>[ƒhŠJŽn
if( !pBootTitle->flags.isAppLoadCompleted ) {
SYSMi_GetWork()->isLoadSucceeded = FALSE;
OS_InitThread();
OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
OS_WakeupThreadDirect( &s_thread );
}else if( pBootTitle->flags.isAppRelocate ) {
// ƒAƒvƒŠƒ<C5A0><C692>[ƒh<C692>ÏÝÅ<E2809A>A<EFBFBD>Ä”zu—v<76> èÈç<E2809A>A<EFBFBD>Ä”zu<E28099>iƒJ<C692>[ƒhÌÝΉž<E280B0>j
SYSMi_Relocate();
SYSMi_GetWork()->isLoadSucceeded = TRUE;
}else
{
// ƒAƒvƒŠƒ<C5A0><C692>[ƒh<C692>ÏÝÅ<E2809A>A<EFBFBD>Ä”zu—v<76>ȵ
SYSMi_GetWork()->isLoadSucceeded = TRUE;
}
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) {
SYSMi_GetWork()->isCardBoot = TRUE;
}else if(pBootTitle->flags.isAppLoadCompleted)
{
// ƒJ<C692>[ƒhƒu<C692>[ƒgÅÈ­<E2809A><41><C692>[ƒh<C692>ÏÝÌ<E2809A>ê<EFBFBD><EFBFBD>A<EFBFBD>Ä”zu<E28099>î•ñðƒ‰ƒ“ƒ`ƒƒ<C692>[ƒpƒ‰ƒ<E280B0>ƒ^©ç“ÇÝ<E2809A>žÝ
MI_CpuCopy8( SYSM_GetLauncherParamBody()->v1.relocInfo, SYSMi_GetWork()->romRelocateInfo, sizeof(Relocate_Info)*RELOCATE_INFO_NUM );
// <20>XɃwƒbƒ_ð<E2809A>Ä”zu
if( ((ROM_Header_Short *)(OS_TWL_HEADER_PRELOAD_MMEM))->platform_code & PLATFORM_CODE_FLAG_TWL ) {
// TWL-ROMƒwƒbƒ_<C692>î•ñÌ<E2809A>Ä”zu
MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE );
MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
}else {
// TWL-ROMƒwƒbƒ_<C692>î•ñÌ<E2809A>Ä”zu
MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
// NTR-ROMƒwƒbƒ_<C692>î•ñÌ<E2809A>Ä”zuÍ<E2809A>Arebootƒ‰ƒCƒuƒ‰ƒŠÅ<E2809A>s¤<E2809A>B
}
}
}
// ƒJ<C692>[ƒhƒAƒvƒŠƒP<C692>[ƒVƒ‡ƒ“Ì<E2809A>Ä”zu
static void SYSMi_Relocate( void )
{
u32 size;
u32 *dest = SYSM_GetCardRomHeader()->main_ram_address;
// NTRƒZƒLƒ…ƒA—̈æÌ<E2809A>Ä”zu
DC_InvalidateRange( (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); // ƒLƒƒƒbƒVƒ…ƒPƒA
size = ( SYSM_GetCardRomHeader()->main_size < SECURE_AREA_SIZE ) ?
SYSM_GetCardRomHeader()->main_size : SECURE_AREA_SIZE;
// romÌ<E2809A>Ä”zu<E28099>î•ñðŽQ<C5BD>ƵÄ<E2809A>AƒZƒLƒ…ƒA—̈æÌ<E2809A>Ä”zu<E28099>æð•Ï<E280A2>X·é•K—vª³¢©²×é
if( SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC].src != NULL )
{
dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC].src;
}
MI_CpuCopyFast( (void *)SYSM_CARD_NTR_SECURE_BUF, dest, size );
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL ) {
// TWLƒZƒLƒ…ƒA—̈æÌ<E2809A>Ä”zu
dest = SYSM_GetCardRomHeader()->main_ltd_ram_address;
DC_InvalidateRange( (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // ƒLƒƒƒbƒVƒ…ƒPƒA
size = ( SYSM_GetCardRomHeader()->main_ltd_size < SECURE_AREA_SIZE ) ?
SYSM_GetCardRomHeader()->main_ltd_size : SECURE_AREA_SIZE;
// romÌ<E2809A>Ä”zu<E28099>î•ñðŽQ<C5BD>ƵÄ<E2809A>AƒZƒLƒ…ƒA—̈æÌ<E2809A>Ä”zu<E28099>æð•Ï<E280A2>X·é•K—vª³¢©²×é
if( SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src != NULL )
{
dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src;
}
MI_CpuCopyFast( (void *)SYSM_CARD_TWL_SECURE_BUF, dest, size );
// TWL-ROMƒwƒbƒ_<C692>î•ñÌ<E2809A>Ä”zu
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE );
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
}else {
// TWL-ROMƒwƒbƒ_<C692>î•ñÌ<E2809A>Ä”zu
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
}
}
// ƒAƒvƒŠƒ<C5A0><C692>[ƒh<C692>ÏÝ<E2809A>H
BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle )
{
if( pBootTitle->flags.isAppLoadCompleted ) {
return TRUE;
}
return OS_IsThreadTerminated( &s_thread );
}
// ƒ<><C692>[ƒh<C692>ÏÝÌŽwèƒ^ƒCƒgƒÌ”F<E2809D>ØÆƒu<C692>[ƒgð<E2809A>s¤
AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
{
// ƒ<><C692>[ƒh
if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) {
return AUTH_RESULT_PROCESSING;
}
// ƒ<><C692>[ƒh<C692>¬Œ÷<C592>H
if( SYSMi_GetWork()->isLoadSucceeded == FALSE )
{
return AUTH_RESULT_TITLE_LOAD_FAILED;
}
// ƒpƒ‰ƒ<E280B0><C692>[ƒ^ƒ`ƒFƒbƒN
if( !SYSMi_CheckTitlePointer( pBootTitle ) ) {
return AUTH_RESULT_TITLE_POINTER_ERROR;
}
#if 0
// ƒGƒ“ƒgƒŠƒAƒhƒŒƒXÌ<E2809A>³“<E2809C>«ðƒ`ƒFƒbƒN
if( !SYSMi_CheckEntryAddress() ) {
return AUTH_RESULT_ENTRY_ADDRESS_ERROR;
}
#endif
// BOOTTYPE_MEMORYÅNTRƒ<C692>[ƒhÌFS èŃu<C692>[ƒg·éÆ<E2809A>AŒNitroSDKŃrƒƒh³ê½ƒAƒvƒŠÌ<E2809A>ê<EFBFBD><EFBFBD>A
// ROMƒA<C692>[ƒJƒCƒuɃJ<C692>[ƒhªŠ„è“ÄçêÄ<E2809A>AFSÅŠÖŒWÈ¢ƒJ<C692>[ƒhɃAƒNƒZƒXÉ¢ÁĵܤÌÅ<E2809A>A»êðhŽ~·é<E2809A>B
if( ( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_MEMORY ) &&
( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) == 0 ) &&
( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->fat_size ) > 0 )
) {
return AUTH_RESULT_TITLE_BOOTTYPE_ERROR;
}
// <20>¦ROMƒwƒbƒ_”F<E2809D>Ø
// ƒ}ƒEƒ“ƒg<C692>î•ñÌ“o˜^
SYSMi_SetBootAppMountInfo( pBootTitle );
// HW_WM_BOOT_BUFÖ̃u<C692>[ƒg<C692>î•ñƒZƒbƒg
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ];
BOOT_Ready(); // never return.
return AUTH_RESULT_SUCCEEDED;
}
#if 0
// Žwèƒ^ƒCƒgƒÌ”F<E2809D>Ø<EFBFBD>•ƒ<E280A2><C692>[ƒh<C692>@<40>¦PƒtƒŒ<C692>[ƒ€á<E2809A>Iíçñ<E2809A>B
// ൩·éÆŽgíÈ¢©à
void SYSM_LoadAndAuthenticateTitleThread( TitleProperty *pBootTitle )
{
SYSMi_LoadTitleThreadFunc( pBootTitle );
OS_JoinThread(&s_thread);
// ”F<E2809D>Ø
return SYSM_AuthenticateTitle( pBootTitle );
}
#endif
// Žwèƒ^ƒCƒgƒªƒu<C692>[ƒg‰Â”\‚ȃ|ƒCƒ“ƒ^‚©ƒ`ƒFƒbƒN
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )
{
#pragma unused( pBootTitle )
return TRUE;
}