]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.2-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 16 Sep 2019 19:25:06 +0000 (21:25 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 16 Sep 2019 19:25:06 +0000 (21:25 +0200)
added patches:
x86-purgatory-change-compiler-flags-from-mcmodel-kernel-to-mcmodel-large-to-fix-kexec-relocation-errors.patch

queue-5.2/series
queue-5.2/x86-purgatory-change-compiler-flags-from-mcmodel-kernel-to-mcmodel-large-to-fix-kexec-relocation-errors.patch [new file with mode: 0644]

index 98034ba1d739fd40d0f78f98d6f722db7ff4ca72..b0973174980cbb32cef5b275f86413f4cd414478 100644 (file)
@@ -45,3 +45,4 @@ kvm-s390-do-not-leak-kernel-stack-data-in-the-kvm_s390_interrupt-ioctl.patch
 kvm-x86-work-around-leak-of-uninitialized-stack-contents.patch
 kvm-x86-mmu-reintroduce-fast-invalidate-zap-for-flushing-memslot.patch
 kvm-nvmx-handle-page-fault-in-vmread.patch
+x86-purgatory-change-compiler-flags-from-mcmodel-kernel-to-mcmodel-large-to-fix-kexec-relocation-errors.patch
diff --git a/queue-5.2/x86-purgatory-change-compiler-flags-from-mcmodel-kernel-to-mcmodel-large-to-fix-kexec-relocation-errors.patch b/queue-5.2/x86-purgatory-change-compiler-flags-from-mcmodel-kernel-to-mcmodel-large-to-fix-kexec-relocation-errors.patch
new file mode 100644 (file)
index 0000000..45b3686
--- /dev/null
@@ -0,0 +1,133 @@
+From e16c2983fba0fa6763e43ad10916be35e3d8dc05 Mon Sep 17 00:00:00 2001
+From: Steve Wahl <steve.wahl@hpe.com>
+Date: Thu, 5 Sep 2019 15:23:46 -0500
+Subject: x86/purgatory: Change compiler flags from -mcmodel=kernel to -mcmodel=large to fix kexec relocation errors
+
+From: Steve Wahl <steve.wahl@hpe.com>
+
+commit e16c2983fba0fa6763e43ad10916be35e3d8dc05 upstream.
+
+The last change to this Makefile caused relocation errors when loading
+a kdump kernel.  Restore -mcmodel=large (not -mcmodel=kernel),
+-ffreestanding, and -fno-zero-initialized-bsss, without reverting to
+the former practice of resetting KBUILD_CFLAGS.
+
+Purgatory.ro is a standalone binary that is not linked against the
+rest of the kernel.  Its image is copied into an array that is linked
+to the kernel, and from there kexec relocates it wherever it desires.
+
+With the previous change to compiler flags, the error "kexec: Overflow
+in relocation type 11 value 0x11fffd000" was encountered when trying
+to load the crash kernel.  This is from kexec code trying to relocate
+the purgatory.ro object.
+
+From the error message, relocation type 11 is R_X86_64_32S.  The
+x86_64 ABI says:
+
+  "The R_X86_64_32 and R_X86_64_32S relocations truncate the
+   computed value to 32-bits.  The linker must verify that the
+   generated value for the R_X86_64_32 (R_X86_64_32S) relocation
+   zero-extends (sign-extends) to the original 64-bit value."
+
+This type of relocation doesn't work when kexec chooses to place the
+purgatory binary in memory that is not reachable with 32 bit
+addresses.
+
+The compiler flag -mcmodel=kernel allows those type of relocations to
+be emitted, so revert to using -mcmodel=large as was done before.
+
+Also restore the -ffreestanding and -fno-zero-initialized-bss flags
+because they are appropriate for a stand alone piece of object code
+which doesn't explicitly zero the bss, and one other report has said
+undefined symbols are encountered without -ffreestanding.
+
+These identical compiler flag changes need to happen for every object
+that becomes part of the purgatory.ro object, so gather them together
+first into PURGATORY_CFLAGS_REMOVE and PURGATORY_CFLAGS, and then
+apply them to each of the objects that have C source.  Do not apply
+any of these flags to kexec-purgatory.o, which is not part of the
+standalone object but part of the kernel proper.
+
+Tested-by: Vaibhav Rustagi <vaibhavrustagi@google.com>
+Tested-by: Andreas Smas <andreas@lonelycoder.com>
+Signed-off-by: Steve Wahl <steve.wahl@hpe.com>
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: None
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: clang-built-linux@googlegroups.com
+Cc: dimitri.sivanich@hpe.com
+Cc: mike.travis@hpe.com
+Cc: russ.anderson@hpe.com
+Fixes: b059f801a937 ("x86/purgatory: Use CFLAGS_REMOVE rather than reset KBUILD_CFLAGS")
+Link: https://lkml.kernel.org/r/20190905202346.GA26595@swahl-linux
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Cc: Andreas Smas <andreas@lonelycoder.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/purgatory/Makefile |   35 +++++++++++++++++++----------------
+ 1 file changed, 19 insertions(+), 16 deletions(-)
+
+--- a/arch/x86/purgatory/Makefile
++++ b/arch/x86/purgatory/Makefile
+@@ -18,37 +18,40 @@ targets += purgatory.ro
+ KASAN_SANITIZE        := n
+ KCOV_INSTRUMENT := n
++# These are adjustments to the compiler flags used for objects that
++# make up the standalone purgatory.ro
++
++PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
++PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss
++
+ # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
+ # in turn leaves some undefined symbols like __fentry__ in purgatory and not
+ # sure how to relocate those.
+ ifdef CONFIG_FUNCTION_TRACER
+-CFLAGS_REMOVE_sha256.o                += $(CC_FLAGS_FTRACE)
+-CFLAGS_REMOVE_purgatory.o     += $(CC_FLAGS_FTRACE)
+-CFLAGS_REMOVE_string.o                += $(CC_FLAGS_FTRACE)
+-CFLAGS_REMOVE_kexec-purgatory.o       += $(CC_FLAGS_FTRACE)
++PURGATORY_CFLAGS_REMOVE               += $(CC_FLAGS_FTRACE)
+ endif
+ ifdef CONFIG_STACKPROTECTOR
+-CFLAGS_REMOVE_sha256.o                += -fstack-protector
+-CFLAGS_REMOVE_purgatory.o     += -fstack-protector
+-CFLAGS_REMOVE_string.o                += -fstack-protector
+-CFLAGS_REMOVE_kexec-purgatory.o       += -fstack-protector
++PURGATORY_CFLAGS_REMOVE               += -fstack-protector
+ endif
+ ifdef CONFIG_STACKPROTECTOR_STRONG
+-CFLAGS_REMOVE_sha256.o                += -fstack-protector-strong
+-CFLAGS_REMOVE_purgatory.o     += -fstack-protector-strong
+-CFLAGS_REMOVE_string.o                += -fstack-protector-strong
+-CFLAGS_REMOVE_kexec-purgatory.o       += -fstack-protector-strong
++PURGATORY_CFLAGS_REMOVE               += -fstack-protector-strong
+ endif
+ ifdef CONFIG_RETPOLINE
+-CFLAGS_REMOVE_sha256.o                += $(RETPOLINE_CFLAGS)
+-CFLAGS_REMOVE_purgatory.o     += $(RETPOLINE_CFLAGS)
+-CFLAGS_REMOVE_string.o                += $(RETPOLINE_CFLAGS)
+-CFLAGS_REMOVE_kexec-purgatory.o       += $(RETPOLINE_CFLAGS)
++PURGATORY_CFLAGS_REMOVE               += $(RETPOLINE_CFLAGS)
+ endif
++CFLAGS_REMOVE_purgatory.o     += $(PURGATORY_CFLAGS_REMOVE)
++CFLAGS_purgatory.o            += $(PURGATORY_CFLAGS)
++
++CFLAGS_REMOVE_sha256.o                += $(PURGATORY_CFLAGS_REMOVE)
++CFLAGS_sha256.o                       += $(PURGATORY_CFLAGS)
++
++CFLAGS_REMOVE_string.o                += $(PURGATORY_CFLAGS_REMOVE)
++CFLAGS_string.o                       += $(PURGATORY_CFLAGS)
++
+ $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
+               $(call if_changed,ld)