blob: d2379902916613e8b812913f3fb16c2b96d717dc [file] [log] [blame]
Roberto Vargase0e99462017-10-30 14:43:43 +00001/*
Masahiro Yamada0b67e562020-03-09 17:39:48 +09002 * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
Roberto Vargase0e99462017-10-30 14:43:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
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>
Roberto Vargase0e99462017-10-30 14:43:43 +00009
10OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
11OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
12ENTRY(bl2_entrypoint)
13
14MEMORY {
Jiafei Pan43a7bf42018-03-21 07:20:09 +000015#if BL2_IN_XIP_MEM
16 ROM (rx): ORIGIN = BL2_RO_BASE, LENGTH = BL2_RO_LIMIT - BL2_RO_BASE
17 RAM (rwx): ORIGIN = BL2_RW_BASE, LENGTH = BL2_RW_LIMIT - BL2_RW_BASE
18#else
Roberto Vargase0e99462017-10-30 14:43:43 +000019 RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_LIMIT - BL2_BASE
Jiafei Pan43a7bf42018-03-21 07:20:09 +000020#endif
Roberto Vargase0e99462017-10-30 14:43:43 +000021}
22
Masahiro Yamada5289b672019-06-14 17:49:17 +090023#if !BL2_IN_XIP_MEM
24#define ROM RAM
25#endif
Roberto Vargase0e99462017-10-30 14:43:43 +000026
27SECTIONS
28{
Jiafei Pan43a7bf42018-03-21 07:20:09 +000029#if BL2_IN_XIP_MEM
30 . = BL2_RO_BASE;
31 ASSERT(. == ALIGN(PAGE_SIZE),
32 "BL2_RO_BASE address is not aligned on a page boundary.")
33#else
Roberto Vargase0e99462017-10-30 14:43:43 +000034 . = BL2_BASE;
35 ASSERT(. == ALIGN(PAGE_SIZE),
36 "BL2_BASE address is not aligned on a page boundary.")
Jiafei Pan43a7bf42018-03-21 07:20:09 +000037#endif
Roberto Vargase0e99462017-10-30 14:43:43 +000038
39#if SEPARATE_CODE_AND_RODATA
40 .text . : {
41 __TEXT_START__ = .;
Roberto Vargas51abc342017-11-17 10:51:54 +000042 __TEXT_RESIDENT_START__ = .;
43 *bl2_el3_entrypoint.o(.text*)
44 *(.text.asm.*)
45 __TEXT_RESIDENT_END__ = .;
Samuel Holland23f5e542019-10-20 16:11:25 -050046 *(SORT_BY_ALIGNMENT(.text*))
Roberto Vargase0e99462017-10-30 14:43:43 +000047 *(.vectors)
Roberto Vargasd93fde32018-04-11 11:53:31 +010048 . = ALIGN(PAGE_SIZE);
Roberto Vargase0e99462017-10-30 14:43:43 +000049 __TEXT_END__ = .;
Jiafei Pan43a7bf42018-03-21 07:20:09 +000050 } >ROM
Roberto Vargase0e99462017-10-30 14:43:43 +000051
52 .rodata . : {
53 __RODATA_START__ = .;
Samuel Holland23f5e542019-10-20 16:11:25 -050054 *(SORT_BY_ALIGNMENT(.rodata*))
Roberto Vargase0e99462017-10-30 14:43:43 +000055
Masahiro Yamadaac1bfb92020-03-26 10:51:39 +090056 PARSER_LIB_DESCS
57 CPU_OPS
58 GOT
Masahiro Yamada65d699d2020-01-17 13:45:02 +090059
Roberto Vargasd93fde32018-04-11 11:53:31 +010060 . = ALIGN(PAGE_SIZE);
Roberto Vargase0e99462017-10-30 14:43:43 +000061 __RODATA_END__ = .;
Jiafei Pan43a7bf42018-03-21 07:20:09 +000062 } >ROM
Roberto Vargas51abc342017-11-17 10:51:54 +000063
64 ASSERT(__TEXT_RESIDENT_END__ - __TEXT_RESIDENT_START__ <= PAGE_SIZE,
65 "Resident part of BL2 has exceeded its limit.")
Roberto Vargase0e99462017-10-30 14:43:43 +000066#else
67 ro . : {
68 __RO_START__ = .;
Roberto Vargas51abc342017-11-17 10:51:54 +000069 __TEXT_RESIDENT_START__ = .;
70 *bl2_el3_entrypoint.o(.text*)
71 *(.text.asm.*)
72 __TEXT_RESIDENT_END__ = .;
Samuel Holland23f5e542019-10-20 16:11:25 -050073 *(SORT_BY_ALIGNMENT(.text*))
74 *(SORT_BY_ALIGNMENT(.rodata*))
Roberto Vargase0e99462017-10-30 14:43:43 +000075
Masahiro Yamadaac1bfb92020-03-26 10:51:39 +090076 CPU_OPS
77 PARSER_LIB_DESCS
78 GOT
Masahiro Yamada65d699d2020-01-17 13:45:02 +090079
Roberto Vargase0e99462017-10-30 14:43:43 +000080 *(.vectors)
81 __RO_END_UNALIGNED__ = .;
82 /*
83 * Memory page(s) mapped to this section will be marked as
84 * read-only, executable. No RW data from the next section must
85 * creep in. Ensure the rest of the current memory page is unused.
86 */
Roberto Vargasd93fde32018-04-11 11:53:31 +010087 . = ALIGN(PAGE_SIZE);
Roberto Vargase0e99462017-10-30 14:43:43 +000088
89 __RO_END__ = .;
Jiafei Pan43a7bf42018-03-21 07:20:09 +000090 } >ROM
Jiafei Pan43a7bf42018-03-21 07:20:09 +000091#endif
Roberto Vargase0e99462017-10-30 14:43:43 +000092
93 ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
94 "cpu_ops not defined for this platform.")
95
Jiafei Pan43a7bf42018-03-21 07:20:09 +000096#if BL2_IN_XIP_MEM
97 . = BL2_RW_BASE;
98 ASSERT(BL2_RW_BASE == ALIGN(PAGE_SIZE),
99 "BL2_RW_BASE address is not aligned on a page boundary.")
100#endif
101
Roberto Vargase0e99462017-10-30 14:43:43 +0000102 /*
103 * Define a linker symbol to mark start of the RW memory area for this
104 * image.
105 */
106 __RW_START__ = . ;
107
108 /*
109 * .data must be placed at a lower address than the stacks if the stack
110 * protector is enabled. Alternatively, the .data.stack_protector_canary
111 * section can be placed independently of the main .data section.
112 */
113 .data . : {
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000114 __DATA_RAM_START__ = .;
Samuel Holland23f5e542019-10-20 16:11:25 -0500115 *(SORT_BY_ALIGNMENT(.data*))
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000116 __DATA_RAM_END__ = .;
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000117 } >RAM AT>ROM
Roberto Vargase0e99462017-10-30 14:43:43 +0000118
Masahiro Yamada65d699d2020-01-17 13:45:02 +0900119 /*
120 * .rela.dyn needs to come after .data for the read-elf utility to parse
121 * this section correctly. Ensure 8-byte alignment so that the fields of
122 * RELA data structure are aligned.
123 */
124 . = ALIGN(8);
125 __RELA_START__ = .;
126 .rela.dyn . : {
127 } >RAM
128 __RELA_END__ = .;
129
Roberto Vargase0e99462017-10-30 14:43:43 +0000130 stacks (NOLOAD) : {
131 __STACKS_START__ = .;
132 *(tzfw_normal_stacks)
133 __STACKS_END__ = .;
134 } >RAM
135
136 /*
137 * The .bss section gets initialised to 0 at runtime.
138 * Its base address should be 16-byte aligned for better performance of the
139 * zero-initialization code.
140 */
141 .bss : ALIGN(16) {
142 __BSS_START__ = .;
143 *(SORT_BY_ALIGNMENT(.bss*))
144 *(COMMON)
145 __BSS_END__ = .;
146 } >RAM
147
Masahiro Yamada0b67e562020-03-09 17:39:48 +0900148 XLAT_TABLE_SECTION >RAM
Roberto Vargase0e99462017-10-30 14:43:43 +0000149
150#if USE_COHERENT_MEM
151 /*
152 * The base address of the coherent memory section must be page-aligned (4K)
153 * to guarantee that the coherent data are stored on their own pages and
154 * are not mixed with normal data. This is required to set up the correct
155 * memory attributes for the coherent data page tables.
156 */
157 coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
158 __COHERENT_RAM_START__ = .;
159 *(tzfw_coherent_mem)
160 __COHERENT_RAM_END_UNALIGNED__ = .;
161 /*
162 * Memory page(s) mapped to this section will be marked
163 * as device memory. No other unexpected data must creep in.
164 * Ensure the rest of the current memory page is unused.
165 */
Roberto Vargasd93fde32018-04-11 11:53:31 +0100166 . = ALIGN(PAGE_SIZE);
Roberto Vargase0e99462017-10-30 14:43:43 +0000167 __COHERENT_RAM_END__ = .;
168 } >RAM
169#endif
170
171 /*
172 * Define a linker symbol to mark end of the RW memory area for this
173 * image.
174 */
175 __RW_END__ = .;
176 __BL2_END__ = .;
177
Masahiro Yamada65d699d2020-01-17 13:45:02 +0900178 /DISCARD/ : {
179 *(.dynsym .dynstr .hash .gnu.hash)
180 }
181
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000182#if BL2_IN_XIP_MEM
183 __BL2_RAM_START__ = ADDR(.data);
184 __BL2_RAM_END__ = .;
185
186 __DATA_ROM_START__ = LOADADDR(.data);
187 __DATA_SIZE__ = SIZEOF(.data);
188
189 /*
190 * The .data section is the last PROGBITS section so its end marks the end
191 * of BL2's RO content in XIP memory..
192 */
193 __BL2_ROM_END__ = __DATA_ROM_START__ + __DATA_SIZE__;
194 ASSERT(__BL2_ROM_END__ <= BL2_RO_LIMIT,
195 "BL2's RO content has exceeded its limit.")
196#endif
Roberto Vargase0e99462017-10-30 14:43:43 +0000197 __BSS_SIZE__ = SIZEOF(.bss);
198
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000199
Roberto Vargase0e99462017-10-30 14:43:43 +0000200#if USE_COHERENT_MEM
201 __COHERENT_RAM_UNALIGNED_SIZE__ =
202 __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
203#endif
204
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000205#if BL2_IN_XIP_MEM
206 ASSERT(. <= BL2_RW_LIMIT, "BL2's RW content has exceeded its limit.")
207#else
Roberto Vargase0e99462017-10-30 14:43:43 +0000208 ASSERT(. <= BL2_LIMIT, "BL2 image has exceeded its limit.")
Jiafei Pan43a7bf42018-03-21 07:20:09 +0000209#endif
Roberto Vargase0e99462017-10-30 14:43:43 +0000210}