Merge tag 'powerpc-5.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[sfrench/cifs-2.6.git] / arch / powerpc / include / asm / uaccess.h
index 20a35373cafca3430657b5fb66d27af297ff9c52..604d705f1bb89fc76860098b1c3aa89728b5d8e5 100644 (file)
@@ -151,52 +151,16 @@ static inline int __access_ok(unsigned long addr, unsigned long size,
 
 extern long __put_user_bad(void);
 
-/*
- * We don't tell gcc that we are accessing memory, but this is OK
- * because we do not write to any memory gcc knows about, so there
- * are no aliasing issues.
- */
-#define __put_user_asm(x, addr, err, op)                       \
-       __asm__ __volatile__(                                   \
-               "1:     " op " %1,0(%2) # put_user\n"           \
-               "2:\n"                                          \
-               ".section .fixup,\"ax\"\n"                      \
-               "3:     li %0,%3\n"                             \
-               "       b 2b\n"                                 \
-               ".previous\n"                                   \
-               EX_TABLE(1b, 3b)                                \
-               : "=r" (err)                                    \
-               : "r" (x), "b" (addr), "i" (-EFAULT), "0" (err))
-
-#ifdef __powerpc64__
-#define __put_user_asm2(x, ptr, retval)                                \
-         __put_user_asm(x, ptr, retval, "std")
-#else /* __powerpc64__ */
-#define __put_user_asm2(x, addr, err)                          \
-       __asm__ __volatile__(                                   \
-               "1:     stw %1,0(%2)\n"                         \
-               "2:     stw %1+1,4(%2)\n"                       \
-               "3:\n"                                          \
-               ".section .fixup,\"ax\"\n"                      \
-               "4:     li %0,%3\n"                             \
-               "       b 3b\n"                                 \
-               ".previous\n"                                   \
-               EX_TABLE(1b, 4b)                                \
-               EX_TABLE(2b, 4b)                                \
-               : "=r" (err)                                    \
-               : "r" (x), "b" (addr), "i" (-EFAULT), "0" (err))
-#endif /* __powerpc64__ */
-
 #define __put_user_size_allowed(x, ptr, size, retval)          \
 do {                                                           \
+       __label__ __pu_failed;                                  \
+                                                               \
        retval = 0;                                             \
-       switch (size) {                                         \
-         case 1: __put_user_asm(x, ptr, retval, "stb"); break; \
-         case 2: __put_user_asm(x, ptr, retval, "sth"); break; \
-         case 4: __put_user_asm(x, ptr, retval, "stw"); break; \
-         case 8: __put_user_asm2(x, ptr, retval); break;       \
-         default: __put_user_bad();                            \
-       }                                                       \
+       __put_user_size_goto(x, ptr, size, __pu_failed);        \
+       break;                                                  \
+                                                               \
+__pu_failed:                                                   \
+       retval = -EFAULT;                                       \
 } while (0)
 
 #define __put_user_size(x, ptr, size, retval)                  \
@@ -249,12 +213,17 @@ do {                                                              \
 })
 
 
+/*
+ * We don't tell gcc that we are accessing memory, but this is OK
+ * because we do not write to any memory gcc knows about, so there
+ * are no aliasing issues.
+ */
 #define __put_user_asm_goto(x, addr, label, op)                        \
        asm volatile goto(                                      \
                "1:     " op "%U1%X1 %0,%1      # put_user\n"   \
                EX_TABLE(1b, %l2)                               \
                :                                               \
-               : "r" (x), "m" (*addr)                          \
+               : "r" (x), "m<>" (*addr)                                \
                :                                               \
                : label)
 
@@ -316,7 +285,7 @@ extern long __get_user_bad(void);
 
 #define __get_user_asm(x, addr, err, op)               \
        __asm__ __volatile__(                           \
-               "1:     "op" %1,0(%2)   # get_user\n"   \
+               "1:     "op"%U2%X2 %1, %2       # get_user\n"   \
                "2:\n"                                  \
                ".section .fixup,\"ax\"\n"              \
                "3:     li %0,%3\n"                     \
@@ -325,7 +294,7 @@ extern long __get_user_bad(void);
                ".previous\n"                           \
                EX_TABLE(1b, 3b)                        \
                : "=r" (err), "=r" (x)                  \
-               : "b" (addr), "i" (-EFAULT), "0" (err))
+               : "m<>" (*addr), "i" (-EFAULT), "0" (err))
 
 #ifdef __powerpc64__
 #define __get_user_asm2(x, addr, err)                  \
@@ -333,8 +302,8 @@ extern long __get_user_bad(void);
 #else /* __powerpc64__ */
 #define __get_user_asm2(x, addr, err)                  \
        __asm__ __volatile__(                           \
-               "1:     lwz %1,0(%2)\n"                 \
-               "2:     lwz %1+1,4(%2)\n"               \
+               "1:     lwz%X2 %1, %2\n"                        \
+               "2:     lwz%X2 %L1, %L2\n"              \
                "3:\n"                                  \
                ".section .fixup,\"ax\"\n"              \
                "4:     li %0,%3\n"                     \
@@ -345,7 +314,7 @@ extern long __get_user_bad(void);
                EX_TABLE(1b, 4b)                        \
                EX_TABLE(2b, 4b)                        \
                : "=r" (err), "=&r" (x)                 \
-               : "b" (addr), "i" (-EFAULT), "0" (err))
+               : "m" (*addr), "i" (-EFAULT), "0" (err))
 #endif /* __powerpc64__ */
 
 #define __get_user_size_allowed(x, ptr, size, retval)          \
@@ -355,10 +324,10 @@ do {                                                              \
        if (size > sizeof(x))                                   \
                (x) = __get_user_bad();                         \
        switch (size) {                                         \
-       case 1: __get_user_asm(x, ptr, retval, "lbz"); break;   \
-       case 2: __get_user_asm(x, ptr, retval, "lhz"); break;   \
-       case 4: __get_user_asm(x, ptr, retval, "lwz"); break;   \
-       case 8: __get_user_asm2(x, ptr, retval);  break;        \
+       case 1: __get_user_asm(x, (u8 __user *)ptr, retval, "lbz"); break;      \
+       case 2: __get_user_asm(x, (u16 __user *)ptr, retval, "lhz"); break;     \
+       case 4: __get_user_asm(x, (u32 __user *)ptr, retval, "lwz"); break;     \
+       case 8: __get_user_asm2(x, (u64 __user *)ptr, retval);  break;  \
        default: (x) = __get_user_bad();                        \
        }                                                       \
 } while (0)