Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757979AbeAIWrL (ORCPT + 1 other); Tue, 9 Jan 2018 17:47:11 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:53673 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756958AbeAIWrI (ORCPT ); Tue, 9 Jan 2018 17:47:08 -0500 Date: Tue, 9 Jan 2018 23:46:57 +0100 (CET) From: Thomas Gleixner To: Tom Lendacky cc: x86@kernel.org, linux-kernel@vger.kernel.org, Rik van Riel , Andi Kleen , Peter Zijlstra , Linus Torvalds , Jiri Kosina , Dan Williams , Dave Hansen , Borislav Petkov , Andy Lutomirski , Kees Cook , Tim Chen , Greg Kroah-Hartman , David Woodhouse , Paul Turner Subject: Re: [PATCH v1 1/2] x86/retpoline: Add a function to clear the RETPOLINE_AMD feature In-Reply-To: <20180109223736.29322.5436.stgit@tlendack-t1.amdoffice.net> Message-ID: References: <20180109223723.29322.59126.stgit@tlendack-t1.amdoffice.net> <20180109223736.29322.5436.stgit@tlendack-t1.amdoffice.net> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: 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 > --- > 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