powerpc: Fail remap_4k_pfn() if PFN doesn't fit inside PTE
authorMadhusudanan Kandasamy <kmadhu@linux.vnet.ibm.com>
Thu, 10 Jul 2014 15:15:13 +0000 (20:45 +0530)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 5 Aug 2014 06:34:06 +0000 (16:34 +1000)
remap_4k_pfn() silently truncates upper bits of input 4K PFN
if it cannot be contained in PTE. This leads invalid memory mapping and could
result in a system crash when the memory is accessed. This patch fails
remap_4k_pfn() and returns -EINVAL if the input 4K PFN cannot be contained in
PTE.

V3 : Added parentheses to protect 'pfn' and entire macro as suggested by Brian.
V2 : Rewritten to avoid helper function as suggested by Stephen Rothwell.

Signed-off-by: Madhusudanan Kandasamy <kmadhu@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/pte-hash64-64k.h

index d836d945068d032cb072013cf027f7a43e36b88a..b6d2d42f84b568d981a226f97e15d802b3dbb789 100644 (file)
@@ -75,7 +75,8 @@
        (((pte) & _PAGE_COMBO)? MMU_PAGE_4K: MMU_PAGE_64K)
 
 #define remap_4k_pfn(vma, addr, pfn, prot)                             \
-       remap_pfn_range((vma), (addr), (pfn), PAGE_SIZE,                \
-                       __pgprot(pgprot_val((prot)) | _PAGE_4K_PFN))
+       (WARN_ON(((pfn) >= (1UL << (64 - PTE_RPN_SHIFT)))) ? -EINVAL :  \
+               remap_pfn_range((vma), (addr), (pfn), PAGE_SIZE,        \
+                       __pgprot(pgprot_val((prot)) | _PAGE_4K_PFN)))
 
 #endif /* __ASSEMBLY__ */