mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
x86/retpoline: Use -mfunction-return
commit 0b53c374b9 upstream.
Utilize -mfunction-return=thunk-extern when available to have the
compiler replace RET instructions with direct JMPs to the symbol
__x86_return_thunk. This does not affect assembler (.S) sources, only C
sources.
-mfunction-return=thunk-extern has been available since gcc 7.3 and
clang 15.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
[cascardo: RETPOLINE_CFLAGS is at Makefile]
[cascardo: remove ANNOTATE_NOENDBR from __x86_return_thunk]
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
37b9bb0941
commit
270de63cf4
2
Makefile
2
Makefile
|
|
@ -672,11 +672,13 @@ endif
|
||||||
|
|
||||||
ifdef CONFIG_CC_IS_GCC
|
ifdef CONFIG_CC_IS_GCC
|
||||||
RETPOLINE_CFLAGS := $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register)
|
RETPOLINE_CFLAGS := $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register)
|
||||||
|
RETPOLINE_CFLAGS += $(call cc-option,-mfunction-return=thunk-extern)
|
||||||
RETPOLINE_VDSO_CFLAGS := $(call cc-option,-mindirect-branch=thunk-inline -mindirect-branch-register)
|
RETPOLINE_VDSO_CFLAGS := $(call cc-option,-mindirect-branch=thunk-inline -mindirect-branch-register)
|
||||||
endif
|
endif
|
||||||
ifdef CONFIG_CC_IS_CLANG
|
ifdef CONFIG_CC_IS_CLANG
|
||||||
RETPOLINE_CFLAGS := -mretpoline-external-thunk
|
RETPOLINE_CFLAGS := -mretpoline-external-thunk
|
||||||
RETPOLINE_VDSO_CFLAGS := -mretpoline
|
RETPOLINE_VDSO_CFLAGS := -mretpoline
|
||||||
|
RETPOLINE_CFLAGS += $(call cc-option,-mfunction-return=thunk-extern)
|
||||||
endif
|
endif
|
||||||
export RETPOLINE_CFLAGS
|
export RETPOLINE_CFLAGS
|
||||||
export RETPOLINE_VDSO_CFLAGS
|
export RETPOLINE_VDSO_CFLAGS
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,8 @@
|
||||||
_ASM_PTR " 999b\n\t" \
|
_ASM_PTR " 999b\n\t" \
|
||||||
".popsection\n\t"
|
".popsection\n\t"
|
||||||
|
|
||||||
|
extern void __x86_return_thunk(void);
|
||||||
|
|
||||||
#ifdef CONFIG_RETPOLINE
|
#ifdef CONFIG_RETPOLINE
|
||||||
|
|
||||||
typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE];
|
typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE];
|
||||||
|
|
|
||||||
|
|
@ -66,3 +66,15 @@ SYM_CODE_END(__x86_indirect_thunk_array)
|
||||||
#define GEN(reg) EXPORT_THUNK(reg)
|
#define GEN(reg) EXPORT_THUNK(reg)
|
||||||
#include <asm/GEN-for-each-reg.h>
|
#include <asm/GEN-for-each-reg.h>
|
||||||
#undef GEN
|
#undef GEN
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function name is magical and is used by -mfunction-return=thunk-extern
|
||||||
|
* for the compiler to generate JMPs to it.
|
||||||
|
*/
|
||||||
|
SYM_CODE_START(__x86_return_thunk)
|
||||||
|
UNWIND_HINT_EMPTY
|
||||||
|
ret
|
||||||
|
int3
|
||||||
|
SYM_CODE_END(__x86_return_thunk)
|
||||||
|
|
||||||
|
__EXPORT_THUNK(__x86_return_thunk)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user