mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
SDKのlauncherParam.hおよびos_launcherParam.cをリビジョン3425に更新する必要アリ(全体を更新した場合のビルドは未確認) eseを使っていたのでesを使うように変更 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@454 b08762b0-b915-fc4b-9d8c-17b2551a87ff
139 lines
5.1 KiB
C
139 lines
5.1 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:: 2007-12-12#$
|
||
$Rev: 355 $
|
||
$Author: yosiokat $
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#include <sysmenu/sysmenu_lib/common/sysmenu_work.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 )
|
||
{
|
||
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>܂ŗ<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 + length && *dest + length <= 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 + length;
|
||
info->post_clear_length = default_region.end - (*dest + length);
|
||
}
|
||
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 + length )
|
||
{
|
||
// <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 = length;
|
||
*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;
|
||
}
|
||
return SYSMi_CheckLoadRegionAndSetRelocateInfoEx(dest, length, rsr[seg], load_region_check_list[seg], info);
|
||
}
|