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 = 0x02004000,   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	dummy.MAIN_EX		(RW)  : ORIGIN = 0x023e0000, LENGTH = 0x0
26	arena.MAIN			(RW)  : ORIGIN = AFTER(main), LENGTH = 0x0
27	arena.MAIN_EX		(RW)  : ORIGIN = AFTER(dummy.MAIN_EX), LENGTH = 0x0
28	arena.ITCM		(RW)  : ORIGIN = AFTER(ITCM), LENGTH = 0x0
29	arena.DTCM		(RW)  : ORIGIN = AFTER(DTCM), LENGTH = 0x0
30	binary.MODULE_FILES		(RW)  : ORIGIN = 0x0, LENGTH = 0x0     > component.files
31	check.ITCM			(RWX) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check
32	check.DTCM			(RW)  : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check
33}
34
35FORCE_ACTIVE
36{
37	SVC_SoftReset
38}
39
40KEEP_SECTION
41{
42	.sinit
43}
44
45SECTIONS
46{
47	############################ STATIC #################################
48	.main:
49	{
50	ALIGNALL(4);			. = ALIGN(32);	# Fit to cache line
51
52	#
53	#  TEXT BLOCK: READ ONLY
54	#
55	SDK_STATIC_START		=.;
56	SDK_STATIC_TEXT_START		=.;
57					#:::::::::: text/rodata
58					libsyscall.a (.text)
59					crt0.o (.text)
60					crt0.o (.rodata)
61					#
62					# Added .version section.
63					# The information included in this section will be needed for Lotcheck purposes. Be sure to leave it in this position.
64					#
65					#
66					* (.version)
67					OBJECT(NitroMain,*)
68					* (.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					* (.init)
77					. = ALIGN(4);
78					* (.rodata)
79					. = ALIGN(4);
80
81	SDK_STATIC_SINIT_START		=.;
82					#:::::::::: ctor
83					* (.ctor)
84					* (.sinit)
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					* (.sdata)
99					. = ALIGN(4);
100					* (.data)
101					. = ALIGN(4);
102	SDK_OVERLAY_DIGEST		=.;
103					# NO DIGEST
104	SDK_OVERLAY_DIGEST_END		=.;
105					#:::::::::: Data
106					. = ALIGN(32);
107	SDK_STATIC_DATA_END		=.;
108	SDK_STATIC_END			=.;
109
110	SDK_STATIC_TEXT_SIZE		= SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START;
111	SDK_STATIC_DATA_SIZE		= SDK_STATIC_DATA_END - SDK_STATIC_DATA_START;
112	SDK_STATIC_SIZE			= SDK_STATIC_END      - SDK_STATIC_START;
113	__sinit__			= SDK_STATIC_SINIT_START;	# For static initializer
114	__exception_table_start__	= SDK_STATIC_ETABLE_START;	# For exception table
115	__exception_table_end__		= SDK_STATIC_ETABLE_END;	# For exception table
116	} > main
117
118	.main.bss:
119	{
120	ALIGNALL(4);			. = ALIGN(32);
121
122	#
123	#  BSS BLOCK
124	#
125	SDK_STATIC_BSS_START		=.;
126					#:::::::::: bss
127					* (.sbss)
128					. = ALIGN(4);
129					* (.bss)
130					. = ALIGN(4);
131					#:::::::::: bss
132					. = ALIGN(32);
133	SDK_STATIC_BSS_END		= .;
134	SDK_STATIC_BSS_SIZE		= SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
135
136	} >> main
137
138
139	############################ AUTOLOADS ##############################
140	SDK_AUTOLOAD.ITCM.START			= 0x01ff8000;
141	SDK_AUTOLOAD.ITCM.END			= SDK_AUTOLOAD.ITCM.START;
142	SDK_AUTOLOAD.ITCM.BSS_END		= SDK_AUTOLOAD.ITCM.START;
143	SDK_AUTOLOAD.ITCM.SIZE			= 0;
144	SDK_AUTOLOAD.ITCM.BSS_SIZE		= 0;
145	SDK_AUTOLOAD.DTCM.START			= 0x027e0000;
146	SDK_AUTOLOAD.DTCM.END			= SDK_AUTOLOAD.DTCM.START;
147	SDK_AUTOLOAD.DTCM.BSS_END		= SDK_AUTOLOAD.DTCM.START;
148	SDK_AUTOLOAD.DTCM.SIZE			= 0;
149	SDK_AUTOLOAD.DTCM.BSS_SIZE		= 0;
150	SDK_AUTOLOAD_START			= SDK_STATIC_END;
151	SDK_AUTOLOAD_SIZE			= 0;
152	SDK_AUTOLOAD_NUMBER			= 0;
153
154
155	SDK_AUTOLOAD_ITCM_START			= SDK_AUTOLOAD.ITCM.START;
156	SDK_AUTOLOAD_ITCM_END			= SDK_AUTOLOAD.ITCM.END;
157	SDK_AUTOLOAD_ITCM_BSS_END		= SDK_AUTOLOAD.ITCM.BSS_END;
158	SDK_AUTOLOAD_ITCM_SIZE			= SDK_AUTOLOAD.ITCM.SIZE;
159	SDK_AUTOLOAD_ITCM_BSS_SIZE		= SDK_AUTOLOAD.ITCM.BSS_SIZE;
160	SDK_AUTOLOAD_DTCM_START			= SDK_AUTOLOAD.DTCM.START;
161	SDK_AUTOLOAD_DTCM_END			= SDK_AUTOLOAD.DTCM.END;
162	SDK_AUTOLOAD_DTCM_BSS_END		= SDK_AUTOLOAD.DTCM.BSS_END;
163	SDK_AUTOLOAD_DTCM_SIZE			= SDK_AUTOLOAD.DTCM.SIZE;
164	SDK_AUTOLOAD_DTCM_BSS_SIZE		= SDK_AUTOLOAD.DTCM.BSS_SIZE;
165
166	############################ AUTOLOAD_INFO ##########################
167	.binary.AUTOLOAD_INFO:
168	{
169	} > binary.AUTOLOAD_INFO
170
171	SDK_AUTOLOAD_LIST			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE;
172	SDK_AUTOLOAD_LIST_END			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO);
173	SDK_AUTOLOAD_SIZE			= SDK_AUTOLOAD_SIZE  + SIZEOF(.binary.AUTOLOAD_INFO);
174
175	############################ STATIC_FOOTER ##########################
176	.binary.STATIC_FOOTER:
177	{
178		WRITEW 0xdec00621;		# LE(0x2106C0DE) = NITRO CODE
179		WRITEW _start_ModuleParams - ADDR(.main);
180		WRITEW 0;			# NO DIGEST
181	} > binary.STATIC_FOOTER
182
183	############################ OVERLAYS ###############################
184	SDK_OVERLAY_NUMBER			= 0;
185
186
187	############################ MAIN EX ##################################
188	# MAIN EX Area
189	.dummy.MAIN_EX:
190	{
191		. = ALIGN(32);
192	} > dummy.MAIN_EX
193
194	############################ ARENA ##################################
195	.arena.MAIN:
196	{
197						. = ALIGN(32);
198		SDK_SECTION_ARENA_START		=.;
199	} > arena.MAIN
200
201	.arena.MAIN_EX:
202	{
203						. = ALIGN(32);
204		SDK_SECTION_ARENA_EX_START	=.;
205	} > arena.MAIN_EX
206
207	.arena.ITCM:
208	{
209						. = ALIGN(32);
210		SDK_SECTION_ARENA_ITCM_START	=.;
211	} > arena.ITCM
212
213	.arena.DTCM:
214	{
215						. = ALIGN(32);
216		SDK_SECTION_ARENA_DTCM_START	=.;
217	} > arena.DTCM
218
219	############################ OVERLAYDEFS ############################
220	.main_defs:
221	{
222		###  main module information
223		WRITEW ADDR(.main);			# Load address
224		WRITEW _start;					# Entry address
225		WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE;	# Size of module
226		WRITEW _start_AutoloadDoneCallback;		# Callback autoload done
227
228		###  overlay filename
229
230	} > main_defs
231
232
233	############################ OVERLAYTABLE ###########################
234	.main_table:
235	{
236
237	} > main_table
238
239
240	############################ OTHERS #################################
241	SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START;
242	SDK_IRQ_STACKSIZE = 1024;	# Allocated in DTCM
243	SDK_SYS_STACKSIZE = 0;		# When 0 means all remains of DTCM
244
245	# Module filelist
246	.binary.MODULE_FILES:
247	{
248		WRITES ("main.sbin");
249		WRITES ("main_defs.sbin");
250		WRITES ("main_table.sbin");
251	} > binary.MODULE_FILES
252
253	# ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM
254	.check.ITCM:
255	{
256		. = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE;
257	} > check.ITCM
258
259	SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1;
260	.check.DTCM:
261	{
262		. = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE;
263		. = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
264	} > check.DTCM
265
266}
267