diff --git a/build/libraries/fatfs/ARM7/Makefile b/build/libraries/fatfs/ARM7/Makefile index 9bf6af19..5d193869 100644 --- a/build/libraries/fatfs/ARM7/Makefile +++ b/build/libraries/fatfs/ARM7/Makefile @@ -37,9 +37,9 @@ SRCDIR = src rom_sdmc SRCS = \ fatfs_loader.c \ fatfs_firm.c \ - sdmc.c \ - sdmc_nandinit.c \ - drsdmc.c \ +# sdmc.c \ +# sdmc_nandinit.c \ +# drsdmc.c \ TARGET_LIB = libfatfs_sp$(FIRM_LIBSUFFIX).a diff --git a/build/libraries/fatfs/ARM7/src/fatfs_firm.c b/build/libraries/fatfs/ARM7/src/fatfs_firm.c index c53da981..708ab622 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_firm.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_firm.c @@ -24,6 +24,8 @@ #include #include +#include + extern u32 NAND_FAT_PARTITION_COUNT; #define DMA_PIPE 2 @@ -107,19 +109,14 @@ static inline void MIi_NDmaRestart(u32 ndmaNo) /* 専用NAND関数 */ -#define NAND_SECTOR_SIZE 512 -extern void SDCARD_TimerStart(u32 tim); /* タイムアウト計測スタート */ +//extern void SDCARD_TimerStart(u32 tim); /* タイムアウト計測スタート */ extern volatile SDMC_ERR_CODE SDCARD_ErrStatus; +extern s16 SDCARD_SDHCFlag; /* SDHCカードフラグ */ -static inline void nandClearFifo( void ) +static inline void WaitFifoFull( void ) { - *SDIF_CNT |= SDIF_CNT_FCLR; -} - -static inline void nandWaitFifoFull( void ) -{ - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ - while( (*SDIF_CNT & SDIF_CNT_FULL) == 0) +// SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ + while( (*SDIF_CNT & SDIF_CNT_FULL) == 0 ) { if ( SDCARD_ErrStatus != SDMC_NORMAL ) // an error was occurred { @@ -128,22 +125,28 @@ static inline void nandWaitFifoFull( void ) } } -static void nandStartToRead(u32 block, u32 count) +static void StartToRead(u32 block, u32 count) { - SD_EnableClock(); - SD_EnableSeccnt(count); *SDIF_FSC = count; - *SDIF_FDS = NAND_SECTOR_SIZE; - *SDIF_CNT = (*SDIF_CNT & ~SDIF_CNT_FEIE) | SDIF_CNT_FFIE | SDIF_CNT_USEFIFO; + *SDIF_FDS = SECTOR_SIZE; + *SDIF_CNT = (*SDIF_CNT & ~SDIF_CNT_FEIE) | SDIF_CNT_FFIE | SDIF_CNT_FCLR | SDIF_CNT_USEFIFO; CC_EXT_MODE = CC_EXT_MODE_DMA; - nandClearFifo(); SDCARD_ErrStatus = SDMC_NORMAL; - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ - SD_MultiReadBlock(block * NAND_SECTOR_SIZE); +// SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ + SD_EnableClock(); + SD_EnableSeccnt(count); + if ( SDCARD_SDHCFlag ) + { + SD_MultiReadBlock( block ); + } + else + { + SD_MultiReadBlock(block * SECTOR_SIZE); + } } -static void nandStopToRead( void ) +static void StopToRead( void ) { if( !SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE) ){ SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */ @@ -151,8 +154,7 @@ static void nandStopToRead( void ) SD_TransEndFPGA(); /* 転送終了処理(割り込みマスクを禁止に戻す) */ SD_DisableClock(); /* クロック供給停止 */ - nandClearFifo(); - *SDIF_CNT &= ~SDIF_CNT_USEFIFO; /* FIFO使用フラグOFF */ + *SDIF_CNT = (*SDIF_CNT & ~SDIF_CNT_USEFIFO) | SDIF_CNT_FCLR; /* FIFO使用フラグOFF */ CC_EXT_MODE = CC_EXT_MODE_PIO; /* PIOモード(DMAモードOFF) */ } @@ -194,7 +196,7 @@ void FATFS_DisableAES( void ) } /*---------------------------------------------------------------------------* - Name: nandRead + Name: ReadNormal Description: normal read @@ -204,29 +206,31 @@ void FATFS_DisableAES( void ) Returns: None *---------------------------------------------------------------------------*/ -void nandRead(u32 block, void *dest, u16 count) +static void ReadNormal(u32 block, void *dest, u16 count) { +OS_SetDebugLED((u8)(0x80 | block)); //MI_StopNDma( DMA_PIPE ); // already stopped //MI_StopNDma( DMA_RECV ); // already stopped - nandStartToRead( block, count ); + StartToRead( block, count ); if ( SDCARD_ErrStatus != SDMC_NORMAL ) { return; } - while ( count-- ) + while ( count-- ) // TODO: 自動起動DMA1つで十分なはず { - nandWaitFifoFull(); - MIi_NDmaRecv( DMA_PIPE, (void*)SDIF_FI, dest, NAND_SECTOR_SIZE ); + WaitFifoFull(); + MIi_NDmaRecv( DMA_PIPE, (void*)SDIF_FI, dest, SECTOR_SIZE ); MI_WaitNDma( DMA_PIPE ); - dest = (void*)((u32)dest + NAND_SECTOR_SIZE); + dest = (void*)((u32)dest + SECTOR_SIZE); } - nandStopToRead(); + StopToRead(); +OS_SetDebugLED((u8)(0x90 | block)); } /*---------------------------------------------------------------------------* - Name: nandReadAES + Name: ReadAES Description: AES read @@ -237,10 +241,10 @@ void nandRead(u32 block, void *dest, u16 count) Returns: None *---------------------------------------------------------------------------*/ #define PIPE_SIZE 64 -void nandReadAES(u32 block, void *dest, u16 count) +static void ReadAES(u32 block, void *dest, u16 count) { u32 offset = 0; // in bytes - +OS_SetDebugLED((u8)(0xC0 | block)); //MI_StopNDma( DMA_PIPE ); // already stopped //MI_StopNDma( DMA_RECV ); // already stopped @@ -251,32 +255,33 @@ void nandReadAES(u32 block, void *dest, u16 count) */ AESi_Reset(); AESi_Reset(); - AESi_DmaRecv( DMA_RECV, dest, (u32)(count * NAND_SECTOR_SIZE), NULL, NULL ); + AESi_DmaRecv( DMA_RECV, dest, (u32)(count * SECTOR_SIZE), NULL, NULL ); // AESi_SetCounter( &aesCounter ); // remain??? -// FATFSi_AddCounter( count * NAND_SECTOR_SIZE ); // update for next read - AESi_Run( AES_MODE_CTR, 0, (u32)(count * NAND_SECTOR_SIZE / AES_BLOCK_SIZE), NULL, NULL ); +// FATFSi_AddCounter( count * SECTOR_SIZE ); // update for next read + AESi_Run( AES_MODE_CTR, 0, (u32)(count * SECTOR_SIZE / AES_BLOCK_SIZE), NULL, NULL ); - nandStartToRead( block, count ); + StartToRead( block, count ); if ( SDCARD_ErrStatus != SDMC_NORMAL ) { return; } - while ( block * NAND_SECTOR_SIZE > offset ) + while ( block * SECTOR_SIZE > offset ) { while ( AES_GET_CNT_BITS( reg_AES_AES_CNT, IFIFO_CNT ) ) { } - if ( (offset & NAND_SECTOR_SIZE) == 0 ) + if ( (offset & SECTOR_SIZE) == 0 ) { - nandWaitFifoFull(); + WaitFifoFull(); } MIi_NDmaRestart( DMA_PIPE ); offset += PIPE_SIZE; } MI_WaitNDma( DMA_PIPE ); - nandStopToRead(); + StopToRead(); MI_WaitNDma( DMA_RECV ); +OS_SetDebugLED((u8)(0xD0 | block)); } /*---------------------------------------------------------------------------* @@ -304,13 +309,59 @@ static BOOL nandRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOO if( reading) { if (useAES) { - nandReadAES(block, buffer, count); + ReadAES(block, buffer, count); } else { - nandRead(block, buffer, count); + ReadNormal(block, buffer, count); } - result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); + result = 0; // always success +// result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); +// result = sdmcRead( buffer, count, block, NULL, &SdResult); + }else{ + result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult); +// result = sdmcWrite( buffer, count, block, NULL, &SdResult); + } + if( result) { + return FALSE; + } + + return TRUE; +} + +/*---------------------------------------------------------------------------* + Name: sdmcRtfsIoFirm + + Description: 上位層からのセクタリード/ライト要求を受ける + + Arguments: driveno : ドライブ番号 + block : 開始ブロック番号 + buffer : + count : ブロック数 + reading : リード要求時にTRUE + + Returns: TRUE/FALSE + *---------------------------------------------------------------------------*/ +static BOOL sdmcRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOOL reading) +{ + u16 result; + SdmcResultInfo SdResult; +#pragma unused( driveno) + + /**/ + sdmcSelect( (u16)SDMC_PORT_CARD); + + if( reading) { + if (useAES) + { + ReadAES(block, buffer, count); + } + else + { + ReadNormal(block, buffer, count); + } + result = 0; // always success +// result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); // result = sdmcRead( buffer, count, block, NULL, &SdResult); }else{ result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult); @@ -374,6 +425,37 @@ static BOOL nandRtfsAttachFirm( int driveno, int partition_no) return( result); } +/*---------------------------------------------------------------------------* + Name: sdmcRtfsAttachFirm + + Description: sdmcドライバをドライブに割り当てる + + Arguments: driveno : ドライブ番号 + + Returns: + *---------------------------------------------------------------------------*/ +#define sdmcRtfsCtrl FATFSi_sdmcRtfsCtrl +extern int sdmcRtfsCtrl( int driveno, int opcode, void* pargs); +static BOOL sdmcRtfsAttachFirm( int driveno) +{ + BOOLEAN result; + DDRIVE pdr; + + pdr.dev_table_drive_io = sdmcRtfsIoFirm; + pdr.dev_table_perform_device_ioctl = sdmcRtfsCtrl; + pdr.register_file_address = (dword) 0; /* Not used */ + pdr.interrupt_number = 0; /* Not used */ + pdr.drive_flags = 0;//DRIVE_FLAGS_FAILSAFE; + pdr.partition_number = 0; /* Not used */ + pdr.pcmcia_slot_number = 0; /* Not used */ + pdr.controller_number = 0; + pdr.logical_unit_number = 0; + + result = rtfs_attach( driveno, &pdr, "SD0"); //構造体がFSライブラリ側にコピーされる + + return( result); +} + /*---------------------------------------------------------------------------* Name: FATFS_InitFIRM @@ -383,18 +465,16 @@ static BOOL nandRtfsAttachFirm( int driveno, int partition_no) Returns: None *---------------------------------------------------------------------------*/ -extern SDMC_ERR_CODE sdmcNandInit( void (*func1)(),void (*func2)()); BOOL FATFS_InitFIRM( void ) { /* RTFSライブラリを初期化 */ - if(!rtfs_init()) + if(!FATFSi_rtfs_init()) { return FALSE; } /* SDドライバ初期化 */ -// if (sdmcInit(SDMC_NOUSE_DMA, NULL, NULL) != SDMC_NORMAL) // firm_sdmc - if (sdmcNandInit(NULL, NULL) != SDMC_NORMAL) // rom_sdmc + if (FATFSi_sdmcInit(SDMC_NOUSE_DMA, NULL, NULL) != SDMC_NORMAL) { return FALSE; } @@ -402,7 +482,7 @@ BOOL FATFS_InitFIRM( void ) } /*---------------------------------------------------------------------------* - Name: FATFS_MountNandFirm + Name: FATFS_MountDriveFirm Description: mount nand partition @@ -410,12 +490,27 @@ BOOL FATFS_InitFIRM( void ) Returns: None *---------------------------------------------------------------------------*/ -BOOL FATFS_MountNandFirm( int driveno, int partition_no ) +BOOL FATFS_MountDriveFirm( int driveno, FATFSMediaType media, int partition_no ) { - // CAUTION!: 同じ関数を2回呼び出す理由について要確認。 - if ( !nandRtfsAttachFirm(driveno, partition_no) || nandRtfsAttachFirm(driveno, partition_no)) + if (media == FATFS_MEDIA_TYPE_NAND) { - return FALSE; + // CAUTION!: 同じ関数を2回呼び出す理由について要確認。 + if ( !nandRtfsAttachFirm(driveno, partition_no) || nandRtfsAttachFirm(driveno, partition_no)) + { + return FALSE; + } + } + else + { + if (partition_no) // support only 0 + { + return FALSE; + } + // CAUTION!: 同じ関数を2回呼び出す理由について要確認。 + if ( !sdmcRtfsAttachFirm(driveno) || sdmcRtfsAttachFirm(driveno)) + { + return FALSE; + } } return TRUE; } diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index c18e5f04..69b4dd17 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -27,14 +27,14 @@ #define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0 static ROM_Header* const rh= (ROM_Header*)(HW_MAIN_MEM_SYSTEM_END - 0x2000); -static int menu_fd = 0; +static int menu_fd = -1; /*---------------------------------------------------------------------------* Name: FATFS_OpenRecentMenu Description: open recent menu file - Arguments: None + Arguments: driveno drive number ('A' is 0) Returns: None *---------------------------------------------------------------------------*/ @@ -47,7 +47,26 @@ BOOL FATFS_OpenRecentMenu( int driveno ) } menufile[0] = (char)('A' + driveno); menu_fd = po_open((u8*)menufile, PO_BINARY, 0); - if (menu_fd <= 0) + if (menu_fd < 0) + { + return FALSE; + } + return TRUE; +} + +/*---------------------------------------------------------------------------* + Name: FATFS_OpenSpecifiedMenu + + Description: open specified menu file + + Arguments: menufile target filename + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL FATFS_OpenSpecifiedMenu( const char* menufile ) +{ + menu_fd = po_open((u8*)menufile, PO_BINARY, 0); + if (menu_fd < 0) { return FALSE; } @@ -55,29 +74,29 @@ BOOL FATFS_OpenRecentMenu( int driveno ) } #define HEADER_SIZE 0x1000 +#define AUTH_SIZE 0xe00 -#define SLOT_SIZE 0x2000 +#define SLOT_SIZE 0x8000 static BOOL FATFS_LoadBuffer(u32 offset, u32 size) { u8* base = (u8*)MI_GetWramMapStart_B(); - u8* curr = base; static int count = 0; // seek first - if (!po_lseek(menu_fd, (s32)offset, PSEEK_SET)) + if (po_lseek(menu_fd, (s32)offset, PSEEK_SET) < 0) { return FALSE; } // loading loop while (size > 0) { - u8* dest = curr + count * SLOT_SIZE; // target buffer address + u8* dest = base + count * SLOT_SIZE; // target buffer address u32 unit = size < SLOT_SIZE ? size : SLOT_SIZE; // size while (MI_GetWramBankMaster_B(count) != MI_WRAM_ARM7) // waiting to be master { } - if (!po_read(menu_fd, (u8*)dest, (int)unit)) // reading + if (po_read(menu_fd, (u8*)dest, (int)unit) < 0) // reading { return FALSE; } @@ -100,7 +119,7 @@ static BOOL FATFS_LoadBuffer(u32 offset, u32 size) BOOL FATFS_LoadHeader( void ) { // open the file in FATFS_InitFIRM() - if (menu_fd <= 0) + if (menu_fd < 0) { return FALSE; } @@ -108,7 +127,8 @@ BOOL FATFS_LoadHeader( void ) // load header without AES PXI_NotifyID( FIRM_PXI_ID_LOAD_HEADER ); FATFS_DisableAES(); - if (!FATFS_LoadBuffer(0, HEADER_SIZE) || + if (!FATFS_LoadBuffer(0, AUTH_SIZE) || + !FATFS_LoadBuffer(AUTH_SIZE, HEADER_SIZE - AUTH_SIZE) || PXI_RecvID() != FIRM_PXI_ID_AUTH_HEADER ) { return FALSE; @@ -118,7 +138,7 @@ BOOL FATFS_LoadHeader( void ) { AESKeySeed seed; AESi_InitGameKeys((u8*)rh->s.game_code); - PXI_RecvDataByFifo( PXI_FIFO_TAG_DATA, &seed, AES_BLOCK_SIZE ); +// PXI_RecvDataByFifo( PXI_FIFO_TAG_DATA, &seed, AES_BLOCK_SIZE ); AESi_SetKeySeedA(&seed); // APP //AESi_SetKeySeedB(&seed); // APP & HARD //AESi_SetKeySeedC(&seed); // diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c new file mode 100644 index 00000000..cac3af7b --- /dev/null +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -0,0 +1,272 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL - libraries - mi + File: mi_loader.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 + +#define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0 + +static ROM_Header* const rh = (ROM_Header*)(HW_MAIN_MEM_SYSTEM_END - 0x2000); + +#define HEADER_SIZE 0x1000 +#define AUTH_SIZE 0xe00 +#define RSA_BLOCK_SIZE 128 + +#define SLOT_SIZE 0x8000 + +#define HASH_UNIT 0x800 // TODO: optimizing to maximize cache efficiency + +typedef struct SHA1_CTX // 実際には、サイズが同じなら中身は何でも良い +{ + u32 h0,h1,h2,h3,h4; + u32 Nl,Nh; + u32 data[16]; + int num; + void (*sha_block)(struct SHA1_CTX *c, const u8 *W, int num); +} +SHA1_CTX; + +static inline void SHA1_Init(SHA1_CTX *ctx) +{ + if (ctx == NULL) + return; + + MI_CpuClear8(ctx, sizeof(SHA1_CTX)); + SVC_SHA1Init(ctx); +} + +static inline void SHA1_Update(SHA1_CTX *ctx, const void* data, u32 len) +{ + if (ctx == NULL) + return; + if (len > 0 && data == NULL) + return; + SVC_SHA1Update(ctx, data, len); +} + +static inline void SHA1_GetHash(SHA1_CTX *ctx, u8* md) +{ + if (ctx == NULL) + return; + if (md == NULL) + return; + SVC_SHA1GetHash(md, ctx); +} + +static inline void SHA1_Calc(u8* md, const void* data, u32 len) +{ + SVC_CalcSHA1(md, data, len); +} + + +static BOOL MI_LoadBuffer(u8* dest, u32 size, SHA1_CTX *ctx) +{ + u8* base = (void*)MI_GetWramMapStart_B(); + static int count = 0; + + while (size > 0) + { + u8* src = base + count * SLOT_SIZE; + u32 unit = size < SLOT_SIZE ? size : SLOT_SIZE; + if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_PIRIOD ) + { + return FALSE; + } + MIi_SetWramBankMaster_B(count, MI_WRAM_ARM9); + if (ctx) + { + int done; + for (done = 0; done < unit; done += HASH_UNIT) + { + u8* s = src + done; + u8* d = dest + done; + u32 u = unit < done + HASH_UNIT ? unit - done : HASH_UNIT; + SHA1_Update( ctx, s, u ); + MI_CpuCopyFast( s, d, u ); + } + } + else + { + MI_CpuCopyFast( src, dest, unit ); + } + MI_CpuClearFast( src, unit ); + DC_FlushRange( src, unit ); + MIi_SetWramBankMaster_B(count, MI_WRAM_ARM7); + count = (count + 1) & 0x07; + size -= unit; + dest += unit; + } + return TRUE; +} + +/*---------------------------------------------------------------------------* + Name: MI_LoadHeader + + Description: load header + + Arguments: pool pointer to the pool info for SVC_DecryptoSign + rsa_key key address + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL MI_LoadHeader( int* pool, const void* rsa_key ) +{ + SHA1_CTX ctx; + u8 md[DIGEST_SIZE_SHA1]; + SHA1_Init(&ctx); + + // load header (hash target) + if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_HEADER || + !MI_LoadBuffer( (u8*)rh, AUTH_SIZE, &ctx ) ) + { + return FALSE; + } + SHA1_GetHash(&ctx, md); + // load header (remain) + if ( !MI_LoadBuffer( (u8*)rh + AUTH_SIZE, HEADER_SIZE - AUTH_SIZE, NULL ) ) + { + return FALSE; + } + + // RSA +#if 0 + makerom.TWLのset_signature.cのCheckRomCertificateを元に書き換える +#endif + { + SignatureData sd; +#if 0 + int i; + BOOL result = TRUE; + SVC_DecryptoSign(pool, &sd, rh->signature, rsa_key); + for (i = 0; i < DIGEST_SIZE_SHA1; i++) + { + if ( md[i] != sd.digest[i] ) + { + result = FALSE; + } + } +#endif +#if 0 + if ( !result ) + { + return FALSE; + } +#endif + PXI_NotifyID( FIRM_PXI_ID_AUTH_HEADER ); +// PXI_SendDataByFifo( PXI_FIFO_TAG_DATA, sd.aes_key_seed, AES_BLOCK_SIZE ); + MI_CpuClear8(&sd, sizeof(sd)); + MI_CpuClear8(&md, sizeof(md)); + } + + return TRUE; +} + +static inline BOOL MIi_LoadModule(void* dest, u32 size, const u8 digest[DIGEST_SIZE_SHA1]) +{ + SHA1_CTX ctx; + u8 md[DIGEST_SIZE_SHA1]; + int i; + BOOL result = TRUE; + + SHA1_Init(&ctx); + if ( !MI_LoadBuffer( dest, size, &ctx ) ) + { + return FALSE; + } +#if 0 + SHA1_GetHash(&ctx, md); + for ( i = 0; i < DIGEST_SIZE_SHA1; i++ ) + { + if ( md[i] != digest[i] ) + { + result = FALSE; + } + } +#endif + return result; +} + +/*---------------------------------------------------------------------------* + Name: MI_LoadMenu + + Description: load menu program + + Arguments: None + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL MI_LoadMenu( void ) +{ + // load ARM9 static region + if ( rh->s.main_size > 0 ) + { + if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM9_STATIC || + !MIi_LoadModule( rh->s.main_ram_address, rh->s.main_size, rh->s.main_static_digest ) ) + { + return FALSE; + } + PXI_NotifyID( FIRM_PXI_ID_AUTH_ARM9_STATIC ); + } + + // load ARM7 static region + if ( rh->s.sub_size > 0 ) + { + if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM7_STATIC || + !MIi_LoadModule( rh->s.sub_ram_address, rh->s.sub_size, rh->s.sub_static_digest ) ) + { + return FALSE; + } + PXI_NotifyID( FIRM_PXI_ID_AUTH_ARM7_STATIC ); + } + + // load ARM9 extended static region + if ( rh->s.main_ex_size > 0 ) + { + if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM9_STATIC_EX || + !MIi_LoadModule( rh->s.main_ex_ram_address, rh->s.main_ex_size, rh->s.main_static_ex_digest ) ) + { + return FALSE; + } + PXI_NotifyID( FIRM_PXI_ID_AUTH_ARM9_STATIC_EX ); + } + // load ARM7 extended static region + if ( rh->s.sub_ex_size > 0 ) + { + if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_ARM7_STATIC_EX || + !MIi_LoadModule( rh->s.sub_ex_ram_address, rh->s.sub_ex_size, rh->s.sub_static_ex_digest ) ) + { + return FALSE; + } + PXI_NotifyID( FIRM_PXI_ID_AUTH_ARM7_STATIC_EX ); + } + return TRUE; +} + +/*---------------------------------------------------------------------------* + Name: MI_BootMenu + + Description: boot menu + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void MI_BootMenu( void ) +{ + OSi_Boot( rh->s.main_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data ); +} diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index fb449446..7a3214e3 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -23,7 +23,8 @@ #include #endif -void OSi_BootCore( OSEntryPoint p ); +void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ); + /*---------------------------------------------------------------------------* Name: OSi_Boot @@ -38,34 +39,19 @@ void OSi_BootCore( OSEntryPoint p ); void OSi_Boot( void* entry, MIHeader_WramRegs* w ) { OSEntryPoint p = (OSEntryPoint)entry; + void (*OSBootCore)( OSEntryPoint p, MIHeader_WramRegs* w ); (void)OS_DisableInterrupts(); OSi_Finalize(); #ifdef SDK_ARM9 - - MI_CpuCopy8( w, (void*)REG_MBK1_ADDR, 32 ); // set MBK1 - 8 - //reg_RBKCNT1_H_ADDR = w->sub_wramlock[4]; // set RBKCNT01 - - // request hiding secure rom - PXI_NotifyID( FIRM_PXI_ID_DONE_WRAM_SETTING ); - - OSi_ClearWorkArea(); - + OSBootCore = (void*)HW_ITCM; #else // SDK_ARM7 - - // wait request of hiding secure rom - PXI_WaitID( FIRM_PXI_ID_DONE_WRAM_SETTING ); - - MI_CpuCopy8( &w->sub_wrammap_a, (void*)REG_MBK6_ADDR, 13 ); // set MBK6 - MBK_C_LOCK - - AESi_SetKeySeedA( (AESKeySeed*)OSi_GetFromBromAddr()->aes_key[2] ); // erase - - OSi_ClearWorkArea(); - + OSBootCore = (void*)HW_EXT_WRAM; #endif // SDK_ARM7 - OSi_BootCore( p ); + MI_CpuCopyFast( OSi_BootCore, OSBootCore, 0x200 ); + OSBootCore(p, w); } /*---------------------------------------------------------------------------* @@ -79,14 +65,20 @@ void OSi_Boot( void* entry, MIHeader_WramRegs* w ) *---------------------------------------------------------------------------*/ void OSi_Finalize(void) { + (void)OS_DisableInterrupts(); (void)OS_DisableIrq(); reg_OS_IE = 0; reg_OS_IF = 0xffffffff; #ifdef SDK_ARM7 reg_OS_IE2 = 0; reg_OS_IF2 = 0xffff; + // set init check flag by bootrom + SVC_CpuClear( REG_OS_PAUSE_CHK_MASK, (void*)REG_PAUSE_ADDR, sizeof(u16), 16 ); #else // SDK_ARM9 - (void)OS_DisableInterrupts(); + // set init check flag + reg_OS_PAUSE = REG_OS_PAUSE_CHK_MASK; + *(u64*)HW_INIT_LOCK_BUF = 0; + DC_Disable(); DC_FlushAll(); DC_WaitWriteBufferEmpty(); @@ -130,25 +122,86 @@ asm void OSi_ClearWorkArea( void ) bx r11 } -asm void OSi_BootCore( OSEntryPoint p ) +asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) { mov r11, r0 + mov r10, r1 + +#ifdef SDK_ARM9 + // wait for request of wram map + ldr r3, =REG_SUBPINTF_ADDR + mov r2, #REG_PXI_SUBPINTF_A7STATUS_MASK +@0: + ldr r0, [r3] + and r0, r0, r2 + cmp r0, r2 + bne @0 + + // r10- => r9-r2 + ldr r9, =REG_MBK1_ADDR + add r2, r9, #32 +@1: + ldr r3, [r10], #4 + str r3, [r9], #4 + cmp r9, r2 + blt @1 + + // notify wram map + ldr r3, =REG_SUBPINTF_ADDR + mov r0, #REG_PXI_SUBPINTF_A9STATUS_MASK + str r0, [r3] + // wait for finalizing pxi + ldr r3, =REG_SUBPINTF_ADDR +@2: + ldr r0, [r3] + and r0, r0, #REG_PXI_SUBPINTF_A7STATUS_MASK + cmp r0, #0 + bne @2 + // finalize pxi + mov r0, #0 + str r0, [r3] +#else + // request wram map + ldr r3, =REG_MAINPINTF_ADDR + mov r0, #REG_PXI_MAINPINTF_A7STATUS_MASK + str r0, [r3] + // wait for wram map + mov r2, #REG_PXI_MAINPINTF_A9STATUS_MASK +@0: + ldr r0, [r3] + and r0, r0, r2 + cmp r0, r2 + bne @0 + // finalize pxi + mov r0, #0 + str r0, [r3] + + // r10- => r9-r2 + add r10, r10, #32 + ldr r9, =REG_MBK6_ADDR + add r2, r9, #13 +@1: + ldr r3, [r10], #4 + str r3, [r9], #4 + cmp r9, r2 + blt @1 +#endif // clear stack with r4-r9 mov r0, #0 #if 0 ldr r1, =HW_FIRM_STACK ldr r2, =HW_FIRM_STACK_SIZE -#endif bl MIi_CpuClearFast +#endif mov lr, r11 // clear registers #if 0 ldr sp, =HW_FIRM_STACK -#endif ldmia sp, {r0-r12,sp} +#endif bx lr } diff --git a/build/libraries/os/common/os_init_firm.c b/build/libraries/os/common/os_init_firm.c index 611549b3..937ba30e 100644 --- a/build/libraries/os/common/os_init_firm.c +++ b/build/libraries/os/common/os_init_firm.c @@ -43,7 +43,8 @@ void OS_InitFIRM(void) //---- Init interProcessor I/F // Sync with ARM7 to enable OS_GetConsoleType() // PXI_Init() must be called before OS_InitArenaEx() - PXI_Init(); + //PXI_Init(); + PXI_InitFifoFIRM(); //---- Init Arena (arenas except SUBPRIV-WRAM) OS_InitArena(); @@ -78,7 +79,7 @@ void OS_InitFIRM(void) #endif //---- Init Reset System #ifndef SDK_SMALL_BUILD - OS_InitReset(); +// OS_InitReset(); #endif //---- Init Cartridge @@ -104,7 +105,8 @@ void OS_InitFIRM(void) // for ARM7 //---- Init interProcessor I/F - PXI_Init(); + //PXI_Init(); + PXI_InitFifoFIRM(); //---- Init Arena (SUBPRIV-WRAM arena) OS_InitArena(); @@ -132,7 +134,7 @@ void OS_InitFIRM(void) //---- Init Reset System #ifndef SDK_SMALL_BUILD - OS_InitReset(); +// OS_InitReset(); #endif //---- Init Cartridge diff --git a/build/nandfirm/nandfirm-loader/ARM7/Makefile b/build/nandfirm/nandfirm-loader/ARM7/Makefile index 2371477d..d1d1b41b 100644 --- a/build/nandfirm/nandfirm-loader/ARM7/Makefile +++ b/build/nandfirm/nandfirm-loader/ARM7/Makefile @@ -31,6 +31,8 @@ SRCS = main.c CRT0_O = crt0_firm.o +#LCFILE_TEMPLATE = $(FIRM_SPECDIR)/$(FIRM_PROC)-$(FIRM_PLATFORM)-PARTNER.lcf.template + #SRCDIR = # using default #LCFILE = # using default diff --git a/build/nandfirm/nandfirm-loader/ARM7/main.c b/build/nandfirm/nandfirm-loader/ARM7/main.c index dbd171ef..a8de90a1 100644 --- a/build/nandfirm/nandfirm-loader/ARM7/main.c +++ b/build/nandfirm/nandfirm-loader/ARM7/main.c @@ -16,59 +16,124 @@ *---------------------------------------------------------------------------*/ #include #include +#include #include +//#define BOOT_SECURE_SRL // 本番SRLをブートするときにだけ定義する #define FIRM_ENABLE_JTAG +#define FATFS_HEAP_SIZE (64*1024) + +#ifndef BOOT_SECURE_SRL +#define BOOT_DEVICE FATFS_MEDIA_TYPE_SD +#define PARTITION_NO 0 // 0固定 +#define MENU_FILE (char*)L"A:\\menu.srl" // 対象ファイル(DRIVE_LETTERと合わせること) +#define MENU_FILE_A "A:\\menu_a.srl" // 対象ファイル(DRIVE_LETTERと合わせること) +#define MENU_FILE_B "A:\\menu_b.srl" // 対象ファイル(DRIVE_LETTERと合わせること) +#define MENU_FILE_L "A:\\menu_l.srl" // 対象ファイル(DRIVE_LETTERと合わせること) +#define MENU_FILE_R "A:\\menu_r.srl" // 対象ファイル(DRIVE_LETTERと合わせること) +#else +#define BOOT_DEVICE FATFS_MEDIA_TYPE_NAND +#define PARTITION_NO 0 // 対象パーティション +#endif + #define DRIVE_LETTER 'A' // マウント先ドライブ名 #define DRIVE_NO (DRIVE_LETTER - 'A') // マウント先ドライブ番号 -#define PARTITION_NO 0 // 対象パーティション + +static u64 fatfs_arena[FATFS_HEAP_SIZE/sizeof(u64)]; + +#ifndef SDK_FINALROM +static u8 step = 0; +#endif void TwlSpMain( void ) { - OS_TPrintf( "\nNAND Boot time is %d msec.\n", OS_TicksToMilliSecondsBROM32(OS_GetTick())); +// OS_TPrintf( "\nNAND Boot time is %d msec.\n", OS_TicksToMilliSecondsBROM32(OS_GetTick())); -// for normal program -// MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); - -// required here? -// reg_GX_VRAMCNT_C = REG_GX_VRAMCNT_C_FIELD( TRUE, 0, 0x2); - - OS_InitFIRM(); - - OS_InitDebugLED(); - OS_SetDebugLED(0x01); +#ifndef BOOT_SECURE_SRL + MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); +#endif #ifdef FIRM_ENABLE_JTAG reg_SCFG_JTAG = REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK; #endif // FIRM_ENABLE_JTAG + OS_InitFIRM(); + + OS_InitDebugLED(); + OS_SetDebugLED(++step); + PM_InitFIRM(); - OS_SetDebugLED(0x02); + OS_SetDebugLED(++step); - // load menu - if ( FATFS_InitFIRM() && // ARM7側のみ&NANDのみ - FATFS_MountNandFirm(DRIVE_NO, PARTITION_NO) && // NAND[0]をX:ドライブにマウント - FATFS_OpenRecentMenu(DRIVE_NO) ) // 目的のファイルをオープンしてしまう + /* FATFSライブラリ用にカレントヒープに設定 */ { + OSHeapHandle hh; + u8 *lo = (u8*)fatfs_arena; + u8 *hi = (u8*)fatfs_arena + FATFS_HEAP_SIZE; + OS_SetSubPrivArenaLo(lo); + OS_SetSubPrivArenaHi(hi); + OS_SetSubPrivArenaLo(lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1)); + hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, lo + 32, hi - 32); + OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh); + } - OS_SetDebugLED(0x04); + OS_SetDebugLED(++step); - if ( FATFS_LoadHeader() && FATFS_LoadMenu() ) + if ( FATFS_InitFIRM() ) + { + OS_SetDebugLED(++step); + + if ( FATFS_MountDriveFirm( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) { + BOOL result; + OS_SetDebugLED(++step); - OS_SetDebugLED(0x08); +#ifdef BOOT_SECURE_SRL + result = FATFS_OpenRecentMenu( DRIVE_NO ); +#else + switch ( PAD_Read() & PAD_KEYPORT_MASK ) + { + case 0: + result = FATFS_OpenSpecifiedMenu( MENU_FILE ); + break; + case PAD_BUTTON_A: + result = FATFS_OpenSpecifiedMenu( MENU_FILE_A ); + break; + case PAD_BUTTON_B: + result = FATFS_OpenSpecifiedMenu( MENU_FILE_B ); + break; + case PAD_BUTTON_L: + result = FATFS_OpenSpecifiedMenu( MENU_FILE_L ); + break; + case PAD_BUTTON_R: + result = FATFS_OpenSpecifiedMenu( MENU_FILE_R ); + break; + default: + OS_SetDebugLED( (u8)(PAD_Read() & PAD_KEYPORT_MASK) ); + OS_Terminate(); + break; + } +#endif + if ( result ) + { + OS_SetDebugLED(++step); - FATFS_BootMenu(); + if ( FATFS_LoadHeader() && FATFS_LoadMenu() ) + { + OS_SetDebugLED(++step); + + FATFS_BootMenu(); + } + } } } - else - { - PXI_NotifyID( FIRM_PXI_ID_NULL ); - } - OS_SetDebugLED(0xF0); + // failed + PXI_NotifyID( FIRM_PXI_ID_NULL ); + + OS_SetDebugLED( (u8)(0xF0 | ++step)); OS_Terminate(); } diff --git a/build/nandfirm/nandfirm-loader/ARM9/Makefile b/build/nandfirm/nandfirm-loader/ARM9/Makefile index ab735d1e..1cd39092 100644 --- a/build/nandfirm/nandfirm-loader/ARM9/Makefile +++ b/build/nandfirm/nandfirm-loader/ARM9/Makefile @@ -30,6 +30,11 @@ SRCS = main.c CRT0_O = crt0_firm.o +MAKEROM_ARM7 = ../ARM7/bin/ARM7-TS/Release/main.LTD.TWL.sbin +MAKEROM_ARM7_BASE = ../ARM7/bin/ARM7-TS/Release/main + +#LCFILE_TEMPLATE = $(FIRM_SPECDIR)/$(FIRM_PROC)-$(FIRM_PLATFORM)-PARTNER.lcf.template + #SRCDIR = # using default #LCFILE = # using default diff --git a/build/nandfirm/nandfirm-loader/ARM9/main.c b/build/nandfirm/nandfirm-loader/ARM9/main.c index 79c7c549..b3fba250 100644 --- a/build/nandfirm/nandfirm-loader/ARM9/main.c +++ b/build/nandfirm/nandfirm-loader/ARM9/main.c @@ -17,20 +17,41 @@ #include #include +//#define BOOT_SECURE_SRL // 本番SRLをブートするときにだけ定義する + +//#ifndef BOOT_SECURE_SRL +//#define RSA_KEY_ADDR rsa_key +//static const rsa_key[128] = +//{ +// 0x00 +//}; +//#else +#define RSA_KEY_ADDR OSi_GetFromBromAddr()->rsa_pubkey[7] +//#endif + u8 acHeap[4*1024] __attribute__ ((aligned (32))); int acPool[3]; -int errID; void TwlMain( void ) { - OS_TPrintf( "\nNAND Boot time is %d msec.\n", OS_TicksToMilliSecondsBROM32(OS_GetTick())); +// OS_TPrintf( "\nNAND Boot time is %d msec.\n", OS_TicksToMilliSecondsBROM32(OS_GetTick())); + +#ifndef BOOT_SECURE_SRL +#define FIRM_SHARD HW_TWL_SECONDARY_ROM_HEADER_BUF +#define FIRM_SHARD_END HW_TWL_MAIN_MEM_END +#define FIRM_SHARD_SIZE (FIRM_SHARD_END-FIRM_SHARD) + MIi_CpuClearFast( 0, (void*)FIRM_SHARD, FIRM_SHARD_SIZE ); + DC_FlushRange( (void*)FIRM_SHARD, FIRM_SHARD_SIZE ); +// MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); +#endif + reg_GX_VRAMCNT_C = REG_GX_VRAMCNT_C_FIELD( TRUE, 0, 0x2); OS_InitFIRM(); SVC_InitSignHeap( acPool, acHeap, sizeof(acHeap) ); // load menu - if ( MI_LoadHeader( acPool ) && MI_LoadMenu() ) + if ( MI_LoadHeader( acPool, RSA_KEY_ADDR ) && MI_LoadMenu() ) { MI_BootMenu(); } diff --git a/build/nandfirm/nandfirm-loader/Makefile b/build/nandfirm/nandfirm-loader/Makefile index f08837d2..f7b6dc94 100644 --- a/build/nandfirm/nandfirm-loader/Makefile +++ b/build/nandfirm/nandfirm-loader/Makefile @@ -19,6 +19,7 @@ FIRM_TARGET = FIRM +TWL_KEYSDIR = $(FIRM_ROOT)/keys/bootrom include $(TWLFIRM_ROOT)/build/buildtools/commondefs diff --git a/build/nandfirm/nandfirm-loader/nandfirm.nandsf b/build/nandfirm/nandfirm-loader/nandfirm.nandsf index 2f3f059d..0e6773af 100644 --- a/build/nandfirm/nandfirm-loader/nandfirm.nandsf +++ b/build/nandfirm/nandfirm-loader/nandfirm.nandsf @@ -12,11 +12,11 @@ MIRROR_OFS: 0x80000 DECOMP_PROC : ARM9 # ARM9 or ARM7 ARM9_COMP : FALSE # TRUE or FALSE, should be before ARM9_SBIN -ARM9_SBIN : $(MAKEFIRM_ARM9).FLX.TWL.sbin +ARM9_SBIN : $(MAKEFIRM_ARM9).sbin ARM9_ELF : $(MAKEFIRM_ARM9).axf ARM7_COMP : FALSE # TRUE or FALSE, should be before ARM7_SBIN -ARM7_SBIN : $(MAKEFIRM_ARM7).FLX.TWL.sbin +ARM7_SBIN : $(MAKEFIRM_ARM7).sbin ARM7_ELF : $(MAKEFIRM_ARM7).axf ARM9_X2 : TRUE # TRUE or FALSE diff --git a/build/nandfirm/nandfirm-loader/wram_regs/wram_regs.c b/build/nandfirm/nandfirm-loader/wram_regs/wram_regs.c index 995edeca..e537ee61 100644 --- a/build/nandfirm/nandfirm-loader/wram_regs/wram_regs.c +++ b/build/nandfirm/nandfirm-loader/wram_regs/wram_regs.c @@ -47,29 +47,29 @@ MIHeader_WramRegs wram_regs_init = REG_MI_MBK_C7_FIELD( 1, MI_WRAM_BC_OFFSET_224KB, MI_WRAM_ARM9 ), }, REG_MI_MBK6_FIELD( REG_WRAM_MAP_CONV_ADDR( 6, A, EADDR, MI_WRAM_MAP_NULL ), - MI_WRAM_IMAGE_128KB, + MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 6, A, SADDR, MI_WRAM_MAP_NULL ) ), REG_MI_MBK7_FIELD( REG_WRAM_MAP_CONV_ADDR( 7, B, EADDR, HW_WRAM_AREA_HALF + 0x00080000 ), - MI_WRAM_IMAGE_128KB, + MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 7, B, SADDR, HW_WRAM_AREA_HALF + 0x00040000 ) ), REG_MI_MBK8_FIELD( REG_WRAM_MAP_CONV_ADDR( 8, C, EADDR, HW_WRAM_AREA_HALF + 0x00040000 ), - MI_WRAM_IMAGE_128KB, + MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 8, C, SADDR, HW_WRAM_AREA_HALF ) ), // ARM7 REG_MI_MBK6_FIELD( REG_WRAM_MAP_CONV_ADDR( 6, A, EADDR, HW_WRAM_AREA_HALF + 0x00040000 ), - MI_WRAM_IMAGE_128KB, + MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 6, A, SADDR, HW_WRAM_AREA_HALF ) ), REG_MI_MBK7_FIELD( REG_WRAM_MAP_CONV_ADDR( 7, B, EADDR, HW_WRAM_AREA_HALF + 0x00080000 ), - MI_WRAM_IMAGE_128KB, + MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 7, B, SADDR, HW_WRAM_AREA_HALF + 0x00040000 ) ), REG_MI_MBK8_FIELD( REG_WRAM_MAP_CONV_ADDR( 8, C, EADDR, MI_WRAM_MAP_NULL ), - MI_WRAM_IMAGE_128KB, + MI_WRAM_IMAGE_256KB, REG_WRAM_MAP_CONV_ADDR( 8, C, SADDR, MI_WRAM_MAP_NULL ) ), diff --git a/include/firm/fatfs/ARM7/fatfs_firm.h b/include/firm/fatfs/ARM7/fatfs_firm.h index 69a51da2..dd349cc8 100644 --- a/include/firm/fatfs/ARM7/fatfs_firm.h +++ b/include/firm/fatfs/ARM7/fatfs_firm.h @@ -20,6 +20,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -48,32 +49,6 @@ void FATFS_EnableAES( AESKeySlot slot, const AESCounter* pCounter ); *---------------------------------------------------------------------------*/ void FATFS_DisableAES( void ); -/*---------------------------------------------------------------------------* - Name: nandRead - - Description: normal read - - Arguments: block: source sector number in NAND - dest: dest address (4 bytes alignment) - count: sectors to transfer - - Returns: None - *---------------------------------------------------------------------------*/ -void nandRead(u32 block, void *dest, u16 count); - -/*---------------------------------------------------------------------------* - Name: nandReadAES - - Description: AES read - - Arguments: block: source sector number in NAND - dest: dest address (4 bytes alignment) - count: sectors to transfer - - Returns: None - *---------------------------------------------------------------------------*/ -void nandReadAES(u32 block, void *dest, u16 count); - /*---------------------------------------------------------------------------* Name: FATFS_InitFIRM @@ -86,7 +61,7 @@ void nandReadAES(u32 block, void *dest, u16 count); BOOL FATFS_InitFIRM( void ); /*---------------------------------------------------------------------------* - Name: FATFS_MountNandFirm + Name: FATFS_MountDriveFirm Description: mount nand partition @@ -94,7 +69,7 @@ BOOL FATFS_InitFIRM( void ); Returns: None *---------------------------------------------------------------------------*/ -BOOL FATFS_MountNandFirm( int driveno, int partition_no ); +BOOL FATFS_MountDriveFirm( int driveno, FATFSMediaType media, int partition_no ); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/firm/fatfs/ARM7/fatfs_loader.h b/include/firm/fatfs/ARM7/fatfs_loader.h index 371373e9..ac0d1405 100644 --- a/include/firm/fatfs/ARM7/fatfs_loader.h +++ b/include/firm/fatfs/ARM7/fatfs_loader.h @@ -29,12 +29,23 @@ extern "C" { Description: open recent menu file - Arguments: None + Arguments: driveno drive number ('A' is 0) Returns: None *---------------------------------------------------------------------------*/ BOOL FATFS_OpenRecentMenu( int driveno ); +/*---------------------------------------------------------------------------* + Name: FATFS_OpenSpecifiedMenu + + Description: open specified menu file + + Arguments: menufile target filename + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL FATFS_OpenSpecifiedMenu( const char* menufile ); + /*---------------------------------------------------------------------------* Name: FATFS_LoadHeader diff --git a/include/firm/mi/ARM9/mi_loader.h b/include/firm/mi/ARM9/mi_loader.h index 7e4b9fcf..4eb02dd3 100644 --- a/include/firm/mi/ARM9/mi_loader.h +++ b/include/firm/mi/ARM9/mi_loader.h @@ -30,10 +30,11 @@ extern "C" { Description: load header Arguments: pool pointer to the pool info for SVC_DecryptoSign + rsa_key key address Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL MI_LoadHeader( int* pool ); +BOOL MI_LoadHeader( int* pool, const void* rsa_key ); /*---------------------------------------------------------------------------* Name: MI_LoadMenu diff --git a/include/firm/pxi/common/misc.h b/include/firm/pxi/common/misc.h index 5311e62d..1c1c96c5 100644 --- a/include/firm/pxi/common/misc.h +++ b/include/firm/pxi/common/misc.h @@ -28,7 +28,7 @@ extern "C" { typedef enum { // from ARM7 - FIRM_PXI_ID_INIT_ARM7 = 7, + FIRM_PXI_ID_INIT_ARM7 = 3, FIRM_PXI_ID_LOAD_HEADER = 8, FIRM_PXI_ID_LOAD_ARM9_STATIC = 5, FIRM_PXI_ID_LOAD_ARM7_STATIC = 6, @@ -37,13 +37,13 @@ typedef enum FIRM_PXI_ID_LOAD_PIRIOD = 11, // from ARM9 - FIRM_PXI_ID_INIT_ARM9 = 9, + FIRM_PXI_ID_INIT_ARM9 = 1, FIRM_PXI_ID_AUTH_HEADER = 8, FIRM_PXI_ID_AUTH_ARM9_STATIC = 5, FIRM_PXI_ID_AUTH_ARM7_STATIC = 6, FIRM_PXI_ID_AUTH_ARM9_STATIC_EX = 9, FIRM_PXI_ID_AUTH_ARM7_STATIC_EX = 10, - FIRM_PXI_ID_DONE_WRAM_SETTING = 4, + FIRM_PXI_ID_DONE_WRAM_SETTING = 11, // from both of ARM9 and ARM7 FIRM_PXI_ID_NULL = 0, diff --git a/include/firm/specfiles/ARM7-TS-FIRM.lcf.template b/include/firm/specfiles/ARM7-TS-FIRM.lcf.template index 4aa47cc5..c183b409 100644 --- a/include/firm/specfiles/ARM7-TS-FIRM.lcf.template +++ b/include/firm/specfiles/ARM7-TS-FIRM.lcf.template @@ -16,12 +16,12 @@ #--------------------------------------------------------------------------- MEMORY { - (RWX) : ORIGIN = , LENGTH = 0x0 > + (RWX) : ORIGIN = , LENGTH = 0x0 > - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> F (RW) : ORIGIN = 0, LENGTH = 0x0 > F (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -33,11 +33,11 @@ MEMORY check.WORKRAM (RWX) : ORIGIN = 0x037f8000, LENGTH = 0x18000 > workram.check check.MAINMEM (RWX) : ORIGIN = 0x02fe0000, LENGTH = 0x1c000 > mainmem.check - binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > + binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 >> - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> L (RW) : ORIGIN = 0, LENGTH = 0x0 > L (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -343,7 +343,6 @@ SECTIONS WRITEW SDK_AUTOLOAD..SIZE; WRITEW SDK_AUTOLOAD..BSS_SIZE; - } > binary.AUTOLOAD_INFO SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; @@ -711,7 +710,6 @@ SECTIONS WRITEW SDK_LTDAUTOLOAD..SIZE; WRITEW SDK_LTDAUTOLOAD..BSS_SIZE; - } > binary.LTDAUTOLOAD_INFO SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE; @@ -888,10 +886,10 @@ SECTIONS } > check.LTDWRAM -# .check.LTDMAIN: -# { + .check.LTDMAIN: + { # . = SDK_LTDAUTOLOAD.LTDMAIN.BSS_END; -# -# } > check.LTDMAIN + + } > check.LTDMAIN } diff --git a/include/firm/specfiles/ARM7-TS-PARTNER.lcf.template b/include/firm/specfiles/ARM7-TS-PARTNER.lcf.template new file mode 100644 index 00000000..5e9c4151 --- /dev/null +++ b/include/firm/specfiles/ARM7-TS-PARTNER.lcf.template @@ -0,0 +1,899 @@ +#--------------------------------------------------------------------------- +# Project: TwlSDK - include +# File: ARM7-BB.lcf.template +# +# 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$ +#--------------------------------------------------------------------------- +MEMORY +{ + (RWX) : ORIGIN = , LENGTH = 0x0 #> + + + (RWX) : ORIGIN = , LENGTH = 0x0 #>> + +# binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + + F (RW) : ORIGIN = 0, LENGTH = 0x0 > + F (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWXO): ORIGIN = , LENGTH = 0x0 > + + + arena.MAIN (RW) : ORIGIN = AFTER(,), LENGTH = 0x0 + check.WORKRAM (RWX) : ORIGIN = 0x037f8000, LENGTH = 0x18000 > workram.check + check.MAINMEM (RWX) : ORIGIN = 0x02fe0000, LENGTH = 0x1c000 > mainmem.check + +# binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWX) : ORIGIN = , LENGTH = 0x0 #>> + +# binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + + L (RW) : ORIGIN = 0, LENGTH = 0x0 > + L (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWXO): ORIGIN = , LENGTH = 0x0 > + + + check.LTDWRAM (RWX) : ORIGIN = 0x03000000, LENGTH = 0x40000 > ltdwram.check + check.LTDMAIN (RWX) : ORIGIN = 0x02f88000, LENGTH = 0x58000 > ltdmain.check +} + +KEEP_SECTION +{ + .sinit +} + +SECTIONS +{ + ############################ STATIC ################################# + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_STATIC_START =.; + SDK_STATIC_TEXT_START =.; + #:::::::::: text/rodata + OBJECT(_start,*) + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_STATIC_SINIT_START =.; + #:::::::::: ctor + + + + + + + + + + + + + WRITEW 0; + #:::::::::: ctor + SDK_STATIC_SINIT_END =.; + #:::::::::: text/rodata + SDK_STATIC_TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(4); + SDK_STATIC_DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + #:::::::::: data + SDK_STATIC_DATA_END =.; + . = ALIGN(4); + SDK_STATIC_END =.; + + SDK_STATIC_TEXT_SIZE = SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START; + SDK_STATIC_DATA_SIZE = SDK_STATIC_DATA_END - SDK_STATIC_DATA_START; + SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START; + __sinit__ = SDK_STATIC_SINIT_START; # for static initializer + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_STATIC_BSS_START =.; + #:::::::::: bss + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(4); + SDK_STATIC_BSS_END = .; + + SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START; + + } >> + + + ############################ AUTOLOADS ############################## + SDK_AUTOLOAD.MAIN.START = 0x02fe0000; + SDK_AUTOLOAD.MAIN.END = SDK_AUTOLOAD.MAIN.START; + SDK_AUTOLOAD.MAIN.BSS_END = SDK_AUTOLOAD.MAIN.START; + SDK_AUTOLOAD.MAIN.SIZE = 0; + SDK_AUTOLOAD.MAIN.BSS_SIZE = 0; + SDK_AUTOLOAD.WRAM.START = 0x037f8000; + SDK_AUTOLOAD.WRAM.END = SDK_AUTOLOAD.WRAM.START; + SDK_AUTOLOAD.WRAM.BSS_END = SDK_AUTOLOAD.WRAM.START; + SDK_AUTOLOAD.WRAM.SIZE = 0; + SDK_AUTOLOAD.WRAM.BSS_SIZE = 0; + SDK_AUTOLOAD_START = SDK_STATIC_END; + SDK_AUTOLOAD_SIZE = 0; + SDK_AUTOLOAD_NUMBER = ; + + + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_AUTOLOAD__ID =; + SDK_AUTOLOAD..ID =; + SDK_AUTOLOAD..START =.; + SDK_AUTOLOAD..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + . = ALIGN(4); + SDK_STATIC_ETABLE_START =.; + __exception_table_start__ =.; + EXCEPTION + __exception_table_end__ =.; + SDK_STATIC_ETABLE_END =.; + + + + + + + + #:::::::::: text/rodata + SDK_AUTOLOAD..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE BLOCK + # + . = ALIGN(4); + SDK_AUTOLOAD..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + + + + + + + #:::::::::: data + SDK_AUTOLOAD..DATA_END =.; + . = ALIGN(4); + SDK_AUTOLOAD..END =.; + + SDK_AUTOLOAD..TEXT_SIZE = SDK_AUTOLOAD..TEXT_END - SDK_AUTOLOAD..TEXT_START; + SDK_AUTOLOAD..DATA_SIZE = SDK_AUTOLOAD..DATA_END - SDK_AUTOLOAD..DATA_START; + SDK_AUTOLOAD..SIZE = SDK_AUTOLOAD..END - SDK_AUTOLOAD..START; + SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD..SIZE; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_AUTOLOAD..BSS_START = .; + #:::::::::: bss + + + + + + + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(4); + SDK_AUTOLOAD..BSS_END = .; + + SDK_AUTOLOAD..BSS_SIZE = SDK_AUTOLOAD..BSS_END - SDK_AUTOLOAD..BSS_START; + + } >> + + + + SDK_AUTOLOAD_MAIN_START = SDK_AUTOLOAD.MAIN.START; + SDK_AUTOLOAD_MAIN_END = SDK_AUTOLOAD.MAIN.END; + SDK_AUTOLOAD_MAIN_BSS_END = SDK_AUTOLOAD.MAIN.BSS_END; + SDK_AUTOLOAD_MAIN_SIZE = SDK_AUTOLOAD.MAIN.SIZE; + SDK_AUTOLOAD_MAIN_BSS_SIZE = SDK_AUTOLOAD.MAIN.BSS_SIZE; + 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_AUTOLOAD_WRAM_SIZE = SDK_AUTOLOAD.WRAM.SIZE; + SDK_AUTOLOAD_WRAM_BSS_SIZE = SDK_AUTOLOAD.WRAM.BSS_SIZE; + + ############################ AUTOLOAD_INFO ########################## + .binary.AUTOLOAD_INFO: + { + SDK_AUTOLOAD_LIST = .; + + WRITEW ADDR(.); + WRITEW SDK_AUTOLOAD..SIZE; + WRITEW SDK_AUTOLOAD..BSS_SIZE; + + SDK_AUTOLOAD_LIST_END = .; + } >> #> binary.AUTOLOAD_INFO + +# SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; +# SDK_AUTOLOAD_LIST_END = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); + SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); + + ############################ OVERLAYS ############################### + SDK_OVERLAY_NUMBER = ; + + + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_OVERLAY__ID =; ### SEGMENT OVERLAY ID + SDK_OVERLAY..ID =; + SDK_OVERLAY..START =.; + SDK_OVERLAY..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_OVERLAY..SINIT_START =.; + #:::::::::: ctor + + + + + + + + + + + + + WRITEW 0; + #:::::::::: ctor + SDK_OVERLAY..SINIT_END =.; + #:::::::::: text/rodata + SDK_OVERLAY..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(4); + SDK_OVERLAY..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + #:::::::::: data + SDK_OVERLAY..DATA_END =.; + . = ALIGN(4); + SDK_OVERLAY..END =.; + + SDK_OVERLAY..TEXT_SIZE = SDK_OVERLAY..TEXT_END - SDK_OVERLAY..TEXT_START; + SDK_OVERLAY..DATA_SIZE = SDK_OVERLAY..DATA_END - SDK_OVERLAY..DATA_START; + SDK_OVERLAY..SIZE = SDK_OVERLAY..END - SDK_OVERLAY..START; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_OVERLAY..BSS_START = .; + #:::::::::: bss + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(4); + SDK_OVERLAY..BSS_END = .; + + SDK_OVERLAY..BSS_SIZE = SDK_OVERLAY..BSS_END - SDK_OVERLAY..BSS_START; + + } >> + + + + ############################ ARENA ################################## + .arena.MAIN: + { + . = ALIGN(4); + SDK_SECTION_ARENA_START =.; + + } > arena.MAIN + + ############################ OVERLAYDEFS ############################ + .F: + { + ### module information + WRITEW ADDR(.); # load address + WRITEW _start; # entry address + WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # size of module + WRITEW _start_AutoloadDoneCallback; # callback autoload done + + ### overlay filename + + WRITES (""); # Overlay + + + } > F + + ############################ OVERLAYTABLE ########################### + .F: + { + + WRITEW ; # overlay ID + WRITEW ADDR(.); # load address + WRITEW SDK_OVERLAY..SIZE; # size of module + WRITEW SDK_OVERLAY..BSS_SIZE; # size of bss + WRITEW SDK_OVERLAY..SINIT_START; # start address of static init + WRITEW SDK_OVERLAY..SINIT_END; # end address of static init + WRITEW ; # ROM file ID + WRITEW 0; # Reserved + + + } > F + + ############################ OTHERS ################################# + SDK_WRAM_ARENA_LO = SDK_AUTOLOAD.WRAM.BSS_END; + SDK_SUBPRIV_ARENA_LO = SDK_AUTOLOAD.MAIN.BSS_END; + SDK_IRQ_STACKSIZE = ; # allocated in WRAM + SDK_SYS_STACKSIZE = ; # allocated in WRAM + SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1; + + .check.WORKRAM: + { + . = . + SDK_AUTOLOAD.WRAM.BSS_END - SDK_AUTOLOAD.WRAM.START + 0x080 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN; + + } > check.WORKRAM + + .check.MAINMEM: + { + . = SDK_SUBPRIV_ARENA_LO; + + } > check.MAINMEM + + ########################### LTDAUTOLOADS ############################ + SDK_LTDAUTOLOAD.LTDMAIN.START = SDK_STATIC_BSS_END; + SDK_LTDAUTOLOAD.LTDMAIN.END = SDK_LTDAUTOLOAD.LTDMAIN.START; + SDK_LTDAUTOLOAD.LTDMAIN.BSS_END = SDK_LTDAUTOLOAD.LTDMAIN.START; + SDK_LTDAUTOLOAD.LTDMAIN.SIZE = 0; + SDK_LTDAUTOLOAD.LTDMAIN.BSS_SIZE = 0; + SDK_LTDAUTOLOAD.LTDWRAM.START = 0x03000000; + SDK_LTDAUTOLOAD.LTDWRAM.END = SDK_LTDAUTOLOAD.LTDWRAM.START; + SDK_LTDAUTOLOAD.LTDWRAM.BSS_END = SDK_LTDAUTOLOAD.LTDWRAM.START; + SDK_LTDAUTOLOAD.LTDWRAM.SIZE = 0; + SDK_LTDAUTOLOAD.LTDWRAM.BSS_SIZE = 0; + SDK_LTDAUTOLOAD_TOP_START = 0x02e80000; + SDK_LTDAUTOLOAD_TOP_SIZE = 4; # STATIC 領域が無い代わりに 4 bytes のダミーがバイナリファイルの先頭に入る # + SDK_LTDAUTOLOAD_START = SDK_LTDAUTOLOAD_TOP_START + SDK_LTDAUTOLOAD_TOP_SIZE; + SDK_LTDAUTOLOAD_SIZE = 0; + SDK_LTDAUTOLOAD_NUMBER = ; + + .binary.LTDAUTOLOAD_TOP: + { + WRITEW 0xdeadbeef; + + } >> #> binary.LTDAUTOLOAD_TOP + + + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + SDK_LTDAUTOLOAD__ID =; + SDK_LTDAUTOLOAD..ID =; + SDK_LTDAUTOLOAD..START =.; + # + # TEXT BLOCK: READ ONLY + # + SDK_LTDAUTOLOAD..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + #:::::::::: text/rodata + SDK_LTDAUTOLOAD..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE BLOCK + # + . = ALIGN(4); + SDK_LTDAUTOLOAD..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + + + + + + + + + + + + + #:::::::::: data + SDK_LTDAUTOLOAD..DATA_END =.; + . = ALIGN(4); + SDK_LTDAUTOLOAD..END =.; + + SDK_LTDAUTOLOAD..TEXT_SIZE = SDK_LTDAUTOLOAD..TEXT_END - SDK_LTDAUTOLOAD..TEXT_START; + SDK_LTDAUTOLOAD..DATA_SIZE = SDK_LTDAUTOLOAD..DATA_END - SDK_LTDAUTOLOAD..DATA_START; + SDK_LTDAUTOLOAD..SIZE = SDK_LTDAUTOLOAD..END - SDK_LTDAUTOLOAD..START; + SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD..SIZE; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_LTDAUTOLOAD..BSS_START =.; + #:::::::::: bss + + + + + + + + + + + + + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(4); + SDK_LTDAUTOLOAD..BSS_END =.; + + SDK_LTDAUTOLOAD..BSS_SIZE = SDK_LTDAUTOLOAD..BSS_END - SDK_LTDAUTOLOAD..BSS_START; + + } >> + + + + SDK_LTDAUTOLOAD_LTDMAIN_START = SDK_LTDAUTOLOAD.LTDMAIN.START; + SDK_LTDAUTOLOAD_LTDMAIN_END = SDK_LTDAUTOLOAD.LTDMAIN.END; + SDK_LTDAUTOLOAD_LTDMAIN_BSS_END = SDK_LTDAUTOLOAD.LTDMAIN.BSS_END; + SDK_LTDAUTOLOAD_LTDMAIN_SIZE = SDK_LTDAUTOLOAD.LTDMAIN.SIZE; + SDK_LTDAUTOLOAD_LTDMAIN_BSS_SIZE = SDK_LTDAUTOLOAD.LTDMAIN.BSS_SIZE; + SDK_LTDAUTOLOAD_LTDWRAM_START = SDK_LTDAUTOLOAD.LTDWRAM.START; + SDK_LTDAUTOLOAD_LTDWRAM_END = SDK_LTDAUTOLOAD.LTDWRAM.END; + SDK_LTDAUTOLOAD_LTDWRAM_BSS_END = SDK_LTDAUTOLOAD.LTDWRAM.BSS_END; + SDK_LTDAUTOLOAD_LTDWRAM_SIZE = SDK_LTDAUTOLOAD.LTDWRAM.SIZE; + SDK_LTDAUTOLOAD_LTDWRAM_BSS_SIZE = SDK_LTDAUTOLOAD.LTDWRAM.BSS_SIZE; + + ######################### LTDAUTOLOAD_INFO ########################## + .binary.LTDAUTOLOAD_INFO: + { + SDK_LTDAUTOLOAD_LIST = .; + + WRITEW ADDR(.); + WRITEW SDK_LTDAUTOLOAD..SIZE; + WRITEW SDK_LTDAUTOLOAD..BSS_SIZE; + + SDK_LTDAUTOLOAD_LIST_END = .; + } >> #> binary.LTDAUTOLOAD_INFO + +# SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE; +# SDK_LTDAUTOLOAD_LIST_END = SDK_LTDAUTOLOAD_LIST + SIZEOF(.binary.LTDAUTOLOAD_INFO); + SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SIZEOF(.binary.LTDAUTOLOAD_INFO); + + ########################### LTDOVERLAYS ############################# + SDK_LTDOVERLAY_NUMBER = ; + + + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + SDK_LTDOVERLAY__ID =; + SDK_LTDOVERLAY..ID =; + SDK_LTDOVERLAY..START =.; + # + # TEXT BLOCK: READ ONLY + # + SDK_LTDOVERLAY..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_LTDOVERLAY..SINIT_START =.; + #:::::::::: ctor + + + + + + + + + + + + + WRITEW 0; + #:::::::::: ctor + SDK_LTDOVERLAY..SINIT_END =.; + #:::::::::: text/rodata + SDK_LTDOVERLAY..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(4); + SDK_LTDOVERLAY..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + #:::::::::: data + SDK_LTDOVERLAY..DATA_END =.; + . = ALIGN(4); + SDK_LTDOVERLAY..END =.; + + SDK_LTDOVERLAY..TEXT_SIZE = SDK_LTDOVERLAY..TEXT_END - SDK_LTDOVERLAY..TEXT_START; + SDK_LTDOVERLAY..DATA_SIZE = SDK_LTDOVERLAY..DATA_END - SDK_LTDOVERLAY..DATA_START; + SDK_LTDOVERLAY..SIZE = SDK_LTDOVERLAY..END - SDK_LTDOVERLAY..START; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_LTDOVERLAY..BSS_START =.; + #:::::::::: bss + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(4); + SDK_LTDOVERLAY..BSS_END =.; + + SDK_LTDOVERLAY..BSS_SIZE = SDK_LTDOVERLAY..BSS_END - SDK_LTDOVERLAY..BSS_START; + + } >> + + + + ########################## LTDOVERLAYDEFS ########################### + .L: + { + ### TWL limited extended static module information + WRITEW SDK_LTDAUTOLOAD_TOP_START; # load address + WRITEW 0; # padding + WRITEW SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD_TOP_SIZE; # size of module + WRITEW 0; # padding + + ### TWL limited overlay filename + + WRITES (""); + + + } > L + + ######################### LTDOVERLAYTABLE ########################### + .L: + { + + WRITES # overlay ID + WRITEW ADDR(.); # load address + WRITEW SDK_LTDOVERLAY..SIZE; # size of module + WRITEW SDK_LTDOVERLAY..BSS_SIZE; # size of bss + WRITEW SDK_LTDOVERLAY..SINIT_START; # start address of static init + WRITEW SDK_LTDOVERLAY..SINIT_END; # end address of static init + WRITEW # ROM file ID + WRITEW 0; # Reserved + + + } > L + + ############################ OTHERS ################################# + .check.LTDWRAM: + { + . = SDK_LTDAUTOLOAD.LTDWRAM.BSS_END; + + } > check.LTDWRAM + + .check.LTDMAIN: + { +# . = SDK_LTDAUTOLOAD.LTDMAIN.BSS_END; + + } > check.LTDMAIN + +} diff --git a/include/firm/specfiles/ARM9-TS-FIRM.lcf.template b/include/firm/specfiles/ARM9-TS-FIRM.lcf.template index daedf10d..87a0f705 100644 --- a/include/firm/specfiles/ARM9-TS-FIRM.lcf.template +++ b/include/firm/specfiles/ARM9-TS-FIRM.lcf.template @@ -16,13 +16,13 @@ #--------------------------------------------------------------------------- MEMORY { - (RWX) : ORIGIN = , LENGTH = 0x0 > + (RWX) : ORIGIN = , LENGTH = 0x0 > - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> -# binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> F (RW) : ORIGIN = 0, LENGTH = 0x0 > F (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -39,11 +39,11 @@ MEMORY check.ITCM (RW) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check check.DTCM (RW) : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check - binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > + binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 >> - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> L (RW) : ORIGIN = 0, LENGTH = 0x0 > L (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -387,7 +387,6 @@ SECTIONS WRITEW SDK_AUTOLOAD..SIZE; WRITEW SDK_AUTOLOAD..BSS_SIZE; - } > binary.AUTOLOAD_INFO SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; @@ -773,7 +772,6 @@ SECTIONS WRITEW SDK_LTDAUTOLOAD..SIZE; WRITEW SDK_LTDAUTOLOAD..BSS_SIZE; - } > binary.LTDAUTOLOAD_INFO SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE; @@ -968,10 +966,10 @@ SECTIONS # Module filelist .binary.MODULE_FILES: { - WRITES (""); + WRITES (""); WRITES (""); WRITES (""); - WRITES (""); + WRITES (""); WRITES (""); WRITES (""); diff --git a/include/firm/specfiles/ARM9-TS-PARTNER.lcf.template b/include/firm/specfiles/ARM9-TS-PARTNER.lcf.template new file mode 100644 index 00000000..d4582b72 --- /dev/null +++ b/include/firm/specfiles/ARM9-TS-PARTNER.lcf.template @@ -0,0 +1,983 @@ +#--------------------------------------------------------------------------- +# Project: TwlSDK - include +# File: ARM9-BB.lcf.template +# +# 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$ +#--------------------------------------------------------------------------- +MEMORY +{ + (RWX) : ORIGIN = , LENGTH = 0x0 #> + + + (RWX) : ORIGIN = , LENGTH = 0x0 #>> + +# binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> +# binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + + F (RW) : ORIGIN = 0, LENGTH = 0x0 > + F (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWXO): ORIGIN = , LENGTH = 0x0 > + + + dummy.MAIN_EX.NITRO (RW) : ORIGIN = 0x023e0000, LENGTH = 0x0 + arena.MAIN.NITRO (RW) : ORIGIN = AFTER(,), LENGTH = 0x0 + arena.MAIN_EX.NITRO (RW) : ORIGIN = AFTER(dummy.MAIN_EX.NITRO,), LENGTH = 0x0 + arena.ITCM (RW) : ORIGIN = AFTER(ITCM,), LENGTH = 0x0 + arena.DTCM (RW) : ORIGIN = AFTER(DTCM,), LENGTH = 0x0 + + check.ITCM (RW) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check + check.DTCM (RW) : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check + +# binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWX) : ORIGIN = , LENGTH = 0x0 #>> + +# binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + + L (RW) : ORIGIN = 0, LENGTH = 0x0 > + L (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWXO): ORIGIN = , LENGTH = 0x0 > + + + dummy.MAIN_EX.TWL (RW) : ORIGIN = 0x0d000000, LENGTH = 0x0 + arena.MAIN.TWL (RW) : ORIGIN = AFTER(,,LTDMAIN,), LENGTH = 0x0 + arena.MAIN_EX.TWL (RW) : ORIGIN = AFTER(dummy.MAIN_EX.TWL,,,LTDMAIN,), LENGTH = 0x0 + + binary.MODULE_FILES (RW) : ORIGIN = 0, LENGTH = 0x0 > component.files +} + +FORCE_ACTIVE +{ + SVC_SoftReset +} + +KEEP_SECTION +{ + .sinit +} + +SECTIONS +{ + ############################ STATIC ################################# + .: + { + ALIGNALL(4); + . = ALIGN(32); # Fit to cache line + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_STATIC_START =.; + SDK_STATIC_TEXT_START =.; + #:::::::::: text/rodata + libsyscall.a (.text) + OBJECT(_start,*) + crt0_firm.o (.text) + crt0_firm.o (.rodata) + # + # .version セクションを追加しています。 + # このセクションに含まれる情報はロットチェックの際に + # 必要となりますので、必ずこの位置に残すようにして下さい。 + # + * (.version) + OBJECT(TwlMain,*) + + + + + + + * (.exception) + . = ALIGN(4); + SDK_STATIC_ETABLE_START =.; + __exception_table_start__ =.; + EXCEPTION + __exception_table_end__ =.; + SDK_STATIC_ETABLE_END =.; + + + + + + + + + + + + + . = ALIGN(4); + SDK_STATIC_SINIT_START =.; + #:::::::::: ctor + + + + + + + + + + + + + WRITEW 0; + #:::::::::: ctor + SDK_STATIC_SINIT_END =.; + #:::::::::: text/rodata + SDK_STATIC_TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(32); # Fit to cache line + SDK_STATIC_DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + . = ALIGN(4); + SDK_OVERLAY_DIGEST =.; + # NO DIGEST + SDK_OVERLAY_DIGEST_END =.; + #:::::::::: data + SDK_STATIC_DATA_END =.; + . = ALIGN(32); + SDK_STATIC_END =.; + + SDK_STATIC_TEXT_SIZE = SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START; + SDK_STATIC_DATA_SIZE = SDK_STATIC_DATA_END - SDK_STATIC_DATA_START; + SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START; + __sinit__ = SDK_STATIC_SINIT_START; # for static initializer + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(32); # Fit to cache line + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_STATIC_BSS_START =.; + #:::::::::: bss + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(32); + SDK_STATIC_BSS_END = .; + + SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START; + + } >> + + + ############################ AUTOLOADS ############################## + SDK_AUTOLOAD.ITCM.START = 0x01ff8000; + SDK_AUTOLOAD.ITCM.END = SDK_AUTOLOAD.ITCM.START; + SDK_AUTOLOAD.ITCM.BSS_END = SDK_AUTOLOAD.ITCM.START; + SDK_AUTOLOAD.ITCM.SIZE = 0; + SDK_AUTOLOAD.ITCM.BSS_SIZE = 0; + SDK_AUTOLOAD.DTCM.START = 0x02fe0000; + SDK_AUTOLOAD.DTCM.END = SDK_AUTOLOAD.DTCM.START; + SDK_AUTOLOAD.DTCM.BSS_END = SDK_AUTOLOAD.DTCM.START; + SDK_AUTOLOAD.DTCM.SIZE = 0; + SDK_AUTOLOAD.DTCM.BSS_SIZE = 0; + SDK_AUTOLOAD_START = SDK_STATIC_END; + SDK_AUTOLOAD_SIZE = 0; + SDK_AUTOLOAD_NUMBER = ; + + + .: + { + ALIGNALL(4); + . = ALIGN(32); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_AUTOLOAD__ID =; + SDK_AUTOLOAD..ID =; + SDK_AUTOLOAD..START =.; + SDK_AUTOLOAD..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + + + + + + + #:::::::::: text/rodata + SDK_AUTOLOAD..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE BLOCK + # + . = ALIGN(32); + SDK_AUTOLOAD..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + + + + + + + + + + + + + #:::::::::: data + SDK_AUTOLOAD..DATA_END =.; + . = ALIGN(32); + SDK_AUTOLOAD..END =.; + + SDK_AUTOLOAD..TEXT_SIZE = SDK_AUTOLOAD..TEXT_END - SDK_AUTOLOAD..TEXT_START; + SDK_AUTOLOAD..DATA_SIZE = SDK_AUTOLOAD..DATA_END - SDK_AUTOLOAD..DATA_START; + SDK_AUTOLOAD..SIZE = SDK_AUTOLOAD..END - SDK_AUTOLOAD..START; + SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD..SIZE; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(32); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL + + + # + # BSS BLOCK + # + SDK_AUTOLOAD..BSS_START = .; + #:::::::::: bss + + + + + + + + + + + + + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(32); + SDK_AUTOLOAD..BSS_END = .; + + SDK_AUTOLOAD..BSS_SIZE = SDK_AUTOLOAD..BSS_END - SDK_AUTOLOAD..BSS_START; + + } >> + + + + SDK_AUTOLOAD_ITCM_START = SDK_AUTOLOAD.ITCM.START; + SDK_AUTOLOAD_ITCM_END = SDK_AUTOLOAD.ITCM.END; + SDK_AUTOLOAD_ITCM_BSS_END = SDK_AUTOLOAD.ITCM.BSS_END; + SDK_AUTOLOAD_ITCM_SIZE = SDK_AUTOLOAD.ITCM.SIZE; + SDK_AUTOLOAD_ITCM_BSS_SIZE = SDK_AUTOLOAD.ITCM.BSS_SIZE; + SDK_AUTOLOAD_DTCM_START = SDK_AUTOLOAD.DTCM.START; + SDK_AUTOLOAD_DTCM_END = SDK_AUTOLOAD.DTCM.END; + SDK_AUTOLOAD_DTCM_BSS_END = SDK_AUTOLOAD.DTCM.BSS_END; + SDK_AUTOLOAD_DTCM_SIZE = SDK_AUTOLOAD.DTCM.SIZE; + SDK_AUTOLOAD_DTCM_BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_SIZE; + + ############################ AUTOLOAD_INFO ########################## + .binary.AUTOLOAD_INFO: + { + SDK_AUTOLOAD_LIST = .; + + WRITEW ADDR(.); + WRITEW SDK_AUTOLOAD..SIZE; + WRITEW SDK_AUTOLOAD..BSS_SIZE; + + SDK_AUTOLOAD_LIST_END = .; + } >> #> binary.AUTOLOAD_INFO + +# SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; +# SDK_AUTOLOAD_LIST_END = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); + SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); + +# ############################ STATIC_FOOTER ########################## +# .binary.STATIC_FOOTER: +# { +# WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE +# WRITEW _start_ModuleParams - ADDR(.); +# WRITEW 0; # NO DIGEST +# } > binary.STATIC_FOOTER + + ############################ OVERLAYS ############################### + SDK_OVERLAY_NUMBER = ; + + + .: + { + ALIGNALL(4); + . = ALIGN(32); # Fit to cache line + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_OVERLAY__ID =; ### SEGMENT OVERLAY ID + SDK_OVERLAY..ID =; + SDK_OVERLAY..START =.; + SDK_OVERLAY..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_OVERLAY..SINIT_START =.; + #:::::::::: ctor + + + + + + + + + + + + + WRITEW 0; + #:::::::::: ctor + SDK_OVERLAY..SINIT_END =.; + #:::::::::: text/rodata + SDK_OVERLAY..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(32); + SDK_OVERLAY..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + #:::::::::: data + SDK_OVERLAY..DATA_END =.; + . = ALIGN(32); + SDK_OVERLAY..END =.; + + SDK_OVERLAY..TEXT_SIZE = SDK_OVERLAY..TEXT_END - SDK_OVERLAY..TEXT_START; + SDK_OVERLAY..DATA_SIZE = SDK_OVERLAY..DATA_END - SDK_OVERLAY..DATA_START; + SDK_OVERLAY..SIZE = SDK_OVERLAY..END - SDK_OVERLAY..START; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(32); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_OVERLAY..BSS_START = .; + #:::::::::: bss + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(32); + SDK_OVERLAY..BSS_END = .; + + SDK_OVERLAY..BSS_SIZE = SDK_OVERLAY..BSS_END - SDK_OVERLAY..BSS_START; + + } >> + + + + ############################ OVERLAYDEFS ############################ + .F: + { + ### module information + WRITEW ADDR(.); # load address + WRITEW _start; # entry address + WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # size of module + WRITEW _start_AutoloadDoneCallback; # callback autoload done + + ### overlay filename + + WRITES (""); # Overlay + + + } > F + + ############################ OVERLAYTABLE ########################### + .F: + { + + WRITEW ; # overlay ID + WRITEW ADDR(.); # load address + WRITEW SDK_OVERLAY..SIZE; # size of module + WRITEW SDK_OVERLAY..BSS_SIZE; # size of bss + WRITEW SDK_OVERLAY..SINIT_START; # start address of static init + WRITEW SDK_OVERLAY..SINIT_END; # end address of static init + WRITEW ; # ROM file ID + WRITEW 0; # Reserved + + + } > F + + ############################ ARENA ################################## + .dummy.MAIN_EX.NITRO: + { + . = ALIGN(32); + + } > dummy.MAIN_EX.NITRO + + .arena.MAIN.NITRO: + { + . = ALIGN(32); + SDK_SECTION_ARENA_START =.; + + } > arena.MAIN.NITRO + + .arena.MAIN_EX.NITRO: + { + . = ALIGN(32); + SDK_SECTION_ARENA_EX_START =.; + + } > arena.MAIN_EX.NITRO + + .arena.ITCM: + { + . = ALIGN(32); + SDK_SECTION_ARENA_ITCM_START =.; + + } > arena.ITCM + + .arena.DTCM: + { + . = ALIGN(32); + SDK_SECTION_ARENA_DTCM_START =.; + + } > arena.DTCM + + ############################ OTHERS ################################# + SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START; + SDK_IRQ_STACKSIZE = ; # allocated in DTCM + SDK_SYS_STACKSIZE = ; # when 0 means all remains of DTCM + SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1; + + .check.ITCM: + { + . = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE; + + . = . + SDK_OVERLAY..SIZE + SDK_OVERLAY..BSS_SIZE; + + + } > check.ITCM + + .check.DTCM: + { + . = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE; + + . = . + SDK_OVERLAY..SIZE + SDK_OVERLAY..BSS_SIZE; + + . = . + 0x080 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN; + } > check.DTCM + + ########################### LTDAUTOLOADS ############################ + SDK_LTDAUTOLOAD.LTDMAIN.START = SDK_STATIC_BSS_END; + SDK_LTDAUTOLOAD.LTDMAIN.END = SDK_LTDAUTOLOAD.LTDMAIN.START; + SDK_LTDAUTOLOAD.LTDMAIN.BSS_EDN = SDK_LTDAUTOLOAD.LTDMAIN.START; + SDK_LTDAUTOLOAD.LTDMAIN.SIZE = 0; + SDK_LTDAUTOLOAD.LTDMAIN.BSS_SIZE = 0; + SDK_LTDAUTOLOAD_TOP_START = 0x02400000; + SDK_LTDAUTOLOAD_TOP_SIZE = 4; # STATIC 領域が無い代わりに 4 bytes のダミーがバイナリファイルの先頭に入る # + SDK_LTDAUTOLOAD_START = SDK_LTDAUTOLOAD_TOP_START + SDK_LTDAUTOLOAD_TOP_SIZE; + SDK_LTDAUTOLOAD_SIZE = 0; + SDK_LTDAUTOLOAD_NUMBER = ; + + .binary.LTDAUTOLOAD_TOP: + { + WRITEW 0; + + } >> #> binary.LTDAUTOLOAD_TOP + + + .: + { + ALIGNALL(4); + . = ALIGN(32); # Fit to cache line + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + SDK_LTDAUTOLOAD__ID =; + SDK_LTDAUTOLOAD..ID =; + SDK_LTDAUTOLOAD..START =.; + # + # TEXT BLOCK: READ ONLY + # + SDK_LTDAUTOLOAD..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + #:::::::::: text/rodata + SDK_LTDAUTOLOAD..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(32); + SDK_LTDAUTOLOAD..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + + + + + + + #:::::::::: data + SDK_LTDAUTOLOAD..DATA_END =.; + . = ALIGN(32); + SDK_LTDAUTOLOAD..END =.; + + SDK_LTDAUTOLOAD..TEXT_SIZE = SDK_LTDAUTOLOAD..TEXT_END - SDK_LTDAUTOLOAD..TEXT_START; + SDK_LTDAUTOLOAD..DATA_SIZE = SDK_LTDAUTOLOAD..DATA_END - SDK_LTDAUTOLOAD..DATA_START; + SDK_LTDAUTOLOAD..SIZE = SDK_LTDAUTOLOAD..END - SDK_LTDAUTOLOAD..START; + SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD..SIZE; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(32); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_LTDAUTOLOAD..BSS_START =.; + #:::::::::: bss + + + + + + + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(32); + SDK_LTDAUTOLOAD..BSS_END =.; + + SDK_LTDAUTOLOAD..BSS_SIZE = SDK_LTDAUTOLOAD..BSS_END - SDK_LTDAUTOLOAD..BSS_START; + + } >> + + + + SDK_LTDAUTOLOAD_LTDMAIN_START = SDK_LTDAUTOLOAD.LTDMAIN.START; + SDK_LTDAUTOLOAD_LTDMAIN_END = SDK_LTDAUTOLOAD.LTDMAIN.END; + SDK_LTDAUTOLOAD_LTDMAIN_BSS_END = SDK_LTDAUTOLOAD.LTDMAIN.BSS_END; + SDK_LTDAUTOLOAD_LTDMAIN_SIZE = SDK_LTDAUTOLOAD.LTDMAIN.SIZE; + SDK_LTDAUTOLOAD_LTDMAIN_BSS_SIZE = SDK_LTDAUTOLOAD.LTDMAIN.BSS_SIZE; + + ######################### LTDAUTOLOAD_INFO ########################## + .binary.LTDAUTOLOAD_INFO: + { + SDK_LTDAUTOLOAD_LIST = .; + + WRITEW ADDR(.); + WRITEW SDK_LTDAUTOLOAD..SIZE; + WRITEW SDK_LTDAUTOLOAD..BSS_SIZE; + + SDK_LTDAUTOLOAD_LIST_END = .; + } >> #> binary.LTDAUTOLOAD_INFO + +# SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE; +# SDK_LTDAUTOLOAD_LIST_END = SDK_LTDAUTOLOAD_LIST + SIZEOF(.binary.LTDAUTOLOAD_INFO); + SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SIZEOF(.binary.LTDAUTOLOAD_INFO); + + ########################### LTDOVERLAYS ############################# + SDK_LTDOVERLAY_NUMBER = ; + + + .: + { + ALIGNALL(4); + . = ALIGN(32); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + SDK_LTDOVERLAY__ID =; + SDK_LTDOVERLAY..ID =; + SDK_LTDOVERLAY..START =.; + # + # TEXT BLOCK: READ ONLY + # + SDK_LTDOVERLAY..TEXT_START =.; + #:::::::::: text/rodata + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_LTDOVERLAY..SINIT_START =.; + #:::::::::: ctor + + + + + + + + + + + + + WRITEW 0; + #:::::::::: ctor + SDK_LTDOVERLAY..SINIT_END =.; + #:::::::::: text/rodata + SDK_LTDOVERLAY..TEXT_END =.; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(32); + SDK_LTDOVERLAY..DATA_START =.; + #:::::::::: data + + + + + + + + + + + + + #:::::::::: data + SDK_LTDOVERLAY..DATA_END =.; + . = ALIGN(32); + SDK_LTDOVERLAY..END =.; + + SDK_LTDOVERLAY..TEXT_SIZE = SDK_LTDOVERLAY..TEXT_END - SDK_LTDOVERLAY..TEXT_START; + SDK_LTDOVERLAY..DATA_SIZE = SDK_LTDOVERLAY..DATA_END - SDK_LTDOVERLAY..DATA_START; + SDK_LTDOVERLAY..SIZE = SDK_LTDOVERLAY..END - SDK_LTDOVERLAY..START; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(32); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_LTDOVERLAY..BSS_START =.; + #:::::::::: bss + + + + + + + + + + + + + #:::::::::: bss + . = ALIGN(32); + SDK_LTDOVERLAY..BSS_END =.; + + SDK_LTDOVERLAY..BSS_SIZE = SDK_LTDOVERLAY..BSS_END - SDK_LTDOVERLAY..BSS_START; + + } >> + + + + ########################## LTDOVERLAYDEFS ########################### + .L: + { + ### TWL limited extended static module information + WRITEW SDK_LTDAUTOLOAD_TOP_START; # load address + WRITEW 0; # padding + WRITEW SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD_TOP_SIZE; # size of module + WRITEW 0; # padding + + ### TWL limited overlay filename + + WRITES (""); + + + } > L + + ######################### LTDOVERLAYTABLE ########################### + .L: + { + + WRITES # overlay ID + WRITEW ADDR(.); # load address + WRITEW SDK_LTDOVERLAY..SIZE; # size of module + WRITEW SDK_LTDOVERLAY..BSS_SIZE; # size of bss + WRITEW SDK_LTDOVERLAY..SINIT_START; # start address of static init + WRITEW SDK_LTDOVERLAY..SINIT_END; # end address of static init + WRITEW # ROM file ID + WRITEW 0; # Reserved + + + } > L + + ############################ ARENA ################################## + .dummy.MAIN_EX.TWL: + { + . = ALIGN(32); + + } > dummy.MAIN_EX.TWL + + .arena.MAIN.TWL: + { + . = ALIGN(32); + SDK_LTDMAIN_ARENA_LO =.; + + } > arena.MAIN.TWL + + .arena.MAIN_EX.TWL: + { + . = ALIGN(32); + SDK_LTDMAIN_EX_ARENA_LO =.; + + } > arena.MAIN_EX.TWL + + ############################ OTHERS ################################# + # Module filelist + .binary.MODULE_FILES: + { +# WRITES (""); + WRITES (""); + WRITES (""); + WRITES (""); + WRITES (""); + WRITES (""); + WRITES (""); + + } > binary.MODULE_FILES + +}