2005-04-16 15:20:36 -07:00
/ *
* arch/ a l p h a / l i b / c o p y _ u s e r . S
*
* Copy t o / f r o m u s e r s p a c e , h a n d l i n g e x c e p t i o n s a s w e g o . . T h i s
* isn' t e x a c t l y p r e t t y .
*
* This i s e s s e n t i a l l y t h e s a m e a s " m e m c p y ( ) " , b u t w i t h a f e w t w i s t s .
* Notably, w e h a v e t o m a k e s u r e t h a t $ 0 i s a l w a y s u p - t o - d a t e a n d
* contains t h e r i g h t " b y t e s l e f t t o c o p y " v a l u e ( a n d t h a t i t i s u p d a t e d
* only _ a f t e r _ a s u c c e s s f u l c o p y ) . T h e r e i s a l s o s o m e r a t h e r m i n o r
* exception s e t u p s t u f f . .
*
* NOTE! T h i s i s n o t d i r e c t l y C - c a l l a b l e , b e c a u s e t h e c a l l i n g s e m a n t i c s a r e
* different :
*
* Inputs :
* length i n $ 0
* destination a d d r e s s i n $ 6
* source a d d r e s s i n $ 7
* return a d d r e s s i n $ 2 8
*
* Outputs :
* bytes l e f t t o c o p y i n $ 0
*
* Clobbers :
* $ 1 , $ 2 , $ 3 , $ 4 , $ 5 , $ 6 , $ 7
* /
2016-01-11 09:51:29 -05:00
# include < a s m / e x p o r t . h >
2005-04-16 15:20:36 -07:00
/* Allow an exception for an insn; exit if we get one. */
# define E X I ( x ,y . . . ) \
99 : x,## y ; \
.section _ _ ex_ t a b l e ," a " ; \
.long 99b - . ; \
lda $ 3 1 , $ e x i t i n - 9 9 b ( $ 3 1 ) ; \
.previous
# define E X O ( x ,y . . . ) \
99 : x,## y ; \
.section _ _ ex_ t a b l e ," a " ; \
.long 99b - . ; \
lda $ 3 1 , $ e x i t o u t - 9 9 b ( $ 3 1 ) ; \
.previous
.set noat
.align 4
.globl __copy_user
.ent __copy_user
__copy_user :
.prologue 0
and $ 6 ,7 ,$ 3
beq $ 0 ,$ 3 5
beq $ 3 ,$ 3 6
subq $ 3 ,8 ,$ 3
.align 4
$ 37 :
EXI( l d q _ u $ 1 ,0 ( $ 7 ) )
EXO( l d q _ u $ 2 ,0 ( $ 6 ) )
extbl $ 1 ,$ 7 ,$ 1
mskbl $ 2 ,$ 6 ,$ 2
insbl $ 1 ,$ 6 ,$ 1
addq $ 3 ,1 ,$ 3
bis $ 1 ,$ 2 ,$ 1
EXO( s t q _ u $ 1 ,0 ( $ 6 ) )
subq $ 0 ,1 ,$ 0
addq $ 6 ,1 ,$ 6
addq $ 7 ,1 ,$ 7
beq $ 0 ,$ 4 1
bne $ 3 ,$ 3 7
$ 36 :
and $ 7 ,7 ,$ 1
bic $ 0 ,7 ,$ 4
beq $ 1 ,$ 4 3
beq $ 4 ,$ 4 8
EXI( l d q _ u $ 3 ,0 ( $ 7 ) )
.align 4
$ 50 :
EXI( l d q _ u $ 2 ,8 ( $ 7 ) )
subq $ 4 ,8 ,$ 4
extql $ 3 ,$ 7 ,$ 3
extqh $ 2 ,$ 7 ,$ 1
bis $ 3 ,$ 1 ,$ 1
EXO( s t q $ 1 ,0 ( $ 6 ) )
addq $ 7 ,8 ,$ 7
subq $ 0 ,8 ,$ 0
addq $ 6 ,8 ,$ 6
bis $ 2 ,$ 2 ,$ 3
bne $ 4 ,$ 5 0
$ 48 :
beq $ 0 ,$ 4 1
.align 4
$ 57 :
EXI( l d q _ u $ 1 ,0 ( $ 7 ) )
EXO( l d q _ u $ 2 ,0 ( $ 6 ) )
extbl $ 1 ,$ 7 ,$ 1
mskbl $ 2 ,$ 6 ,$ 2
insbl $ 1 ,$ 6 ,$ 1
bis $ 1 ,$ 2 ,$ 1
EXO( s t q _ u $ 1 ,0 ( $ 6 ) )
subq $ 0 ,1 ,$ 0
addq $ 6 ,1 ,$ 6
addq $ 7 ,1 ,$ 7
bne $ 0 ,$ 5 7
br $ 3 1 ,$ 4 1
.align 4
$ 43 :
beq $ 4 ,$ 6 5
.align 4
$ 66 :
EXI( l d q $ 1 ,0 ( $ 7 ) )
subq $ 4 ,8 ,$ 4
EXO( s t q $ 1 ,0 ( $ 6 ) )
addq $ 7 ,8 ,$ 7
subq $ 0 ,8 ,$ 0
addq $ 6 ,8 ,$ 6
bne $ 4 ,$ 6 6
$ 65 :
beq $ 0 ,$ 4 1
EXI( l d q $ 2 ,0 ( $ 7 ) )
EXO( l d q $ 1 ,0 ( $ 6 ) )
mskql $ 2 ,$ 0 ,$ 2
mskqh $ 1 ,$ 0 ,$ 1
bis $ 2 ,$ 1 ,$ 2
EXO( s t q $ 2 ,0 ( $ 6 ) )
bis $ 3 1 ,$ 3 1 ,$ 0
$ 41 :
$ 35 :
$ exitin :
2016-09-10 16:21:34 -04:00
$ exitout :
2005-04-16 15:20:36 -07:00
ret $ 3 1 ,( $ 2 8 ) ,1
.end __copy_user
2016-01-11 09:51:29 -05:00
EXPORT_ S Y M B O L ( _ _ c o p y _ u s e r )