2005-04-16 15:20:36 -07:00
/ *
* _ _ put_ u s e r f u n c t i o n s .
*
* ( C) C o p y r i g h t 2 0 0 5 L i n u s T o r v a l d s
2008-06-24 17:40:14 -03:00
* ( C) C o p y r i g h t 2 0 0 5 A n d i K l e e n
* ( C) C o p y r i g h t 2 0 0 8 G l a u b e r C o s t a
2005-04-16 15:20:36 -07:00
*
* These f u n c t i o n s h a v e a n o n - s t a n d a r d c a l l i n t e r f a c e
* to m a k e t h e m m o r e e f f i c i e n t , e s p e c i a l l y a s t h e y
* return a n e r r o r v a l u e i n a d d i t i o n t o t h e " r e a l "
* return v a l u e .
* /
2007-05-02 19:27:05 +02:00
# include < l i n u x / l i n k a g e . h >
# include < a s m / d w a r f2 . h >
2005-04-16 15:20:36 -07:00
# include < a s m / t h r e a d _ i n f o . h >
2008-06-24 17:40:14 -03:00
# include < a s m / e r r n o . h >
2008-06-24 17:36:31 -03:00
# include < a s m / a s m . h >
2012-09-21 12:43:12 -07:00
# include < a s m / s m a p . h >
2005-04-16 15:20:36 -07:00
/ *
* _ _ put_ u s e r _ X
*
* Inputs : % eax[ : % e d x ] c o n t a i n s t h e d a t a
* % ecx c o n t a i n s t h e a d d r e s s
*
* Outputs : % eax i s e r r o r c o d e ( 0 o r - E F A U L T )
*
* These f u n c t i o n s s h o u l d n o t m o d i f y a n y o t h e r r e g i s t e r s ,
* as t h e y g e t c a l l e d f r o m w i t h i n i n l i n e a s s e m b l y .
* /
2007-05-02 19:27:05 +02:00
# define E N T E R C F I _ S T A R T P R O C ; \
2008-06-24 17:36:31 -03:00
GET_ T H R E A D _ I N F O ( % _ A S M _ B X )
2012-09-21 12:43:12 -07:00
# define E X I T A S M _ C L A C ; \
ret ; \
2007-05-02 19:27:05 +02:00
CFI_ E N D P R O C
2005-04-16 15:20:36 -07:00
.text
2007-05-02 19:27:05 +02:00
ENTRY( _ _ p u t _ u s e r _ 1 )
2005-04-16 15:20:36 -07:00
ENTER
2008-06-24 17:36:31 -03:00
cmp T I _ a d d r _ l i m i t ( % _ A S M _ B X ) ,% _ A S M _ C X
2005-04-16 15:20:36 -07:00
jae b a d _ p u t _ u s e r
2012-09-21 12:43:12 -07:00
ASM_ S T A C
2008-06-24 17:36:31 -03:00
1 : movb % a l ,( % _ A S M _ C X )
2008-06-24 16:59:05 -03:00
xor % e a x ,% e a x
2005-04-16 15:20:36 -07:00
EXIT
2007-05-02 19:27:05 +02:00
ENDPROC( _ _ p u t _ u s e r _ 1 )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:05 +02:00
ENTRY( _ _ p u t _ u s e r _ 2 )
2005-04-16 15:20:36 -07:00
ENTER
2008-06-24 17:36:31 -03:00
mov T I _ a d d r _ l i m i t ( % _ A S M _ B X ) ,% _ A S M _ B X
sub $ 1 ,% _ A S M _ B X
cmp % _ A S M _ B X ,% _ A S M _ C X
2005-04-16 15:20:36 -07:00
jae b a d _ p u t _ u s e r
2012-09-21 12:43:12 -07:00
ASM_ S T A C
2008-06-24 17:36:31 -03:00
2 : movw % a x ,( % _ A S M _ C X )
2008-06-24 16:59:05 -03:00
xor % e a x ,% e a x
2005-04-16 15:20:36 -07:00
EXIT
2007-05-02 19:27:05 +02:00
ENDPROC( _ _ p u t _ u s e r _ 2 )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:05 +02:00
ENTRY( _ _ p u t _ u s e r _ 4 )
2005-04-16 15:20:36 -07:00
ENTER
2008-06-24 17:36:31 -03:00
mov T I _ a d d r _ l i m i t ( % _ A S M _ B X ) ,% _ A S M _ B X
sub $ 3 ,% _ A S M _ B X
cmp % _ A S M _ B X ,% _ A S M _ C X
2005-04-16 15:20:36 -07:00
jae b a d _ p u t _ u s e r
2012-09-21 12:43:12 -07:00
ASM_ S T A C
2008-06-24 17:36:31 -03:00
3 : movl % e a x ,( % _ A S M _ C X )
2008-06-24 16:59:05 -03:00
xor % e a x ,% e a x
2005-04-16 15:20:36 -07:00
EXIT
2007-05-02 19:27:05 +02:00
ENDPROC( _ _ p u t _ u s e r _ 4 )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:05 +02:00
ENTRY( _ _ p u t _ u s e r _ 8 )
2005-04-16 15:20:36 -07:00
ENTER
2008-06-24 17:36:31 -03:00
mov T I _ a d d r _ l i m i t ( % _ A S M _ B X ) ,% _ A S M _ B X
sub $ 7 ,% _ A S M _ B X
cmp % _ A S M _ B X ,% _ A S M _ C X
2005-04-16 15:20:36 -07:00
jae b a d _ p u t _ u s e r
2012-09-21 12:43:12 -07:00
ASM_ S T A C
2008-06-24 17:40:14 -03:00
4 : mov % _ A S M _ A X ,( % _ A S M _ C X )
# ifdef C O N F I G _ X 8 6 _ 3 2
2008-06-24 17:36:31 -03:00
5 : movl % e d x ,4 ( % _ A S M _ C X )
2008-06-24 17:40:14 -03:00
# endif
2008-06-24 16:59:05 -03:00
xor % e a x ,% e a x
2005-04-16 15:20:36 -07:00
EXIT
2007-05-02 19:27:05 +02:00
ENDPROC( _ _ p u t _ u s e r _ 8 )
2005-04-16 15:20:36 -07:00
bad_put_user :
2008-06-24 12:40:55 -03:00
CFI_ S T A R T P R O C
2008-06-24 17:40:14 -03:00
movl $ - E F A U L T ,% e a x
2005-04-16 15:20:36 -07:00
EXIT
2007-05-02 19:27:05 +02:00
END( b a d _ p u t _ u s e r )
2005-04-16 15:20:36 -07:00
2012-04-20 12:19:52 -07:00
_ ASM_ E X T A B L E ( 1 b ,b a d _ p u t _ u s e r )
_ ASM_ E X T A B L E ( 2 b ,b a d _ p u t _ u s e r )
_ ASM_ E X T A B L E ( 3 b ,b a d _ p u t _ u s e r )
_ ASM_ E X T A B L E ( 4 b ,b a d _ p u t _ u s e r )
2008-06-24 17:40:14 -03:00
# ifdef C O N F I G _ X 8 6 _ 3 2
2012-04-20 12:19:52 -07:00
_ ASM_ E X T A B L E ( 5 b ,b a d _ p u t _ u s e r )
2008-06-24 17:40:14 -03:00
# endif