fix pfn_pte for 64BIT_PHYS_ADDR
PATCH 1/1 fix pfn_pte for 64BIT_PHYS_ADDR
On CONFIG_64BIT_PHYS_ADDR, pfn always fits in 'unsigned long', but 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 Andrew Isaacson <[email protected]>
include/asm-mips/pgtable-32.h +1 -1
@@ -137,7 +137,7 @@#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) */
Ralf Baechle
AppliedQuoted 4 lines · Andrew Isaacson
On
CONFIG_64BIT_PHYS_ADDR, pfn always fits in 'unsigned long', but pfn<<PAGE_SHIFT sometimes extends beyond. The pte is big enough to hold 'long long', but the shift inpfn_pte()needs to do its calculation with enough bits to hold the result.
Thanks, applied also.
Ralf