From patchwork Wed Jun 26 19:02:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 11018195 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 238C076 for ; Wed, 26 Jun 2019 19:03:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 144A228481 for ; Wed, 26 Jun 2019 19:03:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 08A8D289D8; Wed, 26 Jun 2019 19:03:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6F152289EA for ; Wed, 26 Jun 2019 19:03:49 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hgDBa-0000IY-Nd; Wed, 26 Jun 2019 19:02:26 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hgDBZ-0000IS-Vp for xen-devel@lists.xenproject.org; Wed, 26 Jun 2019 19:02:26 +0000 X-Inumbo-ID: ed9ae9c0-9844-11e9-b8a5-1346b420ee50 Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id ed9ae9c0-9844-11e9-b8a5-1346b420ee50; Wed, 26 Jun 2019 19:02:22 +0000 (UTC) Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=andrew.cooper3@citrix.com; spf=Pass smtp.mailfrom=Andrew.Cooper3@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of andrew.cooper3@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="Andrew.Cooper3@citrix.com"; x-sender="andrew.cooper3@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of Andrew.Cooper3@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="Andrew.Cooper3@citrix.com"; x-sender="Andrew.Cooper3@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="Andrew.Cooper3@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: qoR3x2ifMBGzOD03s1bLIloyyIW3mb0qm/QL1St/CFo6DDlFY6Mg8k2Anm0BFBwY0UfMwTi+Mp vrgKixH8BZh09o28DR8vbURos1YIMHfKcsk4qEBKQfaTr1ryXNu1JYV8IJjUvfHazX9dvTP7vl p9FxAuKdr9HVb7p8GrQjWd+hJRrf2dM0NoRPJoPFV9VS9eEIqSe5SgX8O0ZmQGrjOEe1u3V0KZ z/6ukSNDaulaN1rLohvhaPpARoZTzt6vhPgQo0Uc7UWy/JmWgfVNCsA75dlHbCwAwvTkDFEGRK NTc= X-SBRS: 2.7 X-MesageID: 2280607 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.63,420,1557201600"; d="scan'208";a="2280607" From: Andrew Cooper To: Xen-devel Date: Wed, 26 Jun 2019 20:02:12 +0100 Message-ID: <20190626190212.15365-1-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 Subject: [Xen-devel] [PATCH] x86/vvmx: set CR4 before CR0 X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Sergey Dyasli , Kevin Tian , Jan Beulich , Wei Liu , Jun Nakajima , =?utf-8?q?Roge?= =?utf-8?q?r_Pau_Monn=C3=A9?= Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Sergey Dyasli Otherwise hvm_set_cr0() will check the wrong CR4 bits (L1 instead of L2 and vice-versa). Signed-off-by: Sergey Dyasli Reviewed-by: Andrew Cooper Reviewed-by: Roger Pau Monné Acked-by: Kevin Tian --- CC: Jan Beulich CC: Wei Liu CC: Roger Pau Monné CC: Jun Nakajima CC: Kevin Tian I found this patch languishing in the XenServer patchqueue, and Sergey is OoO so I'm submitting it on his behalf. Without this change, nested virt is broken when L1 and L2 differ in their use of PCID. This is only a stopgap solution - it resolves the PCID issue without introducing other issues, but the proper fix needs to consider all control bits at once, rather than considering a vmentry/exit as a sequence of changes of discrete registers. --- xen/arch/x86/hvm/vmx/vvmx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index 7bca572d88..332623d006 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -1024,11 +1024,11 @@ static void load_shadow_guest_state(struct vcpu *v) nvcpu->guest_cr[0] = get_vvmcs(v, CR0_READ_SHADOW); nvcpu->guest_cr[4] = get_vvmcs(v, CR4_READ_SHADOW); - rc = hvm_set_cr0(get_vvmcs(v, GUEST_CR0), true); + rc = hvm_set_cr4(get_vvmcs(v, GUEST_CR4), true); if ( rc == X86EMUL_EXCEPTION ) hvm_inject_hw_exception(TRAP_gp_fault, 0); - rc = hvm_set_cr4(get_vvmcs(v, GUEST_CR4), true); + rc = hvm_set_cr0(get_vvmcs(v, GUEST_CR0), true); if ( rc == X86EMUL_EXCEPTION ) hvm_inject_hw_exception(TRAP_gp_fault, 0); @@ -1238,11 +1238,11 @@ static void load_vvmcs_host_state(struct vcpu *v) __vmwrite(vmcs_h2g_field[i].guest_field, r); } - rc = hvm_set_cr0(get_vvmcs(v, HOST_CR0), true); + rc = hvm_set_cr4(get_vvmcs(v, HOST_CR4), true); if ( rc == X86EMUL_EXCEPTION ) hvm_inject_hw_exception(TRAP_gp_fault, 0); - rc = hvm_set_cr4(get_vvmcs(v, HOST_CR4), true); + rc = hvm_set_cr0(get_vvmcs(v, HOST_CR0), true); if ( rc == X86EMUL_EXCEPTION ) hvm_inject_hw_exception(TRAP_gp_fault, 0);