mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@924 b08762b0-b915-fc4b-9d8c-17b2551a87ff
438 lines
14 KiB
C
438 lines
14 KiB
C
/*---------------------------------------------------------------------------*
|
||
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_brom.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 ) )
|
||
|
||
#ifdef ISDBG_MB_CHILD_
|
||
#define PRE_CLEAR_NUM_MAX (7*2)
|
||
#else
|
||
#define PRE_CLEAR_NUM_MAX (5*2)
|
||
#endif
|
||
|
||
#define COPY_NUM_MAX (4*3)
|
||
#define POST_CLEAR_NUM_MAX (12 + 4*2)
|
||
|
||
// 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_PARAM_RESERVED_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, HW_TWL_MAIN_MEM_SHARED,
|
||
NULL,
|
||
};
|
||
|
||
static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] =
|
||
{
|
||
HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_END,
|
||
HW_PARAM_RESERVED_END, 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, HW_TWL_MAIN_MEM_SHARED,
|
||
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 ) {
|
||
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;
|
||
|
||
(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);
|
||
|
||
// [TODO]<5D>A<EFBFBD>v<EFBFBD><76><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>Ď<EFBFBD><C48E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}<7D>E<EFBFBD><45><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD>́A<CD81><41><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B>ɂƂ<C982><C682>ď<EFBFBD><C48F>Ɉ<EFBFBD><C988>S<EFBFBD>ȏꏊ<C88F>Ȃ̂<C882><CC82>H
|
||
// <20>}<7D>E<EFBFBD><45><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>̓o<CC93>^
|
||
SYSMi_SetBootAppMountInfo( &SYSMi_GetWork2()->bootTitleProperty );
|
||
|
||
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 );
|
||
}
|
||
// 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>
|
||
{
|
||
OSFromBrom7Buf* fromBrom = (void*)HW_FIRM_FROM_BROM_BUF;
|
||
MI_CpuClearFast(fromBrom, sizeof(OSFromBrom7Buf) - sizeof(fromBrom->SDNandContext));
|
||
}
|
||
}
|
||
// 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>
|
||
NULL, NULL, // <20>萔<EFBFBD>łȂ<C582><C882>̂ł<CC82><C582>ƂŐݒ<C590>
|
||
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,
|
||
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,
|
||
};
|
||
if( ! isNtrMode )
|
||
{
|
||
mem_list[1] = (u32)th->s.sub_mount_info_ram_address - SYSM_OWN_ARM7_WRAM_ADDR;
|
||
mem_list[2] = ((u32)th->s.sub_mount_info_ram_address + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN);
|
||
mem_list[3] = SYSM_OWN_ARM7_WRAM_ADDR_END - ((u32)th->s.sub_mount_info_ram_address + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN);
|
||
}else
|
||
{
|
||
mem_list[1] = (SYSM_OWN_ARM7_WRAM_ADDR_END / 2) - SYSM_OWN_ARM7_WRAM_ADDR;
|
||
mem_list[2] = (SYSM_OWN_ARM7_WRAM_ADDR_END / 2);
|
||
mem_list[3] = SYSM_OWN_ARM7_WRAM_ADDR_END - (SYSM_OWN_ARM7_WRAM_ADDR_END / 2) ;
|
||
}
|
||
|
||
// copy forward<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;
|
||
|
||
// 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;
|
||
|
||
// <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
|
||
}
|
||
|
||
*(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 );
|
||
}
|
||
}
|