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. x86_emulate_memop() will need to be extended to decode ins/outs, but that's fairly easy. -- error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- 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