Commit 53963a70 authored by Lan Tianyu's avatar Lan Tianyu Committed by Paolo Bonzini
Browse files

KVM/VMX: Check ept_pointer before flushing ept tlb



This patch is to initialize ept_pointer to INVALID_PAGE and check it
before flushing ept tlb. If ept_pointer is invalid, bypass the flush
request.

Signed-off-by: default avatarLan Tianyu <Tianyu.Lan@microsoft.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent a0d4f803
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -423,11 +423,18 @@ static int vmx_hv_remote_flush_tlb(struct kvm *kvm)
	/*
	 * FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE hypercall needs the address of the
	 * base of EPT PML4 table, strip off EPT configuration information.
	 * If ept_pointer is invalid pointer, bypass the flush request.
	 */
	if (to_kvm_vmx(kvm)->ept_pointers_match != EPT_POINTERS_MATCH) {
		kvm_for_each_vcpu(i, vcpu, kvm)
		kvm_for_each_vcpu(i, vcpu, kvm) {
			u64 ept_pointer = to_vmx(vcpu)->ept_pointer;

			if (!VALID_PAGE(ept_pointer))
				continue;

			ret |= hyperv_flush_guest_mapping(
				to_vmx(kvm_get_vcpu(kvm, i))->ept_pointer & PAGE_MASK);
				ept_pointer & PAGE_MASK);
		}
	} else {
		ret = hyperv_flush_guest_mapping(
				to_vmx(kvm_get_vcpu(kvm, 0))->ept_pointer & PAGE_MASK);
@@ -6433,6 +6440,8 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id)
	vmx->pi_desc.nv = POSTED_INTR_VECTOR;
	vmx->pi_desc.sn = 1;

	vmx->ept_pointer = INVALID_PAGE;

	return &vmx->vcpu;

free_vmcs: