Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sh/lib/__clear_user.S
26444 views
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
110
111