Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | #ifndef UACCESS_H |
3 | #define UACCESS_H |
4 | |
5 | #include <linux/compiler.h> |
6 | |
7 | extern void *__user_addr_min, *__user_addr_max; |
8 | |
9 | #define put_user(x, ptr) \ |
10 | ({ \ |
11 | typeof(ptr) __pu_ptr = (ptr); \ |
12 | __chk_user_ptr(__pu_ptr); \ |
13 | WRITE_ONCE(*(__pu_ptr), x); \ |
14 | 0; \ |
15 | }) |
16 | |
17 | #define get_user(x, ptr) \ |
18 | ({ \ |
19 | typeof(ptr) __pu_ptr = (ptr); \ |
20 | __chk_user_ptr(__pu_ptr); \ |
21 | x = READ_ONCE(*(__pu_ptr)); \ |
22 | 0; \ |
23 | }) |
24 | |
25 | static void volatile_memcpy(volatile char *to, const volatile char *from, |
26 | unsigned long n) |
27 | { |
28 | while (n--) |
29 | *(to++) = *(from++); |
30 | } |
31 | |
32 | static inline int copy_from_user(void *to, const void __user volatile *from, |
33 | unsigned long n) |
34 | { |
35 | volatile_memcpy(to, from, n); |
36 | return 0; |
37 | } |
38 | |
39 | static inline int copy_to_user(void __user volatile *to, const void *from, |
40 | unsigned long n) |
41 | { |
42 | volatile_memcpy(to, from, n); |
43 | return 0; |
44 | } |
45 | #endif /* UACCESS_H */ |
46 |
Warning: This file is not a C or C++ file. It does not have highlighting.