Merge tag 'v3.3.7' into 3.3/master
[zen-stable.git] / arch / sh / lib / __clear_user.S
blobdb1dca7aad14e04fe19d3d0b079df0e05e4fa24f
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>
11 ENTRY(__clear_user)
12         !
13         mov     #0, r0
14         mov     #0xffffffe0, r1
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
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
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