2005-04-17 02:20:36 +04: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 1 9 9 8 L i n u s T o r v a l d s
* ( C) C o p y r i g h t 2 0 0 5 A n d i K l e e n
*
* 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 .
* /
/ *
* _ _ put_ u s e r _ X
*
* Inputs : % rcx c o n t a i n s t h e a d d r e s s
* % rdx c o n t a i n s n e w v a l u e
*
* Outputs : % rax i s e r r o r c o d e ( 0 o r - E F A U L T )
*
* % r8 i s d e s t r o y e d .
*
* 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 .
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / p a g e . h >
# include < a s m / e r r n o . h >
# include < a s m / o f f s e t . h >
# include < a s m / t h r e a d _ i n f o . h >
.text
.p2align 4
.globl __put_user_1
__put_user_1 :
GET_ T H R E A D _ I N F O ( % r8 )
cmpq t h r e a d i n f o _ a d d r _ l i m i t ( % r8 ) ,% r c x
jae b a d _ p u t _ u s e r
1 : movb % d l ,( % r c x )
xorl % e a x ,% e a x
ret
.p2align 4
.globl __put_user_2
__put_user_2 :
GET_ T H R E A D _ I N F O ( % r8 )
addq $ 1 ,% r c x
2005-04-21 18:59:51 +04:00
jc 2 0 f
2005-04-17 02:20:36 +04:00
cmpq t h r e a d i n f o _ a d d r _ l i m i t ( % r8 ) ,% r c x
2005-04-21 18:59:51 +04:00
jae 2 0 f
2005-04-22 21:22:07 +04:00
decq % r c x
2 : movw % d x ,( % r c x )
2005-04-17 02:20:36 +04:00
xorl % e a x ,% e a x
ret
2005-04-21 18:59:51 +04:00
20 : decq % r c x
jmp b a d _ p u t _ u s e r
2005-04-17 02:20:36 +04:00
.p2align 4
.globl __put_user_4
__put_user_4 :
GET_ T H R E A D _ I N F O ( % r8 )
addq $ 3 ,% r c x
2005-04-21 18:59:51 +04:00
jc 3 0 f
2005-04-17 02:20:36 +04:00
cmpq t h r e a d i n f o _ a d d r _ l i m i t ( % r8 ) ,% r c x
2005-04-21 18:59:51 +04:00
jae 3 0 f
2005-04-22 21:22:07 +04:00
subq $ 3 ,% r c x
3 : movl % e d x ,( % r c x )
2005-04-17 02:20:36 +04:00
xorl % e a x ,% e a x
ret
2005-04-21 18:59:51 +04:00
30 : subq $ 3 ,% r c x
jmp b a d _ p u t _ u s e r
2005-04-17 02:20:36 +04:00
.p2align 4
.globl __put_user_8
__put_user_8 :
GET_ T H R E A D _ I N F O ( % r8 )
addq $ 7 ,% r c x
2005-04-21 18:59:51 +04:00
jc 4 0 f
2005-04-17 02:20:36 +04:00
cmpq t h r e a d i n f o _ a d d r _ l i m i t ( % r8 ) ,% r c x
2005-04-21 18:59:51 +04:00
jae 4 0 f
2005-04-22 21:22:07 +04:00
subq $ 7 ,% r c x
4 : movq % r d x ,( % r c x )
2005-04-17 02:20:36 +04:00
xorl % e a x ,% e a x
ret
2005-04-21 18:59:51 +04:00
40 : subq $ 7 ,% r c x
jmp b a d _ p u t _ u s e r
2005-04-17 02:20:36 +04:00
bad_put_user :
movq $ ( - E F A U L T ) ,% r a x
ret
.section _ _ ex_ t a b l e ," a "
.quad 1 b,b a d _ p u t _ u s e r
.quad 2 b,b a d _ p u t _ u s e r
.quad 3 b,b a d _ p u t _ u s e r
.quad 4 b,b a d _ p u t _ u s e r
.previous