On CONFIG_64BIT_PHYS_ADDR, pfn always fits in 'unsigned long', but
authorRalf Baechle <ralf@linux-mips.org>
Wed, 17 Aug 2005 10:11:10 +0000 (10:11 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Sat, 29 Oct 2005 18:32:09 +0000 (19:32 +0100)
pfn<<PAGE_SHIFT sometimes extends beyond.  The pte is big enough to hold
'long long', but the shift in pfn_pte() needs to do its calculation with
enough bits to hold the result.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
include/asm-mips/pgtable-32.h

index 217afc375a841fc6d827628f95392b4c142ab829..0cff64ce0fb883de926c6be1db71d6e202bacdcc 100644 (file)
@@ -137,7 +137,7 @@ pfn_pte(unsigned long pfn, pgprot_t prot)
 #define pfn_pte(pfn, prot)     __pte(((pfn) << (PAGE_SHIFT + 2)) | pgprot_val(prot))
 #else
 #define pte_pfn(x)             ((unsigned long)((x).pte >> PAGE_SHIFT))
-#define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
+#define pfn_pte(pfn, prot)     __pte(((unsigned long long)(pfn) << PAGE_SHIFT) | pgprot_val(prot))
 #endif
 #endif /* defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) */