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

source code of linux/arch/powerpc/lib/string_32.S