xref: /rk3399_ARM-atf/bl2u/bl2u.ld.S (revision 09d40e0e08283a249e7dce0e106c07c5141f9b7e)
19003fa0bSYatharth Kochar/*
2883d1b5dSAntonio Nino Diaz * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
39003fa0bSYatharth Kochar *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
59003fa0bSYatharth Kochar */
69003fa0bSYatharth Kochar
79003fa0bSYatharth Kochar#include <platform_def.h>
8*09d40e0eSAntonio Nino Diaz
9*09d40e0eSAntonio Nino Diaz#include <lib/xlat_tables/xlat_tables_defs.h>
109003fa0bSYatharth Kochar
119003fa0bSYatharth KocharOUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
129003fa0bSYatharth KocharOUTPUT_ARCH(PLATFORM_LINKER_ARCH)
139003fa0bSYatharth KocharENTRY(bl2u_entrypoint)
149003fa0bSYatharth Kochar
159003fa0bSYatharth KocharMEMORY {
169003fa0bSYatharth Kochar    RAM (rwx): ORIGIN = BL2U_BASE, LENGTH = BL2U_LIMIT - BL2U_BASE
179003fa0bSYatharth Kochar}
189003fa0bSYatharth Kochar
199003fa0bSYatharth Kochar
209003fa0bSYatharth KocharSECTIONS
219003fa0bSYatharth Kochar{
229003fa0bSYatharth Kochar    . = BL2U_BASE;
23a2aedac2SAntonio Nino Diaz    ASSERT(. == ALIGN(PAGE_SIZE),
249003fa0bSYatharth Kochar           "BL2U_BASE address is not aligned on a page boundary.")
259003fa0bSYatharth Kochar
265d1c104fSSandrine Bailleux#if SEPARATE_CODE_AND_RODATA
275d1c104fSSandrine Bailleux    .text . : {
285d1c104fSSandrine Bailleux        __TEXT_START__ = .;
295d1c104fSSandrine Bailleux        *bl2u_entrypoint.o(.text*)
305d1c104fSSandrine Bailleux        *(.text*)
315d1c104fSSandrine Bailleux        *(.vectors)
325629b2b1SRoberto Vargas        . = ALIGN(PAGE_SIZE);
335d1c104fSSandrine Bailleux        __TEXT_END__ = .;
345d1c104fSSandrine Bailleux     } >RAM
355d1c104fSSandrine Bailleux
36ad925094SRoberto Vargas     /* .ARM.extab and .ARM.exidx are only added because Clang need them */
37ad925094SRoberto Vargas     .ARM.extab . : {
38ad925094SRoberto Vargas        *(.ARM.extab* .gnu.linkonce.armextab.*)
39ad925094SRoberto Vargas     } >RAM
40ad925094SRoberto Vargas
41ad925094SRoberto Vargas     .ARM.exidx . : {
42ad925094SRoberto Vargas        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
43ad925094SRoberto Vargas     } >RAM
44ad925094SRoberto Vargas
455d1c104fSSandrine Bailleux    .rodata . : {
465d1c104fSSandrine Bailleux        __RODATA_START__ = .;
475d1c104fSSandrine Bailleux        *(.rodata*)
485629b2b1SRoberto Vargas        . = ALIGN(PAGE_SIZE);
495d1c104fSSandrine Bailleux        __RODATA_END__ = .;
505d1c104fSSandrine Bailleux    } >RAM
515d1c104fSSandrine Bailleux#else
529003fa0bSYatharth Kochar    ro . : {
539003fa0bSYatharth Kochar        __RO_START__ = .;
549003fa0bSYatharth Kochar        *bl2u_entrypoint.o(.text*)
559003fa0bSYatharth Kochar        *(.text*)
569003fa0bSYatharth Kochar        *(.rodata*)
579003fa0bSYatharth Kochar
589003fa0bSYatharth Kochar        *(.vectors)
599003fa0bSYatharth Kochar        __RO_END_UNALIGNED__ = .;
609003fa0bSYatharth Kochar        /*
619003fa0bSYatharth Kochar         * Memory page(s) mapped to this section will be marked as
629003fa0bSYatharth Kochar         * read-only, executable.  No RW data from the next section must
639003fa0bSYatharth Kochar         * creep in.  Ensure the rest of the current memory page is unused.
649003fa0bSYatharth Kochar         */
655629b2b1SRoberto Vargas        . = ALIGN(PAGE_SIZE);
669003fa0bSYatharth Kochar        __RO_END__ = .;
679003fa0bSYatharth Kochar    } >RAM
685d1c104fSSandrine Bailleux#endif
699003fa0bSYatharth Kochar
709003fa0bSYatharth Kochar    /*
719003fa0bSYatharth Kochar     * Define a linker symbol to mark start of the RW memory area for this
729003fa0bSYatharth Kochar     * image.
739003fa0bSYatharth Kochar     */
749003fa0bSYatharth Kochar    __RW_START__ = . ;
759003fa0bSYatharth Kochar
7651faada7SDouglas Raillard    /*
7751faada7SDouglas Raillard     * .data must be placed at a lower address than the stacks if the stack
7851faada7SDouglas Raillard     * protector is enabled. Alternatively, the .data.stack_protector_canary
7951faada7SDouglas Raillard     * section can be placed independently of the main .data section.
8051faada7SDouglas Raillard     */
819003fa0bSYatharth Kochar    .data . : {
829003fa0bSYatharth Kochar        __DATA_START__ = .;
839003fa0bSYatharth Kochar        *(.data*)
849003fa0bSYatharth Kochar        __DATA_END__ = .;
859003fa0bSYatharth Kochar    } >RAM
869003fa0bSYatharth Kochar
879003fa0bSYatharth Kochar    stacks (NOLOAD) : {
889003fa0bSYatharth Kochar        __STACKS_START__ = .;
899003fa0bSYatharth Kochar        *(tzfw_normal_stacks)
909003fa0bSYatharth Kochar        __STACKS_END__ = .;
919003fa0bSYatharth Kochar    } >RAM
929003fa0bSYatharth Kochar
939003fa0bSYatharth Kochar    /*
949003fa0bSYatharth Kochar     * The .bss section gets initialised to 0 at runtime.
95308d359bSDouglas Raillard     * Its base address should be 16-byte aligned for better performance of the
96308d359bSDouglas Raillard     * zero-initialization code.
979003fa0bSYatharth Kochar     */
989003fa0bSYatharth Kochar    .bss : ALIGN(16) {
999003fa0bSYatharth Kochar        __BSS_START__ = .;
1009003fa0bSYatharth Kochar        *(SORT_BY_ALIGNMENT(.bss*))
1019003fa0bSYatharth Kochar        *(COMMON)
1029003fa0bSYatharth Kochar        __BSS_END__ = .;
1039003fa0bSYatharth Kochar    } >RAM
1049003fa0bSYatharth Kochar
1059003fa0bSYatharth Kochar    /*
1069003fa0bSYatharth Kochar     * The xlat_table section is for full, aligned page tables (4K).
1079003fa0bSYatharth Kochar     * Removing them from .bss avoids forcing 4K alignment on
108883d1b5dSAntonio Nino Diaz     * the .bss section. The tables are initialized to zero by the translation
109883d1b5dSAntonio Nino Diaz     * tables library.
1109003fa0bSYatharth Kochar     */
1119003fa0bSYatharth Kochar    xlat_table (NOLOAD) : {
1129003fa0bSYatharth Kochar        *(xlat_table)
1139003fa0bSYatharth Kochar    } >RAM
1149003fa0bSYatharth Kochar
1159003fa0bSYatharth Kochar#if USE_COHERENT_MEM
1169003fa0bSYatharth Kochar    /*
1179003fa0bSYatharth Kochar     * The base address of the coherent memory section must be page-aligned (4K)
1189003fa0bSYatharth Kochar     * to guarantee that the coherent data are stored on their own pages and
1199003fa0bSYatharth Kochar     * are not mixed with normal data.  This is required to set up the correct
1209003fa0bSYatharth Kochar     * memory attributes for the coherent data page tables.
1219003fa0bSYatharth Kochar     */
122a2aedac2SAntonio Nino Diaz    coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
1239003fa0bSYatharth Kochar        __COHERENT_RAM_START__ = .;
1249003fa0bSYatharth Kochar        *(tzfw_coherent_mem)
1259003fa0bSYatharth Kochar        __COHERENT_RAM_END_UNALIGNED__ = .;
1269003fa0bSYatharth Kochar        /*
1279003fa0bSYatharth Kochar         * Memory page(s) mapped to this section will be marked
1289003fa0bSYatharth Kochar         * as device memory.  No other unexpected data must creep in.
1299003fa0bSYatharth Kochar         * Ensure the rest of the current memory page is unused.
1309003fa0bSYatharth Kochar         */
1315629b2b1SRoberto Vargas        . = ALIGN(PAGE_SIZE);
1329003fa0bSYatharth Kochar        __COHERENT_RAM_END__ = .;
1339003fa0bSYatharth Kochar    } >RAM
1349003fa0bSYatharth Kochar#endif
1359003fa0bSYatharth Kochar
1369003fa0bSYatharth Kochar    /*
1379003fa0bSYatharth Kochar     * Define a linker symbol to mark end of the RW memory area for this
1389003fa0bSYatharth Kochar     * image.
1399003fa0bSYatharth Kochar     */
1409003fa0bSYatharth Kochar    __RW_END__ = .;
1419003fa0bSYatharth Kochar    __BL2U_END__ = .;
1429003fa0bSYatharth Kochar
1439003fa0bSYatharth Kochar    __BSS_SIZE__ = SIZEOF(.bss);
1449003fa0bSYatharth Kochar
1459003fa0bSYatharth Kochar    ASSERT(. <= BL2U_LIMIT, "BL2U image has exceeded its limit.")
1469003fa0bSYatharth Kochar}
147