ARM: linker script: factor out TCM bits
authorNicolas Pitre <nicolas.pitre@linaro.org>
Fri, 9 Mar 2018 01:19:48 +0000 (20:19 -0500)
committerNicolas Pitre <nicolas.pitre@linaro.org>
Sat, 10 Mar 2018 01:20:22 +0000 (20:20 -0500)
This is a plain move with identical results, and therefore
still broken in the XIP case.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Tested-by: Chris Brandt <Chris.Brandt@renesas.com>
arch/arm/kernel/vmlinux-xip.lds.S
arch/arm/kernel/vmlinux.lds.S
arch/arm/kernel/vmlinux.lds.h

index 5a50a2a917f577af506f951f1fe3e795c445f764..c727c56f3cb2593f8077132ee8a97c3cfd496499 100644 (file)
@@ -144,60 +144,7 @@ SECTIONS
        __init_end = .;
 
 #ifdef CONFIG_HAVE_TCM
-        /*
-        * We align everything to a page boundary so we can
-        * free it after init has commenced and TCM contents have
-        * been copied to its destination.
-        */
-       .tcm_start : {
-               . = ALIGN(PAGE_SIZE);
-               __tcm_start = .;
-               __itcm_start = .;
-       }
-
-       /*
-        * Link these to the ITCM RAM
-        * Put VMA to the TCM address and LMA to the common RAM
-        * and we'll upload the contents from RAM to TCM and free
-        * the used RAM after that.
-        */
-       .text_itcm ITCM_OFFSET : AT(__itcm_start)
-       {
-               __sitcm_text = .;
-               *(.tcm.text)
-               *(.tcm.rodata)
-               . = ALIGN(4);
-               __eitcm_text = .;
-       }
-
-       /*
-        * Reset the dot pointer, this is needed to create the
-        * relative __dtcm_start below (to be used as extern in code).
-        */
-       . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
-
-       .dtcm_start : {
-               __dtcm_start = .;
-       }
-
-       /* TODO: add remainder of ITCM as well, that can be used for data! */
-       .data_dtcm DTCM_OFFSET : AT(__dtcm_start)
-       {
-               . = ALIGN(4);
-               __sdtcm_data = .;
-               *(.tcm.data)
-               . = ALIGN(4);
-               __edtcm_data = .;
-       }
-
-       /* Reset the dot pointer or the linker gets confused */
-       . = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
-
-       /* End marker for freeing TCM copy in linked object */
-       .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
-               . = ALIGN(PAGE_SIZE);
-               __tcm_end = .;
-       }
+       ARM_TCM
 #endif
 
        BSS_SECTION(0, 0, 8)
index 2b893630906164f610d50b025477e553d35da048..1e9f2a6b3d33ce0157d78a9d3689aee5d68ee7d7 100644 (file)
@@ -139,60 +139,7 @@ SECTIONS
        _edata = .;
 
 #ifdef CONFIG_HAVE_TCM
-        /*
-        * We align everything to a page boundary so we can
-        * free it after init has commenced and TCM contents have
-        * been copied to its destination.
-        */
-       .tcm_start : {
-               . = ALIGN(PAGE_SIZE);
-               __tcm_start = .;
-               __itcm_start = .;
-       }
-
-       /*
-        * Link these to the ITCM RAM
-        * Put VMA to the TCM address and LMA to the common RAM
-        * and we'll upload the contents from RAM to TCM and free
-        * the used RAM after that.
-        */
-       .text_itcm ITCM_OFFSET : AT(__itcm_start)
-       {
-               __sitcm_text = .;
-               *(.tcm.text)
-               *(.tcm.rodata)
-               . = ALIGN(4);
-               __eitcm_text = .;
-       }
-
-       /*
-        * Reset the dot pointer, this is needed to create the
-        * relative __dtcm_start below (to be used as extern in code).
-        */
-       . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
-
-       .dtcm_start : {
-               __dtcm_start = .;
-       }
-
-       /* TODO: add remainder of ITCM as well, that can be used for data! */
-       .data_dtcm DTCM_OFFSET : AT(__dtcm_start)
-       {
-               . = ALIGN(4);
-               __sdtcm_data = .;
-               *(.tcm.data)
-               . = ALIGN(4);
-               __edtcm_data = .;
-       }
-
-       /* Reset the dot pointer or the linker gets confused */
-       . = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
-
-       /* End marker for freeing TCM copy in linked object */
-       .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
-               . = ALIGN(PAGE_SIZE);
-               __tcm_end = .;
-       }
+       ARM_TCM
 #endif
 
        BSS_SECTION(0, 0, 0)
index 0a4682ecc4ac246f56043ec688ce8c04fba61011..cf9dabbdbde40e67919a67b27e70d084d11b1b1d 100644 (file)
        __stubs_end = .;                                                \
                                                                        \
        PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
+
+#define ARM_TCM                                                                \
+        /*                                                             \
+        * We align everything to a page boundary so we can             \
+        * free it after init has commenced and TCM contents have       \
+        * been copied to its destination.                              \
+        */                                                             \
+       .tcm_start : {                                                  \
+               . = ALIGN(PAGE_SIZE);                                   \
+               __tcm_start = .;                                        \
+               __itcm_start = .;                                       \
+       }                                                               \
+                                                                       \
+       /*                                                              \
+        * Link these to the ITCM RAM                                   \
+        *                                                              \
+        * Put VMA to the TCM address and LMA to the common RAM         \
+        * and we'll upload the contents from RAM to TCM and free       \
+        * the used RAM after that.                                     \
+        */                                                             \
+       .text_itcm ITCM_OFFSET : AT(__itcm_start)                       \
+       {                                                               \
+               __sitcm_text = .;                                       \
+               *(.tcm.text)                                            \
+               *(.tcm.rodata)                                          \
+               . = ALIGN(4);                                           \
+               __eitcm_text = .;                                       \
+       }                                                               \
+                                                                       \
+       /*                                                              \
+        * Reset the dot pointer, this is needed to create the          \
+        * relative __dtcm_start below (to be used as extern in code).  \
+        */                                                             \
+       . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm); \
+                                                                       \
+       .dtcm_start : {                                                 \
+               __dtcm_start = .;                                       \
+       }                                                               \
+                                                                       \
+       /*                                                              \
+        * TODO: add remainder of ITCM as well,                         \
+        * that can be used for data!                                   \
+        */                                                             \
+       .data_dtcm DTCM_OFFSET : AT(__dtcm_start)                       \
+       {                                                               \
+               . = ALIGN(4);                                           \
+               __sdtcm_data = .;                                       \
+               *(.tcm.data)                                            \
+               . = ALIGN(4);                                           \
+               __edtcm_data = .;                                       \
+       }                                                               \
+                                                                       \
+       /* Reset the dot pointer or the linker gets confused */         \
+       . = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);                     \
+                                                                       \
+       /* End marker for freeing TCM copy in linked object */          \
+       .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){          \
+               . = ALIGN(PAGE_SIZE);                                   \
+               __tcm_end = .;                                          \
+       }