aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2013-01-18 04:42:16 -0500
committerVineet Gupta <vgupta@synopsys.com>2013-02-11 09:30:32 -0500
commit05d88a493746819821733e07bed918a6e09f735b (patch)
tree59f1a8d8e291e62507b3b221240ee9b926e14ce7 /include
parent43697cb0973da144156e7d11ddd035aee226ee30 (diff)
asm-generic: uaccess: Allow arches to over-ride __{get,put}_user_fn()
As of now these default to calling the arch provided __copy_{to,from}_user() routines which being general purpose (w.r.t buffer alignment and lengths) would lead to alignment checks in generated code (for arches which don't support unaligned load/stores). Given that in this case we already know that data involved is "unit" sized and aligned, using the vanilla copy backend is a bit wasteful. This change thus allows arches to over-ride the aforementioned routines. Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'include')
-rw-r--r--include/asm-generic/uaccess.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
index 5f6ee6138f9a..c184aa8ec8cd 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess.h
@@ -169,12 +169,18 @@ static inline __must_check long __copy_to_user(void __user *to,
169 -EFAULT; \ 169 -EFAULT; \
170}) 170})
171 171
172#ifndef __put_user_fn
173
172static inline int __put_user_fn(size_t size, void __user *ptr, void *x) 174static inline int __put_user_fn(size_t size, void __user *ptr, void *x)
173{ 175{
174 size = __copy_to_user(ptr, x, size); 176 size = __copy_to_user(ptr, x, size);
175 return size ? -EFAULT : size; 177 return size ? -EFAULT : size;
176} 178}
177 179
180#define __put_user_fn(sz, u, k) __put_user_fn(sz, u, k)
181
182#endif
183
178extern int __put_user_bad(void) __attribute__((noreturn)); 184extern int __put_user_bad(void) __attribute__((noreturn));
179 185
180#define __get_user(x, ptr) \ 186#define __get_user(x, ptr) \
@@ -225,12 +231,17 @@ extern int __put_user_bad(void) __attribute__((noreturn));
225 -EFAULT; \ 231 -EFAULT; \
226}) 232})
227 233
234#ifndef __get_user_fn
228static inline int __get_user_fn(size_t size, const void __user *ptr, void *x) 235static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
229{ 236{
230 size = __copy_from_user(x, ptr, size); 237 size = __copy_from_user(x, ptr, size);
231 return size ? -EFAULT : size; 238 return size ? -EFAULT : size;
232} 239}
233 240
241#define __get_user_fn(sz, u, k) __get_user_fn(sz, u, k)
242
243#endif
244
234extern int __get_user_bad(void) __attribute__((noreturn)); 245extern int __get_user_bad(void) __attribute__((noreturn));
235 246
236#ifndef __copy_from_user_inatomic 247#ifndef __copy_from_user_inatomic