x86: Support compiling with indirect branch thunks

Use -mindirect-branch=thunk-extern/-mindirect-branch-register when available.
To begin with, use the retpoline thunk.  Later work will add alternative
thunks which can be selected at boot time.

This is part of XSA-254.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2018-01-16 17:45:50 +00:00
1 parent e871e80c38
commit 3659f0f4bc
4 files changed
+47

No files matched your search

+1
View File
@@ -36,6 +36,7 @@ obj-y += io_apic.o
obj-$(CONFIG_LIVEPATCH) += alternative.o livepatch.o
obj-y += msi.o
obj-y += msr.o
obj-$(CONFIG_INDIRECT_THUNK) += indirect-thunk.o
obj-y += ioport_emulate.o
obj-y += irq.o
obj-$(CONFIG_KEXEC) += machine_kexec.o
+7
View File
@@ -34,3 +34,10 @@ CFLAGS += -mno-sse $(call cc-option,$(CC),-mskip-rax-setup)
ifneq ($(call cc-option,$(CC),-fvisibility=hidden,n),n)
CFLAGS += -DGCC_HAS_VISIBILITY_ATTRIBUTE
endif
# Compile with thunk-extern, indirect-branch-register if avaiable.
ifneq ($(call cc-option,$(CC),-mindirect-branch-register,n),n)
CFLAGS += -mindirect-branch=thunk-extern -mindirect-branch-register
CFLAGS += -DCONFIG_INDIRECT_THUNK
export CONFIG_INDIRECT_THUNK=y
endif
+38
View File
@@ -0,0 +1,38 @@
/*
* Implement __x86_indirect_thunk_* symbols for use with compatbile compilers
* and the -mindirect-branch=thunk-extern -mindirect-branch-register options.
*
* Copyright (c) 2017-2018 Citrix Systems Ltd.
*
* This source code is licensed under the GNU General Public License,
* Version 2. See the file COPYING for more details.
*/
.file __FILE__
#include <asm/asm_defns.h>
.macro IND_THUNK_RETPOLINE reg:req
call 2f
1:
lfence
jmp 1b
2:
mov %\reg, (%rsp)
ret
.endm
/*
* Build the __x86_indirect_thunk_* symbols. Currently implement the
* retpoline thunk only.
*/
.macro GEN_INDIRECT_THUNK reg:req
.section .text.__x86_indirect_thunk_\reg, "ax", @progbits
ENTRY(__x86_indirect_thunk_\reg)
IND_THUNK_RETPOLINE \reg
.endm
/* Instantiate GEN_INDIRECT_THUNK for each register except %rsp. */
.irp reg, ax, cx, dx, bx, bp, si, di, 8, 9, 10, 11, 12, 13, 14, 15
GEN_INDIRECT_THUNK reg=r\reg
.endr
+1
View File
@@ -59,6 +59,7 @@ SECTIONS
.text : {
_stext = .; /* Text and read-only data */
*(.text)
*(.text.__x86_indirect_thunk_*)
*(.text.cold)
*(.text.unlikely)
*(.fixup)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.