162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * String handling functions for PowerPC32
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1996 Paul Mackerras.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/export.h>
1162306a36Sopenharmony_ci#include <asm/ppc_asm.h>
1262306a36Sopenharmony_ci#include <asm/cache.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci	.text
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciCACHELINE_BYTES = L1_CACHE_BYTES
1762306a36Sopenharmony_ciLG_CACHELINE_BYTES = L1_CACHE_SHIFT
1862306a36Sopenharmony_ciCACHELINE_MASK = (L1_CACHE_BYTES-1)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci_GLOBAL(__arch_clear_user)
2162306a36Sopenharmony_ci/*
2262306a36Sopenharmony_ci * Use dcbz on the complete cache lines in the destination
2362306a36Sopenharmony_ci * to set them to zero.  This requires that the destination
2462306a36Sopenharmony_ci * area is cacheable.
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ci	cmplwi	cr0, r4, 4
2762306a36Sopenharmony_ci	mr	r10, r3
2862306a36Sopenharmony_ci	li	r3, 0
2962306a36Sopenharmony_ci	blt	7f
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci11:	stw	r3, 0(r10)
3262306a36Sopenharmony_ci	beqlr
3362306a36Sopenharmony_ci	andi.	r0, r10, 3
3462306a36Sopenharmony_ci	add	r11, r0, r4
3562306a36Sopenharmony_ci	subf	r6, r0, r10
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	clrlwi	r7, r6, 32 - LG_CACHELINE_BYTES
3862306a36Sopenharmony_ci	add	r8, r7, r11
3962306a36Sopenharmony_ci	srwi	r9, r8, LG_CACHELINE_BYTES
4062306a36Sopenharmony_ci	addic.	r9, r9, -1	/* total number of complete cachelines */
4162306a36Sopenharmony_ci	ble	2f
4262306a36Sopenharmony_ci	xori	r0, r7, CACHELINE_MASK & ~3
4362306a36Sopenharmony_ci	srwi.	r0, r0, 2
4462306a36Sopenharmony_ci	beq	3f
4562306a36Sopenharmony_ci	mtctr	r0
4662306a36Sopenharmony_ci4:	stwu	r3, 4(r6)
4762306a36Sopenharmony_ci	bdnz	4b
4862306a36Sopenharmony_ci3:	mtctr	r9
4962306a36Sopenharmony_ci	li	r7, 4
5062306a36Sopenharmony_ci10:	dcbz	r7, r6
5162306a36Sopenharmony_ci	addi	r6, r6, CACHELINE_BYTES
5262306a36Sopenharmony_ci	bdnz	10b
5362306a36Sopenharmony_ci	clrlwi	r11, r8, 32 - LG_CACHELINE_BYTES
5462306a36Sopenharmony_ci	addi	r11, r11, 4
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci2:	srwi	r0 ,r11 ,2
5762306a36Sopenharmony_ci	mtctr	r0
5862306a36Sopenharmony_ci	bdz	6f
5962306a36Sopenharmony_ci1:	stwu	r3, 4(r6)
6062306a36Sopenharmony_ci	bdnz	1b
6162306a36Sopenharmony_ci6:	andi.	r11, r11, 3
6262306a36Sopenharmony_ci	beqlr
6362306a36Sopenharmony_ci	mtctr	r11
6462306a36Sopenharmony_ci	addi	r6, r6, 3
6562306a36Sopenharmony_ci8:	stbu	r3, 1(r6)
6662306a36Sopenharmony_ci	bdnz	8b
6762306a36Sopenharmony_ci	blr
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci7:	cmpwi	cr0, r4, 0
7062306a36Sopenharmony_ci	beqlr
7162306a36Sopenharmony_ci	mtctr	r4
7262306a36Sopenharmony_ci	addi	r6, r10, -1
7362306a36Sopenharmony_ci9:	stbu	r3, 1(r6)
7462306a36Sopenharmony_ci	bdnz	9b
7562306a36Sopenharmony_ci	blr
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci90:	mr	r3, r4
7862306a36Sopenharmony_ci	blr
7962306a36Sopenharmony_ci91:	add	r3, r10, r4
8062306a36Sopenharmony_ci	subf	r3, r6, r3
8162306a36Sopenharmony_ci	blr
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	EX_TABLE(11b, 90b)
8462306a36Sopenharmony_ci	EX_TABLE(4b, 91b)
8562306a36Sopenharmony_ci	EX_TABLE(10b, 91b)
8662306a36Sopenharmony_ci	EX_TABLE(1b, 91b)
8762306a36Sopenharmony_ci	EX_TABLE(8b, 91b)
8862306a36Sopenharmony_ci	EX_TABLE(9b, 91b)
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciEXPORT_SYMBOL(__arch_clear_user)
91