blob: 91ca87cb637949c62f758ed91c6fd6dcf0fc3598 [file] [log] [blame]
developer550bf5e2016-07-11 16:05:23 +08001/*
Masahiro Yamada0b67e562020-03-09 17:39:48 +09002 * Copyright (c) 2016-2020, ARM Limited and Contributors. All rights reserved.
developer550bf5e2016-07-11 16:05:23 +08003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
developer550bf5e2016-07-11 16:05:23 +08005 */
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>
developer550bf5e2016-07-11 16:05:23 +08009
10OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
11OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
12ENTRY(bl31_entrypoint)
13
14
15MEMORY {
16 RAM (rwx): ORIGIN = BL31_BASE, LENGTH = BL31_TZRAM_SIZE
17 RAM2 (rwx): ORIGIN = TZRAM2_BASE, LENGTH = TZRAM2_SIZE
18}
19
20
21SECTIONS
22{
23 . = BL31_BASE;
24
25 ASSERT(. == ALIGN(2048),
26 "vector base is not aligned on a 2K boundary.")
27
28 __RO_START__ = .;
29 vector . : {
30 *(.vectors)
31 } >RAM
32
Antonio Nino Diaz2ce2b092017-11-15 11:45:35 +000033 ASSERT(. == ALIGN(PAGE_SIZE),
developer550bf5e2016-07-11 16:05:23 +080034 "BL31_BASE address is not aligned on a page boundary.")
35
36 ro . : {
37 *bl31_entrypoint.o(.text*)
38 *(.text*)
39 *(.rodata*)
40
Masahiro Yamada583f8dd2020-03-26 10:57:12 +090041 RODATA_COMMON
developer550bf5e2016-07-11 16:05:23 +080042
43 __RO_END_UNALIGNED__ = .;
44 /*
45 * Memory page(s) mapped to this section will be marked as read-only,
46 * executable. No RW data from the next section must creep in.
47 * Ensure the rest of the current memory page is unused.
48 */
Roberto Vargasd93fde32018-04-11 11:53:31 +010049 . = ALIGN(PAGE_SIZE);
developer550bf5e2016-07-11 16:05:23 +080050 __RO_END__ = .;
51 } >RAM
52
53 ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
54 "cpu_ops not defined for this platform.")
55
56 /*
57 * Define a linker symbol to mark start of the RW memory area for this
58 * image.
59 */
60 __RW_START__ = . ;
61
Douglas Raillard306593d2017-02-24 18:14:15 +000062 /*
63 * .data must be placed at a lower address than the stacks if the stack
64 * protector is enabled. Alternatively, the .data.stack_protector_canary
65 * section can be placed independently of the main .data section.
66 */
developer550bf5e2016-07-11 16:05:23 +080067 .data . : {
68 __DATA_START__ = .;
69 *(.data*)
70 __DATA_END__ = .;
71 } >RAM
72
73#ifdef BL31_PROGBITS_LIMIT
74 ASSERT(. <= BL31_PROGBITS_LIMIT, "BL3-1 progbits has exceeded its limit.")
75#endif
76
Masahiro Yamada403990e2020-04-07 13:04:24 +090077 STACK_SECTION >RAM
Masahiro Yamadadd053b62020-03-26 13:16:33 +090078 BSS_SECTION >RAM
79 __RW_END__ = __BSS_END__;
developer550bf5e2016-07-11 16:05:23 +080080
81 ASSERT(. <= BL31_LIMIT, "BL3-1 image has exceeded its limit.")
82
Masahiro Yamada0b67e562020-03-09 17:39:48 +090083 XLAT_TABLE_SECTION >RAM2
developer550bf5e2016-07-11 16:05:23 +080084
85#if USE_COHERENT_MEM
86 /*
87 * The base address of the coherent memory section must be page-aligned (4K)
88 * to guarantee that the coherent data are stored on their own pages and
89 * are not mixed with normal data. This is required to set up the correct
90 * memory attributes for the coherent data page tables.
91 */
Antonio Nino Diaz2ce2b092017-11-15 11:45:35 +000092 coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
developer550bf5e2016-07-11 16:05:23 +080093 __COHERENT_RAM_START__ = .;
94 /*
95 * Bakery locks are stored in coherent memory
96 *
97 * Each lock's data is contiguous and fully allocated by the compiler
98 */
99 *(bakery_lock)
100 *(tzfw_coherent_mem)
101 __COHERENT_RAM_END_UNALIGNED__ = .;
102 /*
103 * Memory page(s) mapped to this section will be marked
104 * as device memory. No other unexpected data must creep in.
105 * Ensure the rest of the current memory page is unused.
106 */
Roberto Vargasd93fde32018-04-11 11:53:31 +0100107 . = ALIGN(PAGE_SIZE);
developer550bf5e2016-07-11 16:05:23 +0800108 __COHERENT_RAM_END__ = .;
109 } >RAM2
110#endif
111
112 /*
113 * Define a linker symbol to mark end of the RW memory area for this
114 * image.
115 */
116 __BL31_END__ = .;
117
118 __BSS_SIZE__ = SIZEOF(.bss);
119#if USE_COHERENT_MEM
120 __COHERENT_RAM_UNALIGNED_SIZE__ =
121 __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
122#endif
123
124 ASSERT(. <= TZRAM2_LIMIT, "TZRAM2 image has exceeded its limit.")
125}