1 From f6a3308d6feb351d9854eb8b3f6289a1ac163125 Mon Sep 17 00:00:00 2001
2 From: Helge Deller <deller@gmx.de>
3 Date: Fri, 27 Aug 2021 20:42:57 +0200
4 Subject: Revert "parisc: Add assembly implementations for memset, strlen, strcpy, strncpy and strcat"
6 From: Helge Deller <deller@gmx.de>
8 commit f6a3308d6feb351d9854eb8b3f6289a1ac163125 upstream.
10 This reverts commit 83af58f8068ea3f7b3c537c37a30887bfa585069.
12 It turns out that at least the assembly implementation for strncpy() was
13 buggy. Revert the whole commit and return back to the default coding.
15 Signed-off-by: Helge Deller <deller@gmx.de>
16 Cc: <stable@vger.kernel.org> # v5.4+
17 Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
18 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
19 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
21 arch/parisc/include/asm/string.h | 15 ----
22 arch/parisc/kernel/parisc_ksyms.c | 4 -
23 arch/parisc/lib/Makefile | 4 -
24 arch/parisc/lib/memset.c | 72 ++++++++++++++++++++
25 arch/parisc/lib/string.S | 136 --------------------------------------
26 5 files changed, 74 insertions(+), 157 deletions(-)
27 create mode 100644 arch/parisc/lib/memset.c
28 delete mode 100644 arch/parisc/lib/string.S
30 --- a/arch/parisc/include/asm/string.h
31 +++ b/arch/parisc/include/asm/string.h
32 @@ -8,19 +8,4 @@ extern void * memset(void *, int, size_t
33 #define __HAVE_ARCH_MEMCPY
34 void * memcpy(void * dest,const void *src,size_t count);
36 -#define __HAVE_ARCH_STRLEN
37 -extern size_t strlen(const char *s);
39 -#define __HAVE_ARCH_STRCPY
40 -extern char *strcpy(char *dest, const char *src);
42 -#define __HAVE_ARCH_STRNCPY
43 -extern char *strncpy(char *dest, const char *src, size_t count);
45 -#define __HAVE_ARCH_STRCAT
46 -extern char *strcat(char *dest, const char *src);
48 -#define __HAVE_ARCH_MEMSET
49 -extern void *memset(void *, int, size_t);
52 --- a/arch/parisc/kernel/parisc_ksyms.c
53 +++ b/arch/parisc/kernel/parisc_ksyms.c
56 #include <linux/string.h>
57 EXPORT_SYMBOL(memset);
58 -EXPORT_SYMBOL(strlen);
59 -EXPORT_SYMBOL(strcpy);
60 -EXPORT_SYMBOL(strncpy);
61 -EXPORT_SYMBOL(strcat);
63 #include <linux/atomic.h>
64 EXPORT_SYMBOL(__xchg8);
65 --- a/arch/parisc/lib/Makefile
66 +++ b/arch/parisc/lib/Makefile
68 # Makefile for parisc-specific library files
71 -lib-y := lusercopy.o bitops.o checksum.o io.o memcpy.o \
72 - ucmpdi2.o delay.o string.o
73 +lib-y := lusercopy.o bitops.o checksum.o io.o memset.o memcpy.o \
78 +++ b/arch/parisc/lib/memset.c
80 +/* SPDX-License-Identifier: GPL-2.0-or-later */
81 +#include <linux/types.h>
82 +#include <asm/string.h>
84 +#define OPSIZ (BITS_PER_LONG/8)
85 +typedef unsigned long op_t;
88 +memset (void *dstpp, int sc, size_t len)
90 + unsigned int c = sc;
91 + long int dstp = (long int) dstpp;
98 + cccc = (unsigned char) c;
100 + cccc |= cccc << 16;
102 + /* Do the shift in two steps to avoid warning if long has 32 bits. */
103 + cccc |= (cccc << 16) << 16;
105 + /* There are at least some bytes to set.
106 + No need to test for LEN == 0 in this alignment loop. */
107 + while (dstp % OPSIZ != 0)
109 + ((unsigned char *) dstp)[0] = c;
114 + /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
115 + xlen = len / (OPSIZ * 8);
118 + ((op_t *) dstp)[0] = cccc;
119 + ((op_t *) dstp)[1] = cccc;
120 + ((op_t *) dstp)[2] = cccc;
121 + ((op_t *) dstp)[3] = cccc;
122 + ((op_t *) dstp)[4] = cccc;
123 + ((op_t *) dstp)[5] = cccc;
124 + ((op_t *) dstp)[6] = cccc;
125 + ((op_t *) dstp)[7] = cccc;
131 + /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
132 + xlen = len / OPSIZ;
135 + ((op_t *) dstp)[0] = cccc;
142 + /* Write the last few bytes. */
145 + ((unsigned char *) dstp)[0] = c;
152 --- a/arch/parisc/lib/string.S
155 -// SPDX-License-Identifier: GPL-2.0
157 - * PA-RISC assembly string functions
159 - * Copyright (C) 2019 Helge Deller <deller@gmx.de>
162 -#include <asm/assembly.h>
163 -#include <linux/linkage.h>
166 - .level PA_ASM_LEVEL
172 -ENTRY_CFI(strlen, frame=0,no_calls)
173 - or,COND(<>) arg0,r0,ret0
174 - b,l,n .Lstrlen_null_ptr,r0
176 - cmpb,COND(<>) arg0,ret0,.Lstrlen_not_aligned
178 - cmpib,tr 0,r0,.Lstrlen_loop
180 -.Lstrlen_not_aligned:
181 - uaddcm arg0,ret0,t1
184 - depwi -1,%sar,32,t0
187 - b,l,n .Lstrlen_end_loop,r0
189 - cmpib,tr 0,r0,.Lstrlen_loop
192 - extrw,u,<> t0,7,8,r0
193 - addib,tr,n -3,ret0,.Lstrlen_out
194 - extrw,u,<> t0,15,8,r0
195 - addib,tr,n -2,ret0,.Lstrlen_out
196 - extrw,u,<> t0,23,8,r0
200 - uaddcm ret0,arg0,ret0
206 -ENTRY_CFI(strcpy, frame=0,no_calls)
222 -ENTRY_CFI(strncpy, frame=0,no_calls)
229 -1: ldo -1(arg2),arg2
230 - cmpb,COND(=),n r0,arg2,2f
237 -ENDPROC_CFI(strncpy)
240 -ENTRY_CFI(strcat, frame=0,no_calls)
258 -ENTRY_CFI(memset, frame=0,no_calls)
260 - cmpb,COND(=) r0,arg0,4f
262 - cmpb,COND(=) r0,arg2,4f
266 - cmpiclr,COND(>=) 0,t1,arg2
268 - extru arg2,31,2,arg0
271 - addib,>= -1,arg0,2b
273 - cmpiclr,COND(<=) 4,arg2,r0
276 - depd,* r0,63,2,arg2
285 - addib,COND(>) -4,arg2,3b