alpha: add a helper for emitting exception table entries
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 7 Mar 2017 09:08:46 +0000 (04:08 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 28 Mar 2017 22:23:19 +0000 (18:23 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/include/asm/futex.h
arch/alpha/include/asm/uaccess.h
arch/alpha/kernel/traps.c
arch/alpha/lib/csum_partial_copy.c

index f939794..fb01dfb 100644 (file)
        "3:     .subsection 2\n"                                \
        "4:     br      1b\n"                                   \
        "       .previous\n"                                    \
-       "       .section __ex_table,\"a\"\n"                    \
-       "       .long   1b-.\n"                                 \
-       "       lda     $31,3b-1b(%1)\n"                        \
-       "       .long   2b-.\n"                                 \
-       "       lda     $31,3b-2b(%1)\n"                        \
-       "       .previous\n"                                    \
+       EXC(1b,3b,%1,$31)                                       \
+       EXC(2b,3b,%1,$31)                                       \
        :       "=&r" (oldval), "=&r"(ret)                      \
        :       "r" (uaddr), "r"(oparg)                         \
        :       "memory")
@@ -101,12 +97,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        "3:     .subsection 2\n"
        "4:     br      1b\n"
        "       .previous\n"
-       "       .section __ex_table,\"a\"\n"
-       "       .long   1b-.\n"
-       "       lda     $31,3b-1b(%0)\n"
-       "       .long   2b-.\n"
-       "       lda     $31,3b-2b(%0)\n"
-       "       .previous\n"
+       EXC(1b,3b,%0,$31)
+       EXC(2b,3b,%0,$31)
        :       "+r"(ret), "=&r"(prev), "=&r"(cmp)
        :       "r"(uaddr), "r"((long)(int)oldval), "r"(newval)
        :       "memory");
index 54c1d19..9557c12 100644 (file)
  * more extensive comments with fixup_inline_exception below for
  * more information.
  */
+#define EXC(label,cont,res,err)                                \
+       ".section __ex_table,\"a\"\n"                   \
+       "       .long "#label"-.\n"                     \
+       "       lda "#res","#cont"-"#label"("#err")\n"  \
+       ".previous\n"
 
 extern void __get_user_unknown(void);
 
@@ -118,20 +123,14 @@ struct __large_struct { unsigned long buf[100]; };
 #define __get_user_64(addr)                            \
        __asm__("1: ldq %0,%2\n"                        \
        "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
+       EXC(1b,2b,%0,%1)                                \
                : "=r"(__gu_val), "=r"(__gu_err)        \
                : "m"(__m(addr)), "1"(__gu_err))
 
 #define __get_user_32(addr)                            \
        __asm__("1: ldl %0,%2\n"                        \
        "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
+       EXC(1b,2b,%0,%1)                                \
                : "=r"(__gu_val), "=r"(__gu_err)        \
                : "m"(__m(addr)), "1"(__gu_err))
 
@@ -141,20 +140,14 @@ struct __large_struct { unsigned long buf[100]; };
 #define __get_user_16(addr)                            \
        __asm__("1: ldwu %0,%2\n"                       \
        "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
+       EXC(1b,2b,%0,%1)                                \
                : "=r"(__gu_val), "=r"(__gu_err)        \
                : "m"(__m(addr)), "1"(__gu_err))
 
 #define __get_user_8(addr)                             \
        __asm__("1: ldbu %0,%2\n"                       \
        "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
+       EXC(1b,2b,%0,%1)                                \
                : "=r"(__gu_val), "=r"(__gu_err)        \
                : "m"(__m(addr)), "1"(__gu_err))
 #else
@@ -170,12 +163,8 @@ struct __large_struct { unsigned long buf[100]; };
        "       extwh %1,%3,%1\n"                                       \
        "       or %0,%1,%0\n"                                          \
        "3:\n"                                                          \
-       ".section __ex_table,\"a\"\n"                                   \
-       "       .long 1b - .\n"                                         \
-       "       lda %0, 3b-1b(%2)\n"                                    \
-       "       .long 2b - .\n"                                         \
-       "       lda %0, 3b-2b(%2)\n"                                    \
-       ".previous"                                                     \
+       EXC(1b,3b,%0,%2)                                                \
+       EXC(2b,3b,%0,%2)                                                \
                : "=&r"(__gu_val), "=&r"(__gu_tmp), "=r"(__gu_err)      \
                : "r"(addr), "2"(__gu_err));                            \
 }
@@ -184,10 +173,7 @@ struct __large_struct { unsigned long buf[100]; };
        __asm__("1: ldq_u %0,0(%2)\n"                                   \
        "       extbl %0,%2,%0\n"                                       \
        "2:\n"                                                          \
-       ".section __ex_table,\"a\"\n"                                   \
-       "       .long 1b - .\n"                                         \
-       "       lda %0, 2b-1b(%1)\n"                                    \
-       ".previous"                                                     \
+       EXC(1b,2b,%0,%1)                                                \
                : "=&r"(__gu_val), "=r"(__gu_err)                       \
                : "r"(addr), "1"(__gu_err))
 #endif
