Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp58775ybp; Thu, 3 Oct 2019 10:09:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqx/4mFQRHQDmf1JTAUOR2c0Ui8lKeNrd4MHOD/d2eai3DiQpMalfM9VPjhM6rLTqXrnyJge X-Received: by 2002:a50:9e65:: with SMTP id z92mr10715422ede.49.1570122543550; Thu, 03 Oct 2019 10:09:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570122543; cv=none; d=google.com; s=arc-20160816; b=WYZn3ko3OECFTAsQf+K0FBlt14BgvZXcAafxQCydQGJ0aw1YR8drYvCCeMddD7oXAn 1skVOn75jB7iefQ3ITQA7cmoPfWW2x8KieNBQL4KQ2oVIoxfJF3KJm+wRhgR4S5wlbOf IV0wAvbhmI7S3tw3rUupkWLh1iSQf6htiee1l3J3nKBApG2wjKZRN+pTbh7tDAsH+mMp YTC22EZ8z2LniKgXB9FyMB/p+BiQptm6c/kh8RuT/nRRMyGbrRa+PitEQaaHG9MOSwck x7ntZ4a0NtCExCAO66yhVBR9B2r8fnN0c/NFnmEuNjkPX+1M9yBT+rNPU6+NB/lq0XiS UmJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=clUenURFkwJqtWgf7bIF1f1pXvAjJNE0WdtmG3OZRLQ=; b=M8bP1POqRlHg0ENNEQp6Dn3HDjAl45HPQE7pYE8i+ZN+WaM0SElL7xdOm92XVapjMw j0m7jbwFLQCNeo7bI1IVWVx7S2njxe5fKwM1SE+Dq+OEnKGgNCuKrcJd45hTF3Wpv3CN yPUmGvlCDrwljyxeEWi+5hfeT/R0I/d3OR2aB4//tUKtbT7fpwCDU2DdTDptp2RZOhh0 QeXUCo/tTx4aTMCxOoqKG2bz8IbUQIOl0cIhinAr2xMjyKWMrFXOsGicMGs2LtuKPAnI 6V7Wd//sHEU5N6sUeRZ/WURD0cNDNdlOHYZqC4pUvhVpEMNtnm6eTY/PwcLOSEk91goI J+mw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=WvMKdIgA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 90si2231169edj.72.2019.10.03.10.08.38; Thu, 03 Oct 2019 10:09:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=WvMKdIgA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390636AbfJCQhE (ORCPT + 99 others); Thu, 3 Oct 2019 12:37:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:46364 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391986AbfJCQhC (ORCPT ); Thu, 3 Oct 2019 12:37:02 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DE9F82086A; Thu, 3 Oct 2019 16:37:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570120621; bh=VTgsdIf6pk4alW8KV/VijlY12lxLHov5Y3SRG5ThZa8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WvMKdIgAj/sXfxU+zX4azR8mSOsLWPcu3PF0feuI48i4rIR2GYzoAHmgzMbeuf4ig jlMejnx8ESvutg3kBOUp6cCu768/sxuSy80iPkSEq3M5hfJayMxxFzu7e0NBbiPSG/ hpzd8aVEX33ljUP5Sxo14dNAVSdpevj5olkb+dLU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nadav Amit , Doug Reiland , Sean Christopherson , Peter Xu , Paolo Bonzini Subject: [PATCH 5.2 242/313] KVM: x86: Manually calculate reserved bits when loading PDPTRS Date: Thu, 3 Oct 2019 17:53:40 +0200 Message-Id: <20191003154556.869944528@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191003154533.590915454@linuxfoundation.org> References: <20191003154533.590915454@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean Christopherson commit 16cfacc8085782dab8e365979356ce1ca87fd6cc upstream. Manually generate the PDPTR reserved bit mask when explicitly loading PDPTRs. The reserved bits that are being tracked by the MMU reflect the current paging mode, which is unlikely to be PAE paging in the vast majority of flows that use load_pdptrs(), e.g. CR0 and CR4 emulation, __set_sregs(), etc... This can cause KVM to incorrectly signal a bad PDPTR, or more likely, miss a reserved bit check and subsequently fail a VM-Enter due to a bad VMCS.GUEST_PDPTR. Add a one off helper to generate the reserved bits instead of sharing code across the MMU's calculations and the PDPTR emulation. The PDPTR reserved bits are basically set in stone, and pushing a helper into the MMU's calculation adds unnecessary complexity without improving readability. Oppurtunistically fix/update the comment for load_pdptrs(). Note, the buggy commit also introduced a deliberate functional change, "Also remove bit 5-6 from rsvd_bits_mask per latest SDM.", which was effectively (and correctly) reverted by commit cd9ae5fe47df ("KVM: x86: Fix page-tables reserved bits"). A bit of SDM archaeology shows that the SDM from late 2008 had a bug (likely a copy+paste error) where it listed bits 6:5 as AVL and A for PDPTEs used for 4k entries but reserved for 2mb entries. I.e. the SDM contradicted itself, and bits 6:5 are and always have been reserved. Fixes: 20c466b56168d ("KVM: Use rsvd_bits_mask in load_pdptrs()") Cc: stable@vger.kernel.org Cc: Nadav Amit Reported-by: Doug Reiland Signed-off-by: Sean Christopherson Reviewed-by: Peter Xu Signed-off-by: Paolo Bonzini Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/x86.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -669,8 +669,14 @@ static int kvm_read_nested_guest_page(st data, offset, len, access); } +static inline u64 pdptr_rsvd_bits(struct kvm_vcpu *vcpu) +{ + return rsvd_bits(cpuid_maxphyaddr(vcpu), 63) | rsvd_bits(5, 8) | + rsvd_bits(1, 2); +} + /* - * Load the pae pdptrs. Return true is they are all valid. + * Load the pae pdptrs. Return 1 if they are all valid, 0 otherwise. */ int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3) { @@ -689,8 +695,7 @@ int load_pdptrs(struct kvm_vcpu *vcpu, s } for (i = 0; i < ARRAY_SIZE(pdpte); ++i) { if ((pdpte[i] & PT_PRESENT_MASK) && - (pdpte[i] & - vcpu->arch.mmu->guest_rsvd_check.rsvd_bits_mask[0][2])) { + (pdpte[i] & pdptr_rsvd_bits(vcpu))) { ret = 0; goto out; }