]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
powerpc: Fix ioremap_flags() with book3e pte definition
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 7 Apr 2010 04:39:36 +0000 (14:39 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 7 Apr 2010 04:39:47 +0000 (14:39 +1000)
We can't just clear the user read permission in book3e pte, because
that will also clear supervisor read permission.  This surely isn't
desired.  Fix the problem by adding the supervisor read back.

BenH: Slightly simplified the ifdef and applied to ppc64 too

Signed-off-by: Li Yang <leoli@freescale.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/mm/pgtable_32.c
arch/powerpc/mm/pgtable_64.c

index b9243e7557ae970fb06aa9d86b53d760312aebb3..767b0cf17d337d4882a3af92f7c753d048e8630d 100644 (file)
@@ -146,6 +146,14 @@ ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags)
        /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
        flags &= ~(_PAGE_USER | _PAGE_EXEC);
 
+#ifdef _PAGE_BAP_SR
+       /* _PAGE_USER contains _PAGE_BAP_SR on BookE using the new PTE format
+        * which means that we just cleared supervisor access... oops ;-) This
+        * restores it
+        */
+       flags |= _PAGE_BAP_SR;
+#endif
+
        return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
 }
 EXPORT_SYMBOL(ioremap_flags);
index d95679a5fb29f9dfccb3f09816288477b07242ba..d050fc8d9714830ce3cea027465f794864a8a830 100644 (file)
@@ -265,6 +265,14 @@ void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size,
        /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
        flags &= ~(_PAGE_USER | _PAGE_EXEC);
 
+#ifdef _PAGE_BAP_SR
+       /* _PAGE_USER contains _PAGE_BAP_SR on BookE using the new PTE format
+        * which means that we just cleared supervisor access... oops ;-) This
+        * restores it
+        */
+       flags |= _PAGE_BAP_SR;
+#endif
+
        if (ppc_md.ioremap)
                return ppc_md.ioremap(addr, size, flags, caller);
        return __ioremap_caller(addr, size, flags, caller);