Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / sh / lib / __clear_user.S
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