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. Jan
Attachment:
signature.asc
Description: OpenPGP digital signature