|
@@ -246,65 +246,47 @@
|
|
|
#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" \
|
|
@@ -319,7 +301,6 @@
|
|
|
" .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) \
|
|
@@ -397,89 +378,59 @@
|
|
|
#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" \
|
|
@@ -506,7 +457,6 @@
|
|
|
" .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;
|