diff options
| -rw-r--r-- | arch/x86/xen/p2m.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 7d844739e513..8b5db51be4dd 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
| @@ -70,6 +70,7 @@ | |||
| 70 | 70 | ||
| 71 | #include <asm/cache.h> | 71 | #include <asm/cache.h> |
| 72 | #include <asm/setup.h> | 72 | #include <asm/setup.h> |
| 73 | #include <asm/uaccess.h> | ||
| 73 | 74 | ||
| 74 | #include <asm/xen/page.h> | 75 | #include <asm/xen/page.h> |
| 75 | #include <asm/xen/hypercall.h> | 76 | #include <asm/xen/hypercall.h> |
| @@ -316,9 +317,9 @@ static void __init xen_rebuild_p2m_list(unsigned long *p2m) | |||
| 316 | paravirt_alloc_pte(&init_mm, __pa(p2m_identity_pte) >> PAGE_SHIFT); | 317 | paravirt_alloc_pte(&init_mm, __pa(p2m_identity_pte) >> PAGE_SHIFT); |
| 317 | for (i = 0; i < PTRS_PER_PTE; i++) { | 318 | for (i = 0; i < PTRS_PER_PTE; i++) { |
| 318 | set_pte(p2m_missing_pte + i, | 319 | set_pte(p2m_missing_pte + i, |
| 319 | pfn_pte(PFN_DOWN(__pa(p2m_missing)), PAGE_KERNEL)); | 320 | pfn_pte(PFN_DOWN(__pa(p2m_missing)), PAGE_KERNEL_RO)); |
| 320 | set_pte(p2m_identity_pte + i, | 321 | set_pte(p2m_identity_pte + i, |
| 321 | pfn_pte(PFN_DOWN(__pa(p2m_identity)), PAGE_KERNEL)); | 322 | pfn_pte(PFN_DOWN(__pa(p2m_identity)), PAGE_KERNEL_RO)); |
| 322 | } | 323 | } |
| 323 | 324 | ||
| 324 | for (pfn = 0; pfn < xen_max_p2m_pfn; pfn += chunk) { | 325 | for (pfn = 0; pfn < xen_max_p2m_pfn; pfn += chunk) { |
| @@ -365,7 +366,7 @@ static void __init xen_rebuild_p2m_list(unsigned long *p2m) | |||
| 365 | p2m_missing : p2m_identity; | 366 | p2m_missing : p2m_identity; |
| 366 | ptep = populate_extra_pte((unsigned long)(p2m + pfn)); | 367 | ptep = populate_extra_pte((unsigned long)(p2m + pfn)); |
| 367 | set_pte(ptep, | 368 | set_pte(ptep, |
| 368 | pfn_pte(PFN_DOWN(__pa(mfns)), PAGE_KERNEL)); | 369 | pfn_pte(PFN_DOWN(__pa(mfns)), PAGE_KERNEL_RO)); |
| 369 | continue; | 370 | continue; |
| 370 | } | 371 | } |
| 371 | 372 | ||
| @@ -624,6 +625,9 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) | |||
| 624 | return true; | 625 | return true; |
| 625 | } | 626 | } |
| 626 | 627 | ||
| 628 | if (likely(!__put_user(mfn, xen_p2m_addr + pfn))) | ||
| 629 | return true; | ||
| 630 | |||
| 627 | ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level); | 631 | ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level); |
| 628 | BUG_ON(!ptep || level != PG_LEVEL_4K); | 632 | BUG_ON(!ptep || level != PG_LEVEL_4K); |
| 629 | 633 | ||
| @@ -633,9 +637,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) | |||
| 633 | if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_identity))) | 637 | if (pte_pfn(*ptep) == PFN_DOWN(__pa(p2m_identity))) |
| 634 | return mfn == IDENTITY_FRAME(pfn); | 638 | return mfn == IDENTITY_FRAME(pfn); |
| 635 | 639 | ||
| 636 | xen_p2m_addr[pfn] = mfn; | 640 | return false; |
| 637 | |||
| 638 | return true; | ||
| 639 | } | 641 | } |
| 640 | 642 | ||
| 641 | bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) | 643 | bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) |
