diff options
author | Avi Kivity <avi@qumranet.com> | 2007-04-16 13:36:10 +0300 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2007-04-16 13:36:10 +0300 |
commit | 94d806a6efd4401ce43358af6a9e8df5a63151ae (patch) | |
tree | 1c105daf682b7107720a9f1b09edfb659dae066c | |
parent | d3344ae6f6293913d6e4f230ebee0b370f2e3f98 (diff) |
KVM: Fix pio completion
Check cur_count instead of count to avoid false completions.
Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r-- | drivers/kvm/kvm_main.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index 8b734f82b00f..5d0331df7eb1 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -1685,7 +1685,6 @@ static int complete_pio(struct kvm_vcpu *vcpu) kvm_arch_ops->cache_regs(vcpu); - io->count -= io->cur_count; if (!io->string) { if (io->in) memcpy(&vcpu->regs[VCPU_REGS_RAX], vcpu->pio_data, @@ -1721,6 +1720,9 @@ static int complete_pio(struct kvm_vcpu *vcpu) kvm_arch_ops->decache_regs(vcpu); + io->count -= io->cur_count; + io->cur_count = 0; + if (!io->count) kvm_arch_ops->skip_emulated_instruction(vcpu); return 0; @@ -1823,7 +1825,7 @@ static int kvm_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) vcpu->cr8 = kvm_run->cr8; if (kvm_run->io_completed) { - if (vcpu->pio.count) { + if (vcpu->pio.cur_count) { r = complete_pio(vcpu); if (r) goto out; |