xref: /linux/arch/powerpc/lib/string_32.S (revision a06c3fad49a50d5d5eb078f93e70f4d3eca5d5a5)
1/* SPDX-License-Identifier: GPL-2.0 */
2
3/*
4 * String handling functions for PowerPC32
5 *
6 * Copyright (C) 1996 Paul Mackerras.
7 *
8 */
9
10#include <linux/export.h>
11#include <asm/ppc_asm.h>
12#include <asm/cache.h>
13
14	.text
15
16CACHELINE_BYTES = L1_CACHE_BYTES
17LG_CACHELINE_BYTES = L1_CACHE_SHIFT
18CACHELINE_MASK = (L1_CACHE_BYTES-1)
19
20_GLOBAL(__arch_clear_user)
21/*
22 * Use dcbz on the complete cache lines in the destination
23 * to set them to zero.  This requires that the destination
24 * area is cacheable.
25 */
26	cmplwi	cr0, r4, 4
27	mr	r10, r3
28	li	r3, 0
29	blt	7f
30
3111:	stw	r3, 0(r10)
32	beqlr
33	andi.	r0, r10, 3
34	add	r11, r0, r4
35	subf	r6, r0, r10
36
37	clrlwi	r7, r6, 32 - LG_CACHELINE_BYTES
38	add	r8, r7, r11
39	srwi	r9, r8, LG_CACHELINE_BYTES
40	addic.	r9, r9, -1	/* total number of complete cachelines */
41	ble	2f
42	xori	r0, r7, CACHELINE_MASK & ~3
43	srwi.	r0, r0, 2
44	beq	3f
45	mtctr	r0
464:	stwu	r3, 4(r6)
47	bdnz	4b
483:	mtctr	r9
49	li	r7, 4
5010:	dcbz	r7, r6
51	addi	r6, r6, CACHELINE_BYTES
52	bdnz	10b
53	clrlwi	r11, r8, 32 - LG_CACHELINE_BYTES
54	addi	r11, r11, 4
55
562:	srwi	r0 ,r11 ,2
57	mtctr	r0
58	bdz	6f
591:	stwu	r3, 4(r6)
60	bdnz	1b
616:	andi.	r11, r11, 3
62	beqlr
63	mtctr	r11
64	addi	r6, r6, 3
658:	stbu	r3, 1(r6)
66	bdnz	8b
67	blr
68
697:	cmpwi	cr0, r4, 0
70	beqlr
71	mtctr	r4
72	addi	r6, r10, -1
739:	stbu	r3, 1(r6)
74	bdnz	9b
75	blr
76
7790:	mr	r3, r4
78	blr
7991:	add	r3, r10, r4
80	subf	r3, r6, r3
81	blr
82
83	EX_TABLE(11b, 90b)
84	EX_TABLE(4b, 91b)
85	EX_TABLE(10b, 91b)
86	EX_TABLE(1b, 91b)
87	EX_TABLE(8b, 91b)
88	EX_TABLE(9b, 91b)
89
90EXPORT_SYMBOL(__arch_clear_user)
91