TwlIPL/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c
yoshida_teruhisa d90815eb3c プリロードアプリ起動のサンプルでSDKの関数を使用するよう変更
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
2008-01-10 06:15:28 +00:00

139 lines
5.1 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: 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);
}