TwlIPL/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c
yoshida_teruhisa 3fa8093c22 前回ブートがNTRならランチャーパラメータ無効にする処理の有効化
ランチャーからのアプリブート時、ランチャー自身のマウントパスをクリア

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@971 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-03-27 01:02:18 +00:00

457 lines
16 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: 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 <twl.h>
#include <twl/mcu.h>
#include <twl/cdc.h>
#include <twl/aes/ARM7/lo.h>
#include <sysmenu.h>
#include <sysmenu/hotsw.h>
#include <sysmenu/ds.h>
#include <firm/hw/ARM7/mmap_firm.h>
#include <firm/format/from_firm.h>
#include <firm/aes/ARM7/aes_init.h>
#include <firm/os/common/boot.h>
#include "reboot.h"
#include "internal_api.h"
// define data-------------------------------------------------------
#define MAINP_SEND_IF 0x2000
#define reg_MI_MC_SWP (*(REGType8v *) ( REG_MC1_ADDR + 1 ) )
#define PRE_CLEAR_NUM_MAX (5*2)
#define COPY_NUM_MAX (5*3)
#define POST_CLEAR_NUM_MAX (12 + 4*2)
#define CLRLIST_OWN_ARM7_WRAM_SIZE_IDX 1
#define CLRLIST_REBOOT_STACK_PAD_SIZE_IDX (2*3+1)
// extern data-------------------------------------------------------
// function's prototype----------------------------------------------
static void BOOTi_ClearREG_RAM( void );
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end );
// global variables--------------------------------------------------
// static variables--------------------------------------------------
static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
{
HW_MAIN_MEM_PARAMETER_BUF_END, SYSM_OWN_ARM7_MMEM_ADDR,
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR,
SYSM_OWN_ARM9_MMEM_ADDR_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
NULL,
};
static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
{
HW_MAIN_MEM_PARAMETER_BUF, SYSM_OWN_ARM7_MMEM_ADDR,
SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF,
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_DBG_NTR_SYSTEM_BUF,
SYSM_OWN_ARM9_MMEM_ADDR_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN,
NULL,
};
// const data--------------------------------------------------------
// dev_commonKey<65>̓x<CD83>^<5E>Ŏ<EFBFBD><C58E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
static const u8 dev_commonKey[] = {
0xA1, 0x60, 0x4A, 0x6A, 0x71, 0x23, 0xB5, 0x29,
0xAE, 0x8B, 0xEC, 0x32, 0xC8, 0x16, 0xFC, 0xAA
};
static const u8 dev_seedES[] = {
0x2D, 0xD4, 0x03, 0x98, 0xA7, 0x6B, 0x03, 0x28,
0xCE, 0x61, 0x04, 0xBB, 0x0A, 0xBB, 0x03, 0x5B,
};
static const u8 dev_seedNAM[] = {
0x4D, 0x04, 0xA4, 0x7F, 0xE3, 0x02, 0x30, 0x2E,
0x2A, 0x07, 0x06, 0xE6, 0xD9, 0x06, 0x47, 0x76,
};
static const u8 dev_seedSlotC[] = {
0x3B, 0x06, 0x86, 0x57, 0x33, 0x04, 0x88, 0x11,
0x49, 0x04, 0x6B, 0x33, 0x12, 0x02, 0xAC, 0xF3,
};
void BOOT_Init( void )
{
reg_PXI_MAINPINTF = 0x0000;
}
BOOL BOOT_WaitStart( void )
{
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
// <20>œK<C593><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƃ|<7C>C<EFBFBD><43><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł͉<C582><CD89><EFBFBD><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>͐<EFBFBD><CD90><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD>
ROM_Header *th = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; // TWL<57>g<EFBFBD><67>ROM<4F>w<EFBFBD>b<EFBFBD>_<EFBFBD>iDS<44>A<EFBFBD>v<EFBFBD><76><EFBFBD>ɂ͖<C982><CD96><EFBFBD><EFBFBD>j
ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS<44>݊<EFBFBD>ROM<4F>w<EFBFBD>b<EFBFBD>_
BOOL isNtrMode;
// <20>w<EFBFBD>b<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>Ĕz<C494>u
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL )
{
// TWL-ROM<4F>w<EFBFBD>b<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>̍Ĕz<C494>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 {
// NTR<54><52><EFBFBD>[<5B>h
// TWL-ROM<4F>w<EFBFBD>b<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>̍Ĕz<C494>u
// <20><><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B><>ROM<4F>w<EFBFBD>b<EFBFBD>_<EFBFBD><5F><EFBFBD>c<EFBFBD><63><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>s<EFBFBD>[<5B>̈<EFBFBD><CC88><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>A
MI_CpuClearFast( (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE );
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 );
}
(void)OS_DisableIrq(); // <20><><EFBFBD><EFBFBD><EFBFBD>Ŋ<EFBFBD><C58A><EFBFBD>݋֎~<7E>ɂ<EFBFBD><C982>Ȃ<EFBFBD><C882>ƃ_<C683><5F><EFBFBD>B
(void)OS_SetIrqMask(0); // SDK<44>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>̃T<CC83>[<5B>`<60>Ɏ<EFBFBD><C98E>Ԃ<EFBFBD><D482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƁAARM9<4D><39>HALT<4C>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>AARM7<4D>̃T<CC83>E<EFBFBD><45><EFBFBD>h<EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>h<EFBFBD><68>ARM9<4D><39>FIFO<46>Ńf<C583>[<5B>^<5E><><EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>Ă<EFBFBD>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>ő<EFBFBD><C591>M<EFBFBD>ł<EFBFBD><C582>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>ԂŖ<D482><C596><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B>v<EFBFBD>ɓ<EFBFBD><C993><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>B
(void)OS_SetIrqMaskEx(0);
// <20>}<7D>E<EFBFBD><45><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49>SYSM_TWL_MOUNT_INFO_TMP_BUFFER<45>ɓo<C993>^
// <20><><EFBFBD><EFBFBD><EFBFBD>܂ł<DC82>HW_TWL_ROM_HEADER_BUF<55>̃w<CC83>b<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>̃A<CC83>v<EFBFBD><76><EFBFBD>̂<EFBFBD><CC82>̂ɕύX<CF8D><58><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD>
SYSMi_SetBootAppMountInfo( &SYSMi_GetWork2()->bootTitleProperty );
// FS<46>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD>shared<65>̈<EFBFBD><CC88>ɃR<C983>s<EFBFBD>[<5B><><EFBFBD><EFBFBD><EA82BD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B><><EFBFBD>g<EFBFBD>̃}<7D>E<EFBFBD><45><EFBFBD>g<EFBFBD>p<EFBFBD>X<EFBFBD>̃N<CC83><4E><EFBFBD>A
MI_CpuClearFast((char *)HW_TWL_FS_BOOT_SRL_PATH_BUF, OS_MOUNT_PATH_LEN);
BOOTi_ClearREG_RAM(); // ARM7<4D><37><EFBFBD>̃<EFBFBD><CC83><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>N<EFBFBD><4E><EFBFBD>A<EFBFBD>B
reg_MI_MBK9 = 0; // <20>SWRAM<41>̃<EFBFBD><CC83>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD>
reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9<4D>ɑ΂<C991><CE82>ău<C483>[<5B>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>悤IRQ<52>ŗv<C597><76><EFBFBD>{ARM7<4D>̃X<CC83>e<EFBFBD>[<5B>g<EFBFBD><67><EFBFBD>P<EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B
// TWL/NTR<54><52><EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD>
if ( ! dh->s.platform_code ||
(SYSM_IsRunOnDebugger() && ((SYSMRomEmuInfo*)HOTSW_GetRomEmulationBuffer())->isForceNTRMode) )
{
isNtrMode = TRUE;
}
else
{
isNtrMode = FALSE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̈<EFBFBD><CC88>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD>B
// <20>u<EFBFBD>[<5B>g<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD>ROM<4F>w<EFBFBD>b<EFBFBD>_<EFBFBD><5F>accessKeyControl<6F><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĕ<EFBFBD><C494><EFBFBD>
// <20><><EFBFBD>n<EFBFBD><6E><EFBFBD>́AIRQ<52>X<EFBFBD>^<5E>b<EFBFBD>N<EFBFBD>̈<EFBFBD><CC88><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>̂ŁA<C581><41><EFBFBD><EFBFBD>݂<EFBFBD><DD82>֎~<7E><><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>B
{
BOOL isClearSlotB = TRUE;
BOOL isClearSlotC = TRUE;
MI_CpuClearFast( (void *)HW_LAUNCHER_DELIVER_PARAM_BUF, HW_LAUNCHER_DELIVER_PARAM_BUF_SIZE );
if( ! isNtrMode ) {
if( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK ) {
// commonClientKey
if( th->s.access_control.common_client_key ) {
void *pCommonKey = ( SCFG_GetBondingOption() == SCFG_OP_PRODUCT ) ?
OSi_GetFromFirmAddr()->aes_key[ 0 ] : (void *)dev_commonKey;
MI_CpuCopy8( pCommonKey, (void *)HW_LAUNCHER_DELIVER_PARAM_BUF, AES_BLOCK_SIZE );
}
// commonClientKeyForDebugger
else if( th->s.access_control.common_client_key_for_debugger_sysmenu ) {
MI_CpuCopy8( OSi_GetFromFirmAddr()->aes_key[ 1 ], (void *)HW_LAUNCHER_DELIVER_PARAM_BUF, AES_BLOCK_SIZE );
}
// HW AES Slot B
if( th->s.access_control.hw_aes_slot_B ) {
void *pSeedES = ( SCFG_GetBondingOption() == SCFG_OP_PRODUCT ) ?
&( OSi_GetFromFirmAddr()->rsa_pubkey[ 3 ][ 0 ] ) : (void *)dev_seedES;
MI_CpuCopy8( pSeedES, (void *)( HW_LAUNCHER_DELIVER_PARAM_BUF + 0x10 ), AES_BLOCK_SIZE );
isClearSlotB = FALSE;
// AES<45>X<EFBFBD><58><EFBFBD>b<EFBFBD>g<EFBFBD>̃f<CC83>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>l<EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD>͕s<CD95>v
}
// HW AES Slot C
if( th->s.access_control.hw_aes_slot_C ) {
void *pSeedNAM = ( SCFG_GetBondingOption() == SCFG_OP_PRODUCT ) ?
&( OSi_GetFromFirmAddr()->rsa_pubkey[ 3 ][ 0x10 ] ) : (void *)dev_seedNAM;
void *pSeedSlotC = ( SCFG_GetBondingOption() == SCFG_OP_PRODUCT ) ?
&( OSi_GetFromFirmAddr()->rsa_pubkey[ 3 ][ 0x20 ] ) : (void *)dev_seedSlotC;
MI_CpuCopy8( pSeedNAM, (void *)( HW_LAUNCHER_DELIVER_PARAM_BUF + 0x20 ), AES_BLOCK_SIZE );
isClearSlotC = FALSE;
// AES<45>X<EFBFBD><58><EFBFBD>b<EFBFBD>g<EFBFBD>̃f<CC83>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>l<EFBFBD>Z<EFBFBD>b<EFBFBD>g
AES_Lock();
AES_SetKeySeedC( pSeedSlotC );
AES_Unlock();
}
}
}
// <20>u<EFBFBD>[<5B>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>ɉ<EFBFBD><C989><EFBFBD><EFBFBD>āAAES<45>L<EFBFBD>[<5B>X<EFBFBD><58><EFBFBD>b<EFBFBD>g<EFBFBD>̃N<CC83><4E><EFBFBD>A<EFBFBD><41><EFBFBD>s<EFBFBD><73><EFBFBD>B
AESi_ResetAesKeyA();
if( isClearSlotB ) AESi_ResetAesKeyB();
if( isClearSlotC ) AESi_ResetAesKeyC();
// <20><><EFBFBD>͕s<CD95>v<EFBFBD>ɂȂ<C982><C882>̂ŁA<C581><41><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD>
{
OSFromFirmBuf* fromFirm = (void*)HW_FIRM_FROM_FIRM_BUF;
MI_CpuClearFast(fromFirm, sizeof(OSFromFirmBuf));
}
}
// SDK<44><4B><EFBFBD>ʃ<EFBFBD><CA83>u<EFBFBD>[<5B>g
{
REBOOTTarget target = REBOOT_TARGET_TWL_SYSTEM;
int list_count = PRE_CLEAR_NUM_MAX + 1;
int l;
u32 *post_clear_list;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>̐ݒ<CC90>
// [TODO:] <20>V<EFBFBD><56><EFBFBD>b<EFBFBD>v<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>Ō<EFBFBD><C58C><EFBFBD><EFBFBD>c<EFBFBD><63><EFBFBD><EFBFBD>ANAND<4E>t<EFBFBD>@<40>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̗̈<CC97><CC88>iWRAM<41>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD>ɒ<EFBFBD><C992>ӁB
// WRAM<41><4D><EFBFBD>}<7D>b<EFBFBD>v<EFBFBD><76><EFBFBD>̏<EFBFBD><CC8F><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>I<EFBFBD>[<5B>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD>̌<EFBFBD><CC8C>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>ߕs<DF95>v<EFBFBD>Ȍ<EFBFBD><C88C><EFBFBD>pre clear<61>ŏ<EFBFBD><C58F><EFBFBD><EFBFBD>B
// [TODO:] DSP<53>̎g<CC8E><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD>WRAM<41><4D><EFBFBD>ǂ<EFBFBD><C782><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><C782>܂ŏ<DC82><C58F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>H
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
{
// pre clear
SYSM_OWN_ARM7_WRAM_ADDR, NULL, // SYSM_OWN_ARM7_WRAM_ADDR<44>iSDK_AUTOLOAD_WRAM_START<52>j<EFBFBD>̓<EFBFBD><CD83><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Œ萔<C592>łȂ<C582>
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
OS_BOOT_CODE_BUF_END, 1, // REBOOT<4F>R<EFBFBD>A<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>ƃX<C683>^<5E>b<EFBFBD>N<EFBFBD>̌<EFBFBD><CC8C>ԃT<D483>C<EFBFBD>Y<EFBFBD>̓<EFBFBD><CD83><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɍ<EFBFBD><C98D><EFBFBD><EFBFBD>ւ<EFBFBD><D682><EFBFBD><EFBFBD>iNULL<4C>ł<EFBFBD>REBOOT_GetCoreStackSize<7A><65><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>j
HW_WRAM_BASE, HW_WRAM_SIZE, // <20><><EFBFBD>LWRAM<41>@<40>@Launcher<65>̓<EFBFBD><CC93><EFBFBD><EFBFBD>z<EFBFBD>u<EFBFBD>Ȃ̂ŁABASE<53><45><EFBFBD><EFBFBD><EFBFBD>T<EFBFBD>C<EFBFBD>Y<EFBFBD>Ԃ<EFBFBD>
NULL,
// copy forward
NULL,
// copy backward
NULL,
// post clear
NULL,
};
mem_list[CLRLIST_OWN_ARM7_WRAM_SIZE_IDX] = SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR;
// copy forward<72><64><EFBFBD>X<EFBFBD>g<EFBFBD>ݒ<EFBFBD>
mem_list[list_count++] = SYSM_TWL_MOUNT_INFO_TMP_BUFFER;
mem_list[list_count++] = (u32)th->s.sub_mount_info_ram_address;
mem_list[list_count++] = SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN;
for( l=0; l<RELOCATE_INFO_NUM ; l++ )
{
if( SYSMi_GetWork()->romRelocateInfo[l].src != NULL && !SYSMi_GetWork()->romRelocateInfo[l].rev )
{
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].src;
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].dest;
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].length;
}
}
mem_list[list_count++] = NULL;
// copy backward<72><64><EFBFBD>X<EFBFBD>g<EFBFBD>ݒ<EFBFBD>
for( l=0; l<RELOCATE_INFO_NUM ; l++ )
{
if( SYSMi_GetWork()->romRelocateInfo[l].src != NULL && SYSMi_GetWork()->romRelocateInfo[l].rev )
{
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].src;
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].dest;
mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].length;
}
}
mem_list[list_count++] = NULL;
// post clear<61><72><EFBFBD>X<EFBFBD>g<EFBFBD>ݒ<EFBFBD>
if ( ! isNtrMode )
{
post_clear_list = twl_post_clear_list;
BOOTi_CutAwayRegionList( post_clear_list, (u32)th->s.main_ltd_ram_address, (u32)th->s.main_ltd_ram_address + th->s.main_ltd_size);
BOOTi_CutAwayRegionList( post_clear_list, (u32)th->s.sub_ltd_ram_address, (u32)th->s.sub_ltd_ram_address + th->s.sub_ltd_size);
}else
{
post_clear_list = nitro_post_clear_list;
}
BOOTi_CutAwayRegionList( post_clear_list, (u32)dh->s.main_ram_address, (u32)dh->s.main_ram_address + dh->s.main_size);
BOOTi_CutAwayRegionList( post_clear_list, (u32)dh->s.sub_ram_address, (u32)dh->s.sub_ram_address + dh->s.sub_size);
for( l=0; post_clear_list[l]!=NULL ; l+=2 )
{
mem_list[list_count++] = post_clear_list[l];
mem_list[list_count++] = post_clear_list[l+1] - post_clear_list[l];
}
mem_list[list_count] = NULL;
// REBOOT<4F>R<EFBFBD>A<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>ƃX<C683>^<5E>b<EFBFBD>N<EFBFBD>̌<EFBFBD><CC8C>ԃT<D483>C<EFBFBD>Y<EFBFBD><59><EFBFBD>Z<EFBFBD>o
mem_list[CLRLIST_REBOOT_STACK_PAD_SIZE_IDX] = OS_BOOT_STACK_TOP - REBOOT_GetCoreStackSize(mem_list) - OS_BOOT_CODE_BUF_END;
// <20>T<EFBFBD>E<EFBFBD><45><EFBFBD>h<EFBFBD><68><EFBFBD>~
SND_Shutdown();
// <20>A<EFBFBD>v<EFBFBD><76><EFBFBD>P<EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49>
if ( ! isNtrMode )
{
if ( th->s.titleID_Hi & TITLE_ID_HI_APP_TYPE_MASK )
{
if ( th->s.titleID_Hi & TITLE_ID_HI_SECURE_FLAG_MASK )
{
target = REBOOT_TARGET_TWL_SECURE;
}
else
{
target = REBOOT_TARGET_TWL_SYSTEM;
}
}
else
{
target = REBOOT_TARGET_TWL_APP;
}
#ifdef SYSMENU_DISABLE_TWL_BOOT
while (1)
{
}
#endif // SYSMENU_DISABLE_TWL_BOOT
}
else
{
target = REBOOT_TARGET_DS_APP;
}
// <20>O<EFBFBD><4F><EFBFBD>f<EFBFBD>|<7C>b<EFBFBD>v<EFBFBD><76><EFBFBD>H<EFBFBD><48><EFBFBD>L<EFBFBD><4C><EFBFBD>ɂ<EFBFBD><C982><EFBFBD>
CDC_EnableExternalDepop();
// I2S<32><53><EFBFBD>~<7E>iMCLK<4C>͓<EFBFBD><CD93><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD>j
reg_SND_SMX_CNT &= ~REG_SND_SMX_CNT_E_MASK;
if ( isNtrMode || th->s.codec_mode == OS_CODECMODE_NITRO )
{
// <20>iCODEC-DS<44><53><EFBFBD>[<5B>h<EFBFBD>j
CDC_GoDsMode();
}
else
{
// <20>ď<EFBFBD><C48F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>iCODEC-TWL<57><4C><EFBFBD>[<5B>h<EFBFBD>j
CDC_Init();
}
// I2S<32>ĊJ
// DS<44>T<EFBFBD>E<EFBFBD><45><EFBFBD>h<EFBFBD>FDSP = 8:0
// 32KHz
reg_SND_SMX_CNT = REG_SND_SMX_CNT_MIX_RATE_MASK |
REG_SND_SMX_CNT_E_MASK;
// <20>f<EFBFBD>|<7C>b<EFBFBD>v<EFBFBD><76><EFBFBD>Ԃ̂<D482><CC82>ƊO<C68A><4F><EFBFBD>f<EFBFBD>|<7C>b<EFBFBD>v<EFBFBD><76><EFBFBD>H<EFBFBD>𖳌<EFBFBD><F096B38C>ɂ<EFBFBD><C982><EFBFBD>
// <20>P<EFBFBD><50><EFBFBD>ȃE<C883>F<EFBFBD>C<EFBFBD>g<EFBFBD>ɂȂ邽<C882>߁A<DF81><41><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>ɂ̓R<CD83><52><EFBFBD>|<7C>[<5B>l<EFBFBD><6C><EFBFBD>g<EFBFBD>Ńf<C583>|<7C>b<EFBFBD>v<EFBFBD><76>
// <20><><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD>ɕύX<CF8D><58><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD>iTODO)
OS_SpinWait(OS_MilliSecondsToTicks(100) * 64);
CDC_DisableExternalDepop();
#ifdef SDK_ARM7
// <20>f<EFBFBD>o<EFBFBD>b<EFBFBD>K<EFBFBD>ł<EFBFBD>TWL<57>J<EFBFBD>[<5B>h<EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>g<EFBFBD>Q<EFBFBD><51><EFBFBD>d<EFBFBD><64>ON
if ( SYSM_IsRunOnDebugger() )
{
HOTSWi_TurnCardPowerOn( 2 );
}
#endif // SDK_ARM7
#if defined(FIRM_USE_TWLSDK_KEYS) || defined(SYSMENU_DISABLE_RETAIL_BOOT)
// TwlSDK<44><4B><EFBFBD>̌<EFBFBD><CC8C><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD>͐<EFBFBD><CD90>i<EFBFBD>pCPU<50>ł<EFBFBD>TWL<57>A<EFBFBD>v<EFBFBD><76><EFBFBD>̓u<CD83>[<5B>g<EFBFBD><67><EFBFBD>Ȃ<EFBFBD>
if ( ! (*(u8*)HWi_WSYS08_ADDR & HWi_WSYS08_OP_OPT_MASK) )
{
OS_Terminate();
}
#endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT
// <20><><EFBFBD>u<EFBFBD>[<5B>g
OS_Boot( dh->s.sub_entry_address, mem_list, target );
}
}
return FALSE;
}
static void BOOTi_ClearREG_RAM( void )
{
if( SYSMi_GetWork()->flags.common.isCardBoot ) {
#ifdef DEBUG_USED_CARD_SLOT_B_
reg_MI_MC_SWP ^= 0x80; // <20>J<EFBFBD>[<5B>h<EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>g<EFBFBD>̃X<CC83><58><EFBFBD>b<EFBFBD>v
#endif
*(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // <20>J<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40>ɃJ<C983>[<5B>hID<49><44><EFBFBD>Z<EFBFBD>b<EFBFBD>g
}else {
*(u32 *)HW_BOOT_CHECK_INFO_BUF = 0;
}
*(vu32 *)HW_RESET_PARAMETER_BUF = 0; // <20><><EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@<40><><EFBFBD>N<EFBFBD><4E><EFBFBD>A
// <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>N<EFBFBD><4E><EFBFBD>A<EFBFBD>͊<EFBFBD><CD8A>{<7B>I<EFBFBD><49> OS_Boot <20>ōs<C58D><73>
// <20>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD>Ă<EFBFBD><C482>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>́AVCOUNT, JOY, PIFCNT, MC-, EXMEMCNT, IME, PAUSE, POWLCDCNT, <20><><EFBFBD>Z<EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>B<EFBFBD>n<EFBFBD>ł<EFBFBD><C582>B
(void)OS_ResetRequestIrqMask((u32)~0);
(void)OS_ResetRequestIrqMaskEx((u32)~0);
}
// <20>P<EFBFBD><50><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>v<EFBFBD>f<EFBFBD>
static void BOOTi_DeliteElementFromList( u32 *list, u32 index )
{
int l;
for( l=(int)index; list[l]!=NULL; l++ )
{
list[l] = list[l+1];
}
}
// <20>P<EFBFBD><50><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>v<EFBFBD>f<EFBFBD>lj<EFBFBD>
static void BOOTi_InsertElementToList( u32 *list, u32 index, u32 value )
{
int l = (int)index;
while(list[l]!=NULL)
{
l++;
}
list[l+1] = NULL;
for( ; index<l; l-- )
{
list[l] = list[l-1];
}
list[l] = value;
}
// {first1, last1, first2, last2, ... , NULL}<7D>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>`<60><><EFBFBD>̗̈惊<CC88>X<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD>
// {start, end}<7D>̗̈<CC97><CC88><EFBFBD><EFBFBD>؂<EFBFBD><D882><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>Ԃ<EFBFBD><D482>֐<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ɗ^<5E><><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>͗v<CD97>f<EFBFBD><66><EFBFBD>ő<EFBFBD>2<EFBFBD>lj<EFBFBD><C789><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߁A<DF81>\<5C><><EFBFBD>ȑ傫<C891><E582AB><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v
// <20>܂<EFBFBD><DC82>A<EFBFBD>̈惊<CC88>X<EFBFBD>g<EFBFBD>̗v<CC97>f<EFBFBD>́A<CD81>Ō<EFBFBD><C58C><EFBFBD><EFBFBD><EFBFBD>NULL<4C>ȊO<C88A><4F><EFBFBD><EFBFBD><EFBFBD>ɕ<EFBFBD><C995><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end )
{
int l, m, n;
if( end <= start ) return;
for( l=0; regionlist[l]!=NULL; l++ )
{
if( regionlist[l] >= start )
{
break;
}
}
for( m=l; regionlist[m]!=NULL; m++ )
{
if( regionlist[m] > end )
{
break;
}
}
// <20><><EFBFBD>̎<EFBFBD><CC8E>_<EFBFBD><5F>regionlist[l]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>regionlist[m]<5D>́Astart <= regionlist[l], end < regionlist[m]<5D>ŁA<C581><41><EFBFBD>ł<C28D><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȓl
if( m % 2 == 1 )
{
BOOTi_InsertElementToList( regionlist, (u32)m, end );
// end<6E><64><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>ɒlj<C992><C789><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Am<41>͒lj<CD92><C789><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>f<EFBFBD><66><EFBFBD>w<EFBFBD><77><EFBFBD><EFBFBD><E682A4>
}
if( l % 2 == 1 )
{
BOOTi_InsertElementToList( regionlist, (u32)l, start );
m++;
// start<72><74><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>ɒlj<C992><C789><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Am<41><6D>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
l++;
// start<72><74><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>ɒlj<C992><C789><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Al<41>͒lj<CD92><C789><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>f<EFBFBD>̎<EFBFBD><CC8E>̗v<CC97>f<EFBFBD><66><EFBFBD>w<EFBFBD><77><EFBFBD><EFBFBD><E682A4>
}
// regionlist[l]<5D><><EFBFBD><EFBFBD>regionlist[m-1]<5D>܂ł̗v<CC97>f<EFBFBD><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for( n=l; l<m; l++ )
{
BOOTi_DeliteElementFromList( regionlist, (u32)n );
}
}