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@2198 b08762b0-b915-fc4b-9d8c-17b2551a87ff
166 lines
6.3 KiB
C
166 lines
6.3 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlIPL
|
||
File: reloc_info.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 <sysmenu/sysmenu_lib.h>
|
||
#include "reboot.h"
|
||
|
||
// const data------------------------------------------------------------------
|
||
|
||
typedef struct RomSegmentRange {
|
||
u32 start;
|
||
u32 end;
|
||
}RomSegmentRange;
|
||
|
||
static RomSegmentRange romSegmentRange[RELOCATE_INFO_NUM] = {
|
||
{ SYSM_TWL_ARM9_LOAD_MMEM, SYSM_TWL_ARM9_LOAD_MMEM_END },
|
||
{ SYSM_TWL_ARM7_LOAD_MMEM, SYSM_TWL_ARM7_LOAD_MMEM_END },
|
||
{ SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END },
|
||
{ SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END },
|
||
};
|
||
|
||
static RomSegmentRange romSegmentRangeNitro[RELOCATE_INFO_NUM] = {
|
||
{ SYSM_NTR_ARM9_LOAD_MMEM, SYSM_NTR_ARM9_LOAD_MMEM_END },
|
||
{ SYSM_NTR_ARM7_LOAD_MMEM, SYSM_NTR_ARM7_LOAD_MMEM_END },
|
||
{ SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END },
|
||
{ SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END },
|
||
};
|
||
|
||
static u32 load_region_check_list[RELOCATE_INFO_NUM][RELOCATE_INFO_NUM * 2 - 1] =
|
||
{
|
||
{SYSM_NTR_ARM7_LOAD_MMEM, SYSM_NTR_ARM7_LOAD_MMEM_END,
|
||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END,
|
||
SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END,
|
||
NULL },
|
||
{SYSM_NTR_ARM9_LOAD_MMEM, SYSM_NTR_ARM9_LOAD_MMEM_END,
|
||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END,
|
||
SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END,
|
||
NULL },
|
||
{SYSM_NTR_ARM9_LOAD_MMEM, SYSM_NTR_ARM9_LOAD_MMEM_END,
|
||
SYSM_NTR_ARM7_LOAD_MMEM, SYSM_NTR_ARM7_LOAD_MMEM_END,
|
||
SYSM_TWL_ARM7_LTD_LOAD_MMEM, SYSM_TWL_ARM7_LTD_LOAD_MMEM_END,
|
||
NULL },
|
||
{SYSM_NTR_ARM9_LOAD_MMEM, SYSM_NTR_ARM9_LOAD_MMEM_END,
|
||
SYSM_NTR_ARM7_LOAD_MMEM, SYSM_NTR_ARM7_LOAD_MMEM_END,
|
||
SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_TWL_ARM9_LTD_LOAD_MMEM_END,
|
||
NULL },
|
||
};
|
||
|
||
// ============================================================================
|
||
//
|
||
// <20>Ĕz<C494>u<EFBFBD><75><EFBFBD><EFBFBD>
|
||
//
|
||
// ============================================================================
|
||
|
||
// ROM<4F>̃<EFBFBD><CC83>[<5B>h<EFBFBD><68><EFBFBD>̈<EFBFBD><CC88><EFBFBD><EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD>Ĕz<C494>u<EFBFBD>̕K<CC95>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CE83>[<5B>h<EFBFBD><68><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD><58><EFBFBD>ύX<CF8D><58><EFBFBD>A<EFBFBD>Ĕz<C494>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*info<66>ɃZ<C983>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>B
|
||
// <20><><EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>̈悪<CC88><E682AA><EFBFBD><EFBFBD><EFBFBD>Ă͂<C482><CD82><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>̈<EFBFBD><CC88>̃<EFBFBD><CC83>X<EFBFBD>gcheck_dest<73><74>{<7B>J<EFBFBD>n, <20>I<EFBFBD><49>, <20>J<EFBFBD>n<EFBFBD>Q, <20>I<EFBFBD><49><EFBFBD>Q, <20>c<EFBFBD>c, NULL}<7D>̌`<60><><EFBFBD>B
|
||
// <20>Ĕz<C494>u<EFBFBD>̗L<CC97>薳<EFBFBD><E896B3><EFBFBD>Ɋւ<C98A><D682>炸<EFBFBD><E782B8><EFBFBD>[<5B>h<EFBFBD>\<5C>Ȃ<EFBFBD><C882><EFBFBD>TRUE<55>A<EFBFBD><41><EFBFBD>[<5B>h<EFBFBD>s<EFBFBD>\<5C>Ȃ<EFBFBD><C882><EFBFBD>FALSE<53><45><EFBFBD>Ԃ<EFBFBD>
|
||
// <20>Ĕz<C494>u<EFBFBD><75><EFBFBD>K<EFBFBD>v<EFBFBD>Ȃ<EFBFBD><C882>ꍇ<EFBFBD>A<EFBFBD>Ĕz<C494>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD>src,dest,length<74>ɂ͂<C982><CD82>ꂼ<EFBFBD><EA82BC>NULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||
static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx
|
||
( u32 *dest, u32 length, RomSegmentRange default_region, u32 *check_dest, Relocate_Info *info )
|
||
{
|
||
u32 ori_len = length;
|
||
|
||
// AES<45>Í<EFBFBD><C38D><EFBFBD><EFBFBD>̈<EFBFBD><CC88>̊W<D68C>ŁA<C581>Ĕz<C494>u<EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>уT<D183>C<EFBFBD>Y<EFBFBD>I<EFBFBD>[<5B>o<EFBFBD>[<5B>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>Ɏg<C98E><67>length<74><68>32<33>o<EFBFBD>C<EFBFBD>g<EFBFBD>A<EFBFBD><41><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>ɕ
|
||
// <20>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD>łȂ<C582><C882>ƁA<C681>f<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD><67><EFBFBD>[<5B>h<EFBFBD>̈<EFBFBD><CC88>̌<EFBFBD><CC8C>됔<EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD>܂<EFBFBD>AES<45>Í<EFBFBD><C38D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD><DC82>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>邽<EFBFBD>߁j
|
||
length = MATH_ROUNDUP( length, SYSM_ALIGNMENT_LOAD_MODULE );
|
||
MI_CpuClearFast( info, sizeof(Relocate_Info) );
|
||
if( default_region.end - default_region.start < length ) return FALSE;// <20>T<EFBFBD>C<EFBFBD>Y<EFBFBD>I<EFBFBD>[<5B>o<EFBFBD>[
|
||
if( !( default_region.start <= *dest && *dest + length <= default_region.end ) )
|
||
{
|
||
// <20>Ĕz<C494>u<EFBFBD>̕K<CC95>v<EFBFBD><76><EFBFBD><EFBFBD>
|
||
while( *check_dest != NULL )
|
||
{
|
||
if( check_dest[0] < *dest + length && *dest < check_dest[1] ) return FALSE;// <20>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>̈<EFBFBD><CC88>ɔ<EFBFBD><C994><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NG
|
||
check_dest += 2;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>length<74>łȂ<C582>ori_len<65><6E><EFBFBD>g<EFBFBD>p
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>܂ŗ<DC82><C597>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ĕz<C494>u<EFBFBD><75>
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>s<EFBFBD>[<5B>t<EFBFBD><74><EFBFBD>OOFF
|
||
info->rev = FALSE;
|
||
if( default_region.start < *dest + ori_len && *dest + ori_len <= default_region.end )
|
||
{
|
||
// <20>f<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>z<EFBFBD>u<EFBFBD>̈<EFBFBD><CC88>̐擪<CC90><E693AA><EFBFBD>ɁA<C981>Ĕz<C494>u<EFBFBD><75><EFBFBD>̌㕔<CC8C><E39594><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD>
|
||
// <20>|<7C>X<EFBFBD>g<EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD>
|
||
info->post_clear_addr = *dest + ori_len;
|
||
info->post_clear_length = default_region.end - (*dest + ori_len);
|
||
}
|
||
else if( default_region.start <= *dest && *dest < default_region.end )
|
||
{
|
||
// <20>f<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>z<EFBFBD>u<EFBFBD>̈<EFBFBD><CC88>̌㕔<CC8C>ɁA<C981>Ĕz<C494>u<EFBFBD><75><EFBFBD>̐擪<CC90><E693AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD>
|
||
// <20>|<7C>X<EFBFBD>g<EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD>
|
||
info->post_clear_addr = default_region.start;
|
||
info->post_clear_length = *dest - default_region.start;
|
||
if( *dest < default_region.start + ori_len )
|
||
{
|
||
// <20>X<EFBFBD>ɁA<C981>f<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>z<EFBFBD>u<EFBFBD>̈<EFBFBD><CC88>Ƀ<EFBFBD><C983>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>f<EFBFBD>[<5B>^<5E>̍Ō<CC8D><C58C><EFBFBD><EFBFBD>ƍĔz<C494>u<EFBFBD><75><EFBFBD>̐擪<CC90><E693AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD>
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>s<EFBFBD>[<5B>t<EFBFBD><74><EFBFBD>OON
|
||
info->rev = TRUE;
|
||
}
|
||
}else
|
||
{
|
||
// <20>܂<EFBFBD><DC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>Ȃ<EFBFBD>
|
||
// <20>|<7C>X<EFBFBD>g<EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD>
|
||
info->post_clear_addr = default_region.start;
|
||
info->post_clear_length = default_region.end - default_region.start;
|
||
}
|
||
info->src = default_region.start;
|
||
info->dest = *dest;
|
||
info->length = ori_len;
|
||
*dest = default_region.start;
|
||
}else
|
||
{
|
||
// <20>Ĕz<C494>u<EFBFBD>̕K<CC95>v<EFBFBD>Ȃ<EFBFBD>
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
// SYSMi_CheckLoadRegionAndSetRelocateInfoEx<45>̃<EFBFBD><CC83>b<EFBFBD>p<EFBFBD>[<5B><EFBFBD>
|
||
BOOL SYSM_CheckLoadRegionAndSetRelocateInfo( RomSegmentName seg, u32 *dest, u32 length, Relocate_Info *info, BOOL isTwlApp)
|
||
{
|
||
RomSegmentRange *rsr;
|
||
if( isTwlApp )
|
||
{
|
||
rsr = romSegmentRange;
|
||
}else
|
||
{
|
||
//NTR<54><52><EFBFBD>p
|
||
rsr = romSegmentRangeNitro;
|
||
}
|
||
|
||
// *dest <20><><EFBFBD><EFBFBD> *dest+length <20><><EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>֎~<7E>̈<EFBFBD><CC88>iLauncher<65>ŏI<C58F>u<EFBFBD>[<5B>g<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>y<EFBFBD>уG<D183><47><EFBFBD>g<EFBFBD><67><EFBFBD>|<7C>C<EFBFBD><43><EFBFBD>g<EFBFBD>s<EFBFBD>̈<C297><CC88>j<EFBFBD>ɔ<EFBFBD><C994><EFBFBD><EFBFBD>Ă<EFBFBD><C482>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>ǂ<EFBFBD><C782><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if( (
|
||
( seg == ARM9_STATIC || seg == ARM9_LTD_STATIC ) &&
|
||
!( ( *dest >= HW_MAIN_MEM ) && ( *dest + length < HW_TWL_MAIN_MEM_SHARED ) )
|
||
) ||
|
||
( ( seg == ARM7_STATIC || seg == ARM7_LTD_STATIC ) &&
|
||
!( ( ( *dest >= HW_MAIN_MEM ) &&
|
||
( *dest + length < HW_TWL_MAIN_MEM_SHARED ) ) ||
|
||
( ( *dest >= HW_WRAM_BASE ) &&
|
||
( *dest + length < SYSM_NTR_ARM7_LOAD_WRAM_END ) ) )
|
||
) ||
|
||
!( ( *dest + length < OS_BOOT_A9CODE_BUF ) || ( *dest >= OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE ) ) ||
|
||
!( ( *dest + length < OS_BOOT_A7CODE_BUF ) || ( *dest >= OS_BOOT_A7CODE_BUF + OS_BOOT_CODE_SIZE ) )
|
||
) {
|
||
OS_TPrintf("load address invalid.\n");
|
||
return FALSE;
|
||
}
|
||
|
||
return SYSMi_CheckLoadRegionAndSetRelocateInfoEx(dest, length, rsr[seg], load_region_check_list[seg], info);
|
||
}
|