objtool, x86: Add several functions and files to the objtool whitelist
authorJosh Poimboeuf <jpoimboe@redhat.com>
Wed, 28 Jun 2017 15:11:06 +0000 (10:11 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 5 Jun 2018 08:28:57 +0000 (10:28 +0200)
commit c207aee48037abca71c669cbec407b9891965c34 upstream.

In preparation for an objtool rewrite which will have broader checks,
whitelist functions and files which cause problems because they do
unusual things with the stack.

These whitelists serve as a TODO list for which functions and files
don't yet have undwarf unwinder coverage.  Eventually most of the
whitelists can be removed in favor of manual CFI hint annotations or
objtool improvements.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: live-patching@vger.kernel.org
Link: http://lkml.kernel.org/r/7f934a5d707a574bda33ea282e9478e627fb1829.1498659915.git.jpoimboe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
15 files changed:
arch/x86/crypto/Makefile
arch/x86/crypto/sha1-mb/Makefile
arch/x86/crypto/sha256-mb/Makefile
arch/x86/kernel/Makefile
arch/x86/kernel/acpi/Makefile
arch/x86/kernel/kprobes/opt.c
arch/x86/kernel/reboot.c
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c
arch/x86/lib/msr-reg.S
arch/x86/net/Makefile
arch/x86/platform/efi/Makefile
arch/x86/power/Makefile
arch/x86/xen/Makefile
kernel/kexec_core.c

index 34b3fa2889d1f68066125ef0e41b12ffbdaf21ec..9e32d40d71bdb41fe3ac0c7461ae09c54ca1a3a3 100644 (file)
@@ -2,6 +2,8 @@
 # Arch-specific CryptoAPI modules.
 #
 
+OBJECT_FILES_NON_STANDARD := y
+
 avx_supported := $(call as-instr,vpxor %xmm0$(comma)%xmm0$(comma)%xmm0,yes,no)
 avx2_supported := $(call as-instr,vpgatherdd %ymm0$(comma)(%eax$(comma)%ymm1\
                                $(comma)4)$(comma)%ymm2,yes,no)
index 2f8756375df54ada72e78eb54a24baafc07d5abf..2e14acc3da25b5cc65873fa93551f8a234cbe2ef 100644 (file)
@@ -2,6 +2,8 @@
 # Arch-specific CryptoAPI modules.
 #
 
+OBJECT_FILES_NON_STANDARD := y
+
 avx2_supported := $(call as-instr,vpgatherdd %ymm0$(comma)(%eax$(comma)%ymm1\
                                 $(comma)4)$(comma)%ymm2,yes,no)
 ifeq ($(avx2_supported),yes)
index 41089e7c400c38bf41d26404d2fae70e34199205..45b4fca6c4a8fef15e45c2673fe04c5ffa54479b 100644 (file)
@@ -2,6 +2,8 @@
 # Arch-specific CryptoAPI modules.
 #
 
+OBJECT_FILES_NON_STANDARD := y
+
 avx2_supported := $(call as-instr,vpgatherdd %ymm0$(comma)(%eax$(comma)%ymm1\
                                 $(comma)4)$(comma)%ymm2,yes,no)
 ifeq ($(avx2_supported),yes)
index 79076d75bdbfde2aec556e14fd8622e7c017682a..4c9c61517613e78c0a39b7364224f25807ea36f5 100644 (file)
@@ -29,6 +29,7 @@ OBJECT_FILES_NON_STANDARD_head_$(BITS).o              := y
 OBJECT_FILES_NON_STANDARD_relocate_kernel_$(BITS).o    := y
 OBJECT_FILES_NON_STANDARD_mcount_$(BITS).o             := y
 OBJECT_FILES_NON_STANDARD_test_nx.o                    := y
+OBJECT_FILES_NON_STANDARD_paravirt_patch_$(BITS).o     := y
 
 # If instrumentation of this dir is enabled, boot hangs during first second.
 # Probably could be more selective here, but note that files related to irqs,
index 26b78d86f25a1b54d4811801df682a5d50ed0427..85a9e17e0dbc409c759c06a8b4dec1efae9d3be8 100644 (file)
@@ -1,3 +1,5 @@
+OBJECT_FILES_NON_STANDARD_wakeup_$(BITS).o := y
+
 obj-$(CONFIG_ACPI)             += boot.o
 obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup_$(BITS).o
 obj-$(CONFIG_ACPI_APEI)                += apei.o
index fa671b90c37457db89e7644cf3f62150b01a0d9d..1808a9cc7701a72d5d3e72d3083b2aee7e46f1f3 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/kdebug.h>
 #include <linux/kallsyms.h>
 #include <linux/ftrace.h>
+#include <linux/frame.h>
 
 #include <asm/text-patching.h>
 #include <asm/cacheflush.h>
@@ -91,6 +92,7 @@ static void synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long val)
 }
 
 asm (
+                       "optprobe_template_func:\n"
                        ".global optprobe_template_entry\n"
                        "optprobe_template_entry:\n"
 #ifdef CONFIG_X86_64
@@ -128,7 +130,12 @@ asm (
                        "       popf\n"
 #endif
                        ".global optprobe_template_end\n"
-                       "optprobe_template_end:\n");
+                       "optprobe_template_end:\n"
+                       ".type optprobe_template_func, @function\n"
+                       ".size optprobe_template_func, .-optprobe_template_func\n");
+
+void optprobe_template_func(void);
+STACK_FRAME_NON_STANDARD(optprobe_template_func);
 
 #define TMPL_MOVE_IDX \
        ((long)&optprobe_template_val - (long)&optprobe_template_entry)
