From 57a883ac6e4e2b747a7d8b8598db5bee99251f46 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Thu, 20 Dec 2007 04:09:46 +0000 Subject: [PATCH] =?UTF-8?q?libraries=5Fsysmenu=E3=81=ABreloc=5Finfo?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=82=20=E5=86=8D=E9=85=8D=E7=BD=AE=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E9=96=A2=E4=BF=82=E3=81=AE=E3=83=87=E3=83=BC=E3=82=BF=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E3=82=84=E9=96=A2=E6=95=B0=E3=82=92=E3=81=9D=E3=81=A1?= =?UTF-8?q?=E3=82=89=E3=81=AB=E7=A7=BB=E5=8B=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@384 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/components/hyena.TWL/hyena.lsf | 1 + build/libraries_sysmenu/Makefile | 2 +- .../reloc_info/ARM7/Makefile | 49 ++++++ .../reloc_info/ARM9/Makefile | 49 ++++++ build/libraries_sysmenu/reloc_info/Makefile | 30 ++++ .../reloc_info/common/src/reloc_info.c | 145 ++++++++++++++++++ .../sysmenu/ARM9/src/sysmenu_lib.c | 79 ---------- build/systemMenu_RED/Launcher/ARM9/Makefile | 4 +- .../sysmenu/reloc_info/common/reloc_info.h | 60 ++++++++ .../sysmenu/sysmenu_lib/ARM9/sysmenu_api.h | 10 +- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 12 +- 11 files changed, 340 insertions(+), 101 deletions(-) create mode 100644 build/libraries_sysmenu/reloc_info/ARM7/Makefile create mode 100644 build/libraries_sysmenu/reloc_info/ARM9/Makefile create mode 100644 build/libraries_sysmenu/reloc_info/Makefile create mode 100644 build/libraries_sysmenu/reloc_info/common/src/reloc_info.c create mode 100644 include/sysmenu/reloc_info/common/reloc_info.h diff --git a/build/components/hyena.TWL/hyena.lsf b/build/components/hyena.TWL/hyena.lsf index 8a9f8a5b..205d40ba 100644 --- a/build/components/hyena.TWL/hyena.lsf +++ b/build/components/hyena.TWL/hyena.lsf @@ -56,6 +56,7 @@ Autoload WRAM libboot_sp$(LIBSUFFIX).a \ libreboot_sp$(LIBSUFFIX).a \ libcardboot_sp$(LIBSUFFIX).a \ + libreloc_info_sp$(LIBSUFFIX).a Library libsdio_hcd_twl$(LIBSUFFIX).a \ libsdio_busdriver$(LIBSUFFIX).a \ diff --git a/build/libraries_sysmenu/Makefile b/build/libraries_sysmenu/Makefile index ce8be973..b789166e 100644 --- a/build/libraries_sysmenu/Makefile +++ b/build/libraries_sysmenu/Makefile @@ -22,7 +22,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- -SUBDIRS = sysmenu settings mb_loader acsign boot hotsw +SUBDIRS = reloc_info sysmenu settings mb_loader acsign boot hotsw #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/reloc_info/ARM7/Makefile b/build/libraries_sysmenu/reloc_info/ARM7/Makefile new file mode 100644 index 00000000..f32176ea --- /dev/null +++ b/build/libraries_sysmenu/reloc_info/ARM7/Makefile @@ -0,0 +1,49 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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-09-27#$ +# $Rev: 1203 $ +# $Author: yada $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- +TARGET_FIRM = SYSTEMMENU +TARGET_PLATFORM = TWL +TWL_ARCHGEN = LIMITED +TWL_PROC = ARM7 + +#---------------------------------------------------------------------------- + +SRCDIR = ../common/src + +SRCS = reloc_info.c + +TARGET_LIB = libreloc_info_sp$(TWL_LIBSUFFIX).a + + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== + diff --git a/build/libraries_sysmenu/reloc_info/ARM9/Makefile b/build/libraries_sysmenu/reloc_info/ARM9/Makefile new file mode 100644 index 00000000..b106cb11 --- /dev/null +++ b/build/libraries_sysmenu/reloc_info/ARM9/Makefile @@ -0,0 +1,49 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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-09-27#$ +# $Rev: 1203 $ +# $Author: yada $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- +TARGET_FIRM = SYSTEMMENU +TARGET_PLATFORM = TWL +TWL_ARCHGEN = LIMITED +TWL_PROC = ARM9 + +#---------------------------------------------------------------------------- + +SRCDIR = ../common/src + +SRCS = reloc_info.c + +TARGET_LIB = libreloc_info$(TWL_LIBSUFFIX).a + + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== + diff --git a/build/libraries_sysmenu/reloc_info/Makefile b/build/libraries_sysmenu/reloc_info/Makefile new file mode 100644 index 00000000..1e0ca3f0 --- /dev/null +++ b/build/libraries_sysmenu/reloc_info/Makefile @@ -0,0 +1,30 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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-09-27#$ +# $Rev: 1203 $ +# $Author: yada $ +#---------------------------------------------------------------------------- + +TARGET_FIRM = SYSTEMMENU +SUBDIRS = ARM7 ARM9 + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + +#===== End of Makefile ===== diff --git a/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c b/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c new file mode 100644 index 00000000..1b3b8f78 --- /dev/null +++ b/build/libraries_sysmenu/reloc_info/common/src/reloc_info.c @@ -0,0 +1,145 @@ +/*---------------------------------------------------------------------------* + 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 + +// 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 }, +}; + +// ============================================================================ +// +// アプリ起動 +// +// ============================================================================ + +// ROMのロード先領域をチェックし、再配置の必要があればロード先アドレスを変更し、再配置情報を*infoにセットする。 +// ロード先領域が被ってはいけない領域のリストcheck_destは{開始, 終了, 開始2, 終了2, ……, NULL}の形式。 +// 再配置の有り無しに関わらずロード可能ならばTRUE、ロード不可能ならばFALSEを返す +// 再配置が必要ない場合、再配置情報のsrc,dest,lengthにはそれぞれNULLが代入される。 +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;// サイズオーバー + if( !( default_region.start <= *dest && *dest + length <= default_region.end ) ) + { + // 再配置の必要あり + while( *check_dest != NULL ) + { + if( check_dest[0] < *dest + length && *dest < check_dest[1] ) return FALSE;// チェック領域に被ったらNG + check_dest += 2; + } + + // ここまで来ていれば再配置可能 + // 後方コピーフラグOFF + info->rev = FALSE; + if( default_region.start < *dest + length && *dest + length <= default_region.end ) + { + // デフォルト配置領域の先頭部に、再配置先の後部が被っている + // ポストクリア情報 + 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 ) + { + // デフォルト配置領域の後部に、再配置先の先頭部が被っている + // ポストクリア情報 + info->post_clear_addr = default_region.start; + info->post_clear_length = *dest - default_region.start; + if( *dest < default_region.start + length ) + { + // 更に、デフォルト配置領域にロードしたデータの最後尾と再配置先の先頭部が被っている + // 後方コピーフラグON + info->rev = TRUE; + } + }else + { + // まったく被っていない + // ポストクリア情報 + 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 + { + // 再配置の必要なし + info->src = NULL; + info->dest = NULL; + info->length = NULL; + info->post_clear_addr = NULL; + info->post_clear_length = NULL; + } + return TRUE; +} + +// SYSMi_CheckLoadRegionAndSetRelocateInfoExのラッパー関数 +BOOL SYSM_CheckLoadRegionAndSetRelocateInfo( RomSegmentName seg, u32 *dest, u32 length, Relocate_Info *info, BOOL isTwlApp) +{ + RomSegmentRange *rsr; + if( isTwlApp ) + { + rsr = romSegmentRange; + }else + { + //NTR専用 + rsr = romSegmentRangeNitro; + } + return SYSMi_CheckLoadRegionAndSetRelocateInfoEx(dest, length, rsr[seg], load_region_check_list[seg], info); +} diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 81a49ba1..9f38fb22 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -517,83 +517,6 @@ BOOL SYSM_IsValidTSD( void ) // // ============================================================================ -// ROMのロード先領域をチェックし、再配置の必要があればロード先アドレスを変更し、再配置情報を*infoにセットする。 -// ロード先領域が被ってはいけない領域のリストcheck_destは{開始, 終了, 開始2, 終了2, ……, NULL}の形式。 -// 再配置の有り無しに関わらずロード可能ならばTRUE、ロード不可能ならばFALSEを返す -// 再配置が必要ない場合、再配置情報のsrc,dest,lengthにはそれぞれNULLが代入される。 -static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx -( u32 *dest, u32 length, RomSegmentRange default_region, u32 *check_dest, Relocate_Info *info ) -{ - if( default_region.end - default_region.start < length ) return FALSE;// サイズオーバー - if( !( default_region.start <= *dest && *dest + length <= default_region.end ) ) - { - // 再配置の必要あり - while( *check_dest != NULL ) - { - if( check_dest[0] < *dest + length && *dest < check_dest[1] ) return FALSE;// チェック領域に被ったらNG - check_dest += 2; - } - - // ここまで来ていれば再配置可能 - // 後方コピーフラグOFF - info->rev = FALSE; - if( default_region.start < *dest + length && *dest + length <= default_region.end ) - { - // デフォルト配置領域の先頭部に、再配置先の後部が被っている - // ポストクリア情報 - 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 ) - { - // デフォルト配置領域の後部に、再配置先の先頭部が被っている - // ポストクリア情報 - info->post_clear_addr = default_region.start; - info->post_clear_length = *dest - default_region.start; - if( *dest < default_region.start + length ) - { - // 更に、デフォルト配置領域にロードしたデータの最後尾と再配置先の先頭部が被っている - // 後方コピーフラグON - info->rev = TRUE; - } - }else - { - // まったく被っていない - // ポストクリア情報 - 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 - { - // 再配置の必要なし - info->src = NULL; - info->dest = NULL; - info->length = NULL; - info->post_clear_addr = NULL; - info->post_clear_length = NULL; - } - return TRUE; -} - -// SYSMi_CheckLoadRegionAndSetRelocateInfoExのラッパー関数 -BOOL SYSM_CheckLoadRegionAndSetRelocateInfo( RomSegmentName seg, u32 *dest, u32 length, Relocate_Info *info, BOOL isTwlApp) -{ - RomSegmentRange *rsr; - if( isTwlApp ) - { - rsr = romSegmentRange; - }else - { - //NTR専用 - rsr = romSegmentRangeNitro; - } - return SYSMi_CheckLoadRegionAndSetRelocateInfoEx(dest, length, rsr[seg], load_region_check_list[seg], info); -} - // TWLアプリのみ対応、NTRはまだ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ) { @@ -695,8 +618,6 @@ OS_TPrintf("RebootSystem failed: logo CRC error\n"); source [region_arm7_twl] = *(const u32*)&header[0x1D0]; length [region_arm7_twl] = *(const u32*)&header[0x1DC]; destaddr[region_arm7_twl] = *(const u32*)&header[0x1D8]; - - MI_CpuClearFast( (void *)SYSMi_GetWork()->romRelocateInfo, RELOCATE_INFO_NUM * sizeof(Relocate_Info) ); // 領域読み込み先のチェック及び再配置情報データの作成 for( i=0; i #include #include +#include #ifdef __cplusplus extern "C" { @@ -68,14 +69,6 @@ typedef enum AuthResult { AUTH_RESULT_ENTRY_ADDRESS_ERROR = 5 }AuthResult; -// ROMセグメント名 -typedef enum RomSegmentName { - ARM9_STATIC = 0, - ARM7_STATIC = 1, - ARM9_LTD_STATIC = 2, - ARM7_LTD_STATIC = 3 -}RomSegmentName; - // global variable------------------------------------------------------ extern void *(*SYSM_Alloc)( u32 size ); // ライブラリ内部使用 @@ -93,7 +86,6 @@ extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得 // アプリ起動 -BOOL SYSM_CheckLoadRegionAndSetRelocateInfo( RomSegmentName seg, u32 *dest, u32 length, Relocate_Info *info, BOOL isTwlApp ); // extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード開始 extern BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認 extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 3e0317cc..9f7b185b 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -22,6 +22,7 @@ #include #include +#include //#include #ifdef __cplusplus @@ -48,17 +49,6 @@ typedef struct TitleID_HiLo { // データ型定義 //---------------------------------------------------------------------- -// 再配置情報データ構造体 -typedef struct Relocate_Info -{ - u32 src; - u32 dest; - u32 length; - u32 post_clear_addr; - u32 post_clear_length; - BOOL rev; -}Relocate_Info; - // SYSM共有ワーク構造体 typedef struct SYSM_work { Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報(arm9,arm7それぞれltdとflxで最大4つ)