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

Commit 587d7e72 authored by Jim Mattson's avatar Jim Mattson Committed by Radim Krčmář
Browse files

kvm: nVMX: VMCLEAR should not cause the vCPU to shut down



VMCLEAR should silently ignore a failure to clear the launch state of
the VMCS referenced by the operand.

Signed-off-by: default avatarJim Mattson <jmattson@google.com>
[Changed "kvm_write_guest(vcpu->kvm" to "kvm_vcpu_write_guest(vcpu".]
Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
parent c1ae3cfa
Loading
Loading
Loading
Loading
+4 −18
Original line number Original line Diff line number Diff line
@@ -7258,9 +7258,8 @@ static int handle_vmoff(struct kvm_vcpu *vcpu)
static int handle_vmclear(struct kvm_vcpu *vcpu)
static int handle_vmclear(struct kvm_vcpu *vcpu)
{
{
	struct vcpu_vmx *vmx = to_vmx(vcpu);
	struct vcpu_vmx *vmx = to_vmx(vcpu);
	u32 zero = 0;
	gpa_t vmptr;
	gpa_t vmptr;
	struct vmcs12 *vmcs12;
	struct page *page;


	if (!nested_vmx_check_permission(vcpu))
	if (!nested_vmx_check_permission(vcpu))
		return 1;
		return 1;
@@ -7271,22 +7270,9 @@ static int handle_vmclear(struct kvm_vcpu *vcpu)
	if (vmptr == vmx->nested.current_vmptr)
	if (vmptr == vmx->nested.current_vmptr)
		nested_release_vmcs12(vmx);
		nested_release_vmcs12(vmx);


	page = nested_get_page(vcpu, vmptr);
	kvm_vcpu_write_guest(vcpu,
	if (page == NULL) {
			vmptr + offsetof(struct vmcs12, launch_state),
		/*
			&zero, sizeof(zero));
		 * For accurate processor emulation, VMCLEAR beyond available
		 * physical memory should do nothing at all. However, it is
		 * possible that a nested vmx bug, not a guest hypervisor bug,
		 * resulted in this case, so let's shut down before doing any
		 * more damage:
		 */
		kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
		return 1;
	}
	vmcs12 = kmap(page);
	vmcs12->launch_state = 0;
	kunmap(page);
	nested_release_page(page);


	nested_free_vmcs02(vmx, vmptr);
	nested_free_vmcs02(vmx, vmptr);