x86/retpoline: Add X86_FEATURE_RETPOLINE_COMMON and split RETPLINE/RETPOLINE_AMD
Subsystems (2)
PATCH v2 1/2 x86/retpoline: Add X86_FEATURE_RETPOLINE_COMMON and split RETPLINE/RETPOLINE_AMD
From: Andi Kleen <[email protected]>
On 64bit we want to split X86_FEATURE_RETPOLINE and X86_FEATURE_RETPOLINE_AMD, so that only one is set. This enables new simpler ALTERNATIVE sequences.
But 32bit requires a common flag because it uses common code for both.
So add a new X86_FEATURE_RETPOLINE_COMMON that is always set when either X86_FEATURE_RETPOLINE or X86_FEATURE_RETPOLINE_AMD are set.
And then unset X86_FEATURE_RETPOLINE for AMD.
--- arch/x86/include/asm/cpufeatures.h | 1 + arch/x86/kernel/cpu/bugs.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-)
arch/x86/include/asm/cpufeatures.h +1 -0
@@ -211,6 +211,7 @@#define X86_FEATURE_AVX512_4FMAPS ( 7*32+17)/* AVX-512 Multiply Accumulation Single precision */ #define X86_FEATURE_MBA ( 7*32+18)/* Memory Bandwidth Allocation */ +#define X86_FEATURE_RETPOLINE_COMMON ( 7*32+19)/* Common code for both RETPOLINE and RETPOLINE_AMD */ /* Virtualization flags: Linux defined, word 8 */ #define X86_FEATURE_TPR_SHADOW ( 8*32+ 0)/* Intel TPR Shadow */
arch/x86/kernel/cpu/bugs.c +4 -1
@@ -155,8 +155,10 @@ void __init spectre_v2_check_boottime_disable(void) retpoline_generic: spectre_v2_enabled =retp_compiler () ?SPECTRE_V2_RETPOLINE_GENERIC :SPECTRE_V2_RETPOLINE_MINIMAL ; + setup_force_cpu_cap(X86_FEATURE_RETPOLINE); } -setup_force_cpu_cap (X86_FEATURE_RETPOLINE ); +setup_force_cpu_cap (X86_FEATURE_RETPOLINE_COMMON ); +return ;#else retpoline:
@@ -167,6 +169,7 @@ void __init spectre_v2_check_boottime_disable(void) disable:setup_clear_cpu_cap (X86_FEATURE_RETPOLINE );setup_clear_cpu_cap (X86_FEATURE_RETPOLINE_AMD ); +setup_clear_cpu_cap (X86_FEATURE_RETPOLINE_COMMON );return ; }
Signature · 1 line
2.14.3
PATCH v2 2/2 x86/retpoline: Use X86_RETPOLINE_COMMON to enable 32bit retpoline
From: Andi Kleen <[email protected]>
32bit uses a single retpoline sequence for AMD/Intel. Previously X86_RETPOLINE was always set for AMD/Intel but that's not true anymore. So now use the new X86_FEATURE_RETPOLINE_COMMON flag that is set for both.
--- arch/x86/include/asm/nospec-branch.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/include/asm/nospec-branch.h +2 -2
@@ -116,7 +116,7 @@# define CALL_NOSPEC ALTERNATIVE( \ "call *%[thunk_target]\n", \ "call __x86_indirect_thunk_%V[thunk_target]\n", \ - X86_FEATURE_RETPOLINE) + X86_FEATURE_RETPOLINE_COMMON)# define THUNK_TARGET (addr) [thunk_target] "r" (addr)#elif defined(CONFIG_X86_32 ) && defined(CONFIG_RETPOLINE )/*
@@ -142,7 +142,7 @@ " .align 16\n" \ "do_call%=:\n" \ " call do_retpoline%=;\n", \ - X86_FEATURE_RETPOLINE) + X86_FEATURE_RETPOLINE_COMMON)# define THUNK_TARGET (addr) [thunk_target] "rm" (addr)#else /* No retpoline */
Signature · 1 line
2.14.3