]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob
664eeb8f4cd9215f1b1896316b0fe8434aa8059b
[thirdparty/kernel/stable-queue.git] /
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"
5
6 From: Helge Deller <deller@gmx.de>
7
8 commit f6a3308d6feb351d9854eb8b3f6289a1ac163125 upstream.
9
10 This reverts commit 83af58f8068ea3f7b3c537c37a30887bfa585069.
11
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.
14
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>
20 ---
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
29
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);
35
36 -#define __HAVE_ARCH_STRLEN
37 -extern size_t strlen(const char *s);
38 -
39 -#define __HAVE_ARCH_STRCPY
40 -extern char *strcpy(char *dest, const char *src);
41 -
42 -#define __HAVE_ARCH_STRNCPY
43 -extern char *strncpy(char *dest, const char *src, size_t count);
44 -
45 -#define __HAVE_ARCH_STRCAT
46 -extern char *strcat(char *dest, const char *src);
47 -
48 -#define __HAVE_ARCH_MEMSET
49 -extern void *memset(void *, int, size_t);
50 -
51 #endif
52 --- a/arch/parisc/kernel/parisc_ksyms.c
53 +++ b/arch/parisc/kernel/parisc_ksyms.c
54 @@ -17,10 +17,6 @@
55
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);
62
63 #include <linux/atomic.h>
64 EXPORT_SYMBOL(__xchg8);
65 --- a/arch/parisc/lib/Makefile
66 +++ b/arch/parisc/lib/Makefile
67 @@ -3,7 +3,7 @@
68 # Makefile for parisc-specific library files
69 #
70
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 \
74 + ucmpdi2.o delay.o
75
76 obj-y := iomap.o
77 --- /dev/null
78 +++ b/arch/parisc/lib/memset.c
79 @@ -0,0 +1,72 @@
80 +/* SPDX-License-Identifier: GPL-2.0-or-later */
81 +#include <linux/types.h>
82 +#include <asm/string.h>
83 +
84 +#define OPSIZ (BITS_PER_LONG/8)
85 +typedef unsigned long op_t;
86 +
87 +void *
88 +memset (void *dstpp, int sc, size_t len)
89 +{
90 + unsigned int c = sc;
91 + long int dstp = (long int) dstpp;
92 +
93 + if (len >= 8)
94 + {
95 + size_t xlen;
96 + op_t cccc;
97 +
98 + cccc = (unsigned char) c;
99 + cccc |= cccc << 8;
100 + cccc |= cccc << 16;
101 + if (OPSIZ > 4)
102 + /* Do the shift in two steps to avoid warning if long has 32 bits. */
103 + cccc |= (cccc << 16) << 16;
104 +
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)
108 + {
109 + ((unsigned char *) dstp)[0] = c;
110 + dstp += 1;
111 + len -= 1;
112 + }
113 +
114 + /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
115 + xlen = len / (OPSIZ * 8);
116 + while (xlen > 0)
117 + {
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;
126 + dstp += 8 * OPSIZ;
127 + xlen -= 1;
128 + }
129 + len %= OPSIZ * 8;
130 +
131 + /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
132 + xlen = len / OPSIZ;
133 + while (xlen > 0)
134 + {
135 + ((op_t *) dstp)[0] = cccc;
136 + dstp += OPSIZ;
137 + xlen -= 1;
138 + }
139 + len %= OPSIZ;
140 + }
141 +
142 + /* Write the last few bytes. */
143 + while (len > 0)
144 + {
145 + ((unsigned char *) dstp)[0] = c;
146 + dstp += 1;
147 + len -= 1;
148 + }
149 +
150 + return dstpp;
151 +}
152 --- a/arch/parisc/lib/string.S
153 +++ /dev/null
154 @@ -1,136 +0,0 @@
155 -// SPDX-License-Identifier: GPL-2.0
156 -/*
157 - * PA-RISC assembly string functions
158 - *
159 - * Copyright (C) 2019 Helge Deller <deller@gmx.de>
160 - */
161 -
162 -#include <asm/assembly.h>
163 -#include <linux/linkage.h>
164 -
165 - .section .text.hot
166 - .level PA_ASM_LEVEL
167 -
168 - t0 = r20
169 - t1 = r21
170 - t2 = r22
171 -
172 -ENTRY_CFI(strlen, frame=0,no_calls)
173 - or,COND(<>) arg0,r0,ret0
174 - b,l,n .Lstrlen_null_ptr,r0
175 - depwi 0,31,2,ret0
176 - cmpb,COND(<>) arg0,ret0,.Lstrlen_not_aligned
177 - ldw,ma 4(ret0),t0
178 - cmpib,tr 0,r0,.Lstrlen_loop
179 - uxor,nbz r0,t0,r0
180 -.Lstrlen_not_aligned:
181 - uaddcm arg0,ret0,t1
182 - shladd t1,3,r0,t1
183 - mtsar t1
184 - depwi -1,%sar,32,t0
185 - uxor,nbz r0,t0,r0
186 -.Lstrlen_loop:
187 - b,l,n .Lstrlen_end_loop,r0
188 - ldw,ma 4(ret0),t0
189 - cmpib,tr 0,r0,.Lstrlen_loop
190 - uxor,nbz r0,t0,r0
191 -.Lstrlen_end_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
197 - addi -1,ret0,ret0
198 -.Lstrlen_out:
199 - bv r0(rp)
200 - uaddcm ret0,arg0,ret0
201 -.Lstrlen_null_ptr:
202 - bv,n r0(rp)
203 -ENDPROC_CFI(strlen)
204 -
205 -
206 -ENTRY_CFI(strcpy, frame=0,no_calls)
207 - ldb 0(arg1),t0
208 - stb t0,0(arg0)
209 - ldo 0(arg0),ret0
210 - ldo 1(arg1),t1
211 - cmpb,= r0,t0,2f
212 - ldo 1(arg0),t2
213 -1: ldb 0(t1),arg1
214 - stb arg1,0(t2)
215 - ldo 1(t1),t1
216 - cmpb,<> r0,arg1,1b
217 - ldo 1(t2),t2
218 -2: bv,n r0(rp)
219 -ENDPROC_CFI(strcpy)
220 -
221 -
222 -ENTRY_CFI(strncpy, frame=0,no_calls)
223 - ldb 0(arg1),t0
224 - stb t0,0(arg0)
225 - ldo 1(arg1),t1
226 - ldo 0(arg0),ret0
227 - cmpb,= r0,t0,2f
228 - ldo 1(arg0),arg1
229 -1: ldo -1(arg2),arg2
230 - cmpb,COND(=),n r0,arg2,2f
231 - ldb 0(t1),arg0
232 - stb arg0,0(arg1)
233 - ldo 1(t1),t1
234 - cmpb,<> r0,arg0,1b
235 - ldo 1(arg1),arg1
236 -2: bv,n r0(rp)
237 -ENDPROC_CFI(strncpy)
238 -
239 -
240 -ENTRY_CFI(strcat, frame=0,no_calls)
241 - ldb 0(arg0),t0
242 - cmpb,= t0,r0,2f
243 - ldo 0(arg0),ret0
244 - ldo 1(arg0),arg0
245 -1: ldb 0(arg0),t1
246 - cmpb,<>,n r0,t1,1b
247 - ldo 1(arg0),arg0
248 -2: ldb 0(arg1),t2
249 - stb t2,0(arg0)
250 - ldo 1(arg0),arg0
251 - ldb 0(arg1),t0
252 - cmpb,<> r0,t0,2b
253 - ldo 1(arg1),arg1
254 - bv,n r0(rp)
255 -ENDPROC_CFI(strcat)
256 -
257 -
258 -ENTRY_CFI(memset, frame=0,no_calls)
259 - copy arg0,ret0
260 - cmpb,COND(=) r0,arg0,4f
261 - copy arg0,t2
262 - cmpb,COND(=) r0,arg2,4f
263 - ldo -1(arg2),arg3
264 - subi -1,arg3,t0
265 - subi 0,t0,t1
266 - cmpiclr,COND(>=) 0,t1,arg2
267 - ldo -1(t1),arg2
268 - extru arg2,31,2,arg0
269 -2: stb arg1,0(t2)
270 - ldo 1(t2),t2
271 - addib,>= -1,arg0,2b
272 - ldo -1(arg3),arg3
273 - cmpiclr,COND(<=) 4,arg2,r0
274 - b,l,n 4f,r0
275 -#ifdef CONFIG_64BIT
276 - depd,* r0,63,2,arg2
277 -#else
278 - depw r0,31,2,arg2
279 -#endif
280 - ldo 1(t2),t2
281 -3: stb arg1,-1(t2)
282 - stb arg1,0(t2)
283 - stb arg1,1(t2)
284 - stb arg1,2(t2)
285 - addib,COND(>) -4,arg2,3b
286 - ldo 4(t2),t2
287 -4: bv,n r0(rp)
288 -ENDPROC_CFI(memset)
289 -
290 - .end