uaccess.h (4b4193256c8d3bc3a5397b5cd9494c2ad386317d) uaccess.h (12700c17fc286149324f92d6d380bc48e43f253d)
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ALPHA_UACCESS_H
3#define __ALPHA_UACCESS_H
4
5/*
6 * The fs value determines whether argument validity checking should be
7 * performed or not. If get_fs() == USER_DS, checking is performed, with
8 * get_fs() == KERNEL_DS, checking is bypassed.

--- 6 unchanged lines hidden (view full) ---

15 */
16
17#define KERNEL_DS ((mm_segment_t) { 0UL })
18#define USER_DS ((mm_segment_t) { -0x40000000000UL })
19
20#define get_fs() (current_thread_info()->addr_limit)
21#define set_fs(x) (current_thread_info()->addr_limit = (x))
22
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ALPHA_UACCESS_H
3#define __ALPHA_UACCESS_H
4
5/*
6 * The fs value determines whether argument validity checking should be
7 * performed or not. If get_fs() == USER_DS, checking is performed, with
8 * get_fs() == KERNEL_DS, checking is bypassed.

--- 6 unchanged lines hidden (view full) ---

15 */
16
17#define KERNEL_DS ((mm_segment_t) { 0UL })
18#define USER_DS ((mm_segment_t) { -0x40000000000UL })
19
20#define get_fs() (current_thread_info()->addr_limit)
21#define set_fs(x) (current_thread_info()->addr_limit = (x))
22
23#define uaccess_kernel() (get_fs().seg == KERNEL_DS.seg)
23#include <asm-generic/access_ok.h>
24
25/*
24
25/*
26 * Is a address valid? This does a straightforward calculation rather
27 * than tests.
28 *
29 * Address valid if:
30 * - "addr" doesn't have any high-bits set
31 * - AND "size" doesn't have any high-bits set
32 * - AND "addr+size-(size != 0)" doesn't have any high-bits set
33 * - OR we are in kernel mode.
34 */
35#define __access_ok(addr, size) ({ \
36 unsigned long __ao_a = (addr), __ao_b = (size); \
37 unsigned long __ao_end = __ao_a + __ao_b - !!__ao_b; \
38 (get_fs().seg & (__ao_a | __ao_b | __ao_end)) == 0; })
39
40#define access_ok(addr, size) \
41({ \
42 __chk_user_ptr(addr); \
43 __access_ok(((unsigned long)(addr)), (size)); \
44})
45
46/*
47 * These are the main single-value transfer routines. They automatically
48 * use the right size if we just have the right pointer type.
49 *
50 * As the alpha uses the same address space for kernel and user
51 * data, we can just do these as direct assignments. (Of course, the
52 * exception handling means that it's no longer "just"...)
53 *
54 * Careful to not

--- 45 unchanged lines hidden (view full) ---

100 __gu_err; \
101})
102
103#define __get_user_check(x, ptr, size) \
104({ \
105 long __gu_err = -EFAULT; \
106 unsigned long __gu_val = 0; \
107 const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
26 * These are the main single-value transfer routines. They automatically
27 * use the right size if we just have the right pointer type.
28 *
29 * As the alpha uses the same address space for kernel and user
30 * data, we can just do these as direct assignments. (Of course, the
31 * exception handling means that it's no longer "just"...)
32 *
33 * Careful to not

--- 45 unchanged lines hidden (view full) ---

79 __gu_err; \
80})
81
82#define __get_user_check(x, ptr, size) \
83({ \
84 long __gu_err = -EFAULT; \
85 unsigned long __gu_val = 0; \
86 const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
108 if (__access_ok((unsigned long)__gu_addr, size)) { \
87 if (__access_ok(__gu_addr, size)) { \
109 __gu_err = 0; \
110 switch (size) { \
111 case 1: __get_user_8(__gu_addr); break; \
112 case 2: __get_user_16(__gu_addr); break; \
113 case 4: __get_user_32(__gu_addr); break; \
114 case 8: __get_user_64(__gu_addr); break; \
115 default: __get_user_unknown(); break; \
116 } \

--- 78 unchanged lines hidden (view full) ---

195 } \
196 __pu_err; \
197})
198
199#define __put_user_check(x, ptr, size) \
200({ \
201 long __pu_err = -EFAULT; \
202 __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
88 __gu_err = 0; \
89 switch (size) { \
90 case 1: __get_user_8(__gu_addr); break; \
91 case 2: __get_user_16(__gu_addr); break; \
92 case 4: __get_user_32(__gu_addr); break; \
93 case 8: __get_user_64(__gu_addr); break; \
94 default: __get_user_unknown(); break; \
95 } \

--- 78 unchanged lines hidden (view full) ---

174 } \
175 __pu_err; \
176})
177
178#define __put_user_check(x, ptr, size) \
179({ \
180 long __pu_err = -EFAULT; \
181 __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
203 if (__access_ok((unsigned long)__pu_addr, size)) { \
182 if (__access_ok(__pu_addr, size)) { \
204 __pu_err = 0; \
205 switch (size) { \
206 case 1: __put_user_8(x, __pu_addr); break; \
207 case 2: __put_user_16(x, __pu_addr); break; \
208 case 4: __put_user_32(x, __pu_addr); break; \
209 case 8: __put_user_64(x, __pu_addr); break; \
210 default: __put_user_unknown(); break; \
211 } \

--- 99 unchanged lines hidden (view full) ---

311static inline unsigned long
312raw_copy_to_user(void __user *to, const void *from, unsigned long len)
313{
314 return __copy_user((__force void *)to, from, len);
315}
316
317extern long __clear_user(void __user *to, long len);
318
183 __pu_err = 0; \
184 switch (size) { \
185 case 1: __put_user_8(x, __pu_addr); break; \
186 case 2: __put_user_16(x, __pu_addr); break; \
187 case 4: __put_user_32(x, __pu_addr); break; \
188 case 8: __put_user_64(x, __pu_addr); break; \
189 default: __put_user_unknown(); break; \
190 } \

--- 99 unchanged lines hidden (view full) ---

290static inline unsigned long
291raw_copy_to_user(void __user *to, const void *from, unsigned long len)
292{
293 return __copy_user((__force void *)to, from, len);
294}
295
296extern long __clear_user(void __user *to, long len);
297
319extern inline long
298static inline long
320clear_user(void __user *to, long len)
321{
299clear_user(void __user *to, long len)
300{
322 if (__access_ok((unsigned long)to, len))
301 if (__access_ok(to, len))
323 len = __clear_user(to, len);
324 return len;
325}
326
302 len = __clear_user(to, len);
303 return len;
304}
305
327#define user_addr_max() \
328 (uaccess_kernel() ? ~0UL : TASK_SIZE)
329
330extern long strncpy_from_user(char *dest, const char __user *src, long count);
331extern __must_check long strnlen_user(const char __user *str, long n);
332
333#include <asm/extable.h>
334
335#endif /* __ALPHA_UACCESS_H */
306extern long strncpy_from_user(char *dest, const char __user *src, long count);
307extern __must_check long strnlen_user(const char __user *str, long n);
308
309#include <asm/extable.h>
310
311#endif /* __ALPHA_UACCESS_H */