mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00
linker_script: move more common code to bl_common.ld.h
These are mostly used to collect data from special structure, and repeated in many linker scripts. To differentiate the alignment size between aarch32/aarch64, I added a new macro STRUCT_ALIGN. While I moved the PMF_SVC_DESCS, I dropped #if ENABLE_PMF conditional. As you can see in include/lib/pmf/pmf_helpers.h, PMF_REGISTER_SERVICE* are no-op when ENABLE_PMF=0. So, pmf_svc_descs and pmf_timestamp_array data are not populated. Change-Id: I3f4ab7fa18f76339f1789103407ba76bda7e56d0 Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
This commit is contained in:
parent
0a43db84af
commit
9fb288a03e
8 changed files with 152 additions and 373 deletions
34
bl1/bl1.ld.S
34
bl1/bl1.ld.S
|
@ -4,8 +4,6 @@
|
|||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
|
@ -47,20 +45,8 @@ SECTIONS
|
|||
__RODATA_START__ = .;
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PARSER_LIB_DESCS_START__ = .;
|
||||
KEEP(*(.img_parser_lib_descs))
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
PARSER_LIB_DESCS
|
||||
CPU_OPS
|
||||
|
||||
/*
|
||||
* No need to pad out the .rodata section to a page boundary. Next is
|
||||
|
@ -81,20 +67,8 @@ SECTIONS
|
|||
*(SORT_BY_ALIGNMENT(.text*))
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PARSER_LIB_DESCS_START__ = .;
|
||||
KEEP(*(.img_parser_lib_descs))
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
PARSER_LIB_DESCS
|
||||
CPU_OPS
|
||||
|
||||
*(.vectors)
|
||||
__RO_END__ = .;
|
||||
|
|
26
bl2/bl2.ld.S
26
bl2/bl2.ld.S
|
@ -4,8 +4,6 @@
|
|||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
|
@ -47,16 +45,8 @@ SECTIONS
|
|||
__RODATA_START__ = .;
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
. = ALIGN(8);
|
||||
__FCONF_POPULATOR_START__ = .;
|
||||
KEEP(*(.fconf_populator))
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PARSER_LIB_DESCS_START__ = .;
|
||||
KEEP(*(.img_parser_lib_descs))
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
FCONF_POPULATOR
|
||||
PARSER_LIB_DESCS
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__RODATA_END__ = .;
|
||||
|
@ -68,16 +58,8 @@ SECTIONS
|
|||
*(SORT_BY_ALIGNMENT(.text*))
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
. = ALIGN(8);
|
||||
__FCONF_POPULATOR_START__ = .;
|
||||
KEEP(*(.fconf_populator))
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PARSER_LIB_DESCS_START__ = .;
|
||||
KEEP(*(.img_parser_lib_descs))
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
FCONF_POPULATOR
|
||||
PARSER_LIB_DESCS
|
||||
|
||||
*(.vectors)
|
||||
__RO_END_UNALIGNED__ = .;
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
|
@ -55,30 +53,9 @@ SECTIONS
|
|||
__RODATA_START__ = .;
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PARSER_LIB_DESCS_START__ = .;
|
||||
KEEP(*(.img_parser_lib_descs))
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched
|
||||
* prior to enabling the MMU and having the .got in RO is better for
|
||||
* security. GOT is a table of addresses so ensure 8-byte alignment.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__GOT_START__ = .;
|
||||
*(.got)
|
||||
__GOT_END__ = .;
|
||||
PARSER_LIB_DESCS
|
||||
CPU_OPS
|
||||
GOT
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__RODATA_END__ = .;
|
||||
|
@ -96,30 +73,9 @@ SECTIONS
|
|||
*(SORT_BY_ALIGNMENT(.text*))
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PARSER_LIB_DESCS_START__ = .;
|
||||
KEEP(*(.img_parser_lib_descs))
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched
|
||||
* prior to enabling the MMU and having the .got in RO is better for
|
||||
* security. GOT is a table of addresses so ensure 8-byte alignment.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__GOT_START__ = .;
|
||||
*(.got)
|
||||
__GOT_END__ = .;
|
||||
CPU_OPS
|
||||
PARSER_LIB_DESCS
|
||||
GOT
|
||||
|
||||
*(.vectors)
|
||||
__RO_END_UNALIGNED__ = .;
|
||||
|
|
136
bl31/bl31.ld.S
136
bl31/bl31.ld.S
|
@ -4,8 +4,6 @@
|
|||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
|
@ -49,43 +47,11 @@ SECTIONS
|
|||
__RODATA_START__ = .;
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__RT_SVC_DESCS_START__ = .;
|
||||
KEEP(*(rt_svc_descs))
|
||||
__RT_SVC_DESCS_END__ = .;
|
||||
|
||||
. = ALIGN(8);
|
||||
__FCONF_POPULATOR_START__ = .;
|
||||
KEEP(*(.fconf_populator))
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
#if ENABLE_PMF
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PMF_SVC_DESCS_START__ = .;
|
||||
KEEP(*(pmf_svc_descs))
|
||||
__PMF_SVC_DESCS_END__ = .;
|
||||
#endif /* ENABLE_PMF */
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched
|
||||
* prior to enabling the MMU and having the .got in RO is better for
|
||||
* security. GOT is a table of addresses so ensure 8-byte alignment.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__GOT_START__ = .;
|
||||
*(.got)
|
||||
__GOT_END__ = .;
|
||||
RT_SVC_DESCS
|
||||
FCONF_POPULATOR
|
||||
PMF_SVC_DESCS
|
||||
CPU_OPS
|
||||
GOT
|
||||
|
||||
/* Place pubsub sections for events */
|
||||
. = ALIGN(8);
|
||||
|
@ -101,43 +67,11 @@ SECTIONS
|
|||
*(SORT_BY_ALIGNMENT(.text*))
|
||||
*(SORT_BY_ALIGNMENT(.rodata*))
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__RT_SVC_DESCS_START__ = .;
|
||||
KEEP(*(rt_svc_descs))
|
||||
__RT_SVC_DESCS_END__ = .;
|
||||
|
||||
. = ALIGN(8);
|
||||
__FCONF_POPULATOR_START__ = .;
|
||||
KEEP(*(.fconf_populator))
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
#if ENABLE_PMF
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__PMF_SVC_DESCS_START__ = .;
|
||||
KEEP(*(pmf_svc_descs))
|
||||
__PMF_SVC_DESCS_END__ = .;
|
||||
#endif /* ENABLE_PMF */
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched
|
||||
* prior to enabling the MMU and having the .got in RO is better for
|
||||
* security. GOT is a table of addresses so ensure 8-byte alignment.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__GOT_START__ = .;
|
||||
*(.got)
|
||||
__GOT_END__ = .;
|
||||
RT_SVC_DESCS
|
||||
FCONF_POPULATOR
|
||||
PMF_SVC_DESCS
|
||||
CPU_OPS
|
||||
GOT
|
||||
|
||||
/* Place pubsub sections for events */
|
||||
. = ALIGN(8);
|
||||
|
@ -247,54 +181,8 @@ SECTIONS
|
|||
__BSS_START__ = .;
|
||||
*(SORT_BY_ALIGNMENT(.bss*))
|
||||
*(COMMON)
|
||||
#if !USE_COHERENT_MEM
|
||||
/*
|
||||
* Bakery locks are stored in normal .bss memory
|
||||
*
|
||||
* Each lock's data is spread across multiple cache lines, one per CPU,
|
||||
* but multiple locks can share the same cache line.
|
||||
* The compiler will allocate enough memory for one CPU's bakery locks,
|
||||
* the remaining cache lines are allocated by the linker script
|
||||
*/
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__BAKERY_LOCK_START__ = .;
|
||||
__PERCPU_BAKERY_LOCK_START__ = .;
|
||||
*(bakery_lock)
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PERCPU_BAKERY_LOCK_END__ = .;
|
||||
__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__);
|
||||
. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1));
|
||||
__BAKERY_LOCK_END__ = .;
|
||||
|
||||
/*
|
||||
* If BL31 doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__
|
||||
* will be zero. For this reason, the only two valid values for
|
||||
* __PERCPU_BAKERY_LOCK_SIZE__ are 0 or the platform defined value
|
||||
* PLAT_PERCPU_BAKERY_LOCK_SIZE.
|
||||
*/
|
||||
#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
|
||||
ASSERT((__PERCPU_BAKERY_LOCK_SIZE__ == 0) || (__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE),
|
||||
"PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLE_PMF
|
||||
/*
|
||||
* Time-stamps are stored in normal .bss memory
|
||||
*
|
||||
* The compiler will allocate enough memory for one CPU's time-stamps,
|
||||
* the remaining memory for other CPUs is allocated by the
|
||||
* linker script
|
||||
*/
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PMF_TIMESTAMP_START__ = .;
|
||||
KEEP(*(pmf_timestamp_array))
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PMF_PERCPU_TIMESTAMP_END__ = .;
|
||||
__PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__);
|
||||
. = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1));
|
||||
__PMF_TIMESTAMP_END__ = .;
|
||||
#endif /* ENABLE_PMF */
|
||||
BAKERY_LOCK_NORMAL
|
||||
PMF_TIMESTAMP
|
||||
__BSS_END__ = .;
|
||||
} >NOBITS
|
||||
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
|
@ -50,33 +48,10 @@ SECTIONS
|
|||
__RODATA_START__ = .;
|
||||
*(.rodata*)
|
||||
|
||||
/* Ensure 4-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(4);
|
||||
__RT_SVC_DESCS_START__ = .;
|
||||
KEEP(*(rt_svc_descs))
|
||||
__RT_SVC_DESCS_END__ = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
__FCONF_POPULATOR_START__ = .;
|
||||
KEEP(*(.fconf_populator))
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
#if ENABLE_PMF
|
||||
/* Ensure 4-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(4);
|
||||
__PMF_SVC_DESCS_START__ = .;
|
||||
KEEP(*(pmf_svc_descs))
|
||||
__PMF_SVC_DESCS_END__ = .;
|
||||
#endif /* ENABLE_PMF */
|
||||
|
||||
/*
|
||||
* Ensure 4-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(4);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
RT_SVC_DESCS
|
||||
FCONF_POPULATOR
|
||||
PMF_SVC_DESCS
|
||||
CPU_OPS
|
||||
|
||||
/* Place pubsub sections for events */
|
||||
. = ALIGN(8);
|
||||
|
@ -92,25 +67,9 @@ SECTIONS
|
|||
*(.text*)
|
||||
*(.rodata*)
|
||||
|
||||
/* Ensure 4-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(4);
|
||||
__RT_SVC_DESCS_START__ = .;
|
||||
KEEP(*(rt_svc_descs))
|
||||
__RT_SVC_DESCS_END__ = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
__FCONF_POPULATOR_START__ = .;
|
||||
KEEP(*(.fconf_populator))
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
/*
|
||||
* Ensure 4-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(4);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
RT_SVC_DESCS
|
||||
FCONF_POPULATOR
|
||||
CPU_OPS
|
||||
|
||||
/* Place pubsub sections for events */
|
||||
. = ALIGN(8);
|
||||
|
@ -162,48 +121,8 @@ SECTIONS
|
|||
__BSS_START__ = .;
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
#if !USE_COHERENT_MEM
|
||||
/*
|
||||
* Bakery locks are stored in normal .bss memory
|
||||
*
|
||||
* Each lock's data is spread across multiple cache lines, one per CPU,
|
||||
* but multiple locks can share the same cache line.
|
||||
* The compiler will allocate enough memory for one CPU's bakery locks,
|
||||
* the remaining cache lines are allocated by the linker script
|
||||
*/
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__BAKERY_LOCK_START__ = .;
|
||||
__PERCPU_BAKERY_LOCK_START__ = .;
|
||||
*(bakery_lock)
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PERCPU_BAKERY_LOCK_END__ = .;
|
||||
__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__);
|
||||
. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1));
|
||||
__BAKERY_LOCK_END__ = .;
|
||||
#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
|
||||
ASSERT(__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE,
|
||||
"PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLE_PMF
|
||||
/*
|
||||
* Time-stamps are stored in normal .bss memory
|
||||
*
|
||||
* The compiler will allocate enough memory for one CPU's time-stamps,
|
||||
* the remaining memory for other CPUs is allocated by the
|
||||
* linker script
|
||||
*/
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PMF_TIMESTAMP_START__ = .;
|
||||
KEEP(*(pmf_timestamp_array))
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PMF_PERCPU_TIMESTAMP_END__ = .;
|
||||
__PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__);
|
||||
. = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1));
|
||||
__PMF_TIMESTAMP_END__ = .;
|
||||
#endif /* ENABLE_PMF */
|
||||
|
||||
BAKERY_LOCK_NORMAL
|
||||
PMF_TIMESTAMP
|
||||
__BSS_END__ = .;
|
||||
} >RAM
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
|
||||
OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
|
||||
|
@ -38,15 +37,7 @@ SECTIONS
|
|||
__RODATA_START__ = .;
|
||||
*(.rodata*)
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched
|
||||
* prior to enabling the MMU and having the .got in RO is better for
|
||||
* security. GOT is a table of addresses so ensure 8-byte alignment.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__GOT_START__ = .;
|
||||
*(.got)
|
||||
__GOT_END__ = .;
|
||||
GOT
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__RODATA_END__ = .;
|
||||
|
@ -58,15 +49,7 @@ SECTIONS
|
|||
*(.text*)
|
||||
*(.rodata*)
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched
|
||||
* prior to enabling the MMU and having the .got in RO is better for
|
||||
* security. GOT is a table of addresses so ensure 8-byte alignment.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__GOT_START__ = .;
|
||||
*(.got)
|
||||
__GOT_END__ = .;
|
||||
GOT
|
||||
|
||||
*(.vectors)
|
||||
|
||||
|
|
|
@ -7,6 +7,118 @@
|
|||
#ifndef BL_COMMON_LD_H
|
||||
#define BL_COMMON_LD_H
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#ifdef __aarch64__
|
||||
#define STRUCT_ALIGN 8
|
||||
#else
|
||||
#define STRUCT_ALIGN 4
|
||||
#endif
|
||||
|
||||
#define CPU_OPS \
|
||||
. = ALIGN(STRUCT_ALIGN); \
|
||||
__CPU_OPS_START__ = .; \
|
||||
KEEP(*(cpu_ops)) \
|
||||
__CPU_OPS_END__ = .;
|
||||
|
||||
#define PARSER_LIB_DESCS \
|
||||
. = ALIGN(STRUCT_ALIGN); \
|
||||
__PARSER_LIB_DESCS_START__ = .; \
|
||||
KEEP(*(.img_parser_lib_descs)) \
|
||||
__PARSER_LIB_DESCS_END__ = .;
|
||||
|
||||
#define RT_SVC_DESCS \
|
||||
. = ALIGN(STRUCT_ALIGN); \
|
||||
__RT_SVC_DESCS_START__ = .; \
|
||||
KEEP(*(rt_svc_descs)) \
|
||||
__RT_SVC_DESCS_END__ = .;
|
||||
|
||||
#define PMF_SVC_DESCS \
|
||||
. = ALIGN(STRUCT_ALIGN); \
|
||||
__PMF_SVC_DESCS_START__ = .; \
|
||||
KEEP(*(pmf_svc_descs)) \
|
||||
__PMF_SVC_DESCS_END__ = .;
|
||||
|
||||
#define FCONF_POPULATOR \
|
||||
. = ALIGN(STRUCT_ALIGN); \
|
||||
__FCONF_POPULATOR_START__ = .; \
|
||||
KEEP(*(.fconf_populator)) \
|
||||
__FCONF_POPULATOR_END__ = .;
|
||||
|
||||
/*
|
||||
* Keep the .got section in the RO section as it is patched prior to enabling
|
||||
* the MMU and having the .got in RO is better for security. GOT is a table of
|
||||
* addresses so ensure pointer size alignment.
|
||||
*/
|
||||
#define GOT \
|
||||
. = ALIGN(STRUCT_ALIGN); \
|
||||
__GOT_START__ = .; \
|
||||
*(.got) \
|
||||
__GOT_END__ = .;
|
||||
|
||||
#define STACK_SECTION \
|
||||
stacks (NOLOAD) : { \
|
||||
__STACKS_START__ = .; \
|
||||
*(tzfw_normal_stacks) \
|
||||
__STACKS_END__ = .; \
|
||||
}
|
||||
|
||||
/*
|
||||
* If BL doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__
|
||||
* will be zero. For this reason, the only two valid values for
|
||||
* __PERCPU_BAKERY_LOCK_SIZE__ are 0 or the platform defined value
|
||||
* PLAT_PERCPU_BAKERY_LOCK_SIZE.
|
||||
*/
|
||||
#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
|
||||
#define BAKERY_LOCK_SIZE_CHECK \
|
||||
ASSERT((__PERCPU_BAKERY_LOCK_SIZE__ == 0) || \
|
||||
(__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE), \
|
||||
"PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
|
||||
#else
|
||||
#define BAKERY_LOCK_SIZE_CHECK
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Bakery locks are stored in normal .bss memory
|
||||
*
|
||||
* Each lock's data is spread across multiple cache lines, one per CPU,
|
||||
* but multiple locks can share the same cache line.
|
||||
* The compiler will allocate enough memory for one CPU's bakery locks,
|
||||
* the remaining cache lines are allocated by the linker script
|
||||
*/
|
||||
#if !USE_COHERENT_MEM
|
||||
#define BAKERY_LOCK_NORMAL \
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE); \
|
||||
__BAKERY_LOCK_START__ = .; \
|
||||
__PERCPU_BAKERY_LOCK_START__ = .; \
|
||||
*(bakery_lock) \
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE); \
|
||||
__PERCPU_BAKERY_LOCK_END__ = .; \
|
||||
__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__); \
|
||||
. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \
|
||||
__BAKERY_LOCK_END__ = .; \
|
||||
BAKERY_LOCK_SIZE_CHECK
|
||||
#else
|
||||
#define BAKERY_LOCK_NORMAL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Time-stamps are stored in normal .bss memory
|
||||
*
|
||||
* The compiler will allocate enough memory for one CPU's time-stamps,
|
||||
* the remaining memory for other CPUs is allocated by the
|
||||
* linker script
|
||||
*/
|
||||
#define PMF_TIMESTAMP \
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE); \
|
||||
__PMF_TIMESTAMP_START__ = .; \
|
||||
KEEP(*(pmf_timestamp_array)) \
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE); \
|
||||
__PMF_PERCPU_TIMESTAMP_END__ = .; \
|
||||
__PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__); \
|
||||
. = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \
|
||||
__PMF_TIMESTAMP_END__ = .;
|
||||
|
||||
/*
|
||||
* The xlat_table section is for full, aligned page tables (4K).
|
||||
* Removing them from .bss avoids forcing 4K alignment on
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
#include <common/bl_common.ld.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
|
||||
OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
|
||||
|
@ -39,20 +38,8 @@ SECTIONS
|
|||
*(.text*)
|
||||
*(.rodata*)
|
||||
|
||||
/* Ensure 8-byte alignment for descriptors and ensure inclusion */
|
||||
. = ALIGN(8);
|
||||
__RT_SVC_DESCS_START__ = .;
|
||||
KEEP(*(rt_svc_descs))
|
||||
__RT_SVC_DESCS_END__ = .;
|
||||
|
||||
/*
|
||||
* Ensure 8-byte alignment for cpu_ops so that its fields are also
|
||||
* aligned. Also ensure cpu_ops inclusion.
|
||||
*/
|
||||
. = ALIGN(8);
|
||||
__CPU_OPS_START__ = .;
|
||||
KEEP(*(cpu_ops))
|
||||
__CPU_OPS_END__ = .;
|
||||
RT_SVC_DESCS
|
||||
CPU_OPS
|
||||
|
||||
__RO_END_UNALIGNED__ = .;
|
||||
/*
|
||||
|
@ -103,29 +90,7 @@ SECTIONS
|
|||
__BSS_START__ = .;
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
#if !USE_COHERENT_MEM
|
||||
/*
|
||||
* Bakery locks are stored in normal .bss memory
|
||||
*
|
||||
* Each lock's data is spread across multiple cache lines, one per CPU,
|
||||
* but multiple locks can share the same cache line.
|
||||
* The compiler will allocate enough memory for one CPU's bakery locks,
|
||||
* the remaining cache lines are allocated by the linker script
|
||||
*/
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__BAKERY_LOCK_START__ = .;
|
||||
__PERCPU_BAKERY_LOCK_START__ = .;
|
||||
*(bakery_lock)
|
||||
. = ALIGN(CACHE_WRITEBACK_GRANULE);
|
||||
__PERCPU_BAKERY_LOCK_END__ = .;
|
||||
__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__);
|
||||
. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1));
|
||||
__BAKERY_LOCK_END__ = .;
|
||||
#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
|
||||
ASSERT(__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE,
|
||||
"PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
|
||||
#endif
|
||||
#endif
|
||||
BAKERY_LOCK_NORMAL
|
||||
__BSS_END__ = .;
|
||||
__RW_END__ = .;
|
||||
} >RAM
|
||||
|
|
Loading…
Add table
Reference in a new issue