Avi Kivity wrote:
> Laurent Vivier wrote:
>> vmx.c uses x86_decode_prefix() instead of get_io_count().
>>
>>    static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
>>  {
>>      u64 exit_qualification;
>> @@ -1831,8 +1780,32 @@
>>      port = exit_qualification >> 16;
>>      address = 0;
>>      if (string) {
>> -        if (rep && !get_io_count(vcpu, &count))
>> +        int mode;
>> +        u64 inst;
>> +        gva_t rip;
>> +        struct x86_prefix prefix;
>> +        u32 cs_ar = vmcs_read32(GUEST_CS_AR_BYTES);
>> +        unsigned long addr_mask;
>> +
>> +        mode = (vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_VM) ?
>> +                X86EMUL_MODE_REAL : (cs_ar & AR_L_MASK)
>> +                ? X86EMUL_MODE_PROT64 : (cs_ar & AR_DB_MASK)
>> +                ? X86EMUL_MODE_PROT32 : X86EMUL_MODE_PROT16;
>> +
>> +        rip = vmcs_readl(GUEST_RIP);
>> +        if (mode != X86EMUL_MODE_PROT64)
>> +            rip += vmcs_readl(GUEST_CS_BASE);
>> +        if (emulator_read_std(rip, &inst, sizeof(inst), vcpu)
>> +                    != X86EMUL_CONTINUE)
>> +            return 1;
>> +
>> +        if (x86_decode_prefix(mode, (u8*)&inst, &prefix) == -1)
>>              return 1;
>> +
>> +        addr_mask = (~0ULL >> (64 - (prefix.ad_bytes <<3)));
>> +        if (rep)
>> +            count = vcpu->regs[VCPU_REGS_RCX] & addr_mask;
>> +
>>          address = vmcs_readl(GUEST_LINEAR_ADDRESS);
>>      }
>>      return kvm_setup_pio(vcpu, kvm_run, in, size, count, string, down,
> 
> How about just calliing emulate_instruction() from here (just for the
> string case)?  That will eliminate all the setup code.

But this setup is in emulate_instruction() so it will be executed anyway.

> x86_emulate_memop() will need to be extended to decode ins/outs, but
> that's fairly easy.

X86_decode_prefix() is a subset of instruction decoding part of
x86_emulate_memop(), kvm_setup_pio() can be seen as a subset of instruction
emulating part of x86_emulate_memop(). So I think in term of performance it is
better to do like that, but I agree by doing:

if (string)
        return emulate_instruction(vcpu, kvm_run, 0, 0);
else
        return kvm_setup_pio(vcpu, kvm_run, in, size, port);

it is more more ... more simple.

If you prefer simplicity, I can do like that ?
(but I know you prefer simplicity...)

BTW, I think PATCH 1,2 and 3 should be applied anyway because they allow to
introduce the separation between instruction decoding and instruction emulation
requested by the TODO "Split the emulator into two functions: one to decode into
the emulation context, and the other to actually execute the instruction."

Laurent
-- 
------------- [EMAIL PROTECTED]  --------------
          "Software is hard" - Donald Knuth

Attachment: signature.asc
Description: OpenPGP digital signature

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to