ab45fb1450
There are multiple factors adding to the issue in different
configurations:
- commit 17290231df
("xtensa: add fixup for double exception raised
in window overflow") added function window_overflow_restore_a0_fixup to
double exception vector overlapping reset vector location of secondary
processor cores.
- on MMUv2 cores RESET_VECTOR1_VADDR may point to uncached kernel memory
making code overlapping depend on cache type and size, so that without
cache or with WT cache reset vector code overwrites double exception
code, making issue even harder to detect.
- on MMUv3 cores RESET_VECTOR1_VADDR may point to unmapped area, as
MMUv3 cores change virtual address map to match MMUv2 layout, but
reset vector virtual address is given for the original MMUv3 mapping.
- physical memory region of the secondary reset vector is not reserved
in the physical memory map, and thus may be allocated and overwritten
at arbitrary moment.
Fix it as follows:
- move window_overflow_restore_a0_fixup code to .text section.
- define RESET_VECTOR1_VADDR so that it points to reset vector in the
cacheable MMUv2 map for cores with MMU.
- reserve reset vector region in the physical memory map. Drop separate
literal section and build mxhead.S with text section literals.
Cc: <stable@vger.kernel.org>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
44 lines
1.6 KiB
Makefile
44 lines
1.6 KiB
Makefile
#
|
|
# Makefile for the Linux/Xtensa kernel.
|
|
#
|
|
|
|
extra-y := head.o vmlinux.lds
|
|
|
|
obj-y := align.o coprocessor.o entry.o irq.o pci-dma.o platform.o process.o \
|
|
ptrace.o setup.o signal.o stacktrace.o syscall.o time.o traps.o \
|
|
vectors.o
|
|
|
|
obj-$(CONFIG_KGDB) += xtensa-stub.o
|
|
obj-$(CONFIG_PCI) += pci.o
|
|
obj-$(CONFIG_MODULES) += xtensa_ksyms.o module.o
|
|
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o
|
|
obj-$(CONFIG_SMP) += smp.o mxhead.o
|
|
obj-$(CONFIG_XTENSA_VARIANT_HAVE_PERF_EVENTS) += perf_event.o
|
|
|
|
AFLAGS_head.o += -mtext-section-literals
|
|
AFLAGS_mxhead.o += -mtext-section-literals
|
|
|
|
# In the Xtensa architecture, assembly generates literals which must always
|
|
# precede the L32R instruction with a relative offset less than 256 kB.
|
|
# Therefore, the .text and .literal section must be combined in parenthesis
|
|
# in the linker script, such as: *(.literal .text).
|
|
#
|
|
# We need to post-process the generated vmlinux.lds scripts to convert
|
|
# *(xxx.text) to *(xxx.literal xxx.text) for the following text sections:
|
|
# .text .ref.text .*init.text .*exit.text .text.*
|
|
#
|
|
# Replicate rules in scripts/Makefile.build
|
|
|
|
sed-y = -e ':a; s/\*(\([^)]*\)\.text\.unlikely/*(\1.literal.unlikely .{text}.unlikely/; ta; ' \
|
|
-e ':b; s/\*(\([^)]*\)\.text\(\.[a-z]*\)/*(\1.{text}\2.literal .{text}\2/; tb; ' \
|
|
-e ':c; s/\*(\([^)]*\)\(\.[a-z]*it\|\.ref\)\.text/*(\1\2.literal \2.{text}/; tc; ' \
|
|
-e ':d; s/\*(\([^)]\+ \|\)\.text/*(\1.literal .{text}/; td; ' \
|
|
-e 's/\.{text}/.text/g'
|
|
|
|
quiet_cmd__cpp_lds_S = LDS $@
|
|
cmd__cpp_lds_S = $(CPP) $(cpp_flags) -P -C -Uxtensa -D__ASSEMBLY__ $< \
|
|
| sed $(sed-y) >$@
|
|
|
|
$(obj)/vmlinux.lds: $(src)/vmlinux.lds.S FORCE
|
|
$(call if_changed_dep,_cpp_lds_S)
|