Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sparc/lib/copy_in_user.S
10817 views
1
/* copy_in_user.S: Copy from userspace to userspace.
2
*
3
* Copyright (C) 1999, 2000, 2004 David S. Miller ([email protected])
4
*/
5
6
#include <linux/linkage.h>
7
#include <asm/asi.h>
8
9
#define XCC xcc
10
11
#define EX(x,y) \
12
98: x,y; \
13
.section __ex_table,"a";\
14
.align 4; \
15
.word 98b, __retl_one; \
16
.text; \
17
.align 4;
18
19
.register %g2,#scratch
20
.register %g3,#scratch
21
22
.text
23
.align 32
24
25
/* Don't try to get too fancy here, just nice and
26
* simple. This is predominantly used for well aligned
27
* small copies in the compat layer. It is also used
28
* to copy register windows around during thread cloning.
29
*/
30
31
ENTRY(___copy_in_user) /* %o0=dst, %o1=src, %o2=len */
32
cmp %o2, 0
33
be,pn %XCC, 85f
34
or %o0, %o1, %o3
35
cmp %o2, 16
36
bleu,a,pn %XCC, 80f
37
or %o3, %o2, %o3
38
39
/* 16 < len <= 64 */
40
andcc %o3, 0x7, %g0
41
bne,pn %XCC, 90f
42
nop
43
44
andn %o2, 0x7, %o4
45
and %o2, 0x7, %o2
46
1: subcc %o4, 0x8, %o4
47
EX(ldxa [%o1] %asi, %o5)
48
EX(stxa %o5, [%o0] %asi)
49
add %o1, 0x8, %o1
50
bgu,pt %XCC, 1b
51
add %o0, 0x8, %o0
52
andcc %o2, 0x4, %g0
53
be,pt %XCC, 1f
54
nop
55
sub %o2, 0x4, %o2
56
EX(lduwa [%o1] %asi, %o5)
57
EX(stwa %o5, [%o0] %asi)
58
add %o1, 0x4, %o1
59
add %o0, 0x4, %o0
60
1: cmp %o2, 0
61
be,pt %XCC, 85f
62
nop
63
ba,pt %xcc, 90f
64
nop
65
66
80: /* 0 < len <= 16 */
67
andcc %o3, 0x3, %g0
68
bne,pn %XCC, 90f
69
nop
70
71
82:
72
subcc %o2, 4, %o2
73
EX(lduwa [%o1] %asi, %g1)
74
EX(stwa %g1, [%o0] %asi)
75
add %o1, 4, %o1
76
bgu,pt %XCC, 82b
77
add %o0, 4, %o0
78
79
85: retl
80
clr %o0
81
82
.align 32
83
90:
84
subcc %o2, 1, %o2
85
EX(lduba [%o1] %asi, %g1)
86
EX(stba %g1, [%o0] %asi)
87
add %o1, 1, %o1
88
bgu,pt %XCC, 90b
89
add %o0, 1, %o0
90
retl
91
clr %o0
92
ENDPROC(___copy_in_user)
93
94