xref: /arm-trusted-firmware/bl2u/bl2u.ld.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <platform_def.h>
8*91f16700Schasinglulu
9*91f16700Schasinglulu#include <common/bl_common.ld.h>
10*91f16700Schasinglulu#include <lib/xlat_tables/xlat_tables_defs.h>
11*91f16700Schasinglulu
12*91f16700SchasingluluOUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
13*91f16700SchasingluluOUTPUT_ARCH(PLATFORM_LINKER_ARCH)
14*91f16700SchasingluluENTRY(bl2u_entrypoint)
15*91f16700Schasinglulu
16*91f16700SchasingluluMEMORY {
17*91f16700Schasinglulu    RAM (rwx): ORIGIN = BL2U_BASE, LENGTH = BL2U_LIMIT - BL2U_BASE
18*91f16700Schasinglulu}
19*91f16700Schasinglulu
20*91f16700SchasingluluSECTIONS {
21*91f16700Schasinglulu    RAM_REGION_START = ORIGIN(RAM);
22*91f16700Schasinglulu    RAM_REGION_LENGTH = LENGTH(RAM);
23*91f16700Schasinglulu    . = BL2U_BASE;
24*91f16700Schasinglulu
25*91f16700Schasinglulu    ASSERT(. == ALIGN(PAGE_SIZE),
26*91f16700Schasinglulu        "BL2U_BASE address is not aligned on a page boundary.")
27*91f16700Schasinglulu
28*91f16700Schasinglulu#if SEPARATE_CODE_AND_RODATA
29*91f16700Schasinglulu    .text . : {
30*91f16700Schasinglulu        __TEXT_START__ = .;
31*91f16700Schasinglulu
32*91f16700Schasinglulu        *bl2u_entrypoint.o(.text*)
33*91f16700Schasinglulu        *(SORT_BY_ALIGNMENT(.text*))
34*91f16700Schasinglulu        *(.vectors)
35*91f16700Schasinglulu        __TEXT_END_UNALIGNED__ = .;
36*91f16700Schasinglulu
37*91f16700Schasinglulu        . = ALIGN(PAGE_SIZE);
38*91f16700Schasinglulu
39*91f16700Schasinglulu        __TEXT_END__ = .;
40*91f16700Schasinglulu    } >RAM
41*91f16700Schasinglulu
42*91f16700Schasinglulu    /* .ARM.extab and .ARM.exidx are only added because Clang needs them */
43*91f16700Schasinglulu    .ARM.extab . : {
44*91f16700Schasinglulu        *(.ARM.extab* .gnu.linkonce.armextab.*)
45*91f16700Schasinglulu    } >RAM
46*91f16700Schasinglulu
47*91f16700Schasinglulu    .ARM.exidx . : {
48*91f16700Schasinglulu        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
49*91f16700Schasinglulu    } >RAM
50*91f16700Schasinglulu
51*91f16700Schasinglulu    .rodata . : {
52*91f16700Schasinglulu        __RODATA_START__ = .;
53*91f16700Schasinglulu        *(SORT_BY_ALIGNMENT(.rodata*))
54*91f16700Schasinglulu
55*91f16700Schasinglulu        RODATA_COMMON
56*91f16700Schasinglulu
57*91f16700Schasinglulu        __RODATA_END_UNALIGNED__ = .;
58*91f16700Schasinglulu        . = ALIGN(PAGE_SIZE);
59*91f16700Schasinglulu        __RODATA_END__ = .;
60*91f16700Schasinglulu    } >RAM
61*91f16700Schasinglulu#else /* SEPARATE_CODE_AND_RODATA */
62*91f16700Schasinglulu    .ro . : {
63*91f16700Schasinglulu        __RO_START__ = .;
64*91f16700Schasinglulu
65*91f16700Schasinglulu        *bl2u_entrypoint.o(.text*)
66*91f16700Schasinglulu        *(SORT_BY_ALIGNMENT(.text*))
67*91f16700Schasinglulu        *(SORT_BY_ALIGNMENT(.rodata*))
68*91f16700Schasinglulu
69*91f16700Schasinglulu        RODATA_COMMON
70*91f16700Schasinglulu
71*91f16700Schasinglulu        *(.vectors)
72*91f16700Schasinglulu
73*91f16700Schasinglulu        __RO_END_UNALIGNED__ = .;
74*91f16700Schasinglulu
75*91f16700Schasinglulu        /*
76*91f16700Schasinglulu         * Memory page(s) mapped to this section will be marked as read-only,
77*91f16700Schasinglulu         * executable. No RW data from the next section must creep in. Ensure
78*91f16700Schasinglulu         * that the rest of the current memory page is unused.
79*91f16700Schasinglulu         */
80*91f16700Schasinglulu        . = ALIGN(PAGE_SIZE);
81*91f16700Schasinglulu
82*91f16700Schasinglulu        __RO_END__ = .;
83*91f16700Schasinglulu    } >RAM
84*91f16700Schasinglulu#endif /* SEPARATE_CODE_AND_RODATA */
85*91f16700Schasinglulu
86*91f16700Schasinglulu    __RW_START__ = .;
87*91f16700Schasinglulu
88*91f16700Schasinglulu    DATA_SECTION >RAM
89*91f16700Schasinglulu    STACK_SECTION >RAM
90*91f16700Schasinglulu    BSS_SECTION >RAM
91*91f16700Schasinglulu    XLAT_TABLE_SECTION >RAM
92*91f16700Schasinglulu
93*91f16700Schasinglulu#if USE_COHERENT_MEM
94*91f16700Schasinglulu    /*
95*91f16700Schasinglulu     * The base address of the coherent memory section must be page-aligned to
96*91f16700Schasinglulu     * guarantee that the coherent data are stored on their own pages and are
97*91f16700Schasinglulu     * not mixed with normal data.  This is required to set up the correct
98*91f16700Schasinglulu     * memory attributes for the coherent data page tables.
99*91f16700Schasinglulu     */
100*91f16700Schasinglulu    .coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
101*91f16700Schasinglulu        __COHERENT_RAM_START__ = .;
102*91f16700Schasinglulu        *(.tzfw_coherent_mem)
103*91f16700Schasinglulu        __COHERENT_RAM_END_UNALIGNED__ = .;
104*91f16700Schasinglulu
105*91f16700Schasinglulu        /*
106*91f16700Schasinglulu         * Memory page(s) mapped to this section will be marked as device
107*91f16700Schasinglulu         * memory. No other unexpected data must creep in. Ensure the rest of
108*91f16700Schasinglulu         * the current memory page is unused.
109*91f16700Schasinglulu         */
110*91f16700Schasinglulu        . = ALIGN(PAGE_SIZE);
111*91f16700Schasinglulu
112*91f16700Schasinglulu        __COHERENT_RAM_END__ = .;
113*91f16700Schasinglulu    } >RAM
114*91f16700Schasinglulu#endif /* USE_COHERENT_MEM */
115*91f16700Schasinglulu
116*91f16700Schasinglulu    __RW_END__ = .;
117*91f16700Schasinglulu    __BL2U_END__ = .;
118*91f16700Schasinglulu
119*91f16700Schasinglulu    __BSS_SIZE__ = SIZEOF(.bss);
120*91f16700Schasinglulu
121*91f16700Schasinglulu    ASSERT(. <= BL2U_LIMIT, "BL2U image has exceeded its limit.")
122*91f16700Schasinglulu    RAM_REGION_END = .;
123*91f16700Schasinglulu}
124