diff mbox

kvm: nVMX: Validate CR3 target count on nested VM-entry

Message ID 20170505182809.160185-1-jmattson@google.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jim Mattson May 5, 2017, 6:28 p.m. UTC
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>
---
 arch/x86/kvm/vmx.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

David Hildenbrand May 8, 2017, 7:58 a.m. UTC | #1
On 05.05.2017 20:28, Jim Mattson wrote:
> 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>
> ---
>  arch/x86/kvm/vmx.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 28485e3d1b27..4ce055cb1cfd 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -1328,6 +1328,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;
> @@ -10331,6 +10336,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))
> 

Looks sane to me.

Reviewed-by: David Hildenbrand <david@redhat.com>
Paolo Bonzini May 8, 2017, 12:35 p.m. UTC | #2
On 05/05/2017 20:28, Jim Mattson wrote:
> 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>

Looks good, will queue at the end of the merge window.

Thanks,

Paolo

> ---
>  arch/x86/kvm/vmx.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 28485e3d1b27..4ce055cb1cfd 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -1328,6 +1328,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;
> @@ -10331,6 +10336,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))
>
diff mbox

Patch

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 28485e3d1b27..4ce055cb1cfd 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -1328,6 +1328,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;
@@ -10331,6 +10336,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))