Avoid making system calls for out{b,w,l} instructions since it is not necessary to sync GP registers. Signed-off-by: Anthony Liguori diff -r 29119439ef33 user/kvmctl.c --- a/user/kvmctl.c Sat Feb 03 18:50:24 2007 -0600 +++ b/user/kvmctl.c Sat Feb 03 19:07:24 2007 -0600 @@ -234,11 +234,14 @@ static int handle_io(kvm_context_t kvm, int first_time = 1; int delta; struct translation_cache tr; + int _in = (run->io.direction == KVM_EXIT_IO_IN); translation_cache_init(&tr); - regs.vcpu = run->vcpu; - ioctl(kvm->fd, KVM_GET_REGS, ®s); + if (run->io.string || _in) { + regs.vcpu = run->vcpu; + ioctl(kvm->fd, KVM_GET_REGS, ®s); + } delta = run->io.string_down ? -run->io.size : run->io.size; @@ -246,9 +249,12 @@ static int handle_io(kvm_context_t kvm, void *value_addr; int r; - if (!run->io.string) - value_addr = ®s.rax; - else { + if (!run->io.string) { + if (_in) + value_addr = ®s.rax; + else + value_addr = &run->io.value; + } else { r = translate(kvm, run->vcpu, &tr, run->io.address, &value_addr); if (r) { @@ -326,7 +332,8 @@ static int handle_io(kvm_context_t kvm, } } - ioctl(kvm->fd, KVM_SET_REGS, ®s); + if (run->io.string || _in) + ioctl(kvm->fd, KVM_SET_REGS, ®s); run->emulated = 1; return 0; }