diff options
Diffstat (limited to 'drivers/char/mem.c')
-rw-r--r-- | drivers/char/mem.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index ce3ff8641191..5b2d18035073 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
@@ -101,6 +101,11 @@ static inline int valid_phys_addr_range(unsigned long addr, size_t *count) | |||
101 | 101 | ||
102 | return 1; | 102 | return 1; |
103 | } | 103 | } |
104 | |||
105 | static inline int valid_mmap_phys_addr_range(unsigned long addr, size_t *size) | ||
106 | { | ||
107 | return 1; | ||
108 | } | ||
104 | #endif | 109 | #endif |
105 | 110 | ||
106 | /* | 111 | /* |
@@ -244,15 +249,20 @@ static pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | |||
244 | 249 | ||
245 | static int mmap_mem(struct file * file, struct vm_area_struct * vma) | 250 | static int mmap_mem(struct file * file, struct vm_area_struct * vma) |
246 | { | 251 | { |
252 | size_t size = vma->vm_end - vma->vm_start; | ||
253 | |||
254 | if (!valid_mmap_phys_addr_range(vma->vm_pgoff << PAGE_SHIFT, &size)) | ||
255 | return -EINVAL; | ||
256 | |||
247 | vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, | 257 | vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, |
248 | vma->vm_end - vma->vm_start, | 258 | size, |
249 | vma->vm_page_prot); | 259 | vma->vm_page_prot); |
250 | 260 | ||
251 | /* Remap-pfn-range will mark the range VM_IO and VM_RESERVED */ | 261 | /* Remap-pfn-range will mark the range VM_IO and VM_RESERVED */ |
252 | if (remap_pfn_range(vma, | 262 | if (remap_pfn_range(vma, |
253 | vma->vm_start, | 263 | vma->vm_start, |
254 | vma->vm_pgoff, | 264 | vma->vm_pgoff, |
255 | vma->vm_end-vma->vm_start, | 265 | size, |
256 | vma->vm_page_prot)) | 266 | vma->vm_page_prot)) |
257 | return -EAGAIN; | 267 | return -EAGAIN; |
258 | return 0; | 268 | return 0; |