mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
デバッガでは動作しましたが、NANDに書いても動かない状態です。
TwlSDK/include/nitro/pxi/common/regname.h のした4行のバグを修正しないと動きません。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@26 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
451c6d9242
commit
3a9b3c9023
@ -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
|
||||
|
||||
@ -24,6 +24,8 @@
|
||||
#include <twl/aes/ARM7/lo.h>
|
||||
#include <rtfs.h>
|
||||
|
||||
#include <twl/os/ARM7/debugLED.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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); //
|
||||
|
||||
272
build/libraries/mi/ARM9/mi_loader.c
Normal file
272
build/libraries/mi/ARM9/mi_loader.c
Normal file
@ -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 <twl.h>
|
||||
#include <firm.h>
|
||||
#include <firm/format/format_rom.h>
|
||||
|
||||
#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 );
|
||||
}
|
||||
@ -23,7 +23,8 @@
|
||||
#include <twl/aes/ARM7/lo.h>
|
||||
#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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -16,59 +16,124 @@
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <firm.h>
|
||||
#include <firm/fatfs.h>
|
||||
#include <twl/fatfs.h>
|
||||
#include <twl/os/ARM7/debugLED.h>
|
||||
|
||||
//#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();
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -17,20 +17,41 @@
|
||||
#include <firm.h>
|
||||
#include <firm/mi.h>
|
||||
|
||||
//#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();
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
|
||||
FIRM_TARGET = FIRM
|
||||
|
||||
TWL_KEYSDIR = $(FIRM_ROOT)/keys/bootrom
|
||||
|
||||
include $(TWLFIRM_ROOT)/build/buildtools/commondefs
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 )
|
||||
),
|
||||
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
|
||||
#include <twl/types.h>
|
||||
#include <twl/aes/ARM7/lo.h>
|
||||
#include <twl/fatfs.h>
|
||||
|
||||
#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" */
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -16,12 +16,12 @@
|
||||
#---------------------------------------------------------------------------
|
||||
MEMORY
|
||||
{
|
||||
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
|
||||
<FOREACH.AUTOLOADS>
|
||||
<AUTOLOAD.NAME> (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
<AUTOLOAD.NAME> (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
<END.AUTOLOADS>
|
||||
binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
|
||||
<PROPERTY.OVERLAYDEFS>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>
|
||||
<PROPERTY.OVERLAYTABLE>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYTABLE><PROPERTY.FLXSUFFIX>
|
||||
@ -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 > <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
<END.LTDAUTOLOADS>
|
||||
binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
|
||||
<PROPERTY.LTDOVERLAYDEFS>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>
|
||||
<PROPERTY.LTDOVERLAYTABLE>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYTABLE><PROPERTY.LTDSUFFIX>
|
||||
@ -343,7 +343,6 @@ SECTIONS
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.AUTOLOADS>
|
||||
|
||||
} > binary.AUTOLOAD_INFO
|
||||
|
||||
SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE;
|
||||
@ -711,7 +710,6 @@ SECTIONS
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.LTDAUTOLOADS>
|
||||
|
||||
} > 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
|
||||
|
||||
}
|
||||
|
||||
899
include/firm/specfiles/ARM7-TS-PARTNER.lcf.template
Normal file
899
include/firm/specfiles/ARM7-TS-PARTNER.lcf.template
Normal file
@ -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
|
||||
{
|
||||
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 #> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
|
||||
<FOREACH.AUTOLOADS>
|
||||
<AUTOLOAD.NAME> (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 #>> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
<END.AUTOLOADS>
|
||||
# binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
|
||||
<PROPERTY.OVERLAYDEFS>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>
|
||||
<PROPERTY.OVERLAYTABLE>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYTABLE><PROPERTY.FLXSUFFIX>
|
||||
<FOREACH.OVERLAYS>
|
||||
<OVERLAY.NAME> (RWXO): ORIGIN = <OVERLAY.ADDRESS>, LENGTH = 0x0 > <OVERLAY.NAME><PROPERTY.FLXSUFFIX>
|
||||
<END.OVERLAYS>
|
||||
|
||||
arena.MAIN (RW) : ORIGIN = AFTER(<STATIC.NAME><FOREACH.OVERLAYS>,<OVERLAY.NAME><END.OVERLAYS>), 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 > <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 #>> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
<END.LTDAUTOLOADS>
|
||||
# binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
|
||||
<PROPERTY.LTDOVERLAYDEFS>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>
|
||||
<PROPERTY.LTDOVERLAYTABLE>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYTABLE><PROPERTY.LTDSUFFIX>
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
<LTDOVERLAY.NAME> (RWXO): ORIGIN = <LTDOVERLAY.ADDRESS>, LENGTH = 0x0 > <LTDOVERLAY.NAME><PROPERTY.LTDSUFFIX>
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
check.LTDWRAM (RWX) : ORIGIN = 0x03000000, LENGTH = 0x40000 > ltdwram.check
|
||||
check.LTDMAIN (RWX) : ORIGIN = 0x02f88000, LENGTH = 0x58000 > ltdmain.check
|
||||
}
|
||||
|
||||
KEEP_SECTION
|
||||
{
|
||||
.sinit
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
############################ STATIC #################################
|
||||
.<STATIC.NAME>:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.STATIC.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
|
||||
<END.STATIC.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_STATIC_START =.;
|
||||
SDK_STATIC_TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
OBJECT(_start,*)
|
||||
<FOREACH.STATIC.OBJECTS=.text>
|
||||
<STATIC.OBJECT=.text:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.text>
|
||||
<STATIC.LIBRARY=.text:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.rodata>
|
||||
<STATIC.OBJECT=.rodata:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.rodata>
|
||||
<STATIC.LIBRARY=.rodata:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.init>
|
||||
<STATIC.OBJECT=.init:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.init>
|
||||
<STATIC.LIBRARY=.init:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
. = ALIGN(4);
|
||||
SDK_STATIC_SINIT_START =.;
|
||||
#:::::::::: ctor
|
||||
<FOREACH.STATIC.OBJECTS=.ctor>
|
||||
<STATIC.OBJECT=.ctor:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.ctor>
|
||||
<STATIC.LIBRARY=.ctor:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.sinit>
|
||||
<STATIC.OBJECT=.sinit:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.sinit>
|
||||
<STATIC.LIBRARY=.sinit:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
WRITEW 0;
|
||||
#:::::::::: ctor
|
||||
SDK_STATIC_SINIT_END =.;
|
||||
#:::::::::: text/rodata
|
||||
SDK_STATIC_TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE
|
||||
#
|
||||
. = ALIGN(4);
|
||||
SDK_STATIC_DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.STATIC.OBJECTS=.sdata>
|
||||
<STATIC.OBJECT=.sdata:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.sdata>
|
||||
<STATIC.LIBRARY=.sdata:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.data>
|
||||
<STATIC.OBJECT=.data:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.data>
|
||||
<STATIC.LIBRARY=.data:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
#:::::::::: 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
|
||||
|
||||
} > <STATIC.NAME>
|
||||
|
||||
.<STATIC.NAME>.bss:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.STATIC.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
|
||||
<END.STATIC.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_STATIC_BSS_START =.;
|
||||
#:::::::::: bss
|
||||
<FOREACH.STATIC.OBJECTS=.sbss>
|
||||
<STATIC.OBJECT=.sbss:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.sbss>
|
||||
<STATIC.LIBRARY=.sbss:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.bss>
|
||||
<STATIC.OBJECT=.bss:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.bss>
|
||||
<STATIC.LIBRARY=.bss:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(4);
|
||||
SDK_STATIC_BSS_END = .;
|
||||
|
||||
SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
|
||||
|
||||
} >> <STATIC.NAME>
|
||||
|
||||
|
||||
############################ 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 = <NUMBER.AUTOLOADS>;
|
||||
|
||||
<FOREACH.AUTOLOADS>
|
||||
.<AUTOLOAD.NAME>:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.AUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <AUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.AUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_AUTOLOAD_<AUTOLOAD.NAME>_ID =<AUTOLOAD.ID>;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.ID =<AUTOLOAD.ID>;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.START =.;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.text>
|
||||
<AUTOLOAD.OBJECT=.text:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.text>
|
||||
<AUTOLOAD.LIBRARY=.text:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.etable>
|
||||
<AUTOLOAD.OBJECT=.exception:t>
|
||||
. = ALIGN(4);
|
||||
SDK_STATIC_ETABLE_START =.;
|
||||
__exception_table_start__ =.;
|
||||
EXCEPTION
|
||||
__exception_table_end__ =.;
|
||||
SDK_STATIC_ETABLE_END =.;
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.rodata>
|
||||
<AUTOLOAD.OBJECT=.rodata:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.rodata>
|
||||
<AUTOLOAD.LIBRARY=.rodata:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
#:::::::::: text/rodata
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE BLOCK
|
||||
#
|
||||
. = ALIGN(4);
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.wram>
|
||||
<AUTOLOAD.OBJECT=.wram:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.wram>
|
||||
<AUTOLOAD.LIBRARY=.wram:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.sdata>
|
||||
<AUTOLOAD.OBJECT=.sdata:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.sdata>
|
||||
<AUTOLOAD.LIBRARY=.sdata:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.data>
|
||||
<AUTOLOAD.OBJECT=.data:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.data>
|
||||
<AUTOLOAD.LIBRARY=.data:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_END =.;
|
||||
. = ALIGN(4);
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.END =.;
|
||||
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_START;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_START;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.START;
|
||||
SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
|
||||
|
||||
} > <AUTOLOAD.NAME>
|
||||
|
||||
.<AUTOLOAD.NAME>.bss:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.AUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <AUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.AUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_START = .;
|
||||
#:::::::::: bss
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.wram>
|
||||
<AUTOLOAD.OBJECT=.wram.bss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.wram>
|
||||
<AUTOLOAD.LIBRARY=.wram.bss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.sbss>
|
||||
<AUTOLOAD.OBJECT=.sbss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.sbss>
|
||||
<AUTOLOAD.LIBRARY=.sbss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.bss>
|
||||
<AUTOLOAD.OBJECT=.bss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.bss>
|
||||
<AUTOLOAD.LIBRARY=.bss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(4);
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_END = .;
|
||||
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_START;
|
||||
|
||||
} >> <AUTOLOAD.NAME>
|
||||
|
||||
<END.AUTOLOADS>
|
||||
|
||||
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 = .;
|
||||
<FOREACH.AUTOLOADS>
|
||||
WRITEW ADDR(.<AUTOLOAD.NAME>);
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.AUTOLOADS>
|
||||
SDK_AUTOLOAD_LIST_END = .;
|
||||
} >> <STATIC.NAME> #> 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 = <NUMBER.OVERLAYS>;
|
||||
|
||||
<FOREACH.OVERLAYS>
|
||||
.<OVERLAY.NAME>:<OVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.OVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <OVERLAY.SEARCHSYMBOL>;
|
||||
<END.OVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_OVERLAY_<OVERLAY.NAME>_ID =<OVERLAY.ID>; ### SEGMENT <OVERLAY.NAME> OVERLAY ID
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.ID =<OVERLAY.ID>;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.START =.;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.OVERLAY.OBJECTS=.text>
|
||||
<OVERLAY.OBJECT=.text:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.text>
|
||||
<OVERLAY.LIBRARY=.text:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.rodata>
|
||||
<OVERLAY.OBJECT=.rodata:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.rodata>
|
||||
<OVERLAY.LIBRARY=.rodata:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.init>
|
||||
<OVERLAY.OBJECT=.init:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.init>
|
||||
<OVERLAY.LIBRARY=.init:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
. = ALIGN(4);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.SINIT_START =.;
|
||||
#:::::::::: ctor
|
||||
<FOREACH.OVERLAY.OBJECTS=.ctor>
|
||||
<OVERLAY.OBJECT=.ctor:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.ctor>
|
||||
<OVERLAY.LIBRARY=.ctor:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.sinit>
|
||||
<OVERLAY.OBJECT=.sinit:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.sinit>
|
||||
<OVERLAY.LIBRARY=.sinit:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
WRITEW 0;
|
||||
#:::::::::: ctor
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.SINIT_END =.;
|
||||
#:::::::::: text/rodata
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE
|
||||
#
|
||||
. = ALIGN(4);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.OVERLAY.OBJECTS=.sdata>
|
||||
<OVERLAY.OBJECT=.sdata:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.sdata>
|
||||
<OVERLAY.LIBRARY=.sdata:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.data>
|
||||
<OVERLAY.OBJECT=.data:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.data>
|
||||
<OVERLAY.LIBRARY=.data:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.DATA_END =.;
|
||||
. = ALIGN(4);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.END =.;
|
||||
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.TEXT_SIZE = SDK_OVERLAY.<OVERLAY.NAME>.TEXT_END - SDK_OVERLAY.<OVERLAY.NAME>.TEXT_START;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.DATA_SIZE = SDK_OVERLAY.<OVERLAY.NAME>.DATA_END - SDK_OVERLAY.<OVERLAY.NAME>.DATA_START;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.SIZE = SDK_OVERLAY.<OVERLAY.NAME>.END - SDK_OVERLAY.<OVERLAY.NAME>.START;
|
||||
|
||||
} > <OVERLAY.NAME>
|
||||
|
||||
.<OVERLAY.NAME>.bss:<OVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.OVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <OVERLAY.SEARCHSYMBOL>;
|
||||
<END.OVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.BSS_START = .;
|
||||
#:::::::::: bss
|
||||
<FOREACH.OVERLAY.OBJECTS=.bss>
|
||||
<OVERLAY.OBJECT=.bss:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.bss>
|
||||
<OVERLAY.LIBRARY=.bss:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.sbss>
|
||||
<OVERLAY.OBJECT=.sbss:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.sbss>
|
||||
<OVERLAY.LIBRARY=.sbss:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(4);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.BSS_END = .;
|
||||
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE = SDK_OVERLAY.<OVERLAY.NAME>.BSS_END - SDK_OVERLAY.<OVERLAY.NAME>.BSS_START;
|
||||
|
||||
} >> <OVERLAY.NAME>
|
||||
|
||||
<END.OVERLAYS>
|
||||
|
||||
############################ ARENA ##################################
|
||||
.arena.MAIN:
|
||||
{
|
||||
. = ALIGN(4);
|
||||
SDK_SECTION_ARENA_START =.;
|
||||
|
||||
} > arena.MAIN
|
||||
|
||||
############################ OVERLAYDEFS ############################
|
||||
.<PROPERTY.OVERLAYDEFS>F:
|
||||
{
|
||||
### <STATIC.NAME> module information
|
||||
WRITEW ADDR(.<STATIC.NAME>); # load address
|
||||
WRITEW _start; # entry address
|
||||
WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # size of module
|
||||
WRITEW _start_AutoloadDoneCallback; # callback autoload done
|
||||
|
||||
### overlay filename
|
||||
<FOREACH.OVERLAYS>
|
||||
WRITES ("<OVERLAY.NAME><PROPERTY.FLXSUFFIX>"); # Overlay <OVERLAY.ID>
|
||||
<END.OVERLAYS>
|
||||
|
||||
} > <PROPERTY.OVERLAYDEFS>F
|
||||
|
||||
############################ OVERLAYTABLE ###########################
|
||||
.<PROPERTY.OVERLAYTABLE>F:
|
||||
{
|
||||
<FOREACH.OVERLAYS>
|
||||
WRITEW <OVERLAY.ID>; # overlay ID
|
||||
WRITEW ADDR(.<OVERLAY.NAME>); # load address
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SIZE; # size of module
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE; # size of bss
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SINIT_START; # start address of static init
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SINIT_END; # end address of static init
|
||||
WRITEW <OVERLAY.ID>; # ROM file ID
|
||||
WRITEW 0; # Reserved
|
||||
<END.OVERLAYS>
|
||||
|
||||
} > <PROPERTY.OVERLAYTABLE>F
|
||||
|
||||
############################ OTHERS #################################
|
||||
SDK_WRAM_ARENA_LO = SDK_AUTOLOAD.WRAM.BSS_END;
|
||||
SDK_SUBPRIV_ARENA_LO = SDK_AUTOLOAD.MAIN.BSS_END;
|
||||
SDK_IRQ_STACKSIZE = <STATIC.IRQSTACKSIZE>; # allocated in WRAM
|
||||
SDK_SYS_STACKSIZE = <STATIC.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 = <NUMBER.LTDAUTOLOADS>;
|
||||
|
||||
.binary.LTDAUTOLOAD_TOP:
|
||||
{
|
||||
WRITEW 0xdeadbeef;
|
||||
|
||||
} >> <STATIC.NAME> #> binary.LTDAUTOLOAD_TOP
|
||||
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
.<LTDAUTOLOAD.NAME>:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDAUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
SDK_LTDAUTOLOAD_<LTDAUTOLOAD.NAME>_ID =<LTDAUTOLOAD.ID>;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.ID =<LTDAUTOLOAD.ID>;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.START =.;
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.text>
|
||||
<LTDAUTOLOAD.OBJECT=.text:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.text>
|
||||
<LTDAUTOLOAD.LIBRARY=.text:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.rodata>
|
||||
<LTDAUTOLOAD.OBJECT=.rodata:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.rodata>
|
||||
<LTDAUTOLOAD.LIBRARY=.rodata:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
#:::::::::: text/rodata
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE BLOCK
|
||||
#
|
||||
. = ALIGN(4);
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.sdata>
|
||||
<LTDAUTOLOAD.OBJECT=.sdata:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sdata>
|
||||
<LTDAUTOLOAD.LIBRARY=.sdata:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.data>
|
||||
<LTDAUTOLOAD.OBJECT=.data:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.data>
|
||||
<LTDAUTOLOAD.LIBRARY=.data:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdwram>
|
||||
<LTDAUTOLOAD.OBJECT=.ltdwram:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdwram>
|
||||
<LTDAUTOLOAD.LIBRARY=.ltdwram:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdmain>
|
||||
<LTDAUTOLOAD.OBJECT=.ltdmain:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdmain>
|
||||
<LTDAUTOLOAD.LIBRARY=.ltdmain:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_END =.;
|
||||
. = ALIGN(4);
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.END =.;
|
||||
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_START;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_START;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.START;
|
||||
SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
|
||||
|
||||
} > <LTDAUTOLOAD.NAME>
|
||||
|
||||
.<LTDAUTOLOAD.NAME>.bss:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDAUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_START =.;
|
||||
#:::::::::: bss
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.sbss>
|
||||
<LTDAUTOLOAD.OBJECT=.sbss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sbss>
|
||||
<LTDAUTOLOAD.LIBRARY=.sbss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.bss>
|
||||
<LTDAUTOLOAD.OBJECT=.bss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.bss>
|
||||
<LTDAUTOLOAD.LIBRARY=.bss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdwram>
|
||||
<LTDAUTOLOAD.OBJECT=.ltdwram.bss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdwram>
|
||||
<LTDAUTOLOAD.LIBRARY=.ltdwram.bss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdmain>
|
||||
<LTDAUTOLOAD.OBJECT=.ltdmain.bss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdmain>
|
||||
<LTDAUTOLOAD.LIBRARY=.ltdmain.bss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(4);
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_END =.;
|
||||
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_START;
|
||||
|
||||
} >> <LTDAUTOLOAD.NAME>
|
||||
|
||||
<END.LTDAUTOLOADS>
|
||||
|
||||
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 = .;
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
WRITEW ADDR(.<LTDAUTOLOAD.NAME>);
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.LTDAUTOLOADS>
|
||||
SDK_LTDAUTOLOAD_LIST_END = .;
|
||||
} >> <STATIC.NAME> #> 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 = <NUMBER.LTDOVERLAYS>;
|
||||
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
.<LTDOVERLAY.NAME>:<LTDOVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDOVERLAY.SEARCHSYMBOL>;
|
||||
<END.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
SDK_LTDOVERLAY_<LTDOVERLAY.NAME>_ID =<LTDOVERLAY.ID>;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.ID =<LTDOVERLAY.ID>;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.START =.;
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.text>
|
||||
<LTDOVERLAY.OBJECT=.text:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.text>
|
||||
<LTDOVERLAY.LIBRARY=.text:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.rodata>
|
||||
<LTDOVERLAY.OBJECT=.rodata:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.rodata>
|
||||
<LTDOVERLAY.LIBRARY=.rodata:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.init>
|
||||
<LTDOVERLAY.OBJECT=.init:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.init>
|
||||
<LTDOVERLAY.LIBRARY=.init:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
. = ALIGN(4);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_START =.;
|
||||
#:::::::::: ctor
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.ctor>
|
||||
<LTDOVERLAY.OBJECT=.ctor:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.ctor>
|
||||
<LTDOVERLAY.LIBRARY=.ctor:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.sinit>
|
||||
<LTDOVERLAY.OBJECT=.sinit:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.sinit>
|
||||
<LTDOVERLAY.LIBRARY=.sinit:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
WRITEW 0;
|
||||
#:::::::::: ctor
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_END =.;
|
||||
#:::::::::: text/rodata
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE
|
||||
#
|
||||
. = ALIGN(4);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.sdata>
|
||||
<LTDOVERLAY.OBJECT=.sdata:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.sdata>
|
||||
<LTDOVERLAY.LIBRARY=.sdata:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.data>
|
||||
<LTDOVERLAY.OBJECT=.data:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.data>
|
||||
<LTDOVERLAY.LIBRARY=.data:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_END =.;
|
||||
. = ALIGN(4);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.END =.;
|
||||
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_START;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_START;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.START;
|
||||
|
||||
} > <LTDOVERLAY.NAME>
|
||||
|
||||
.<LTDOVERLAY.NAME>.bss:<LTDOVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(4);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDOVERLAY.SEARCHSYMBOL>;
|
||||
<END.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_START =.;
|
||||
#:::::::::: bss
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.bss>
|
||||
<LTDOVERLAY.OBJECT=.bss:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.bss>
|
||||
<LTDOVERLAY.LIBRARY=.bss:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.sbss>
|
||||
<LTDOVERLAY.OBJECT=.sbss:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.sbss>
|
||||
<LTDOVERLAY.LIBRARY=.sbss:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(4);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_END =.;
|
||||
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_START;
|
||||
|
||||
} >> <LTDOVERLAY.NAME>
|
||||
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
########################## LTDOVERLAYDEFS ###########################
|
||||
.<PROPERTY.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
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
WRITES ("<LTDOVERLAY.NAME><PROPERTY.LTDSUFFIX>");
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
} > <PROPERTY.LTDOVERLAYDEFS>L
|
||||
|
||||
######################### LTDOVERLAYTABLE ###########################
|
||||
.<PROPERTY.LTDOVERLAYTABLE>L:
|
||||
{
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
WRITES <LTDOVERLAY.ID> # overlay ID
|
||||
WRITEW ADDR(.<LTDOVERLAY.NAME>); # load address
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SIZE; # size of module
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_SIZE; # size of bss
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_START; # start address of static init
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_END; # end address of static init
|
||||
WRITEW <LTDOVERLAY.ID> # ROM file ID
|
||||
WRITEW 0; # Reserved
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
} > <PROPERTY.LTDOVERLAYTABLE>L
|
||||
|
||||
############################ OTHERS #################################
|
||||
.check.LTDWRAM:
|
||||
{
|
||||
. = SDK_LTDAUTOLOAD.LTDWRAM.BSS_END;
|
||||
|
||||
} > check.LTDWRAM
|
||||
|
||||
.check.LTDMAIN:
|
||||
{
|
||||
# . = SDK_LTDAUTOLOAD.LTDMAIN.BSS_END;
|
||||
|
||||
} > check.LTDMAIN
|
||||
|
||||
}
|
||||
@ -16,13 +16,13 @@
|
||||
#---------------------------------------------------------------------------
|
||||
MEMORY
|
||||
{
|
||||
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
|
||||
<FOREACH.AUTOLOADS>
|
||||
<AUTOLOAD.NAME> (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
<AUTOLOAD.NAME> (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
<END.AUTOLOADS>
|
||||
binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
# binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
|
||||
<PROPERTY.OVERLAYDEFS>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>
|
||||
<PROPERTY.OVERLAYTABLE>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYTABLE><PROPERTY.FLXSUFFIX>
|
||||
@ -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 > <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
<END.LTDAUTOLOADS>
|
||||
binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
|
||||
|
||||
<PROPERTY.LTDOVERLAYDEFS>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>
|
||||
<PROPERTY.LTDOVERLAYTABLE>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYTABLE><PROPERTY.LTDSUFFIX>
|
||||
@ -387,7 +387,6 @@ SECTIONS
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.AUTOLOADS>
|
||||
|
||||
} > binary.AUTOLOAD_INFO
|
||||
|
||||
SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE;
|
||||
@ -773,7 +772,6 @@ SECTIONS
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.LTDAUTOLOADS>
|
||||
|
||||
} > binary.LTDAUTOLOAD_INFO
|
||||
|
||||
SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE;
|
||||
@ -968,10 +966,10 @@ SECTIONS
|
||||
# Module filelist
|
||||
.binary.MODULE_FILES:
|
||||
{
|
||||
WRITES ("<STATIC.NAME><PROPERTY.FLXSUFFIX>");
|
||||
WRITES ("<STATIC.NAME><PROPERTY.SUFFIX>");
|
||||
WRITES ("<PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>");
|
||||
WRITES ("<PROPERTY.OVERLAYTABLE><PROPERTY.FLXSUFFIX>");
|
||||
WRITES ("<STATIC.NAME><PROPERTY.LTDSUFFIX>");
|
||||
WRITES ("<STATIC.NAME><PROPERTY.SUFFIX>");
|
||||
WRITES ("<PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>");
|
||||
WRITES ("<PROPERTY.LTDOVERLAYTABLE><PROPERTY.LTDSUFFIX>");
|
||||
|
||||
|
||||
983
include/firm/specfiles/ARM9-TS-PARTNER.lcf.template
Normal file
983
include/firm/specfiles/ARM9-TS-PARTNER.lcf.template
Normal file
@ -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
|
||||
{
|
||||
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 #> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
|
||||
<FOREACH.AUTOLOADS>
|
||||
<AUTOLOAD.NAME> (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 #>> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
<END.AUTOLOADS>
|
||||
# binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
# binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
|
||||
|
||||
<PROPERTY.OVERLAYDEFS>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>
|
||||
<PROPERTY.OVERLAYTABLE>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYTABLE><PROPERTY.FLXSUFFIX>
|
||||
<FOREACH.OVERLAYS>
|
||||
<OVERLAY.NAME> (RWXO): ORIGIN = <OVERLAY.ADDRESS>, LENGTH = 0x0 > <OVERLAY.NAME><PROPERTY.FLXSUFFIX>
|
||||
<END.OVERLAYS>
|
||||
|
||||
dummy.MAIN_EX.NITRO (RW) : ORIGIN = 0x023e0000, LENGTH = 0x0
|
||||
arena.MAIN.NITRO (RW) : ORIGIN = AFTER(<STATIC.NAME><FOREACH.OVERLAYS=MAIN>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
|
||||
arena.MAIN_EX.NITRO (RW) : ORIGIN = AFTER(dummy.MAIN_EX.NITRO<FOREACH.OVERLAYS=MAINEX>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
|
||||
arena.ITCM (RW) : ORIGIN = AFTER(ITCM<FOREACH.OVERLAYS=ITCM>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
|
||||
arena.DTCM (RW) : ORIGIN = AFTER(DTCM<FOREACH.OVERLAYS=DTCM>,<OVERLAY.NAME><END.OVERLAYS>), 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 > <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 #>> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
<END.LTDAUTOLOADS>
|
||||
# binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
|
||||
|
||||
<PROPERTY.LTDOVERLAYDEFS>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>
|
||||
<PROPERTY.LTDOVERLAYTABLE>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYTABLE><PROPERTY.LTDSUFFIX>
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
<LTDOVERLAY.NAME> (RWXO): ORIGIN = <LTDOVERLAY.ADDRESS>, LENGTH = 0x0 > <LTDOVERLAY.NAME><PROPERTY.LTDSUFFIX>
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
dummy.MAIN_EX.TWL (RW) : ORIGIN = 0x0d000000, LENGTH = 0x0
|
||||
arena.MAIN.TWL (RW) : ORIGIN = AFTER(<STATIC.NAME><FOREACH.OVERLAYS=MAIN>,<OVERLAY.NAME><END.OVERLAYS>,LTDMAIN<FOREACH.LTDOVERLAYS=MAIN>,<LTDOVERLAY.NAME><END.LTDOVERLAYS>), LENGTH = 0x0
|
||||
arena.MAIN_EX.TWL (RW) : ORIGIN = AFTER(dummy.MAIN_EX.TWL,<STATIC.NAME><FOREACH.OVERLAYS=MAIN>,<OVERLAY.NAME><END.OVERLAYS>,LTDMAIN<FOREACH.LTDOVERLAYS=MAIN>,<LTDOVERLAY.NAME><END.LTDOVERLAYS>), LENGTH = 0x0
|
||||
|
||||
binary.MODULE_FILES (RW) : ORIGIN = 0, LENGTH = 0x0 > component.files
|
||||
}
|
||||
|
||||
FORCE_ACTIVE
|
||||
{
|
||||
SVC_SoftReset
|
||||
}
|
||||
|
||||
KEEP_SECTION
|
||||
{
|
||||
.sinit
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
############################ STATIC #################################
|
||||
.<STATIC.NAME>:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32); # Fit to cache line
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.STATIC.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
|
||||
<END.STATIC.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# 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,*)
|
||||
<FOREACH.STATIC.OBJECTS=.text>
|
||||
<STATIC.OBJECT=.text:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.text>
|
||||
<STATIC.LIBRARY=.text:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
* (.exception)
|
||||
. = ALIGN(4);
|
||||
SDK_STATIC_ETABLE_START =.;
|
||||
__exception_table_start__ =.;
|
||||
EXCEPTION
|
||||
__exception_table_end__ =.;
|
||||
SDK_STATIC_ETABLE_END =.;
|
||||
<FOREACH.STATIC.OBJECTS=.rodata>
|
||||
<STATIC.OBJECT=.rodata:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.rodata>
|
||||
<STATIC.LIBRARY=.rodata:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.init>
|
||||
<STATIC.OBJECT=.init:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.init>
|
||||
<STATIC.LIBRARY=.init:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
. = ALIGN(4);
|
||||
SDK_STATIC_SINIT_START =.;
|
||||
#:::::::::: ctor
|
||||
<FOREACH.STATIC.OBJECTS=.ctor>
|
||||
<STATIC.OBJECT=.ctor:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.ctor>
|
||||
<STATIC.LIBRARY=.ctor:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.sinit>
|
||||
<STATIC.OBJECT=.sinit:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.sinit>
|
||||
<STATIC.LIBRARY=.sinit:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
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
|
||||
<FOREACH.STATIC.OBJECTS=.sdata>
|
||||
<STATIC.OBJECT=.sdata:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.sdata>
|
||||
<STATIC.LIBRARY=.sdata:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.data>
|
||||
<STATIC.OBJECT=.data:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.data>
|
||||
<STATIC.LIBRARY=.data:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
. = 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
|
||||
|
||||
} > <STATIC.NAME>
|
||||
|
||||
.<STATIC.NAME>.bss:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32); # Fit to cache line
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.STATIC.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
|
||||
<END.STATIC.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_STATIC_BSS_START =.;
|
||||
#:::::::::: bss
|
||||
<FOREACH.STATIC.OBJECTS=.sbss>
|
||||
<STATIC.OBJECT=.sbss:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.sbss>
|
||||
<STATIC.LIBRARY=.sbss:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
<FOREACH.STATIC.OBJECTS=.bss>
|
||||
<STATIC.OBJECT=.bss:t>
|
||||
<END.STATIC.OBJECTS>
|
||||
<FOREACH.STATIC.LIBRARIES=.bss>
|
||||
<STATIC.LIBRARY=.bss:t>
|
||||
<END.STATIC.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(32);
|
||||
SDK_STATIC_BSS_END = .;
|
||||
|
||||
SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
|
||||
|
||||
} >> <STATIC.NAME>
|
||||
|
||||
|
||||
############################ 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 = <NUMBER.AUTOLOADS>;
|
||||
|
||||
<FOREACH.AUTOLOADS>
|
||||
.<AUTOLOAD.NAME>:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.AUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <AUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.AUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_AUTOLOAD_<AUTOLOAD.NAME>_ID =<AUTOLOAD.ID>;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.ID =<AUTOLOAD.ID>;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.START =.;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.text>
|
||||
<AUTOLOAD.OBJECT=.text:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.text>
|
||||
<AUTOLOAD.LIBRARY=.text:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.rodata>
|
||||
<AUTOLOAD.OBJECT=.rodata:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.rodata>
|
||||
<AUTOLOAD.LIBRARY=.rodata:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.init>
|
||||
<AUTOLOAD.OBJECT=.init:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.init>
|
||||
<AUTOLOAD.LIBRARY=.init:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
#:::::::::: text/rodata
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE BLOCK
|
||||
#
|
||||
. = ALIGN(32);
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.itcm>
|
||||
<AUTOLOAD.OBJECT=.itcm:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.itcm>
|
||||
<AUTOLOAD.LIBRARY=.itcm:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.dtcm>
|
||||
<AUTOLOAD.OBJECT=.dtcm:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.dtcm>
|
||||
<AUTOLOAD.LIBRARY=.dtcm:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.sdata>
|
||||
<AUTOLOAD.OBJECT=.sdata:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.sdata>
|
||||
<AUTOLOAD.LIBRARY=.sdata:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.data>
|
||||
<AUTOLOAD.OBJECT=.data:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.data>
|
||||
<AUTOLOAD.LIBRARY=.data:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_END =.;
|
||||
. = ALIGN(32);
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.END =.;
|
||||
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_START;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_START;
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.START;
|
||||
SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
|
||||
|
||||
} > <AUTOLOAD.NAME>
|
||||
|
||||
.<AUTOLOAD.NAME>.bss:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.AUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <AUTOLOAD.SEARCHSYMBOL>
|
||||
<END.AUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_START = .;
|
||||
#:::::::::: bss
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.itcm>
|
||||
<AUTOLOAD.OBJECT=.itcm.bss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.itcm>
|
||||
<AUTOLOAD.LIBRARY=.itcm.bss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.dtcm>
|
||||
<AUTOLOAD.OBJECT=.dtcm.bss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.dtcm>
|
||||
<AUTOLOAD.LIBRARY=.dtcm.bss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.sbss>
|
||||
<AUTOLOAD.OBJECT=.sbss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.sbss>
|
||||
<AUTOLOAD.LIBRARY=.sbss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
<FOREACH.AUTOLOAD.OBJECTS=.bss>
|
||||
<AUTOLOAD.OBJECT=.bss:t>
|
||||
<END.AUTOLOAD.OBJECTS>
|
||||
<FOREACH.AUTOLOAD.LIBRARIES=.bss>
|
||||
<AUTOLOAD.LIBRARY=.bss:t>
|
||||
<END.AUTOLOAD.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(32);
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_END = .;
|
||||
|
||||
SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE = SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_START;
|
||||
|
||||
} >> <AUTOLOAD.NAME>
|
||||
|
||||
<END.AUTOLOADS>
|
||||
|
||||
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 = .;
|
||||
<FOREACH.AUTOLOADS>
|
||||
WRITEW ADDR(.<AUTOLOAD.NAME>);
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.AUTOLOADS>
|
||||
SDK_AUTOLOAD_LIST_END = .;
|
||||
} >> <STATIC.NAME> #> 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(.<STATIC.NAME>);
|
||||
# WRITEW 0; # NO DIGEST
|
||||
# } > binary.STATIC_FOOTER
|
||||
|
||||
############################ OVERLAYS ###############################
|
||||
SDK_OVERLAY_NUMBER = <NUMBER.OVERLAYS>;
|
||||
|
||||
<FOREACH.OVERLAYS>
|
||||
.<OVERLAY.NAME>:<OVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32); # Fit to cache line
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.OVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <OVERLAY.SEARCHSYMBOL>;
|
||||
<END.OVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_OVERLAY_<OVERLAY.NAME>_ID =<OVERLAY.ID>; ### SEGMENT <OVERLAY.NAME> OVERLAY ID
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.ID =<OVERLAY.ID>;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.START =.;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.OVERLAY.OBJECTS=.text>
|
||||
<OVERLAY.OBJECT=.text:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.text>
|
||||
<OVERLAY.LIBRARY=.text:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.rodata>
|
||||
<OVERLAY.OBJECT=.rodata:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.rodata>
|
||||
<OVERLAY.LIBRARY=.rodata:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.init>
|
||||
<OVERLAY.OBJECT=.init:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.init>
|
||||
<OVERLAY.LIBRARY=.init:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
. = ALIGN(4);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.SINIT_START =.;
|
||||
#:::::::::: ctor
|
||||
<FOREACH.OVERLAY.OBJECTS=.ctor>
|
||||
<OVERLAY.OBJECT=.ctor:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.ctor>
|
||||
<OVERLAY.LIBRARY=.ctor:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.sinit>
|
||||
<OVERLAY.OBJECT=.sinit:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.sinit>
|
||||
<OVERLAY.LIBRARY=.sinit:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
WRITEW 0;
|
||||
#:::::::::: ctor
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.SINIT_END =.;
|
||||
#:::::::::: text/rodata
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE
|
||||
#
|
||||
. = ALIGN(32);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.OVERLAY.OBJECTS=.sdata>
|
||||
<OVERLAY.OBJECT=.sdata:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.sdata>
|
||||
<OVERLAY.LIBRARY=.sdata:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.data>
|
||||
<OVERLAY.OBJECT=.data:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.data>
|
||||
<OVERLAY.LIBRARY=.data:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.DATA_END =.;
|
||||
. = ALIGN(32);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.END =.;
|
||||
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.TEXT_SIZE = SDK_OVERLAY.<OVERLAY.NAME>.TEXT_END - SDK_OVERLAY.<OVERLAY.NAME>.TEXT_START;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.DATA_SIZE = SDK_OVERLAY.<OVERLAY.NAME>.DATA_END - SDK_OVERLAY.<OVERLAY.NAME>.DATA_START;
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.SIZE = SDK_OVERLAY.<OVERLAY.NAME>.END - SDK_OVERLAY.<OVERLAY.NAME>.START;
|
||||
|
||||
} > <OVERLAY.NAME>
|
||||
|
||||
.<OVERLAY.NAME>.bss:<OVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.OVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <OVERLAY.SEARCHSYMBOL>;
|
||||
<END.OVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.BSS_START = .;
|
||||
#:::::::::: bss
|
||||
<FOREACH.OVERLAY.OBJECTS=.bss>
|
||||
<OVERLAY.OBJECT=.bss:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.bss>
|
||||
<OVERLAY.LIBRARY=.bss:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
<FOREACH.OVERLAY.OBJECTS=.sbss>
|
||||
<OVERLAY.OBJECT=.sbss:t>
|
||||
<END.OVERLAY.OBJECTS>
|
||||
<FOREACH.OVERLAY.LIBRARIES=.sbss>
|
||||
<OVERLAY.LIBRARY=.sbss:t>
|
||||
<END.OVERLAY.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(32);
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.BSS_END = .;
|
||||
|
||||
SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE = SDK_OVERLAY.<OVERLAY.NAME>.BSS_END - SDK_OVERLAY.<OVERLAY.NAME>.BSS_START;
|
||||
|
||||
} >> <OVERLAY.NAME>
|
||||
|
||||
<END.OVERLAYS>
|
||||
|
||||
############################ OVERLAYDEFS ############################
|
||||
.<PROPERTY.OVERLAYDEFS>F:
|
||||
{
|
||||
### <STATIC.NAME> module information
|
||||
WRITEW ADDR(.<STATIC.NAME>); # load address
|
||||
WRITEW _start; # entry address
|
||||
WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # size of module
|
||||
WRITEW _start_AutoloadDoneCallback; # callback autoload done
|
||||
|
||||
### overlay filename
|
||||
<FOREACH.OVERLAYS>
|
||||
WRITES ("<OVERLAY.NAME><PROPERTY.FLXSUFFIX>"); # Overlay <OVERLAY.ID>
|
||||
<END.OVERLAYS>
|
||||
|
||||
} > <PROPERTY.OVERLAYDEFS>F
|
||||
|
||||
############################ OVERLAYTABLE ###########################
|
||||
.<PROPERTY.OVERLAYTABLE>F:
|
||||
{
|
||||
<FOREACH.OVERLAYS>
|
||||
WRITEW <OVERLAY.ID>; # overlay ID
|
||||
WRITEW ADDR(.<OVERLAY.NAME>); # load address
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SIZE; # size of module
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE; # size of bss
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SINIT_START; # start address of static init
|
||||
WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SINIT_END; # end address of static init
|
||||
WRITEW <OVERLAY.ID>; # ROM file ID
|
||||
WRITEW 0; # Reserved
|
||||
<END.OVERLAYS>
|
||||
|
||||
} > <PROPERTY.OVERLAYTABLE>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 = <STATIC.IRQSTACKSIZE>; # allocated in DTCM
|
||||
SDK_SYS_STACKSIZE = <STATIC.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;
|
||||
<FOREACH.OVERLAYS=ITCM>
|
||||
. = . + SDK_OVERLAY.<OVERLAY.NAME>.SIZE + SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE;
|
||||
<END.OVERLAYS>
|
||||
|
||||
} > check.ITCM
|
||||
|
||||
.check.DTCM:
|
||||
{
|
||||
. = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE;
|
||||
<FOREACH.OVERLAYS=DTCM>
|
||||
. = . + SDK_OVERLAY.<OVERLAY.NAME>.SIZE + SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE;
|
||||
<END.OVERLAYS>
|
||||
. = . + 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 = <NUMBER.LTDAUTOLOADS>;
|
||||
|
||||
.binary.LTDAUTOLOAD_TOP:
|
||||
{
|
||||
WRITEW 0;
|
||||
|
||||
} >> <STATIC.NAME> #> binary.LTDAUTOLOAD_TOP
|
||||
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
.<LTDAUTOLOAD.NAME>:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32); # Fit to cache line
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDAUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
SDK_LTDAUTOLOAD_<LTDAUTOLOAD.NAME>_ID =<LTDAUTOLOAD.ID>;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.ID =<LTDAUTOLOAD.ID>;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.START =.;
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.text>
|
||||
<LTDAUTOLOAD.OBJECT=.text:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.text>
|
||||
<LTDAUTOLOAD.LIBRARY=.text:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.rodata>
|
||||
<LTDAUTOLOAD.OBJECT=.rodata:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.rodata>
|
||||
<LTDAUTOLOAD.LIBRARY=.rodata:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
#:::::::::: text/rodata
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE
|
||||
#
|
||||
. = ALIGN(32);
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdmain>
|
||||
<LTDAUTOLOAD.OBJECT=.ltdmain:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdmain>
|
||||
<LTDAUTOLOAD.LIBRARY=.ltdmain:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.sdata>
|
||||
<LTDAUTOLOAD.OBJECT=.sdata:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sdata>
|
||||
<LTDAUTOLOAD.LIBRARY=.sdata:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.data>
|
||||
<LTDAUTOLOAD.OBJECT=.data:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.data>
|
||||
<LTDAUTOLOAD.LIBRARY=.data:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_END =.;
|
||||
. = ALIGN(32);
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.END =.;
|
||||
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.TEXT_START;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.DATA_START;
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.START;
|
||||
SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
|
||||
|
||||
} > <LTDAUTOLOAD.NAME>
|
||||
|
||||
.<LTDAUTOLOAD.NAME>.bss:
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDAUTOLOAD.SEARCHSYMBOL>;
|
||||
<END.LTDAUTOLOAD.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_START =.;
|
||||
#:::::::::: bss
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdmain>
|
||||
<LTDAUTOLOAD.OBJECT=.ltdmain.bss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdmain>
|
||||
<LTDAUTOLOAD.LIBRARY=.ltdmain.bss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.sbss>
|
||||
<LTDAUTOLOAD.OBJECT=.sbss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sbss>
|
||||
<LTDAUTOLOAD.LIBRARY=.sbss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
<FOREACH.LTDAUTOLOAD.OBJECTS=.bss>
|
||||
<LTDAUTOLOAD.OBJECT=.bss:t>
|
||||
<END.LTDAUTOLOAD.OBJECTS>
|
||||
<FOREACH.LTDAUTOLOAD.LIBRARIES=.bss>
|
||||
<LTDAUTOLOAD.LIBRARY=.bss:t>
|
||||
<END.LTDAUTOLOAD.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(32);
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_END =.;
|
||||
|
||||
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_START;
|
||||
|
||||
} >> <LTDAUTOLOAD.NAME>
|
||||
|
||||
<END.LTDAUTOLOADS>
|
||||
|
||||
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 = .;
|
||||
<FOREACH.LTDAUTOLOADS>
|
||||
WRITEW ADDR(.<LTDAUTOLOAD.NAME>);
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
|
||||
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE;
|
||||
<END.LTDAUTOLOADS>
|
||||
SDK_LTDAUTOLOAD_LIST_END = .;
|
||||
} >> <STATIC.NAME> #> 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 = <NUMBER.LTDOVERLAYS>;
|
||||
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
.<LTDOVERLAY.NAME>:<LTDOVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDOVERLAY.SEARCHSYMBOL>;
|
||||
<END.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
SDK_LTDOVERLAY_<LTDOVERLAY.NAME>_ID =<LTDOVERLAY.ID>;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.ID =<LTDOVERLAY.ID>;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.START =.;
|
||||
#
|
||||
# TEXT BLOCK: READ ONLY
|
||||
#
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_START =.;
|
||||
#:::::::::: text/rodata
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.text>
|
||||
<LTDOVERLAY.OBJECT=.text:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.text>
|
||||
<LTDOVERLAY.LIBRARY=.text:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.rodata>
|
||||
<LTDOVERLAY.OBJECT=.rodata:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.rodata>
|
||||
<LTDOVERLAY.LIBRARY=.rodata:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.init>
|
||||
<LTDOVERLAY.OBJECT=.init:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.init>
|
||||
<LTDOVERLAY.LIBRARY=.init:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
. = ALIGN(4);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_START =.;
|
||||
#:::::::::: ctor
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.ctor>
|
||||
<LTDOVERLAY.OBJECT=.ctor:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.ctor>
|
||||
<LTDOVERLAY.LIBRARY=.ctor:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.sinit>
|
||||
<LTDOVERLAY.OBJECT=.sinit:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.sinit>
|
||||
<LTDOVERLAY.LIBRARY=.sinit:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
WRITEW 0;
|
||||
#:::::::::: ctor
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_END =.;
|
||||
#:::::::::: text/rodata
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_END =.;
|
||||
|
||||
#
|
||||
# DATA BLOCK: READ WRITE
|
||||
#
|
||||
. = ALIGN(32);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_START =.;
|
||||
#:::::::::: data
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.sdata>
|
||||
<LTDOVERLAY.OBJECT=.sdata:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.sdata>
|
||||
<LTDOVERLAY.LIBRARY=.sdata:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.data>
|
||||
<LTDOVERLAY.OBJECT=.data:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.data>
|
||||
<LTDOVERLAY.LIBRARY=.data:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
#:::::::::: data
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_END =.;
|
||||
. = ALIGN(32);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.END =.;
|
||||
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.TEXT_START;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.DATA_START;
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.START;
|
||||
|
||||
} > <LTDOVERLAY.NAME>
|
||||
|
||||
.<LTDOVERLAY.NAME>.bss:<LTDOVERLAY.NAME>
|
||||
{
|
||||
ALIGNALL(4);
|
||||
. = ALIGN(32);
|
||||
|
||||
#
|
||||
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
|
||||
#
|
||||
<FOREACH.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
SEARCH_SYMBOL <LTDOVERLAY.SEARCHSYMBOL>;
|
||||
<END.LTDOVERLAY.SEARCHSYMBOLS>
|
||||
|
||||
#
|
||||
# BSS BLOCK
|
||||
#
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_START =.;
|
||||
#:::::::::: bss
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.bss>
|
||||
<LTDOVERLAY.OBJECT=.bss:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.bss>
|
||||
<LTDOVERLAY.LIBRARY=.bss:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
<FOREACH.LTDOVERLAY.OBJECTS=.sbss>
|
||||
<LTDOVERLAY.OBJECT=.sbss:t>
|
||||
<END.LTDOVERLAY.OBJECTS>
|
||||
<FOREACH.LTDOVERLAY.LIBRARIES=.sbss>
|
||||
<LTDOVERLAY.LIBRARY=.sbss:t>
|
||||
<END.LTDOVERLAY.LIBRARIES>
|
||||
#:::::::::: bss
|
||||
. = ALIGN(32);
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_END =.;
|
||||
|
||||
SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_SIZE = SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_END - SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_START;
|
||||
|
||||
} >> <LTDOVERLAY.NAME>
|
||||
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
########################## LTDOVERLAYDEFS ###########################
|
||||
.<PROPERTY.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
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
WRITES ("<LTDOVERLAY.NAME><PROPERTY.LTDSUFFIX>");
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
} > <PROPERTY.LTDOVERLAYDEFS>L
|
||||
|
||||
######################### LTDOVERLAYTABLE ###########################
|
||||
.<PROPERTY.LTDOVERLAYTABLE>L:
|
||||
{
|
||||
<FOREACH.LTDOVERLAYS>
|
||||
WRITES <LTDOVERLAY.ID> # overlay ID
|
||||
WRITEW ADDR(.<LTDOVERLAY.NAME>); # load address
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SIZE; # size of module
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.BSS_SIZE; # size of bss
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_START; # start address of static init
|
||||
WRITEW SDK_LTDOVERLAY.<LTDOVERLAY.NAME>.SINIT_END; # end address of static init
|
||||
WRITEW <LTDOVERLAY.ID> # ROM file ID
|
||||
WRITEW 0; # Reserved
|
||||
<END.LTDOVERLAYS>
|
||||
|
||||
} > <PROPERTY.LTDOVERLAYTABLE>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 ("<STATIC.NAME><PROPERTY.FLXSUFFIX>");
|
||||
WRITES ("<STATIC.NAME><PROPERTY.SUFFIX>");
|
||||
WRITES ("<PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>");
|
||||
WRITES ("<PROPERTY.OVERLAYTABLE><PROPERTY.FLXSUFFIX>");
|
||||
WRITES ("<STATIC.NAME><PROPERTY.LTDSUFFIX>");
|
||||
WRITES ("<PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>");
|
||||
WRITES ("<PROPERTY.LTDOVERLAYTABLE><PROPERTY.LTDSUFFIX>");
|
||||
|
||||
} > binary.MODULE_FILES
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user