mirror of
https://github.com/CTCaer/switch-l4t-atf.git
synced 2024-11-24 02:09:46 +00:00
caa3e7e0a4
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 4128659076
("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>
150 lines
4.2 KiB
ArmAsm
150 lines
4.2 KiB
ArmAsm
/*
|
|
* Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
/*
|
|
* The .data section gets copied from ROM to RAM at runtime.
|
|
* Its LMA should be 16-byte aligned to allow efficient copying of 16-bytes
|
|
* aligned regions in it.
|
|
* Its VMA must be page-aligned as it marks the first read/write page.
|
|
*/
|
|
#define DATA_ALIGN 16
|
|
|
|
#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(bl1_entrypoint)
|
|
|
|
MEMORY {
|
|
ROM (rx): ORIGIN = BL1_RO_BASE, LENGTH = BL1_RO_LIMIT - BL1_RO_BASE
|
|
RAM (rwx): ORIGIN = BL1_RW_BASE, LENGTH = BL1_RW_LIMIT - BL1_RW_BASE
|
|
}
|
|
|
|
SECTIONS
|
|
{
|
|
. = BL1_RO_BASE;
|
|
ASSERT(. == ALIGN(PAGE_SIZE),
|
|
"BL1_RO_BASE address is not aligned on a page boundary.")
|
|
|
|
#if SEPARATE_CODE_AND_RODATA
|
|
.text . : {
|
|
__TEXT_START__ = .;
|
|
*bl1_entrypoint.o(.text*)
|
|
*(SORT_BY_ALIGNMENT(.text*))
|
|
*(.vectors)
|
|
. = ALIGN(PAGE_SIZE);
|
|
__TEXT_END__ = .;
|
|
} >ROM
|
|
|
|
/* .ARM.extab and .ARM.exidx are only added because Clang need them */
|
|
.ARM.extab . : {
|
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
|
} >ROM
|
|
|
|
.ARM.exidx . : {
|
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
|
} >ROM
|
|
|
|
.rodata . : {
|
|
__RODATA_START__ = .;
|
|
*(SORT_BY_ALIGNMENT(.rodata*))
|
|
|
|
RODATA_COMMON
|
|
|
|
/*
|
|
* No need to pad out the .rodata section to a page boundary. Next is
|
|
* the .data section, which can mapped in ROM with the same memory
|
|
* attributes as the .rodata section.
|
|
*
|
|
* Pad out to 16 bytes though as .data section needs to be 16 byte
|
|
* aligned and lld does not align the LMA to the aligment specified
|
|
* on the .data section.
|
|
*/
|
|
__RODATA_END__ = .;
|
|
. = ALIGN(16);
|
|
} >ROM
|
|
#else
|
|
ro . : {
|
|
__RO_START__ = .;
|
|
*bl1_entrypoint.o(.text*)
|
|
*(SORT_BY_ALIGNMENT(.text*))
|
|
*(SORT_BY_ALIGNMENT(.rodata*))
|
|
|
|
RODATA_COMMON
|
|
|
|
*(.vectors)
|
|
__RO_END__ = .;
|
|
|
|
/*
|
|
* Pad out to 16 bytes as .data section needs to be 16 byte aligned and
|
|
* lld does not align the LMA to the aligment specified on the .data
|
|
* section.
|
|
*/
|
|
. = ALIGN(16);
|
|
} >ROM
|
|
#endif
|
|
|
|
ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
|
|
"cpu_ops not defined for this platform.")
|
|
|
|
. = BL1_RW_BASE;
|
|
ASSERT(BL1_RW_BASE == ALIGN(PAGE_SIZE),
|
|
"BL1_RW_BASE address is not aligned on a page boundary.")
|
|
|
|
DATA_SECTION >RAM AT>ROM
|
|
__DATA_RAM_START__ = __DATA_START__;
|
|
__DATA_RAM_END__ = __DATA_END__;
|
|
|
|
STACK_SECTION >RAM
|
|
BSS_SECTION >RAM
|
|
XLAT_TABLE_SECTION >RAM
|
|
|
|
#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
|
|
|
|
__BL1_RAM_START__ = ADDR(.data);
|
|
__BL1_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 BL1's actual content in Trusted ROM.
|
|
*/
|
|
__BL1_ROM_END__ = __DATA_ROM_START__ + __DATA_SIZE__;
|
|
ASSERT(__BL1_ROM_END__ <= BL1_RO_LIMIT,
|
|
"BL1's ROM content has exceeded its limit.")
|
|
|
|
__BSS_SIZE__ = SIZEOF(.bss);
|
|
|
|
#if USE_COHERENT_MEM
|
|
__COHERENT_RAM_UNALIGNED_SIZE__ =
|
|
__COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
|
|
#endif
|
|
|
|
ASSERT(. <= BL1_RW_LIMIT, "BL1's RW section has exceeded its limit.")
|
|
}
|