1#ifndef __LINUX_UACCESS_H__
2#define __LINUX_UACCESS_H__
3
4#include <linux/sched.h>
5#include <asm/uaccess.h>
6
7static __always_inline void pagefault_disabled_inc(void)
8{
9 current->pagefault_disabled++;
10}
11
12static __always_inline void pagefault_disabled_dec(void)
13{
14 current->pagefault_disabled--;
15 WARN_ON(current->pagefault_disabled < 0);
16}
17
18
19
20
21
22
23
24
25static inline void pagefault_disable(void)
26{
27 pagefault_disabled_inc();
28
29
30
31
32 barrier();
33}
34
35static inline void pagefault_enable(void)
36{
37
38
39
40
41 barrier();
42 pagefault_disabled_dec();
43}
44
45
46
47
48#define pagefault_disabled() (current->pagefault_disabled != 0)
49
50
51
52
53
54
55
56
57
58
59
60#define faulthandler_disabled() (pagefault_disabled() || in_atomic())
61
62#ifndef ARCH_HAS_NOCACHE_UACCESS
63
64static inline unsigned long __copy_from_user_inatomic_nocache(void *to,
65 const void __user *from, unsigned long n)
66{
67 return __copy_from_user_inatomic(to, from, n);
68}
69
70static inline unsigned long __copy_from_user_nocache(void *to,
71 const void __user *from, unsigned long n)
72{
73 return __copy_from_user(to, from, n);
74}
75
76#endif
77
78
79
80
81
82
83
84
85
86
87extern long probe_kernel_read(void *dst, const void *src, size_t size);
88extern long __probe_kernel_read(void *dst, const void *src, size_t size);
89
90
91
92
93
94
95
96
97
98
99extern long notrace probe_kernel_write(void *dst, const void *src, size_t size);
100extern long notrace __probe_kernel_write(void *dst, const void *src, size_t size);
101
102extern long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count);
103
104
105
106
107
108
109
110
111#define probe_kernel_address(addr, retval) \
112 probe_kernel_read(&retval, addr, sizeof(retval))
113
114#ifndef user_access_begin
115#define user_access_begin() do { } while (0)
116#define user_access_end() do { } while (0)
117#define unsafe_get_user(x, ptr, err) do { if (unlikely(__get_user(x, ptr))) goto err; } while (0)
118#define unsafe_put_user(x, ptr, err) do { if (unlikely(__put_user(x, ptr))) goto err; } while (0)
119#endif
120
121#endif
122