hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/arch/xtensa/include/asm/uaccess.h
....@@ -32,17 +32,16 @@
3232 #define KERNEL_DS ((mm_segment_t) { 0 })
3333 #define USER_DS ((mm_segment_t) { 1 })
3434
35
-#define get_ds() (KERNEL_DS)
3635 #define get_fs() (current->thread.current_ds)
3736 #define set_fs(val) (current->thread.current_ds = (val))
3837
39
-#define segment_eq(a, b) ((a).seg == (b).seg)
38
+#define uaccess_kernel() (get_fs().seg == KERNEL_DS.seg)
4039
4140 #define __kernel_ok (uaccess_kernel())
4241 #define __user_ok(addr, size) \
4342 (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size)))
4443 #define __access_ok(addr, size) (__kernel_ok || __user_ok((addr), (size)))
45
-#define access_ok(type, addr, size) __access_ok((unsigned long)(addr), (size))
44
+#define access_ok(addr, size) __access_ok((unsigned long)(addr), (size))
4645
4746 #define user_addr_max() (uaccess_kernel() ? ~0UL : TASK_SIZE)
4847
....@@ -85,8 +84,8 @@
8584 #define __put_user_check(x, ptr, size) \
8685 ({ \
8786 long __pu_err = -EFAULT; \
88
- __typeof__(*(ptr)) *__pu_addr = (ptr); \
89
- if (access_ok(VERIFY_WRITE, __pu_addr, size)) \
87
+ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
88
+ if (access_ok(__pu_addr, size)) \
9089 __put_user_size((x), __pu_addr, (size), __pu_err); \
9190 __pu_err; \
9291 })
....@@ -101,7 +100,7 @@
101100 case 4: __put_user_asm(x, ptr, retval, 4, "s32i", __cb); break; \
102101 case 8: { \
103102 __typeof__(*ptr) __v64 = x; \
104
- retval = __copy_to_user(ptr, &__v64, 8); \
103
+ retval = __copy_to_user(ptr, &__v64, 8) ? -EFAULT : 0; \
105104 break; \
106105 } \
107106 default: __put_user_bad(); \
....@@ -133,14 +132,14 @@
133132 #define __check_align_1 ""
134133
135134 #define __check_align_2 \
136
- " _bbci.l %3, 0, 1f \n" \
137
- " movi %0, %4 \n" \
135
+ " _bbci.l %[mem] * 0, 1f \n" \
136
+ " movi %[err], %[efault] \n" \
138137 " _j 2f \n"
139138
140139 #define __check_align_4 \
141
- " _bbsi.l %3, 0, 0f \n" \
142
- " _bbci.l %3, 1, 1f \n" \
143
- "0: movi %0, %4 \n" \
140
+ " _bbsi.l %[mem] * 0, 0f \n" \
141
+ " _bbci.l %[mem] * 0 + 1, 1f \n" \
142
+ "0: movi %[err], %[efault] \n" \
144143 " _j 2f \n"
145144
146145
....@@ -152,41 +151,40 @@
152151 * WARNING: If you modify this macro at all, verify that the
153152 * __check_align_* macros still work.
154153 */
155
-#define __put_user_asm(x, addr, err, align, insn, cb) \
154
+#define __put_user_asm(x_, addr_, err_, align, insn, cb)\
156155 __asm__ __volatile__( \
157156 __check_align_##align \
158
- "1: "insn" %2, %3, 0 \n" \
157
+ "1: "insn" %[x], %[mem] \n" \
159158 "2: \n" \
160159 " .section .fixup,\"ax\" \n" \
161160 " .align 4 \n" \
162
- "4: \n" \
163
- " .long 2b \n" \
161
+ " .literal_position \n" \
164162 "5: \n" \
165
- " l32r %1, 4b \n" \
166
- " movi %0, %4 \n" \
167
- " jx %1 \n" \
163
+ " movi %[tmp], 2b \n" \
164
+ " movi %[err], %[efault] \n" \
165
+ " jx %[tmp] \n" \
168166 " .previous \n" \
169167 " .section __ex_table,\"a\" \n" \
170168 " .long 1b, 5b \n" \
171169 " .previous" \
172
- :"=r" (err), "=r" (cb) \
173
- :"r" ((int)(x)), "r" (addr), "i" (-EFAULT), "0" (err))
170
+ :[err] "+r"(err_), [tmp] "=r"(cb), [mem] "=m"(*(addr_)) \
171
+ :[x] "r"(x_), [efault] "i"(-EFAULT))
174172
175173 #define __get_user_nocheck(x, ptr, size) \
176174 ({ \
177
- long __gu_err, __gu_val; \
178
- __get_user_size(__gu_val, (ptr), (size), __gu_err); \
179
- (x) = (__force __typeof__(*(ptr)))__gu_val; \
175
+ long __gu_err; \
176
+ __get_user_size((x), (ptr), (size), __gu_err); \
180177 __gu_err; \
181178 })
182179
183180 #define __get_user_check(x, ptr, size) \
184181 ({ \
185
- long __gu_err = -EFAULT, __gu_val = 0; \
186
- const __typeof__(*(ptr)) *__gu_addr = (ptr); \
187
- if (access_ok(VERIFY_READ, __gu_addr, size)) \
188
- __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
189
- (x) = (__force __typeof__(*(ptr)))__gu_val; \
182
+ long __gu_err = -EFAULT; \
183
+ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
184
+ if (access_ok(__gu_addr, size)) \
185
+ __get_user_size((x), __gu_addr, (size), __gu_err); \
186
+ else \
187
+ (x) = (__typeof__(*(ptr)))0; \
190188 __gu_err; \
191189 })
192190
....@@ -200,8 +198,19 @@
200198 case 1: __get_user_asm(x, ptr, retval, 1, "l8ui", __cb); break;\
201199 case 2: __get_user_asm(x, ptr, retval, 2, "l16ui", __cb); break;\
202200 case 4: __get_user_asm(x, ptr, retval, 4, "l32i", __cb); break;\
203
- case 8: retval = __copy_from_user(&x, ptr, 8); break; \
204
- default: (x) = __get_user_bad(); \
201
+ case 8: { \
202
+ u64 __x; \
203
+ if (unlikely(__copy_from_user(&__x, ptr, 8))) { \
204
+ retval = -EFAULT; \
205
+ (x) = (__typeof__(*(ptr)))0; \
206
+ } else { \
207
+ (x) = *(__force __typeof__(*(ptr)) *)&__x; \
208
+ } \
209
+ break; \
210
+ } \
211
+ default: \
212
+ (x) = (__typeof__(*(ptr)))0; \
213
+ __get_user_bad(); \
205214 } \
206215 } while (0)
207216
....@@ -210,26 +219,28 @@
210219 * WARNING: If you modify this macro at all, verify that the
211220 * __check_align_* macros still work.
212221 */
213
-#define __get_user_asm(x, addr, err, align, insn, cb) \
214
-__asm__ __volatile__( \
215
- __check_align_##align \
216
- "1: "insn" %2, %3, 0 \n" \
217
- "2: \n" \
218
- " .section .fixup,\"ax\" \n" \
219
- " .align 4 \n" \
220
- "4: \n" \
221
- " .long 2b \n" \
222
- "5: \n" \
223
- " l32r %1, 4b \n" \
224
- " movi %2, 0 \n" \
225
- " movi %0, %4 \n" \
226
- " jx %1 \n" \
227
- " .previous \n" \
228
- " .section __ex_table,\"a\" \n" \
229
- " .long 1b, 5b \n" \
230
- " .previous" \
231
- :"=r" (err), "=r" (cb), "=r" (x) \
232
- :"r" (addr), "i" (-EFAULT), "0" (err))
222
+#define __get_user_asm(x_, addr_, err_, align, insn, cb) \
223
+do { \
224
+ u32 __x = 0; \
225
+ __asm__ __volatile__( \
226
+ __check_align_##align \
227
+ "1: "insn" %[x], %[mem] \n" \
228
+ "2: \n" \
229
+ " .section .fixup,\"ax\" \n" \
230
+ " .align 4 \n" \
231
+ " .literal_position \n" \
232
+ "5: \n" \
233
+ " movi %[tmp], 2b \n" \
234
+ " movi %[err], %[efault] \n" \
235
+ " jx %[tmp] \n" \
236
+ " .previous \n" \
237
+ " .section __ex_table,\"a\" \n" \
238
+ " .long 1b, 5b \n" \
239
+ " .previous" \
240
+ :[err] "+r"(err_), [tmp] "=r"(cb), [x] "+r"(__x) \
241
+ :[mem] "m"(*(addr_)), [efault] "i"(-EFAULT)); \
242
+ (x_) = (__force __typeof__(*(addr_)))__x; \
243
+} while (0)
233244
234245
235246 /*
....@@ -261,17 +272,17 @@
261272 */
262273
263274 static inline unsigned long
264
-__xtensa_clear_user(void *addr, unsigned long size)
275
+__xtensa_clear_user(void __user *addr, unsigned long size)
265276 {
266
- if (!__memset(addr, 0, size))
277
+ if (!__memset((void __force *)addr, 0, size))
267278 return size;
268279 return 0;
269280 }
270281
271282 static inline unsigned long
272
-clear_user(void *addr, unsigned long size)
283
+clear_user(void __user *addr, unsigned long size)
273284 {
274
- if (access_ok(VERIFY_WRITE, addr, size))
285
+ if (access_ok(addr, size))
275286 return __xtensa_clear_user(addr, size);
276287 return size ? -EFAULT : 0;
277288 }
....@@ -281,12 +292,12 @@
281292
282293 #ifndef CONFIG_GENERIC_STRNCPY_FROM_USER
283294
284
-extern long __strncpy_user(char *, const char *, long);
295
+extern long __strncpy_user(char *dst, const char __user *src, long count);
285296
286297 static inline long
287
-strncpy_from_user(char *dst, const char *src, long count)
298
+strncpy_from_user(char *dst, const char __user *src, long count)
288299 {
289
- if (access_ok(VERIFY_READ, src, 1))
300
+ if (access_ok(src, 1))
290301 return __strncpy_user(dst, src, count);
291302 return -EFAULT;
292303 }
....@@ -297,13 +308,11 @@
297308 /*
298309 * Return the size of a string (including the ending 0!)
299310 */
300
-extern long __strnlen_user(const char *, long);
311
+extern long __strnlen_user(const char __user *str, long len);
301312
302
-static inline long strnlen_user(const char *str, long len)
313
+static inline long strnlen_user(const char __user *str, long len)
303314 {
304
- unsigned long top = __kernel_ok ? ~0UL : TASK_SIZE - 1;
305
-
306
- if ((unsigned long)str > top)
315
+ if (!access_ok(str, 1))
307316 return 0;
308317 return __strnlen_user(str, len);
309318 }