@@ -233,20 +219,14 @@ extern void __put_user_unknown(void);
 #define __put_user_64(x, addr)                                 \
 __asm__ __volatile__("1: stq %r2,%1\n"                         \
        "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
+       EXC(1b,2b,$31,%0)                                       \
                : "=r"(__pu_err)                                \
                : "m" (__m(addr)), "rJ" (x), "0"(__pu_err))
 
 #define __put_user_32(x, addr)                                 \
 __asm__ __volatile__("1: stl %r2,%1\n"                         \
        "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
+       EXC(1b,2b,$31,%0)                                       \
                : "=r"(__pu_err)                                \
                : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
 
@@ -256,20 +236,14 @@ __asm__ __volatile__("1: stl %r2,%1\n"                            \
 #define __put_user_16(x, addr)                                 \
 __asm__ __volatile__("1: stw %r2,%1\n"                         \
        "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
+       EXC(1b,2b,$31,%0)                                       \
                : "=r"(__pu_err)                                \
                : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
 
 #define __put_user_8(x, addr)                                  \
 __asm__ __volatile__("1: stb %r2,%1\n"                         \
        "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
+       EXC(1b,2b,$31,%0)                                       \
                : "=r"(__pu_err)                                \
                : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
 #else
@@ -291,16 +265,10 @@ __asm__ __volatile__("1: stb %r2,%1\n"                            \
        "3:     stq_u %2,1(%5)\n"                               \
        "4:     stq_u %1,0(%5)\n"                               \
        "5:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31, 5b-1b(%0)\n"                           \
-       "       .long 2b - .\n"                                 \
-       "       lda $31, 5b-2b(%0)\n"                           \
-       "       .long 3b - .\n"                                 \
-       "       lda $31, 5b-3b(%0)\n"                           \
-       "       .long 4b - .\n"                                 \
-       "       lda $31, 5b-4b(%0)\n"                           \
-       ".previous"                                             \
+       EXC(1b,5b,$31,%0)                                       \
+       EXC(2b,5b,$31,%0)                                       \
+       EXC(3b,5b,$31,%0)                                       \
+       EXC(4b,5b,$31,%0)                                       \
                : "=r"(__pu_err), "=&r"(__pu_tmp1),             \
                  "=&r"(__pu_tmp2), "=&r"(__pu_tmp3),           \
                  "=&r"(__pu_tmp4)                              \
@@ -317,12 +285,8 @@ __asm__ __volatile__("1: stb %r2,%1\n"                             \
        "       or %1,%2,%1\n"                                  \
        "2:     stq_u %1,0(%4)\n"                               \
        "3:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31, 3b-1b(%0)\n"                           \
-       "       .long 2b - .\n"                                 \
-       "       lda $31, 3b-2b(%0)\n"                           \
-       ".previous"                                             \
+       EXC(1b,3b,$31,%0)                                       \
+       EXC(2b,3b,$31,%0)                                       \
                : "=r"(__pu_err),                               \
                  "=&r"(__pu_tmp1), "=&r"(__pu_tmp2)            \
                : "r"((unsigned long)(x)), "r"(addr), "0"(__pu_err)); \
index b724ad8..65bb102 100644 (file)
@@ -482,12 +482,8 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
                "       extwl %1,%3,%1\n"
                "       extwh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -502,12 +498,8 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
                "       extll %1,%3,%1\n"
                "       extlh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -522,12 +514,8 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
                "       extql %1,%3,%1\n"
                "       extqh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -551,16 +539,10 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
                "3:     stq_u %2,1(%5)\n"
                "4:     stq_u %1,0(%5)\n"
                "5:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %2,5b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %1,5b-2b(%0)\n"
-               "       .long 3b - .\n"
-               "       lda $31,5b-3b(%0)\n"
-               "       .long 4b - .\n"
-               "       lda $31,5b-4b(%0)\n"
-               ".previous"
+               EXC(1b,5b,%2,%0)
+               EXC(2b,5b,%1,%0)
+               EXC(3b,5b,$31,%0)
+               EXC(4b,5b,$31,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2),
                          "=&r"(tmp3), "=&r"(tmp4)
                        : "r"(va), "r"(una_reg(reg)), "0"(0));
@@ -581,16 +563,10 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
                "3:     stq_u %2,3(%5)\n"
                "4:     stq_u %1,0(%5)\n"
                "5:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %2,5b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %1,5b-2b(%0)\n"
-               "       .long 3b - .\n"
-               "       lda $31,5b-3b(%0)\n"
-               "       .long 4b - .\n"
-               "       lda $31,5b-4b(%0)\n"
-               ".previous"
+               EXC(1b,5b,%2,%0)
+               EXC(2b,5b,%1,%0)
+               EXC(3b,5b,$31,%0)
+               EXC(4b,5b,$31,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2),
                          "=&r"(tmp3), "=&r"(tmp4)
                        : "r"(va), "r"(una_reg(reg)), "0"(0));
@@ -611,16 +587,10 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
                "3:     stq_u %2,7(%5)\n"
                "4:     stq_u %1,0(%5)\n"
                "5:\n"
-               ".section __ex_table,\"a\"\n\t"
-               "       .long 1b - .\n"
-               "       lda %2,5b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %1,5b-2b(%0)\n"
-               "       .long 3b - .\n"
-               "       lda $31,5b-3b(%0)\n"
-               "       .long 4b - .\n"
-               "       lda $31,5b-4b(%0)\n"
-               ".previous"
+               EXC(1b,5b,%2,%0)
+               EXC(2b,5b,%1,%0)
+               EXC(3b,5b,$31,%0)
+               EXC(4b,5b,$31,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2),
                          "=&r"(tmp3), "=&r"(tmp4)
                        : "r"(va), "r"(una_reg(reg)), "0"(0));
@@ -835,12 +805,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "       extwl %1,%3,%1\n"
                "       extwh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -855,12 +821,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "       extll %1,%3,%1\n"
                "       extlh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -875,12 +837,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "       extql %1,%3,%1\n"
                "       extqh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -895,12 +853,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "       extll %1,%3,%1\n"
                "       extlh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -915,12 +869,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "       extql %1,%3,%1\n"
                "       extqh %2,%3,%2\n"
                "3:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %1,3b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %2,3b-2b(%0)\n"
-               ".previous"
+               EXC(1b,3b,%1,%0)
+               EXC(2b,3b,%2,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2)
                        : "r"(va), "0"(0));
                if (error)
@@ -944,16 +894,10 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "3:     stq_u %2,1(%5)\n"
                "4:     stq_u %1,0(%5)\n"
                "5:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %2,5b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %1,5b-2b(%0)\n"
-               "       .long 3b - .\n"
-               "       lda $31,5b-3b(%0)\n"
-               "       .long 4b - .\n"
-               "       lda $31,5b-4b(%0)\n"
-               ".previous"
+               EXC(1b,5b,%2,%0)
+               EXC(2b,5b,%1,%0)
+               EXC(3b,5b,$31,%0)
+               EXC(4b,5b,$31,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2),
                          "=&r"(tmp3), "=&r"(tmp4)
                        : "r"(va), "r"(*reg_addr), "0"(0));
