Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 9 Apr 2018 16:19:30 +0000 (09:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 9 Apr 2018 16:19:30 +0000 (09:19 -0700)
Pull ARM updates from Russell King:
 "A number of core ARM changes:

   - Refactoring linker script by Nicolas Pitre

   - Enable source fortification

   - Add support for Cortex R8"

* 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
  ARM: decompressor: fix warning introduced in fortify patch
  ARM: 8751/1: Add support for Cortex-R8 processor
  ARM: 8749/1: Kconfig: Add ARCH_HAS_FORTIFY_SOURCE
  ARM: simplify and fix linker script for TCM
  ARM: linker script: factor out TCM bits
  ARM: linker script: factor out vectors and stubs
  ARM: linker script: factor out unwinding table sections
  ARM: linker script: factor out stuff for the .text section
  ARM: linker script: factor out stuff for the DISCARD section
  ARM: linker script: factor out some common definitions between XIP and non-XIP

arch/arm/Kconfig
arch/arm/boot/compressed/decompress.c
arch/arm/boot/compressed/misc.c
arch/arm/boot/compressed/misc.h [new file with mode: 0644]
arch/arm/kernel/vmlinux-xip.lds.S
arch/arm/kernel/vmlinux.lds.S
arch/arm/kernel/vmlinux.lds.h [new file with mode: 0644]
arch/arm/mm/init.c
arch/arm/mm/proc-v7.S

index 1878083..a7f8e7f 100644 (file)
@@ -7,6 +7,7 @@ config ARM
        select ARCH_HAS_DEBUG_VIRTUAL if MMU
        select ARCH_HAS_DEVMEM_IS_ALLOWED
        select ARCH_HAS_ELF_RANDOMIZE
+       select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_HAS_SET_MEMORY
        select ARCH_HAS_PHYS_TO_DMA
        select ARCH_HAS_STRICT_KERNEL_RWX if MMU && !XIP_KERNEL
index a2ac3fe..c16c182 100644 (file)
@@ -6,10 +6,7 @@
 #include <linux/stddef.h>      /* for NULL */
 #include <linux/linkage.h>
 #include <asm/string.h>
-
-extern unsigned long free_mem_ptr;
-extern unsigned long free_mem_end_ptr;
-extern void error(char *);
+#include "misc.h"
 
 #define STATIC static
 #define STATIC_RW_DATA /* non-static please */
index e8fe51f..e1e9a5d 100644 (file)
@@ -22,9 +22,9 @@ unsigned int __machine_arch_type;
 #include <linux/compiler.h>    /* for inline */
 #include <linux/types.h>
 #include <linux/linkage.h>
+#include "misc.h"
 
 static void putstr(const char *ptr);
-extern void error(char *x);
 
 #include CONFIG_UNCOMPRESS_INCLUDE
 
@@ -160,3 +160,8 @@ decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
        else
                putstr(" done, booting the kernel.\n");
 }
+
+void fortify_panic(const char *name)
+{
+       error("detected buffer overflow");
+}
diff --git a/arch/arm/boot/compressed/misc.h b/arch/arm/boot/compressed/misc.h
new file mode 100644 (file)
index 0000000..c958dcc
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef MISC_H
+#define MISC_H
+
+#include <linux/compiler.h>
+
+void error(char *x) __noreturn;
+extern unsigned long free_mem_ptr;
+extern unsigned long free_mem_end_ptr;
+
+#endif
index 12b8759..d32f5d3 100644 (file)
 #include <asm/memory.h>
 #include <asm/page.h>
 
-#define PROC_INFO                                                      \
-       . = ALIGN(4);                                                   \
-       VMLINUX_SYMBOL(__proc_info_begin) = .;                          \
-       *(.proc.info.init)                                              \
-       VMLINUX_SYMBOL(__proc_info_end) = .;
-
-#define IDMAP_TEXT                                                     \
-       ALIGN_FUNCTION();                                               \
-       VMLINUX_SYMBOL(__idmap_text_start) = .;                         \
-       *(.idmap.text)                                                  \
-       VMLINUX_SYMBOL(__idmap_text_end) = .;                           \
-       . = ALIGN(PAGE_SIZE);                                           \
-       VMLINUX_SYMBOL(__hyp_idmap_text_start) = .;                     \
-       *(.hyp.idmap.text)                                              \
-       VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define ARM_CPU_DISCARD(x)
-#define ARM_CPU_KEEP(x)                x
-#else
-#define ARM_CPU_DISCARD(x)     x
-#define ARM_CPU_KEEP(x)
-#endif
-
-#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
-       defined(CONFIG_GENERIC_BUG)
-#define ARM_EXIT_KEEP(x)       x
-#define ARM_EXIT_DISCARD(x)
-#else
-#define ARM_EXIT_KEEP(x)
-#define ARM_EXIT_DISCARD(x)    x
-#endif
+#include "vmlinux.lds.h"
 
 OUTPUT_ARCH(arm)
 ENTRY(stext)
