mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
現状、ファイルを消す処理を入れていないのでTMPにアプリが残ります git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@510 b08762b0-b915-fc4b-9d8c-17b2551a87ff
575 lines
18 KiB
C
575 lines
18 KiB
C
/*---------------------------------------------------------------------------*
|
||
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ƒ‰ƒO‚̃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ƒN‹y‚Ñ<E2809A>Ä”z’u<E28099>î•ñƒf<C692>[ƒ^‚Ì<E2809A>ì<EFBFBD>¬
|
||
// ƒQ<C692>[ƒ€ƒJ<C692>[ƒh‚Ì<E2809A>Ä”z’u<E28099>î•ñ‚ª<E2809A>‘‚«<E2809A>ž‚Ü‚ê‚Ä‚¢‚é‚Ì‚Å<E2809A>AnandƒAƒvƒŠƒ<C5A0><C692>[ƒh‘O‚Ɉê’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>Aƒ<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>Ä”z’u—v‹<76>‚ ‚è‚È‚ç<E2809A>A<EFBFBD>Ä”z’u<E28099>iƒJ<C692>[ƒh‚̂ݑΉž<E280B0>j
|
||
SYSMi_Relocate();
|
||
SYSMi_GetWork()->isLoadSucceeded = TRUE;
|
||
}else
|
||
{
|
||
// ƒAƒvƒŠƒ<C5A0><C692>[ƒh<C692>ς݂Å<E2809A>A<EFBFBD>Ä”z’u—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>Aƒ<41><C692>[ƒh<C692>ς݂Ì<E2809A>ê<EFBFBD>‡<EFBFBD>A<EFBFBD>Ä”z’u<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>Ä”z’u
|
||
if( ((ROM_Header_Short *)(OS_TWL_HEADER_PRELOAD_MMEM))->platform_code & PLATFORM_CODE_FLAG_TWL ) {
|
||
// TWL-ROMƒwƒbƒ_<C692>î•ñ‚Ì<E2809A>Ä”z’u
|
||
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>Ä”z’u
|
||
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>Ä”z’u‚Í<E2809A>Arebootƒ‰ƒCƒuƒ‰ƒŠ‚Å<E2809A>s‚¤<E2809A>B
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// ƒJ<C692>[ƒhƒAƒvƒŠƒP<C692>[ƒVƒ‡ƒ“‚Ì<E2809A>Ä”z’u
|
||
static void SYSMi_Relocate( void )
|
||
{
|
||
u32 size;
|
||
u32 *dest = SYSM_GetCardRomHeader()->main_ram_address;
|
||
// NTRƒZƒLƒ…ƒA—̈æ‚Ì<E2809A>Ä”z’u
|
||
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>Ä”z’u<E28099>î•ñ‚ðŽQ<C5BD>Æ‚µ‚Ä<E2809A>AƒZƒLƒ…ƒA—̈æ‚Ì<E2809A>Ä”z’u<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>Ä”z’u
|
||
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>Ä”z’u<E28099>î•ñ‚ðŽQ<C5BD>Æ‚µ‚Ä<E2809A>AƒZƒLƒ…ƒA—̈æ‚Ì<E2809A>Ä”z’u<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>Ä”z’u
|
||
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>Ä”z’u
|
||
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;
|
||
}
|
||
|
||
|