2 * arch/s390/lib/uaccess.S
3 * __copy_{from|to}_user functions.
6 * Copyright (C) 2000,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Authors(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
9 * These functions have standard call interface
12 #include <linux/errno.h>
13 #include <asm/lowcore.h>
14 #include <asm/asm-offsets.h>
18 .globl __copy_from_user_asm
19 # %r2 = to, %r3 = n, %r4 = from
22 0: mvcp 0(%r3,%r2),0(%r4),%r0
29 2: mvcp 0(%r3,%r2),0(%r4),%r0
36 nr %r5,%r0 # %r5 = (%r4 + 4096) & -4096
37 slr %r5,%r4 # %r5 = #bytes to next user page boundary
38 clr %r3,%r5 # copy crosses next page boundary ?
39 jnh 6f # no, the current page faulted
40 # move with the reduced length which is < 256
41 5: mvcp 0(%r5,%r2),0(%r4),%r0
44 6: lr %r5,%r3 # copy remaining size
45 ahi %r5,-1 # subtract 1 for xc loop
48 7: xc 0(256,%r2),0(%r2)
55 .section __ex_table,"a"
63 .globl __copy_to_user_asm
64 # %r2 = from, %r3 = n, %r4 = to
67 0: mvcs 0(%r3,%r4),0(%r2),%r0
74 2: mvcs 0(%r3,%r4),0(%r2),%r0
81 nr %r5,%r0 # %r5 = (%r4 + 4096) & -4096
82 slr %r5,%r4 # %r5 = #bytes to next user page boundary
83 clr %r3,%r5 # copy crosses next page boundary ?
84 jnh 6f # no, the current page faulted
85 # move with the reduced length which is < 256
86 5: mvcs 0(%r5,%r4),0(%r2),%r0
90 .section __ex_table,"a"
98 .globl __copy_in_user_asm
99 # %r2 = from, %r3 = n, %r4 = to
104 0: mvc 0(256,%r4),0(%r2)
113 3: mvc 0(1,%r4),0(%r2)
121 .section __ex_table,"a"
129 .globl __clear_user_asm
133 .long empty_zero_page
136 1: mvcs 0(%r3,%r2),0(%r5),%r0
142 3: mvcs 0(%r3,%r2),0(%r5),%r0
149 nr %r4,%r0 # %r4 = (%r2 + 4096) & -4096
150 slr %r4,%r2 # %r4 = #bytes to next user page boundary
151 clr %r3,%r4 # clear crosses next page boundary ?
152 jnh 7f # no, the current page faulted
153 # clear with the reduced length which is < 256
154 6: mvcs 0(%r4,%r2),0(%r5),%r0
158 .section __ex_table,"a"
166 .globl __strncpy_from_user_asm
167 # %r2 = count, %r3 = dst, %r4 = src
168 __strncpy_from_user_asm:
171 la %r4,0(%r4) # clear high order bit from %r4
172 la %r2,0(%r2,%r4) # %r2 points to first byte after string
178 jh 1f # \0 found in string ?
179 ahi %r1,1 # include \0 in copy
180 1: slr %r1,%r4 # %r1 = copy length (without \0)
181 slr %r2,%r4 # %r2 = return length (including \0)
182 2: mvcp 0(%r1,%r3),0(%r4),%r0
188 mvcp 0(%r1,%r3),0(%r4),%r0
194 .section __ex_table,"a"
200 .globl __strnlen_user_asm
201 # %r2 = count, %r3 = src
205 la %r3,0(%r3) # clear high order bit from %r4
206 la %r2,0(%r2,%r3) # %r2 points to first byte after string
211 ahi %r2,1 # strnlen_user result includes the \0
212 # or return count+1 if \0 not found
216 slr %r2,%r2 # return 0 on exception
218 .section __ex_table,"a"