xtensa: reorganize vectors placement
authorMax Filippov <jcmvbkbc@gmail.com>
Sat, 1 Feb 2020 04:11:24 +0000 (20:11 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Wed, 5 Feb 2020 05:57:02 +0000 (21:57 -0800)
Allow vectors to be either merged into the kernel .text or put at a
fixed virtual address independently of XIP option. Drop option that
puts vectors at a fixed offset from the kernel text. Add choice to
Kconfig.
Vectors at fixed virtual address may be useful for XIP-aware MTD support
and for noMMU configurations with available IRAM. Configurations without
VECBASE register must put their vectors at specific locations regardless
of the selected option. All other configurations should happily use
merged vectors.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/Kconfig
arch/xtensa/configs/smp_lx200_defconfig
arch/xtensa/configs/virt_defconfig
arch/xtensa/include/asm/vectors.h
arch/xtensa/kernel/setup.c
arch/xtensa/kernel/vmlinux.lds.S

index 06e6161797fadd579aa526e908c30b5c7a6d0ebe..133385d13c0225bce3dd12ba7cef89ff644b385d 100644 (file)
@@ -572,15 +572,41 @@ config KERNEL_LOAD_ADDRESS
 
          If unsure, leave the default value here.
 
-config VECTORS_OFFSET
-       hex "Kernel vectors offset"
-       default 0x00003000
-       depends on !XIP_KERNEL
+choice
+       prompt "Relocatable vectors location"
+       default XTENSA_VECTORS_IN_TEXT
        help
-         This is the offset of the kernel image from the relocatable vectors
-         base.
+         Choose whether relocatable vectors are merged into the kernel .text
+         or placed separately at runtime. This option does not affect
+         configurations without VECBASE register where vectors are always
+         placed at their hardware-defined locations.
 
-         If unsure, leave the default value here.
+config XTENSA_VECTORS_IN_TEXT
+       bool "Merge relocatable vectors into kernel text"
+       depends on !MTD_XIP
+       help
+         This option puts relocatable vectors into the kernel .text section
+         with proper alignment.
+         This is a safe choice for most configurations.
+
+config XTENSA_VECTORS_SEPARATE
+       bool "Put relocatable vectors at fixed address"
+       help
+         This option puts relocatable vectors at specific virtual address.
+         Vectors are merged with the .init data in the kernel image and
+         are copied into their designated location during kernel startup.
+         Use it to put vectors into IRAM or out of FLASH on kernels with
+         XIP-aware MTD support.
+
+endchoice
+
+config VECTORS_ADDR
+       hex "Kernel vectors virtual address"
+       default 0x00000000
+       depends on XTENSA_VECTORS_SEPARATE
+       help
+         This is the virtual address of the (relocatable) vectors base.
+         It must be within KSEG if MMU is used.
 
 config XIP_DATA_ADDR
        hex "XIP kernel data virtual address"
index 8b3bc92a079c485edfa31dc55c9cb668b4de7288..4f1c7998b03050cc56febcd0693ac03c750b4d7d 100644 (file)
@@ -30,7 +30,6 @@ CONFIG_SMP=y
 CONFIG_HOTPLUG_CPU=y
 # CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX is not set
 # CONFIG_PCI is not set
-CONFIG_VECTORS_OFFSET=0x00002000
 CONFIG_XTENSA_PLATFORM_XTFPGA=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE="earlycon=uart8250,mmio32native,0xfd050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug memmap=96M@0"
index 4fddd8512350e69b410b09694597b416697caa18..6d1387dfa96fcd1d4aa91b6f70773cf162b706e2 100644 (file)
@@ -19,7 +19,6 @@ CONFIG_KALLSYMS_ALL=y
 CONFIG_PERF_EVENTS=y
 CONFIG_XTENSA_VARIANT_DC233C=y
 CONFIG_XTENSA_UNALIGNED_USER=y
-CONFIG_VECTORS_OFFSET=0x00002000
 CONFIG_XTENSA_KSEG_512M=y
 CONFIG_HIGHMEM=y
 CONFIG_CMDLINE_BOOL=y
index 140f30762cf9fed981fb5461694b1bc8c0f14620..704286c35640618f8875bf20e2cf9573f599efcc 100644 (file)
@@ -34,8 +34,8 @@
 #endif
 
 #define RESET_VECTOR1_VADDR            (XCHAL_RESET_VECTOR1_VADDR)
-#ifdef CONFIG_VECTORS_OFFSET
-#define VECBASE_VADDR                  (KERNELOFFSET - CONFIG_VECTORS_OFFSET)
+#ifdef CONFIG_VECTORS_ADDR
+#define VECBASE_VADDR                  (CONFIG_VECTORS_ADDR)
 #else
 #define VECBASE_VADDR                  _vecbase
 #endif
index fefbdce1db99a3545e95d1fec82efa27516c48e1..1e9b9e7d9583522f7a70efc75aa58d06fab9ef5b 100644 (file)
@@ -349,7 +349,7 @@ void __init setup_arch(char **cmdline_p)
        mem_reserve(__pa(_xip_start), __pa(_xip_end));
 #endif
 
-#ifdef CONFIG_VECTORS_OFFSET
+#ifdef CONFIG_VECTORS_ADDR
        mem_reserve(__pa(&_WindowVectors_text_start),
                    __pa(&_WindowVectors_text_end));
 
@@ -388,7 +388,7 @@ void __init setup_arch(char **cmdline_p)
                    __pa(&_Level6InterruptVector_text_end));
 #endif
 
