This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / arch / parisc / lib / lusercopy.S
index a050985..72c9615 100644 (file)
        mtsp        %r1,%sr1
        .endm
 
-       .macro fixup_branch lbl
-       ldil        L%\lbl, %r1
-       ldo         R%\lbl(%r1), %r1
-       bv          %r0(%r1)
-       .endm
+       /*
+        * unsigned long
+        * lcopy_to_user(void *to, const void *from, unsigned long n)
+        *
+        * Returns 0 for success.
+        * otherwise, returns number of bytes not transferred.
+        */
+
+       .export lcopy_to_user,code
+lcopy_to_user:
+       .proc
+       .callinfo NO_CALLS
+       .entry
+       comib,=,n   0,%r24,$lctu_done
+       get_sr
+$lctu_loop:
+       ldbs,ma     1(%r25),%r1
+       addib,<>    -1,%r24,$lctu_loop
+1:      stbs,ma     %r1,1(%sr1,%r26)
+$lctu_done:
+       bv          %r0(%r2)
+       copy        %r24,%r28
+       .exit
+
+2:      b $lctu_done
+       ldo         1(%r24),%r24
+
+       .section __ex_table,"a"
+#ifdef __LP64__
+       .dword      1b,(2b-1b)
+#else
+       .word       1b,(2b-1b)
+#endif
+       .previous
+
+       .procend
+
+       /*
+        * unsigned long
+        * lcopy_from_user(void *to, const void *from, unsigned long n)
+        *
+        * Returns 0 for success.
+        * otherwise, returns number of bytes not transferred.
+        *
+        * NOTE: This routine will also zero any bytes in the
+        *       destination that were not copied due to a fault.
+        *
+        */
+
+       .export lcopy_from_user,code
+lcopy_from_user:
+       .proc
+       .callinfo NO_CALLS
+       .entry
+       comib,=,n   0,%r24,$lcfu_done
+       get_sr
+$lcfu_loop:
+1:      ldbs,ma     1(%sr1,%r25),%r1
+       addib,<>    -1,%r24,$lcfu_loop
+       stbs,ma     %r1,1(%r26)
+$lcfu_done:
+       bv          %r0(%r2)
+       copy        %r24,%r28
+       .exit
+
+2:      copy        %r24,%r23
+$lcfu_zero_loop:
+       addib,<>    -1,%r23,$lcfu_zero_loop
+       stbs,ma     %r0,1(%r26)
+       b           $lcfu_done
+       nop
+
+       .section __ex_table,"a"
+#ifdef __LP64__
+       .dword      1b,(2b-1b)
+#else
+       .word       1b,(2b-1b)
+#endif
+       .previous
+
+       .procend
+
+       /*
+        * unsigned long
+        * lcopy_in_user(void *to, const void *from, unsigned long n)
+        *
+        * Returns 0 for success.
+        * otherwise, returns number of bytes not transferred.
+        */
+
+       .export lcopy_in_user,code
+lcopy_in_user:
+       .proc
+       .callinfo NO_CALLS
+       .entry
+       comib,=,n   0,%r24,$lciu_done
+       get_sr
+$lciu_loop:
+       ldbs,ma     1(%sr1,%r25),%r1
+       addib,<>    -1,%r24,$lciu_loop
+1:      stbs,ma     %r1,1(%sr1,%r26)
+$lciu_done:
+       bv          %r0(%r2)
+       copy        %r24,%r28
+       .exit
+
+2:      b $lciu_done
+       ldo         1(%r24),%r24
+
+       .section __ex_table,"a"
+#ifdef __LP64__
+       .dword      1b,(2b-1b)
+#else
+       .word       1b,(2b-1b)
+#endif
+       .previous
+
+       .procend
 
        /*
         * long lstrncpy_from_user(char *dst, const char *src, long n)
@@ -88,18 +201,16 @@ $lsfu_exit:
        nop
        .exit
 
-       .section .fixup,"ax"
-3:      fixup_branch $lsfu_exit
+3:      b           $lsfu_exit
        ldi         -EFAULT,%r28
-       .previous
 
-       .section __ex_table,"aw"
+       .section __ex_table,"a"
 #ifdef __LP64__
-       .dword      1b,3b
-       .dword      2b,3b
+       .dword      1b,(3b-1b)
+       .dword      2b,(3b-2b)
 #else
-       .word       1b,3b
-       .word       2b,3b
+       .word       1b,(3b-1b)
+       .word       2b,(3b-2b)
 #endif
        .previous
 
@@ -128,16 +239,14 @@ $lclu_done:
        copy        %r25,%r28
        .exit
 
-       .section .fixup,"ax"
-2:      fixup_branch $lclu_done
+2:      b $lclu_done
        ldo        1(%r25),%r25
-       .previous
 
-       .section __ex_table,"aw"
+       .section __ex_table,"a"
 #ifdef __LP64__
-       .dword      1b,2b
+       .dword      1b,(2b-1b)
 #else
-       .word       1b,2b
+       .word       1b,(2b-1b)
 #endif
        .previous
 
@@ -173,18 +282,16 @@ $lslen_nzero:
        b           $lslen_done
        ldo         1(%r26),%r26 /* special case for N == 0 */
 
-       .section .fixup,"ax"
-3:      fixup_branch $lslen_done
+3:      b           $lslen_done
        copy        %r24,%r26    /* reset r26 so 0 is returned on fault */
-       .previous
 
-       .section __ex_table,"aw"
+       .section __ex_table,"a"
 #ifdef __LP64__
-       .dword      1b,3b
-       .dword      2b,3b
+       .dword      1b,(3b-1b)
+       .dword      2b,(3b-2b)
 #else
-       .word       1b,3b
-       .word       2b,3b
+       .word       1b,(3b-1b)
+       .word       2b,(3b-2b)
 #endif
        .previous