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 149fb288a0SMasahiro Yamada #else 159fb288a0SMasahiro Yamada #define STRUCT_ALIGN 4 169fb288a0SMasahiro Yamada #endif 179fb288a0SMasahiro Yamada 189fb288a0SMasahiro Yamada #define CPU_OPS \ 199fb288a0SMasahiro Yamada . = ALIGN(STRUCT_ALIGN); \ 209fb288a0SMasahiro Yamada __CPU_OPS_START__ = .; \ 219fb288a0SMasahiro Yamada KEEP(*(cpu_ops)) \ 229fb288a0SMasahiro Yamada __CPU_OPS_END__ = .; 239fb288a0SMasahiro Yamada 249fb288a0SMasahiro Yamada #define PARSER_LIB_DESCS \ 259fb288a0SMasahiro Yamada . = ALIGN(STRUCT_ALIGN); \ 269fb288a0SMasahiro Yamada __PARSER_LIB_DESCS_START__ = .; \ 279fb288a0SMasahiro Yamada KEEP(*(.img_parser_lib_descs)) \ 289fb288a0SMasahiro Yamada __PARSER_LIB_DESCS_END__ = .; 299fb288a0SMasahiro Yamada 309fb288a0SMasahiro Yamada #define RT_SVC_DESCS \ 319fb288a0SMasahiro Yamada . = ALIGN(STRUCT_ALIGN); \ 329fb288a0SMasahiro Yamada __RT_SVC_DESCS_START__ = .; \ 339fb288a0SMasahiro Yamada KEEP(*(rt_svc_descs)) \ 349fb288a0SMasahiro Yamada __RT_SVC_DESCS_END__ = .; 359fb288a0SMasahiro Yamada 369fb288a0SMasahiro Yamada #define PMF_SVC_DESCS \ 379fb288a0SMasahiro Yamada . = ALIGN(STRUCT_ALIGN); \ 389fb288a0SMasahiro Yamada __PMF_SVC_DESCS_START__ = .; \ 399fb288a0SMasahiro Yamada KEEP(*(pmf_svc_descs)) \ 409fb288a0SMasahiro Yamada __PMF_SVC_DESCS_END__ = .; 419fb288a0SMasahiro Yamada 429fb288a0SMasahiro Yamada #define FCONF_POPULATOR \ 439fb288a0SMasahiro Yamada . = ALIGN(STRUCT_ALIGN); \ 449fb288a0SMasahiro Yamada __FCONF_POPULATOR_START__ = .; \ 459fb288a0SMasahiro Yamada KEEP(*(.fconf_populator)) \ 469fb288a0SMasahiro Yamada __FCONF_POPULATOR_END__ = .; 479fb288a0SMasahiro Yamada 489fb288a0SMasahiro Yamada /* 499fb288a0SMasahiro Yamada * Keep the .got section in the RO section as it is patched prior to enabling 509fb288a0SMasahiro Yamada * the MMU and having the .got in RO is better for security. GOT is a table of 519fb288a0SMasahiro Yamada * addresses so ensure pointer size alignment. 529fb288a0SMasahiro Yamada */ 539fb288a0SMasahiro Yamada #define GOT \ 549fb288a0SMasahiro Yamada . = ALIGN(STRUCT_ALIGN); \ 559fb288a0SMasahiro Yamada __GOT_START__ = .; \ 569fb288a0SMasahiro Yamada *(.got) \ 579fb288a0SMasahiro Yamada __GOT_END__ = .; 589fb288a0SMasahiro Yamada 59*0a0a7a9aSMasahiro Yamada #define RODATA_COMMON \ 60*0a0a7a9aSMasahiro Yamada RT_SVC_DESCS \ 61*0a0a7a9aSMasahiro Yamada FCONF_POPULATOR \ 62*0a0a7a9aSMasahiro Yamada PMF_SVC_DESCS \ 63*0a0a7a9aSMasahiro Yamada PARSER_LIB_DESCS \ 64*0a0a7a9aSMasahiro Yamada CPU_OPS \ 65*0a0a7a9aSMasahiro Yamada GOT 66*0a0a7a9aSMasahiro Yamada 679fb288a0SMasahiro Yamada #define STACK_SECTION \ 689fb288a0SMasahiro Yamada stacks (NOLOAD) : { \ 699fb288a0SMasahiro Yamada __STACKS_START__ = .; \ 709fb288a0SMasahiro Yamada *(tzfw_normal_stacks) \ 719fb288a0SMasahiro Yamada __STACKS_END__ = .; \ 729fb288a0SMasahiro Yamada } 739fb288a0SMasahiro Yamada 749fb288a0SMasahiro Yamada /* 759fb288a0SMasahiro Yamada * If BL doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__ 769fb288a0SMasahiro Yamada * will be zero. For this reason, the only two valid values for 779fb288a0SMasahiro Yamada * __PERCPU_BAKERY_LOCK_SIZE__ are 0 or the platform defined value 789fb288a0SMasahiro Yamada * PLAT_PERCPU_BAKERY_LOCK_SIZE. 799fb288a0SMasahiro Yamada */ 809fb288a0SMasahiro Yamada #ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE 819fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK \ 829fb288a0SMasahiro Yamada ASSERT((__PERCPU_BAKERY_LOCK_SIZE__ == 0) || \ 839fb288a0SMasahiro Yamada (__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE), \ 849fb288a0SMasahiro Yamada "PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements"); 859fb288a0SMasahiro Yamada #else 869fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK 879fb288a0SMasahiro Yamada #endif 889fb288a0SMasahiro Yamada 899fb288a0SMasahiro Yamada /* 909fb288a0SMasahiro Yamada * Bakery locks are stored in normal .bss memory 919fb288a0SMasahiro Yamada * 929fb288a0SMasahiro Yamada * Each lock's data is spread across multiple cache lines, one per CPU, 939fb288a0SMasahiro Yamada * but multiple locks can share the same cache line. 949fb288a0SMasahiro Yamada * The compiler will allocate enough memory for one CPU's bakery locks, 959fb288a0SMasahiro Yamada * the remaining cache lines are allocated by the linker script 969fb288a0SMasahiro Yamada */ 979fb288a0SMasahiro Yamada #if !USE_COHERENT_MEM 989fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL \ 999fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1009fb288a0SMasahiro Yamada __BAKERY_LOCK_START__ = .; \ 1019fb288a0SMasahiro Yamada __PERCPU_BAKERY_LOCK_START__ = .; \ 1029fb288a0SMasahiro Yamada *(bakery_lock) \ 1039fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1049fb288a0SMasahiro Yamada __PERCPU_BAKERY_LOCK_END__ = .; \ 1059fb288a0SMasahiro Yamada __PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__); \ 1069fb288a0SMasahiro Yamada . = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \ 1079fb288a0SMasahiro Yamada __BAKERY_LOCK_END__ = .; \ 1089fb288a0SMasahiro Yamada BAKERY_LOCK_SIZE_CHECK 1099fb288a0SMasahiro Yamada #else 1109fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL 1119fb288a0SMasahiro Yamada #endif 1129fb288a0SMasahiro Yamada 1139fb288a0SMasahiro Yamada /* 1149fb288a0SMasahiro Yamada * Time-stamps are stored in normal .bss memory 1159fb288a0SMasahiro Yamada * 1169fb288a0SMasahiro Yamada * The compiler will allocate enough memory for one CPU's time-stamps, 1179fb288a0SMasahiro Yamada * the remaining memory for other CPUs is allocated by the 1189fb288a0SMasahiro Yamada * linker script 1199fb288a0SMasahiro Yamada */ 1209fb288a0SMasahiro Yamada #define PMF_TIMESTAMP \ 1219fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1229fb288a0SMasahiro Yamada __PMF_TIMESTAMP_START__ = .; \ 1239fb288a0SMasahiro Yamada KEEP(*(pmf_timestamp_array)) \ 1249fb288a0SMasahiro Yamada . = ALIGN(CACHE_WRITEBACK_GRANULE); \ 1259fb288a0SMasahiro Yamada __PMF_PERCPU_TIMESTAMP_END__ = .; \ 1269fb288a0SMasahiro Yamada __PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__); \ 1279fb288a0SMasahiro Yamada . = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \ 1289fb288a0SMasahiro Yamada __PMF_TIMESTAMP_END__ = .; 1299fb288a0SMasahiro Yamada 130665e71b8SMasahiro Yamada /* 131665e71b8SMasahiro Yamada * The xlat_table section is for full, aligned page tables (4K). 132665e71b8SMasahiro Yamada * Removing them from .bss avoids forcing 4K alignment on 133665e71b8SMasahiro Yamada * the .bss section. The tables are initialized to zero by the translation 134665e71b8SMasahiro Yamada * tables library. 135665e71b8SMasahiro Yamada */ 136665e71b8SMasahiro Yamada #define XLAT_TABLE_SECTION \ 137665e71b8SMasahiro Yamada xlat_table (NOLOAD) : { \ 138665e71b8SMasahiro Yamada *(xlat_table) \ 139665e71b8SMasahiro Yamada } 140665e71b8SMasahiro Yamada 141665e71b8SMasahiro Yamada #endif /* BL_COMMON_LD_H */ 142