ioremap_page_range() calls pgprot_nx() vmap() and vmap_pfn()
clear execute permission by calling pgprot_nx().
When pgprot_nx() is not defined it falls back to a nop.
Implement it for powerpc then use it in early_ioremap_range().
Then the call to pte_exprotect() can be removed from ioremap_prot().
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/5993a7a097e989af1c97fc4a6c011fefc67dbe6e.1695659959.git.christophe.leroy@csgroup.eu
        return __pgprot(pte_flags);
 }
 
+static inline pgprot_t pgprot_nx(pgprot_t prot)
+{
+       return pte_pgprot(pte_exprotect(__pte(pgprot_val(prot))));
+}
+#define pgprot_nx pgprot_nx
+
 #ifndef pmd_page_vaddr
 static inline const void *pmd_page_vaddr(pmd_t pmd)
 {
 
        if (pte_write(pte))
                pte = pte_mkdirty(pte);
 
-       /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
-       pte = pte_exprotect(pte);
+       /* we don't want to let _PAGE_USER leak out */
        pte = pte_mkprivileged(pte);
 
        if (iowa_is_active())
        unsigned long i;
 
        for (i = 0; i < size; i += PAGE_SIZE) {
-               int err = map_kernel_page(ea + i, pa + i, prot);
+               int err = map_kernel_page(ea + i, pa + i, pgprot_nx(prot));
 
                if (WARN_ON_ONCE(err))  /* Should clean up */
                        return err;