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 20*caa3e7e0SMasahiro Yamada #ifndef DATA_ALIGN 21*caa3e7e0SMasahiro Yamada #define DATA_ALIGN 1 22*caa3e7e0SMasahiro Yamada #endif 23*caa3e7e0SMasahiro 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 92*caa3e7e0SMasahiro Yamada /* 93*caa3e7e0SMasahiro Yamada * .data must be placed at a lower address than the stacks if the stack 94*caa3e7e0SMasahiro Yamada * protector is enabled. Alternatively, the .data.stack_protector_canary 95*caa3e7e0SMasahiro Yamada * section can be placed independently of the main .data section. 96*caa3e7e0SMasahiro Yamada */ 97*caa3e7e0SMasahiro Yamada #define DATA_SECTION \ 98*caa3e7e0SMasahiro Yamada .data . : ALIGN(DATA_ALIGN) { \ 99*caa3e7e0SMasahiro Yamada __DATA_START__ = .; \ 100*caa3e7e0SMasahiro Yamada *(SORT_BY_ALIGNMENT(.data*)) \ 101*caa3e7e0SMasahiro Yamada __DATA_END__ = .; \ 102*caa3e7e0SMasahiro Yamada } 103*caa3e7e0SMasahiro Yamada 1049fb288a0SMasahiro Yamada #define STACK_SECTION \ 1059fb288a0SMasahiro Yamada stacks (NOLOAD) : { \ 1069fb288a0SMasahiro Yamada __STACKS_START__ = .; \ 1079fb288a0SMasahiro Yamada *(tzfw_normal_stacks) \ 1089fb288a0SMasahiro Yamada __STACKS_END__ = .; \ 1099fb288a0SMasahiro Yamada } 1109fb288a0SMasahiro Yamada 1119fb288a0SMasahiro Yamada /* 1129fb288a0SMasahiro Yamada * If BL doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__ 1139fb288a0SMasahiro Yamada * will be zero. For this reason, the only two valid values for 1149fb288a0SMasahiro Yamada * __PERCPU_BAKERY_LOCK_SIZE__ are 0 or the platform defined value 1159fb288a0SMasahiro Yamada * PLAT_PERCPU_BAKERY_LOCK_SIZE. 1169fb288a0SMasahiro Yamada */ 1179fb288a0SMasahiro Yamada #ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE 1189fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK \ 1199fb288a0SMasahiro Yamada ASSERT((__PERCPU_BAKERY_LOCK_SIZE__ == 0) || \ 1209fb288a0SMasahiro Yamada (__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE), \ 1219fb288a0SMasahiro Yamada "PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements"); 1229fb288a0SMasahiro Yamada #else 1239fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK 1249fb288a0SMasahiro Yamada #endif 1259fb288a0SMasahiro Yamada 1269fb288a0SMasahiro Yamada /* 1279fb288a0SMasahiro Yamada * Bakery locks are stored in normal .bss memory 1289fb288a0SMasahiro Yamada * 1299fb288a0SMasahiro Yamada * Each lock's data is spread across multiple cache lines, one per CPU, 1309fb288a0SMasahiro Yamada * but multiple locks can share the same cache line. 1319fb288a0SMasahiro Yamada * The compiler will allocate enough memory for one CPU's bakery locks, 1329fb288a0SMasahiro Yamada * the remaining cache lines are allocated by the linker script 1339fb288a0SMasahiro Yamada */ 1349fb288a0SMasahiro Yamada #if !USE_COHERENT_MEM 1359fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL \ 1369fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1379fb288a0SMasahiro Yamada __BAKERY_LOCK_START__ = .; \ 1389fb288a0SMasahiro Yamada __PERCPU_BAKERY_LOCK_START__ = .; \ 1399fb288a0SMasahiro Yamada *(bakery_lock) \ 1409fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1419fb288a0SMasahiro Yamada __PERCPU_BAKERY_LOCK_END__ = .; \ 1429fb288a0SMasahiro Yamada __PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__); \ 1439fb288a0SMasahiro Yamada . = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \ 1449fb288a0SMasahiro Yamada __BAKERY_LOCK_END__ = .; \ 1459fb288a0SMasahiro Yamada BAKERY_LOCK_SIZE_CHECK 1469fb288a0SMasahiro Yamada #else 1479fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL 1489fb288a0SMasahiro Yamada #endif 1499fb288a0SMasahiro Yamada 1509fb288a0SMasahiro Yamada /* 1519fb288a0SMasahiro Yamada * Time-stamps are stored in normal .bss memory 1529fb288a0SMasahiro Yamada * 1539fb288a0SMasahiro Yamada * The compiler will allocate enough memory for one CPU's time-stamps, 1549fb288a0SMasahiro Yamada * the remaining memory for other CPUs is allocated by the 1559fb288a0SMasahiro Yamada * linker script 1569fb288a0SMasahiro Yamada */ 1579fb288a0SMasahiro Yamada #define PMF_TIMESTAMP \ 1589fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1599fb288a0SMasahiro Yamada __PMF_TIMESTAMP_START__ = .; \ 1609fb288a0SMasahiro Yamada KEEP(*(pmf_timestamp_array)) \ 1619fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1629fb288a0SMasahiro Yamada __PMF_PERCPU_TIMESTAMP_END__ = .; \ 1639fb288a0SMasahiro Yamada __PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__); \ 1649fb288a0SMasahiro Yamada . = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \ 1659fb288a0SMasahiro Yamada __PMF_TIMESTAMP_END__ = .; 1669fb288a0SMasahiro Yamada 167a7739bc7SMasahiro Yamada 168a7739bc7SMasahiro Yamada /* 169a7739bc7SMasahiro Yamada * The .bss section gets initialised to 0 at runtime. 170a7739bc7SMasahiro Yamada * Its base address has bigger alignment for better performance of the 171a7739bc7SMasahiro Yamada * zero-initialization code. 172a7739bc7SMasahiro Yamada */ 173a7739bc7SMasahiro Yamada #define BSS_SECTION \ 174a7739bc7SMasahiro Yamada .bss (NOLOAD) : ALIGN(BSS_ALIGN) { \ 175a7739bc7SMasahiro Yamada __BSS_START__ = .; \ 176a7739bc7SMasahiro Yamada *(SORT_BY_ALIGNMENT(.bss*)) \ 177a7739bc7SMasahiro Yamada *(COMMON) \ 178a7739bc7SMasahiro Yamada BAKERY_LOCK_NORMAL \ 179a7739bc7SMasahiro Yamada PMF_TIMESTAMP \ 180268131c2SMasahiro Yamada BASE_XLAT_TABLE_BSS \ 181a7739bc7SMasahiro Yamada __BSS_END__ = .; \ 182a7739bc7SMasahiro Yamada } 183a7739bc7SMasahiro Yamada 184665e71b8SMasahiro Yamada /* 185665e71b8SMasahiro Yamada * The xlat_table section is for full, aligned page tables (4K). 186665e71b8SMasahiro Yamada * Removing them from .bss avoids forcing 4K alignment on 187665e71b8SMasahiro Yamada * the .bss section. The tables are initialized to zero by the translation 188665e71b8SMasahiro Yamada * tables library. 189665e71b8SMasahiro Yamada */ 190665e71b8SMasahiro Yamada #define XLAT_TABLE_SECTION \ 191665e71b8SMasahiro Yamada xlat_table (NOLOAD) : { \ 192665e71b8SMasahiro Yamada *(xlat_table) \ 193665e71b8SMasahiro Yamada } 194665e71b8SMasahiro Yamada 195665e71b8SMasahiro Yamada #endif /* BL_COMMON_LD_H */ 196