Revert "parisc: Add assembly implementations for memset, strlen, strcpy, strncpy and strcat"
commit f6a3308d6feb351d9854eb8b3f6289a1ac163125 upstream.
This reverts commit 83af58f806
.
It turns out that at least the assembly implementation for strncpy() was
buggy. Revert the whole commit and return back to the default coding.
Signed-off-by: Helge Deller <deller@gmx.de>
Cc: <stable@vger.kernel.org> # v5.4+
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
67871ada3a
commit
6752b3b062
@ -8,19 +8,4 @@ extern void * memset(void *, int, size_t);
|
|||||||
#define __HAVE_ARCH_MEMCPY
|
#define __HAVE_ARCH_MEMCPY
|
||||||
void * memcpy(void * dest,const void *src,size_t count);
|
void * memcpy(void * dest,const void *src,size_t count);
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRLEN
|
|
||||||
extern size_t strlen(const char *s);
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRCPY
|
|
||||||
extern char *strcpy(char *dest, const char *src);
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRNCPY
|
|
||||||
extern char *strncpy(char *dest, const char *src, size_t count);
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRCAT
|
|
||||||
extern char *strcat(char *dest, const char *src);
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_MEMSET
|
|
||||||
extern void *memset(void *, int, size_t);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,10 +17,6 @@
|
|||||||
|
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
EXPORT_SYMBOL(memset);
|
EXPORT_SYMBOL(memset);
|
||||||
EXPORT_SYMBOL(strlen);
|
|
||||||
EXPORT_SYMBOL(strcpy);
|
|
||||||
EXPORT_SYMBOL(strncpy);
|
|
||||||
EXPORT_SYMBOL(strcat);
|
|
||||||
|
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
EXPORT_SYMBOL(__xchg8);
|
EXPORT_SYMBOL(__xchg8);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
# Makefile for parisc-specific library files
|
# Makefile for parisc-specific library files
|
||||||
#
|
#
|
||||||
|
|
||||||
lib-y := lusercopy.o bitops.o checksum.o io.o memcpy.o \
|
lib-y := lusercopy.o bitops.o checksum.o io.o memset.o memcpy.o \
|
||||||
ucmpdi2.o delay.o string.o
|
ucmpdi2.o delay.o
|
||||||
|
|
||||||
obj-y := iomap.o
|
obj-y := iomap.o
|
||||||
|
72
arch/parisc/lib/memset.c
Normal file
72
arch/parisc/lib/memset.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <asm/string.h>
|
||||||
|
|
||||||
|
#define OPSIZ (BITS_PER_LONG/8)
|
||||||
|
typedef unsigned long op_t;
|
||||||
|
|
||||||
|
void *
|
||||||
|
memset (void *dstpp, int sc, size_t len)
|
||||||
|
{
|
||||||
|
unsigned int c = sc;
|
||||||
|
long int dstp = (long int) dstpp;
|
||||||
|
|
||||||
|
if (len >= 8)
|
||||||
|
{
|
||||||
|
size_t xlen;
|
||||||
|
op_t cccc;
|
||||||
|
|
||||||
|
cccc = (unsigned char) c;
|
||||||
|
cccc |= cccc << 8;
|
||||||
|
cccc |= cccc << 16;
|
||||||
|
if (OPSIZ > 4)
|
||||||
|
/* Do the shift in two steps to avoid warning if long has 32 bits. */
|
||||||
|
cccc |= (cccc << 16) << 16;
|
||||||
|
|
||||||
|
/* There are at least some bytes to set.
|
||||||
|
No need to test for LEN == 0 in this alignment loop. */
|
||||||
|
while (dstp % OPSIZ != 0)
|
||||||
|
{
|
||||||
|
((unsigned char *) dstp)[0] = c;
|
||||||
|
dstp += 1;
|
||||||
|
len -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
|
||||||
|
xlen = len / (OPSIZ * 8);
|
||||||
|
while (xlen > 0)
|
||||||
|
{
|
||||||
|
((op_t *) dstp)[0] = cccc;
|
||||||
|
((op_t *) dstp)[1] = cccc;
|
||||||
|
((op_t *) dstp)[2] = cccc;
|
||||||
|
((op_t *) dstp)[3] = cccc;
|
||||||
|
((op_t *) dstp)[4] = cccc;
|
||||||
|
((op_t *) dstp)[5] = cccc;
|
||||||
|
((op_t *) dstp)[6] = cccc;
|
||||||
|
((op_t *) dstp)[7] = cccc;
|
||||||
|
dstp += 8 * OPSIZ;
|
||||||
|
xlen -= 1;
|
||||||
|
}
|
||||||
|
len %= OPSIZ * 8;
|
||||||
|
|
||||||
|
/* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
|
||||||
|
xlen = len / OPSIZ;
|
||||||
|
while (xlen > 0)
|
||||||
|
{
|
||||||
|
((op_t *) dstp)[0] = cccc;
|
||||||
|
dstp += OPSIZ;
|
||||||
|
xlen -= 1;
|
||||||
|
}
|
||||||
|
len %= OPSIZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the last few bytes. */
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
((unsigned char *) dstp)[0] = c;
|
||||||
|
dstp += 1;
|
||||||
|
len -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dstpp;
|
||||||
|
}
|
@ -1,136 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
/*
|
|
||||||
* PA-RISC assembly string functions
|
|
||||||
*
|
|
||||||
* Copyright (C) 2019 Helge Deller <deller@gmx.de>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <asm/assembly.h>
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
|
|
||||||
.section .text.hot
|
|
||||||
.level PA_ASM_LEVEL
|
|
||||||
|
|
||||||
t0 = r20
|
|
||||||
t1 = r21
|
|
||||||
t2 = r22
|
|
||||||
|
|
||||||
ENTRY_CFI(strlen, frame=0,no_calls)
|
|
||||||
or,COND(<>) arg0,r0,ret0
|
|
||||||
b,l,n .Lstrlen_null_ptr,r0
|
|
||||||
depwi 0,31,2,ret0
|
|
||||||
cmpb,COND(<>) arg0,ret0,.Lstrlen_not_aligned
|
|
||||||
ldw,ma 4(ret0),t0
|
|
||||||
cmpib,tr 0,r0,.Lstrlen_loop
|
|
||||||
uxor,nbz r0,t0,r0
|
|
||||||
.Lstrlen_not_aligned:
|
|
||||||
uaddcm arg0,ret0,t1
|
|
||||||
shladd t1,3,r0,t1
|
|
||||||
mtsar t1
|
|
||||||
depwi -1,%sar,32,t0
|
|
||||||
uxor,nbz r0,t0,r0
|
|
||||||
.Lstrlen_loop:
|
|
||||||
b,l,n .Lstrlen_end_loop,r0
|
|
||||||
ldw,ma 4(ret0),t0
|
|
||||||
cmpib,tr 0,r0,.Lstrlen_loop
|
|
||||||
uxor,nbz r0,t0,r0
|
|
||||||
.Lstrlen_end_loop:
|
|
||||||
extrw,u,<> t0,7,8,r0
|
|
||||||
addib,tr,n -3,ret0,.Lstrlen_out
|
|
||||||
extrw,u,<> t0,15,8,r0
|
|
||||||
addib,tr,n -2,ret0,.Lstrlen_out
|
|
||||||
extrw,u,<> t0,23,8,r0
|
|
||||||
addi -1,ret0,ret0
|
|
||||||
.Lstrlen_out:
|
|
||||||
bv r0(rp)
|
|
||||||
uaddcm ret0,arg0,ret0
|
|
||||||
.Lstrlen_null_ptr:
|
|
||||||
bv,n r0(rp)
|
|
||||||
ENDPROC_CFI(strlen)
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY_CFI(strcpy, frame=0,no_calls)
|
|
||||||
ldb 0(arg1),t0
|
|
||||||
stb t0,0(arg0)
|
|
||||||
ldo 0(arg0),ret0
|
|
||||||
ldo 1(arg1),t1
|
|
||||||
cmpb,= r0,t0,2f
|
|
||||||
ldo 1(arg0),t2
|
|
||||||
1: ldb 0(t1),arg1
|
|
||||||
stb arg1,0(t2)
|
|
||||||
ldo 1(t1),t1
|
|
||||||
cmpb,<> r0,arg1,1b
|
|
||||||
ldo 1(t2),t2
|
|
||||||
2: bv,n r0(rp)
|
|
||||||
ENDPROC_CFI(strcpy)
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY_CFI(strncpy, frame=0,no_calls)
|
|
||||||
ldb 0(arg1),t0
|
|
||||||
stb t0,0(arg0)
|
|
||||||
ldo 1(arg1),t1
|
|
||||||
ldo 0(arg0),ret0
|
|
||||||
cmpb,= r0,t0,2f
|
|
||||||
ldo 1(arg0),arg1
|
|
||||||
1: ldo -1(arg2),arg2
|
|
||||||
cmpb,COND(=),n r0,arg2,2f
|
|
||||||
ldb 0(t1),arg0
|
|
||||||
stb arg0,0(arg1)
|
|
||||||
ldo 1(t1),t1
|
|
||||||
cmpb,<> r0,arg0,1b
|
|
||||||
ldo 1(arg1),arg1
|
|
||||||
2: bv,n r0(rp)
|
|
||||||
ENDPROC_CFI(strncpy)
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY_CFI(strcat, frame=0,no_calls)
|
|
||||||
ldb 0(arg0),t0
|
|
||||||
cmpb,= t0,r0,2f
|
|
||||||
ldo 0(arg0),ret0
|
|
||||||
ldo 1(arg0),arg0
|
|
||||||
1: ldb 0(arg0),t1
|
|
||||||
cmpb,<>,n r0,t1,1b
|
|
||||||
ldo 1(arg0),arg0
|
|
||||||
2: ldb 0(arg1),t2
|
|
||||||
stb t2,0(arg0)
|
|
||||||
ldo 1(arg0),arg0
|
|
||||||
ldb 0(arg1),t0
|
|
||||||
cmpb,<> r0,t0,2b
|
|
||||||
ldo 1(arg1),arg1
|
|
||||||
bv,n r0(rp)
|
|
||||||
ENDPROC_CFI(strcat)
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY_CFI(memset, frame=0,no_calls)
|
|
||||||
copy arg0,ret0
|
|
||||||
cmpb,COND(=) r0,arg0,4f
|
|
||||||
copy arg0,t2
|
|
||||||
cmpb,COND(=) r0,arg2,4f
|
|
||||||
ldo -1(arg2),arg3
|
|
||||||
subi -1,arg3,t0
|
|
||||||
subi 0,t0,t1
|
|
||||||
cmpiclr,COND(>=) 0,t1,arg2
|
|
||||||
ldo -1(t1),arg2
|
|
||||||
extru arg2,31,2,arg0
|
|
||||||
2: stb arg1,0(t2)
|
|
||||||
ldo 1(t2),t2
|
|
||||||
addib,>= -1,arg0,2b
|
|
||||||
ldo -1(arg3),arg3
|
|
||||||
cmpiclr,COND(<=) 4,arg2,r0
|
|
||||||
b,l,n 4f,r0
|
|
||||||
#ifdef CONFIG_64BIT
|
|
||||||
depd,* r0,63,2,arg2
|
|
||||||
#else
|
|
||||||
depw r0,31,2,arg2
|
|
||||||
#endif
|
|
||||||
ldo 1(t2),t2
|
|
||||||
3: stb arg1,-1(t2)
|
|
||||||
stb arg1,0(t2)
|
|
||||||
stb arg1,1(t2)
|
|
||||||
stb arg1,2(t2)
|
|
||||||
addib,COND(>) -4,arg2,3b
|
|
||||||
ldo 4(t2),t2
|
|
||||||
4: bv,n r0(rp)
|
|
||||||
ENDPROC_CFI(memset)
|
|
||||||
|
|
||||||
.end
|
|
Loading…
Reference in New Issue
Block a user