マウント情報をWRAMに隠蔽するための変更

・ARM7側からWRAMにマウント情報を格納するため、mountInfo関連を大手術
 ・ビルドの通っていないアプリが使っているlcfテンプレートを変更
 ・ランチャーとSDKのFSがランチャーバージョンの格納および取得に対応するまで、マウント情報まわりが正常に機能せず

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@895 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-03-18 07:31:21 +00:00
parent dc1dc006ab
commit 81e66f51cb
14 changed files with 354 additions and 210 deletions

View File

@ -355,7 +355,8 @@ SECTIONS
SDK_AUTOLOAD_WRAM_START = SDK_AUTOLOAD.WRAM.START;
SDK_AUTOLOAD_WRAM_END = SDK_AUTOLOAD.WRAM.END;
SDK_AUTOLOAD_WRAM_BSS_END = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_MOUNT_INFO_TABLE = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_AUTOLOAD_WRAM_BSS_END = SDK_MOUNT_INFO_TABLE + 0x400;
SDK_AUTOLOAD_WRAM_SIZE = SDK_AUTOLOAD.WRAM.SIZE;
SDK_AUTOLOAD_WRAM_BSS_SIZE = SDK_AUTOLOAD.WRAM.BSS_SIZE;
@ -548,8 +549,8 @@ SECTIONS
} > <PROPERTY.OVERLAYTABLE>F
############################ OTHERS #################################
SDK_SEA_KEY_STORE = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD.WRAM.BSS_END + 0x40;
SDK_SEA_KEY_STORE = SDK_AUTOLOAD_WRAM_BSS_END;
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD_WRAM_BSS_END + 0x40;
SDK_IRQ_STACKSIZE = <STATIC.IRQSTACKSIZE>; # allocated in WRAM
SDK_SYS_STACKSIZE = <STATIC.STACKSIZE>; # allocated in WRAM
@ -557,7 +558,7 @@ SECTIONS
.check.WORKRAM:
{
. = . + SDK_AUTOLOAD.WRAM.BSS_END - SDK_AUTOLOAD.WRAM.START + 0x080 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
. = . + SDK_AUTOLOAD_WRAM_BSS_END - SDK_AUTOLOAD.WRAM.START + 0x080 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
} > check.WORKRAM
@ -878,7 +879,7 @@ SECTIONS
{
### TWL limited extended static module information
WRITEW SDK_LTDAUTOLOAD_TOP_START; # load address
WRITEW 0; # padding
WRITEW SDK_MOUNT_INFO_TABLE; # address of the FS mount information table
WRITEW SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD_TOP_SIZE; # size of module
WRITEW 0; # padding

View File

@ -153,9 +153,12 @@ TwlSpMain(void)
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
// ランチャーのマウント情報登録
SYSMi_SetLauncherMountInfo();
// PXIコールバックの設定
SYSM_InitPXI(THREAD_PRIO_SYSMMCU);
// ファイルシステム初期化
FS_Init(FS_DMA_NOT_USE);
FS_CreateReadServerThread(THREAD_PRIO_FS);

View File

@ -40,6 +40,8 @@ TARGET_LIB = libboot_sp$(TWL_LIBSUFFIX).a
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot
LINCLUDES += $(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)

View File

@ -25,6 +25,7 @@
#include <firm/format/from_brom.h>
#include <firm/aes/ARM7/aes_init.h>
#include "reboot.h"
#include "internal_api.h"
// define data-------------------------------------------------------
@ -32,9 +33,9 @@
#define reg_MI_MC_SWP (*(REGType8v *) ( REG_MC1_ADDR + 1 ) )
#ifdef ISDBG_MB_CHILD_
#define PRE_CLEAR_NUM_MAX (7*2)
#define PRE_CLEAR_NUM_MAX (9*2)
#else
#define PRE_CLEAR_NUM_MAX (5*2)
#define PRE_CLEAR_NUM_MAX (7*2)
#endif
#define COPY_NUM_MAX (4*3)
@ -95,6 +96,9 @@ BOOL BOOT_WaitStart( void )
// ブートアプリのROMヘッダのaccessKeyControl情報を見て判定
// 引渡しは、IRQスタック領域を使うので、割り込みを禁止してからセットする。
// マウント情報の登録
SYSMi_SetBootAppMountInfo( &SYSMi_GetWork2()->bootTitleProperty );
BOOTi_ClearREG_RAM(); // ARM7側のメモリレジスタクリア。
reg_MI_MBK9 = 0; // 全WRAMのロック解除
@ -112,18 +116,19 @@ BOOL BOOT_WaitStart( void )
// メモリリストの設定
// [TODO:] ショップアプリで鍵を残す場合、NANDファーム引数の領域WRAMにあるを消さないように注意。
// WRAMリマップ後の消し漏れやバッファオーバランの懸念回避のため不要な鍵はpre clearで消す。
// [TODO:] pre clearにARM9/7共用WRAMの32KBも入れる。
// [TODO:] DSPの使っているWRAMをどこからどこまで消すか
static u32 mem_list[PRE_CLEAR_NUM_MAX + 1 + COPY_NUM_MAX + 2 + POST_CLEAR_NUM_MAX + 1] =
{
// pre clear
SYSM_OWN_ARM7_WRAM_ADDR, NULL, // SYSM_OWN_ARM7_WRAM_ADDRSDK_AUTOLOAD_WRAM_STARTはリンカから与えられる
SYSM_OWN_ARM7_WRAM_ADDR, NULL, // SYSM_OWN_ARM7_WRAM_ADDRSDK_AUTOLOAD_WRAM_STARTはリンカから与えられるので定数でない
NULL, NULL, // 定数でないのであとで設定
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
#ifdef ISDBG_MB_CHILD_
HW_PRV_WRAM_END - 0x600, (HW_PRV_WRAM_END - HW_PRV_WRAM_SYSRV_SIZE) - (HW_PRV_WRAM_END - 0x600),
HW_PRV_WRAM_END - 0x600 + 0x20, HW_PRV_WRAM_END - (HW_PRV_WRAM_END - 0x600 + 0x20),
#endif
HW_WRAM_LTD, HW_WRAM_LTD_END - HW_WRAM_LTD,
HW_WRAM_BASE, HW_WRAM_SIZE, // 共有WRAM  Launcherの特殊配置なので、BASEからサイズぶん
HW_MAIN_MEM_SHARED, HW_RED_RESERVED - HW_MAIN_MEM_SHARED,
NULL,
// copy forward
@ -133,8 +138,9 @@ BOOL BOOT_WaitStart( void )
// post clear
NULL,
};
// NANDファームから受け取った鍵領域もまとめて消している
mem_list[1] = SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR;
mem_list[1] = (u32)th->s.sub_mount_info_ram_address - SYSM_OWN_ARM7_WRAM_ADDR;
mem_list[2] = ((u32)th->s.sub_mount_info_ram_address + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN);
mem_list[3] = SYSM_OWN_ARM7_WRAM_ADDR_END - ((u32)th->s.sub_mount_info_ram_address + SYSM_MOUNT_INFO_SIZE + OS_MOUNT_PATH_LEN);
// copy forwardリスト設定
for( l=0; l<RELOCATE_INFO_NUM ; l++ )

View File

@ -26,7 +26,8 @@ TWL_PROC = ARM7
SRCDIR = ../common/src
SRCS = status.c \
pxi.c
pxi.c \
mountInfo.c
TARGET_LIB = libsysmenu_sp$(TWL_LIBSUFFIX).a

View File

@ -63,77 +63,19 @@ OSMountInfo s_defaultMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = {
//
// ============================================================================
/*
BootSRLPathは"rom:"""
"nand:" "nand1:"userPermissionは"OS_MOUNT_USR_R"
*/
// ランチャーのマウント情報セット
void SYSMi_SetLauncherMountInfo( void )
{
NAMTitleId titleID = TITLE_ID_LAUNCHER;
// ※とりあえず自身はROMブートで。[TODO:]後で修正
// SYSMi_SetBootSRLPath( LAUNCHER_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
// セーブデータ有無によるマウント情報の編集
// ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。
SYSMi_ModifySaveDataMountForLauncher( LAUNCHER_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// マウント情報のセット
SYSMi_SetMountInfoCore( LAUNCHER_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[0] );
}
// システム領域に、ブートするアプリのマウント情報を登録する
void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
{
// アプリがTWL対応でない場合は、何もセットせずにリターン
if( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) == 0 ) {
return;
}
// 起動アプリのSRLパスをセット
SYSMi_SetBootSRLPath( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID );
// セーブデータ有無によるマウント情報の編集
SYSMi_ModifySaveDataMount( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// マウント情報のセット
SYSMi_SetMountInfoCore( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID,
&s_defaultMountList[0] );
/*
  
MountInfoはFSで直接参照してアクセス許可状態を判定しているため
FSライブラリおよびFSを使用したESやNAMライブラリが全く使用できなくなる
FSライブラリを使用する処理は
*/
}
// 起動SRLパスをシステム領域にセット
static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID )
void SYSMi_SetBootSRLPathToWork2( TitleProperty *pBootTitle )
{
static char path[ FS_ENTRY_LONGNAME_MAX ];
switch( bootType )
switch( pBootTitle->flags.bootType )
{
case LAUNCHER_BOOTTYPE_NAND:
if( NAM_GetTitleBootContentPathFast( path, titleID ) != NAM_OK ) {
if( NAM_GetTitleBootContentPathFast( path, pBootTitle->titleID ) != NAM_OK ) {
OS_TPrintf( "ERROR: BootContentPath Get failed.\n" );
}
break;
case LAUNCHER_BOOTTYPE_TEMP:
STD_TSNPrintf( path, FS_ENTRY_LONGNAME_MAX, OS_TMP_APP_PATH, titleID );
STD_TSNPrintf( path, FS_ENTRY_LONGNAME_MAX, OS_TMP_APP_PATH, pBootTitle->titleID );
break;
default:
path[ 0 ] = 0;
@ -142,131 +84,9 @@ static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID
}
if( path[ 0 ] ) {
STD_CopyLStringZeroFill( (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF, path, OS_MOUNT_PATH_LEN );
STD_CopyLStringZeroFill( SYSMi_GetWork2()->bootContentPath, path, OS_MOUNT_PATH_LEN );
}else {
MI_CpuClearFast( (void *)HW_TWL_FS_BOOT_SRL_PATH_BUF, OS_MOUNT_PATH_LEN );
MI_CpuClearFast( SYSMi_GetWork2()->bootContentPath, OS_MOUNT_PATH_LEN );
}
OS_TPrintf( "boot SRL path : %s\n", (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF ); // ※OS_Init前で呼ぶとPrintfできないので注意。
OS_TPrintf( "boot SRL path : %s\n", SYSMi_GetWork2()->bootContentPath ); // ※OS_Init前で呼ぶとPrintfできないので注意。
}
// マウント情報をシステム領域に書き込み
static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc )
{
#pragma unused(bootType)
int i;
OSMountInfo *pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF;
MI_CpuClearFast( (void *)HW_TWL_FS_MOUNT_INFO_BUF, HW_TWL_FS_BOOT_SRL_PATH_BUF - HW_TWL_FS_MOUNT_INFO_BUF );
// ユーザーアプリの場合、"nand:", "nand2:"アーカイブを変更。
if( ( titleID & TITLEID_APP_SYS_FLAG ) == 0 ) {
pSrc[ 1 ].userPermission = 0; // "nand:"
pSrc[ 2 ].userPermission = 0; // "nand2:"
}
// セット
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
if( pSrc->drive[ 0 ] ) {
MI_CpuCopyFast( pSrc, pDst, sizeof(OSMountInfo) );
pDst++;
}
pSrc++;
}
#if 0
pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF;
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
OS_TPrintf( "mount path : %s\n", pDst->path );
pDst++;
}
#endif
}
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->flags.hotsw.isOnDebugger ) )
) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ];
saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size;
saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size;
// セーブデータのファイルパスを取得
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );
// "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録
for( i = 0; i < 2; i++ ) {
FSFile file[1];
FS_InitFile( file );
if( saveDataSize[ i ] &&
FS_OpenFileEx( file, saveFilePath[ i ], FS_FILEMODE_R) ) {
FS_CloseFile( file );
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
}else {
pMountTgt->drive[ 0 ] = 0;
}
pMountTgt++;
}
}else {
// タイトルID指定なしのカードアプリの場合は、セーブデータ無効
for( i = 0; i < 2; i++ ) {
pMountTgt->drive[ 0 ] = 0;
}
}
}
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->flags.hotsw.isOnDebugger ) )
) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ];
saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size;
saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size;
// セーブデータのファイルパスを取得
STD_TSNPrintf( saveFilePath[ 0 ], FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/data/private.sav", (u32)( titleID >> 32 ), titleID );
STD_TSNPrintf( saveFilePath[ 1 ], FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/data/public.sav", (u32)( titleID >> 32 ), titleID );
// "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録
for( i = 0; i < 2; i++ ) {
if( saveDataSize[ i ] ) {
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
}else {
pMountTgt->drive[ 0 ] = 0;
}
pMountTgt++;
}
}else {
// タイトルID指定なしのカードアプリの場合は、セーブデータ無効
for( i = 0; i < 2; i++ ) {
pMountTgt->drive[ 0 ] = 0;
}
}
}

