Commit cc69b349 authored by Borislav Petkov's avatar Borislav Petkov Committed by Thomas Gleixner

x86/bugs: Unify x86_spec_ctrl_{set_guest,restore_host}

Function bodies are very similar and are going to grow more almost
identical code. Add a bool arg to determine whether SPEC_CTRL is being set
for the guest or restored to the host.

No functional changes.
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 0270be3e
...@@ -13,10 +13,35 @@ ...@@ -13,10 +13,35 @@
* Takes the guest view of SPEC_CTRL MSR as a parameter and also * Takes the guest view of SPEC_CTRL MSR as a parameter and also
* the guest's version of VIRT_SPEC_CTRL, if emulated. * the guest's version of VIRT_SPEC_CTRL, if emulated.
*/ */
extern void x86_spec_ctrl_set_guest(u64 guest_spec_ctrl, extern void x86_virt_spec_ctrl(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl, bool guest);
u64 guest_virt_spec_ctrl);
extern void x86_spec_ctrl_restore_host(u64 guest_spec_ctrl, /**
u64 guest_virt_spec_ctrl); * x86_spec_ctrl_set_guest - Set speculation control registers for the guest
* @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
* @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
* (may get translated to MSR_AMD64_LS_CFG bits)
*
* Avoids writing to the MSR if the content/bits are the same
*/
static inline
void x86_spec_ctrl_set_guest(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
{
x86_virt_spec_ctrl(guest_spec_ctrl, guest_virt_spec_ctrl, true);
}
/**
* x86_spec_ctrl_restore_host - Restore host speculation control registers
* @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
* @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
* (may get translated to MSR_AMD64_LS_CFG bits)
*
* Avoids writing to the MSR if the content/bits are the same
*/
static inline
void x86_spec_ctrl_restore_host(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
{
x86_virt_spec_ctrl(guest_spec_ctrl, guest_virt_spec_ctrl, false);
}
/* AMD specific Speculative Store Bypass MSR data */ /* AMD specific Speculative Store Bypass MSR data */
extern u64 x86_amd_ls_cfg_base; extern u64 x86_amd_ls_cfg_base;
......
...@@ -151,55 +151,25 @@ u64 x86_spec_ctrl_get_default(void) ...@@ -151,55 +151,25 @@ u64 x86_spec_ctrl_get_default(void)
} }
EXPORT_SYMBOL_GPL(x86_spec_ctrl_get_default); EXPORT_SYMBOL_GPL(x86_spec_ctrl_get_default);
/** void
* x86_spec_ctrl_set_guest - Set speculation control registers for the guest x86_virt_spec_ctrl(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl, bool setguest)
* @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
* @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
* (may get translated to MSR_AMD64_LS_CFG bits)
*
* Avoids writing to the MSR if the content/bits are the same
*/
void x86_spec_ctrl_set_guest(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
{ {
u64 host = x86_spec_ctrl_base; struct thread_info *ti = current_thread_info();
u64 msr, host = x86_spec_ctrl_base;
/* Is MSR_SPEC_CTRL implemented ? */ /* Is MSR_SPEC_CTRL implemented ? */
if (!static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL)) if (static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL)) {
return; /* SSBD controlled in MSR_SPEC_CTRL */
if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
/* SSBD controlled in MSR_SPEC_CTRL */ host |= ssbd_tif_to_spec_ctrl(ti->flags);
if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
host |= ssbd_tif_to_spec_ctrl(current_thread_info()->flags); if (host != guest_spec_ctrl) {
msr = setguest ? guest_spec_ctrl : host;
if (host != guest_spec_ctrl) wrmsrl(MSR_IA32_SPEC_CTRL, msr);
wrmsrl(MSR_IA32_SPEC_CTRL, guest_spec_ctrl); }
} }
EXPORT_SYMBOL_GPL(x86_spec_ctrl_set_guest);
/**
* x86_spec_ctrl_restore_host - Restore host speculation control registers
* @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
* @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
* (may get translated to MSR_AMD64_LS_CFG bits)
*
* Avoids writing to the MSR if the content/bits are the same
*/
void x86_spec_ctrl_restore_host(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
{
u64 host = x86_spec_ctrl_base;
/* Is MSR_SPEC_CTRL implemented ? */
if (!static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL))
return;
/* SSBD controlled in MSR_SPEC_CTRL */
if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
host |= ssbd_tif_to_spec_ctrl(current_thread_info()->flags);
if (host != guest_spec_ctrl)
wrmsrl(MSR_IA32_SPEC_CTRL, host);
} }
EXPORT_SYMBOL_GPL(x86_spec_ctrl_restore_host); EXPORT_SYMBOL_GPL(x86_virt_spec_ctrl);
static void x86_amd_ssb_disable(void) static void x86_amd_ssb_disable(void)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment