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