diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 4fc95c73..1724f910 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -87,10 +87,9 @@ static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + COPY_HEADER_NUM_MAX + static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] = { - HW_MAIN_MEM_PARAMETER_BUF_END, SYSM_OWN_ARM7_MMEM_ADDR, - SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF, - OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR, - SYSM_OWN_ARM9_MMEM_ADDR_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN, + SYSM_TWL_ARM7_LOAD_MMEM_END, OS_BOOT_A9CODE_BUF, + OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_TWL_ARM9_LTD_LOAD_MMEM, + SYSM_TWL_ARM7_LTD_LOAD_MMEM_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN, HW_EXCP_VECTOR_MAIN, HW_EXCP_VECTOR_MAIN + 4, // ARM9例外ベクタ HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ NULL, @@ -98,10 +97,9 @@ static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] = static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] = { - HW_MAIN_MEM_PARAMETER_BUF, SYSM_OWN_ARM7_MMEM_ADDR, - SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF, - SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_DBG_NTR_SYSTEM_BUF, - SYSM_OWN_ARM9_MMEM_ADDR_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN, + SYSM_NTR_ARM7_LOAD_MMEM_END, OS_BOOT_A9CODE_BUF, + SYSM_TWL_ARM9_LTD_LOAD_MMEM_END, SYSM_DBG_NTR_SYSTEM_BUF, + SYSM_TWL_ARM7_LTD_LOAD_MMEM_END, SYSM_TWL_MOUNT_INFO_TMP_BUFFER + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN, HW_EXCP_VECTOR_MAIN, HW_EXCP_VECTOR_MAIN + 4, // ARM9例外ベクタ HW_EXCP_VECTOR_BUF, HW_EXCP_VECTOR_BUF + 4, // ARM7例外ベクタ NULL, @@ -276,6 +274,7 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* { post_clear_list = nitro_post_clear_list; // NTR-IPLと同様にシステム領域直前をクリアしておく + // [TODO:] すでにpost_clear_listに含まれている気がする。要確認 mem_list[list_count++] = 0x02800000 - OS_BOOT_SYS_CLR_SIZE; mem_list[list_count++] = OS_BOOT_SYS_CLR_SIZE - HW_MAIN_MEM_SHARED_SIZE; } @@ -376,7 +375,7 @@ static void BOOTi_ClearREG_RAM( void ) } // 単純リスト要素削除 -static void BOOTi_DeliteElementFromList( u32 *list, u32 index ) +static void BOOTi_DeleteElementFromList( u32 *list, u32 index ) { int l; for( l=(int)index; list[l]!=NULL; l++ ) @@ -442,7 +441,7 @@ static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end ) // regionlist[l]からregionlist[m-1]までの要素を消す for( n=l; lflags.common.isLoadSucceeded = TRUE; return; @@ -848,6 +855,86 @@ ERROR: } } +// モジュール最終ロード先領域のうち、現在空いている場所をクリア +#define CLEAR_LIST_LENGTH (8 + 1 + RELOCATE_INFO_NUM * 2) +static void SYSMi_ClearRomLoadSegment( ROM_Header_Short *rhs ) +{ + int l; + u32 twl_clear_list[CLEAR_LIST_LENGTH] = { + 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, + NULL, + }; + u32 nitro_clear_list[CLEAR_LIST_LENGTH] = { + 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, + NULL, + }; + u32 *clear_list; + u32 length[RELOCATE_INFO_NUM]; + u32 dataExistAddr[RELOCATE_INFO_NUM]; + + length [0] = rhs->main_size; + dataExistAddr[0] = (u32)rhs->main_ram_address; + + length [1] = rhs->sub_size; + dataExistAddr[1] = (u32)rhs->sub_ram_address; + + if( !(rhs->platform_code & PLATFORM_CODE_FLAG_TWL) ) + { + clear_list = nitro_clear_list; + } + else + { + clear_list = twl_clear_list; + length [2] = rhs->main_ltd_size; + dataExistAddr[2] = (u32)rhs->main_ltd_ram_address; + + length [3] = rhs->sub_ltd_size; + dataExistAddr[3] = (u32)rhs->sub_ltd_ram_address; + } + + for( l=0; lplatform_code & PLATFORM_CODE_FLAG_TWL) && l==2 ) + { + break; + } + // 再配置情報があればそちらの情報を取得 + if( SYSMi_GetWork()->romRelocateInfo[l].src != NULL ) + { + length[l] = SYSMi_GetWork()->romRelocateInfo[l].length; + dataExistAddr[l] = SYSMi_GetWork()->romRelocateInfo[l].src; + } + + // 領域の切り取り + SYSMi_CutAwayRegionList( clear_list, dataExistAddr[l], dataExistAddr[l] + length[l] ); + } + + // リストに従って消す + for( l=0; l= start ) + { + break; + } + } + for( m=l; regionlist[m]!=NULL; m++ ) + { + if( regionlist[m] > end ) + { + break; + } + } + // この時点でregionlist[l]およびregionlist[m]は、start <= regionlist[l], end < regionlist[m]で、且つ最も小さな値 + + if( m % 2 == 1 ) + { + SYSMi_InsertElementToList( regionlist, (u32)m, end ); + // endをリストに追加した場合、mは追加した要素を指すように + } + if( l % 2 == 1 ) + { + SYSMi_InsertElementToList( regionlist, (u32)l, start ); + m++; + // startをリストに追加した場合、mは1増える + l++; + // startをリストに追加した場合、lは追加した要素の次の要素を指すように + } + + // regionlist[l]からregionlist[m-1]までの要素を消す + for( n=l; l