From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965155AbcAZLPZ (ORCPT ); Tue, 26 Jan 2016 06:15:25 -0500 Received: from prv-mh.provo.novell.com ([137.65.248.74]:33432 "EHLO prv-mh.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965122AbcAZLPU convert rfc822-to-8bit (ORCPT ); Tue, 26 Jan 2016 06:15:20 -0500 Message-Id: <56A7635602000078000CAFF1@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.0 Date: Tue, 26 Jan 2016 04:15:18 -0700 From: "Jan Beulich" To: , "Thomas Gleixner" , Cc: "Juergen Gross" , Subject: [PATCH v2] ix86: fix types used in pgprot cachability flags translations References: <56A65EB502000078000CAC72@prv-mh.provo.novell.com> In-Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8BIT Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For PAE kernels "unsigned long" is not suitable to hold page protection flags, since _PAGE_NX doesn't fit there. This is the reason for quite a few W+X pages getting reported as insecure during boot (observed namely for the entire initrd range). Fixes: 281d4078be ("x86: Make page cache mode a real type") Signed-off-by: Jan Beulich Cc: Juergen Gross --- v2: Remove code enhancement part, as requested by tglx. --- arch/x86/include/asm/pgtable_types.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) --- 4.5-rc1/arch/x86/include/asm/pgtable_types.h +++ 4.5-rc1-ix86-PAE-pgprot-xlat/arch/x86/include/asm/pgtable_types.h @@ -367,9 +367,8 @@ static inline enum page_cache_mode pgpro static inline pgprot_t pgprot_4k_2_large(pgprot_t pgprot) { pgprot_t new; - unsigned long val; + pgprotval_t val = pgprot_val(pgprot); - val = pgprot_val(pgprot); pgprot_val(new) = (val & ~(_PAGE_PAT | _PAGE_PAT_LARGE)) | ((val & _PAGE_PAT) << (_PAGE_BIT_PAT_LARGE - _PAGE_BIT_PAT)); return new; @@ -377,9 +376,8 @@ static inline pgprot_t pgprot_4k_2_large static inline pgprot_t pgprot_large_2_4k(pgprot_t pgprot) { pgprot_t new; - unsigned long val; + pgprotval_t val = pgprot_val(pgprot); - val = pgprot_val(pgprot); pgprot_val(new) = (val & ~(_PAGE_PAT | _PAGE_PAT_LARGE)) | ((val & _PAGE_PAT_LARGE) >> (_PAGE_BIT_PAT_LARGE - _PAGE_BIT_PAT));