diff options
Diffstat (limited to 'arch/x86/include/asm/xen/page.h')
-rw-r--r-- | arch/x86/include/asm/xen/page.h | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 123e669bf363..790ce08e41f2 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h | |||
@@ -9,7 +9,7 @@ | |||
9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
10 | #include <linux/device.h> | 10 | #include <linux/device.h> |
11 | 11 | ||
12 | #include <linux/uaccess.h> | 12 | #include <asm/extable.h> |
13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
14 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
15 | 15 | ||
@@ -93,12 +93,39 @@ clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | |||
93 | */ | 93 | */ |
94 | static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val) | 94 | static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val) |
95 | { | 95 | { |
96 | return __put_user(val, (unsigned long __user *)addr); | 96 | int ret = 0; |
97 | |||
98 | asm volatile("1: mov %[val], %[ptr]\n" | ||
99 | "2:\n" | ||
100 | ".section .fixup, \"ax\"\n" | ||
101 | "3: sub $1, %[ret]\n" | ||
102 | " jmp 2b\n" | ||
103 | ".previous\n" | ||
104 | _ASM_EXTABLE(1b, 3b) | ||
105 | : [ret] "+r" (ret), [ptr] "=m" (*addr) | ||
106 | : [val] "r" (val)); | ||
107 | |||
108 | return ret; | ||
97 | } | 109 | } |
98 | 110 | ||
99 | static inline int xen_safe_read_ulong(unsigned long *addr, unsigned long *val) | 111 | static inline int xen_safe_read_ulong(const unsigned long *addr, |
112 | unsigned long *val) | ||
100 | { | 113 | { |
101 | return __get_user(*val, (unsigned long __user *)addr); | 114 | int ret = 0; |
115 | unsigned long rval = ~0ul; | ||
116 | |||
117 | asm volatile("1: mov %[ptr], %[rval]\n" | ||
118 | "2:\n" | ||
119 | ".section .fixup, \"ax\"\n" | ||
120 | "3: sub $1, %[ret]\n" | ||
121 | " jmp 2b\n" | ||
122 | ".previous\n" | ||
123 | _ASM_EXTABLE(1b, 3b) | ||
124 | : [ret] "+r" (ret), [rval] "+r" (rval) | ||
125 | : [ptr] "m" (*addr)); | ||
126 | *val = rval; | ||
127 | |||
128 | return ret; | ||
102 | } | 129 | } |
103 | 130 | ||
104 | #ifdef CONFIG_XEN_PV | 131 | #ifdef CONFIG_XEN_PV |