|
|
|
/*
|
|
|
|
* Copyright (c) 2017-2022, ARM Limited and Contributors. All rights reserved.
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common/bl_common.ld.h>
|
|
|
|
#include <lib/xlat_tables/xlat_tables_defs.h>
|
|
|
|
|
|
|
|
OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
|
|
|
|
OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
|
|
|
|
ENTRY(bl2_entrypoint)
|
|
|
|
|
|
|
|
MEMORY {
|
|
|
|
#if BL2_IN_XIP_MEM
|
|
|
|
ROM (rx): ORIGIN = BL2_RO_BASE, LENGTH = BL2_RO_LIMIT - BL2_RO_BASE
|
|
|
|
RAM (rwx): ORIGIN = BL2_RW_BASE, LENGTH = BL2_RW_LIMIT - BL2_RW_BASE
|
|
|
|
#else
|
|
|
|
RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_LIMIT - BL2_BASE
|
|
|
|
#endif
|
|
|
|
#if SEPARATE_BL2_NOLOAD_REGION
|
|
|
|
RAM_NOLOAD (rw!a): ORIGIN = BL2_NOLOAD_START, LENGTH = BL2_NOLOAD_LIMIT - BL2_NOLOAD_START
|
|
|
|
#else
|
|
|
|
#define RAM_NOLOAD RAM
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#if !BL2_IN_XIP_MEM
|
|
|
|
#define ROM RAM
|
|
|
|
#endif
|
|
|
|
|
|
|
|
SECTIONS
|
|
|
|
{
|
|
|
|
#if BL2_IN_XIP_MEM
|
|
|
|
. = BL2_RO_BASE;
|
|
|
|
ASSERT(. == ALIGN(PAGE_SIZE),
|
|
|
|
"BL2_RO_BASE address is not aligned on a page boundary.")
|
|
|
|
#else
|
|
|
|
. = BL2_BASE;
|
|
|
|
ASSERT(. == ALIGN(PAGE_SIZE),
|
|
|
|
"BL2_BASE address is not aligned on a page boundary.")
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if SEPARATE_CODE_AND_RODATA
|
|
|
|
.text . : {
|
|
|
|
__TEXT_START__ = .;
|
|
|
|
__TEXT_RESIDENT_START__ = .;
|
|
|
|
*bl2_el3_entrypoint.o(.text*)
|
|
|
|
*(.text.asm.*)
|
|
|
|
__TEXT_RESIDENT_END__ = .;
|
|
|
|
*(SORT_BY_ALIGNMENT(.text*))
|
|
|
|
*(.vectors)
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
|
|
__TEXT_END__ = .;
|
|
|
|
} >ROM
|
|
|
|
|
|
|
|
.rodata . : {
|
|
|
|
__RODATA_START__ = .;
|
|
|
|
*(SORT_BY_ALIGNMENT(.rodata*))
|
|
|
|
|
linker_script: replace common read-only data with RODATA_COMMON
The common section data are repeated in many linker scripts (often
twice in each script to support SEPARATE_CODE_AND_RODATA). When you
add a new read-only data section, you end up with touching lots of
places.
After this commit, you will only need to touch bl_common.ld.h when
you add a new section to RODATA_COMMON.
Replace a series of RO section with RODATA_COMMON, which contains
6 sections, some of which did not exist before.
This is not a big deal because unneeded data should not be compiled
in the first place. I believe this should be controlled by BL*_SOURCES
in Makefiles, not by linker scripts.
When I was working on this commit, the BL1 image size increased
due to the fconf_populator. Commit c452ba159c14 ("fconf: exclude
fconf_dyn_cfg_getter.c from BL1_SOURCES") fixed this issue.
I investigated BL1, BL2, BL2U, BL31 for plat=fvp, and BL2-AT-EL3,
BL31, BL31 for plat=uniphier. I did not see any more unexpected
code addition.
Change-Id: I5d14d60dbe3c821765bce3ae538968ef266f1460
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
5 years ago
|
|
|
RODATA_COMMON
|
|
|
|
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
|
|
__RODATA_END__ = .;
|
|
|
|
} >ROM
|
|
|
|
|
|
|
|
ASSERT(__TEXT_RESIDENT_END__ - __TEXT_RESIDENT_START__ <= PAGE_SIZE,
|
|
|
|
"Resident part of BL2 has exceeded its limit.")
|
|
|
|
#else
|
|
|
|
ro . : {
|
|
|
|
__RO_START__ = .;
|
|
|
|
__TEXT_RESIDENT_START__ = .;
|
|
|
|
*bl2_el3_entrypoint.o(.text*)
|
|
|
|
*(.text.asm.*)
|
|
|
|
__TEXT_RESIDENT_END__ = .;
|
|
|
|
*(SORT_BY_ALIGNMENT(.text*))
|
|
|
|
*(SORT_BY_ALIGNMENT(.rodata*))
|
|
|
|
|
linker_script: replace common read-only data with RODATA_COMMON
The common section data are repeated in many linker scripts (often
twice in each script to support SEPARATE_CODE_AND_RODATA). When you
add a new read-only data section, you end up with touching lots of
places.
After this commit, you will only need to touch bl_common.ld.h when
you add a new section to RODATA_COMMON.
Replace a series of RO section with RODATA_COMMON, which contains
6 sections, some of which did not exist before.
This is not a big deal because unneeded data should not be compiled
in the first place. I believe this should be controlled by BL*_SOURCES
in Makefiles, not by linker scripts.
When I was working on this commit, the BL1 image size increased
due to the fconf_populator. Commit c452ba159c14 ("fconf: exclude
fconf_dyn_cfg_getter.c from BL1_SOURCES") fixed this issue.
I investigated BL1, BL2, BL2U, BL31 for plat=fvp, and BL2-AT-EL3,
BL31, BL31 for plat=uniphier. I did not see any more unexpected
code addition.
Change-Id: I5d14d60dbe3c821765bce3ae538968ef266f1460
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
5 years ago
|
|
|
RODATA_COMMON
|
|
|
|
|
|
|
|
*(.vectors)
|
|
|
|
__RO_END_UNALIGNED__ = .;
|
|
|
|
/*
|
|
|
|
* Memory page(s) mapped to this section will be marked as
|
|
|
|
* read-only, executable. No RW data from the next section must
|
|
|
|
* creep in. Ensure the rest of the current memory page is unused.
|
|
|
|
*/
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
|
|
|
|
|
|
__RO_END__ = .;
|
|
|
|
} >ROM
|
|
|
|
#endif
|
|
|
|
|
|
|
|
ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
|
|
|
|
"cpu_ops not defined for this platform.")
|
|
|
|
|
|
|
|
#if BL2_IN_XIP_MEM
|
|
|
|
. = BL2_RW_BASE;
|
|
|
|
ASSERT(BL2_RW_BASE == ALIGN(PAGE_SIZE),
|
|
|
|
"BL2_RW_BASE address is not aligned on a page boundary.")
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Define a linker symbol to mark start of the RW memory area for this
|
|
|
|
* image.
|
|
|
|
*/
|
|
|
|
__RW_START__ = . ;
|
|
|
|
|
linker_script: move .data section to bl_common.ld.h
Move the data section to the common header.
I slightly tweaked some scripts as follows:
[1] bl1.ld.S has ALIGN(16). I added DATA_ALIGN macro, which is 1
by default, but overridden by bl1.ld.S. Currently, ALIGN(16)
of the .data section is redundant because commit 412865907699
("Fix boot failures on some builds linked with ld.lld.") padded
out the previous section to work around the issue of LLD version
<= 10.0. This will be fixed in the future release of LLVM, so
I am keeping the proper way to align LMA.
[2] bl1.ld.S and bl2_el3.ld.S define __DATA_RAM_{START,END}__ instead
of __DATA_{START,END}__. I put them out of the .data section.
[3] SORT_BY_ALIGNMENT() is missing tsp.ld.S, sp_min.ld.S, and
mediatek/mt6795/bl31.ld.S. This commit adds SORT_BY_ALIGNMENT()
for all images, so the symbol order in those three will change,
but I do not think it is a big deal.
Change-Id: I215bb23c319f045cd88e6f4e8ee2518c67f03692
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
5 years ago
|
|
|
DATA_SECTION >RAM AT>ROM
|
|
|
|
__DATA_RAM_START__ = __DATA_START__;
|
|
|
|
__DATA_RAM_END__ = __DATA_END__;
|
|
|
|
|
|
|
|
RELA_SECTION >RAM
|
|
|
|
#if SEPARATE_BL2_NOLOAD_REGION
|
|
|
|
SAVED_ADDR = .;
|
|
|
|
. = BL2_NOLOAD_START;
|
|
|
|
__BL2_NOLOAD_START__ = .;
|
|
|
|
#endif
|
|
|
|
STACK_SECTION >RAM_NOLOAD
|
|
|
|
BSS_SECTION >RAM_NOLOAD
|
|
|
|
XLAT_TABLE_SECTION >RAM_NOLOAD
|
|
|
|
#if SEPARATE_BL2_NOLOAD_REGION
|
|
|
|
__BL2_NOLOAD_END__ = .;
|
|
|
|
. = SAVED_ADDR;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if USE_COHERENT_MEM
|
|
|
|
/*
|
|
|
|
* The base address of the coherent memory section must be page-aligned (4K)
|
|
|
|
* to guarantee that the coherent data are stored on their own pages and
|
|
|
|
* are not mixed with normal data. This is required to set up the correct
|
|
|
|
* memory attributes for the coherent data page tables.
|
|
|
|
*/
|
|
|
|
coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
|
|
|
|
__COHERENT_RAM_START__ = .;
|
|
|
|
*(tzfw_coherent_mem)
|
|
|
|
__COHERENT_RAM_END_UNALIGNED__ = .;
|
|
|
|
/*
|
|
|
|
* Memory page(s) mapped to this section will be marked
|
|
|
|
* as device memory. No other unexpected data must creep in.
|
|
|
|
* Ensure the rest of the current memory page is unused.
|
|
|
|
*/
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
|
|
__COHERENT_RAM_END__ = .;
|
|
|
|
} >RAM
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Define a linker symbol to mark end of the RW memory area for this
|
|
|
|
* image.
|
|
|
|
*/
|
|
|
|
__RW_END__ = .;
|
|
|
|
__BL2_END__ = .;
|
|
|
|
|
|
|
|
/DISCARD/ : {
|
|
|
|
*(.dynsym .dynstr .hash .gnu.hash)
|
|
|
|
}
|
|
|
|
|
|
|
|
#if BL2_IN_XIP_MEM
|
|
|
|
__BL2_RAM_START__ = ADDR(.data);
|
|
|
|
__BL2_RAM_END__ = .;
|
|
|
|
|
|
|
|
__DATA_ROM_START__ = LOADADDR(.data);
|
|
|
|
__DATA_SIZE__ = SIZEOF(.data);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The .data section is the last PROGBITS section so its end marks the end
|
|
|
|
* of BL2's RO content in XIP memory..
|
|
|
|
*/
|
|
|
|
__BL2_ROM_END__ = __DATA_ROM_START__ + __DATA_SIZE__;
|
|
|
|
ASSERT(__BL2_ROM_END__ <= BL2_RO_LIMIT,
|
|
|
|
"BL2's RO content has exceeded its limit.")
|
|
|
|
#endif
|
|
|
|
__BSS_SIZE__ = SIZEOF(.bss);
|
|
|
|
|
|
|
|
|
|
|
|
#if USE_COHERENT_MEM
|
|
|
|
__COHERENT_RAM_UNALIGNED_SIZE__ =
|
|
|
|
__COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if BL2_IN_XIP_MEM
|
|
|
|
ASSERT(. <= BL2_RW_LIMIT, "BL2's RW content has exceeded its limit.")
|
|
|
|
#else
|
|
|
|
ASSERT(. <= BL2_LIMIT, "BL2 image has exceeded its limit.")
|
|
|
|
#endif
|
|
|
|
}
|