1 #ifndef _ASM_X86_UACCESS_32_H
2 #define _ASM_X86_UACCESS_32_H
5 * User space memory access functions
7 #include <linux/string.h>
11 unsigned long __must_check __copy_to_user_ll
12 (void __user *to, const void *from, unsigned long n);
13 unsigned long __must_check __copy_from_user_ll
14 (void *to, const void __user *from, unsigned long n);
15 unsigned long __must_check __copy_from_user_ll_nozero
16 (void *to, const void __user *from, unsigned long n);
17 unsigned long __must_check __copy_from_user_ll_nocache
18 (void *to, const void __user *from, unsigned long n);
19 unsigned long __must_check __copy_from_user_ll_nocache_nozero
20 (void *to, const void __user *from, unsigned long n);
23 * __copy_to_user_inatomic: - Copy a block of data into user space, with less checking.
24 * @to: Destination address, in user space.
25 * @from: Source address, in kernel space.
26 * @n: Number of bytes to copy.
28 * Context: User context only.
30 * Copy data from kernel space to user space. Caller must check
31 * the specified block with access_ok() before calling this function.
32 * The caller should also make sure he pins the user space address
33 * so that we don't result in page fault and sleep.
35 static __always_inline unsigned long __must_check
36 __copy_to_user_inatomic(void __user *to, const void *from, unsigned long n)
38 check_object_size(from, n, true);
39 return __copy_to_user_ll(to, from, n);
43 * __copy_to_user: - Copy a block of data into user space, with less checking.
44 * @to: Destination address, in user space.
45 * @from: Source address, in kernel space.
46 * @n: Number of bytes to copy.
48 * Context: User context only. This function may sleep if pagefaults are
51 * Copy data from kernel space to user space. Caller must check
52 * the specified block with access_ok() before calling this function.
54 * Returns number of bytes that could not be copied.
55 * On success, this will be zero.
57 static __always_inline unsigned long __must_check
58 __copy_to_user(void __user *to, const void *from, unsigned long n)
61 return __copy_to_user_inatomic(to, from, n);
64 static __always_inline unsigned long
65 __copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
67 return __copy_from_user_ll_nozero(to, from, n);
71 * __copy_from_user: - Copy a block of data from user space, with less checking.
72 * @to: Destination address, in kernel space.
73 * @from: Source address, in user space.
74 * @n: Number of bytes to copy.
76 * Context: User context only. This function may sleep if pagefaults are
79 * Copy data from user space to kernel space. Caller must check
80 * the specified block with access_ok() before calling this function.
82 * Returns number of bytes that could not be copied.
83 * On success, this will be zero.
85 * If some data could not be copied, this function will pad the copied
86 * data to the requested size using zero bytes.
88 * An alternate version - __copy_from_user_inatomic() - may be called from
89 * atomic context and will fail rather than sleep. In this case the
90 * uncopied bytes will *NOT* be padded with zeros. See fs/filemap.h
91 * for explanation of why this is needed.
93 static __always_inline unsigned long
94 __copy_from_user(void *to, const void __user *from, unsigned long n)
97 check_object_size(to, n, false);
98 if (__builtin_constant_p(n)) {
104 __get_user_size(*(u8 *)to, from, 1, ret, 1);
109 __get_user_size(*(u16 *)to, from, 2, ret, 2);
114 __get_user_size(*(u32 *)to, from, 4, ret, 4);
119 return __copy_from_user_ll(to, from, n);
122 static __always_inline unsigned long __copy_from_user_nocache(void *to,
123 const void __user *from, unsigned long n)
126 if (__builtin_constant_p(n)) {
132 __get_user_size(*(u8 *)to, from, 1, ret, 1);
137 __get_user_size(*(u16 *)to, from, 2, ret, 2);
142 __get_user_size(*(u32 *)to, from, 4, ret, 4);
147 return __copy_from_user_ll_nocache(to, from, n);
150 static __always_inline unsigned long
151 __copy_from_user_inatomic_nocache(void *to, const void __user *from,
154 return __copy_from_user_ll_nocache_nozero(to, from, n);
157 #endif /* _ASM_X86_UACCESS_32_H */