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

Commit 1af834f2 authored by Daniel Sneddon's avatar Daniel Sneddon Committed by Greg Kroah-Hartman
Browse files

KVM: Add GDS_NO support to KVM



commit 81ac7e5d741742d650b4ed6186c4826c1a0631a7 upstream

Gather Data Sampling (GDS) is a transient execution attack using
gather instructions from the AVX2 and AVX512 extensions. This attack
allows malicious code to infer data that was previously stored in
vector registers. Systems that are not vulnerable to GDS will set the
GDS_NO bit of the IA32_ARCH_CAPABILITIES MSR. This is useful for VM
guests that may think they are on vulnerable systems that are, in
fact, not affected. Guests that are running on affected hosts where
the mitigation is enabled are protected as if they were running
on an unaffected system.

On all hosts that are not affected or that are mitigated, set the
GDS_NO bit.

Signed-off-by: default avatarDaniel Sneddon <daniel.sneddon@linux.intel.com>
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Acked-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarDaniel Sneddon <daniel.sneddon@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0461f602
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -628,6 +628,13 @@ static const char * const gds_strings[] = {
	[GDS_MITIGATION_HYPERVISOR]	= "Unknown: Dependent on hypervisor status",
	[GDS_MITIGATION_HYPERVISOR]	= "Unknown: Dependent on hypervisor status",
};
};


bool gds_ucode_mitigated(void)
{
	return (gds_mitigation == GDS_MITIGATION_FULL ||
		gds_mitigation == GDS_MITIGATION_FULL_LOCKED);
}
EXPORT_SYMBOL_GPL(gds_ucode_mitigated);

void update_gds_msr(void)
void update_gds_msr(void)
{
{
	u64 mcu_ctrl_after;
	u64 mcu_ctrl_after;
+5 −0
Original line number Original line Diff line number Diff line
@@ -217,6 +217,8 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {


u64 __read_mostly host_xcr0;
u64 __read_mostly host_xcr0;


extern bool gds_ucode_mitigated(void);

static int emulator_fix_hypercall(struct x86_emulate_ctxt *ctxt);
static int emulator_fix_hypercall(struct x86_emulate_ctxt *ctxt);


static inline void kvm_async_pf_hash_reset(struct kvm_vcpu *vcpu)
static inline void kvm_async_pf_hash_reset(struct kvm_vcpu *vcpu)
@@ -1224,6 +1226,9 @@ u64 kvm_get_arch_capabilities(void)
	/* Guests don't need to know "Fill buffer clear control" exists */
	/* Guests don't need to know "Fill buffer clear control" exists */
	data &= ~ARCH_CAP_FB_CLEAR_CTRL;
	data &= ~ARCH_CAP_FB_CLEAR_CTRL;


	if (!boot_cpu_has_bug(X86_BUG_GDS) || gds_ucode_mitigated())
		data |= ARCH_CAP_GDS_NO;

	return data;
	return data;
}
}