xtensa: reorganize vectors placement
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>
This commit is contained in:
Родитель
4f17664a44
Коммит
5e4417f921
|
@ -572,15 +572,41 @@ config KERNEL_LOAD_ADDRESS
|
||||||
|
|
||||||
If unsure, leave the default value here.
|
If unsure, leave the default value here.
|
||||||
|
|
||||||
config VECTORS_OFFSET
|
choice
|
||||||
hex "Kernel vectors offset"
|
prompt "Relocatable vectors location"
|
||||||
default 0x00003000
|
default XTENSA_VECTORS_IN_TEXT
|
||||||
depends on !XIP_KERNEL
|
|
||||||
help
|
help
|
||||||
This is the offset of the kernel image from the relocatable vectors
|
Choose whether relocatable vectors are merged into the kernel .text
|
||||||
base.
|
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
|
config XIP_DATA_ADDR
|
||||||
hex "XIP kernel data virtual address"
|
hex "XIP kernel data virtual address"
|
||||||
|
|
|
@ -30,7 +30,6 @@ CONFIG_SMP=y
|
||||||
CONFIG_HOTPLUG_CPU=y
|
CONFIG_HOTPLUG_CPU=y
|
||||||
# CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX is not set
|
# CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX is not set
|
||||||
# CONFIG_PCI is not set
|
# CONFIG_PCI is not set
|
||||||
CONFIG_VECTORS_OFFSET=0x00002000
|
|
||||||
CONFIG_XTENSA_PLATFORM_XTFPGA=y
|
CONFIG_XTENSA_PLATFORM_XTFPGA=y
|
||||||
CONFIG_CMDLINE_BOOL=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"
|
CONFIG_CMDLINE="earlycon=uart8250,mmio32native,0xfd050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug memmap=96M@0"
|
||||||
|
|
|
@ -19,7 +19,6 @@ CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
CONFIG_XTENSA_VARIANT_DC233C=y
|
CONFIG_XTENSA_VARIANT_DC233C=y
|
||||||
CONFIG_XTENSA_UNALIGNED_USER=y
|
CONFIG_XTENSA_UNALIGNED_USER=y
|
||||||
CONFIG_VECTORS_OFFSET=0x00002000
|
|
||||||
CONFIG_XTENSA_KSEG_512M=y
|
CONFIG_XTENSA_KSEG_512M=y
|
||||||
CONFIG_HIGHMEM=y
|
CONFIG_HIGHMEM=y
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
|
|
|
@ -34,8 +34,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RESET_VECTOR1_VADDR (XCHAL_RESET_VECTOR1_VADDR)
|
#define RESET_VECTOR1_VADDR (XCHAL_RESET_VECTOR1_VADDR)
|
||||||
#ifdef CONFIG_VECTORS_OFFSET
|
#ifdef CONFIG_VECTORS_ADDR
|
||||||
#define VECBASE_VADDR (KERNELOFFSET - CONFIG_VECTORS_OFFSET)
|
#define VECBASE_VADDR (CONFIG_VECTORS_ADDR)
|
||||||
#else
|
#else
|
||||||
#define VECBASE_VADDR _vecbase
|
#define VECBASE_VADDR _vecbase
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -349,7 +349,7 @@ void __init setup_arch(char **cmdline_p)
|
||||||
mem_reserve(__pa(_xip_start), __pa(_xip_end));
|
mem_reserve(__pa(_xip_start), __pa(_xip_end));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_VECTORS_OFFSET
|
#ifdef CONFIG_VECTORS_ADDR
|
||||||
mem_reserve(__pa(&_WindowVectors_text_start),
|
mem_reserve(__pa(&_WindowVectors_text_start),
|
||||||
__pa(&_WindowVectors_text_end));
|
__pa(&_WindowVectors_text_end));
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ void __init setup_arch(char **cmdline_p)
|
||||||
__pa(&_Level6InterruptVector_text_end));
|
__pa(&_Level6InterruptVector_text_end));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_VECTORS_OFFSET */
|
#endif /* CONFIG_VECTORS_ADDR */
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
mem_reserve(__pa(&_SecondaryResetVector_text_start),
|
mem_reserve(__pa(&_SecondaryResetVector_text_start),
|
||||||
|
|
|
@ -47,9 +47,15 @@ jiffies = jiffies_64;
|
||||||
LONG(sym ## _end); \
|
LONG(sym ## _end); \
|
||||||
LONG(LOADADDR(section))
|
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
|
* Macro to define a section for a vector. When MERGED_VECTORS is 0
|
||||||
* defined code for every vector is located with other init data. At startup
|
* 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
|
* time head.S copies code for every vector to its final position according
|
||||||
* to description recorded in the corresponding RELOCATE_ENTRY.
|
* to description recorded in the corresponding RELOCATE_ENTRY.
|
||||||
*/
|
*/
|
||||||
|
@ -84,7 +90,7 @@ SECTIONS
|
||||||
/* The HEAD_TEXT section must be the first section! */
|
/* The HEAD_TEXT section must be the first section! */
|
||||||
HEAD_TEXT
|
HEAD_TEXT
|
||||||
|
|
||||||
#ifndef CONFIG_VECTORS_OFFSET
|
#if MERGED_VECTORS
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
_vecbase = .;
|
_vecbase = .;
|
||||||
|
|
||||||
|
@ -159,7 +165,7 @@ SECTIONS
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
__boot_reloc_table_start = ABSOLUTE(.);
|
__boot_reloc_table_start = ABSOLUTE(.);
|
||||||
|
|
||||||
#ifdef CONFIG_VECTORS_OFFSET
|
#if !MERGED_VECTORS
|
||||||
RELOCATE_ENTRY(_WindowVectors_text,
|
RELOCATE_ENTRY(_WindowVectors_text,
|
||||||
.WindowVectors.text);
|
.WindowVectors.text);
|
||||||
#if XCHAL_EXCM_LEVEL >= 2
|
#if XCHAL_EXCM_LEVEL >= 2
|
||||||
|
@ -220,7 +226,7 @@ SECTIONS
|
||||||
#undef LAST
|
#undef LAST
|
||||||
#define LAST .dummy
|
#define LAST .dummy
|
||||||
|
|
||||||
#ifdef CONFIG_VECTORS_OFFSET
|
#if !MERGED_VECTORS
|
||||||
/* The vectors are relocated to the real position at startup time */
|
/* The vectors are relocated to the real position at startup time */
|
||||||
|
|
||||||
SECTION_VECTOR4 (_WindowVectors_text,
|
SECTION_VECTOR4 (_WindowVectors_text,
|
||||||
|
@ -299,7 +305,7 @@ SECTIONS
|
||||||
#define LAST .SecondaryResetVector.text
|
#define LAST .SecondaryResetVector.text
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_VECTORS_OFFSET
|
#if !MERGED_VECTORS
|
||||||
SECTION_VECTOR4 (_exception_text,
|
SECTION_VECTOR4 (_exception_text,
|
||||||
.exception.text,
|
.exception.text,
|
||||||
,
|
,
|
||||||
|
@ -310,6 +316,7 @@ SECTIONS
|
||||||
#endif
|
#endif
|
||||||
. = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;
|
. = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;
|
||||||
|
|
||||||
|
.dummy1 : AT(ADDR(.dummy1)) { LONG(0) }
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
|
||||||
#ifndef CONFIG_XIP_KERNEL
|
#ifndef CONFIG_XIP_KERNEL
|
||||||
|
@ -327,7 +334,7 @@ SECTIONS
|
||||||
|
|
||||||
#undef LOAD_OFFSET
|
#undef LOAD_OFFSET
|
||||||
#define 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 = .;
|
_xip_data_start = .;
|
||||||
_sdata = .;
|
_sdata = .;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче