blob: da60c63a79cc55c3cb7cc4de21509714a118c2f3 [file] [log] [blame]
Achin Gupta7c88f3f2014-02-18 18:09:12 +00001/*
Masahiro Yamadade634f82020-01-17 13:45:14 +09002 * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
Achin Gupta7c88f3f2014-02-18 18:09:12 +00003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta7c88f3f2014-02-18 18:09:12 +00005 */
6
Masahiro Yamada0b67e562020-03-09 17:39:48 +09007#include <common/bl_common.ld.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008#include <lib/xlat_tables/xlat_tables_defs.h>
Dan Handleyed6ff952014-05-14 17:44:19 +01009#include <platform_def.h>
Achin Gupta7c88f3f2014-02-18 18:09:12 +000010
11OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
12OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
Jeenu Viswambharan2a30a752014-03-11 11:06:45 +000013ENTRY(tsp_entrypoint)
14
Achin Gupta7c88f3f2014-02-18 18:09:12 +000015
16MEMORY {
Sandrine Bailleux5ac3cc92014-05-20 17:22:24 +010017 RAM (rwx): ORIGIN = TSP_SEC_MEM_BASE, LENGTH = TSP_SEC_MEM_SIZE
Achin Gupta7c88f3f2014-02-18 18:09:12 +000018}
19
20
21SECTIONS
22{
23 . = BL32_BASE;
Antonio Nino Diaz2ce2b092017-11-15 11:45:35 +000024 ASSERT(. == ALIGN(PAGE_SIZE),
Achin Gupta7c88f3f2014-02-18 18:09:12 +000025 "BL32_BASE address is not aligned on a page boundary.")
26
Sandrine Bailleuxf91f1442016-07-08 14:37:40 +010027#if SEPARATE_CODE_AND_RODATA
28 .text . : {
29 __TEXT_START__ = .;
30 *tsp_entrypoint.o(.text*)
31 *(.text*)
32 *(.vectors)
Roberto Vargasd93fde32018-04-11 11:53:31 +010033 . = ALIGN(PAGE_SIZE);
Sandrine Bailleuxf91f1442016-07-08 14:37:40 +010034 __TEXT_END__ = .;
35 } >RAM
36
37 .rodata . : {
38 __RODATA_START__ = .;
39 *(.rodata*)
Masahiro Yamadade634f82020-01-17 13:45:14 +090040
41 /*
42 * Keep the .got section in the RO section as it is patched
43 * prior to enabling the MMU and having the .got in RO is better for
44 * security. GOT is a table of addresses so ensure 8-byte alignment.
45 */
46 . = ALIGN(8);
47 __GOT_START__ = .;
48 *(.got)
49 __GOT_END__ = .;
50
Roberto Vargasd93fde32018-04-11 11:53:31 +010051 . = ALIGN(PAGE_SIZE);
Sandrine Bailleuxf91f1442016-07-08 14:37:40 +010052 __RODATA_END__ = .;
53 } >RAM
54#else
Achin Gupta7c88f3f2014-02-18 18:09:12 +000055 ro . : {
56 __RO_START__ = .;
Andrew Thoelkee01ea342014-03-18 07:13:52 +000057 *tsp_entrypoint.o(.text*)
58 *(.text*)
Achin Gupta7c88f3f2014-02-18 18:09:12 +000059 *(.rodata*)
Masahiro Yamadade634f82020-01-17 13:45:14 +090060
61 /*
62 * Keep the .got section in the RO section as it is patched
63 * prior to enabling the MMU and having the .got in RO is better for
64 * security. GOT is a table of addresses so ensure 8-byte alignment.
65 */
66 . = ALIGN(8);
67 __GOT_START__ = .;
68 *(.got)
69 __GOT_END__ = .;
70
Achin Gupta7c88f3f2014-02-18 18:09:12 +000071 *(.vectors)
Masahiro Yamadade634f82020-01-17 13:45:14 +090072
Achin Gupta7c88f3f2014-02-18 18:09:12 +000073 __RO_END_UNALIGNED__ = .;
74 /*
75 * Memory page(s) mapped to this section will be marked as
76 * read-only, executable. No RW data from the next section must
77 * creep in. Ensure the rest of the current memory page is unused.
78 */
Roberto Vargasd93fde32018-04-11 11:53:31 +010079 . = ALIGN(PAGE_SIZE);
Achin Gupta7c88f3f2014-02-18 18:09:12 +000080 __RO_END__ = .;
81 } >RAM
Sandrine Bailleuxf91f1442016-07-08 14:37:40 +010082#endif
Achin Gupta7c88f3f2014-02-18 18:09:12 +000083
Achin Guptae9c4a642015-09-11 16:03:13 +010084 /*
85 * Define a linker symbol to mark start of the RW memory area for this
86 * image.
87 */
88 __RW_START__ = . ;
89
Achin Gupta7c88f3f2014-02-18 18:09:12 +000090 .data . : {
91 __DATA_START__ = .;
Andrew Thoelkee01ea342014-03-18 07:13:52 +000092 *(.data*)
Achin Gupta7c88f3f2014-02-18 18:09:12 +000093 __DATA_END__ = .;
94 } >RAM
95
Masahiro Yamadade634f82020-01-17 13:45:14 +090096 /*
97 * .rela.dyn needs to come after .data for the read-elf utility to parse
98 * this section correctly. Ensure 8-byte alignment so that the fields of
99 * RELA data structure are aligned.
100 */
101 . = ALIGN(8);
102 __RELA_START__ = .;
103 .rela.dyn . : {
104 } >RAM
105 __RELA_END__ = .;
106
Dan Handley4fd2f5c2014-08-04 11:41:20 +0100107#ifdef TSP_PROGBITS_LIMIT
108 ASSERT(. <= TSP_PROGBITS_LIMIT, "TSP progbits has exceeded its limit.")
Sandrine Bailleuxe2e0c652014-06-16 16:12:27 +0100109#endif
110
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000111 stacks (NOLOAD) : {
112 __STACKS_START__ = .;
113 *(tzfw_normal_stacks)
114 __STACKS_END__ = .;
115 } >RAM
116
117 /*
118 * The .bss section gets initialised to 0 at runtime.
Douglas Raillard21362a92016-12-02 13:51:54 +0000119 * Its base address should be 16-byte aligned for better performance of the
120 * zero-initialization code.
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000121 */
122 .bss : ALIGN(16) {
123 __BSS_START__ = .;
Andrew Thoelkee01ea342014-03-18 07:13:52 +0000124 *(SORT_BY_ALIGNMENT(.bss*))
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000125 *(COMMON)
126 __BSS_END__ = .;
127 } >RAM
128
Masahiro Yamada0b67e562020-03-09 17:39:48 +0900129 XLAT_TABLE_SECTION >RAM
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000130
Soby Mathew2ae20432015-01-08 18:02:44 +0000131#if USE_COHERENT_MEM
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000132 /*
133 * The base address of the coherent memory section must be page-aligned (4K)
134 * to guarantee that the coherent data are stored on their own pages and
135 * are not mixed with normal data. This is required to set up the correct
136 * memory attributes for the coherent data page tables.
137 */
Antonio Nino Diaz2ce2b092017-11-15 11:45:35 +0000138 coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000139 __COHERENT_RAM_START__ = .;
140 *(tzfw_coherent_mem)
141 __COHERENT_RAM_END_UNALIGNED__ = .;
142 /*
143 * Memory page(s) mapped to this section will be marked
144 * as device memory. No other unexpected data must creep in.
145 * Ensure the rest of the current memory page is unused.
146 */
Roberto Vargasd93fde32018-04-11 11:53:31 +0100147 . = ALIGN(PAGE_SIZE);
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000148 __COHERENT_RAM_END__ = .;
149 } >RAM
Soby Mathew2ae20432015-01-08 18:02:44 +0000150#endif
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000151
Achin Guptae9c4a642015-09-11 16:03:13 +0100152 /*
153 * Define a linker symbol to mark the end of the RW memory area for this
154 * image.
155 */
156 __RW_END__ = .;
Sandrine Bailleuxe701e302014-05-20 17:28:25 +0100157 __BL32_END__ = .;
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000158
Masahiro Yamadade634f82020-01-17 13:45:14 +0900159 /DISCARD/ : {
160 *(.dynsym .dynstr .hash .gnu.hash)
161 }
162
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000163 __BSS_SIZE__ = SIZEOF(.bss);
Soby Mathew2ae20432015-01-08 18:02:44 +0000164#if USE_COHERENT_MEM
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000165 __COHERENT_RAM_UNALIGNED_SIZE__ =
166 __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
Soby Mathew2ae20432015-01-08 18:02:44 +0000167#endif
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000168
Juan Castillo7d199412015-12-14 09:35:25 +0000169 ASSERT(. <= BL32_LIMIT, "BL32 image has exceeded its limit.")
Achin Gupta7c88f3f2014-02-18 18:09:12 +0000170}