View File

@ -64,7 +64,7 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
SYSMi_SendKeysToARM7();
// ランチャーのマウント情報セット
SYSMi_SetLauncherMountInfo();
//SYSMi_SetLauncherMountInfo();
// ARM7コンポーネント用プロテクションユニット領域変更
OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB );

View File

@ -990,7 +990,9 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle )
}
// マウント情報の登録
SYSMi_SetBootAppMountInfo( pBootTitle );
//SYSMi_SetBootAppMountInfo( pBootTitle );
SYSMi_GetWork2()->bootTitleProperty = *pBootTitle;
SYSMi_SetBootSRLPathToWork2( pBootTitle );
// HW_WM_BOOT_BUFへのブート情報セット
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ];

View File

@ -33,18 +33,26 @@ extern "C" {
#define OS_PutString( ... ) ((void)0)
#endif
#ifdef SDK_ARM9
//-------------------------------------------------------
// マウント情報セット
//-------------------------------------------------------
#ifdef SDK_ARM9
// BootSRLPath受け渡し用
void SYSMi_SetBootSRLPathToWork2( TitleProperty *pBootTitle );
#else
// ランチャー用
void SYSMi_SetLauncherMountInfo( void );
// 起動アプリ用
void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle );
#endif
#ifdef SDK_ARM9
//-------------------------------------------------------
// デバイス
//-------------------------------------------------------

