1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * String handling functions for PowerPC.
4  *
5  * Copyright (C) 1996 Paul Mackerras.
6  */
7 #include <linux/export.h>
8 #include <asm/processor.h>
9 #include <asm/errno.h>
10 #include <asm/ppc_asm.h>
11 #include <asm/kasan.h>
12 
13 #ifndef CONFIG_KASAN
14 _GLOBAL(__memset16)
15 	rlwimi	r4,r4,16,0,15
16 	/* fall through */
17 
18 _GLOBAL(__memset32)
19 	rldimi	r4,r4,32,0
20 	/* fall through */
21 
22 _GLOBAL(__memset64)
23 	neg	r0,r3
24 	andi.	r0,r0,7
25 	cmplw	cr1,r5,r0
26 	b	.Lms
27 EXPORT_SYMBOL(__memset16)
28 EXPORT_SYMBOL(__memset32)
29 EXPORT_SYMBOL(__memset64)
30 #endif
31 
32 _GLOBAL_KASAN(memset)
33 	neg	r0,r3
34 	rlwimi	r4,r4,8,16,23
35 	andi.	r0,r0,7			/* # bytes to be 8-byte aligned */
36 	rlwimi	r4,r4,16,0,15
37 	cmplw	cr1,r5,r0		/* do we get that far? */
38 	rldimi	r4,r4,32,0
39 .Lms:	PPC_MTOCRF(1,r0)
40 	mr	r6,r3
41 	blt	cr1,8f
42 	beq	3f			/* if already 8-byte aligned */
43 	subf	r5,r0,r5
44 	bf	31,1f
45 	stb	r4,0(r6)
46 	addi	r6,r6,1
47 1:	bf	30,2f
48 	sth	r4,0(r6)
49 	addi	r6,r6,2
50 2:	bf	29,3f
51 	stw	r4,0(r6)
52 	addi	r6,r6,4
53 3:	srdi.	r0,r5,6
54 	clrldi	r5,r5,58
55 	mtctr	r0
56 	beq	5f
57 	.balign 16
58 4:	std	r4,0(r6)
59 	std	r4,8(r6)
60 	std	r4,16(r6)
61 	std	r4,24(r6)
62 	std	r4,32(r6)
63 	std	r4,40(r6)
64 	std	r4,48(r6)
65 	std	r4,56(r6)
66 	addi	r6,r6,64
67 	bdnz	4b
68 5:	srwi.	r0,r5,3
69 	clrlwi	r5,r5,29
70 	PPC_MTOCRF(1,r0)
71 	beq	8f
72 	bf	29,6f
73 	std	r4,0(r6)
74 	std	r4,8(r6)
75 	std	r4,16(r6)
76 	std	r4,24(r6)
77 	addi	r6,r6,32
78 6:	bf	30,7f
79 	std	r4,0(r6)
80 	std	r4,8(r6)
81 	addi	r6,r6,16
82 7:	bf	31,8f
83 	std	r4,0(r6)
84 	addi	r6,r6,8
85 8:	cmpwi	r5,0
86 	PPC_MTOCRF(1,r5)
87 	beqlr
88 	bf	29,9f
89 	stw	r4,0(r6)
90 	addi	r6,r6,4
91 9:	bf	30,10f
92 	sth	r4,0(r6)
93 	addi	r6,r6,2
94 10:	bflr	31
95 	stb	r4,0(r6)
96 	blr
97 EXPORT_SYMBOL(memset)
98 EXPORT_SYMBOL_KASAN(memset)
99 
100 _GLOBAL_TOC_KASAN(memmove)
101 	cmplw	0,r3,r4
102 	bgt	backwards_memcpy
103 	b	memcpy
104 
105 _GLOBAL(backwards_memcpy)
106 	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
107 	add	r6,r3,r5
108 	add	r4,r4,r5
109 	beq	2f
110 	andi.	r0,r6,3
111 	mtctr	r7
112 	bne	5f
113 	.balign 16
114 1:	lwz	r7,-4(r4)
115 	lwzu	r8,-8(r4)
116 	stw	r7,-4(r6)
117 	stwu	r8,-8(r6)
118 	bdnz	1b
119 	andi.	r5,r5,7
120 2:	cmplwi	0,r5,4
121 	blt	3f
122 	lwzu	r0,-4(r4)
123 	subi	r5,r5,4
124 	stwu	r0,-4(r6)
125 3:	cmpwi	0,r5,0
126 	beqlr
127 	mtctr	r5
128 4:	lbzu	r0,-1(r4)
129 	stbu	r0,-1(r6)
130 	bdnz	4b
131 	blr
132 5:	mtctr	r0
133 6:	lbzu	r7,-1(r4)
134 	stbu	r7,-1(r6)
135 	bdnz	6b
136 	subf	r5,r0,r5
137 	rlwinm.	r7,r5,32-3,3,31
138 	beq	2b
139 	mtctr	r7
140 	b	1b
141 EXPORT_SYMBOL(memmove)
142 EXPORT_SYMBOL_KASAN(memmove)
143