From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42599) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VtDMh-0007Q6-AX for qemu-devel@nongnu.org; Wed, 18 Dec 2013 04:24:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VtDMb-0007Qb-Fz for qemu-devel@nongnu.org; Wed, 18 Dec 2013 04:24:27 -0500 Received: from mail-ea0-f169.google.com ([209.85.215.169]:34357) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VtDMb-0007QW-9s for qemu-devel@nongnu.org; Wed, 18 Dec 2013 04:24:21 -0500 Received: by mail-ea0-f169.google.com with SMTP id l9so2900225eaj.14 for ; Wed, 18 Dec 2013 01:23:45 -0800 (PST) Sender: Paolo Bonzini Message-ID: <52B1699E.80006@redhat.com> Date: Wed, 18 Dec 2013 10:23:42 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <52B0A069.8060807@siemens.com> In-Reply-To: <52B0A069.8060807@siemens.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH uq/master] kvm: x86: Separately write feature control MSR on reset List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Gleb Natapov , qemu-devel , kvm Il 17/12/2013 20:05, Jan Kiszka ha scritto: > If the guest is running in nested mode on system reset, clearing the > feature MSR signals the kernel to leave this mode. Recent kernels > processes this properly, but leave the VCPU state undefined behind. It > is the job of userspace to bring it to a proper shape. Therefore, write > this specific MSR first so that no state transfer gets lost. > > This allows to cleanly reset a guest with VMX in use. > > Signed-off-by: Jan Kiszka > --- > target-i386/kvm.c | 32 ++++++++++++++++++++++++++++---- > 1 file changed, 28 insertions(+), 4 deletions(-) > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 1188482..ec51447 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -1104,6 +1104,25 @@ static int kvm_put_tscdeadline_msr(X86CPU *cpu) > return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MSRS, &msr_data); > } > > +/* > + * Provide a separate write service for the feature control MSR in order to > + * kick the VCPU out of VMXON or even guest mode on reset. This has to be done > + * before writing any other state because forcibly leaving nested mode > + * invalidates the VCPU state. > + */ > +static int kvm_put_msr_feature_control(X86CPU *cpu) > +{ > + struct { > + struct kvm_msrs info; > + struct kvm_msr_entry entry; > + } msr_data; > + > + kvm_msr_entry_set(&msr_data.entry, MSR_IA32_FEATURE_CONTROL, > + cpu->env.msr_ia32_feature_control); > + msr_data.info.nmsrs = 1; > + return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MSRS, &msr_data); > +} > + > static int kvm_put_msrs(X86CPU *cpu, int level) > { > CPUX86State *env = &cpu->env; > @@ -1204,10 +1223,8 @@ static int kvm_put_msrs(X86CPU *cpu, int level) > if (cpu->hyperv_vapic) { > kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_APIC_ASSIST_PAGE, 0); > } > - if (has_msr_feature_control) { > - kvm_msr_entry_set(&msrs[n++], MSR_IA32_FEATURE_CONTROL, > - env->msr_ia32_feature_control); > - } > + /* Note: MSR_IA32_FEATURE_CONTROL is written separately, see > + * kvm_put_msr_feature_control. */ > } > if (env->mcg_cap) { > int i; > @@ -1801,6 +1818,13 @@ int kvm_arch_put_registers(CPUState *cpu, int level) > > assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu)); > > + if (level >= KVM_PUT_RESET_STATE && has_msr_feature_control) { > + ret = kvm_put_msr_feature_control(x86_cpu); > + if (ret < 0) { > + return ret; > + } > + } > + > ret = kvm_getput_regs(x86_cpu, 1); > if (ret < 0) { > return ret; > Applied, thanks!