vmx.c uses x86_decode_prefix() instead of get_io_count().
Signed-off-by: Laurent Vivier <[EMAIL PROTECTED]> -- ------------- [EMAIL PROTECTED] -------------- "Software is hard" - Donald Knuth
Index: kvm/drivers/kvm/vmx.c =================================================================== --- kvm.orig/drivers/kvm/vmx.c 2007-08-01 10:37:40.000000000 +0200 +++ kvm/drivers/kvm/vmx.c 2007-08-01 10:40:04.000000000 +0200 @@ -1761,57 +1761,6 @@ return 0; } -static int get_io_count(struct kvm_vcpu *vcpu, unsigned long *count) -{ - u64 inst; - gva_t rip; - int countr_size; - int i; - - if ((vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_VM)) { - countr_size = 2; - } else { - u32 cs_ar = vmcs_read32(GUEST_CS_AR_BYTES); - - countr_size = (cs_ar & AR_L_MASK) ? 8: - (cs_ar & AR_DB_MASK) ? 4: 2; - } - - rip = vmcs_readl(GUEST_RIP); - if (countr_size != 8) - rip += vmcs_readl(GUEST_CS_BASE); - - if (emulator_read_std(rip, &inst, sizeof(inst), vcpu) != - X86EMUL_CONTINUE) - return 0; - - for (i = 0; i < sizeof(inst); i++) { - switch (((u8*)&inst)[i]) { - case 0xf0: - case 0xf2: - case 0xf3: - case 0x2e: - case 0x36: - case 0x3e: - case 0x26: - case 0x64: - case 0x65: - case 0x66: - break; - case 0x67: - countr_size = (countr_size == 2) ? 4: (countr_size >> 1); - default: - goto done; - } - } - return 0; -done: - countr_size *= 8; - *count = vcpu->regs[VCPU_REGS_RCX] & (~0ULL >> (64 - countr_size)); - //printk("cx: %lx\n", vcpu->regs[VCPU_REGS_RCX]); - return 1; -} - 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,
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