xref: /rk3399_ARM-atf/include/common/bl_common.ld.h (revision e8ad6168b0153e09f1a54ee887555db7833019df)
1665e71b8SMasahiro Yamada /*
2665e71b8SMasahiro Yamada  * Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
3665e71b8SMasahiro Yamada  *
4665e71b8SMasahiro Yamada  * SPDX-License-Identifier: BSD-3-Clause
5665e71b8SMasahiro Yamada  */
6665e71b8SMasahiro Yamada 
7665e71b8SMasahiro Yamada #ifndef BL_COMMON_LD_H
8665e71b8SMasahiro Yamada #define BL_COMMON_LD_H
9665e71b8SMasahiro Yamada 
109fb288a0SMasahiro Yamada #include <platform_def.h>
119fb288a0SMasahiro Yamada 
129fb288a0SMasahiro Yamada #ifdef __aarch64__
139fb288a0SMasahiro Yamada #define STRUCT_ALIGN	8
14a7739bc7SMasahiro Yamada #define BSS_ALIGN	16
159fb288a0SMasahiro Yamada #else
169fb288a0SMasahiro Yamada #define STRUCT_ALIGN	4
17a7739bc7SMasahiro Yamada #define BSS_ALIGN	8
189fb288a0SMasahiro Yamada #endif
199fb288a0SMasahiro Yamada 
20caa3e7e0SMasahiro Yamada #ifndef DATA_ALIGN
21caa3e7e0SMasahiro Yamada #define DATA_ALIGN	1
22caa3e7e0SMasahiro Yamada #endif
23caa3e7e0SMasahiro Yamada 
249fb288a0SMasahiro Yamada #define CPU_OPS						\
259fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
269fb288a0SMasahiro Yamada 	__CPU_OPS_START__ = .;				\
279fb288a0SMasahiro Yamada 	KEEP(*(cpu_ops))				\
289fb288a0SMasahiro Yamada 	__CPU_OPS_END__ = .;
299fb288a0SMasahiro Yamada 
309fb288a0SMasahiro Yamada #define PARSER_LIB_DESCS				\
319fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
329fb288a0SMasahiro Yamada 	__PARSER_LIB_DESCS_START__ = .;			\
339fb288a0SMasahiro Yamada 	KEEP(*(.img_parser_lib_descs))			\
349fb288a0SMasahiro Yamada 	__PARSER_LIB_DESCS_END__ = .;
359fb288a0SMasahiro Yamada 
369fb288a0SMasahiro Yamada #define RT_SVC_DESCS					\
379fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
389fb288a0SMasahiro Yamada 	__RT_SVC_DESCS_START__ = .;			\
399fb288a0SMasahiro Yamada 	KEEP(*(rt_svc_descs))				\
409fb288a0SMasahiro Yamada 	__RT_SVC_DESCS_END__ = .;
419fb288a0SMasahiro Yamada 
429fb288a0SMasahiro Yamada #define PMF_SVC_DESCS					\
439fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
449fb288a0SMasahiro Yamada 	__PMF_SVC_DESCS_START__ = .;			\
459fb288a0SMasahiro Yamada 	KEEP(*(pmf_svc_descs))				\
469fb288a0SMasahiro Yamada 	__PMF_SVC_DESCS_END__ = .;
479fb288a0SMasahiro Yamada 
489fb288a0SMasahiro Yamada #define FCONF_POPULATOR					\
499fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
509fb288a0SMasahiro Yamada 	__FCONF_POPULATOR_START__ = .;			\
519fb288a0SMasahiro Yamada 	KEEP(*(.fconf_populator))			\
529fb288a0SMasahiro Yamada 	__FCONF_POPULATOR_END__ = .;
539fb288a0SMasahiro Yamada 
549fb288a0SMasahiro Yamada /*
559fb288a0SMasahiro Yamada  * Keep the .got section in the RO section as it is patched prior to enabling
569fb288a0SMasahiro Yamada  * the MMU and having the .got in RO is better for security. GOT is a table of
579fb288a0SMasahiro Yamada  * addresses so ensure pointer size alignment.
589fb288a0SMasahiro Yamada  */
599fb288a0SMasahiro Yamada #define GOT						\
609fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
619fb288a0SMasahiro Yamada 	__GOT_START__ = .;				\
629fb288a0SMasahiro Yamada 	*(.got)						\
639fb288a0SMasahiro Yamada 	__GOT_END__ = .;
649fb288a0SMasahiro Yamada 
65268131c2SMasahiro Yamada /*
66268131c2SMasahiro Yamada  * The base xlat table
67268131c2SMasahiro Yamada  *
68268131c2SMasahiro Yamada  * It is put into the rodata section if PLAT_RO_XLAT_TABLES=1,
69268131c2SMasahiro Yamada  * or into the bss section otherwise.
70268131c2SMasahiro Yamada  */
71268131c2SMasahiro Yamada #define BASE_XLAT_TABLE					\
72268131c2SMasahiro Yamada 	. = ALIGN(16);					\
73268131c2SMasahiro Yamada 	*(base_xlat_table)
74268131c2SMasahiro Yamada 
75268131c2SMasahiro Yamada #if PLAT_RO_XLAT_TABLES
76268131c2SMasahiro Yamada #define BASE_XLAT_TABLE_RO		BASE_XLAT_TABLE
77268131c2SMasahiro Yamada #define BASE_XLAT_TABLE_BSS
78268131c2SMasahiro Yamada #else
79268131c2SMasahiro Yamada #define BASE_XLAT_TABLE_RO
80268131c2SMasahiro Yamada #define BASE_XLAT_TABLE_BSS		BASE_XLAT_TABLE
81268131c2SMasahiro Yamada #endif
82268131c2SMasahiro Yamada 
830a0a7a9aSMasahiro Yamada #define RODATA_COMMON					\
840a0a7a9aSMasahiro Yamada 	RT_SVC_DESCS					\
850a0a7a9aSMasahiro Yamada 	FCONF_POPULATOR					\
860a0a7a9aSMasahiro Yamada 	PMF_SVC_DESCS					\
870a0a7a9aSMasahiro Yamada 	PARSER_LIB_DESCS				\
880a0a7a9aSMasahiro Yamada 	CPU_OPS						\
89268131c2SMasahiro Yamada 	GOT						\
90268131c2SMasahiro Yamada 	BASE_XLAT_TABLE_RO
910a0a7a9aSMasahiro Yamada 
92caa3e7e0SMasahiro Yamada /*
93caa3e7e0SMasahiro Yamada  * .data must be placed at a lower address than the stacks if the stack
94caa3e7e0SMasahiro Yamada  * protector is enabled. Alternatively, the .data.stack_protector_canary
95caa3e7e0SMasahiro Yamada  * section can be placed independently of the main .data section.
96caa3e7e0SMasahiro Yamada  */
97caa3e7e0SMasahiro Yamada #define DATA_SECTION					\
98caa3e7e0SMasahiro Yamada 	.data . : ALIGN(DATA_ALIGN) {			\
99caa3e7e0SMasahiro Yamada 		__DATA_START__ = .;			\
100caa3e7e0SMasahiro Yamada 		*(SORT_BY_ALIGNMENT(.data*))		\
101caa3e7e0SMasahiro Yamada 		__DATA_END__ = .;			\
102caa3e7e0SMasahiro Yamada 	}
103caa3e7e0SMasahiro Yamada 
104*e8ad6168SMasahiro Yamada /*
105*e8ad6168SMasahiro Yamada  * .rela.dyn needs to come after .data for the read-elf utility to parse
106*e8ad6168SMasahiro Yamada  * this section correctly.
107*e8ad6168SMasahiro Yamada  */
108*e8ad6168SMasahiro Yamada #define RELA_SECTION					\
109*e8ad6168SMasahiro Yamada 	.rela.dyn : ALIGN(STRUCT_ALIGN) {		\
110*e8ad6168SMasahiro Yamada 		__RELA_START__ = .;			\
111*e8ad6168SMasahiro Yamada 		*(.rela*)				\
112*e8ad6168SMasahiro Yamada 		__RELA_END__ = .;			\
113*e8ad6168SMasahiro Yamada 	}
114*e8ad6168SMasahiro Yamada 
11534dd1e96SAlexei Fedorov #if !(defined(IMAGE_BL31) && RECLAIM_INIT_CODE)
1169fb288a0SMasahiro Yamada #define STACK_SECTION					\
1179fb288a0SMasahiro Yamada 	stacks (NOLOAD) : {				\
1189fb288a0SMasahiro Yamada 		__STACKS_START__ = .;			\
1199fb288a0SMasahiro Yamada 		*(tzfw_normal_stacks)			\
1209fb288a0SMasahiro Yamada 		__STACKS_END__ = .;			\
1219fb288a0SMasahiro Yamada 	}
12234dd1e96SAlexei Fedorov #endif
1239fb288a0SMasahiro Yamada 
1249fb288a0SMasahiro Yamada /*
1259fb288a0SMasahiro Yamada  * If BL doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__
1269fb288a0SMasahiro Yamada  * will be zero. For this reason, the only two valid values for
1279fb288a0SMasahiro Yamada  * __PERCPU_BAKERY_LOCK_SIZE__ are 0 or the platform defined value
1289fb288a0SMasahiro Yamada  * PLAT_PERCPU_BAKERY_LOCK_SIZE.
1299fb288a0SMasahiro Yamada  */
1309fb288a0SMasahiro Yamada #ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
1319fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK				\
1329fb288a0SMasahiro Yamada 	ASSERT((__PERCPU_BAKERY_LOCK_SIZE__ == 0) ||	\
1339fb288a0SMasahiro Yamada 	       (__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE), \
1349fb288a0SMasahiro Yamada 	       "PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
1359fb288a0SMasahiro Yamada #else
1369fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK
1379fb288a0SMasahiro Yamada #endif
1389fb288a0SMasahiro Yamada 
1399fb288a0SMasahiro Yamada /*
1409fb288a0SMasahiro Yamada  * Bakery locks are stored in normal .bss memory
1419fb288a0SMasahiro Yamada  *
1429fb288a0SMasahiro Yamada  * Each lock's data is spread across multiple cache lines, one per CPU,
1439fb288a0SMasahiro Yamada  * but multiple locks can share the same cache line.
1449fb288a0SMasahiro Yamada  * The compiler will allocate enough memory for one CPU's bakery locks,
1459fb288a0SMasahiro Yamada  * the remaining cache lines are allocated by the linker script
1469fb288a0SMasahiro Yamada  */
1479fb288a0SMasahiro Yamada #if !USE_COHERENT_MEM
1489fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL				\
1499fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1509fb288a0SMasahiro Yamada 	__BAKERY_LOCK_START__ = .;			\
1519fb288a0SMasahiro Yamada 	__PERCPU_BAKERY_LOCK_START__ = .;		\
1529fb288a0SMasahiro Yamada 	*(bakery_lock)					\
1539fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1549fb288a0SMasahiro Yamada 	__PERCPU_BAKERY_LOCK_END__ = .;			\
1559fb288a0SMasahiro Yamada 	__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__); \
1569fb288a0SMasahiro Yamada 	. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \
1579fb288a0SMasahiro Yamada 	__BAKERY_LOCK_END__ = .;			\
1589fb288a0SMasahiro Yamada 	BAKERY_LOCK_SIZE_CHECK
1599fb288a0SMasahiro Yamada #else
1609fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL
1619fb288a0SMasahiro Yamada #endif
1629fb288a0SMasahiro Yamada 
1639fb288a0SMasahiro Yamada /*
1649fb288a0SMasahiro Yamada  * Time-stamps are stored in normal .bss memory
1659fb288a0SMasahiro Yamada  *
1669fb288a0SMasahiro Yamada  * The compiler will allocate enough memory for one CPU's time-stamps,
1679fb288a0SMasahiro Yamada  * the remaining memory for other CPUs is allocated by the
1689fb288a0SMasahiro Yamada  * linker script
1699fb288a0SMasahiro Yamada  */
1709fb288a0SMasahiro Yamada #define PMF_TIMESTAMP					\
1719fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1729fb288a0SMasahiro Yamada 	__PMF_TIMESTAMP_START__ = .;			\
1739fb288a0SMasahiro Yamada 	KEEP(*(pmf_timestamp_array))			\
1749fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1759fb288a0SMasahiro Yamada 	__PMF_PERCPU_TIMESTAMP_END__ = .;		\
1769fb288a0SMasahiro Yamada 	__PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__); \
1779fb288a0SMasahiro Yamada 	. = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \
1789fb288a0SMasahiro Yamada 	__PMF_TIMESTAMP_END__ = .;
1799fb288a0SMasahiro Yamada 
180a7739bc7SMasahiro Yamada 
181a7739bc7SMasahiro Yamada /*
182a7739bc7SMasahiro Yamada  * The .bss section gets initialised to 0 at runtime.
183a7739bc7SMasahiro Yamada  * Its base address has bigger alignment for better performance of the
184a7739bc7SMasahiro Yamada  * zero-initialization code.
185a7739bc7SMasahiro Yamada  */
186a7739bc7SMasahiro Yamada #define BSS_SECTION					\
187a7739bc7SMasahiro Yamada 	.bss (NOLOAD) : ALIGN(BSS_ALIGN) {		\
188a7739bc7SMasahiro Yamada 		__BSS_START__ = .;			\
189a7739bc7SMasahiro Yamada 		*(SORT_BY_ALIGNMENT(.bss*))		\
190a7739bc7SMasahiro Yamada 		*(COMMON)				\
191a7739bc7SMasahiro Yamada 		BAKERY_LOCK_NORMAL			\
192a7739bc7SMasahiro Yamada 		PMF_TIMESTAMP				\
193268131c2SMasahiro Yamada 		BASE_XLAT_TABLE_BSS			\
194a7739bc7SMasahiro Yamada 		__BSS_END__ = .;			\
195a7739bc7SMasahiro Yamada 	}
196a7739bc7SMasahiro Yamada 
197665e71b8SMasahiro Yamada /*
198665e71b8SMasahiro Yamada  * The xlat_table section is for full, aligned page tables (4K).
199665e71b8SMasahiro Yamada  * Removing them from .bss avoids forcing 4K alignment on
200665e71b8SMasahiro Yamada  * the .bss section. The tables are initialized to zero by the translation
201665e71b8SMasahiro Yamada  * tables library.
202665e71b8SMasahiro Yamada  */
203665e71b8SMasahiro Yamada #define XLAT_TABLE_SECTION				\
204665e71b8SMasahiro Yamada 	xlat_table (NOLOAD) : {				\
205665e71b8SMasahiro Yamada 		*(xlat_table)				\
206665e71b8SMasahiro Yamada 	}
207665e71b8SMasahiro Yamada 
208665e71b8SMasahiro Yamada #endif /* BL_COMMON_LD_H */
209