X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=arch%2Fx86%2Fkernel%2Fprocess.c;h=d8abf4146c3298588b0ec3a3f22bcaec9bf31bec;hb=a93338c1757c60b6147d55f3567822334f14352a;hp=3adb3806a28495fcd5a27fabf52cfae17a8cbaea;hpb=9aff3d502cc04ad96a70694f0d992dd0c2715a5d;p=mirror_ubuntu-artful-kernel.git diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 3adb3806a284..d8abf4146c32 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -38,6 +38,7 @@ #include #include #include +#include /* * per-CPU TSS segments. Threads are completely 'soft' on Linux, @@ -278,6 +279,24 @@ static inline void switch_to_bitmap(struct tss_struct *tss, } } +static __always_inline void __speculative_store_bypass_update(unsigned long tifn) +{ + u64 msr; + + if (static_cpu_has(X86_FEATURE_LS_CFG_SSBD)) { + msr = x86_amd_ls_cfg_base | ssbd_tif_to_amd_ls_cfg(tifn); + wrmsrl(MSR_AMD64_LS_CFG, msr); + } else { + msr = x86_spec_ctrl_base | ssbd_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 *prev_p, struct task_struct *next_p, if ((tifp ^ tifn) & _TIF_NOCPUID) set_cpuid_faulting(!!(tifn & _TIF_NOCPUID)); + + if ((tifp ^ tifn) & _TIF_SSBD) + __speculative_store_bypass_update(tifn); } /* @@ -447,17 +469,17 @@ static __cpuidle void mwait_idle(void) mb(); /* quirk */ } - if (boot_cpu_has(X86_FEATURE_SPEC_CTRL)) - native_wrmsrl(MSR_IA32_SPEC_CTRL, 0); + if (ibrs_inuse) + native_wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_get_default()); __monitor((void *)¤t_thread_info()->flags, 0, 0); if (!need_resched()) { __sti_mwait(0, 0); - if (boot_cpu_has(X86_FEATURE_SPEC_CTRL)) - native_wrmsrl(MSR_IA32_SPEC_CTRL, FEATURE_ENABLE_IBRS); + if (ibrs_inuse) + native_wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_get_default() | SPEC_CTRL_IBRS); } else { - if (boot_cpu_has(X86_FEATURE_SPEC_CTRL)) - native_wrmsrl(MSR_IA32_SPEC_CTRL, FEATURE_ENABLE_IBRS); + if (ibrs_inuse) + native_wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_get_default() | SPEC_CTRL_IBRS); local_irq_enable(); } trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());