On 26/01/16 12:15, Jan Beulich wrote: > 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 <jbeul...@suse.com> > Cc: Juergen Gross <jgr...@suse.com>
Reviewed-by: Juergen Gross <jgr...@suse.com> > --- > 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)); > > > >