vserver 1.9.5.x5
[linux-2.6.git] / include / asm-ppc64 / uaccess.h
index 0a031ab..e5cdda1 100644 (file)
@@ -54,7 +54,7 @@
        (((segment).seg & (addr | size )) == 0)
 
 #define access_ok(type,addr,size) \
-       __access_ok(((unsigned long)(addr)),(size),get_fs())
+       __access_ok(((__force unsigned long)(addr)),(size),get_fs())
 
 static inline int verify_area(int type, const void __user *addr, unsigned long size)
 {
@@ -111,11 +111,15 @@ extern unsigned long search_exception_table(unsigned long);
 #define __put_user(x,ptr) \
   __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
 
+#define __get_user_unaligned __get_user
+#define __put_user_unaligned __put_user
+
 extern long __put_user_bad(void);
 
 #define __put_user_nocheck(x,ptr,size)                         \
 ({                                                             \
        long __pu_err;                                          \
+       __chk_user_ptr(ptr);                                    \
        __put_user_size((x),(ptr),(size),__pu_err,-EFAULT);     \
        __pu_err;                                               \
 })
@@ -123,7 +127,7 @@ extern long __put_user_bad(void);
 #define __put_user_check(x,ptr,size)                                   \
 ({                                                                     \
        long __pu_err = -EFAULT;                                        \
-       __typeof__(*(ptr)) *__pu_addr = (ptr);                          \
+       void __user *__pu_addr = (ptr);                                 \
        if (access_ok(VERIFY_WRITE,__pu_addr,size))                     \
                __put_user_size((x),__pu_addr,(size),__pu_err,-EFAULT); \
        __pu_err;                                                       \
@@ -174,7 +178,7 @@ do {                                                                        \
 #define __get_user_check(x,ptr,size)                                   \
 ({                                                                     \
        long __gu_err = -EFAULT, __gu_val = 0;                          \
-       const __typeof__(*(ptr)) *__gu_addr = (ptr);                    \
+       const __typeof__(*(ptr)) __user *__gu_addr = (ptr);             \
        if (access_ok(VERIFY_READ,__gu_addr,size))                      \
                __get_user_size(__gu_val,__gu_addr,(size),__gu_err,-EFAULT);\
        (x) = (__typeof__(*(ptr)))__gu_val;                             \
@@ -187,6 +191,7 @@ extern long __get_user_bad(void);
 do {                                                                   \
        might_sleep();                                                  \
        retval = 0;                                                     \
+       __chk_user_ptr(ptr);                                            \
        switch (size) {                                                 \
          case 1: __get_user_asm(x,ptr,retval,"lbz",errret); break;     \
          case 2: __get_user_asm(x,ptr,retval,"lhz",errret); break;     \
@@ -239,7 +244,7 @@ __copy_from_user(void *to, const void __user *from, unsigned long n)
                        return ret;
                }
        }
-       return __copy_tofrom_user((void __user *) to, from, n);
+       return __copy_tofrom_user((__force void __user *) to, from, n);
 }
 
 static inline unsigned long
@@ -264,42 +269,24 @@ __copy_to_user(void __user *to, const void *from, unsigned long n)
                        return ret;
                }
        }
-       return __copy_tofrom_user(to, (const void __user *) from, n);
+       return __copy_tofrom_user(to, (__force const void __user *) from, n);
 }
 
 #define __copy_in_user(to, from, size) \
        __copy_tofrom_user((to), (from), (size))
 
-static inline unsigned long
-copy_from_user(void *to, const void __user *from, unsigned long n)
-{
-       if (likely(access_ok(VERIFY_READ, from, n)))
-               n = __copy_from_user(to, from, n);
-       else
-               memset(to, 0, n);
-       return n;
-}
-
-static inline unsigned long
-copy_to_user(void __user *to, const void *from, unsigned long n)
-{
-       if (likely(access_ok(VERIFY_WRITE, to, n)))
-               n = __copy_to_user(to, from, n);
-       return n;
-}
-
-static inline unsigned long
-copy_in_user(void __user *to, const void __user *from, unsigned long n)
-{
-       might_sleep();
-       if (likely(access_ok(VERIFY_READ, from, n) &&
-           access_ok(VERIFY_WRITE, to, n)))
-               n =__copy_tofrom_user(to, from, n);
-       return n;
-}
+extern unsigned long copy_from_user(void *to, const void __user *from,
+                                   unsigned long n);
+extern unsigned long copy_to_user(void __user *to, const void *from,
+                                 unsigned long n);
+extern unsigned long copy_in_user(void __user *to, const void __user *from,
+                                 unsigned long n);
 
 extern unsigned long __clear_user(void __user *addr, unsigned long size);
 
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
+
 static inline unsigned long
 clear_user(void __user *addr, unsigned long size)
 {