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 */ |