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,

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