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;