1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * __clear_user_page, __clear_user, clear_page implementation of SuperH |
4 | * |
5 | * Copyright (C) 2001 Kaz Kojima |
6 | * Copyright (C) 2001, 2002 Niibe Yutaka |
7 | * Copyright (C) 2006 Paul Mundt |
8 | */ |
9 | #include <linux/linkage.h> |
10 | #include <asm/page.h> |
11 | |
12 | ENTRY(__clear_user) |
13 | ! |
14 | mov #0, r0 |
15 | mov #0xffffffe0, r1 |
16 | ! |
17 | ! r4..(r4+31)&~32 -------- not aligned [ Area 0 ] |
18 | ! (r4+31)&~32..(r4+r5)&~32 -------- aligned [ Area 1 ] |
19 | ! (r4+r5)&~32..r4+r5 -------- not aligned [ Area 2 ] |
20 | ! |
21 | ! Clear area 0 |
22 | mov r4, r2 |
23 | ! |
24 | tst r1, r5 ! length < 32 |
25 | bt .Larea2 ! skip to remainder |
26 | ! |
27 | add #31, r2 |
28 | and r1, r2 |
29 | cmp/eq r4, r2 |
30 | bt .Larea1 |
31 | mov r2, r3 |
32 | sub r4, r3 |
33 | mov r3, r7 |
34 | mov r4, r2 |
35 | ! |
36 | .L0: dt r3 |
37 | 0: mov.b r0, @r2 |
38 | bf/s .L0 |
39 | add #1, r2 |
40 | ! |
41 | sub r7, r5 |
42 | mov r2, r4 |
43 | .Larea1: |
44 | mov r4, r3 |
45 | add r5, r3 |
46 | and r1, r3 |
47 | cmp/hi r2, r3 |
48 | bf .Larea2 |
49 | ! |
50 | ! Clear area 1 |
51 | #if defined(CONFIG_CPU_SH4) |
52 | 1: movca.l r0, @r2 |
53 | #else |
54 | 1: mov.l r0, @r2 |
55 | #endif |
56 | add #4, r2 |
57 | 2: mov.l r0, @r2 |
58 | add #4, r2 |
59 | 3: mov.l r0, @r2 |
60 | add #4, r2 |
61 | 4: mov.l r0, @r2 |
62 | add #4, r2 |
63 | 5: mov.l r0, @r2 |
64 | add #4, r2 |
65 | 6: mov.l r0, @r2 |
66 | add #4, r2 |
67 | 7: mov.l r0, @r2 |
68 | add #4, r2 |
69 | 8: mov.l r0, @r2 |
70 | add #4, r2 |
71 | cmp/hi r2, r3 |
72 | bt/s 1b |
73 | nop |
74 | ! |
75 | ! Clear area 2 |
76 | .Larea2: |
77 | mov r4, r3 |
78 | add r5, r3 |
79 | cmp/hs r3, r2 |
80 | bt/s .Ldone |
81 | sub r2, r3 |
82 | .L2: dt r3 |
83 | 9: mov.b r0, @r2 |
84 | bf/s .L2 |
85 | add #1, r2 |
86 | ! |
87 | .Ldone: rts |
88 | mov #0, r0 ! return 0 as normal return |
89 | |
90 | ! return the number of bytes remained |
91 | .Lbad_clear_user: |
92 | mov r4, r0 |
93 | add r5, r0 |
94 | rts |
95 | sub r2, r0 |
96 | |
97 | .section __ex_table,"a" |
98 | .align 2 |
99 | .long 0b, .Lbad_clear_user |
100 | .long 1b, .Lbad_clear_user |
101 | .long 2b, .Lbad_clear_user |
102 | .long 3b, .Lbad_clear_user |
103 | .long 4b, .Lbad_clear_user |
104 | .long 5b, .Lbad_clear_user |
105 | .long 6b, .Lbad_clear_user |
106 | .long 7b, .Lbad_clear_user |
107 | .long 8b, .Lbad_clear_user |
108 | .long 9b, .Lbad_clear_user |
109 | .previous |
110 | |