1#---------------------------------------------------------------------------
2#  Project:  TwlSDK - 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#  $Date:: 2008-09-18#$
14#  $Rev: 8573 $
15#  $Author: okubata_ryoma $
16#---------------------------------------------------------------------------
17MEMORY
18{
19	main		(RWX) : ORIGIN = 0x02000000,   LENGTH = 0x0 >  main.sbin
20	binary.AUTOLOAD_INFO		(RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin
21	binary.STATIC_FOOTER		(RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin
22
23	main_defs	(RW)  : ORIGIN = AFTER(main), LENGTH = 0x0 > main_defs.sbin
24	main_table	(RW)  : ORIGIN = AFTER(main), LENGTH = 0x0 > main_table.sbin
25	overlay_0		(RWXO): ORIGIN = 0x03f00000, LENGTH = 0x0 > overlay_0.sbin
26	overlay_1		(RWXO): ORIGIN = AFTER(main), LENGTH = 0x0 > overlay_1.sbin
27	overlay_2		(RWXO): ORIGIN = AFTER(overlay_1), LENGTH = 0x0 > overlay_2.sbin
28	dummy.MAIN_EX		(RW)  : ORIGIN = 0x023e0000, LENGTH = 0x0
29	arena.MAIN			(RW)  : ORIGIN = AFTER(main,overlay_1,overlay_2), LENGTH = 0x0
30	arena.MAIN_EX		(RW)  : ORIGIN = AFTER(dummy.MAIN_EX), LENGTH = 0x0
31	arena.ITCM		(RW)  : ORIGIN = AFTER(ITCM), LENGTH = 0x0
32	arena.DTCM		(RW)  : ORIGIN = AFTER(DTCM), LENGTH = 0x0
33	binary.MODULE_FILES		(RW)  : ORIGIN = 0x0, LENGTH = 0x0     > component.files
34	check.ITCM			(RWX) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check
35	check.DTCM			(RW)  : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check
36}
37
38FORCE_ACTIVE
39{
40	SVC_SoftReset
41}
42
43KEEP_SECTION
44{
45	.sinit
46}
47
48SECTIONS
49{
50	############################ STATIC #################################
51	.main:
52	{
53	ALIGNALL(4);			. = ALIGN(32);	# Fit to cache line
54
55	#
56	#  TEXT BLOCK: READ ONLY
57	#
58	SDK_STATIC_START		=.;
59	SDK_STATIC_TEXT_START		=.;
60					#:::::::::: text/rodata
61					libsyscall.a (.text)
62					crt0.o (.text)
63					crt0.o (.rodata)
64					* (.version)
65					OBJECT(NitroMain,*)
66					obj_a.o (.text)
67					obj_b.o (.text)
68					obj_c.o (.text)
69					. = ALIGN(4);
70					* (.exception)
71					. = ALIGN(4);
72	SDK_STATIC_ETABLE_START		=.;
73					EXCEPTION
74	SDK_STATIC_ETABLE_END		=.;
75					. = ALIGN(4);
76					. = ALIGN(4);
77					. = ALIGN(4);
78
79	SDK_STATIC_SINIT_START		=.;
80					#:::::::::: ctor
81					WRITEW	0;
82					#:::::::::: ctor
83	SDK_STATIC_SINIT_END		=.;
84
85					#:::::::::: text/rodata
86					. = ALIGN(32);
87	SDK_STATIC_TEXT_END		=.;
88
89	#
90	#  DATA BLOCK: READ WRITE
91	#
92	SDK_STATIC_DATA_START		=.;
93					#:::::::::: data
94					. = ALIGN(4);
95					. = ALIGN(4);
96	SDK_OVERLAY_DIGEST		=.;
97					# NO DIGEST
98	SDK_OVERLAY_DIGEST_END		=.;
99					#:::::::::: data
100					. = ALIGN(32);
101	SDK_STATIC_DATA_END		=.;
102	SDK_STATIC_END			=.;
103
104	SDK_STATIC_TEXT_SIZE		= SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START;
105	SDK_STATIC_DATA_SIZE		= SDK_STATIC_DATA_END - SDK_STATIC_DATA_START;
106	SDK_STATIC_SIZE			= SDK_STATIC_END      - SDK_STATIC_START;
107	__sinit__			= SDK_STATIC_SINIT_START;	# for static initializer
108	__exception_table_start__	= SDK_STATIC_ETABLE_START;	# for exception table
109	__exception_table_end__		= SDK_STATIC_ETABLE_END;	# for exception table
110	} > main
111
112	.main.bss:
113	{
114	ALIGNALL(4);			. = ALIGN(32);
115
116	#
117	#  BSS BLOCK
118	#
119	SDK_STATIC_BSS_START		=.;
120					#:::::::::: bss
121					. = ALIGN(4);
122					. = ALIGN(4);
123					#:::::::::: bss
124					. = ALIGN(32);
125	SDK_STATIC_BSS_END		= .;
126	SDK_STATIC_BSS_SIZE		= SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
127
128	} >> main
129
130
131	############################ AUTOLOADS ##############################
132	SDK_AUTOLOAD.ITCM.START			= 0x01ff8000;
133	SDK_AUTOLOAD.ITCM.END			= SDK_AUTOLOAD.ITCM.START;
134	SDK_AUTOLOAD.ITCM.BSS_END		= SDK_AUTOLOAD.ITCM.START;
135	SDK_AUTOLOAD.ITCM.SIZE			= 0;
136	SDK_AUTOLOAD.ITCM.BSS_SIZE		= 0;
137	SDK_AUTOLOAD.DTCM.START			= 0x027e0000;
138	SDK_AUTOLOAD.DTCM.END			= SDK_AUTOLOAD.DTCM.START;
139	SDK_AUTOLOAD.DTCM.BSS_END		= SDK_AUTOLOAD.DTCM.START;
140	SDK_AUTOLOAD.DTCM.SIZE			= 0;
141	SDK_AUTOLOAD.DTCM.BSS_SIZE		= 0;
142	SDK_AUTOLOAD_START			= SDK_STATIC_END;
143	SDK_AUTOLOAD_SIZE			= 0;
144	SDK_AUTOLOAD_NUMBER			= 0;
145
146
147	SDK_AUTOLOAD_ITCM_START			= SDK_AUTOLOAD.ITCM.START;
148	SDK_AUTOLOAD_ITCM_END			= SDK_AUTOLOAD.ITCM.END;
149	SDK_AUTOLOAD_ITCM_BSS_END		= SDK_AUTOLOAD.ITCM.BSS_END;
150	SDK_AUTOLOAD_ITCM_SIZE			= SDK_AUTOLOAD.ITCM.SIZE;
151	SDK_AUTOLOAD_ITCM_BSS_SIZE		= SDK_AUTOLOAD.ITCM.BSS_SIZE;
152	SDK_AUTOLOAD_DTCM_START			= SDK_AUTOLOAD.DTCM.START;
153	SDK_AUTOLOAD_DTCM_END			= SDK_AUTOLOAD.DTCM.END;
154	SDK_AUTOLOAD_DTCM_BSS_END		= SDK_AUTOLOAD.DTCM.BSS_END;
155	SDK_AUTOLOAD_DTCM_SIZE			= SDK_AUTOLOAD.DTCM.SIZE;
156	SDK_AUTOLOAD_DTCM_BSS_SIZE		= SDK_AUTOLOAD.DTCM.BSS_SIZE;
157
158	############################ AUTOLOAD_INFO ##########################
159	.binary.AUTOLOAD_INFO:
160	{
161	} > binary.AUTOLOAD_INFO
162
163	SDK_AUTOLOAD_LIST			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE;
164	SDK_AUTOLOAD_LIST_END			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO);
165	SDK_AUTOLOAD_SIZE			= SDK_AUTOLOAD_SIZE  + SIZEOF(.binary.AUTOLOAD_INFO);
166
167	############################ STATIC_FOOTER ##########################
168	.binary.STATIC_FOOTER:
169	{
170		WRITEW 0xdec00621;		# LE(0x2106C0DE) = NITRO CODE
171		WRITEW _start_ModuleParams - ADDR(.main);
172		WRITEW 0;			# NO DIGEST
173	} > binary.STATIC_FOOTER
174
175	############################ OVERLAYS ###############################
176	SDK_OVERLAY_NUMBER			= 3;
177
178	.overlay_0:
179	{
180	ALIGNALL(4);				. = ALIGN(32);
181
182	#
183	#   TEXT BLOCK: READ ONLY
184	#
185	SDK_OVERLAY_overlay_0_ID		=0;	### SEGMENT overlay_0 OVERLAY ID
186	SDK_OVERLAY.overlay_0.ID		=0;
187	SDK_OVERLAY.overlay_0.START	=.;
188	SDK_OVERLAY.overlay_0.TEXT_START	=.;
189						#:::::::::: text/rodata
190						aaa.o (.text)
191						bbb.o (.text)
192						. = ALIGN(4);
193						aaa.o (.rodata)
194						bbb.o (.rodata)
195						. = ALIGN(4);
196						aaa.o (.init)
197						bbb.o (.init)
198						. = ALIGN(4);
199	SDK_OVERLAY.overlay_0.SINIT_START	=.;
200						#:::::::::: ctor
201						aaa.o (.ctor)
202						bbb.o (.ctor)
203						aaa.o (.sinit)
204						bbb.o (.sinit)
205						WRITEW	0;
206						#:::::::::: ctor
207	SDK_OVERLAY.overlay_0.SINIT_END	=.;
208
209						#:::::::::: text/rodata
210						. = ALIGN(32);
211	SDK_OVERLAY.overlay_0.TEXT_END	=.;
212
213	#
214	#  DATA BLOCK: READ WRITE
215	#
216	SDK_OVERLAY.overlay_0.DATA_START	=.;
217						#:::::::::: data
218						aaa.o (.sdata)
219						bbb.o (.sdata)
220						. = ALIGN(4);
221						aaa.o (.data)
222						bbb.o (.data)
223						. = ALIGN(4);
224						#:::::::::: data
225						. = ALIGN(32);
226	SDK_OVERLAY.overlay_0.DATA_END	=.;
227	SDK_OVERLAY.overlay_0.END		=.;
228
229	SDK_OVERLAY.overlay_0.TEXT_SIZE	= SDK_OVERLAY.overlay_0.TEXT_END - SDK_OVERLAY.overlay_0.TEXT_START;
230	SDK_OVERLAY.overlay_0.DATA_SIZE	= SDK_OVERLAY.overlay_0.DATA_END - SDK_OVERLAY.overlay_0.DATA_START;
231	SDK_OVERLAY.overlay_0.SIZE		= SDK_OVERLAY.overlay_0.END      - SDK_OVERLAY.overlay_0.START;
232
233	} > overlay_0
234
235	.overlay_0.bss:
236	{
237	ALIGNALL(4);				. = ALIGN(32);
238
239	#
240	#  BSS BLOCK
241	#
242	SDK_OVERLAY.overlay_0.BSS_START	= .;
243						#:::::::::: bss
244						aaa.o (.bss)
245						bbb.o (.bss)
246						. = ALIGN(4);
247						aaa.o (.sbss)
248						bbb.o (.sbss)
249						. = ALIGN(4);
250						#:::::::::: bss
251						. = ALIGN(32);
252	SDK_OVERLAY.overlay_0.BSS_END	= .;
253
254	SDK_OVERLAY.overlay_0.BSS_SIZE	= SDK_OVERLAY.overlay_0.BSS_END - SDK_OVERLAY.overlay_0.BSS_START;
255
256	} >> overlay_0
257
258	.overlay_1:
259	{
260	ALIGNALL(4);				. = ALIGN(32);
261
262	#
263	#   TEXT BLOCK: READ ONLY
264	#
265	SDK_OVERLAY_overlay_1_ID		=1;	### SEGMENT overlay_1 OVERLAY ID
266	SDK_OVERLAY.overlay_1.ID		=1;
267	SDK_OVERLAY.overlay_1.START	=.;
268	SDK_OVERLAY.overlay_1.TEXT_START	=.;
269						#:::::::::: text/rodata
270						ccc.o (.text)
271						ddd.o (.text)
272						. = ALIGN(4);
273						ccc.o (.rodata)
274						ddd.o (.rodata)
275						. = ALIGN(4);
276						ccc.o (.init)
277						ddd.o (.init)
278						. = ALIGN(4);
279	SDK_OVERLAY.overlay_1.SINIT_START	=.;
280						#:::::::::: ctor
281						ccc.o (.ctor)
282						ddd.o (.ctor)
283						ccc.o (.sinit)
284						ddd.o (.sinit)
285						WRITEW	0;
286						#:::::::::: ctor
287	SDK_OVERLAY.overlay_1.SINIT_END	=.;
288
289						#:::::::::: text/rodata
290						. = ALIGN(32);
291	SDK_OVERLAY.overlay_1.TEXT_END	=.;
292
293	#
294	#  DATA BLOCK: READ WRITE
295	#
296	SDK_OVERLAY.overlay_1.DATA_START	=.;
297						#:::::::::: data
298						ccc.o (.sdata)
299						ddd.o (.sdata)
300						. = ALIGN(4);
301						ccc.o (.data)
302						ddd.o (.data)
303						. = ALIGN(4);
304						#:::::::::: data
305						. = ALIGN(32);
306	SDK_OVERLAY.overlay_1.DATA_END	=.;
307	SDK_OVERLAY.overlay_1.END		=.;
308
309	SDK_OVERLAY.overlay_1.TEXT_SIZE	= SDK_OVERLAY.overlay_1.TEXT_END - SDK_OVERLAY.overlay_1.TEXT_START;
310	SDK_OVERLAY.overlay_1.DATA_SIZE	= SDK_OVERLAY.overlay_1.DATA_END - SDK_OVERLAY.overlay_1.DATA_START;
311	SDK_OVERLAY.overlay_1.SIZE		= SDK_OVERLAY.overlay_1.END      - SDK_OVERLAY.overlay_1.START;
312
313	} > overlay_1
314
315	.overlay_1.bss:
316	{
317	ALIGNALL(4);				. = ALIGN(32);
318
319	#
320	#  BSS BLOCK
321	#
322	SDK_OVERLAY.overlay_1.BSS_START	= .;
323						#:::::::::: bss
324						ccc.o (.bss)
325						ddd.o (.bss)
326						. = ALIGN(4);
327						ccc.o (.sbss)
328						ddd.o (.sbss)
329						. = ALIGN(4);
330						#:::::::::: bss
331						. = ALIGN(32);
332	SDK_OVERLAY.overlay_1.BSS_END	= .;
333
334	SDK_OVERLAY.overlay_1.BSS_SIZE	= SDK_OVERLAY.overlay_1.BSS_END - SDK_OVERLAY.overlay_1.BSS_START;
335
336	} >> overlay_1
337
338	.overlay_2:
339	{
340	ALIGNALL(4);				. = ALIGN(32);
341
342	#
343	#   TEXT BLOCK: READ ONLY
344	#
345	SDK_OVERLAY_overlay_2_ID		=2;	### SEGMENT overlay_2 OVERLAY ID
346	SDK_OVERLAY.overlay_2.ID		=2;
347	SDK_OVERLAY.overlay_2.START	=.;
348	SDK_OVERLAY.overlay_2.TEXT_START	=.;
349						#:::::::::: text/rodata
350						eee.o (.text)
351						fff.o (.text)
352						. = ALIGN(4);
353						eee.o (.rodata)
354						fff.o (.rodata)
355						. = ALIGN(4);
356						eee.o (.init)
357						fff.o (.init)
358						. = ALIGN(4);
359	SDK_OVERLAY.overlay_2.SINIT_START	=.;
360						#:::::::::: ctor
361						eee.o (.ctor)
362						fff.o (.ctor)
363						eee.o (.sinit)
364						fff.o (.sinit)
365						WRITEW	0;
366						#:::::::::: ctor
367	SDK_OVERLAY.overlay_2.SINIT_END	=.;
368
369						#:::::::::: text/rodata
370						. = ALIGN(32);
371	SDK_OVERLAY.overlay_2.TEXT_END	=.;
372
373	#
374	#  DATA BLOCK: READ WRITE
375	#
376	SDK_OVERLAY.overlay_2.DATA_START	=.;
377						#:::::::::: data
378						eee.o (.sdata)
379						fff.o (.sdata)
380						. = ALIGN(4);
381						eee.o (.data)
382						fff.o (.data)
383						. = ALIGN(4);
384						#:::::::::: data
385						. = ALIGN(32);
386	SDK_OVERLAY.overlay_2.DATA_END	=.;
387	SDK_OVERLAY.overlay_2.END		=.;
388
389	SDK_OVERLAY.overlay_2.TEXT_SIZE	= SDK_OVERLAY.overlay_2.TEXT_END - SDK_OVERLAY.overlay_2.TEXT_START;
390	SDK_OVERLAY.overlay_2.DATA_SIZE	= SDK_OVERLAY.overlay_2.DATA_END - SDK_OVERLAY.overlay_2.DATA_START;
391	SDK_OVERLAY.overlay_2.SIZE		= SDK_OVERLAY.overlay_2.END      - SDK_OVERLAY.overlay_2.START;
392
393	} > overlay_2
394
395	.overlay_2.bss:
396	{
397	ALIGNALL(4);				. = ALIGN(32);
398
399	#
400	#  BSS BLOCK
401	#
402	SDK_OVERLAY.overlay_2.BSS_START	= .;
403						#:::::::::: bss
404						eee.o (.bss)
405						fff.o (.bss)
406						. = ALIGN(4);
407						eee.o (.sbss)
408						fff.o (.sbss)
409						. = ALIGN(4);
410						#:::::::::: bss
411						. = ALIGN(32);
412	SDK_OVERLAY.overlay_2.BSS_END	= .;
413
414	SDK_OVERLAY.overlay_2.BSS_SIZE	= SDK_OVERLAY.overlay_2.BSS_END - SDK_OVERLAY.overlay_2.BSS_START;
415
416	} >> overlay_2
417
418
419	############################ MAIN EX ##################################
420	# MAIN EX Area
421	.dummy.MAIN_EX:
422	{
423		. = ALIGN(32);
424	} > dummy.MAIN_EX
425
426	############################ ARENA ##################################
427	.arena.MAIN:
428	{
429						. = ALIGN(32);
430		SDK_SECTION_ARENA_START		=.;
431	} > arena.MAIN
432
433	.arena.MAIN_EX:
434	{
435						. = ALIGN(32);
436		SDK_SECTION_ARENA_EX_START	=.;
437	} > arena.MAIN_EX
438
439	.arena.ITCM:
440	{
441						. = ALIGN(32);
442		SDK_SECTION_ARENA_ITCM_START	=.;
443	} > arena.ITCM
444
445	.arena.DTCM:
446	{
447						. = ALIGN(32);
448		SDK_SECTION_ARENA_DTCM_START	=.;
449	} > arena.DTCM
450
451	############################ OVERLAYDEFS ############################
452	.main_defs:
453	{
454		###  main module information
455		WRITEW ADDR(.main);			# load address
456		WRITEW _start;					# entry address
457		WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE;	# size of module
458		WRITEW _start_AutoloadDoneCallback;		# callback autoload done
459
460		###  overlay filename
461		WRITES ("overlay_0.sbin");	# Overlay 0
462		WRITES ("overlay_1.sbin");	# Overlay 1
463		WRITES ("overlay_2.sbin");	# Overlay 2
464
465	} > main_defs
466
467
468	############################ OVERLAYTABLE ###########################
469	.main_table:
470	{
471		#	 Overlay 0
472		WRITEW 0;				# overlay ID
473		WRITEW ADDR(.overlay_0);			# load address
474		WRITEW SDK_OVERLAY.overlay_0.SIZE;		# size of module
475		WRITEW SDK_OVERLAY.overlay_0.BSS_SIZE;	# size of bss
476		WRITEW SDK_OVERLAY.overlay_0.SINIT_START;	# start address of static init
477		WRITEW SDK_OVERLAY.overlay_0.SINIT_END;	# end address of static init
478		WRITEW 0;				# ROM file ID
479		WRITEW 0;					# Reserved
480
481		#	 Overlay 1
482		WRITEW 1;				# overlay ID
483		WRITEW ADDR(.overlay_1);			# load address
484		WRITEW SDK_OVERLAY.overlay_1.SIZE;		# size of module
485		WRITEW SDK_OVERLAY.overlay_1.BSS_SIZE;	# size of bss
486		WRITEW SDK_OVERLAY.overlay_1.SINIT_START;	# start address of static init
487		WRITEW SDK_OVERLAY.overlay_1.SINIT_END;	# end address of static init
488		WRITEW 1;				# ROM file ID
489		WRITEW 0;					# Reserved
490
491		#	 Overlay 2
492		WRITEW 2;				# overlay ID
493		WRITEW ADDR(.overlay_2);			# load address
494		WRITEW SDK_OVERLAY.overlay_2.SIZE;		# size of module
495		WRITEW SDK_OVERLAY.overlay_2.BSS_SIZE;	# size of bss
496		WRITEW SDK_OVERLAY.overlay_2.SINIT_START;	# start address of static init
497		WRITEW SDK_OVERLAY.overlay_2.SINIT_END;	# end address of static init
498		WRITEW 2;				# ROM file ID
499		WRITEW 0;					# Reserved
500
501
502	} > main_table
503
504
505	############################ OTHERS #################################
506	SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START;
507	SDK_IRQ_STACKSIZE = 1024;	# allocated in DTCM
508	SDK_SYS_STACKSIZE = 8192;		# when 0 means all remains of DTCM
509
510	# Module filelist
511	.binary.MODULE_FILES:
512	{
513		WRITES ("main.sbin");
514		WRITES ("main_defs.sbin");
515		WRITES ("main_table.sbin");
516	} > binary.MODULE_FILES
517
518	# ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM
519	.check.ITCM:
520	{
521		. = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE;
522	} > check.ITCM
523
524	SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1;
525	.check.DTCM:
526	{
527		. = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE;
528		. = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
529	} > check.DTCM
530
531}
532