From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: Re: KVM: x86: do not execute halted vcpus (resend) Date: Wed, 10 Sep 2008 16:40:55 -0300 Message-ID: <20080910194055.GB6834@dmt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm-devel To: Avi Kivity Return-path: Received: from mx1.redhat.com ([66.187.233.31]:44659 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751563AbYIJTlv (ORCPT ); Wed, 10 Sep 2008 15:41:51 -0400 Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: On Wed, Sep 10, 2008 at 09:42:05PM +0300, Avi Kivity wrote: > Marcelo Tosatti wrote: > >> Actually it does reproduce. If you reboot twice, the second reboot will > >> hang during reset (with cs:ip = f000:fff0). Plain Windows XP. > >> > > > > OK, easily reproducible by adding a sleep at the start of > > qemu_kvm_system_reset. > > > > The problem is that the vcpu HLT's between the KBD ioport write and the > > actual system reset by the IO thread. By then time there will be no > > event that takes it out of STATE_HALTED. > > > > The following fixes it, however older userspace will remain borked. > > Alternative is to special case f000:fff0 in-kernel. What is preferred? > > > > > > Special-case the kvm_set_sregs ioctl with cs:eip f000:fff0 (and cr0.pe=0 > for good measure). KVM: x86: unhalt vcpu0 on reset Since "KVM: x86: do not execute halted vcpus", HLT by vcpu0 before system reset by the IO thread will hang the guest. Mark vcpu as runnable in such case. Signed-off-by: Marcelo Tosatti Index: kvm.tip/arch/x86/kvm/x86.c =================================================================== --- kvm.tip.orig/arch/x86/kvm/x86.c +++ kvm.tip/arch/x86/kvm/x86.c @@ -3959,6 +3959,11 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_set_segment(vcpu, &sregs->tr, VCPU_SREG_TR); kvm_set_segment(vcpu, &sregs->ldt, VCPU_SREG_LDTR); + if (vcpu->vcpu_id == 0 && kvm_rip_read(vcpu) == 0xfff0 && + sregs->cs.selector == 0xf000 && sregs->cs.base == 0xffff0000 && + !(vcpu->arch.cr0 & X86_CR0_PE)) + vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; + vcpu_put(vcpu); return 0;