ACK: [SRU][Cosmic][PATCH 3/4] x86/speculation: Add support for STIBP always-on preferred mode
Tyler Hicks
tyhicks at canonical.com
Mon Mar 25 18:19:14 UTC 2019
On 2019-03-25 14:55:54, Juerg Haefliger wrote:
> From: Thomas Lendacky <Thomas.Lendacky at amd.com>
>
> Different AMD processors may have different implementations of STIBP.
> When STIBP is conditionally enabled, some implementations would benefit
> from having STIBP always on instead of toggling the STIBP bit through MSR
> writes. This preference is advertised through a CPUID feature bit.
>
> When conditional STIBP support is requested at boot and the CPU advertises
> STIBP always-on mode as preferred, switch to STIBP "on" support. To show
> that this transition has occurred, create a new spectre_v2_user_mitigation
> value and a new spectre_v2_user_strings message. The new mitigation value
> is used in spectre_v2_user_select_mitigation() to print the new mitigation
> message as well as to return a new string from stibp_state().
>
> Signed-off-by: Tom Lendacky <thomas.lendacky at amd.com>
> Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
> Cc: Andrea Arcangeli <aarcange at redhat.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
> Cc: Jiri Kosina <jkosina at suse.cz>
> Cc: Borislav Petkov <bp at alien8.de>
> Cc: Tim Chen <tim.c.chen at linux.intel.com>
> Cc: David Woodhouse <dwmw at amazon.co.uk>
> Link: https://lkml.kernel.org/r/20181213230352.6937.74943.stgit@tlendack-t1.amdoffice.net
>
> CVE-2017-5715
>
> (cherry picked from commit 20c3a2c33e9fdc82e9e8e8d2a6445b3256d20191)
> Signed-off-by: Juerg Haefliger <juergh at canonical.com>
Acked-by: Tyler Hicks <tyhicks at canonical.com>
Tyler
> ---
> arch/x86/include/asm/cpufeatures.h | 1 +
> arch/x86/include/asm/nospec-branch.h | 1 +
> arch/x86/kernel/cpu/bugs.c | 28 ++++++++++++++++++++++------
> 3 files changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
> index c8ac84e90d0f..dc6e72bb45ae 100644
> --- a/arch/x86/include/asm/cpufeatures.h
> +++ b/arch/x86/include/asm/cpufeatures.h
> @@ -284,6 +284,7 @@
> #define X86_FEATURE_AMD_IBPB (13*32+12) /* "" Indirect Branch Prediction Barrier */
> #define X86_FEATURE_AMD_IBRS (13*32+14) /* "" Indirect Branch Restricted Speculation */
> #define X86_FEATURE_AMD_STIBP (13*32+15) /* "" Single Thread Indirect Branch Predictors */
> +#define X86_FEATURE_AMD_STIBP_ALWAYS_ON (13*32+17) /* "" Single Thread Indirect Branch Predictors always-on preferred */
> #define X86_FEATURE_AMD_SSBD (13*32+24) /* "" Speculative Store Bypass Disable */
> #define X86_FEATURE_VIRT_SSBD (13*32+25) /* Virtualized Speculative Store Bypass Disable */
> #define X86_FEATURE_AMD_SSB_NO (13*32+26) /* "" Speculative Store Bypass is fixed in hardware. */
> diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h
> index 032b6009baab..dad12b767ba0 100644
> --- a/arch/x86/include/asm/nospec-branch.h
> +++ b/arch/x86/include/asm/nospec-branch.h
> @@ -232,6 +232,7 @@ enum spectre_v2_mitigation {
> enum spectre_v2_user_mitigation {
> SPECTRE_V2_USER_NONE,
> SPECTRE_V2_USER_STRICT,
> + SPECTRE_V2_USER_STRICT_PREFERRED,
> SPECTRE_V2_USER_PRCTL,
> SPECTRE_V2_USER_SECCOMP,
> };
> diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
> index 3fd12053e83b..716130e08528 100644
> --- a/arch/x86/kernel/cpu/bugs.c
> +++ b/arch/x86/kernel/cpu/bugs.c
> @@ -262,10 +262,11 @@ enum spectre_v2_user_cmd {
> };
>
> static const char * const spectre_v2_user_strings[] = {
> - [SPECTRE_V2_USER_NONE] = "User space: Vulnerable",
> - [SPECTRE_V2_USER_STRICT] = "User space: Mitigation: STIBP protection",
> - [SPECTRE_V2_USER_PRCTL] = "User space: Mitigation: STIBP via prctl",
> - [SPECTRE_V2_USER_SECCOMP] = "User space: Mitigation: STIBP via seccomp and prctl",
> + [SPECTRE_V2_USER_NONE] = "User space: Vulnerable",
> + [SPECTRE_V2_USER_STRICT] = "User space: Mitigation: STIBP protection",
> + [SPECTRE_V2_USER_STRICT_PREFERRED] = "User space: Mitigation: STIBP always-on protection",
> + [SPECTRE_V2_USER_PRCTL] = "User space: Mitigation: STIBP via prctl",
> + [SPECTRE_V2_USER_SECCOMP] = "User space: Mitigation: STIBP via seccomp and prctl",
> };
>
> static const struct {
> @@ -355,6 +356,15 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
> break;
> }
>
> + /*
> + * At this point, an STIBP mode other than "off" has been set.
> + * If STIBP support is not being forced, check if STIBP always-on
> + * is preferred.
> + */
> + if (mode != SPECTRE_V2_USER_STRICT &&
> + boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))
> + mode = SPECTRE_V2_USER_STRICT_PREFERRED;
> +
> /* Initialize Indirect Branch Prediction Barrier */
> if (boot_cpu_has(X86_FEATURE_IBPB)) {
> setup_force_cpu_cap(X86_FEATURE_USE_IBPB);
> @@ -608,6 +618,7 @@ void arch_smt_update(void)
> case SPECTRE_V2_USER_NONE:
> break;
> case SPECTRE_V2_USER_STRICT:
> + case SPECTRE_V2_USER_STRICT_PREFERRED:
> update_stibp_strict();
> break;
> case SPECTRE_V2_USER_PRCTL:
> @@ -810,7 +821,8 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)
> * Indirect branch speculation is always disabled in strict
> * mode.
> */
> - if (spectre_v2_user == SPECTRE_V2_USER_STRICT)
> + if (spectre_v2_user == SPECTRE_V2_USER_STRICT ||
> + spectre_v2_user == SPECTRE_V2_USER_STRICT_PREFERRED)
> return -EPERM;
> task_clear_spec_ib_disable(task);
> task_update_spec_tif(task);
> @@ -823,7 +835,8 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)
> */
> if (spectre_v2_user == SPECTRE_V2_USER_NONE)
> return -EPERM;
> - if (spectre_v2_user == SPECTRE_V2_USER_STRICT)
> + if (spectre_v2_user == SPECTRE_V2_USER_STRICT ||
> + spectre_v2_user == SPECTRE_V2_USER_STRICT_PREFERRED)
> return 0;
> task_set_spec_ib_disable(task);
> if (ctrl == PR_SPEC_FORCE_DISABLE)
> @@ -894,6 +907,7 @@ static int ib_prctl_get(struct task_struct *task)
> return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
> return PR_SPEC_PRCTL | PR_SPEC_ENABLE;
> case SPECTRE_V2_USER_STRICT:
> + case SPECTRE_V2_USER_STRICT_PREFERRED:
> return PR_SPEC_DISABLE;
> default:
> return PR_SPEC_NOT_AFFECTED;
> @@ -1086,6 +1100,8 @@ static char *stibp_state(void)
> return ", STIBP: disabled";
> case SPECTRE_V2_USER_STRICT:
> return ", STIBP: forced";
> + case SPECTRE_V2_USER_STRICT_PREFERRED:
> + return ", STIBP: always-on";
> case SPECTRE_V2_USER_PRCTL:
> case SPECTRE_V2_USER_SECCOMP:
> if (static_key_enabled(&switch_to_cond_stibp))
> --
> 2.19.1
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list