2005-04-17 02:20:36 +04:00
/ *
* arch/ a l p h a / l i b / c l e a r _ u s e r . S
* Contributed b y R i c h a r d H e n d e r s o n < r t h @tamu.edu>
*
* Zero 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 .
*
* We 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 c o n t a i n s t h e
* right " b y t e s l e f t t o z e r o " v a l u e ( a n d t h a t i t i s u p d a t e d o n l y _ 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 e x c e p t i o n s e t u p
* stuff.
*
* 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
* are d i f f e r e n t :
*
* Inputs :
* length i n $ 0
* destination a d d r e s s i n $ 6
* exception p o i n t e r i n $ 7
* return a d d r e s s i n $ 2 8 ( e x c e p t i o n s e x p e c t i t t h e r e )
*
* Outputs :
* bytes l e f t t o c o p y i n $ 0
*
* Clobbers :
* $ 1 , $ 2 , $ 3 , $ 4 , $ 5 , $ 6
* /
2016-01-11 17:51:29 +03:00
# include < a s m / e x p o r t . h >
2005-04-17 02:20:36 +04:00
/* Allow an exception for an insn; exit if we get one. */
# define E X ( x ,y . . . ) \
99 : x,## y ; \
.section _ _ ex_ t a b l e ," a " ; \
.long 99b - . ; \
lda $ 3 1 , $ e x c e p t i o n - 9 9 b ( $ 3 1 ) ; \
.previous
.set noat
.set noreorder
.align 4
.globl __do_clear_user
.ent __do_clear_user
.frame $ 3 0 , 0 , $ 2 8
.prologue 0
$ loop :
and $ 1 , 3 , $ 4 # e 0 :
beq $ 4 , 1 f # . . e 1 :
0 : EX( s t q _ u $ 3 1 , 0 ( $ 6 ) ) # e 0 : z e r o o n e w o r d
subq $ 0 , 8 , $ 0 # . . e 1 :
subq $ 4 , 1 , $ 4 # e 0 :
addq $ 6 , 8 , $ 6 # . . e 1 :
bne $ 4 , 0 b # e 1 :
unop # :
1 : bic $ 1 , 3 , $ 1 # e 0 :
beq $ 1 , $ t a i l # . . e 1 :
2 : EX( s t q _ u $ 3 1 , 0 ( $ 6 ) ) # e 0 : z e r o f o u r w o r d s
subq $ 0 , 8 , $ 0 # . . e 1 :
EX( s t q _ u $ 3 1 , 8 ( $ 6 ) ) # e 0 :
subq $ 0 , 8 , $ 0 # . . e 1 :
EX( s t q _ u $ 3 1 , 1 6 ( $ 6 ) ) # e 0 :
subq $ 0 , 8 , $ 0 # . . e 1 :
EX( s t q _ u $ 3 1 , 2 4 ( $ 6 ) ) # e 0 :
subq $ 0 , 8 , $ 0 # . . e 1 :
subq $ 1 , 4 , $ 1 # e 0 :
addq $ 6 , 3 2 , $ 6 # . . e 1 :
bne $ 1 , 2 b # e 1 :
$ tail :
bne $ 2 , 1 f # e 1 : i s t h e r e a t a i l t o d o ?
ret $ 3 1 , ( $ 2 8 ) , 1 # . . e 1 :
1 : EX( l d q _ u $ 5 , 0 ( $ 6 ) ) # e 0 :
clr $ 0 # . . e 1 :
nop # e 1 :
mskqh $ 5 , $ 0 , $ 5 # e 0 :
EX( s t q _ u $ 5 , 0 ( $ 6 ) ) # e 0 :
ret $ 3 1 , ( $ 2 8 ) , 1 # . . e 1 :
__do_clear_user :
and $ 6 , 7 , $ 4 # e 0 : f i n d d e s t m i s a l i g n m e n t
beq $ 0 , $ z e r o l e n g t h # . . e 1 :
addq $ 0 , $ 4 , $ 1 # e 0 : b i a s c o u n t e r
and $ 1 , 7 , $ 2 # e 1 : n u m b e r o f b y t e s i n t a i l
srl $ 1 , 3 , $ 1 # e 0 :
beq $ 4 , $ l o o p # . . e 1 :
EX( l d q _ u $ 5 , 0 ( $ 6 ) ) # e 0 : l o a d d s t w o r d t o m a s k b a c k i n
beq $ 1 , $ o n e w o r d # . . e 1 : s u b - w o r d s t o r e ?
mskql $ 5 , $ 6 , $ 5 # e 0 : t a k e c a r e o f m i s a l i g n e d h e a d
addq $ 6 , 8 , $ 6 # . . e 1 :
EX( s t q _ u $ 5 , - 8 ( $ 6 ) ) # e 0 :
addq $ 0 , $ 4 , $ 0 # . . e 1 : b y t e s l e f t - = 8 - m i s a l i g n m e n t
subq $ 1 , 1 , $ 1 # e 0 :
subq $ 0 , 8 , $ 0 # . . e 1 :
br $ l o o p # e 1 :
unop # :
$ oneword :
mskql $ 5 , $ 6 , $ 4 # e 0 :
mskqh $ 5 , $ 2 , $ 5 # e 0 :
or $ 5 , $ 4 , $ 5 # e 1 :
EX( s t q _ u $ 5 , 0 ( $ 6 ) ) # e 0 :
clr $ 0 # . . e 1 :
$ zerolength :
$ exception :
ret $ 3 1 , ( $ 2 8 ) , 1 # . . e 1 :
.end __do_clear_user
2016-01-11 17:51:29 +03:00
EXPORT_ S Y M B O L ( _ _ d o _ c l e a r _ u s e r )