diff --git a/build/components/hyena.TWL/hyena.lcf.template b/build/components/hyena.TWL/hyena.lcf.template index b5421477..6d9f6896 100644 --- a/build/components/hyena.TWL/hyena.lcf.template +++ b/build/components/hyena.TWL/hyena.lcf.template @@ -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 } > 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 = ; # allocated in WRAM SDK_SYS_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 diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 738f05d6..6cff4501 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -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); diff --git a/build/libraries_sysmenu/boot/ARM7/Makefile b/build/libraries_sysmenu/boot/ARM7/Makefile index 82214a1f..926e7748 100644 --- a/build/libraries_sysmenu/boot/ARM7/Makefile +++ b/build/libraries_sysmenu/boot/ARM7/Makefile @@ -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) diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 7df30f26..a8ed5090 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -25,6 +25,7 @@ #include #include #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_ADDR(SDK_AUTOLOAD_WRAM_START)はリンカから与えられる + SYSM_OWN_ARM7_WRAM_ADDR, NULL, // SYSM_OWN_ARM7_WRAM_ADDR(SDK_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; lplatform_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; - } - } -} - diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 554deb29..da3a57cf 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -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 ); diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 545ed7ef..600cfb07 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -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 ]; diff --git a/build/libraries_sysmenu/sysmenu/common/include/internal_api.h b/build/libraries_sysmenu/sysmenu/common/include/internal_api.h index dfd325f7..e19fb010 100644 --- a/build/libraries_sysmenu/sysmenu/common/include/internal_api.h +++ b/build/libraries_sysmenu/sysmenu/common/include/internal_api.h @@ -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 //------------------------------------------------------- // デバイス //------------------------------------------------------- diff --git a/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c new file mode 100644 index 00000000..835264ff --- /dev/null +++ b/build/libraries_sysmenu/sysmenu/common/src/mountInfo.c @@ -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 +#include +#include +#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; + } + } +} + diff --git a/build/systemMenu_RED/NandInitializer/ARM7.TWL/racoon.lcf.template b/build/systemMenu_RED/NandInitializer/ARM7.TWL/racoon.lcf.template index 5794212a..23068cab 100644 --- a/build/systemMenu_RED/NandInitializer/ARM7.TWL/racoon.lcf.template +++ b/build/systemMenu_RED/NandInitializer/ARM7.TWL/racoon.lcf.template @@ -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 } > 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 = ; # allocated in WRAM SDK_SYS_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 diff --git a/include/firm/specfiles/ARM7-TS-FIRM.lcf.template b/include/firm/specfiles/ARM7-TS-FIRM.lcf.template index 7ef4c275..4833ff7f 100644 --- a/include/firm/specfiles/ARM7-TS-FIRM.lcf.template +++ b/include/firm/specfiles/ARM7-TS-FIRM.lcf.template @@ -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 } > F ############################ OTHERS ################################# - SDK_WRAM_ARENA_LO = SDK_AUTOLOAD.WRAM.BSS_END; + SDK_WRAM_ARENA_LO = SDK_AUTOLOAD_WRAM_BSS_END; SDK_IRQ_STACKSIZE = ; # allocated in WRAM SDK_SYS_STACKSIZE = ; # allocated in WRAM diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index 6c0abb42..8cc7e6ad 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -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 diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 6a00a900..8659dfba 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -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における仕様を継承する必要のあるワーク