Various improvements/cleanups on the linker scripts
- Check at link-time that bootloader images will fit in memory
at run time and that they won't overlap each other.
- Remove text and rodata orphan sections.
- Define new linker symbols to remove the need for platform setup
code to know the order of sections.
- Reduce the size of the raw binary images by cutting some sections
out of the disk image and allocating them at load time, whenever
possible.
- Rework alignment constraints on sections.
- Remove unused linker symbols.
- Homogenize linker symbols names across all BLs.
- Add some comments in the linker scripts.
Change-Id: I47a328af0ccc7c8ab47fcc0dc6e7dd26160610b9
diff --git a/bl1/bl1.ld.S b/bl1/bl1.ld.S
index 5327715..b3f169f 100644
--- a/bl1/bl1.ld.S
+++ b/bl1/bl1.ld.S
@@ -34,57 +34,77 @@
OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
MEMORY {
- /* ROM is read-only and executable */
ROM (rx): ORIGIN = TZROM_BASE, LENGTH = TZROM_SIZE
- /* RAM is read/write and Initialised */
RAM (rwx): ORIGIN = TZRAM_BASE, LENGTH = TZRAM_SIZE
}
SECTIONS
{
- FIRMWARE_ROM : {
- *(reset_code)
+ ro : {
+ __RO_START__ = .;
+ *bl1_entrypoint.o(.text)
*(.text)
- *(.rodata)
+ *(.rodata*)
+ __RO_END__ = .;
} >ROM
- .bss : {
- __BSS_RAM_START__ = .;
- *(.bss)
- *(COMMON)
- __BSS_RAM_STOP__ = .;
- } >RAM AT>ROM
-
- .data : {
+ /*
+ * The .data section gets copied from ROM to RAM at runtime.
+ * Its LMA and VMA must be 16-byte aligned.
+ */
+ . = NEXT(16); /* Align LMA */
+ .data : ALIGN(16) { /* Align VMA */
__DATA_RAM_START__ = .;
*(.data)
- __DATA_RAM_STOP__ = .;
- } >RAM AT>ROM
+ __DATA_RAM_END__ = .;
+ } >RAM AT>ROM
- FIRMWARE_RAM_STACKS ALIGN (PLATFORM_CACHE_LINE_SIZE) : {
- . += 0x1000;
+ stacks (NOLOAD) : {
+ __STACKS_START__ = .;
*(tzfw_normal_stacks)
- . = ALIGN(4096);
- } >RAM AT>ROM
+ __STACKS_END__ = .;
+ } >RAM
+
+ /*
+ * The .bss section gets initialised to 0 at runtime.
+ * Its base address must be 16-byte aligned.
+ */
+ .bss : ALIGN(16) {
+ __BSS_START__ = .;
+ *(.bss)
+ *(COMMON)
+ __BSS_END__ = .;
+ } >RAM
- FIRMWARE_RAM_COHERENT ALIGN (4096): {
+ /*
+ * 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(4096) {
+ __COHERENT_RAM_START__ = .;
*(tzfw_coherent_mem)
-/* . += 0x1000;*/
-/* Do we need to make sure this is at least 4k? */
- . = ALIGN(4096);
+ __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.
+ */
+ . = NEXT(4096);
+ __COHERENT_RAM_END__ = .;
} >RAM
- __FIRMWARE_ROM_START__ = LOADADDR(FIRMWARE_ROM);
- __FIRMWARE_ROM_SIZE__ = SIZEOF(FIRMWARE_ROM);
+ __BL1_RAM_START__ = ADDR(.data);
+ __BL1_RAM_END__ = .;
- __FIRMWARE_DATA_START__ = LOADADDR(.data);
- __FIRMWARE_DATA_SIZE__ = SIZEOF(.data);
+ __DATA_ROM_START__ = LOADADDR(.data);
+ __DATA_SIZE__ = SIZEOF(.data);
- __FIRMWARE_BSS_START__ = LOADADDR(.bss);
- __FIRMWARE_BSS_SIZE__ = SIZEOF(.bss);
+ __BSS_SIZE__ = SIZEOF(.bss);
+
+ __COHERENT_RAM_UNALIGNED_SIZE__ =
+ __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
- __FIRMWARE_RAM_STACKS_START__ = LOADADDR(FIRMWARE_RAM_STACKS);
- __FIRMWARE_RAM_STACKS_SIZE__ = SIZEOF(FIRMWARE_RAM_STACKS);
- __FIRMWARE_RAM_COHERENT_START__ = LOADADDR(FIRMWARE_RAM_COHERENT);
- __FIRMWARE_RAM_COHERENT_SIZE__ = SIZEOF(FIRMWARE_RAM_COHERENT);
+ ASSERT(. <= BL31_BASE, "BL31 image overlaps BL1 image.")
}