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)
committerIngo Molnar <mingo@kernel.org>
Fri, 30 Jun 2017 08:19:19 +0000 (10:19 +0200)
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>
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 4b994232cb5739f15eef17c69be00aa3b3bc5243..3c7c419c4e3e86cd1db173748ff180dd173a780b 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_ftrace_$(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 901c640d152f7cb76529c38e5ab5576ca2d07c9f..69ea0bc1cfa394c0625f2beb9280db7a273dbafe 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>
@@ -94,6 +95,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
@@ -131,7 +133,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 2544700a2a87566437e3aea0d8b3696e7e0f439e..67393fc883534f47a5d5c4d92478da9f0601ef53 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>
@@ -123,6 +124,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 ba9891ac5c568f1798555bfa9dcbc421fff5ae2a..33460fcdeef9e7ae51b673704c242b4226eef4d1 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>
@@ -4906,6 +4907,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 ca5d2b93385c66e3531caefae4c06614ce6b2d45..1b469b6c762f17795a734d40a1fc9eba5b15a9ad 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/slab.h>
 #include <linux/tboot.h>
 #include <linux/hrtimer.h>
+#include <linux/frame.h>
 #include "kvm_cache_regs.h"
 #include "x86.h"
 
@@ -8652,6 +8653,7 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu)
                        );
        }
 }
+STACK_FRAME_NON_STANDARD(vmx_handle_external_intr);
 
 static bool vmx_has_high_real_mode_segbase(void)
 {
@@ -9028,6 +9030,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_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs)
 {
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 f1d83b34c32970ce5a0c5482a9cccd61fcbcdfe9..2f56e1ed61c30f9e57300e8ee311b2d2767115c4 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_EARLY_PRINTK_EFI) += early_printk.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 fffb0a16f9e33b6905ca16615555fd0c4145a0e7..bced7a369a11dea1284ddc9416ca3256531104c4 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 ae1a3ba24df56958bb48f30ddde85ae6ae833fdf..154ffb489b93de01631ed4810b5042ba6fa8f123 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>
@@ -874,7 +875,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
@@ -896,6 +897,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)
 {