Messages in this thread Patch in this message | | | Date | Tue, 9 Jan 2018 23:46:57 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [PATCH v1 1/2] x86/retpoline: Add a function to clear the RETPOLINE_AMD feature |
| |
On Tue, 9 Jan 2018, Tom Lendacky wrote: > For AMD hardware, the RETPOLINE_AMD feature is dependent on LFENCE being > a serializing instruction. Create a function to allow RETPOLINE_AMD to > be cleared if it cannot be determined that LFENCE is serializing. In > addition, update the spectre_v2_enabled variable so that sysfs output is > correct. > > Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> > --- > arch/x86/include/asm/nospec-branch.h | 1 + > arch/x86/kernel/cpu/bugs.c | 10 ++++++++++ > 2 files changed, 11 insertions(+) > > diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h > index 8ddf851..5785684 100644 > --- a/arch/x86/include/asm/nospec-branch.h > +++ b/arch/x86/include/asm/nospec-branch.h > @@ -153,6 +153,7 @@ > #endif > > void spectre_v2_check_boottime_disable(void); > +void retpoline_amd_disable(void); > > #endif /* __ASSEMBLY__ */ > #endif /* __NOSPEC_BRANCH_H__ */ > diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c > index b957f77..a4c594c 100644 > --- a/arch/x86/kernel/cpu/bugs.c > +++ b/arch/x86/kernel/cpu/bugs.c > @@ -170,6 +170,16 @@ void __init spectre_v2_check_boottime_disable(void) > return; > } > > +void retpoline_amd_disable(void) > +{ > + if (!boot_cpu_has(X86_FEATURE_RETPOLINE_AMD)) > + return; > + > + setup_clear_cpu_cap(X86_FEATURE_RETPOLINE_AMD); > + spectre_v2_enabled = retp_compiler() ? > + SPECTRE_V2_RETPOLINE_GENERIC : SPECTRE_V2_RETPOLINE_MINIMAL; > +}
Urgh. That's an awful hack. why not do the obvious?
Thanks,
tglx
--- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -148,14 +148,21 @@ void __init spectre_v2_check_boottime_di retpoline: if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) { retpoline_amd: + if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD || + !boot_cpu_has(X86_FEATURE_LFENCE_RDTSC)) { + pr_info("AMD retpoline not supported, fall back to generic\n"); + goto retpoline_generic; + } + spectre_v2_enabled = retp_compiler() ? SPECTRE_V2_RETPOLINE_AMD : SPECTRE_V2_RETPOLINE_MINIMAL_AMD; setup_force_cpu_cap(X86_FEATURE_RETPOLINE_AMD); - } else { - retpoline_generic: - spectre_v2_enabled = retp_compiler() ? - SPECTRE_V2_RETPOLINE_GENERIC : SPECTRE_V2_RETPOLINE_MINIMAL; + setup_force_cpu_cap(X86_FEATURE_RETPOLINE); + return; } +retpoline_generic: + spectre_v2_enabled = retp_compiler() ? + SPECTRE_V2_RETPOLINE_GENERIC : SPECTRE_V2_RETPOLINE_MINIMAL; setup_force_cpu_cap(X86_FEATURE_RETPOLINE); return; #else
| |