TwlIPL/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c
yoshida_teruhisa d66199876e ランチャーからアプリ起動時のヘッダ検証処理をスレッド化
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@649 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-02-13 07:02:03 +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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <sysmenu/sysmenu_lib.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);
}