From 23954867011585e77ba86a21b0481ce85a380c43 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Mon, 3 Dec 2007 08:00:29 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=83=AD=E3=83=BC=E3=83=89=E6=99=82?= =?UTF-8?q?=E3=81=AE=E5=86=8D=E9=85=8D=E7=BD=AE=E5=88=A4=E5=AE=9A=E3=81=8A?= =?UTF-8?q?=E3=82=88=E3=81=B3=E3=83=AD=E3=83=BC=E3=83=89=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E3=81=AE=E5=A4=89=E6=9B=B4=E3=82=92=E5=AE=9F=E8=A3=85=20?= =?UTF-8?q?=E3=83=BBsrl=E3=83=96=E3=83=BC=E3=83=88=E6=99=82=E3=80=81boot?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=81=AB=E6=8C=87=E5=AE=9A=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=B3=E3=83=94=E3=83=BC=E3=83=AA=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E3=82=92=E5=AE=9F=E8=A3=85=20=E3=83=BBpost?= =?UTF-8?q?=20clear=E3=81=AE=E3=83=AA=E3=82=B9=E3=83=88=E7=94=9F=E6=88=90?= =?UTF-8?q?=E3=81=AF=E6=9C=AA=E5=AE=9F=E8=A3=85=20=E3=83=BBSDK=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=84=E3=81=9F=E3=82=81reboot=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA=E3=81=8C=E3=83=93=E3=83=AB?= =?UTF-8?q?=E3=83=89=E3=81=A7=E3=81=8D=E3=81=9A=E3=80=81=E5=86=8D=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E3=81=8C=E5=BF=85=E8=A6=81=E3=81=AA=E3=82=A2=E3=83=97?= =?UTF-8?q?=E3=83=AA=E3=81=A7=E3=81=AE=E5=8B=95=E4=BD=9C=E3=81=AF=E6=9C=AA?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D?= 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@303 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 93 +++++++---------- .../sysmenu/ARM9/src/sysmenu_lib.c | 99 ++++++++++++++++--- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 12 +++ 3 files changed, 133 insertions(+), 71 deletions(-) diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index ea3f4ffb..b5b78bf0 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -24,6 +24,15 @@ #define MAINP_SEND_IF 0x2000 #define reg_MI_MC_SWP (*(REGType8v *) ( REG_MC1_ADDR + 1 ) ) +#ifdef ISDBG_MB_CHILD_ +#define PRE_CLEAR_NUM_MAX 18 +#else +#define PRE_CLEAR_NUM_MAX 14 +#endif + +#define COPY_NUM_MAX 12 +#define POST_CLEAR_NUM_MAX 8 + // extern data------------------------------------------------------- // function's prototype---------------------------------------------- @@ -61,8 +70,10 @@ BOOL BOOT_WaitStart( void ) // SDK共通リブート { + int list_count = 0; + int l; // メモリリストの設定 - static u32 mem_list[] = + static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX] = { // pre clear SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR, @@ -84,67 +95,35 @@ BOOL BOOT_WaitStart( void ) // post clear NULL, }; - -/* -#define SYSM_TWL_ARM9_LOAD_MMEM 0x02000400 // ロード可能なARM9 static MMEM アドレス -#define SYSM_TWL_ARM9_LOAD_MMEM_END SYSM_NTR_ARM9_LOAD_MMEM_END // ロード可能なARM9 static MMEM 最終アドレス -#define SYSM_TWL_ARM7_LOAD_MMEM SYSM_NTR_ARM7_LOAD_MMEM // ロード可能なARM7 static MMEM アドレス -#define SYSM_TWL_ARM7_LOAD_MMEM_END SYSM_NTR_ARM7_LOAD_MMEM_END // ロード可能なARM7 static MMEM 最終アドレス - -#define SYSM_TWL_ARM9_LTD_LOAD_MMEM 0x02400000 // ロード可能なARM9 LTD static MMEM アドレス -#define SYSM_TWL_ARM9_LTD_LOAD_MMEM_END 0x02800000 // ロード可能なARM9 LTD static MMEM 最終アドレス -#define SYSM_TWL_ARM7_LTD_LOAD_MMEM 0x02e80000 // ロード可能なARM7 LTD static MMEM アドレス -#define SYSM_TWL_ARM7_LTD_LOAD_MMEM_END 0x02f88000 // ロード可能なARM7 LTD static MMEM 最終アドレス -*/ - - // [TODO]再配置リストの作成と設定 - // 自分以外のデフォルトロード領域に被る場合は即NG - static u32 relocate_list[13] = - { - NULL - }; - u32 revCopy = 0; - ROM_Header *pHeader = (ROM_Header *)HW_TWL_ROM_HEADER_BUF; - u32 arm9ltd_dest = (u32)pHeader->s.main_ltd_ram_address; - u32 arm9ltd_size = (u32)pHeader->s.main_ltd_size; - u32 arm9flx_dest = (u32)pHeader->s.main_ram_address; - u32 arm9flx_size = (u32)pHeader->s.main_size; - u32 arm7ltd_dest = (u32)pHeader->s.sub_ltd_ram_address; - u32 arm7ltd_size = (u32)pHeader->s.sub_ltd_size; - u32 arm7flx_dest = (u32)pHeader->s.sub_ram_address; - u32 arm7flx_size = (u32)pHeader->s.sub_size; - - { - // チェックコード例 - // とりあえずarm9ltdのみ。同じような処理は関数化しないとぐちゃぐちゃ。NTRの場合は領域が若干違うので注意。 - if( SYSM_TWL_ARM9_LTD_LOAD_MMEM <= arm9ltd_dest && arm9ltd_dest + arm9ltd_size < SYSM_TWL_ARM9_LTD_LOAD_MMEM_END) + // copy forwardリスト設定 + for( l=0; lromRelocateInfo[l].src != NULL && !SYSMi_GetWork()->romRelocateInfo[l].rev ) { - // リロケート必要なし - }else - { - // リロケート必要あり - if( SYSM_TWL_ARM7_LTD_LOAD_MMEM <= arm9ltd_dest && arm9ltd_dest < SYSM_TWL_ARM7_LTD_LOAD_MMEM_END ) return FALSE;//NG - if( SYSM_TWL_ARM7_LTD_LOAD_MMEM <= arm9ltd_dest + arm9ltd_size && arm9ltd_dest + arm9ltd_size < SYSM_TWL_ARM7_LTD_LOAD_MMEM_END ) return FALSE;//NG - if( SYSM_TWL_ARM9_LOAD_MMEM <= arm9ltd_dest && arm9ltd_dest < SYSM_TWL_ARM9_LOAD_MMEM_END ) return FALSE;//NG - if( SYSM_TWL_ARM9_LOAD_MMEM <= arm9ltd_dest + arm9ltd_size && arm9ltd_dest + arm9ltd_size < SYSM_TWL_ARM9_LOAD_MMEM_END ) return FALSE;//NG - if( SYSM_TWL_ARM7_LOAD_MMEM <= arm9ltd_dest && arm9ltd_dest < SYSM_TWL_ARM7_LOAD_MMEM_END ) return FALSE;//NG - if( SYSM_TWL_ARM7_LOAD_MMEM <= arm9ltd_dest + arm9ltd_size && arm9ltd_dest + arm9ltd_size < SYSM_TWL_ARM7_LOAD_MMEM_END ) return FALSE;//NG - - // リロケート可能 - if( SYSM_TWL_ARM9_LTD_LOAD_MMEM <= arm9ltd_dest && SYSM_TWL_ARM9_LTD_LOAD_MMEM_END <= arm9ltd_dest + arm9ltd_size ) - { - revCopy = 1; // 後方からコピーするフラグON - } - - relocate_list[0] = SYSM_TWL_ARM9_LTD_LOAD_MMEM; - relocate_list[1] = arm9ltd_dest; - relocate_list[2] = arm9ltd_size; - relocate_list[3] = revCopy; + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = SYSMi_GetWork()->romRelocateInfo[l].src; + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = SYSMi_GetWork()->romRelocateInfo[l].dest; + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = SYSMi_GetWork()->romRelocateInfo[l].length; } } + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = NULL; + + // copy backwardリスト設定 + for( l=0; lromRelocateInfo[l].src != NULL && SYSMi_GetWork()->romRelocateInfo[l].rev ) + { + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = SYSMi_GetWork()->romRelocateInfo[l].src; + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = SYSMi_GetWork()->romRelocateInfo[l].dest; + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = SYSMi_GetWork()->romRelocateInfo[l].length; + } + } + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count++)] = NULL; + + // [TODO]post clearリスト設定 + mem_list[PRE_CLEAR_NUM_MAX + 1 + (list_count)] = NULL; - // [TODO]起動するターゲットの種類を指定する必要あり + // リブート OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x34), mem_list, REBOOT_TARGET_TWL_SYSTEM ); } } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 7b209957..3b24a3c1 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -18,7 +18,8 @@ #include #include #include "sysmenu_define.h" -#include "spi.h" +#include +#include // define data----------------------------------------------------------------- #define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 ) @@ -63,9 +64,7 @@ static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32); // const data------------------------------------------------------------------ -#if 0 typedef enum RomSegmentName { - ROM_HEADER = 0, ARM9_STATIC, ARM7_STATIC, ARM9_LTD_STATIC, @@ -77,6 +76,35 @@ typedef struct RomSegmentRange { 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 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 }, +}; + +#if 0 + typedef struct RomReloadInfo { void *pSrc; void *pDst; @@ -84,15 +112,6 @@ typedef struct RomReloadInfo { BOOL revCopy; }RomReloadInfo; -static RomSegmentRange romSegmentRange[] = { - { HW_TWL_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_END }, - { 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 RomReloadInfo romReloadInfo[] = { }; @@ -356,8 +375,6 @@ static s32 ReadFile(FSFile* pf, void* buffer, s32 size) return size; } -#include -ESTitleMeta dst[1]; // NANDタイトルリストの取得 int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) @@ -525,6 +542,49 @@ 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 - 1 < 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; + } + + // ここまで来ていれば再配置可能 + if( default_region.start <= *dest && default_region.end <= *dest + length ) + { + // デフォルト配置領域の後部に、再配置先の先頭部が被っているので、後方コピーフラグON + info->rev = TRUE; + } + 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; + } + return TRUE; +} + +// SYSMi_CheckLoadRegionAndSetRelocateInfoExのラッパー関数 +static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfo( RomSegmentName seg, u32 *dest, u32 length, Relocate_Info *info ) +{ + return SYSMi_CheckLoadRegionAndSetRelocateInfoEx(dest, length, romSegmentRange[seg], load_region_check_list[seg], info); +} + static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ) { enum { @@ -619,6 +679,17 @@ 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]; + + // 領域読み込み先のチェック及び再配置情報データの作成 + for( i=0; iromRelocateInfo[i]) ) ) + { + OS_TPrintf("RebootSystem failed: ROM Load Region error\n"); + FS_CloseFile(file); + return; + } + } for (i = region_header; i < region_max; ++i) { diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 197aa9f4..a8d6508f 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -35,6 +35,8 @@ extern "C" { #define CLONE_BOOT_MODE 1 #define OTHER_BOOT_MODE 2 +#define RELOCATE_INFO_NUM 4 // ROM再配置情報の数(今のところarm9,arm7それぞれltdとflxで最大4つ) + // NAMTitleIDをHiLoに分割してアクセスする場合に使用 typedef struct TitleID_HiLo { @@ -46,8 +48,18 @@ typedef struct TitleID_HiLo { // データ型定義 //---------------------------------------------------------------------- +// 再配置情報データ構造体 +typedef struct Relocate_Info +{ + u32 src; + u32 dest; + u32 length; + BOOL rev; +}Relocate_Info; + // SYSM共有ワーク構造体 typedef struct SYSM_work { + Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報(arm9,arm7それぞれltdとflxで最大4つ) vu16 isARM9Start :1; // ARM9スタートフラグ vu16 isHotStart :1; // Hot/Coldスタート判定 vu16 isValidResetParam :1; // リセットパラメータ有効