xref: /arm-trusted-firmware/plat/nvidia/tegra/scat/bl31.scat (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu#! armclang -E -x c
2*91f16700Schasinglulu
3*91f16700Schasinglulu/*
4*91f16700Schasinglulu * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
5*91f16700Schasinglulu *
6*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
7*91f16700Schasinglulu */
8*91f16700Schasinglulu
9*91f16700Schasinglulu#include <platform_def.h>
10*91f16700Schasinglulu
11*91f16700Schasinglulu#define PAGE_SIZE	(1024 * 4)
12*91f16700Schasinglulu
13*91f16700SchasingluluLR_START BL31_BASE
14*91f16700Schasinglulu{
15*91f16700Schasinglulu	__BL31_START__ +0 FIXED EMPTY 0
16*91f16700Schasinglulu	{
17*91f16700Schasinglulu		/* placeholder */
18*91f16700Schasinglulu	}
19*91f16700Schasinglulu
20*91f16700Schasinglulu	/* BL31_BASE address must be aligned on a page boundary. */
21*91f16700Schasinglulu	ScatterAssert((ImageBase(__BL31_START__) AND 0xFFF) == 0)
22*91f16700Schasinglulu}
23*91f16700Schasinglulu
24*91f16700SchasingluluLR_TEXT BL31_BASE
25*91f16700Schasinglulu{
26*91f16700Schasinglulu	__TEXT__ +0 FIXED
27*91f16700Schasinglulu	{
28*91f16700Schasinglulu		*(:gdef:bl31_entrypoint, +FIRST)
29*91f16700Schasinglulu		*(.text*)
30*91f16700Schasinglulu		*(.vectors)
31*91f16700Schasinglulu		.ANY1(+RO-CODE)
32*91f16700Schasinglulu	}
33*91f16700Schasinglulu
34*91f16700Schasinglulu	__TEXT_EPILOGUE__ AlignExpr(+0, PAGE_SIZE) FIXED EMPTY 0
35*91f16700Schasinglulu	{
36*91f16700Schasinglulu		/* section delimiter */
37*91f16700Schasinglulu	}
38*91f16700Schasinglulu}
39*91f16700Schasinglulu
40*91f16700SchasingluluLR_RO_DATA +0
41*91f16700Schasinglulu{
42*91f16700Schasinglulu	__RODATA__ AlignExpr(ImageLimit(LR_TEXT), 0) FIXED
43*91f16700Schasinglulu	{
44*91f16700Schasinglulu		*(.rodata*)
45*91f16700Schasinglulu		.ANY2(+RO-DATA)
46*91f16700Schasinglulu	}
47*91f16700Schasinglulu
48*91f16700Schasinglulu	/* Ensure 8-byte alignment for descriptors and ensure inclusion */
49*91f16700Schasinglulu	__RT_SVC_DESCS__ AlignExpr(ImageLimit(__RODATA__), 8) FIXED
50*91f16700Schasinglulu	{
51*91f16700Schasinglulu		*(.rt_svc_descs)
52*91f16700Schasinglulu	}
53*91f16700Schasinglulu
54*91f16700Schasinglulu#if ENABLE_PMF
55*91f16700Schasinglulu	/* Ensure 8-byte alignment for descriptors and ensure inclusion */
56*91f16700Schasinglulu	__PMF_SVC_DESCS__ AlignExpr(ImageLimit(__RT_SVC_DESCS__), 8) FIXED
57*91f16700Schasinglulu	{
58*91f16700Schasinglulu		*(.pmf_svc_descs)
59*91f16700Schasinglulu	}
60*91f16700Schasinglulu#endif /* ENABLE_PMF */
61*91f16700Schasinglulu
62*91f16700Schasinglulu	/*
63*91f16700Schasinglulu	 * Ensure 8-byte alignment for cpu_ops so that its fields are also
64*91f16700Schasinglulu	 * aligned.
65*91f16700Schasinglulu	 */
66*91f16700Schasinglulu	__CPU_OPS__ AlignExpr(+0, 8) FIXED
67*91f16700Schasinglulu	{
68*91f16700Schasinglulu		*(.cpu_ops)
69*91f16700Schasinglulu	}
70*91f16700Schasinglulu
71*91f16700Schasinglulu	/*
72*91f16700Schasinglulu	 * Keep the .got section in the RO section as it is patched
73*91f16700Schasinglulu	 * prior to enabling the MMU and having the .got in RO is better for
74*91f16700Schasinglulu	 * security. GOT is a table of addresses so ensure 8-byte alignment.
75*91f16700Schasinglulu	 */
76*91f16700Schasinglulu	__GOT__ AlignExpr(ImageLimit(__CPU_OPS__), 8) FIXED
77*91f16700Schasinglulu	{
78*91f16700Schasinglulu		*(.got)
79*91f16700Schasinglulu	}
80*91f16700Schasinglulu
81*91f16700Schasinglulu	/* Place pubsub sections for events */
82*91f16700Schasinglulu	__PUBSUB_EVENTS__ AlignExpr(+0, 8) EMPTY 0
83*91f16700Schasinglulu	{
84*91f16700Schasinglulu		/* placeholder */
85*91f16700Schasinglulu	}
86*91f16700Schasinglulu
87*91f16700Schasinglulu#include <lib/el3_runtime/pubsub_events.h>
88*91f16700Schasinglulu
89*91f16700Schasinglulu	__RODATA_EPILOGUE__ AlignExpr(+0, PAGE_SIZE) FIXED EMPTY 0
90*91f16700Schasinglulu	{
91*91f16700Schasinglulu		/* section delimiter */
92*91f16700Schasinglulu	}
93*91f16700Schasinglulu}
94*91f16700Schasinglulu
95*91f16700Schasinglulu	/* cpu_ops must always be defined */
96*91f16700Schasinglulu	ScatterAssert(ImageLength(__CPU_OPS__) > 0)
97*91f16700Schasinglulu
98*91f16700Schasinglulu#if SPM_MM
99*91f16700SchasingluluLR_SPM +0
100*91f16700Schasinglulu{
101*91f16700Schasinglulu	/*
102*91f16700Schasinglulu	 * Exception vectors of the SPM shim layer. They must be aligned to a 2K
103*91f16700Schasinglulu	 * address, but we need to place them in a separate page so that we can set
104*91f16700Schasinglulu	 * individual permissions to them, so the actual alignment needed is 4K.
105*91f16700Schasinglulu	 *
106*91f16700Schasinglulu	 * There's no need to include this into the RO section of BL31 because it
107*91f16700Schasinglulu	 * doesn't need to be accessed by BL31.
108*91f16700Schasinglulu	 */
109*91f16700Schasinglulu	__SPM_SHIM_EXCEPTIONS__ AlignExpr(ImageLimit(LR_RO_DATA), PAGE_SIZE) FIXED
110*91f16700Schasinglulu	{
111*91f16700Schasinglulu		*(.spm_shim_exceptions)
112*91f16700Schasinglulu	}
113*91f16700Schasinglulu
114*91f16700Schasinglulu	__SPM_SHIM_EXCEPTIONS_EPILOGUE__ AlignExpr(ImageLimit(__SPM_SHIM_EXCEPTIONS__), PAGE_SIZE) FIXED
115*91f16700Schasinglulu	{
116*91f16700Schasinglulu		/* placeholder */
117*91f16700Schasinglulu	}
118*91f16700Schasinglulu}
119*91f16700Schasinglulu#endif
120*91f16700Schasinglulu
121*91f16700SchasingluluLR_RW_DATA +0
122*91f16700Schasinglulu{
123*91f16700Schasinglulu	__DATA__ AlignExpr(+0, 16) FIXED
124*91f16700Schasinglulu	{
125*91f16700Schasinglulu		*(.data*)
126*91f16700Schasinglulu		*(.constdata)
127*91f16700Schasinglulu		*(locale$$data)
128*91f16700Schasinglulu	}
129*91f16700Schasinglulu}
130*91f16700Schasinglulu
131*91f16700SchasingluluLR_RELA +0
132*91f16700Schasinglulu{
133*91f16700Schasinglulu	/*
134*91f16700Schasinglulu	 * .rela.dyn needs to come after .data for the read-elf utility to parse
135*91f16700Schasinglulu	 * this section correctly. Ensure 8-byte alignment so that the fields of
136*91f16700Schasinglulu	 * RELA data structure are aligned.
137*91f16700Schasinglulu	 */
138*91f16700Schasinglulu	__RELA__ AlignExpr(ImageLimit(LR_RW_DATA), 8) FIXED
139*91f16700Schasinglulu	{
140*91f16700Schasinglulu		*(.rela.dyn)
141*91f16700Schasinglulu	}
142*91f16700Schasinglulu}
143*91f16700Schasinglulu
144*91f16700Schasinglulu#ifdef BL31_PROGBITS_LIMIT
145*91f16700Schasinglulu	/* BL31 progbits has exceeded its limit. */
146*91f16700Schasinglulu	ScatterAssert(ImageLimit(LR_RELA) <= BL31_PROGBITS_LIMIT)
147*91f16700Schasinglulu#endif
148*91f16700Schasinglulu
149*91f16700SchasingluluLR_STACKS +0
150*91f16700Schasinglulu{
151*91f16700Schasinglulu	__STACKS__ AlignExpr(+0, 64) FIXED
152*91f16700Schasinglulu	{
153*91f16700Schasinglulu		*(.tzfw_normal_stacks)
154*91f16700Schasinglulu	}
155*91f16700Schasinglulu}
156*91f16700Schasinglulu
157*91f16700Schasinglulu#define __BAKERY_LOCK_SIZE__		(ImageLimit(__BAKERY_LOCKS_EPILOGUE__) - \
158*91f16700Schasinglulu					 ImageBase(__BAKERY_LOCKS__))
159*91f16700Schasinglulu#define BAKERY_LOCK_SIZE		(__BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1))
160*91f16700Schasinglulu#define __PMF_TIMESTAMP_SIZE__		(ImageLimit(__PMF_TIMESTAMP__) - \
161*91f16700Schasinglulu					 ImageBase(__PMF_TIMESTAMP__))
162*91f16700Schasinglulu#define PER_CPU_TIMESTAMP_SIZE		(__PMF_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1))
163*91f16700Schasinglulu
164*91f16700SchasingluluLR_BSS +0
165*91f16700Schasinglulu{
166*91f16700Schasinglulu	__BSS__ AlignExpr(ImageLimit(LR_STACKS), 256) FIXED
167*91f16700Schasinglulu	{
168*91f16700Schasinglulu		*(.bss*)
169*91f16700Schasinglulu		*(COMDAT)
170*91f16700Schasinglulu	}
171*91f16700Schasinglulu
172*91f16700Schasinglulu#if !USE_COHERENT_MEM
173*91f16700Schasinglulu	/*
174*91f16700Schasinglulu	 * Bakery locks are stored in normal .bss memory
175*91f16700Schasinglulu	 *
176*91f16700Schasinglulu	 * Each lock's data is spread across multiple cache lines, one per CPU,
177*91f16700Schasinglulu	 * but multiple locks can share the same cache line.
178*91f16700Schasinglulu	 * The compiler will allocate enough memory for one CPU's bakery locks,
179*91f16700Schasinglulu	 * the remaining cache lines are allocated by the linker script
180*91f16700Schasinglulu	 */
181*91f16700Schasinglulu	__BAKERY_LOCKS__ AlignExpr(ImageLimit(__BSS__), CACHE_WRITEBACK_GRANULE) FIXED
182*91f16700Schasinglulu	{
183*91f16700Schasinglulu		*(.bakery_lock)
184*91f16700Schasinglulu	}
185*91f16700Schasinglulu
186*91f16700Schasinglulu	__BAKERY_LOCKS_EPILOGUE__ AlignExpr(ImageLimit(__BAKERY_LOCKS__), CACHE_WRITEBACK_GRANULE) FIXED EMPTY 0
187*91f16700Schasinglulu	{
188*91f16700Schasinglulu		/* section delimiter */
189*91f16700Schasinglulu	}
190*91f16700Schasinglulu
191*91f16700Schasinglulu	__PER_CPU_BAKERY_LOCKS__ ImageLimit(__BAKERY_LOCKS_EPILOGUE__) FIXED FILL 0 BAKERY_LOCK_SIZE
192*91f16700Schasinglulu	{
193*91f16700Schasinglulu		/* padded memory section to store per cpu bakery locks */
194*91f16700Schasinglulu	}
195*91f16700Schasinglulu
196*91f16700Schasinglulu#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
197*91f16700Schasinglulu	/* PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements */
198*91f16700Schasinglulu	ScatterAssert(__PER_CPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE)
199*91f16700Schasinglulu#endif
200*91f16700Schasinglulu#endif
201*91f16700Schasinglulu
202*91f16700Schasinglulu#if ENABLE_PMF
203*91f16700Schasinglulu	/*
204*91f16700Schasinglulu	 * Time-stamps are stored in normal .bss memory
205*91f16700Schasinglulu	 *
206*91f16700Schasinglulu	 * The compiler will allocate enough memory for one CPU's time-stamps,
207*91f16700Schasinglulu	 * the remaining memory for other CPU's is allocated by the
208*91f16700Schasinglulu	 * linker script
209*91f16700Schasinglulu	 */
210*91f16700Schasinglulu	__PMF_TIMESTAMP__ AlignExpr(+0, CACHE_WRITEBACK_GRANULE) FIXED EMPTY CACHE_WRITEBACK_GRANULE
211*91f16700Schasinglulu	{
212*91f16700Schasinglulu		/* store timestamps in this carved out memory */
213*91f16700Schasinglulu	}
214*91f16700Schasinglulu
215*91f16700Schasinglulu	__PMF_TIMESTAMP_EPILOGUE__ AlignExpr(ImageLimit(__PMF_TIMESTAMP__), CACHE_WRITEBACK_GRANULE) FIXED EMPTY 0
216*91f16700Schasinglulu	{
217*91f16700Schasinglulu		/*
218*91f16700Schasinglulu		 * placeholder to make __PMF_TIMESTAMP_START__ end on a
219*91f16700Schasinglulu		 * CACHE_WRITEBACK_GRANULE boundary
220*91f16700Schasinglulu		 */
221*91f16700Schasinglulu	}
222*91f16700Schasinglulu
223*91f16700Schasinglulu	__PER_CPU_TIMESTAMPS__ +0 FIXED FILL 0 PER_CPU_TIMESTAMP_SIZE
224*91f16700Schasinglulu	{
225*91f16700Schasinglulu		/* padded memory section to store per cpu timestamps */
226*91f16700Schasinglulu	}
227*91f16700Schasinglulu#endif /* ENABLE_PMF */
228*91f16700Schasinglulu}
229*91f16700Schasinglulu
230*91f16700SchasingluluLR_XLAT_TABLE +0
231*91f16700Schasinglulu{
232*91f16700Schasinglulu	.xlat_table +0 FIXED
233*91f16700Schasinglulu	{
234*91f16700Schasinglulu		*(.xlat_table)
235*91f16700Schasinglulu	}
236*91f16700Schasinglulu}
237*91f16700Schasinglulu
238*91f16700Schasinglulu#if USE_COHERENT_MEM
239*91f16700SchasingluluLR_COHERENT_RAM +0
240*91f16700Schasinglulu{
241*91f16700Schasinglulu	/*
242*91f16700Schasinglulu	 * The base address of the coherent memory section must be page-aligned (4K)
243*91f16700Schasinglulu	 * to guarantee that the coherent data are stored on their own pages and
244*91f16700Schasinglulu	 * are not mixed with normal data.  This is required to set up the correct
245*91f16700Schasinglulu	 * memory attributes for the coherent data page tables.
246*91f16700Schasinglulu	 */
247*91f16700Schasinglulu	__COHERENT_RAM__ AlignExpr(+0, PAGE_SIZE) FIXED
248*91f16700Schasinglulu	{
249*91f16700Schasinglulu		/*
250*91f16700Schasinglulu		 * Bakery locks are stored in coherent memory
251*91f16700Schasinglulu		 *
252*91f16700Schasinglulu		 * Each lock's data is contiguous and fully allocated by the compiler
253*91f16700Schasinglulu		 */
254*91f16700Schasinglulu		*(.bakery_lock)
255*91f16700Schasinglulu		*(.tzfw_coherent_mem)
256*91f16700Schasinglulu	}
257*91f16700Schasinglulu
258*91f16700Schasinglulu	__COHERENT_RAM_EPILOGUE_UNALIGNED__ +0 FIXED EMPTY 0
259*91f16700Schasinglulu	{
260*91f16700Schasinglulu		/* section delimiter */
261*91f16700Schasinglulu	}
262*91f16700Schasinglulu
263*91f16700Schasinglulu	/*
264*91f16700Schasinglulu	 * Memory page(s) mapped to this section will be marked
265*91f16700Schasinglulu	 * as device memory.  No other unexpected data must creep in.
266*91f16700Schasinglulu	 * Ensure the rest of the current memory page is unused.
267*91f16700Schasinglulu	 */
268*91f16700Schasinglulu	__COHERENT_RAM_EPILOGUE__ AlignExpr(ImageLimit(__COHERENT_RAM_START__), PAGE_SIZE) FIXED EMPTY 0
269*91f16700Schasinglulu	{
270*91f16700Schasinglulu		/* section delimiter */
271*91f16700Schasinglulu	}
272*91f16700Schasinglulu}
273*91f16700Schasinglulu#endif
274*91f16700Schasinglulu
275*91f16700SchasingluluLR_END +0
276*91f16700Schasinglulu{
277*91f16700Schasinglulu	__BL31_END__ +0 FIXED EMPTY 0
278*91f16700Schasinglulu	{
279*91f16700Schasinglulu		/* placeholder */
280*91f16700Schasinglulu	}
281*91f16700Schasinglulu
282*91f16700Schasinglulu	/* BL31 image has exceeded its limit. */
283*91f16700Schasinglulu	ScatterAssert(ImageLimit(__BL31_END__) <= BL31_LIMIT)
284*91f16700Schasinglulu}
285