]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - arch/sh/lib/__clear_user.S
Merge branch 'for-5.0' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[mirror_ubuntu-eoan-kernel.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