Merge tag 'metag-for-v4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan...
[sfrench/cifs-2.6.git] / arch / metag / lib / usercopy.c
index e8a4ea83cabbccea76c2fd056ffbdccd8d6a8012..c941abdb8f85586bf648c2a6fe53ba9350dcb5f0 100644 (file)
 #define __asm_copy_user_64bit_rapf_loop(                               \
                to, from, ret, n, id, FIXUP)                            \
        asm volatile (                                                  \
-               ".balign 8\n"                                           \
-               "MOV    RAPF, %1\n"                                     \
-               "MSETL  [A0StP++], D0Ar6, D0FrT, D0.5, D0.6, D0.7\n"    \
-               "MOV    D0Ar6, #0\n"                                    \
-               "LSR    D1Ar5, %3, #6\n"                                \
-               "SUB    TXRPT, D1Ar5, #2\n"                             \
-               "MOV    RAPF, %1\n"                                     \
+                       ".balign 8\n"                                   \
+               "       MOV     RAPF, %1\n"                             \
+               "       MSETL   [A0StP++], D0Ar6, D0FrT, D0.5, D0.6, D0.7\n" \
+               "       MOV     D0Ar6, #0\n"                            \
+               "       LSR     D1Ar5, %3, #6\n"                        \
+               "       SUB     TXRPT, D1Ar5, #2\n"                     \
+               "       MOV     RAPF, %1\n"                             \
                "$Lloop"id":\n"                                         \
-               "ADD    RAPF, %1, #64\n"                                \
-               "21:\n"                                                 \
-               "MGETL  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "22:\n"                                                 \
-               "MSETL  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "23:\n"                                                 \
-               "SUB    %3, %3, #32\n"                                  \
-               "24:\n"                                                 \
-               "MGETL  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "25:\n"                                                 \
-               "MSETL  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "26:\n"                                                 \
-               "SUB    %3, %3, #32\n"                                  \
-               "DCACHE [%1+#-64], D0Ar6\n"                             \
-               "BR     $Lloop"id"\n"                                   \
+               "       ADD     RAPF, %1, #64\n"                        \
+               "21:    MGETL   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "22:    MSETL   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "23:    SUB     %3, %3, #32\n"                          \
+               "24:    MGETL   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "25:    MSETL   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "26:    SUB     %3, %3, #32\n"                          \
+               "       DCACHE  [%1+#-64], D0Ar6\n"                     \
+               "       BR      $Lloop"id"\n"                           \
                                                                        \
-               "MOV    RAPF, %1\n"                                     \
-               "27:\n"                                                 \
-               "MGETL  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "28:\n"                                                 \
-               "MSETL  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "29:\n"                                                 \
-               "SUB    %3, %3, #32\n"                                  \
-               "30:\n"                                                 \
-               "MGETL  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "31:\n"                                                 \
-               "MSETL  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "32:\n"                                                 \
-               "SUB    %0, %0, #8\n"                                   \
-               "33:\n"                                                 \
-               "SETL   [%0++], D0.7, D1.7\n"                           \
-               "SUB    %3, %3, #32\n"                                  \
-               "1:"                                                    \
-               "DCACHE [%1+#-64], D0Ar6\n"                             \
-               "GETL    D0Ar6, D1Ar5, [A0StP+#-40]\n"                  \
-               "GETL    D0FrT, D1RtP, [A0StP+#-32]\n"                  \
-               "GETL    D0.5, D1.5, [A0StP+#-24]\n"                    \
-               "GETL    D0.6, D1.6, [A0StP+#-16]\n"                    \
-               "GETL    D0.7, D1.7, [A0StP+#-8]\n"                     \
-               "SUB A0StP, A0StP, #40\n"                               \
+               "       MOV     RAPF, %1\n"                             \
+               "27:    MGETL   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "28:    MSETL   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "29:    SUB     %3, %3, #32\n"                          \
+               "30:    MGETL   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "31:    MSETL   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "32:    SETL    [%0+#-8], D0.7, D1.7\n"                 \
+               "       SUB     %3, %3, #32\n"                          \
+               "1:     DCACHE  [%1+#-64], D0Ar6\n"                     \
+               "       GETL    D0Ar6, D1Ar5, [A0StP+#-40]\n"           \
+               "       GETL    D0FrT, D1RtP, [A0StP+#-32]\n"           \
+               "       GETL    D0.5, D1.5, [A0StP+#-24]\n"             \
+               "       GETL    D0.6, D1.6, [A0StP+#-16]\n"             \
+               "       GETL    D0.7, D1.7, [A0StP+#-8]\n"              \
+               "       SUB     A0StP, A0StP, #40\n"                    \
                "       .section .fixup,\"ax\"\n"                       \
-               "4:\n"                                                  \
-               "       ADD     %0, %0, #8\n"                           \
-               "3:\n"                                                  \
-               "       MOV     D0Ar2, TXSTATUS\n"                      \
+               "3:     MOV     D0Ar2, TXSTATUS\n"                      \
                "       MOV     D1Ar1, TXSTATUS\n"                      \
                "       AND     D1Ar1, D1Ar1, #0xFFFFF8FF\n"            \
                "       MOV     TXSTATUS, D1Ar1\n"                      \
                        FIXUP                                           \
-               "       MOVT    D0Ar2,#HI(1b)\n"                        \
-               "       JUMP    D0Ar2,#LO(1b)\n"                        \
+               "       MOVT    D0Ar2, #HI(1b)\n"                       \
+               "       JUMP    D0Ar2, #LO(1b)\n"                       \
                "       .previous\n"                                    \
                "       .section __ex_table,\"a\"\n"                    \
                "       .long 21b,3b\n"                                 \
                "       .long 30b,3b\n"                                 \
                "       .long 31b,3b\n"                                 \
                "       .long 32b,3b\n"                                 \
-               "       .long 33b,4b\n"                                 \
                "       .previous\n"                                    \
                : "=r" (to), "=r" (from), "=r" (ret), "=d" (n)          \
                : "0" (to), "1" (from), "2" (ret), "3" (n)              \
 #define __asm_copy_user_32bit_rapf_loop(                               \
                        to,     from, ret, n, id, FIXUP)                \
        asm volatile (                                                  \
-               ".balign 8\n"                                           \
-               "MOV    RAPF, %1\n"                                     \
-               "MSETL  [A0StP++], D0Ar6, D0FrT, D0.5, D0.6, D0.7\n"    \
-               "MOV    D0Ar6, #0\n"                                    \
-               "LSR    D1Ar5, %3, #6\n"                                \
-               "SUB    TXRPT, D1Ar5, #2\n"                             \
-               "MOV    RAPF, %1\n"                                     \
-       "$Lloop"id":\n"                                                 \
-               "ADD    RAPF, %1, #64\n"                                \
-               "21:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "22:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "23:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "24:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "25:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "26:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "27:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "28:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "29:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "30:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "31:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "32:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "DCACHE [%1+#-64], D0Ar6\n"                             \
-               "BR     $Lloop"id"\n"                                   \
+                       ".balign 8\n"                                   \
+               "       MOV     RAPF, %1\n"                             \
+               "       MSETL   [A0StP++], D0Ar6, D0FrT, D0.5, D0.6, D0.7\n" \
+               "       MOV     D0Ar6, #0\n"                            \
+               "       LSR     D1Ar5, %3, #6\n"                        \
+               "       SUB     TXRPT, D1Ar5, #2\n"                     \
+               "       MOV     RAPF, %1\n"                             \
+               "$Lloop"id":\n"                                         \
+               "       ADD     RAPF, %1, #64\n"                        \
+               "21:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "22:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "23:    SUB     %3, %3, #16\n"                          \
+               "24:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "25:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "26:    SUB     %3, %3, #16\n"                          \
+               "27:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "28:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "29:    SUB     %3, %3, #16\n"                          \
+               "30:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "31:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "32:    SUB     %3, %3, #16\n"                          \
+               "       DCACHE  [%1+#-64], D0Ar6\n"                     \
+               "       BR      $Lloop"id"\n"                           \
                                                                        \
-               "MOV    RAPF, %1\n"                                     \
-               "33:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "34:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "35:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "36:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "37:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "38:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "39:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "40:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "41:\n"                                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "42:\n"                                                 \
-               "MGETD  D0FrT, D0.5, D0.6, D0.7, [%1++]\n"              \
-               "43:\n"                                                 \
-               "MSETD  [%0++], D0FrT, D0.5, D0.6, D0.7\n"              \
-               "44:\n"                                                 \
-               "SUB    %0, %0, #4\n"                                   \
-               "45:\n"                                                 \
-               "SETD   [%0++], D0.7\n"                                 \
-               "SUB    %3, %3, #16\n"                                  \
-               "1:"                                                    \
-               "DCACHE [%1+#-64], D0Ar6\n"                             \
-               "GETL    D0Ar6, D1Ar5, [A0StP+#-40]\n"                  \
-               "GETL    D0FrT, D1RtP, [A0StP+#-32]\n"                  \
-               "GETL    D0.5, D1.5, [A0StP+#-24]\n"                    \
-               "GETL    D0.6, D1.6, [A0StP+#-16]\n"                    \
-               "GETL    D0.7, D1.7, [A0StP+#-8]\n"                     \
-               "SUB A0StP, A0StP, #40\n"                               \
+               "       MOV     RAPF, %1\n"                             \
+               "33:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "34:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "35:    SUB     %3, %3, #16\n"                          \
+               "36:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "37:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "38:    SUB     %3, %3, #16\n"                          \
+               "39:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "40:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "41:    SUB     %3, %3, #16\n"                          \
+               "42:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
+               "43:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
+               "44:    SETD    [%0+#-4], D0.7\n"                       \
+               "       SUB     %3, %3, #16\n"                          \
+               "1:     DCACHE  [%1+#-64], D0Ar6\n"                     \
+               "       GETL    D0Ar6, D1Ar5, [A0StP+#-40]\n"           \
+               "       GETL    D0FrT, D1RtP, [A0StP+#-32]\n"           \
+               "       GETL    D0.5, D1.5, [A0StP+#-24]\n"             \
+               "       GETL    D0.6, D1.6, [A0StP+#-16]\n"             \
+               "       GETL    D0.7, D1.7, [A0StP+#-8]\n"              \
+               "       SUB A0StP, A0StP, #40\n"                        \
                "       .section .fixup,\"ax\"\n"                       \
-               "4:\n"                                                  \
-               "       ADD             %0, %0, #4\n"                   \
-               "3:\n"                                                  \
-               "       MOV     D0Ar2, TXSTATUS\n"                      \
+               "3:     MOV     D0Ar2, TXSTATUS\n"                      \
                "       MOV     D1Ar1, TXSTATUS\n"                      \
                "       AND     D1Ar1, D1Ar1, #0xFFFFF8FF\n"            \
                "       MOV     TXSTATUS, D1Ar1\n"                      \
                        FIXUP                                           \
-               "       MOVT    D0Ar2,#HI(1b)\n"                        \
-               "       JUMP    D0Ar2,#LO(1b)\n"                        \
+               "       MOVT    D0Ar2, #HI(1b)\n"                       \
+               "       JUMP    D0Ar2, #LO(1b)\n"                       \
                "       .previous\n"                                    \
                "       .section __ex_table,\"a\"\n"                    \
                "       .long 21b,3b\n"                                 \
                "       .long 42b,3b\n"                                 \
                "       .long 43b,3b\n"                                 \
                "       .long 44b,3b\n"                                 \
-               "       .long 45b,4b\n"                                 \
                "       .previous\n"                                    \
                : "=r" (to), "=r" (from), "=r" (ret), "=d" (n)          \
                : "0" (to), "1" (from), "2" (ret), "3" (n)              \
@@ -1094,6 +1044,30 @@ unsigned int __get_user_asm_d(const void __user *addr, long *err)
 }
 EXPORT_SYMBOL(__get_user_asm_d);
 
+unsigned long long __get_user_asm_l(const void __user *addr, long *err)
+{
+       register unsigned long long x asm ("D0Re0") = 0;
+       asm volatile (
+               "       GETL %0,%t0,[%2]\n"
+               "1:\n"
+               "       GETL %0,%t0,[%2]\n"
+               "2:\n"
+               "       .section .fixup,\"ax\"\n"
+               "3:     MOV     D0FrT,%3\n"
+               "       SETD    [%1],D0FrT\n"
+               "       MOVT    D0FrT,#HI(2b)\n"
+               "       JUMP    D0FrT,#LO(2b)\n"
+               "       .previous\n"
+               "       .section __ex_table,\"a\"\n"
+               "       .long 1b,3b\n"
+               "       .previous\n"
+               : "=r" (x)
+               : "r" (err), "r" (addr), "P" (-EFAULT)
+               : "D0FrT");
+       return x;
+}
+EXPORT_SYMBOL(__get_user_asm_l);
+
 long __put_user_asm_b(unsigned int x, void __user *addr)
 {
        register unsigned int err asm ("D0Re0") = 0;