summaryrefslogtreecommitdiffstats
path: root/arch/alpha
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-03-21 08:13:02 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-03-28 18:23:19 -0400
commitec022681a4201006a5bcb1a01401591a326b659c (patch)
tree18f8f80fca5bc62140dcdf41b4af184987d7e040 /arch/alpha
parentca282f69738161ca1ac2e13b2c1b283be82ffb4b (diff)
alpha: switch to RAW_COPY_USER
copy_{to,from}_user() uninlined. We can go back to inlined variants, if we want to... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/alpha')
-rw-r--r--arch/alpha/Kconfig1
-rw-r--r--arch/alpha/include/asm/uaccess.h33
2 files changed, 7 insertions, 27 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig
index 0e49d39ea74a..1be5f61dc630 100644
--- a/arch/alpha/Kconfig
+++ b/arch/alpha/Kconfig
@@ -26,6 +26,7 @@ config ALPHA
26 select ODD_RT_SIGACTION 26 select ODD_RT_SIGACTION
27 select OLD_SIGSUSPEND 27 select OLD_SIGSUSPEND
28 select CPU_NO_EFFICIENT_FFS if !ALPHA_EV67 28 select CPU_NO_EFFICIENT_FFS if !ALPHA_EV67
29 select ARCH_HAS_RAW_COPY_USER
29 help 30 help
30 The Alpha is a 64-bit general-purpose processor designed and 31 The Alpha is a 64-bit general-purpose processor designed and
31 marketed by the Digital Equipment Corporation of blessed memory, 32 marketed by the Digital Equipment Corporation of blessed memory,
diff --git a/arch/alpha/include/asm/uaccess.h b/arch/alpha/include/asm/uaccess.h
index 9557c12823a9..7b82dc9a8556 100644
--- a/arch/alpha/include/asm/uaccess.h
+++ b/arch/alpha/include/asm/uaccess.h
@@ -300,37 +300,16 @@ __asm__ __volatile__("1: stb %r2,%1\n" \
300 300
301extern long __copy_user(void *to, const void *from, long len); 301extern long __copy_user(void *to, const void *from, long len);
302 302
303#define __copy_to_user(to, from, n) \ 303static inline unsigned long
304({ \ 304raw_copy_from_user(void *to, const void __user *from, unsigned long len)
305 __chk_user_ptr(to); \
306 __copy_user((__force void *)(to), (from), (n)); \
307})
308#define __copy_from_user(to, from, n) \
309({ \
310 __chk_user_ptr(from); \
311 __copy_user((to), (__force void *)(from), (n)); \
312})
313
314#define __copy_to_user_inatomic __copy_to_user
315#define __copy_from_user_inatomic __copy_from_user
316
317extern inline long
318copy_to_user(void __user *to, const void *from, long n)
319{ 305{
320 if (likely(__access_ok((unsigned long)to, n))) 306 return __copy_user(to, (__force const void *)from, len);
321 n = __copy_user((__force void *)to, from, n);
322 return n;
323} 307}
324 308
325extern inline long 309static inline unsigned long
326copy_from_user(void *to, const void __user *from, long n) 310raw_copy_to_user(void __user *to, const void *from, unsigned long len)
327{ 311{
328 long res = n; 312 return __copy_user((__force void *)to, from, len);
329 if (likely(__access_ok((unsigned long)from, n)))
330 res = __copy_from_user_inatomic(to, from, n);
331 if (unlikely(res))
332 memset(to + (n - res), 0, res);
333 return res;
334} 313}
335 314
336extern long __clear_user(void __user *to, long len); 315extern long __clear_user(void __user *to, long len);