View File

@ -0,0 +1,295 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: SYSM_lib.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <twl/nam.h>
#include <sysmenu.h>
#include "internal_api.h"
// define data-----------------------------------------------------------------
#define DEFAULT_MOUNT_LIST_NUM 9
#define NAND_MOUNT_INDEX 0
#define NAND2_MOUNT_INDEX 1
#define CONTENT_MOUNT_INDEX 2
#define SHARED1_MOUNT_INDEX 3
#define PRV_SAVE_DATA_MOUNT_INDEX 6 // プライベートセーブデータの s_defaultMountInfo リストインデックス
#define PUB_SAVE_DATA_MOUNT_INDEX 7 // パブリック セーブデータの s_defaultMountInfo リストインデックス
#define TITLEID_APP_SYS_FLAG_SHIFT ( 32 + 0 )
#define TITLEID_NOT_LAUNCH_FLAG_SHIFT ( 32 + 1 )
#define TITLEID_MEDIA_NAND_FLAG_SHIFT ( 32 + 2 )
#define TITLEID_APP_SYS_FLAG ( 1ULL << TITLEID_APP_SYS_FLAG_SHIFT )
#define TITLEID_NOT_LAUNCH_FLAG ( 1ULL << TITLEID_NOT_LAUNCH_FLAG_SHIFT )
#define TITLEID_MEDIA_NAND_FLAG ( 1ULL << TITLEID_MEDIA_NAND_FLAG_SHIFT )
// extern data-----------------------------------------------------------------
// function's prototype--------------------------------------------------------
static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID );
static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc );
static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
// const data------------------------------------------------------------------
// デフォルトマウント情報リスト
OSMountInfo s_defaultMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = {
// drive device target pertitionIdx resource userPermission rsvA B archive path
{ 'A', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand", "/" }, // ユーザーアプリはこのアーカイブではR/W不可
{ 'B', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand2", "/" }, // ユーザーアプリはこのアーカイブではR/W不可
{ 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R), 0, 0, "content", NULL }, // Write不可
{ 'D', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R), 0, 0, "shared1", "nand:/shared1" }, // Write不可
{ 'E', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "shared2", "nand:/shared2" },
{ 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 1, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "photo", "nand2:/photo" },
{ 'G', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL }, // NANDにセーブデータがないアプリの場合は、マウントされない。
{ 'H', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL }, // NANDにセーブデータがないアプリの場合は、マウントされない。
{ 'I', OS_MOUNT_DEVICE_SD, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "sdmc", "/" },
};
// ============================================================================
//
// マウント情報セット
//
// ============================================================================
/*
BootSRLPathは"rom:"""
"nand:" "nand1:"userPermissionは"OS_MOUNT_USR_R"
*/
// ランチャーのマウント情報セット
void SYSMi_SetLauncherMountInfo( void )
{
NAMTitleId titleID = TITLE_ID_LAUNCHER;
// ※とりあえず自身はROMブートで。[TODO:]後で修正
// SYSMi_SetBootSRLPath( LAUNCHER_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
// セーブデータ有無によるマウント情報の編集
// ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。
SYSMi_ModifySaveDataMountForLauncher( LAUNCHER_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// マウント情報のセット
SYSMi_SetMountInfoCore( LAUNCHER_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[0] );
}
// システム領域に、ブートするアプリのマウント情報を登録する
void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
{
// アプリがTWL対応でない場合は、何もセットせずにリターン
if( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) == 0 ) {
return;
}
// 起動アプリのSRLパスをセット
// SYSMi_SetBootSRLPath( (LauncherBootType)pBootTitle->flags.bootType,
// pBootTitle->titleID );
STD_CopyLStringZeroFill( (char *)((u32)((( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->sub_mount_info_ram_address) + SYSM_MOUNT_INFO_SIZE),
SYSMi_GetWork2()->bootContentPath, OS_MOUNT_PATH_LEN );
// セーブデータ有無によるマウント情報の編集
// ※ARM7ではNAMは動かせないので、NAMを使わないバージョンで対応。
SYSMi_ModifySaveDataMountForLauncher( LAUNCHER_BOOTTYPE_NAND,
pBootTitle->titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
/*
// セーブデータ有無によるマウント情報の編集
SYSMi_ModifySaveDataMount( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
*/
// マウント情報のセット
SYSMi_SetMountInfoCore( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID,
&s_defaultMountList[0] );
/*
  
MountInfoはFSで直接参照してアクセス許可状態を判定しているため
FSライブラリおよびFSを使用したESやNAMライブラリが全く使用できなくなる
FSライブラリを使用する処理は
*/
}
/*
// 起動SRLパスをシステム領域にセット
static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID )
{
static char path[ FS_ENTRY_LONGNAME_MAX ];
ROM_Header_Short *header = ( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF;
switch( bootType )
{
case LAUNCHER_BOOTTYPE_NAND:
if( NAM_GetTitleBootContentPathFast( path, titleID ) != NAM_OK ) {
OS_TPrintf( "ERROR: BootContentPath Get failed.\n" );
}
break;
case LAUNCHER_BOOTTYPE_TEMP:
STD_TSNPrintf( path, FS_ENTRY_LONGNAME_MAX, OS_TMP_APP_PATH, titleID );
break;
default:
path[ 0 ] = 0;
// STD_StrCpy( path, (const char*)"rom:" ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
break;
}
if( path[ 0 ] ) {
STD_CopyLStringZeroFill( (char *)((u32)header->sub_mount_info_ram_address + SYSMi_MOUNT_INFO_SIZE), path, OS_MOUNT_PATH_LEN );
}else {
MI_CpuClearFast( (char *)((u32)header->sub_mount_info_ram_address + SYSMi_MOUNT_INFO_SIZE), OS_MOUNT_PATH_LEN );
}
OS_TPrintf( "boot SRL path : %s\n", (char *)((u32)header->sub_mount_info_ram_address + SYSMi_MOUNT_INFO_SIZE) ); // ※OS_Init前で呼ぶとPrintfできないので注意。
}
*/
// マウント情報をシステム領域に書き込み
static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc )
{
#pragma unused(bootType)
int i;
ROM_Header_Short *header = ( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF;
OSMountInfo *pDst = (OSMountInfo *)header->sub_mount_info_ram_address;
char contentpath[ FS_ENTRY_LONGNAME_MAX ];
// タイトルIDからcontentのファイルパスをセット
STD_TSNPrintf( contentpath, FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/content", (u32)( titleID >> 32 ), titleID );
STD_CopyLStringZeroFill( pSrc[CONTENT_MOUNT_INDEX].path, contentpath, OS_MOUNT_PATH_LEN );
MI_CpuClearFast( (void *)pDst, SYSM_MOUNT_INFO_SIZE );
// セキュアアプリでない場合、"nand:", "nand2:"アーカイブを変更。
if( ( titleID & TITLE_ID_HI_SECURE_FLAG_MASK ) == 0 ) {
pSrc[ NAND_MOUNT_INDEX ].userPermission = 0; // "nand:"
pSrc[ NAND2_MOUNT_INDEX ].userPermission = 0; // "nand2:"
}
// セット
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
if( pSrc->drive[ 0 ] ) {
MI_CpuCopyFast( pSrc, pDst, sizeof(OSMountInfo) );
pDst++;
}
pSrc++;
}
#if 0
pDst = (OSMountInfo *)pDst;
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
OS_TPrintf( "mount path : %s\n", pDst->path );
pDst++;
}
#endif
}
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->flags.hotsw.isOnDebugger ) )
) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ];
saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size;
saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size;
// セーブデータのファイルパスを取得
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );
// "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録
for( i = 0; i < 2; i++ ) {
FSFile file[1];
FS_InitFile( file );
if( saveDataSize[ i ] &&
FS_OpenFileEx( file, saveFilePath[ i ], FS_FILEMODE_R) ) {
FS_CloseFile( file );
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
}else {
pMountTgt->drive[ 0 ] = 0;
}
pMountTgt++;
}
}else {
// タイトルID指定なしのカードアプリの場合は、セーブデータ無効
for( i = 0; i < 2; i++ ) {
pMountTgt->drive[ 0 ] = 0;
}
}
}
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->flags.hotsw.isOnDebugger ) )
) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ];
saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size;
saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size;
// セーブデータのファイルパスを取得
STD_TSNPrintf( saveFilePath[ 0 ], FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/data/private.sav", (u32)( titleID >> 32 ), titleID );
STD_TSNPrintf( saveFilePath[ 1 ], FS_ENTRY_LONGNAME_MAX,
"nand:/title/%08x/%08x/data/public.sav", (u32)( titleID >> 32 ), titleID );
// "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録
for( i = 0; i < 2; i++ ) {
if( saveDataSize[ i ] ) {
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
}else {
pMountTgt->drive[ 0 ] = 0;
}
pMountTgt++;
}
}else {
// タイトルID指定なしのカードアプリの場合は、セーブデータ無効
for( i = 0; i < 2; i++ ) {
pMountTgt->drive[ 0 ] = 0;
}
}
}

