From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: speck@linutronix.de
Subject: [MODERATED] Re: [patch V7 14/15] SBB 14
Date: Sun, 29 Apr 2018 22:14:55 -0400 [thread overview]
Message-ID: <20180430021455.GA30984@char.us.oracle.com> (raw)
In-Reply-To: <20180429193938.637125129@linutronix.de>
..snip..
> --- a/arch/x86/include/asm/msr-index.h
> +++ b/arch/x86/include/asm/msr-index.h
> @@ -42,7 +42,8 @@
> #define MSR_IA32_SPEC_CTRL 0x00000048 /* Speculation Control */
> #define SPEC_CTRL_IBRS (1 << 0) /* Indirect Branch Restricted Speculation */
> #define SPEC_CTRL_STIBP (1 << 1) /* Single Thread Indirect Branch Predictors */
> -#define SPEC_CTRL_RDS (1 << 2) /* Reduced Data Speculation */
> +#define SPEC_CTRL_RDS_SHIFT 2 /* Reduced Data Speculation bit */
> +#define SPEC_CTRL_RDS (1 << SPEC_CTRL_RDS_SHIFT) /* Reduced Data Speculation */
>
> #define MSR_IA32_PRED_CMD 0x00000049 /* Prediction Command */
> #define PRED_CMD_IBPB (1 << 0) /* Indirect Branch Prediction Barrier */
> --- a/arch/x86/include/asm/specctrl.h
> +++ b/arch/x86/include/asm/specctrl.h
> @@ -2,6 +2,7 @@
> #ifndef _ASM_X86_SPECCTRL_H_
> #define _ASM_X86_SPECCTRL_H_
>
> +#include <linux/thread_info.h>
> #include <asm/nospec-branch.h>
>
> /*
> @@ -18,4 +19,20 @@ extern void x86_restore_host_spec_ctrl(u
> extern u64 x86_amd_ls_cfg_base;
> extern u64 x86_amd_ls_cfg_rds_mask;
>
> +/* The Intel SPEC CTRL MSR base value cache */
> +extern u64 x86_spec_ctrl_base;
> +
> +static inline u64 rds_tif_to_spec_ctrl(u64 tifn)
> +{
> + BUILD_BUG_ON(TIF_RDS < SPEC_CTRL_RDS_SHIFT);
> + return (tifn & _TIF_RDS) >> (TIF_RDS - SPEC_CTRL_RDS_SHIFT);
If my math is correct, the right side value is 3, not 2. That is
TIF_RDS (5) - SPEC_CTRL_RDS_SHIFT(2) = 3.
Then if _TIF_RDS is set we do:
1 >> 3
which is zero. Hm, did you mean to shift it to left? That would
be 8 (also incorrect).
If _TIF_RDS is unset we do:
0 >> 3
which is also zero.
> void x86_set_guest_spec_ctrl(u64 guest_spec_ctrl)
> {
> + u64 host = x86_spec_ctrl_base;
> +
> if (!boot_cpu_has(X86_FEATURE_IBRS))
> return;
> - if (x86_spec_ctrl_base != guest_spec_ctrl)
> +
> + if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
> + host |= rds_tif_to_spec_ctrl(current_thread_info()->flags);
Here you have an extra space in front of the rds_tif_to_spec_ctrl.
> +
> + if (host != guest_spec_ctrl)
> wrmsrl(MSR_IA32_SPEC_CTRL, guest_spec_ctrl);
> }
> EXPORT_SYMBOL_GPL(x86_set_guest_spec_ctrl);
>
> void x86_restore_host_spec_ctrl(u64 guest_spec_ctrl)
> {
> + u64 host = x86_spec_ctrl_base;
> +
> if (!boot_cpu_has(X86_FEATURE_IBRS))
> return;
> - if (x86_spec_ctrl_base != guest_spec_ctrl)
> - wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_base);
> +
> + if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
> + host |= rds_tif_to_spec_ctrl(current_thread_info()->flags);
Ditto here - also an extra space in front of the rds_tif_to_spec_ctrl.
> +
> + if (host != guest_spec_ctrl)
> + wrmsrl(MSR_IA32_SPEC_CTRL, host);
> }
> EXPORT_SYMBOL_GPL(x86_restore_host_spec_ctrl);
>
> static void x86_amd_rds_enable(void)
> {
> - u64 msrval = x86_amd_ls_cfg_base | x86_amd_ls_cfg_rds_bit);
> + u64 msrval = x86_amd_ls_cfg_base | x86_amd_ls_cfg_rds_mask;
Ah, here is the fix for that ')'
>
> if (boot_cpu_has(X86_FEATURE_AMD_RDS))
> wrmsrl(MSR_AMD64_LS_CFG, msrval);
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -38,6 +38,7 @@
> #include <asm/switch_to.h>
> #include <asm/desc.h>
> #include <asm/prctl.h>
> +#include <asm/specctrl.h>
>
> /*
> * per-CPU TSS segments. Threads are completely 'soft' on Linux,
> @@ -278,6 +279,24 @@ static inline void switch_to_bitmap(stru
> }
> }
>
> +static __always_inline void __speculative_store_bypass_update(unsigned long tifn)
> +{
> + u64 msr;
> +
> + if (static_cpu_has(X86_FEATURE_AMD_RDS)) {
> + msr = x86_amd_ls_cfg_base | rds_tif_to_amd_ls_cfg(tifn);
> + wrmsrl(MSR_AMD64_LS_CFG, msr);
> + } else {
Would it make sense to test for 'X86_FEATURE_RDS' here? Let me double-check
the next patch - you probably have some check there where the _TIF_RDS never
gets set if X86_FEATURE_RDS does not exist.
> + msr = x86_spec_ctrl_base | rds_tif_to_spec_ctrl(tifn);
> + wrmsrl(MSR_IA32_SPEC_CTRL, msr);
> + }
> +}
> +
> +void speculative_store_bypass_update(void)
> +{
> + __speculative_store_bypass_update(current_thread_info()->flags);
> +}
> +
> void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
> struct tss_struct *tss)
> {
> @@ -309,6 +328,9 @@ void __switch_to_xtra(struct task_struct
>
> if ((tifp ^ tifn) & _TIF_NOCPUID)
> set_cpuid_faulting(!!(tifn & _TIF_NOCPUID));
> +
> + if ((tifp ^ tifn) & _TIF_RDS)
> + __speculative_store_bypass_update(tifn);
> }
>
> /*
>
next prev parent reply other threads:[~2018-04-30 2:15 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-29 19:30 [patch V7 00/15] SBB 0 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 01/15] SBB 1 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 02/15] SBB 2 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 03/15] SBB 3 Thomas Gleixner
2018-04-29 23:31 ` [MODERATED] " Linus Torvalds
2018-04-30 2:50 ` Konrad Rzeszutek Wilk
2018-04-30 7:09 ` David Woodhouse
2018-04-29 19:30 ` [patch V7 04/15] SBB 4 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 05/15] SBB 5 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 06/15] SBB 6 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 07/15] SBB 7 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 08/15] SBB 8 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 09/15] SBB 9 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 10/15] SBB 10 Thomas Gleixner
2018-04-30 0:16 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-30 7:49 ` Thomas Gleixner
2018-04-29 19:30 ` [patch V7 11/15] SBB 11 Thomas Gleixner
2018-04-29 19:30 ` [patch V7 12/15] SBB 12 Thomas Gleixner
2018-04-30 1:33 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-29 19:30 ` [patch V7 13/15] SBB 13 Thomas Gleixner
2018-04-30 1:48 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-30 2:39 ` Konrad Rzeszutek Wilk
2018-04-30 3:17 ` Jon Masters
2018-04-30 8:35 ` Thomas Gleixner
2018-04-30 2:20 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-30 2:36 ` Konrad Rzeszutek Wilk
2018-04-30 17:28 ` Konrad Rzeszutek Wilk
2018-04-29 19:30 ` [patch V7 14/15] SBB 14 Thomas Gleixner
2018-04-30 2:14 ` Konrad Rzeszutek Wilk [this message]
2018-04-30 5:57 ` Thomas Gleixner
2018-04-30 15:49 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-29 19:31 ` [patch V7 15/15] SBB 15 Thomas Gleixner
2018-04-30 2:32 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-30 15:56 ` Konrad Rzeszutek Wilk
2018-04-30 16:07 ` Thomas Gleixner
2018-04-30 19:30 ` [MODERATED] " Tim Chen
2018-04-30 19:36 ` Thomas Gleixner
2018-04-30 20:12 ` [MODERATED] " Tim Chen
2018-04-30 20:20 ` Konrad Rzeszutek Wilk
2018-04-30 20:44 ` Tim Chen
2018-04-30 20:28 ` Thomas Gleixner
2018-04-30 20:09 ` [MODERATED] " Konrad Rzeszutek Wilk
2018-04-29 20:14 ` [patch V7 00/15] SBB 0 Thomas Gleixner
2018-04-29 20:35 ` [MODERATED] " Borislav Petkov
2018-04-29 20:46 ` Konrad Rzeszutek Wilk
2018-04-29 20:57 ` Thomas Gleixner
2018-04-29 21:40 ` [MODERATED] " Borislav Petkov
2018-04-29 20:55 ` Thomas Gleixner
2018-04-29 22:05 ` Thomas Gleixner
2018-04-30 0:06 ` [MODERATED] " Jon Masters
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180430021455.GA30984@char.us.oracle.com \
--to=konrad.wilk@oracle.com \
--cc=speck@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.