On 07/07/2017 01:33, Jim Mattson wrote: > According to the SDM, if the "use I/O bitmaps" VM-execution control is > 1, bits 11:0 of each I/O-bitmap address must be 0. Neither address > should set any bits beyond the processor's physical-address width. > > Signed-off-by: Jim Mattson <jmattson@xxxxxxxxxx> Reviewed-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > --- > arch/x86/kvm/vmx.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index 8ab625feb46e..f03dcd744557 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -9571,6 +9571,19 @@ static void vmx_start_preemption_timer(struct kvm_vcpu *vcpu) > ns_to_ktime(preemption_timeout), HRTIMER_MODE_REL); > } > > +static int nested_vmx_check_io_bitmap_controls(struct kvm_vcpu *vcpu, > + struct vmcs12 *vmcs12) > +{ > + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) > + return 0; > + > + if (!page_address_valid(vcpu, vmcs12->io_bitmap_a) || > + !page_address_valid(vcpu, vmcs12->io_bitmap_b)) > + return -EINVAL; > + > + return 0; > +} > + > static int nested_vmx_check_msr_bitmap_controls(struct kvm_vcpu *vcpu, > struct vmcs12 *vmcs12) > { > @@ -10275,6 +10288,9 @@ static int check_vmentry_prereqs(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) > vmcs12->guest_activity_state != GUEST_ACTIVITY_HLT) > return VMXERR_ENTRY_INVALID_CONTROL_FIELD; > > + if (nested_vmx_check_io_bitmap_controls(vcpu, vmcs12)) > + return VMXERR_ENTRY_INVALID_CONTROL_FIELD; > + > if (nested_vmx_check_msr_bitmap_controls(vcpu, vmcs12)) > return VMXERR_ENTRY_INVALID_CONTROL_FIELD; > >