From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: Re: KVM: x86: stop IO emulation cycle if instruction pointer is modified Date: Sat, 6 Jul 2013 10:41:12 +0300 Message-ID: <20130706074112.GA26728@redhat.com> References: <20130705191654.GA18788@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm-devel To: Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:50069 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752709Ab3GFHlO (ORCPT ); Sat, 6 Jul 2013 03:41:14 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r667fEQv013087 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 6 Jul 2013 03:41:14 -0400 Content-Disposition: inline In-Reply-To: <20130705191654.GA18788@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: On Fri, Jul 05, 2013 at 04:16:55PM -0300, Marcelo Tosatti wrote: > > MMIO/PIO emulation should be interrupted if the system is restarted. > Otherwise in progress IO emulation continues at the instruction pointer, > even after vcpus' IP has been modified by KVM_SET_REGS. > > Use IP change as an indicator to reset MMIO/PIO emulation state. > Userspace has to return to the kernel to complete pending IO operation. This is documented in Documentation/virtual/kvm/api.txt. If this is not what program does it is a bug. What userspace you see the problem with? > Signed-off-by: Marcelo Tosatti > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index e8ba99c..9f7ce41 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -6144,6 +6144,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) > kvm_register_write(vcpu, VCPU_REGS_R15, regs->r15); > #endif > > + /* stop IO emulation cycle if RIP changes */ > + if (kvm_rip_read(vcpu) != regs->rip) > + vcpu->arch.complete_userspace_io = NULL; > + > kvm_rip_write(vcpu, regs->rip); > kvm_set_rflags(vcpu, regs->rflags); > -- Gleb.