From patchwork Thu Dec 30 09:21:10 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yang X-Patchwork-Id: 440421 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBUMBEmh000490 for ; Thu, 30 Dec 2010 22:12:20 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751779Ab0L3JTf (ORCPT ); Thu, 30 Dec 2010 04:19:35 -0500 Received: from mga09.intel.com ([134.134.136.24]:1430 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751605Ab0L3JTf (ORCPT ); Thu, 30 Dec 2010 04:19:35 -0500 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 30 Dec 2010 01:19:34 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.60,248,1291622400"; d="scan'208";a="588309720" Received: from syang10-desktop.sh.intel.com (HELO syang10-desktop) ([10.239.13.17]) by orsmga002.jf.intel.com with ESMTP; 30 Dec 2010 01:19:33 -0800 Received: from yasker by syang10-desktop with local (Exim 4.72) (envelope-from ) id 1PYEh4-00086g-Eb; Thu, 30 Dec 2010 17:21:10 +0800 From: Sheng Yang To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, Sheng Yang Subject: [PATCH v2] KVM: VMX: Fix 32bit Windows blue screen with EPT Date: Thu, 30 Dec 2010 17:21:10 +0800 Message-Id: <1293700870-31138-1-git-send-email-sheng@linux.intel.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <4D1C4970.9000409@redhat.com> References: <4D1C4970.9000409@redhat.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Thu, 30 Dec 2010 22:12:20 +0000 (UTC) different. Commit d95bfcdd7cda4dfdac9588e684bc7c75794a075e "KVM: Fetch guest cr3 from hardware on demand" caused 32bit Windows guest blue screen when using with EPT. This patch fixes it by decache CR3 before CR0 change, for both paging to nonpaging, and nonpaging to paging switch. Signed-off-by: Sheng Yang --- arch/x86/kvm/vmx.c | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index f107315..bf89ec2 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -1921,8 +1921,7 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, unsigned long cr0, struct kvm_vcpu *vcpu) { - ulong cr3; - + vmx_decache_cr3(vcpu); if (!(cr0 & X86_CR0_PG)) { /* From paging/starting to nonpaging */ vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, @@ -1937,11 +1936,8 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, vmcs_read32(CPU_BASED_VM_EXEC_CONTROL) & ~(CPU_BASED_CR3_LOAD_EXITING | CPU_BASED_CR3_STORE_EXITING)); - /* Must fetch cr3 before updating cr0 */ - cr3 = kvm_read_cr3(vcpu); vcpu->arch.cr0 = cr0; vmx_set_cr4(vcpu, kvm_read_cr4(vcpu)); - vmx_set_cr3(vcpu, cr3); } if (!(cr0 & X86_CR0_WP))