diff options
author | Paul Mundt <lethal@linux-sh.org> | 2009-07-27 07:55:46 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-07-27 07:55:46 -0400 |
commit | 221c007b028ebf663ebee4fc90483909547d92a7 (patch) | |
tree | 2ca241511fc008283fdabfcd0a15b641709ed148 /arch/sh/lib/__clear_user.S | |
parent | dfff0fa65ab15db45acd64b3189787d37ab163cd (diff) |
sh: Rename arch/sh/lib/clear_page.S -> __clear_user.S.
Now that this only contains the __clear_user() function, rename it
accordingly.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/lib/__clear_user.S')
-rw-r--r-- | arch/sh/lib/__clear_user.S | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/arch/sh/lib/__clear_user.S b/arch/sh/lib/__clear_user.S new file mode 100644 index 000000000000..bee9817e055d --- /dev/null +++ b/arch/sh/lib/__clear_user.S | |||
@@ -0,0 +1,108 @@ | |||
1 | /* | ||
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 | ||
6 | * Copyright (C) 2006 Paul Mundt | ||
7 | */ | ||
8 | #include <linux/linkage.h> | ||
9 | #include <asm/page.h> | ||
10 | |||
11 | ENTRY(__clear_user) | ||
12 | ! | ||
13 | mov #0, r0 | ||
14 | mov #0xe0, r1 ! 0xffffffe0 | ||
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 | ||