index 03f21dbfaa9d871f45ebcd11e505ea443ae48362..4a12362a194afe06730f679fa3e2f59cade68f82 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/sched.h>
 #include <linux/tboot.h>
 #include <linux/delay.h>
+#include <linux/frame.h>
 #include <acpi/reboot.h>
 #include <asm/io.h>
 #include <asm/apic.h>
@@ -127,6 +128,7 @@ void __noreturn machine_real_restart(unsigned int type)
 #ifdef CONFIG_APM_MODULE
 EXPORT_SYMBOL(machine_real_restart);
 #endif
+STACK_FRAME_NON_STANDARD(machine_real_restart);
 
 /*
  * Some Apple MacBook and MacBookPro's needs reboot=p to be able to reboot
index a27f9e442ffc88343d65a26084b2ead89b77b367..c4cd1280ac3e5422ed4bdc4d70699763cea5f356 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/slab.h>
 #include <linux/amd-iommu.h>
 #include <linux/hashtable.h>
+#include <linux/frame.h>
 
 #include <asm/apic.h>
 #include <asm/perf_event.h>
@@ -5111,6 +5112,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
 
        mark_all_clean(svm->vmcb);
 }
+STACK_FRAME_NON_STANDARD(svm_vcpu_run);
 
 static void svm_set_cr3(struct kvm_vcpu *vcpu, unsigned long root)
 {
index 2827a9622d978fe735e14609c45131b4d9d5a737..4a66a620fc17dbb15b407504dec5ba48b1ec4a58 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/slab.h>
 #include <linux/tboot.h>
 #include <linux/hrtimer.h>
+#include <linux/frame.h>
 #include <linux/nospec.h>
 #include "kvm_cache_regs.h"
 #include "x86.h"
@@ -8698,6 +8699,7 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu)
                        );
        }
 }
+STACK_FRAME_NON_STANDARD(vmx_handle_external_intr);
 
 static bool vmx_has_emulated_msr(int index)
 {
@@ -9138,6 +9140,7 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
        vmx_recover_nmi_blocking(vmx);
        vmx_complete_interrupts(vmx);
 }
+STACK_FRAME_NON_STANDARD(vmx_vcpu_run);
 
 static void vmx_load_vmcs01(struct kvm_vcpu *vcpu)
 {
index c81556409bbb87cfbfb5b2b8b2cdd26e8e916730..10ffa7e8519f06ac1d6ea7e7ecf7faba1e260594 100644 (file)
 .macro op_safe_regs op
 ENTRY(\op\()_safe_regs)
        pushq %rbx
-       pushq %rbp
+       pushq %r12
        movq    %rdi, %r10      /* Save pointer */
        xorl    %r11d, %r11d    /* Return value */
        movl    (%rdi), %eax
        movl    4(%rdi), %ecx
        movl    8(%rdi), %edx
        movl    12(%rdi), %ebx
