On Mon, Feb 18, 2013 at 09:53:22AM +0100, Jan Kiszka wrote:
> On 2013-02-18 09:44, Gleb Natapov wrote:
> > On Mon, Feb 18, 2013 at 07:32:53AM +0100, Jan Kiszka wrote:
> >> On 2013-02-14 19:46, Jan Kiszka wrote:
> >>> This prevents trapping L2 I/O exits if L1 has neither unconditional nor
> >>> bitmap-based exiting enabled. Furthermore, it implements basic I/O
> >>> bitmap handling. Repeated string accesses are still reported to L1
> >>> unconditionally for now.
> >>>
> >>> Signed-off-by: Jan Kiszka <[email protected]>
> >>> ---
> >>>
> >>> Changes in v3:
> >>>  - trap unconditionally if bitmap access fails
> >>>
> >>>  arch/x86/kvm/vmx.c |   55 
> >>> ++++++++++++++++++++++++++++++++++++++++++++++++++-
> >>>  1 files changed, 53 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> >>> index 6667042..2633199 100644
> >>> --- a/arch/x86/kvm/vmx.c
> >>> +++ b/arch/x86/kvm/vmx.c
> >>> @@ -5908,6 +5908,58 @@ static int (*const kvm_vmx_exit_handlers[])(struct 
> >>> kvm_vcpu *vcpu) = {
> >>>  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)
> >>> +{
> >>> + unsigned long exit_qualification;
> >>> + gpa_t bitmap, last_bitmap;
> >>> + bool string, rep;
> >>> + u16 port;
> >>> + int size;
> >>> + u8 b;
> >>> +
> >>> + if (nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING))
> >>> +         return 1;
> >>> +
> >>> + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS))
> >>> +         return 0;
> >>> +
> >>> + exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
> >>> +
> >>> + string = exit_qualification & 16;
> >>> + rep = exit_qualification & 32;
> >>> +
> >>> + /* TODO: interpret instruction and check range against bitmap */
> >>> + if (string && rep)
> >>> +         return 1;
> >>
> >> Nonsense, rep ins/outs always works against the same port. We can simply
> >> drop this check and be done with the feature. I'll come up with v4.
> >>
> > Actually this reminds me that we should check range of ports depending
> > on operand size, not one port. But here is a catch, older cpus do not
> > provide operand size as part of exit information.
> 
> You mean what bit 54 in VMX_BASIC is telling us? Too bad. OK, will write
> v5 which takes this into account.
> 
Yes, this one. We can just exit unconditionally on older cpus.

--
                        Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to