Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp1684571ybz; Thu, 16 Apr 2020 13:39:00 -0700 (PDT) X-Google-Smtp-Source: APiQypKW3F6KJYP81iNhUgxRhHcFhPtSb8nib/yAMgEds7I48Q3rcZ8z9Zjd+zSRTnQKHK7/+UIl X-Received: by 2002:a50:9f8f:: with SMTP id c15mr9054edf.377.1587069540366; Thu, 16 Apr 2020 13:39:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587069540; cv=none; d=google.com; s=arc-20160816; b=yyHO+f++qRFP5MN2kNVqlzCMOPYDZCJOA0AhsrL/YnyBfNNToXv/lLl2lGE9oF9sjV gurekAWhvBIlRQefNYTsopUIpUtiVPI0z936g60a4hTNhGcbG1TTBhY8mXB9A11sPY6y Bf+nj/FISLW2/bzcH4+oRRXwEu2gRRodhv03PKehpUMbjm6QOPl8eU/EVCvP3UcKqYQz 4e9GYgkrSdKGRjsI6pwbnKJNgSGK0SxzNdjYwIR19JoR6IIdEc0unSlPtW/YRb9QYJ0h ixBTc11m20yVvPrqFYi5x5r7tbt+53RwSmFP/i9scmtt9UtoLtrp6KvS88TpArhFdlOE 8D8g== 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=5DDFXUOQnlSx7EqcS1dH2VF1aHj4fLC5Od3LWewgs6g=; b=LJoM2uHhUSHuTepDfwnj2NlLlCAPV9i04yUfHvsodvCNfDa4yRe3AUqUmwXxgVhcZ6 wbrVIHYFfIST+Bn7Lzv4OUCn0lEhCW8gB5rPPHc4m9RIQcpOVWH2ivo3AwnkVBvALRZc Dra623eoZiRTuYjN0Emg7l7xPKn+qRwWFLWyDTer6gxd8VUSNznjmAT6HiHp/i5EyP0X GGCi2LDaYjHeN2zxQB88/1pq07JL+8cz6oIPQIfFVIgv0tUa7B9MGe35LqYoZlnTz/Mj RDD14RHOksQkWQgug5+D74HDApI6WEZnly61hQHlIJW7opUJZytu4lbdMKQTAsV0aPwq vL7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=nqtcHbSZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d2si11758211ejk.407.2020.04.16.13.38.37; Thu, 16 Apr 2020 13:39:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=nqtcHbSZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2410595AbgDPPsE (ORCPT + 99 others); Thu, 16 Apr 2020 11:48:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:44690 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2896192AbgDPNd3 (ORCPT ); Thu, 16 Apr 2020 09:33:29 -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 BE670221F9; Thu, 16 Apr 2020 13:33:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587044008; bh=XSrdZZPRrkydDSI2Cfmq4du3S4DhEDyE4bvHKeeTGCc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nqtcHbSZE8r+nGWmoFKQqzY8YNKxQB1Ni8yKElavI96QrdsnbxkRj2zsfM3tQTpaW z/uRPlXGbZ74TWOpzVKOnbla90UxdAapDZj9R8MQfumL36OrR/MO/8Kf+nYTTqpvOb xs0ZVjMA3JXnExMPmvqRrY13Jar3fuNaHrm9cKjY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Thomas Hellstrom , Borislav Petkov , Dave Hansen , Tom Lendacky , Sasha Levin Subject: [PATCH 5.5 044/257] x86: Dont let pgprot_modify() change the page encryption bit Date: Thu, 16 Apr 2020 15:21:35 +0200 Message-Id: <20200416131331.446394876@linuxfoundation.org> X-Mailer: git-send-email 2.26.1 In-Reply-To: <20200416131325.891903893@linuxfoundation.org> References: <20200416131325.891903893@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: Thomas Hellstrom [ Upstream commit 6db73f17c5f155dbcfd5e48e621c706270b84df0 ] When SEV or SME is enabled and active, vm_get_page_prot() typically returns with the encryption bit set. This means that users of pgprot_modify(, vm_get_page_prot()) (mprotect_fixup(), do_mmap()) end up with a value of vma->vm_pg_prot that is not consistent with the intended protection of the PTEs. This is also important for fault handlers that rely on the VMA vm_page_prot to set the page protection. Fix this by not allowing pgprot_modify() to change the encryption bit, similar to how it's done for PAT bits. Signed-off-by: Thomas Hellstrom Signed-off-by: Borislav Petkov Reviewed-by: Dave Hansen Acked-by: Tom Lendacky Link: https://lkml.kernel.org/r/20200304114527.3636-2-thomas_os@shipmail.org Signed-off-by: Sasha Levin --- arch/x86/include/asm/pgtable.h | 7 +++++-- arch/x86/include/asm/pgtable_types.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index ad97dc1551959..9de80cbdd887e 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -624,12 +624,15 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) return __pmd(val); } -/* mprotect needs to preserve PAT bits when updating vm_page_prot */ +/* + * mprotect needs to preserve PAT and encryption bits when updating + * vm_page_prot + */ #define pgprot_modify pgprot_modify static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot) { pgprotval_t preservebits = pgprot_val(oldprot) & _PAGE_CHG_MASK; - pgprotval_t addbits = pgprot_val(newprot); + pgprotval_t addbits = pgprot_val(newprot) & ~_PAGE_CHG_MASK; return __pgprot(preservebits | addbits); } diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index b5e49e6bac635..8267dd426b152 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -123,7 +123,7 @@ */ #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY | \ - _PAGE_SOFT_DIRTY | _PAGE_DEVMAP) + _PAGE_SOFT_DIRTY | _PAGE_DEVMAP | _PAGE_ENC) #define _HPAGE_CHG_MASK (_PAGE_CHG_MASK | _PAGE_PSE) /* -- 2.20.1