@@ -69,20 +38,9 @@ SECTIONS
         * unwind sections get included.
         */
        /DISCARD/ : {
-               *(.ARM.exidx.exit.text)
-               *(.ARM.extab.exit.text)
-               ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
-               ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
-               ARM_EXIT_DISCARD(EXIT_TEXT)
-               ARM_EXIT_DISCARD(EXIT_DATA)
-               EXIT_CALL
-#ifndef CONFIG_MMU
-               *(.text.fixup)
-               *(__ex_table)
-#endif
+               ARM_DISCARD
                *(.alt.smp.init)
-               *(.discard)
-               *(.discard.*)
+               *(.pv_table)
        }
 
        . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
@@ -95,22 +53,7 @@ SECTIONS
 
        .text : {                       /* Real text segment            */
                _stext = .;             /* Text and read-only data      */
-                       IDMAP_TEXT
-                       __entry_text_start = .;
-                       *(.entry.text)
-                       __entry_text_end = .;
-                       IRQENTRY_TEXT
-                       TEXT_TEXT
-                       SCHED_TEXT
-                       CPUIDLE_TEXT
-                       LOCK_TEXT
-                       KPROBES_TEXT
-                       *(.gnu.warning)
-                       *(.glue_7)
-                       *(.glue_7t)
-               . = ALIGN(4);
-               *(.got)                 /* Global offset table          */
-                       ARM_CPU_KEEP(PROC_INFO)
+               ARM_TEXT
        }
 
        RO_DATA(PAGE_SIZE)
@@ -118,53 +61,19 @@ SECTIONS
        . = ALIGN(4);
        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
                __start___ex_table = .;
-#ifdef CONFIG_MMU
-               *(__ex_table)
-#endif
+               ARM_MMU_KEEP(*(__ex_table))
                __stop___ex_table = .;
        }
 
 #ifdef CONFIG_ARM_UNWIND
-       /*
-        * Stack unwinding tables
-        */
-       . = ALIGN(8);
-       .ARM.unwind_idx : {
-               __start_unwind_idx = .;
-               *(.ARM.exidx*)
-               __stop_unwind_idx = .;
-       }
-       .ARM.unwind_tab : {
-               __start_unwind_tab = .;
-               *(.ARM.extab*)
-               __stop_unwind_tab = .;
-       }
+       ARM_UNWIND_SECTIONS
 #endif
 
        NOTES
 
        _etext = .;                     /* End of text and rodata section */
 
