Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+29 −4
Original line number Original line Diff line number Diff line
@@ -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;
+15 −45
Original line number Original line Diff line number Diff line
@@ -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 */
		/* SSBD controlled in MSR_SPEC_CTRL */
		if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
		if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
		host |= ssbd_tif_to_spec_ctrl(current_thread_info()->flags);
			host |= ssbd_tif_to_spec_ctrl(ti->flags);


	if (host != guest_spec_ctrl)
		if (host != guest_spec_ctrl) {
		wrmsrl(MSR_IA32_SPEC_CTRL, guest_spec_ctrl);
			msr = setguest ? guest_spec_ctrl : host;
			wrmsrl(MSR_IA32_SPEC_CTRL, msr);
		}
	}
	}
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)
{
{