hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/arch/x86/include/asm/xen/page.h
....@@ -9,9 +9,8 @@
99 #include <linux/mm.h>
1010 #include <linux/device.h>
1111
12
-#include <linux/uaccess.h>
12
+#include <asm/extable.h>
1313 #include <asm/page.h>
14
-#include <asm/pgtable.h>
1514
1615 #include <xen/interface/xen.h>
1716 #include <xen/interface/grant_table.h>
....@@ -93,12 +92,39 @@
9392 */
9493 static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val)
9594 {
96
- return __put_user(val, (unsigned long __user *)addr);
95
+ int ret = 0;
96
+
97
+ asm volatile("1: mov %[val], %[ptr]\n"
98
+ "2:\n"
99
+ ".section .fixup, \"ax\"\n"
100
+ "3: sub $1, %[ret]\n"
101
+ " jmp 2b\n"
102
+ ".previous\n"
103
+ _ASM_EXTABLE(1b, 3b)
104
+ : [ret] "+r" (ret), [ptr] "=m" (*addr)
105
+ : [val] "r" (val));
106
+
107
+ return ret;
97108 }
98109
99
-static inline int xen_safe_read_ulong(unsigned long *addr, unsigned long *val)
110
+static inline int xen_safe_read_ulong(const unsigned long *addr,
111
+ unsigned long *val)
100112 {
101
- return __get_user(*val, (unsigned long __user *)addr);
113
+ int ret = 0;
114
+ unsigned long rval = ~0ul;
115
+
116
+ asm volatile("1: mov %[ptr], %[rval]\n"
117
+ "2:\n"
118
+ ".section .fixup, \"ax\"\n"
119
+ "3: sub $1, %[ret]\n"
120
+ " jmp 2b\n"
121
+ ".previous\n"
122
+ _ASM_EXTABLE(1b, 3b)
123
+ : [ret] "+r" (ret), [rval] "+r" (rval)
124
+ : [ptr] "m" (*addr));
125
+ *val = rval;
126
+
127
+ return ret;
102128 }
103129
104130 #ifdef CONFIG_XEN_PV