mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・ロード時の再配置判定およびロード位置の変更を実装
・srlブート時、boot関数に指定するコピーリストの生成を実装 ・post clearのリスト生成は未実装 ・SDK最新版を使用していないためrebootライブラリがビルドできず、再配置が必要なアプリでの動作は未確認 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@303 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
425fe8db84
commit
2395486701
@ -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; l<RELOCATE_INFO_NUM ; l++ )
|
||||
{
|
||||
if( SYSMi_GetWork()->romRelocateInfo[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; l<RELOCATE_INFO_NUM ; l++ )
|
||||
{
|
||||
if( SYSMi_GetWork()->romRelocateInfo[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 );
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,8 @@
|
||||
#include <twl.h>
|
||||
#include <sysmenu.h>
|
||||
#include "sysmenu_define.h"
|
||||
#include "spi.h"
|
||||
#include <spi.h>
|
||||
#include <es.h>
|
||||
|
||||
// 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 <es.h>
|
||||
ESTitleMeta dst[1];
|
||||
|
||||
// NANDƒ^ƒCƒgƒ‹ƒŠƒXƒg‚̎擾
|
||||
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; i<RELOCATE_INFO_NUM; i++ )
|
||||
{
|
||||
if ( !SYSMi_CheckLoadRegionAndSetRelocateInfo( (RomSegmentName)i, &(destaddr[i+1]), length[i+1], &(SYSMi_GetWork()->romRelocateInfo[i]) ) )
|
||||
{
|
||||
OS_TPrintf("RebootSystem failed: ROM Load Region error\n");
|
||||
FS_CloseFile(file);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = region_header; i < region_max; ++i)
|
||||
{
|
||||
|
||||
@ -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; // リセットパラメータ有効
|
||||
|
||||
Loading…
Reference in New Issue
Block a user