Merge branch 'master' of git://git.denx.de/u-boot-net
[oweals/u-boot.git] / arch / arm / cpu / u-boot.lds
index 4da5d246e0ef78ce36f6d8520b11932200ac41d8..d48a905cf3cf1707593308339da041e39eda5c32 100644 (file)
@@ -7,21 +7,69 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <config.h>
+
 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
 ENTRY(_start)
 SECTIONS
 {
+       /*
+        * Discard the relocation entries for secure text.
+        * The secure code is bundled with u-boot image, so there will
+        * be relocations entries for the secure code, since we use
+        * "-mword-relocations" to compile and "-pie" to link into the
+        * final image. We do not need the relocation entries for secure
+        * code, because secure code will not be relocated, it only needs
+        * to be copied from loading address to CONFIG_ARMV7_SECURE_BASE,
+        * which is the linking and running address for secure code.
+        * If keep the relocation entries in .rel.dyn section,
+        * "relocation offset + linking address" may locates into an
+        * address that is reserved by SoC, then will trigger data abort.
+        *
+        * The reason that move .rel._secure at the beginning, is to
+        * avoid hole in the final image.
+        */
+       /DISCARD/ : { *(.rel._secure*) }
        . = 0x00000000;
 
        . = ALIGN(4);
        .text :
        {
                *(.__image_copy_start)
+               *(.vectors)
                CPUDIR/start.o (.text*)
                *(.text*)
        }
 
+#ifdef CONFIG_ARMV7_NONSEC
+
+#ifndef CONFIG_ARMV7_SECURE_BASE
+#define CONFIG_ARMV7_SECURE_BASE
+#endif
+
+       .__secure_start : {
+               . = ALIGN(0x1000);
+               *(.__secure_start)
+       }
+
+       .secure_text CONFIG_ARMV7_SECURE_BASE :
+               AT(ADDR(.__secure_start) + SIZEOF(.__secure_start))
+       {
+               *(._secure.text)
+       }
+
+       . = LOADADDR(.__secure_start) +
+               SIZEOF(.__secure_start) +
+               SIZEOF(.secure_text);
+
+       __secure_end_lma = .;
+       .__secure_end : AT(__secure_end_lma) {
+               *(.__secure_end)
+               LONG(0x1d1071c);        /* Must output something to reset LMA */
+       }
+#endif
+
        . = ALIGN(4);
        .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
 
@@ -60,7 +108,12 @@ SECTIONS
                *(.__rel_dyn_end)
        }
 
-       _end = .;
+       .end :
+       {
+               *(.__end)
+       }
+
+       _image_binary_end = .;
 
        /*
         * Deprecated: this MMU section is used by pxa at present but
@@ -91,12 +144,13 @@ SECTIONS
                KEEP(*(.__bss_end));
        }
 
-       .dynsym _end : { *(.dynsym) }
+       .dynsym _image_binary_end : { *(.dynsym) }
        .dynbss : { *(.dynbss) }
        .dynstr : { *(.dynstr*) }
        .dynamic : { *(.dynamic*) }
        .plt : { *(.plt*) }
        .interp : { *(.interp*) }
+       .gnu.hash : { *(.gnu.hash) }
        .gnu : { *(.gnu*) }
        .ARM.exidx : { *(.ARM.exidx*) }
        .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }