powerpc: Fix string library functions
authorAndreas Schwab <schwab@linux-m68k.org>
Tue, 18 May 2010 08:15:21 +0000 (08:15 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 21 May 2010 07:31:08 +0000 (17:31 +1000)
The powerpc strncmp implementation does not correctly handle a zero
length, despite the claim in 0119536cd314ef95553604208c25bc35581f7f0a
(Add hand-coded assembly strcmp).

Additionally, all the length arguments are size_t, not int, so use
PPC_LCMPI and eq instead of cmpwi and le throughout.

Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>
Acked-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/lib/string.S

index 3ac0cd3a53738e28cd7a0cb0649d94b27c5d2d3b..455881a5563f2925544cf14d986b68904c7f1b98 100644 (file)
@@ -28,7 +28,7 @@ _GLOBAL(strcpy)
 /* This clears out any unused part of the destination buffer,
    just as the libc version does.  -- paulus */
 _GLOBAL(strncpy)
-       cmpwi   0,r5,0
+       PPC_LCMPI 0,r5,0
        beqlr
        mtctr   r5
        addi    r6,r3,-1
@@ -39,7 +39,7 @@ _GLOBAL(strncpy)
        bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
        bnelr                   /* if we didn't hit a null char, we're done */
        mfctr   r5
-       cmpwi   0,r5,0          /* any space left in destination buffer? */
+       PPC_LCMPI 0,r5,0        /* any space left in destination buffer? */
        beqlr                   /* we know r0 == 0 here */
 2:     stbu    r0,1(r6)        /* clear it out if so */
        bdnz    2b
@@ -70,8 +70,8 @@ _GLOBAL(strcmp)
        blr
 
 _GLOBAL(strncmp)
-       PPC_LCMPI r5,0
-       ble-    2f
+       PPC_LCMPI 0,r5,0
+       beq-    2f
        mtctr   r5
        addi    r5,r3,-1
        addi    r4,r4,-1
@@ -94,8 +94,8 @@ _GLOBAL(strlen)
        blr
 
 _GLOBAL(memcmp)
-       cmpwi   0,r5,0
-       ble-    2f
+       PPC_LCMPI 0,r5,0
+       beq-    2f
        mtctr   r5
        addi    r6,r3,-1
        addi    r4,r4,-1
@@ -108,8 +108,8 @@ _GLOBAL(memcmp)
        blr
 
 _GLOBAL(memchr)
-       cmpwi   0,r5,0
-       ble-    2f
+       PPC_LCMPI 0,r5,0
+       beq-    2f
        mtctr   r5
        addi    r3,r3,-1
 1:     lbzu    r0,1(r3)