2008-05-19 16:52:27 -07:00
/ *
2005-04-16 15:20:36 -07:00
* strncpy_ f r o m _ u s e r . S : S p a r c64 s t r n c p y f r o m u s e r s p a c e .
*
* Copyright ( C ) 1 9 9 7 , 1 9 9 9 J a k u b J e l i n e k ( j j @ultra.linux.cz)
* /
# include < a s m / a s i . h >
# include < a s m / e r r n o . h >
.data
.align 8
0 : .xword 0x01010101 0 1 0 1 0 1 0 1
.text
.align 32
/ * Must r e t u r n :
*
* - EFAULT f o r a n e x c e p t i o n
* count i f w e h i t t h e b u f f e r l i m i t
* bytes c o p i e d i f w e h i t a n u l l b y t e
* ( without t h e n u l l b y t e )
*
* This i m p l e m e n t a t i o n a s s u m e s :
* % o1 i s 8 a l i g n e d = > ! ( % o 2 & 7 )
* % o0 i s 8 a l i g n e d ( i f n o t , i t w i l l b e s l o o o o o w , b u t w i l l w o r k )
*
* This i s o p t i m i z e d f o r t h e c o m m o n c a s e :
* in m y s t a t s , 9 0 % o f s r c a r e 8 a l i g n e d ( e v e n o n s p a r c32 )
* and a v e r a g e l e n g t h i s 1 8 o r s o .
* /
.globl __strncpy_from_user
.type _ _ strncpy_ f r o m _ u s e r ,#f u n c t i o n
__strncpy_from_user :
/* %o0=dest, %o1=src, %o2=count */
andcc % o 1 , 7 , % g 0 ! I E U 1 G r o u p
bne,p n % i c c , 3 0 f ! C T I
add % o 0 , % o 2 , % g 3 ! I E U 0
60 : ldxa [ % o 1 ] % a s i , % g 1 ! L o a d G r o u p
brlez,p n % o 2 , 1 0 f ! C T I
mov % o 0 , % o 3 ! I E U 0
50 : sethi % h i ( 0 b ) , % o 4 ! I E U 0 G r o u p
ldx [ % o 4 + % l o ( 0 b ) ] , % o 4 ! L o a d
sllx % o 4 , 7 , % o 5 ! I E U 1 G r o u p
1 : sub % g 1 , % o 4 , % g 2 ! I E U 0 G r o u p
stx % g 1 , [ % o 0 ] ! S t o r e
add % o 0 , 8 , % o 0 ! I E U 1
andcc % g 2 , % o 5 , % g 0 ! I E U 1 G r o u p
bne,p n % x c c , 5 f ! C T I
add % o 1 , 8 , % o 1 ! I E U 0
cmp % o 0 , % g 3 ! I E U 1 G r o u p
bl,a ,p t % x c c , 1 b ! C T I
61 : ldxa [ % o 1 ] % a s i , % g 1 ! L o a d
10 : retl ! C T I G r o u p
mov % o 2 , % o 0 ! I E U 0
5 : srlx % g 2 , 3 2 , % g 7 ! I E U 0 G r o u p
sethi % h i ( 0 x f f00 ) , % o 4 ! I E U 1
andcc % g 7 , % o 5 , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 2 f ! C T I
or % o 4 , % l o ( 0 x f f00 ) , % o 4 ! I E U 0
srlx % g 1 , 4 8 , % g 7 ! I E U 0 G r o u p
andcc % g 7 , % o 4 , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 0 f ! C T I
andcc % g 7 , 0 x f f , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 1 f ! C T I
srlx % g 1 , 3 2 , % g 7 ! I E U 0
andcc % g 7 , % o 4 , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 2 f ! C T I
andcc % g 7 , 0 x f f , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 3 f ! C T I
2 : andcc % g 2 , % o 5 , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 2 f ! C T I
srl % g 1 , 1 6 , % g 7 ! I E U 0
andcc % g 7 , % o 4 , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 4 f ! C T I
andcc % g 7 , 0 x f f , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 5 f ! C T I
andcc % g 1 , % o 4 , % g 0 ! I E U 1 G r o u p
be,p n % i c c , 5 6 f ! C T I
andcc % g 1 , 0 x f f , % g 0 ! I E U 1 G r o u p
be,a ,p n % i c c , 5 7 f ! C T I
sub % o 0 , % o 3 , % o 0 ! I E U 0
2 : cmp % o 0 , % g 3 ! I E U 1 G r o u p
bl,a ,p t % x c c , 5 0 b ! C T I
62 : ldxa [ % o 1 ] % a s i , % g 1 ! L o a d
retl ! C T I G r o u p
mov % o 2 , % o 0 ! I E U 0
50 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 8 , % o 0
51 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 7 , % o 0
52 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 6 , % o 0
53 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 5 , % o 0
54 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 4 , % o 0
55 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 3 , % o 0
56 : sub % o 0 , % o 3 , % o 0
retl
sub % o 0 , 2 , % o 0
57 : retl
sub % o 0 , 1 , % o 0
30 : brlez,p n % o 2 , 3 f
sub % g 0 , % o 2 , % o 3
add % o 0 , % o 2 , % o 0
63 : lduba [ % o 1 ] % a s i , % o 4
1 : add % o 1 , 1 , % o 1
brz,p n % o 4 , 2 f
stb % o 4 , [ % o 0 + % o 3 ]
addcc % o 3 , 1 , % o 3
bne,p t % x c c , 1 b
64 : lduba [ % o 1 ] % a s i , % o 4
3 : retl
mov % o 2 , % o 0
2 : retl
add % o 2 , % o 3 , % o 0
.size _ _ strncpy_ f r o m _ u s e r , . - _ _ s t r n c p y _ f r o m _ u s e r
2006-03-04 23:23:56 -08:00
.section _ _ ex_ t a b l e ," a "
2005-04-16 15:20:36 -07:00
.align 4
2005-09-28 20:41:45 -07:00
.word 6 0 b, _ _ r e t l _ e f a u l t
.word 6 1 b, _ _ r e t l _ e f a u l t
.word 6 2 b, _ _ r e t l _ e f a u l t
.word 6 3 b, _ _ r e t l _ e f a u l t
.word 6 4 b, _ _ r e t l _ e f a u l t
.previous