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
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