-       movl    20(%rdi), %ebp
+       movl    20(%rdi), %r12d
        movl    24(%rdi), %esi
        movl    28(%rdi), %edi
 1:     \op
@@ -29,10 +29,10 @@ ENTRY(\op\()_safe_regs)
        movl    %ecx, 4(%r10)
        movl    %edx, 8(%r10)
        movl    %ebx, 12(%r10)
-       movl    %ebp, 20(%r10)
+       movl    %r12d, 20(%r10)
        movl    %esi, 24(%r10)
        movl    %edi, 28(%r10)
-       popq %rbp
+       popq %r12
        popq %rbx
        ret
 3:
index 90568c33ddb0ef72aaed02bcf4bcc15da9afef37..fefb4b619598c0f34a5994ea9bcc5ba5a70dc9dd 100644 (file)
@@ -1,4 +1,6 @@
 #
 # Arch-specific network modules
 #
+OBJECT_FILES_NON_STANDARD_bpf_jit.o += y
+
 obj-$(CONFIG_BPF_JIT) += bpf_jit.o bpf_jit_comp.o
index 066619b0700c91643c31c49f1cbc8f2d4899bb88..7a255022933e65081cb971b048b56c21c765d309 100644 (file)
@@ -1,4 +1,5 @@
 OBJECT_FILES_NON_STANDARD_efi_thunk_$(BITS).o := y
+OBJECT_FILES_NON_STANDARD_efi_stub_$(BITS).o := y
 
 obj-$(CONFIG_EFI)              += quirks.o efi.o efi_$(BITS).o efi_stub_$(BITS).o
 obj-$(CONFIG_ACPI_BGRT) += efi-bgrt.o
index a6a198c336238f63a2c0962fe2f94212ee6712e2..05041871ac9098026bbe2614a70d03f1bfd6f816 100644 (file)
@@ -1,3 +1,5 @@
+OBJECT_FILES_NON_STANDARD_hibernate_asm_$(BITS).o := y
+
 # __restore_processor_state() restores %gs after S3 resume and so should not
 # itself be stack-protected
 nostackp := $(call cc-option, -fno-stack-protector)
index e47e52787d32eb9e4b9c7b6cb50b7a11f57dc586..4a54059f42ba58c0cc06869a78e731334f59c7e5 100644 (file)
@@ -1,3 +1,6 @@
+OBJECT_FILES_NON_STANDARD_xen-asm_$(BITS).o := y
+OBJECT_FILES_NON_STANDARD_xen-pvh.o := y
+
 ifdef CONFIG_FUNCTION_TRACER
 # Do not profile debug and lowlevel utilities
 CFLAGS_REMOVE_spinlock.o = -pg
index 5616755895119bef0d69066c4c33f60ffa3afcc8..f5ab72ebda1134a398748ae5907c585efc85d4b9 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/syscore_ops.h>
 #include <linux/compiler.h>
 #include <linux/hugetlb.h>
+#include <linux/frame.h>
 
 #include <asm/page.h>
 #include <asm/sections.h>
@@ -878,7 +879,7 @@ int kexec_load_disabled;
  * only when panic_cpu holds the current CPU number; this is the only CPU
  * which processes crash_kexec routines.
  */
-void __crash_kexec(struct pt_regs *regs)
+void __noclone __crash_kexec(struct pt_regs *regs)
 {
        /* Take the kexec_mutex here to prevent sys_kexec_load
         * running on one cpu from replacing the crash kernel
@@ -900,6 +901,7 @@ void __crash_kexec(struct pt_regs *regs)
                mutex_unlock(&kexec_mutex);
        }
 }
+STACK_FRAME_NON_STANDARD(__crash_kexec);
 
 void crash_kexec(struct pt_regs *regs)
 {