-#endif /* CONFIG_VECTORS_OFFSET */
+#endif /* CONFIG_VECTORS_ADDR */
 
 #ifdef CONFIG_SMP
        mem_reserve(__pa(&_SecondaryResetVector_text_start),
index d9e547810b6cf439106f15220bd482389488993d..d23a6e38f06253d0d21970c92f9da821627eac77 100644 (file)
@@ -47,9 +47,15 @@ jiffies = jiffies_64;
        LONG(sym ## _end);                      \
        LONG(LOADADDR(section))
 
+#if !defined(CONFIG_VECTORS_ADDR) && XCHAL_HAVE_VECBASE
+#define MERGED_VECTORS 1
+#else
+#define MERGED_VECTORS 0
+#endif
+
 /*
- * Macro to define a section for a vector. When CONFIG_VECTORS_OFFSET is
- * defined code for every vector is located with other init data. At startup
+ * Macro to define a section for a vector. When MERGED_VECTORS is 0
+ * code for every vector is located with other init data. At startup
  * time head.S copies code for every vector to its final position according
  * to description recorded in the corresponding RELOCATE_ENTRY.
  */
@@ -84,7 +90,7 @@ SECTIONS
     /* The HEAD_TEXT section must be the first section! */
     HEAD_TEXT
 
-#ifndef CONFIG_VECTORS_OFFSET
+#if MERGED_VECTORS
     . = ALIGN(PAGE_SIZE);
     _vecbase = .;
 
@@ -159,7 +165,7 @@ SECTIONS
     . = ALIGN(16);
     __boot_reloc_table_start = ABSOLUTE(.);
 
-#ifdef CONFIG_VECTORS_OFFSET
+#if !MERGED_VECTORS
     RELOCATE_ENTRY(_WindowVectors_text,
                   .WindowVectors.text);
 #if XCHAL_EXCM_LEVEL >= 2
@@ -220,7 +226,7 @@ SECTIONS
 #undef LAST
 #define LAST   .dummy
 
-#ifdef CONFIG_VECTORS_OFFSET
+#if !MERGED_VECTORS
   /* The vectors are relocated to the real position at startup time */
 
   SECTION_VECTOR4 (_WindowVectors_text,
@@ -299,7 +305,7 @@ SECTIONS
 #define LAST .SecondaryResetVector.text
 
 #endif
-#ifdef CONFIG_VECTORS_OFFSET
+#if !MERGED_VECTORS
   SECTION_VECTOR4 (_exception_text,
                  .exception.text,
                  ,
@@ -310,6 +316,7 @@ SECTIONS
 #endif
   . = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;
 
+  .dummy1 : AT(ADDR(.dummy1)) { LONG(0) }
   . = ALIGN(PAGE_SIZE);
 
 #ifndef CONFIG_XIP_KERNEL
@@ -327,7 +334,7 @@ SECTIONS
 
 #undef LOAD_OFFSET
 #define LOAD_OFFSET \
-  (CONFIG_XIP_DATA_ADDR - (LOADADDR(.dummy) + SIZEOF(.dummy) + 3) & ~ 3)
+  (CONFIG_XIP_DATA_ADDR - (LOADADDR(.dummy1) + SIZEOF(.dummy1) + 3) & ~ 3)
 
   _xip_data_start = .;
   _sdata = .;