#include <linux/errno.h>
#include <asm/lowcore.h>
-#include <asm/offsets.h>
+#include <asm/asm-offsets.h>
.text
.align 4
# move with the reduced length which is < 256
5: mvcp 0(%r5,%r2),0(%r4),%r0
slgr %r3,%r5
-6: lgr %r2,%r3
+ algr %r2,%r5
+6: lgr %r5,%r3 # copy remaining size
+ aghi %r5,-1 # subtract 1 for xc loop
+ bras %r4,8f
+ xc 0(1,%r2),0(%r2)
+7: xc 0(256,%r2),0(%r2)
+ la %r2,256(%r2)
+8: aghi %r5,-256
+ jnm 7b
+ ex %r5,0(%r4)
+9: lgr %r2,%r3
br %r14
.section __ex_table,"a"
.quad 0b,4b
0: srst %r2,%r1
jo 0b
sacf 0
- jh 1f # \0 found in string ?
aghi %r2,1 # strnlen_user result includes the \0
-1: slgr %r2,%r3
+ # or return count+1 if \0 not found
+ slgr %r2,%r3
br %r14
2: sacf 0
- lghi %r2,-EFAULT
+ slgr %r2,%r2 # return 0 on exception
br %r14
.section __ex_table,"a"
.quad 0b,2b