hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/openrisc/include/asm/uaccess.h
....@@ -1,3 +1,4 @@
1
+/* SPDX-License-Identifier: GPL-2.0-or-later */
12 /*
23 * OpenRISC Linux
34 *
....@@ -9,11 +10,6 @@
910 * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
1011 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
1112 * et al.
12
- *
13
- * This program is free software; you can redistribute it and/or modify
14
- * it under the terms of the GNU General Public License as published by
15
- * the Free Software Foundation; either version 2 of the License, or
16
- * (at your option) any later version.
1713 */
1814
1915 #ifndef __ASM_OPENRISC_UACCESS_H
....@@ -42,27 +38,27 @@
4238 */
4339
4440 #define KERNEL_DS (~0UL)
45
-#define get_ds() (KERNEL_DS)
4641
4742 #define USER_DS (TASK_SIZE)
4843 #define get_fs() (current_thread_info()->addr_limit)
4944 #define set_fs(x) (current_thread_info()->addr_limit = (x))
5045
51
-#define segment_eq(a, b) ((a) == (b))
46
+#define uaccess_kernel() (get_fs() == KERNEL_DS)
5247
5348 /* Ensure that the range from addr to addr+size is all within the process'
5449 * address space
5550 */
56
-#define __range_ok(addr, size) (size <= get_fs() && addr <= (get_fs()-size))
51
+static inline int __range_ok(unsigned long addr, unsigned long size)
52
+{
53
+ const mm_segment_t fs = get_fs();
5754
58
-/* Ensure that addr is below task's addr_limit */
59
-#define __addr_ok(addr) ((unsigned long) addr < get_fs())
55
+ return size <= fs && addr <= (fs - size);
56
+}
6057
61
-#define access_ok(type, addr, size) \
58
+#define access_ok(addr, size) \
6259 ({ \
63
- unsigned long __ao_addr = (unsigned long)(addr); \
64
- unsigned long __ao_size = (unsigned long)(size); \
65
- __range_ok(__ao_addr, __ao_size); \
60
+ __chk_user_ptr(addr); \
61
+ __range_ok((unsigned long)(addr), (size)); \
6662 })
6763
6864 /*
....@@ -105,8 +101,8 @@
105101 #define __put_user_check(x, ptr, size) \
106102 ({ \
107103 long __pu_err = -EFAULT; \
108
- __typeof__(*(ptr)) *__pu_addr = (ptr); \
109
- if (access_ok(VERIFY_WRITE, __pu_addr, size)) \
104
+ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
105
+ if (access_ok(__pu_addr, size)) \
110106 __put_user_size((x), __pu_addr, (size), __pu_err); \
111107 __pu_err; \
112108 })
....@@ -169,19 +165,19 @@
169165
170166 #define __get_user_nocheck(x, ptr, size) \
171167 ({ \
172
- long __gu_err, __gu_val; \
173
- __get_user_size(__gu_val, (ptr), (size), __gu_err); \
174
- (x) = (__force __typeof__(*(ptr)))__gu_val; \
168
+ long __gu_err; \
169
+ __get_user_size((x), (ptr), (size), __gu_err); \
175170 __gu_err; \
176171 })
177172
178173 #define __get_user_check(x, ptr, size) \
179174 ({ \
180
- long __gu_err = -EFAULT, __gu_val = 0; \
181
- const __typeof__(*(ptr)) * __gu_addr = (ptr); \
182
- if (access_ok(VERIFY_READ, __gu_addr, size)) \
183
- __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
184
- (x) = (__force __typeof__(*(ptr)))__gu_val; \
175
+ long __gu_err = -EFAULT; \
176
+ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
177
+ if (access_ok(__gu_addr, size)) \
178
+ __get_user_size((x), __gu_addr, (size), __gu_err); \
179
+ else \
180
+ (x) = (__typeof__(*(ptr))) 0; \
185181 __gu_err; \
186182 })
187183
....@@ -195,11 +191,13 @@
195191 case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \
196192 case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \
197193 case 8: __get_user_asm2(x, ptr, retval); break; \
198
- default: (x) = __get_user_bad(); \
194
+ default: (x) = (__typeof__(*(ptr)))__get_user_bad(); \
199195 } \
200196 } while (0)
201197
202198 #define __get_user_asm(x, addr, err, op) \
199
+{ \
200
+ unsigned long __gu_tmp; \
203201 __asm__ __volatile__( \
204202 "1: "op" %1,0(%2)\n" \
205203 "2:\n" \
....@@ -213,10 +211,14 @@
213211 " .align 2\n" \
214212 " .long 1b,3b\n" \
215213 ".previous" \
216
- : "=r"(err), "=r"(x) \
217
- : "r"(addr), "i"(-EFAULT), "0"(err))
214
+ : "=r"(err), "=r"(__gu_tmp) \
215
+ : "r"(addr), "i"(-EFAULT), "0"(err)); \
216
+ (x) = (__typeof__(*(addr)))__gu_tmp; \
217
+}
218218
219219 #define __get_user_asm2(x, addr, err) \
220
+{ \
221
+ unsigned long long __gu_tmp; \
220222 __asm__ __volatile__( \
221223 "1: l.lwz %1,0(%2)\n" \
222224 "2: l.lwz %H1,4(%2)\n" \
....@@ -233,8 +235,11 @@
233235 " .long 1b,4b\n" \
234236 " .long 2b,4b\n" \
235237 ".previous" \
236
- : "=r"(err), "=&r"(x) \
237
- : "r"(addr), "i"(-EFAULT), "0"(err))
238
+ : "=r"(err), "=&r"(__gu_tmp) \
239
+ : "r"(addr), "i"(-EFAULT), "0"(err)); \
240
+ (x) = (__typeof__(*(addr)))( \
241
+ (__typeof__((x)-(x)))__gu_tmp); \
242
+}
238243
239244 /* more complex routines */
240245
....@@ -246,19 +251,19 @@
246251 return __copy_tofrom_user(to, (__force const void *)from, size);
247252 }
248253 static inline unsigned long
249
-raw_copy_to_user(void *to, const void __user *from, unsigned long size)
254
+raw_copy_to_user(void __user *to, const void *from, unsigned long size)
250255 {
251256 return __copy_tofrom_user((__force void *)to, from, size);
252257 }
253258 #define INLINE_COPY_FROM_USER
254259 #define INLINE_COPY_TO_USER
255260
256
-extern unsigned long __clear_user(void *addr, unsigned long size);
261
+extern unsigned long __clear_user(void __user *addr, unsigned long size);
257262
258263 static inline __must_check unsigned long
259
-clear_user(void *addr, unsigned long size)
264
+clear_user(void __user *addr, unsigned long size)
260265 {
261
- if (likely(access_ok(VERIFY_WRITE, addr, size)))
266
+ if (likely(access_ok(addr, size)))
262267 size = __clear_user(addr, size);
263268 return size;
264269 }