1#---------------------------------------------------------------------------
2#  Project:  NitroSDK - tools - makelcf
3#  File:     ARM9-TS.lcf.template
4#
5#  Copyright 2003-2008 Nintendo. All rights reserved.
6#
7#  These coded instructions, statements, and computer programs contain
8#  proprietary information of Nintendo of America Inc. and/or Nintendo
9#  Company Ltd., and are protected by Federal copyright law. They may
10#  not be disclosed to third parties or copied or duplicated in any form,
11#  in whole or in part, without the prior written consent of Nintendo.
12#
13#  $Log: ARM9-TS.lcf.template,v $
14#  Revision 1.39  2007/04/12 00:11:41  yasu
15#  Updated copyright year
16#
17#  Revision 1.38  2007/04/10 14:05:45  yasu
18#  Support for multiple uses of SEARCH_SYMBOL
19#
20#  Revision 1.37  2006/07/20 07:29:12  kitase_hirotake
21#  Added the description explaining the version section
22#
23#  Revision 1.36  2006/07/18 11:11:01  yasu
24#  There is an error in the way check.xTCM gets the OVERLAY region size in the TCM region overflow check. Because it is not currently clear how to accurately calculate this, the addition of the OVERLAY region was cut out.
25#
26#
27#
28#  Revision 1.35  2006/05/10 03:19:47  yasu
29#  Added support for the CodeWarrior 2.x overlay expansion
30#
31#  Revision 1.34  2006/04/06 09:02:36  kitase_hirotake
32#  Support for .itcm.bss and .dtcm.bss
33#
34#  Revision 1.33  2006/03/30 23:59:22  yasu
35#  Updated copyright year
36#
37#  Revision 1.32  2006/03/29 13:14:22  yasu
38#  Support for overlays in CWVER 2.x
39#
40#  Revision 1.31  2005/11/24 01:16:47  yada
41#  Changed start address of mainEX arena from 0x2400000 to 0x23e0000
42#
43#  Revision 1.30  2005/09/02 04:14:22  yasu
44#  Old symbols were redefined so they can be used even under SDK2.2
45#
46#  Revision 1.29  2005/08/31 09:34:57  yasu
47#  Corrected a problem where code would not function normally when using section names such as section_BSS
48#
49#  Revision 1.28  2005/08/26 11:22:16  yasu
50#  Overlay support for ITCM/DTCM
51#
52#  Revision 1.27  2005/06/20 12:29:20  yasu
53#  Changed Surffix to Suffix
54#
55#  Revision 1.26  2005/06/14 09:03:42  yada
56#  Fix specific to negative value of SDK_STACKSIZE
57#
58#  Revision 1.25  2005/04/13 12:51:00  terui
59#  Changed SDK_AUTOLOAD.DTCM.START 0x027c0000 to 0x027e0000
60#
61#  Revision 1.24  2005/03/30 00:02:14  yosizaki
62#  Fixed copyright header.
63#
64#  Revision 1.23  2005/03/25 12:54:59  yasu
65#  Added the .version section
66#
67#  Revision 1.22  2004/10/03 02:00:56  yasu
68#  Output component file list for compstatic tool
69#
70#  Revision 1.21  2004/09/27 05:28:21  yasu
71#  Added support for .sinit
72#
73#  Revision 1.20  2004/09/09 11:49:20  yasu
74#  Added support for compstatic in default
75#
76#  Revision 1.19  2004/09/06 06:40:00  yasu
77#  Added labels for digest
78#
79#  Revision 1.18  2004/08/20 06:19:59  yasu
80#  DTCM moves to 0x027c0000 at default
81#
82#  Revision 1.17  2004/08/02 10:38:53  yasu
83#  Added autoload-done callback address in overlaydefs
84#
85#  Revision 1.16  2004/07/26 02:22:32  yasu
86#  Changed DTCM address to 0x023c0000
87#
88#  Revision 1.15  2004/07/26 00:08:27  yasu
89#  Fixed label of exception table
90#
91#  Revision 1.14  2004/07/24 05:42:25  yasu
92#  Set default values for SDK_AUTOGEN_xTCM_START
93#
94#  Revision 1.13  2004/07/23 11:32:14  yasu
95#  Defined labels for __exception_table_start__ and _end__
96#
97#  Revision 1.12  2004/07/12 12:21:08  yasu
98#  Checked size of ITCM/DTCM
99#
100#  Revision 1.11  2004/07/10 04:10:26  yasu
101#  Added support for command 'Library'
102#
103#  Revision 1.10  2004/07/02 08:13:02  yasu
104#  Added support for OBJECT( )
105#
106#  Revision 1.9	 2004/07/01 12:54:38  yasu
107#  Added support for ITCM/DTCM/WRAM autoload
108#
109#  Revision 1.8	 2004/07/01 10:41:46  yasu
110#  Added support for autoload
111#
112#  Revision 1.7	 2004/06/02 07:35:37  yasu
113#  Set libsyscall.a in FORCE_ACTIVE
114#  Put NitroMain at the top of ROM image
115#
116#  Revision 1.6	 2004/06/02 04:56:28  yasu
117#  Revised to match the new ROM map of TS
118#
119#  Revision 1.5	 2004/06/01 06:12:00  miya
120#  Added padding at top of ROM image.
121#
122#  Revision 1.4	 2004/04/26 12:16:48  yasu
123#  Added KEEP_SECTIONS
124#
125#  Revision 1.3	 2004/04/20 07:41:32  yasu
126#  Set STATICINIT instead of .ctor temporarily
127#
128#  Revision 1.2	 2004/04/14 07:16:42  yasu
129#  Added ALIGN(32) for convenience to handle cache line
130#
131#  Revision 1.1	 2004/04/06 01:59:54  yasu
132#  Newly added
133#
134#  $NoKeywords: $
135#---------------------------------------------------------------------------
136MEMORY
137{
138	main		(RWX) : ORIGIN = 0x02004000,   LENGTH = 0x0 >  main.sbin
139	binary.AUTOLOAD_INFO		(RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin
140	binary.STATIC_FOOTER		(RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin
141
142	main_defs	(RW)  : ORIGIN = AFTER(main), LENGTH = 0x0 > main_defs.sbin
143	main_table	(RW)  : ORIGIN = AFTER(main), LENGTH = 0x0 > main_table.sbin
144	dummy.MAIN_EX		(RW)  : ORIGIN = 0x023e0000, LENGTH = 0x0
145	arena.MAIN			(RW)  : ORIGIN = AFTER(main), LENGTH = 0x0
146	arena.MAIN_EX		(RW)  : ORIGIN = AFTER(dummy.MAIN_EX), LENGTH = 0x0
147	arena.ITCM		(RW)  : ORIGIN = AFTER(ITCM), LENGTH = 0x0
148	arena.DTCM		(RW)  : ORIGIN = AFTER(DTCM), LENGTH = 0x0
149	binary.MODULE_FILES		(RW)  : ORIGIN = 0x0, LENGTH = 0x0     > component.files
150	check.ITCM			(RWX) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check
151	check.DTCM			(RW)  : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check
152}
153
154FORCE_ACTIVE
155{
156	SVC_SoftReset
157}
158
159KEEP_SECTION
160{
161	.sinit
162}
163
164SECTIONS
165{
166	############################ STATIC #################################
167	.main:
168	{
169	ALIGNALL(4);			. = ALIGN(32);	# Fit to cache line
170
171	#
172	#  TEXT BLOCK: READ ONLY
173	#
174	SDK_STATIC_START		=.;
175	SDK_STATIC_TEXT_START		=.;
176					#:::::::::: text/rodata
177					libsyscall.a (.text)
178					crt0.o (.text)
179					crt0.o (.rodata)
180					#
181					# Added .version section.
182					# The information included in this section will be needed for Lotcheck purposes. Be sure to leave it in this position.
183					#
184					#
185					* (.version)
186					OBJECT(NitroMain,*)
187					* (.text)
188					. = ALIGN(4);
189					* (.exception)
190					. = ALIGN(4);
191	SDK_STATIC_ETABLE_START		=.;
192					EXCEPTION
193	SDK_STATIC_ETABLE_END		=.;
194					. = ALIGN(4);
195					* (.init)
196					. = ALIGN(4);
197					* (.rodata)
198					. = ALIGN(4);
199
200	SDK_STATIC_SINIT_START		=.;
201					#:::::::::: ctor
202					* (.ctor)
203					* (.sinit)
204					WRITEW	0;
205					#:::::::::: ctor
206	SDK_STATIC_SINIT_END		=.;
207
208					#:::::::::: text/rodata
209					. = ALIGN(32);
210	SDK_STATIC_TEXT_END		=.;
211
212	#
213	#  DATA BLOCK: READ WRITE
214	#
215	SDK_STATIC_DATA_START		=.;
216					#:::::::::: Data
217					* (.sdata)
218					. = ALIGN(4);
219					* (.data)
220					. = ALIGN(4);
221	SDK_OVERLAY_DIGEST		=.;
222					# NO DIGEST
223	SDK_OVERLAY_DIGEST_END		=.;
224					#:::::::::: Data
225					. = ALIGN(32);
226	SDK_STATIC_DATA_END		=.;
227	SDK_STATIC_END			=.;
228
229	SDK_STATIC_TEXT_SIZE		= SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START;
230	SDK_STATIC_DATA_SIZE		= SDK_STATIC_DATA_END - SDK_STATIC_DATA_START;
231	SDK_STATIC_SIZE			= SDK_STATIC_END      - SDK_STATIC_START;
232	__sinit__			= SDK_STATIC_SINIT_START;	# For static initializer
233	__exception_table_start__	= SDK_STATIC_ETABLE_START;	# For exception table
234	__exception_table_end__		= SDK_STATIC_ETABLE_END;	# For exception table
235	} > main
236
237	.main.bss:
238	{
239	ALIGNALL(4);			. = ALIGN(32);
240
241	#
242	#  BSS BLOCK
243	#
244	SDK_STATIC_BSS_START		=.;
245					#:::::::::: bss
246					* (.sbss)
247					. = ALIGN(4);
248					* (.bss)
249					. = ALIGN(4);
250					#:::::::::: bss
251					. = ALIGN(32);
252	SDK_STATIC_BSS_END		= .;
253	SDK_STATIC_BSS_SIZE		= SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
254
255	} >> main
256
257
258	############################ AUTOLOADS ##############################
259	SDK_AUTOLOAD.ITCM.START			= 0x01ff8000;
260	SDK_AUTOLOAD.ITCM.END			= SDK_AUTOLOAD.ITCM.START;
261	SDK_AUTOLOAD.ITCM.BSS_END		= SDK_AUTOLOAD.ITCM.START;
262	SDK_AUTOLOAD.ITCM.SIZE			= 0;
263	SDK_AUTOLOAD.ITCM.BSS_SIZE		= 0;
264	SDK_AUTOLOAD.DTCM.START			= 0x027e0000;
265	SDK_AUTOLOAD.DTCM.END			= SDK_AUTOLOAD.DTCM.START;
266	SDK_AUTOLOAD.DTCM.BSS_END		= SDK_AUTOLOAD.DTCM.START;
267	SDK_AUTOLOAD.DTCM.SIZE			= 0;
268	SDK_AUTOLOAD.DTCM.BSS_SIZE		= 0;
269	SDK_AUTOLOAD_START			= SDK_STATIC_END;
270	SDK_AUTOLOAD_SIZE			= 0;
271	SDK_AUTOLOAD_NUMBER			= 0;
272
273
274	SDK_AUTOLOAD_ITCM_START			= SDK_AUTOLOAD.ITCM.START;
275	SDK_AUTOLOAD_ITCM_END			= SDK_AUTOLOAD.ITCM.END;
276	SDK_AUTOLOAD_ITCM_BSS_END		= SDK_AUTOLOAD.ITCM.BSS_END;
277	SDK_AUTOLOAD_ITCM_SIZE			= SDK_AUTOLOAD.ITCM.SIZE;
278	SDK_AUTOLOAD_ITCM_BSS_SIZE		= SDK_AUTOLOAD.ITCM.BSS_SIZE;
279	SDK_AUTOLOAD_DTCM_START			= SDK_AUTOLOAD.DTCM.START;
280	SDK_AUTOLOAD_DTCM_END			= SDK_AUTOLOAD.DTCM.END;
281	SDK_AUTOLOAD_DTCM_BSS_END		= SDK_AUTOLOAD.DTCM.BSS_END;
282	SDK_AUTOLOAD_DTCM_SIZE			= SDK_AUTOLOAD.DTCM.SIZE;
283	SDK_AUTOLOAD_DTCM_BSS_SIZE		= SDK_AUTOLOAD.DTCM.BSS_SIZE;
284
285	############################ AUTOLOAD_INFO ##########################
286	.binary.AUTOLOAD_INFO:
287	{
288	} > binary.AUTOLOAD_INFO
289
290	SDK_AUTOLOAD_LIST			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE;
291	SDK_AUTOLOAD_LIST_END			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO);
292	SDK_AUTOLOAD_SIZE			= SDK_AUTOLOAD_SIZE  + SIZEOF(.binary.AUTOLOAD_INFO);
293
294	############################ STATIC_FOOTER ##########################
295	.binary.STATIC_FOOTER:
296	{
297		WRITEW 0xdec00621;		# LE(0x2106C0DE) = NITRO CODE
298		WRITEW _start_ModuleParams - ADDR(.main);
299		WRITEW 0;			# NO DIGEST
300	} > binary.STATIC_FOOTER
301
302	############################ OVERLAYS ###############################
303	SDK_OVERLAY_NUMBER			= 0;
304
305
306	############################ MAIN EX ##################################
307	# MAIN EX Area
308	.dummy.MAIN_EX:
309	{
310		. = ALIGN(32);
311	} > dummy.MAIN_EX
312
313	############################ ARENA ##################################
314	.arena.MAIN:
315	{
316						. = ALIGN(32);
317		SDK_SECTION_ARENA_START		=.;
318	} > arena.MAIN
319
320	.arena.MAIN_EX:
321	{
322						. = ALIGN(32);
323		SDK_SECTION_ARENA_EX_START	=.;
324	} > arena.MAIN_EX
325
326	.arena.ITCM:
327	{
328						. = ALIGN(32);
329		SDK_SECTION_ARENA_ITCM_START	=.;
330	} > arena.ITCM
331
332	.arena.DTCM:
333	{
334						. = ALIGN(32);
335		SDK_SECTION_ARENA_DTCM_START	=.;
336	} > arena.DTCM
337
338	############################ OVERLAYDEFS ############################
339	.main_defs:
340	{
341		###  main module information
342		WRITEW ADDR(.main);			# Load address
343		WRITEW _start;					# Entry address
344		WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE;	# Size of module
345		WRITEW _start_AutoloadDoneCallback;		# Callback autoload done
346
347		###  overlay filename
348
349	} > main_defs
350
351
352	############################ OVERLAYTABLE ###########################
353	.main_table:
354	{
355
356	} > main_table
357
358
359	############################ OTHERS #################################
360	SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START;
361	SDK_IRQ_STACKSIZE = 2048;	# Allocated in DTCM
362	SDK_SYS_STACKSIZE = 0;		# When 0 means all remains of DTCM
363
364	# Module filelist
365	.binary.MODULE_FILES:
366	{
367		WRITES ("main.sbin");
368		WRITES ("main_defs.sbin");
369		WRITES ("main_table.sbin");
370	} > binary.MODULE_FILES
371
372	# ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM
373	.check.ITCM:
374	{
375		. = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE;
376	} > check.ITCM
377
378	SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1;
379	.check.DTCM:
380	{
381		. = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE;
382		. = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
383	} > check.DTCM
384
385}
386