View File

@ -355,7 +355,8 @@ SECTIONS
SDK_AUTOLOAD_WRAM_START = SDK_AUTOLOAD.WRAM.START;
SDK_AUTOLOAD_WRAM_END = SDK_AUTOLOAD.WRAM.END;
SDK_AUTOLOAD_WRAM_BSS_END = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_MOUNT_INFO_TABLE = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_AUTOLOAD_WRAM_BSS_END = SDK_MOUNT_INFO_TABLE + 0x400;
SDK_AUTOLOAD_WRAM_SIZE = SDK_AUTOLOAD.WRAM.SIZE;
SDK_AUTOLOAD_WRAM_BSS_SIZE = SDK_AUTOLOAD.WRAM.BSS_SIZE;
@ -548,8 +549,8 @@ SECTIONS
} > <PROPERTY.OVERLAYTABLE>F
############################ OTHERS #################################
SDK_SEA_KEY_STORE = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD.WRAM.BSS_END + 0x40;
SDK_SEA_KEY_STORE = SDK_AUTOLOAD_WRAM_BSS_END;
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD_WRAM_BSS_END + 0x40;
SDK_IRQ_STACKSIZE = <STATIC.IRQSTACKSIZE>; # allocated in WRAM
SDK_SYS_STACKSIZE = <STATIC.STACKSIZE>; # allocated in WRAM
@ -557,7 +558,7 @@ SECTIONS
.check.WORKRAM:
{
. = . + SDK_AUTOLOAD.WRAM.BSS_END - SDK_AUTOLOAD.WRAM.START + 0x080 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
. = . + SDK_AUTOLOAD_WRAM_BSS_END - SDK_AUTOLOAD.WRAM.START + 0x080 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
} > check.WORKRAM

