Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
510c72ad | 2 | /* |
1da177e4 LT |
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 | |
510c72ad | 7 | * Copyright (C) 2006 Paul Mundt |
1da177e4 | 8 | */ |
1da177e4 | 9 | #include <linux/linkage.h> |
510c72ad | 10 | #include <asm/page.h> |
1da177e4 | 11 | |
1da177e4 LT |
12 | ENTRY(__clear_user) |
13 | ! | |
14 | mov #0, r0 | |
fea966f7 | 15 | mov #0xffffffe0, r1 |
1da177e4 LT |
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 |