hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* 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)