aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/xen/page.h16
-rw-r--r--arch/x86/xen/p2m.c2
2 files changed, 16 insertions, 2 deletions
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
index b54a3d20d6b2..5eea09915a15 100644
--- a/arch/x86/include/asm/xen/page.h
+++ b/arch/x86/include/asm/xen/page.h
@@ -60,6 +60,20 @@ extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
60extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); 60extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn);
61 61
62/* 62/*
63 * Helper functions to write or read unsigned long values to/from
64 * memory, when the access may fault.
65 */
66static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val)
67{
68 return __put_user(val, (unsigned long __user *)addr);
69}
70
71static inline int xen_safe_read_ulong(unsigned long *addr, unsigned long *val)
72{
73 return __get_user(*val, (unsigned long __user *)addr);
74}
75
76/*
63 * When to use pfn_to_mfn(), __pfn_to_mfn() or get_phys_to_machine(): 77 * When to use pfn_to_mfn(), __pfn_to_mfn() or get_phys_to_machine():
64 * - pfn_to_mfn() returns either INVALID_P2M_ENTRY or the mfn. No indicator 78 * - pfn_to_mfn() returns either INVALID_P2M_ENTRY or the mfn. No indicator
65 * bits (identity or foreign) are set. 79 * bits (identity or foreign) are set.
@@ -125,7 +139,7 @@ static inline unsigned long mfn_to_pfn_no_overrides(unsigned long mfn)
125 * In such cases it doesn't matter what we return (we return garbage), 139 * In such cases it doesn't matter what we return (we return garbage),
126 * but we must handle the fault without crashing! 140 * but we must handle the fault without crashing!
127 */ 141 */
128 ret = __get_user(pfn, &machine_to_phys_mapping[mfn]); 142 ret = xen_safe_read_ulong(&machine_to_phys_mapping[mfn], &pfn);
129 if (ret < 0) 143 if (ret < 0)
130 return ~0; 144 return ~0;
131 145
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index 8b5db51be4dd..edbc7a63fd73 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -625,7 +625,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn)
625 return true; 625 return true;
626 } 626 }
627 627
628 if (likely(!__put_user(mfn, xen_p2m_addr + pfn))) 628 if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
629 return true; 629 return true;
630 630
631 ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level); 631 ptep = lookup_address((unsigned long)(xen_p2m_addr + pfn), &level);