2005-04-17 02:20:36 +04:00
/ * copy_ i n _ u s e r . S : C o p y f r o m u s e r s p a c e t o u s e r s p a c e .
*
* Copyright ( C ) 1 9 9 9 , 2 0 0 0 , 2 0 0 4 D a v i d S . M i l l e r ( d a v e m @redhat.com)
* /
# include < a s m / a s i . h >
# define X C C x c c
# define E X ( x ,y ) \
98 : x,y ; \
.section .fixup ; \
.align 4 ; \
99 : retl; \
mov 1 , % o 0 ; \
2006-03-05 10:23:56 +03:00
.section _ _ ex_ t a b l e ," a " ;\
2005-04-17 02:20:36 +04:00
.align 4 ; \
.word 9 8 b, 9 9 b ; \
.text ; \
.align 4 ;
.register % g2 ,#s c r a t c h
.register % g3 ,#s c r a t c h
.text
.align 32
/ * Don' t t r y t o g e t t o o f a n c y h e r e , j u s t n i c e a n d
* simple. T h i s i s p r e d o m i n a n t l y u s e d f o r w e l l a l i g n e d
* small c o p i e s i n t h e c o m p a t l a y e r . I t i s a l s o u s e d
* to c o p y r e g i s t e r w i n d o w s a r o u n d d u r i n g t h r e a d c l o n i n g .
* /
.globl ___copy_in_user
.type _ _ _ copy_ i n _ u s e r ,#f u n c t i o n
___copy_in_user : /* %o0=dst, %o1=src, %o2=len */
/ * Writing t o % a s i i s _ e x p e n s i v e _ s o w e h a r d c o d e i t .
* Reading % a s i t o c h e c k f o r K E R N E L _ D S i s c o m p a r a t i v e l y
* cheap.
* /
rd % a s i , % g 1
cmp % g 1 , A S I _ A I U S
bne,p n % i c c , m e m c p y _ u s e r _ s t u b
nop
cmp % o 2 , 0
be,p n % X C C , 8 5 f
or % o 0 , % o 1 , % o 3
cmp % o 2 , 1 6
bleu,a ,p n % X C C , 8 0 f
or % o 3 , % o 2 , % o 3
/* 16 < len <= 64 */
andcc % o 3 , 0 x7 , % g 0
bne,p n % X C C , 9 0 f
sub % o 0 , % o 1 , % o 3
andn % o 2 , 0 x7 , % o 4
and % o 2 , 0 x7 , % o 2
1 : subcc % o 4 , 0 x8 , % o 4
EX( l d x a [ % o 1 ] % a s i , % o 5 )
EX( s t x a % o 5 , [ % o 1 + % o 3 ] A S I _ A I U S )
bgu,p t % X C C , 1 b
add % o 1 , 0 x8 , % o 1
andcc % o 2 , 0 x4 , % g 0
be,p t % X C C , 1 f
nop
sub % o 2 , 0 x4 , % o 2
EX( l d u w a [ % o 1 ] % a s i , % o 5 )
EX( s t w a % o 5 , [ % o 1 + % o 3 ] A S I _ A I U S )
add % o 1 , 0 x4 , % o 1
1 : cmp % o 2 , 0
be,p t % X C C , 8 5 f
nop
ba,p t % x c c , 9 0 f
nop
80 : /* 0 < len <= 16 */
andcc % o 3 , 0 x3 , % g 0
bne,p n % X C C , 9 0 f
sub % o 0 , % o 1 , % o 3
82 :
subcc % o 2 , 4 , % o 2
EX( l d u w a [ % o 1 ] % a s i , % g 1 )
EX( s t w a % g 1 , [ % o 1 + % o 3 ] A S I _ A I U S )
bgu,p t % X C C , 8 2 b
add % o 1 , 4 , % o 1
85 : retl
clr % o 0
.align 32
90 :
subcc % o 2 , 1 , % o 2
EX( l d u b a [ % o 1 ] % a s i , % g 1 )
EX( s t b a % g 1 , [ % o 1 + % o 3 ] A S I _ A I U S )
bgu,p t % X C C , 9 0 b
add % o 1 , 1 , % o 1
retl
clr % o 0
.size _ _ _ copy_ i n _ u s e r , . - _ _ _ c o p y _ i n _ u s e r
/ * Act l i k e c o p y _ { t o ,i n } _ u s e r ( ) , i e . r e t u r n z e r o i n s t e a d
* of o r i g i n a l d e s t i n a t i o n p o i n t e r . T h i s i s i n v o k e d w h e n
* copy_ { t o ,i n } _ u s e r ( ) f i n d s t h a t % a s i i s k e r n e l s p a c e .
* /
.globl memcpy_user_stub
.type memcpy_ u s e r _ s t u b ,#f u n c t i o n
memcpy_user_stub :
save % s p , - 1 9 2 , % s p
mov % i 0 , % o 0
mov % i 1 , % o 1
call m e m c p y
mov % i 2 , % o 2
ret
restore % g 0 , % g 0 , % o 0
.size memcpy_ u s e r _ s t u b , . - m e m c p y _ u s e r _ s t u b