Christophe Leroy <christophe.leroy@xxxxxx> writes: > On 10/17/2018 12:59 AM, Michael Ellerman wrote: ... >> The question is what's the right way to fix it? Should pte_pgprot() not >> be filtering those bits out on book3e? > > I think we should not use pte_pggrot() for that then. What about the > below fix ? Thanks, that almost works. pte_mkprivileged() also needs to not strip _PAGE_BAP_SR. But there's also a use of pte_pgprot() in mm/memory.c, and I think that is also broken now that we don't add PAGE_KERNEL back in. Aneesh is going to do a patch to make pte_pgprot() only mask the PFN which is what other arches do. cheers > From: Christophe Leroy <christophe.leroy@xxxxxx> > Date: Wed, 17 Oct 2018 05:56:25 +0000 > Subject: [PATCH] powerpc/mm: don't use pte_pgprot() in ioremap_prot() > > pte_pgprot() filters out some required flags like _PAGE_PRESENT. > > This patch replaces pte_pgprot() by __pgprot(pte_val()) > in ioremap_prot() > > Fixes: 26973fa5ac0e ("powerpc/mm: use pte helpers in generic code") > Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxx> > --- > arch/powerpc/mm/pgtable_32.c | 3 ++- > arch/powerpc/mm/pgtable_64.c | 4 ++-- > 2 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c > index 5877f5aa8f5d..a606e2f4937b 100644 > --- a/arch/powerpc/mm/pgtable_32.c > +++ b/arch/powerpc/mm/pgtable_32.c > @@ -122,7 +122,8 @@ ioremap_prot(phys_addr_t addr, unsigned long size, > unsigned long flags) > pte = pte_exprotect(pte); > pte = pte_mkprivileged(pte); > > - return __ioremap_caller(addr, size, pte_pgprot(pte), > __builtin_return_address(0)); > + return __ioremap_caller(addr, size, __pgprot(pte_val(pte)), > + __builtin_return_address(0)); > } > EXPORT_SYMBOL(ioremap_prot); > > diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c > index fb1375c07e8c..836bf436cabb 100644 > --- a/arch/powerpc/mm/pgtable_64.c > +++ b/arch/powerpc/mm/pgtable_64.c > @@ -245,8 +245,8 @@ void __iomem * ioremap_prot(phys_addr_t addr, > unsigned long size, > pte = pte_mkprivileged(pte); > > if (ppc_md.ioremap) > - return ppc_md.ioremap(addr, size, pte_pgprot(pte), caller); > - return __ioremap_caller(addr, size, pte_pgprot(pte), caller); > + return ppc_md.ioremap(addr, size, __pgprot(pte_val(pte)), caller); > + return __ioremap_caller(addr, size, __pgprot(pte_val(pte)), caller); > } > > > -- > 2.13.3