|
@@ -261,7 +261,11 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma)
|
|
|
|
|
|
static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
|
|
|
{
|
|
|
- unsigned long long val;
|
|
|
+ unsigned long pfn;
|
|
|
+
|
|
|
+ /* Turn a kernel-virtual address into a physical page frame */
|
|
|
+ pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT;
|
|
|
+
|
|
|
/*
|
|
|
* RED-PEN: on some architectures there is more mapped memory
|
|
|
* than available in mem_map which pfn_valid checks
|
|
@@ -269,10 +273,10 @@ static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
|
|
|
*
|
|
|
* RED-PEN: vmalloc is not supported right now.
|
|
|
*/
|
|
|
- if (!pfn_valid(vma->vm_pgoff))
|
|
|
+ if (!pfn_valid(pfn))
|
|
|
return -EIO;
|
|
|
- val = (u64)vma->vm_pgoff << PAGE_SHIFT;
|
|
|
- vma->vm_pgoff = __pa(val) >> PAGE_SHIFT;
|
|
|
+
|
|
|
+ vma->vm_pgoff = pfn;
|
|
|
return mmap_mem(file, vma);
|
|
|
}
|
|
|
|