Merge tag 'devicetree-for-5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/robh...
[linux-2.6-microblaze.git] / arch / powerpc / lib / string_32.S
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 <asm/ppc_asm.h>
11 #include <asm/export.h>
12 #include <asm/cache.h>
13
14         .text
15
16 CACHELINE_BYTES = L1_CACHE_BYTES
17 LG_CACHELINE_BYTES = L1_CACHE_SHIFT
18 CACHELINE_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
31 11:     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
46 4:      stwu    r3, 4(r6)
47         bdnz    4b
48 3:      mtctr   r9
49         li      r7, 4
50 10:     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
56 2:      srwi    r0 ,r11 ,2
57         mtctr   r0
58         bdz     6f
59 1:      stwu    r3, 4(r6)
60         bdnz    1b
61 6:      andi.   r11, r11, 3
62         beqlr
63         mtctr   r11
64         addi    r6, r6, 3
65 8:      stbu    r3, 1(r6)
66         bdnz    8b
67         blr
68
69 7:      cmpwi   cr0, r4, 0
70         beqlr
71         mtctr   r4
72         addi    r6, r10, -1
73 9:      stbu    r3, 1(r6)
74         bdnz    9b
75         blr
76
77 90:     mr      r3, r4
78         blr
79 91:     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
90 EXPORT_SYMBOL(__arch_clear_user)