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 [email protected] https://lists.sourceforge.net/lists/listinfo/kvm-devel
