diff options
-rw-r--r-- | arch/x86/xen/mmu.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 5f76c0acb2c..d957dce61ed 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -320,8 +320,13 @@ static pteval_t pte_mfn_to_pfn(pteval_t val) | |||
320 | { | 320 | { |
321 | if (val & _PAGE_PRESENT) { | 321 | if (val & _PAGE_PRESENT) { |
322 | unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; | 322 | unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; |
323 | unsigned long pfn = mfn_to_pfn(mfn); | ||
324 | |||
323 | pteval_t flags = val & PTE_FLAGS_MASK; | 325 | pteval_t flags = val & PTE_FLAGS_MASK; |
324 | val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags; | 326 | if (unlikely(pfn == ~0)) |
327 | val = flags & ~_PAGE_PRESENT; | ||
328 | else | ||
329 | val = ((pteval_t)pfn << PAGE_SHIFT) | flags; | ||
325 | } | 330 | } |
326 | 331 | ||
327 | return val; | 332 | return val; |