From 970687a4c18ac5adb2124c673e31fbfe079220ca Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 23 Dec 2017 00:51:24 +0000 Subject: [PATCH 1/8] x86: Add initial retpoline support with -mindirect-branch=thunk-extern Signed-off-by: David Woodhouse --- arch/x86/Makefile | 7 +++++++ arch/x86/kernel/Makefile | 1 + arch/x86/kernel/retpoline.S | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 arch/x86/kernel/retpoline.S diff --git a/arch/x86/Makefile b/arch/x86/Makefile index a20eacd..a6d5d39 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -235,6 +235,13 @@ KBUILD_CFLAGS += -Wno-sign-compare # KBUILD_CFLAGS += -fno-asynchronous-unwind-tables +# +RETPOLINE_CFLAGS += $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register) +ifneq ($(RETPOLINE_CFLAGS),) + KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE + KBUILD_AFLAGS += -DRETPOLINE +endif + archscripts: scripts_basic $(Q)$(MAKE) $(build)=arch/x86/tools relocs diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 295abaa..d1af553 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_MODIFY_LDT_SYSCALL) += ldt.o obj-y += setup.o x86_init.o i8259.o irqinit.o jump_label.o obj-$(CONFIG_IRQ_WORK) += irq_work.o obj-y += probe_roms.o +obj-y += retpoline.o obj-$(CONFIG_X86_64) += sys_x86_64.o obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o obj-$(CONFIG_SYSFS) += ksysfs.o diff --git a/arch/x86/kernel/retpoline.S b/arch/x86/kernel/retpoline.S new file mode 100644 index 0000000..b2b17b1 --- /dev/null +++ b/arch/x86/kernel/retpoline.S @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef RETPOLINE + +#include +#include +#include +#include +#include + +.macro THUNK sp reg + .section .text.__x86.indirect_thunk.\reg + +ENTRY(__x86.indirect_thunk.\reg) + CFI_STARTPROC + ALTERNATIVE "call 2f", __stringify(jmp *%\reg), X86_FEATURE_IBRS_ATT +1: + lfence + jmp 1b +2: + mov %\reg, (%\sp) + ret + CFI_ENDPROC +ENDPROC(__x86.indirect_thunk.\reg) +.endm + +#ifdef CONFIG_64BIT +.irp reg rax rbx rcx rdx rsi rdi rbp r8 r9 r10 r11 r12 r13 r14 r15 + THUNK rsp \reg +.endr +#else +.irp reg eax ebx ecx edx esi edi ebp + THUNK esp \reg +.endr +#endif + +#endif /* RETPOLINE */ -- 2.7.4