@@ -978,16 +922,10 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "3:     stq_u %2,3(%5)\n"
                "4:     stq_u %1,0(%5)\n"
                "5:\n"
-               ".section __ex_table,\"a\"\n"
-               "       .long 1b - .\n"
-               "       lda %2,5b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %1,5b-2b(%0)\n"
-               "       .long 3b - .\n"
-               "       lda $31,5b-3b(%0)\n"
-               "       .long 4b - .\n"
-               "       lda $31,5b-4b(%0)\n"
-               ".previous"
+               EXC(1b,5b,%2,%0)
+               EXC(2b,5b,%1,%0)
+               EXC(3b,5b,$31,%0)
+               EXC(4b,5b,$31,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2),
                          "=&r"(tmp3), "=&r"(tmp4)
                        : "r"(va), "r"(*reg_addr), "0"(0));
@@ -1012,16 +950,10 @@ do_entUnaUser(void __user * va, unsigned long opcode,
                "3:     stq_u %2,7(%5)\n"
                "4:     stq_u %1,0(%5)\n"
                "5:\n"
-               ".section __ex_table,\"a\"\n\t"
-               "       .long 1b - .\n"
-               "       lda %2,5b-1b(%0)\n"
-               "       .long 2b - .\n"
-               "       lda %1,5b-2b(%0)\n"
-               "       .long 3b - .\n"
-               "       lda $31,5b-3b(%0)\n"
-               "       .long 4b - .\n"
-               "       lda $31,5b-4b(%0)\n"
-               ".previous"
+               EXC(1b,5b,%2,%0)
+               EXC(2b,5b,%1,%0)
+               EXC(3b,5b,$31,%0)
+               EXC(4b,5b,$31,%0)
                        : "=r"(error), "=&r"(tmp1), "=&r"(tmp2),
                          "=&r"(tmp3), "=&r"(tmp4)
                        : "r"(va), "r"(*reg_addr), "0"(0));
index 5dfb797..ab42afb 100644 (file)
@@ -45,10 +45,7 @@ __asm__ __volatile__("insqh %1,%2,%0":"=r" (z):"r" (x),"r" (y))
        __asm__ __volatile__(                           \
        "1:     ldq_u %0,%2\n"                          \
        "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0,2b-1b(%1)\n"                     \
-       ".previous"                                     \
+       EXC(1b,2b,%0,%1)                                \
                : "=r"(x), "=r"(__guu_err)              \
                : "m"(__m(ptr)), "1"(0));               \
        __guu_err;                                      \
@@ -60,10 +57,7 @@ __asm__ __volatile__("insqh %1,%2,%0":"=r" (z):"r" (x),"r" (y))
        __asm__ __volatile__(                           \
        "1:     stq_u %2,%1\n"                          \
        "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - ."                           \
-       "       lda $31,2b-1b(%0)\n"                    \
-       ".previous"                                     \
+       EXC(1b,2b,$31,%0)                               \
                : "=r"(__puu_err)                       \
                : "m"(__m(addr)), "rJ"(x), "0"(0));     \
        __puu_err;                                      \