libraries_sysmenuにreloc_infoライブラリ追加。

再配置情報関係のデータ定義や関数をそちらに移動。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@384 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2007-12-20 04:09:46 +00:00
parent 228c1533fe
commit 57a883ac6e
11 changed files with 340 additions and 101 deletions

View File

@ -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 \

View File

@ -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
#----------------------------------------------------------------------------

View File

@ -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 =====

View File

@ -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 =====

View File

@ -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 =====

View File

@ -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 <sysmenu/sysmenu_lib/common/sysmenu_work.h>
// 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);
}

View File

@ -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<RELOCATE_INFO_NUM; i++ )

View File

@ -17,6 +17,7 @@
#----------------------------------------------------------------------------
SUBDIRS = \
../../../libraries_sysmenu/reloc_info \
../../../libraries_sysmenu/sysmenu \
../../../libraries_sysmenu/settings \
../../../libraries_sysmenu/boot \
@ -52,7 +53,8 @@ LINCLUDES = $(MISC_DIR)/include \
$(SRCDIR)/$(LOGO_DIR)
LLIBRARIES += libnam$(TWL_LIBSUFFIX).a \
libese$(TWL_LIBSUFFIX).a
libese$(TWL_LIBSUFFIX).a \
libreloc_info$(TWL_LIBSUFFIX).a
ADDRESS_DTCM = 0x0e000000

View File

@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: reloc_info.h
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: 352 $
$Author: yoshida_teruhisa $
*---------------------------------------------------------------------------*/
#ifndef __SYSMENU_RELOC_INFO_H__
#define __SYSMENU_RELOC_INFO_H__
#ifdef __cplusplus
extern "C" {
#endif
//----------------------------------------------------------------------
// データ型定義
//----------------------------------------------------------------------
// 再配置情報データ構造体
typedef struct Relocate_Info
{
u32 src;
u32 dest;
u32 length;
u32 post_clear_addr;
u32 post_clear_length;
BOOL rev;
}Relocate_Info;
// ROMセグメント名
typedef enum RomSegmentName {
ARM9_STATIC = 0,
ARM7_STATIC = 1,
ARM9_LTD_STATIC = 2,
ARM7_LTD_STATIC = 3
}RomSegmentName;
//----------------------------------------------------------------------
// 関数宣言
//----------------------------------------------------------------------
// ロード領域のチェック及び再配置情報の生成
BOOL SYSM_CheckLoadRegionAndSetRelocateInfo( RomSegmentName seg, u32 *dest, u32 length, Relocate_Info *info, BOOL isTwlApp );
#ifdef __cplusplus
}
#endif
#endif // __SYSMENU_RELOC_INFO_H__

View File

@ -24,6 +24,7 @@
#include <sysmenu/banner.h>
#include <sysmenu/settings.h>
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
#include <sysmenu/reloc_info/common/reloc_info.h>
#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を認証してブート

View File

@ -22,6 +22,7 @@
#include <twl/nam.h>
#include <sysmenu/memorymap.h>
#include <sysmenu/reloc_info/common/reloc_info.h>
//#include <sysmenu/reset_param/ARM9/reset_param.h>
#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つ