]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
kvm: nVMX: Validate CR3 target count on nested VM-entry
authorJim Mattson <jmattson@google.com>
Fri, 5 May 2017 18:28:09 +0000 (11:28 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 9 May 2017 09:53:41 +0000 (11:53 +0200)
According to the SDM, the CR3-target count must not be greater than
4. Future processors may support a different number of CR3-target
values. Software should read the VMX capability MSR IA32_VMX_MISC to
determine the number of values supported.

Signed-off-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c

index c5fd459c404367405f36d728951982322bc5ada6..44508522a1c7fc2dbea9bdce782c79bedc4b1ebb 100644 (file)
@@ -1314,6 +1314,11 @@ static inline bool report_flexpriority(void)
        return flexpriority_enabled;
 }
 
+static inline unsigned nested_cpu_vmx_misc_cr3_count(struct kvm_vcpu *vcpu)
+{
+       return vmx_misc_cr3_count(to_vmx(vcpu)->nested.nested_vmx_misc_low);
+}
+
 static inline bool nested_cpu_has(struct vmcs12 *vmcs12, u32 bit)
 {
        return vmcs12->cpu_based_vm_exec_control & bit;
@@ -10266,6 +10271,9 @@ static int check_vmentry_prereqs(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
                                vmx->nested.nested_vmx_entry_ctls_high))
                return VMXERR_ENTRY_INVALID_CONTROL_FIELD;
 
+       if (vmcs12->cr3_target_count > nested_cpu_vmx_misc_cr3_count(vcpu))
+               return VMXERR_ENTRY_INVALID_CONTROL_FIELD;
+
        if (!nested_host_cr0_valid(vcpu, vmcs12->host_cr0) ||
            !nested_host_cr4_valid(vcpu, vmcs12->host_cr4) ||
            !nested_cr3_valid(vcpu, vmcs12->host_cr3))