Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753281AbcD1Ucc (ORCPT ); Thu, 28 Apr 2016 16:32:32 -0400 Received: from prv-mh.provo.novell.com ([137.65.248.74]:33307 "EHLO prv-mh.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753132AbcD1Uca (ORCPT ); Thu, 28 Apr 2016 16:32:30 -0400 Message-Id: <57221EFB02000048001298C1@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.0 Date: Thu, 28 Apr 2016 14:32:27 -0600 From: "Bruce Rogers" To: "=?ISO-8859-15?B?UmFkaW0gS3IqbeEq?=" Cc: , , , Subject: Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset References: <1461351363-28094-1-git-send-email-brogers@suse.com> <20160428190805.GA9655@potion> In-Reply-To: <20160428190805.GA9655@potion> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2162 Lines: 55 >>> On 4/28/2016 at 01:08 PM, Radim Kr*m?* wrote: > 2016-04-22 12:56-0600, Bruce Rogers: >> Commit d28bc9dd25ce reversed the order of two lines which initialize cr0, >> allowing the current (old) cr0 value to mess up vcpu initialization. >> This was observed in the checks for cr0 X86_CR0_WP bit in the context of >> kvm_mmu_reset_context(). Besides, setting vcpu->arch.cr0 after vmx_set_cr0() >> is completely redundant. Change the order back to ensure proper vcpu >> initialization. >> >> The combination of booting with ovmf firmware when guest vcpus > 1 and kvm's >> ept=N option being set results in a VM-entry failure. This patch fixes that. > > Greg pointed out missing, > Cc: stable@vger.kernel.org > when stable@vger.kernel.org was Cc'd. Adding > Fixes: d28bc9dd25ce ("KVM: x86: INIT and reset sequences are different") > would be nice too (even when it is redundant). > >> Signed-off-by: Bruce Rogers >> --- >> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c >> @@ -5046,8 +5046,8 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool > init_event) >> cr0 = X86_CR0_NW | X86_CR0_CD | X86_CR0_ET; >> - vmx_set_cr0(vcpu, cr0); /* enter rmode */ >> vmx->vcpu.arch.cr0 = cr0; >> + vmx_set_cr0(vcpu, cr0); /* enter rmode */ > > So vmx_set_cr0() has a code that depends on vmx->vcpu.arch.cr0 being > already set the to new value. Do you know what function is it? The one which I partly referred to above is the following: vmx_set_cr0() -> enter_rmode() -> kvm_mmu_reset_context() -> init_kvm_softmmu() -> kvm_init_shadow_mmu() -> is_write_protected() which uses the CR0 WP bit. There may be other problematic references. I haven't tried to do an exhaustive search. > > I think we better set vmx->vcpu.arch.cr0 early in vmx_set_cr0(). > Or do other callsites somehow depend on the old cr0 value? You may be right that that is a better overall fix. I was simply trying to undo the erroneous lines in the commit which broke things, partly to have a patch better suited for applying to stable releases. I'll send a v2 shortly with your suggested additions to the patch header. Thanks, Bruce