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