-       /*
-        * The vectors and stubs are relocatable code, and the
-        * only thing that matters is their relative offsets
-        */
-       __vectors_start = .;
-       .vectors 0xffff0000 : AT(__vectors_start) {
-               *(.vectors)
-       }
-       . = __vectors_start + SIZEOF(.vectors);
-       __vectors_end = .;
-
-       __stubs_start = .;
-       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
-               *(.stubs)
-       }
-       . = __stubs_start + SIZEOF(.stubs);
-       __stubs_end = .;
-
-       PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
-
+       ARM_VECTORS
        INIT_TEXT_SECTION(8)
        .exit.text : {
                ARM_EXIT_KEEP(EXIT_TEXT)
@@ -223,6 +132,10 @@ SECTIONS
        PERCPU_SECTION(L1_CACHE_BYTES)
 #endif
 
+#ifdef CONFIG_HAVE_TCM
+       ARM_TCM
+#endif
+
        /*
         * End of copied data. We need a dummy section to get its LMA.
         * Also located before final ALIGN() as trailing padding is not stored
@@ -234,63 +147,6 @@ SECTIONS
        . = ALIGN(PAGE_SIZE);
        __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 = .;
-       }
-#endif
-
        BSS_SECTION(0, 0, 8)
        _end = .;
 
index 84a1ae3..b77dc67 100644 (file)
 #include <asm/page.h>
 #include <asm/pgtable.h>
 
-#define PROC_INFO                                                      \
-       . = ALIGN(4);                                                   \
-       VMLINUX_SYMBOL(__proc_info_begin) = .;                          \
-       *(.proc.info.init)                                              \
-       VMLINUX_SYMBOL(__proc_info_end) = .;
-
-#define HYPERVISOR_TEXT                                                        \
-       VMLINUX_SYMBOL(__hyp_text_start) = .;                           \
-       *(.hyp.text)                                                    \
-       VMLINUX_SYMBOL(__hyp_text_end) = .;
-
-#define IDMAP_TEXT                                                     \
-       ALIGN_FUNCTION();                                               \
-       VMLINUX_SYMBOL(__idmap_text_start) = .;                         \
-       *(.idmap.text)                                                  \
-       VMLINUX_SYMBOL(__idmap_text_end) = .;                           \
-       . = ALIGN(PAGE_SIZE);                                           \
-       VMLINUX_SYMBOL(__hyp_idmap_text_start) = .;                     \
-       *(.hyp.idmap.text)                                              \
-       VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define ARM_CPU_DISCARD(x)
-#define ARM_CPU_KEEP(x)                x
-#else
-#define ARM_CPU_DISCARD(x)     x
-#define ARM_CPU_KEEP(x)
-#endif
-
-#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
-       defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
-#define ARM_EXIT_KEEP(x)       x
-#define ARM_EXIT_DISCARD(x)
-#else
-#define ARM_EXIT_KEEP(x)
-#define ARM_EXIT_DISCARD(x)    x
-#endif
+#include "vmlinux.lds.h"
 
 OUTPUT_ARCH(arm)
 ENTRY(stext)
@@ -74,22 +38,10 @@ SECTIONS
         * unwind sections get included.
         */
        /DISCARD/ : {
-               *(.ARM.exidx.exit.text)
-               *(.ARM.extab.exit.text)
-               ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
-               ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
-               ARM_EXIT_DISCARD(EXIT_TEXT)
-               ARM_EXIT_DISCARD(EXIT_DATA)
-               EXIT_CALL
-#ifndef CONFIG_MMU
-               *(.text.fixup)
-               *(__ex_table)
-#endif
+               ARM_DISCARD
 #ifndef CONFIG_SMP_ON_UP
                *(.alt.smp.init)
 #endif
-               *(.discard)
-               *(.discard.*)
        }
 
        . = PAGE_OFFSET + TEXT_OFFSET;
@@ -104,24 +56,7 @@ SECTIONS
 
        .text : {                       /* Real text segment            */
                _stext = .;             /* Text and read-only data      */
-                       IDMAP_TEXT
-                       __entry_text_start = .;
-                       *(.entry.text)
-                       __entry_text_end = .;
-                       IRQENTRY_TEXT
-                       SOFTIRQENTRY_TEXT
-                       TEXT_TEXT
-                       SCHED_TEXT
-                       CPUIDLE_TEXT
-                       LOCK_TEXT
-                       HYPERVISOR_TEXT
-                       KPROBES_TEXT
-                       *(.gnu.warning)
-                       *(.glue_7)
-                       *(.glue_7t)
-               . = ALIGN(4);
-               *(.got)                 /* Global offset table          */
-                       ARM_CPU_KEEP(PROC_INFO)
+               ARM_TEXT
        }
 
 #ifdef CONFIG_DEBUG_ALIGN_RODATA
@@ -134,27 +69,12 @@ SECTIONS
        . = ALIGN(4);
        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
                __start___ex_table = .;
-#ifdef CONFIG_MMU
-               *(__ex_table)
-#endif
+               ARM_MMU_KEEP(*(__ex_table))
                __stop___ex_table = .;
        }
 
 #ifdef CONFIG_ARM_UNWIND
-       /*
-        * Stack unwinding tables
-        */
-       . = ALIGN(8);
-       .ARM.unwind_idx : {
-               __start_unwind_idx = .;
-               *(.ARM.exidx*)
-               __stop_unwind_idx = .;
-       }
-       .ARM.unwind_tab : {
-               __start_unwind_tab = .;
-               *(.ARM.extab*)
-               __stop_unwind_tab = .;
-       }
+       ARM_UNWIND_SECTIONS
 #endif
 
        NOTES
@@ -166,26 +86,7 @@ SECTIONS
 #endif
        __init_begin = .;
 
