From 9ee8b24c174c32cea23ef7abb72b11fda81193cd Mon Sep 17 00:00:00 2001 From: "David S. Miller" <davem@nuts.ninka.net> Date: Wed, 9 Apr 2003 00:54:35 -0700 Subject: [PATCH] [SPARC]: Cleanup uaccess headers and add __user attributes. --- include/asm-sparc/uaccess.h | 145 +++++++++++++++++----------------- include/asm-sparc64/uaccess.h | 47 +++++------ 2 files changed, 92 insertions(+), 100 deletions(-) diff --git a/include/asm-sparc/uaccess.h b/include/asm-sparc/uaccess.h index 8abd61f88991..4a6a507317f1 100644 --- a/include/asm-sparc/uaccess.h +++ b/include/asm-sparc/uaccess.h @@ -8,6 +8,7 @@ #define _ASM_UACCESS_H #ifdef __KERNEL__ +#include <linux/compiler.h> #include <linux/sched.h> #include <linux/string.h> #include <linux/errno.h> @@ -45,7 +46,7 @@ #define __access_ok(addr,size) (__user_ok((addr) & get_fs().seg,(size))) #define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size)) -extern inline int verify_area(int type, const void * addr, unsigned long size) +static inline int verify_area(int type, const void __user * addr, unsigned long size) { return access_ok(type,addr,size)?0:-EFAULT; } @@ -291,87 +292,87 @@ __asm__ __volatile__( \ extern int __get_user_bad(void); -extern __kernel_size_t __copy_user(void *to, void *from, __kernel_size_t size); - -#define copy_to_user(to,from,n) ({ \ -void *__copy_to = (void *) (to); \ -__kernel_size_t __copy_size = (__kernel_size_t) (n); \ -__kernel_size_t __copy_res; \ -if(__copy_size && __access_ok((unsigned long)__copy_to, __copy_size)) { \ -__copy_res = __copy_user(__copy_to, (void *) (from), __copy_size); \ -} else __copy_res = __copy_size; \ -__copy_res; }) - -#define __copy_to_user(to,from,n) \ - __copy_user((void *)(to), \ - (void *)(from), n) - -#define copy_from_user(to,from,n) ({ \ -void *__copy_to = (void *) (to); \ -void *__copy_from = (void *) (from); \ -__kernel_size_t __copy_size = (__kernel_size_t) (n); \ -__kernel_size_t __copy_res; \ -if(__copy_size && __access_ok((unsigned long)__copy_from, __copy_size)) { \ -__copy_res = __copy_user(__copy_to, __copy_from, __copy_size); \ -} else __copy_res = __copy_size; \ -__copy_res; }) - -#define __copy_from_user(to,from,n) \ - __copy_user((void *)(to), \ - (void *)(from), n) - -extern __inline__ __kernel_size_t __clear_user(void *addr, __kernel_size_t size) +extern unsigned long __copy_user(void *to, void *from, unsigned long size); + +static inline unsigned long copy_to_user(void __user *to, void *from, unsigned long n) { - __kernel_size_t ret; - __asm__ __volatile__ ( - ".section __ex_table,#alloc\n\t" - ".align 4\n\t" - ".word 1f,3\n\t" - ".previous\n\t" - "mov %2, %%o1\n" - "1:\n\t" - "call __bzero\n\t" - " mov %1, %%o0\n\t" - "mov %%o0, %0\n" - : "=r" (ret) : "r" (addr), "r" (size) : - "o0", "o1", "o2", "o3", "o4", "o5", "o7", - "g1", "g2", "g3", "g4", "g5", "g7", "cc"); - return ret; + if (n && __access_ok((unsigned long) to, n)) + return __copy_user((void *) to, from, n); + else + return n; } -#define clear_user(addr,n) ({ \ -void *__clear_addr = (void *) (addr); \ -__kernel_size_t __clear_size = (__kernel_size_t) (n); \ -__kernel_size_t __clear_res; \ -if(__clear_size && __access_ok((unsigned long)__clear_addr, __clear_size)) { \ -__clear_res = __clear_user(__clear_addr, __clear_size); \ -} else __clear_res = __clear_size; \ -__clear_res; }) - -extern int __strncpy_from_user(unsigned long dest, unsigned long src, int count); - -#define strncpy_from_user(dest,src,count) ({ \ -unsigned long __sfu_src = (unsigned long) (src); \ -int __sfu_count = (int) (count); \ -long __sfu_res = -EFAULT; \ -if(__access_ok(__sfu_src, __sfu_count)) { \ -__sfu_res = __strncpy_from_user((unsigned long) (dest), __sfu_src, __sfu_count); \ -} __sfu_res; }) - -extern int __strlen_user(const char *); -extern int __strnlen_user(const char *, long len); - -extern __inline__ int strlen_user(const char *str) +static inline unsigned long __copy_to_user(void __user *to, void *from, unsigned long n) +{ + return __copy_user((void *)to, from, n); +} + +static inline unsigned long copy_from_user(void *to, void __user *from, unsigned long n) +{ + if (n && __access_ok((unsigned long) from, n)) + return __copy_user(to, (void *) from, n); + else + return n; +} + +static inline unsigned long __copy_from_user(void *to, void __user *from, unsigned long n) +{ + return __copy_user(to, (void *)from, n); +} + +static inline unsigned long __clear_user(void __user *addr, unsigned long size) +{ + unsigned long ret; + + __asm__ __volatile__ ( + ".section __ex_table,#alloc\n\t" + ".align 4\n\t" + ".word 1f,3\n\t" + ".previous\n\t" + "mov %2, %%o1\n" + "1:\n\t" + "call __bzero\n\t" + " mov %1, %%o0\n\t" + "mov %%o0, %0\n" + : "=r" (ret) : "r" (addr), "r" (size) : + "o0", "o1", "o2", "o3", "o4", "o5", "o7", + "g1", "g2", "g3", "g4", "g5", "g7", "cc"); + + return ret; +} + +static inline unsigned long clear_user(void __user *addr, unsigned long n) +{ + if (n && __access_ok((unsigned long) addr, n)) { + return __clear_user(addr, n); + else + return n; +} + +extern long __strncpy_from_user(char *dest, const char __user *src, long count); + +static inline long strncpy_from_user(char *dest, const char __user *src, long count) +{ + if (__access_ok((unsigned long) src, count)) + return __strncpy_from_user(dest, src, count); + else + return -EFAULT; +} + +extern long __strlen_user(const char __user *); +extern long __strnlen_user(const char __user *, long len); + +static inline long strlen_user(const char __user *str) { - if(!access_ok(VERIFY_READ, str, 0)) + if (!access_ok(VERIFY_READ, str, 0)) return 0; else return __strlen_user(str); } -extern __inline__ int strnlen_user(const char *str, long len) +static inline long strnlen_user(const char __user *str, long len) { - if(!access_ok(VERIFY_READ, str, 0)) + if (!access_ok(VERIFY_READ, str, 0)) return 0; else return __strnlen_user(str, len); diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h index 62e5e5416e25..e12d46d40588 100644 --- a/include/asm-sparc64/uaccess.h +++ b/include/asm-sparc64/uaccess.h @@ -7,6 +7,7 @@ */ #ifdef __KERNEL__ +#include <linux/compiler.h> #include <linux/sched.h> #include <linux/string.h> #include <asm/a.out.h> @@ -52,7 +53,7 @@ do { \ #define __access_ok(addr,size) 1 #define access_ok(type,addr,size) 1 -static inline int verify_area(int type, const void * addr, unsigned long size) +static inline int verify_area(int type, const void __user * addr, unsigned long size) { return 0; } @@ -249,44 +250,34 @@ __asm__ __volatile__( \ extern int __get_user_bad(void); -extern __kernel_size_t __copy_from_user(void *to, const void *from, - __kernel_size_t size); +extern unsigned long __copy_from_user(void *to, const void __user *from, + unsigned long size); -extern __kernel_size_t __copy_to_user(void *to, const void *from, - __kernel_size_t size); +extern unsigned long __copy_to_user(void __user *to, const void *from, + unsigned long size); -extern __kernel_size_t __copy_in_user(void *to, const void *from, - __kernel_size_t size); +extern unsigned long __copy_in_user(void __user *to, const void __user *from, + unsigned long size); -#define copy_from_user(to,from,n) \ - __copy_from_user((void *)(to), \ - (void *)(from), (__kernel_size_t)(n)) +#define copy_from_user __copy_from_user +#define copy_to_user __copy_to_user +#define copy_in_user __copy_in_user -#define copy_to_user(to,from,n) \ - __copy_to_user((void *)(to), \ - (void *) (from), (__kernel_size_t)(n)) - -#define copy_in_user(to,from,n) \ - __copy_in_user((void *)(to), \ - (void *) (from), (__kernel_size_t)(n)) - -static __inline__ __kernel_size_t __clear_user(void *addr, __kernel_size_t size) +static inline unsigned long __clear_user(void __user *addr, unsigned long size) { - extern __kernel_size_t __bzero_noasi(void *addr, __kernel_size_t size); + extern unsigned long __bzero_noasi(void *addr, unsigned long size); - return __bzero_noasi(addr, size); + return __bzero_noasi((void *) addr, size); } -#define clear_user(addr,n) \ - __clear_user((void *)(addr), (__kernel_size_t)(n)) +#define clear_user __clear_user -extern int __strncpy_from_user(unsigned long dest, unsigned long src, int count); +extern long __strncpy_from_user(char *dest, const char __user *src, long count); -#define strncpy_from_user(dest,src,count) \ - __strncpy_from_user((unsigned long)(dest), (unsigned long)(src), (int)(count)) +#define strncpy_from_user __strncpy_from_user -extern int __strlen_user(const char *); -extern int __strnlen_user(const char *, long len); +extern long __strlen_user(const char __user *); +extern long __strnlen_user(const char __user *, long len); #define strlen_user __strlen_user #define strnlen_user __strnlen_user -- 2.30.9