make valid_mmap_phys_addr_range() take a pfn
Subsystems (2)
RFC PATCH 1/1 make valid_mmap_phys_addr_range() take a pfn
Newer ARMs have a 40 bit physical address space, but mapping physical memory above 4G needs a special page table format which we (currently?) do not use for userspace mappings, so what happens instead is that mapping an address >= 4G will happily discard the upper bits and wrap.
There is a valid_mmap_phys_addr_range() arch hook where we could check for >= 4G addresses and deny the mapping, but this hook takes an unsigned long address:
static inline int valid_mmap_phys_addr_range(unsigned long addr, size_t size);
And drivers/char/mem.c:mmap_mem() calls it like this:
static int mmap_mem(struct file * file, struct vm_area_struct * vma)
{
size_t size = vma->vm_end - vma->vm_start;
if (!valid_mmap_phys_addr_range(vma->vm_pgoff << PAGE_SHIFT, size))So that's not much help either.
This patch makes the hook take a pfn instead of a phys address -- how does that look?
Signed-off-by Lennert Buytenhek <[email protected]>
drivers/char/mem.c +2 -2
@@ -96,7 +96,7 @@ static inline int valid_phys_addr_range(return 1 ; } -static inline int valid_mmap_phys_addr_range (unsigned long addr,size_t size) +static inline int valid_mmap_phys_addr_range (unsigned long pfn,size_t size) {return 1 ; }
@@ -243,7 +243,7 @@ static int mmap_mem(struct file * file, {size_t size = vma->vm_end - vma->vm_start; -if (!valid_mmap_phys_addr_range (vma->vm_pgoff <<PAGE_SHIFT , size)) +if (!valid_mmap_phys_addr_range (vma->vm_pgoff, size))return -EINVAL ; vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff,
arch/ia64/kernel/efi.c +1 -1
@@ -760,7 +760,7 @@ valid_phys_addr_range (unsigned long phy }int -valid_mmap_phys_addr_range (unsigned long phys_addr,unsigned long size) +valid_mmap_phys_addr_range (unsigned long pfn,unsigned long size) {/* * MMIO regions are often missing from the EFI memory map.
arch/ia64/pci/pci.c +1 -1
@@ -651,7 +651,7 @@ pci_mmap_legacy_page_range(struct pci_bu* Avoid attribute aliasing. See Documentation/ia64/aliasing.txt * for more details. */ -if (!valid_mmap_phys_addr_range (vma->vm_pgoff <<PAGE_SHIFT , size)) +if (!valid_mmap_phys_addr_range (vma->vm_pgoff, size))return -EINVAL ; prot =phys_mem_access_prot (NULL , vma->vm_pgoff, size, vma->vm_page_prot);
include/asm-ia64/io.h +1 -1
@@ -90,7 +90,7 @@ phys_to_virt (unsigned long address)#define ARCH_HAS_VALID_PHYS_ADDR_RANGE extern u64 kern_mem_attribute (unsigned long phys_addr,unsigned long size);extern int valid_phys_addr_range (unsigned long addr,size_t count);/* efi.c */ -extern int valid_mmap_phys_addr_range (unsigned long addr,size_t count); +extern int valid_mmap_phys_addr_range (unsigned long pfn,size_t count);/* * The following two macros are deprecated and scheduled for removal.