-       /*
-        * The vectors and stubs are relocatable code, and the
-        * only thing that matters is their relative offsets
-        */
-       __vectors_start = .;
-       .vectors 0xffff0000 : AT(__vectors_start) {
-               *(.vectors)
-       }
-       . = __vectors_start + SIZEOF(.vectors);
-       __vectors_end = .;
-
-       __stubs_start = .;
-       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
-               *(.stubs)
-       }
-       . = __stubs_start + SIZEOF(.stubs);
-       __stubs_end = .;
-
-       PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
-
+       ARM_VECTORS
        INIT_TEXT_SECTION(8)
        .exit.text : {
                ARM_EXIT_KEEP(EXIT_TEXT)
@@ -226,6 +127,10 @@ SECTIONS
        PERCPU_SECTION(L1_CACHE_BYTES)
 #endif
 
+#ifdef CONFIG_HAVE_TCM
+       ARM_TCM
+#endif
+
 #ifdef CONFIG_STRICT_KERNEL_RWX
        . = ALIGN(1<<SECTION_SHIFT);
 #else
@@ -237,63 +142,6 @@ SECTIONS
        RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
        _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 = .;
-       }
-#endif
-
        BSS_SECTION(0, 0, 0)
        _end = .;
 
diff --git a/arch/arm/kernel/vmlinux.lds.h b/arch/arm/kernel/vmlinux.lds.h
new file mode 100644 (file)
index 0000000..71281e0
--- /dev/null
@@ -0,0 +1,135 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifdef CONFIG_HOTPLUG_CPU
+#define ARM_CPU_DISCARD(x)
+#define ARM_CPU_KEEP(x)                x
+#else
+#define ARM_CPU_DISCARD(x)     x
+#define ARM_CPU_KEEP(x)
+#endif
+
+#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
+       defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
+#define ARM_EXIT_KEEP(x)       x
+#define ARM_EXIT_DISCARD(x)
+#else
+#define ARM_EXIT_KEEP(x)
+#define ARM_EXIT_DISCARD(x)    x
+#endif
+
+#ifdef CONFIG_MMU
+#define ARM_MMU_KEEP(x)                x
+#define ARM_MMU_DISCARD(x)
+#else
+#define ARM_MMU_KEEP(x)
+#define ARM_MMU_DISCARD(x)     x
+#endif
+
+#define PROC_INFO                                                      \
+               . = ALIGN(4);                                           \
+               VMLINUX_SYMBOL(__proc_info_begin) = .;                  \
+               *(.proc.info.init)                                      \
+               VMLINUX_SYMBOL(__proc_info_end) = .;
+
+#define HYPERVISOR_TEXT                                                        \
+               VMLINUX_SYMBOL(__hyp_text_start) = .;                   \
+               *(.hyp.text)                                            \
+               VMLINUX_SYMBOL(__hyp_text_end) = .;
+
+#define IDMAP_TEXT                                                     \
+               ALIGN_FUNCTION();                                       \
+               VMLINUX_SYMBOL(__idmap_text_start) = .;                 \
+               *(.idmap.text)                                          \
+               VMLINUX_SYMBOL(__idmap_text_end) = .;                   \
+               . = ALIGN(PAGE_SIZE);                                   \
+               VMLINUX_SYMBOL(__hyp_idmap_text_start) = .;             \
+               *(.hyp.idmap.text)                                      \
+               VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
+
+#define ARM_DISCARD                                                    \
+               *(.ARM.exidx.exit.text)                                 \
+               *(.ARM.extab.exit.text)                                 \
+               ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))             \
+               ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))             \
+               ARM_EXIT_DISCARD(EXIT_TEXT)                             \
+               ARM_EXIT_DISCARD(EXIT_DATA)                             \
+               EXIT_CALL                                               \
+               ARM_MMU_DISCARD(*(.text.fixup))                         \
+               ARM_MMU_DISCARD(*(__ex_table))                          \
+               *(.discard)                                             \
+               *(.discard.*)
+
+#define ARM_TEXT                                                       \
+               IDMAP_TEXT                                              \
+               __entry_text_start = .;                                 \
+               *(.entry.text)                                          \
+               __entry_text_end = .;                                   \
+               IRQENTRY_TEXT                                           \
+               SOFTIRQENTRY_TEXT                                       \
+               TEXT_TEXT                                               \
+               SCHED_TEXT                                              \
+               CPUIDLE_TEXT                                            \
+               LOCK_TEXT                                               \
+               HYPERVISOR_TEXT                                         \
+               KPROBES_TEXT                                            \
+               *(.gnu.warning)                                         \
+               *(.glue_7)                                              \
+               *(.glue_7t)                                             \
+               . = ALIGN(4);                                           \
+               *(.got)                 /* Global offset table */       \
+               ARM_CPU_KEEP(PROC_INFO)
+
+/* Stack unwinding tables */
+#define ARM_UNWIND_SECTIONS                                            \
+       . = ALIGN(8);                                                   \
+       .ARM.unwind_idx : {                                             \
+               __start_unwind_idx = .;                                 \
+               *(.ARM.exidx*)                                          \
+               __stop_unwind_idx = .;                                  \
+       }                                                               \
+       .ARM.unwind_tab : {                                             \
+               __start_unwind_tab = .;                                 \
+               *(.ARM.extab*)                                          \
+               __stop_unwind_tab = .;                                  \
+       }
+
+/*
+ * The vectors and stubs are relocatable code, and the
+ * only thing that matters is their relative offsets
+ */
+#define ARM_VECTORS                                                    \
+       __vectors_start = .;                                            \
+       .vectors 0xffff0000 : AT(__vectors_start) {                     \
+               *(.vectors)                                             \
+       }                                                               \
+       . = __vectors_start + SIZEOF(.vectors);                         \
+       __vectors_end = .;                                              \
+                                                                       \
+       __stubs_start = .;                                              \
+       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {            \
+               *(.stubs)                                               \
+       }                                                               \
+       . = __stubs_start + SIZEOF(.stubs);                             \
+       __stubs_end = .;                                                \
+                                                                       \
+       PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
+
+#define ARM_TCM                                                                \
+       __itcm_start = ALIGN(4);                                        \
+       .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) {       \
+               __sitcm_text = .;                                       \
+               *(.tcm.text)                                            \
+               *(.tcm.rodata)                                          \
+               . = ALIGN(4);                                           \
+               __eitcm_text = .;                                       \
+       }                                                               \
+       . = __itcm_start + SIZEOF(.text_itcm);                          \
+                                                                       \
+       __dtcm_start = .;                                               \
+       .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) {       \
+               __sdtcm_data = .;                                       \
+               *(.tcm.data)                                            \
+               . = ALIGN(4);                                           \
+               __edtcm_data = .;                                       \
+       }                                                               \
+       . = __dtcm_start + SIZEOF(.data_dtcm);
index bd6f451..c186474 100644 (file)
@@ -758,20 +758,9 @@ void set_kernel_text_ro(void)
 static inline void fix_kernmem_perms(void) { }
 #endif /* CONFIG_STRICT_KERNEL_RWX */
 
