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 <jan.kiszka@xxxxxxxxxxx> > >>> --- > >>> > >>> 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html