|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  |  | 
|  | /* | 
|  | * String handling functions for PowerPC32 | 
|  | * | 
|  | * Copyright (C) 1996 Paul Mackerras. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <asm/ppc_asm.h> | 
|  | #include <asm/export.h> | 
|  | #include <asm/cache.h> | 
|  |  | 
|  | .text | 
|  |  | 
|  | CACHELINE_BYTES = L1_CACHE_BYTES | 
|  | LG_CACHELINE_BYTES = L1_CACHE_SHIFT | 
|  | CACHELINE_MASK = (L1_CACHE_BYTES-1) | 
|  |  | 
|  | _GLOBAL(__arch_clear_user) | 
|  | /* | 
|  | * Use dcbz on the complete cache lines in the destination | 
|  | * to set them to zero.  This requires that the destination | 
|  | * area is cacheable. | 
|  | */ | 
|  | cmplwi	cr0, r4, 4 | 
|  | mr	r10, r3 | 
|  | li	r3, 0 | 
|  | blt	7f | 
|  |  | 
|  | 11:	stw	r3, 0(r10) | 
|  | beqlr | 
|  | andi.	r0, r10, 3 | 
|  | add	r11, r0, r4 | 
|  | subf	r6, r0, r10 | 
|  |  | 
|  | clrlwi	r7, r6, 32 - LG_CACHELINE_BYTES | 
|  | add	r8, r7, r11 | 
|  | srwi	r9, r8, LG_CACHELINE_BYTES | 
|  | addic.	r9, r9, -1	/* total number of complete cachelines */ | 
|  | ble	2f | 
|  | xori	r0, r7, CACHELINE_MASK & ~3 | 
|  | srwi.	r0, r0, 2 | 
|  | beq	3f | 
|  | mtctr	r0 | 
|  | 4:	stwu	r3, 4(r6) | 
|  | bdnz	4b | 
|  | 3:	mtctr	r9 | 
|  | li	r7, 4 | 
|  | 10:	dcbz	r7, r6 | 
|  | addi	r6, r6, CACHELINE_BYTES | 
|  | bdnz	10b | 
|  | clrlwi	r11, r8, 32 - LG_CACHELINE_BYTES | 
|  | addi	r11, r11, 4 | 
|  |  | 
|  | 2:	srwi	r0 ,r11 ,2 | 
|  | mtctr	r0 | 
|  | bdz	6f | 
|  | 1:	stwu	r3, 4(r6) | 
|  | bdnz	1b | 
|  | 6:	andi.	r11, r11, 3 | 
|  | beqlr | 
|  | mtctr	r11 | 
|  | addi	r6, r6, 3 | 
|  | 8:	stbu	r3, 1(r6) | 
|  | bdnz	8b | 
|  | blr | 
|  |  | 
|  | 7:	cmpwi	cr0, r4, 0 | 
|  | beqlr | 
|  | mtctr	r4 | 
|  | addi	r6, r10, -1 | 
|  | 9:	stbu	r3, 1(r6) | 
|  | bdnz	9b | 
|  | blr | 
|  |  | 
|  | 90:	mr	r3, r4 | 
|  | blr | 
|  | 91:	add	r3, r10, r4 | 
|  | subf	r3, r6, r3 | 
|  | blr | 
|  |  | 
|  | EX_TABLE(11b, 90b) | 
|  | EX_TABLE(4b, 91b) | 
|  | EX_TABLE(10b, 91b) | 
|  | EX_TABLE(1b, 91b) | 
|  | EX_TABLE(8b, 91b) | 
|  | EX_TABLE(9b, 91b) | 
|  |  | 
|  | EXPORT_SYMBOL(__arch_clear_user) |