2005-04-16 15:20:36 -07:00
/ *
* _ _ get_ u s e r f u n c t i o n s .
*
* ( C) C o p y r i g h t 1 9 9 8 L i n u s T o r v a l d s
*
* 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 >
/ *
* _ _ get_ u s e r _ X
*
* Inputs : % eax 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 )
* % edx c o n t a i n s z e r o - e x t e n d e d v a l u e
*
* 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 .
* /
.text
2007-05-02 19:27:05 +02:00
ENTRY( _ _ g e t _ u s e r _ 1 )
CFI_ S T A R T P R O C
2005-04-16 15:20:36 -07:00
GET_ T H R E A D _ I N F O ( % e d x )
cmpl T I _ a d d r _ l i m i t ( % e d x ) ,% e a x
jae b a d _ g e t _ u s e r
1 : movzbl ( % e a x ) ,% e d x
xorl % e a x ,% e a x
ret
2007-05-02 19:27:05 +02:00
CFI_ E N D P R O C
ENDPROC( _ _ g e t _ u s e r _ 1 )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:05 +02:00
ENTRY( _ _ g e t _ u s e r _ 2 )
CFI_ S T A R T P R O C
2005-04-16 15:20:36 -07:00
addl $ 1 ,% e a x
jc b a d _ g e t _ u s e r
GET_ T H R E A D _ I N F O ( % e d x )
cmpl T I _ a d d r _ l i m i t ( % e d x ) ,% e a x
jae b a d _ g e t _ u s e r
2 : movzwl - 1 ( % e a x ) ,% e d x
xorl % e a x ,% e a x
ret
2007-05-02 19:27:05 +02:00
CFI_ E N D P R O C
ENDPROC( _ _ g e t _ u s e r _ 2 )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:05 +02:00
ENTRY( _ _ g e t _ u s e r _ 4 )
CFI_ S T A R T P R O C
2005-04-16 15:20:36 -07:00
addl $ 3 ,% e a x
jc b a d _ g e t _ u s e r
GET_ T H R E A D _ I N F O ( % e d x )
cmpl T I _ a d d r _ l i m i t ( % e d x ) ,% e a x
jae b a d _ g e t _ u s e r
3 : movl - 3 ( % e a x ) ,% e d x
xorl % e a x ,% e a x
ret
2007-05-02 19:27:05 +02:00
CFI_ E N D P R O C
ENDPROC( _ _ g e t _ u s e r _ 4 )
2005-04-16 15:20:36 -07:00
bad_get_user :
2007-05-02 19:27:05 +02:00
CFI_ S T A R T P R O C
2005-04-16 15:20:36 -07:00
xorl % e d x ,% e d x
movl $ - 1 4 ,% e a x
ret
2007-05-02 19:27:05 +02:00
CFI_ E N D P R O C
END( b a d _ g e t _ u s e r )
2005-04-16 15:20:36 -07:00
.section _ _ ex_ t a b l e ," a "
.long 1 b,b a d _ g e t _ u s e r
.long 2 b,b a d _ g e t _ u s e r
.long 3 b,b a d _ g e t _ u s e r
.previous