View File

@ -231,7 +231,8 @@ SECTIONS
SDK_AUTOLOAD_WRAM_START = SDK_AUTOLOAD.WRAM.START;
SDK_AUTOLOAD_WRAM_END = SDK_AUTOLOAD.WRAM.END;
SDK_AUTOLOAD_WRAM_BSS_END = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_MOUNT_INFO_TABLE = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_AUTOLOAD_WRAM_BSS_END = SDK_MOUNT_INFO_TABLE + 0x400;
SDK_AUTOLOAD_WRAM_SIZE = SDK_AUTOLOAD.WRAM.SIZE;
SDK_AUTOLOAD_WRAM_BSS_SIZE = SDK_AUTOLOAD.WRAM.BSS_SIZE;
@ -304,7 +305,7 @@ SECTIONS
} > <PROPERTY.OVERLAYTABLE>F
############################ OTHERS #################################
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD.WRAM.BSS_END;
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD_WRAM_BSS_END;
SDK_IRQ_STACKSIZE = <STATIC.IRQSTACKSIZE>; # allocated in WRAM
SDK_SYS_STACKSIZE = <STATIC.STACKSIZE>; # allocated in WRAM

View File

@ -46,6 +46,8 @@ extern "C" {
| PAD_BUTTON_X | PAD_BUTTON_Y | PAD_BUTTON_R )
// 量産工程で使用する初回起動設定をキャンセルしてカードブートするショートカットキー
#define SYSM_MOUNT_INFO_SIZE (0x400 - OS_MOUNT_PATH_LEN)
typedef enum PlatformCode {
PLATFORM_NTR = 0,
PLATFORM_TWL = 1

View File

@ -127,6 +127,8 @@ typedef struct SYSM_work {
typedef struct SYSM_work2 {
SVCHMACSHA1Context hmac_sha1_context;
TitleProperty bootTitleProperty;
char bootContentPath[ FS_ENTRY_LONGNAME_MAX ];
}SYSM_work2;
// NTRにおける仕様を継承する必要のあるワーク