powerpc: Use the new generic strncpy_from_user() and strnlen_user()
This is much the same as for SPARC except that we can do the find_zero() function more efficiently using the count-leading-zeroes instructions. Tested on 32-bit and 64-bit PowerPC. Signed-off-by: Paul Mackerras <paulus@samba.org> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
69ea640598
commit
1629372caa
@@ -160,48 +160,3 @@ _GLOBAL(__clear_user)
|
||||
PPC_LONG 1b,91b
|
||||
PPC_LONG 8b,92b
|
||||
.text
|
||||
|
||||
_GLOBAL(__strncpy_from_user)
|
||||
addi r6,r3,-1
|
||||
addi r4,r4,-1
|
||||
cmpwi 0,r5,0
|
||||
beq 2f
|
||||
mtctr r5
|
||||
1: lbzu r0,1(r4)
|
||||
cmpwi 0,r0,0
|
||||
stbu r0,1(r6)
|
||||
bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */
|
||||
beq 3f
|
||||
2: addi r6,r6,1
|
||||
3: subf r3,r3,r6
|
||||
blr
|
||||
99: li r3,-EFAULT
|
||||
blr
|
||||
|
||||
.section __ex_table,"a"
|
||||
PPC_LONG 1b,99b
|
||||
.text
|
||||
|
||||
/* r3 = str, r4 = len (> 0), r5 = top (highest addr) */
|
||||
_GLOBAL(__strnlen_user)
|
||||
addi r7,r3,-1
|
||||
subf r6,r7,r5 /* top+1 - str */
|
||||
cmplw 0,r4,r6
|
||||
bge 0f
|
||||
mr r6,r4
|
||||
0: mtctr r6 /* ctr = min(len, top - str) */
|
||||
1: lbzu r0,1(r7) /* get next byte */
|
||||
cmpwi 0,r0,0
|
||||
bdnzf 2,1b /* loop if --ctr != 0 && byte != 0 */
|
||||
addi r7,r7,1
|
||||
subf r3,r3,r7 /* number of bytes we have looked at */
|
||||
beqlr /* return if we found a 0 byte */
|
||||
cmpw 0,r3,r4 /* did we look at all len bytes? */
|
||||
blt 99f /* if not, must have hit top */
|
||||
addi r3,r4,1 /* return len + 1 to indicate no null found */
|
||||
blr
|
||||
99: li r3,0 /* bad address, return 0 */
|
||||
blr
|
||||
|
||||
.section __ex_table,"a"
|
||||
PPC_LONG 1b,99b
|
||||
|
Reference in New Issue
Block a user