From 565c57aedb5ecc535b8a8a03397749911b1e08dc Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Tue, 4 Dec 2007 05:24:47 +0000 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E9=85=8D=E7=BD=AE=E5=BE=8Cclear?= =?UTF-8?q?=E3=83=AA=E3=82=B9=E3=83=88=E3=81=AE=E7=94=9F=E6=88=90=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=EF=BC=88=E5=8B=95=E4=BD=9C=E6=A4=9C=E8=A8=BC?= =?UTF-8?q?=E3=81=AFreboot=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=E5=BE=85=E3=81=A1=EF=BC=89?= 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@306 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 10 ++++- .../sysmenu/ARM9/src/sysmenu_lib.c | 37 ++++++++++++++++--- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 2 + 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 4c51a2d9..1e297938 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -120,7 +120,15 @@ BOOL BOOT_WaitStart( void ) } mem_list[list_count++] = NULL; - // [TODO]post clearリスト設定 + // post clearリスト設定 + for( l=0; lromRelocateInfo[l].post_clear_addr != NULL ) + { + mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].post_clear_addr; + mem_list[list_count++] = SYSMi_GetWork()->romRelocateInfo[l].post_clear_length; + } + } mem_list[list_count] = NULL; // リブート diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index f6b2497f..b3eda640 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -549,21 +549,44 @@ BOOL SYSM_IsValidTSD( void ) 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 ) ) + 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 + if( check_dest[0] < *dest + length && *dest < check_dest[1] ) return FALSE;// チェック領域に被ったらNG check_dest += 2; } // ここまで来ていれば再配置可能 - if( default_region.start <= *dest && *dest < default_region.end ) + // 後方コピーフラグOFF + info->rev = FALSE; + if( default_region.start < *dest + length && *dest + length <= default_region.end ) { - // デフォルト配置領域の後部に、再配置先の先頭部が被っているので、後方コピーフラグON - info->rev = TRUE; + // デフォルト配置領域の先頭部に、再配置先の後部が被っている + // ポストクリア情報 + 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; @@ -575,6 +598,8 @@ static BOOL SYSMi_CheckLoadRegionAndSetRelocateInfoEx info->src = NULL; info->dest = NULL; info->length = NULL; + info->post_clear_addr = NULL; + info->post_clear_length = NULL; } return TRUE; } diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index a8d6508f..4009c84b 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -54,6 +54,8 @@ typedef struct Relocate_Info u32 src; u32 dest; u32 length; + u32 post_clear_addr; + u32 post_clear_length; BOOL rev; }Relocate_Info;