|
@@ -467,21 +467,18 @@ static inline int is_cow_mapping(unsigned int flags)
|
|
|
struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
|
|
|
pte_t pte)
|
|
|
{
|
|
|
- unsigned long pfn;
|
|
|
+ unsigned long pfn = pte_pfn(pte);
|
|
|
|
|
|
if (HAVE_PTE_SPECIAL) {
|
|
|
- if (likely(!pte_special(pte))) {
|
|
|
- VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
|
|
|
- return pte_page(pte);
|
|
|
- }
|
|
|
- VM_BUG_ON(!(vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)));
|
|
|
+ if (likely(!pte_special(pte)))
|
|
|
+ goto check_pfn;
|
|
|
+ if (!(vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)))
|
|
|
+ print_bad_pte(vma, addr, pte, NULL);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
/* !HAVE_PTE_SPECIAL case follows: */
|
|
|
|
|
|
- pfn = pte_pfn(pte);
|
|
|
-
|
|
|
if (unlikely(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP))) {
|
|
|
if (vma->vm_flags & VM_MIXEDMAP) {
|
|
|
if (!pfn_valid(pfn))
|
|
@@ -497,11 +494,14 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- VM_BUG_ON(!pfn_valid(pfn));
|
|
|
+check_pfn:
|
|
|
+ if (unlikely(pfn > highest_memmap_pfn)) {
|
|
|
+ print_bad_pte(vma, addr, pte, NULL);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* NOTE! We still have PageReserved() pages in the page tables.
|
|
|
- *
|
|
|
* eg. VDSO mappings can cause them to exist.
|
|
|
*/
|
|
|
out:
|