Commit 3ec6fd8c authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini
Browse files

KVM: VMX: Convert feature updates from CPUID to KVM cpu caps



Use the recently introduced KVM CPU caps to propagate VMX-only (kernel)
settings to supported CPUID flags.

No functional change intended.

Reviewed-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 9b58b985
Loading
Loading
Loading
Loading
+33 −21
Original line number Diff line number Diff line
@@ -7123,36 +7123,48 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
	}
}

/*
 * Vendor specific emulation must be handled via ->set_supported_cpuid(), not
 * vmx_set_cpu_caps(), as capabilities configured during hardware_setup() are
 * masked against hardware/kernel support, i.e. they'd be lost.
 */
static void vmx_set_supported_cpuid(struct kvm_cpuid_entry2 *entry)
{
	switch (entry->function) {
	case 0x1:
		if (nested)
			cpuid_entry_set(entry, X86_FEATURE_VMX);
		break;
	case 0x7:
		if (vmx_umip_emulated())
			cpuid_entry_set(entry, X86_FEATURE_UMIP);
		break;
	default:
		break;
	}
}

static __init void vmx_set_cpu_caps(void)
{
	kvm_set_cpu_caps();

	/* CPUID 0x1 */
	if (nested)
		kvm_cpu_cap_set(X86_FEATURE_VMX);

	/* CPUID 0x7 */
	if (boot_cpu_has(X86_FEATURE_MPX) && kvm_mpx_supported())
			cpuid_entry_set(entry, X86_FEATURE_MPX);
		kvm_cpu_cap_set(X86_FEATURE_MPX);
	if (boot_cpu_has(X86_FEATURE_INVPCID) && cpu_has_vmx_invpcid())
			cpuid_entry_set(entry, X86_FEATURE_INVPCID);
		kvm_cpu_cap_set(X86_FEATURE_INVPCID);
	if (boot_cpu_has(X86_FEATURE_INTEL_PT) &&
	    vmx_pt_mode_is_host_guest())
			cpuid_entry_set(entry, X86_FEATURE_INTEL_PT);
		if (vmx_umip_emulated())
			cpuid_entry_set(entry, X86_FEATURE_UMIP);
		kvm_cpu_cap_set(X86_FEATURE_INTEL_PT);

	/* PKU is not yet implemented for shadow paging. */
	if (enable_ept && boot_cpu_has(X86_FEATURE_PKU) &&
	    boot_cpu_has(X86_FEATURE_OSPKE))
			cpuid_entry_set(entry, X86_FEATURE_PKU);
		break;
	case 0x80000001:
		kvm_cpu_cap_set(X86_FEATURE_PKU);

	/* CPUID 0x80000001 */
	if (!cpu_has_vmx_rdtscp())
			cpuid_entry_clear(entry, X86_FEATURE_RDTSCP);
		break;
	default:
		break;
	}
		kvm_cpu_cap_clear(X86_FEATURE_RDTSCP);
}

static void vmx_request_immediate_exit(struct kvm_vcpu *vcpu)
@@ -7818,7 +7830,7 @@ static __init int hardware_setup(void)
			return r;
	}

	kvm_set_cpu_caps();
	vmx_set_cpu_caps();

	r = alloc_kvm_area();
	if (r)