| From e71237d3ff1abf9f3388337cfebf53b96df2020d Mon Sep 17 00:00:00 2001 |
| From: Oliver Upton <oupton@google.com> |
| Date: Tue, 4 Feb 2020 15:26:30 -0800 |
| Subject: KVM: nVMX: Refactor IO bitmap checks into helper function |
| |
| From: Oliver Upton <oupton@google.com> |
| |
| commit e71237d3ff1abf9f3388337cfebf53b96df2020d upstream. |
| |
| Checks against the IO bitmap are useful for both instruction emulation |
| and VM-exit reflection. Refactor the IO bitmap checks into a helper |
| function. |
| |
| Signed-off-by: Oliver Upton <oupton@google.com> |
| Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kvm/vmx.c | 40 +++++++++++++++++++++++++++------------- |
| 1 file changed, 27 insertions(+), 13 deletions(-) |
| |
| --- a/arch/x86/kvm/vmx.c |
| +++ b/arch/x86/kvm/vmx.c |
| @@ -4275,6 +4275,26 @@ static bool cs_ss_rpl_check(struct kvm_v |
| (ss.selector & SEGMENT_RPL_MASK)); |
| } |
| |
| +static bool nested_vmx_check_io_bitmaps(struct kvm_vcpu *vcpu, |
| + unsigned int port, int size); |
| +static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, |
| + struct vmcs12 *vmcs12) |
| +{ |
| + unsigned long exit_qualification; |
| + unsigned int port; |
| + int size; |
| + |
| + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) |
| + return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); |
| + |
| + exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
| + |
| + port = exit_qualification >> 16; |
| + size = (exit_qualification & 7) + 1; |
| + |
| + return nested_vmx_check_io_bitmaps(vcpu, port, size); |
| +} |
| + |
| /* |
| * Check if guest state is valid. Returns true if valid, false if |
| * not. |
| @@ -7624,23 +7644,17 @@ static int (*const kvm_vmx_exit_handlers |
| static const int kvm_vmx_max_exit_handlers = |
| ARRAY_SIZE(kvm_vmx_exit_handlers); |
| |
| -static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, |
| - struct vmcs12 *vmcs12) |
| +/* |
| + * Return true if an IO instruction with the specified port and size should cause |
| + * a VM-exit into L1. |
| + */ |
| +bool nested_vmx_check_io_bitmaps(struct kvm_vcpu *vcpu, unsigned int port, |
| + int size) |
| { |
| - unsigned long exit_qualification; |
| + struct vmcs12 *vmcs12 = get_vmcs12(vcpu); |
| gpa_t bitmap, last_bitmap; |
| - unsigned int port; |
| - int size; |
| u8 b; |
| |
| - if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) |
| - return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); |
| - |
| - exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
| - |
| - port = exit_qualification >> 16; |
| - size = (exit_qualification & 7) + 1; |
| - |
| last_bitmap = (gpa_t)-1; |
| b = -1; |
| |