-void free_tcmmem(void)
-{
-#ifdef CONFIG_HAVE_TCM
-       extern char __tcm_start, __tcm_end;
-
-       poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start);
-       free_reserved_area(&__tcm_start, &__tcm_end, -1, "TCM link");
-#endif
-}
-
 void free_initmem(void)
 {
        fix_kernmem_perms();
-       free_tcmmem();
 
        poison_init_mem(__init_begin, __init_end - __init_begin);
        if (!machine_is_integrator() && !machine_is_cintegrator())
index d55d493..b528a15 100644 (file)
@@ -272,6 +272,7 @@ ENDPROC(cpu_pj4b_do_resume)
 __v7_ca5mp_setup:
 __v7_ca9mp_setup:
 __v7_cr7mp_setup:
+__v7_cr8mp_setup:
        mov     r10, #(1 << 0)                  @ Cache/TLB ops broadcasting
        b       1f
 __v7_ca7mp_setup:
@@ -641,6 +642,16 @@ __v7_cr7mp_proc_info:
        __v7_proc __v7_cr7mp_proc_info, __v7_cr7mp_setup
        .size   __v7_cr7mp_proc_info, . - __v7_cr7mp_proc_info
 
+       /*
+        * ARM Ltd. Cortex R8 processor.
+        */
+       .type   __v7_cr8mp_proc_info, #object
+__v7_cr8mp_proc_info:
+       .long   0x410fc180
+       .long   0xff0ffff0
+       __v7_proc __v7_cr8mp_proc_info, __v7_cr8mp_setup
+       .size   __v7_cr8mp_proc_info, . - __v7_cr8mp_proc_info
+
        /*
         * ARM Ltd. Cortex A7 processor.
         */