vserver 1.9.5.x5
[linux-2.6.git] / include / asm-arm / uaccess.h
index d013105..abda608 100644 (file)
@@ -68,6 +68,7 @@ static inline void set_fs (mm_segment_t fs)
 /* We use 33-bit arithmetic here... */
 #define __range_ok(addr,size) ({ \
        unsigned long flag, sum; \
+       __chk_user_ptr(addr);   \
        __asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
                : "=&r" (flag), "=&r" (sum) \
                : "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
@@ -107,35 +108,35 @@ extern int __get_user_4(void *);
 extern int __get_user_8(void *);
 extern int __get_user_bad(void);
 
-#define __get_user_x(__r1,__p,__e,__s,__i...)                          \
+#define __get_user_x(__r2,__p,__e,__s,__i...)                          \
           __asm__ __volatile__ (                                       \
-               __asmeq("%0", "r0") __asmeq("%1", "r1")                 \
+               __asmeq("%0", "r0") __asmeq("%1", "r2")                 \
                "bl     __get_user_" #__s                               \
-               : "=&r" (__e), "=r" (__r1)                              \
+               : "=&r" (__e), "=r" (__r2)                              \
                : "0" (__p)                                             \
                : __i, "cc")
 
 #define get_user(x,p)                                                  \
        ({                                                              \
-               const register typeof(*(p)) *__p asm("r0") = (p);       \
-               register typeof(*(p)) __r1 asm("r1");                   \
+               const register typeof(*(p)) __user *__p asm("r0") = (p);\
+               register typeof(*(p)) __r2 asm("r2");                   \
                register int __e asm("r0");                             \
                switch (sizeof(*(__p))) {                               \
                case 1:                                                 \
-                       __get_user_x(__r1, __p, __e, 1, "lr");          \
+                       __get_user_x(__r2, __p, __e, 1, "lr");          \
                        break;                                          \
                case 2:                                                 \
-                       __get_user_x(__r1, __p, __e, 2, "r2", "lr");    \
+                       __get_user_x(__r2, __p, __e, 2, "r3", "lr");    \
                        break;                                          \
                case 4:                                                 \
-                       __get_user_x(__r1, __p, __e, 4, "lr");          \
+                       __get_user_x(__r2, __p, __e, 4, "lr");          \
                        break;                                          \
                case 8:                                                 \
-                       __get_user_x(__r1, __p, __e, 8, "lr");          \
+                       __get_user_x(__r2, __p, __e, 8, "lr");          \
                        break;                                          \
                default: __e = __get_user_bad(); break;                 \
                }                                                       \
-               x = __r1;                                               \
+               x = __r2;                                               \
                __e;                                                    \
        })
 
@@ -156,6 +157,7 @@ extern int __get_user_bad(void);
 do {                                                                   \
        unsigned long __gu_addr = (unsigned long)(ptr);                 \
        unsigned long __gu_val;                                         \
+       __chk_user_ptr(ptr);                                            \
        switch (sizeof(*(ptr))) {                                       \
        case 1: __get_user_asm_byte(__gu_val,__gu_addr,err);    break;  \
        case 2: __get_user_asm_half(__gu_val,__gu_addr,err);    break;  \
@@ -225,31 +227,31 @@ extern int __put_user_4(void *, unsigned int);
 extern int __put_user_8(void *, unsigned long long);
 extern int __put_user_bad(void);
 
-#define __put_user_x(__r1,__p,__e,__s)                                 \
+#define __put_user_x(__r2,__p,__e,__s)                                 \
           __asm__ __volatile__ (                                       \
-               __asmeq("%0", "r0") __asmeq("%2", "r1")                 \
+               __asmeq("%0", "r0") __asmeq("%2", "r2")                 \
                "bl     __put_user_" #__s                               \
                : "=&r" (__e)                                           \
-               : "0" (__p), "r" (__r1)                                 \
+               : "0" (__p), "r" (__r2)                                 \
                : "ip", "lr", "cc")
 
 #define put_user(x,p)                                                  \
        ({                                                              \
-               const register typeof(*(p)) __r1 asm("r1") = (x);       \
-               const register typeof(*(p)) *__p asm("r0") = (p);       \
+               const register typeof(*(p)) __r2 asm("r2") = (x);       \
+               const register typeof(*(p)) __user *__p asm("r0") = (p);\
                register int __e asm("r0");                             \
                switch (sizeof(*(__p))) {                               \
                case 1:                                                 \
-                       __put_user_x(__r1, __p, __e, 1);                \
+                       __put_user_x(__r2, __p, __e, 1);                \
                        break;                                          \
                case 2:                                                 \
-                       __put_user_x(__r1, __p, __e, 2);                \
+                       __put_user_x(__r2, __p, __e, 2);                \
                        break;                                          \
                case 4:                                                 \
-                       __put_user_x(__r1, __p, __e, 4);                \
+                       __put_user_x(__r2, __p, __e, 4);                \
                        break;                                          \
                case 8:                                                 \
-                       __put_user_x(__r1, __p, __e, 8);                \
+                       __put_user_x(__r2, __p, __e, 8);                \
                        break;                                          \
                default: __e = __put_user_bad(); break;                 \
                }                                                       \
@@ -273,6 +275,7 @@ extern int __put_user_bad(void);
 do {                                                                   \
        unsigned long __pu_addr = (unsigned long)(ptr);                 \
        __typeof__(*(ptr)) __pu_val = (x);                              \
+       __chk_user_ptr(ptr);                                            \
        switch (sizeof(*(ptr))) {                                       \
        case 1: __put_user_asm_byte(__pu_val,__pu_addr,err);    break;  \
        case 2: __put_user_asm_half(__pu_val,__pu_addr,err);    break;  \
@@ -391,6 +394,9 @@ static inline unsigned long __copy_to_user(void __user *to, const void *from, un
        return __arch_copy_to_user(to, from, n);
 }
 
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
+
 static inline unsigned long clear_user (void __user *to, unsigned long n)
 {
        if (access_ok(VERIFY_WRITE, to, n))