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.kis...@siemens.com>
>>> ---
>>>
>>> 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

Reply via email to