2005-06-23 22:01:20 -07:00
/ *
* INET A n i m p l e m e n t a t i o n o f t h e T C P / I P p r o t o c o l s u i t e f o r t h e L I N U X
* operating s y s t e m . I N E T i s i m p l e m e n t e d u s i n g t h e B S D S o c k e t
* interface a s t h e m e a n s o f c o m m u n i c a t i o n w i t h t h e u s e r l e v e l .
*
* IP/ T C P / U D P c h e c k s u m m i n g r o u t i n e s
*
* Xtensa v e r s i o n : C o p y r i g h t ( C ) 2 0 0 1 T e n s i l i c a , I n c . b y K e v i n C h e a
* Optimized b y J o e T a y l o r
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or
* modify i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* as p u b l i s h e d b y t h e F r e e S o f t w a r e F o u n d a t i o n ; either version
* 2 of t h e L i c e n s e , o r ( a t y o u r o p t i o n ) a n y l a t e r v e r s i o n .
* /
2017-12-09 21:18:47 -08:00
# include < l i n u x / e r r n o . h >
2005-06-23 22:01:20 -07:00
# include < l i n u x / l i n k a g e . h >
2008-11-06 06:40:46 -08:00
# include < v a r i a n t / c o r e . h >
2017-12-09 21:18:47 -08:00
# include < a s m / a s m m a c r o . h >
2005-06-23 22:01:20 -07:00
/ *
* computes a p a r t i a l c h e c k s u m , e . g . f o r T C P / U D P f r a g m e n t s
* /
/ *
* unsigned i n t c s u m _ p a r t i a l ( c o n s t u n s i g n e d c h a r * b u f , i n t l e n ,
* unsigned i n t s u m ) ;
* a2 = b u f
* a3 = l e n
* a4 = s u m
*
* This f u n c t i o n a s s u m e s 2 - o r 4 - b y t e a l i g n m e n t . O t h e r a l i g n m e n t s w i l l f a i l !
* /
/* ONES_ADD converts twos-complement math to ones-complement. */
# define O N E S _ A D D ( s u m , v a l ) \
add s u m , s u m , v a l ; \
bgeu s u m , v a l , 9 9 f ; \
addi s u m , s u m , 1 ; \
99 : ;
.text
ENTRY( c s u m _ p a r t i a l )
2012-11-28 16:53:51 -08:00
/ *
* Experiments w i t h E t h e r n e t a n d S L I P c o n n e c t i o n s s h o w t h a t b u f
* is a l i g n e d o n e i t h e r a 2 - b y t e o r 4 - b y t e b o u n d a r y .
* /
2005-06-23 22:01:20 -07:00
entry s p , 3 2
extui a5 , a2 , 0 , 2
bnez a5 , 8 f / * b r a n c h i f 2 - b y t e a l i g n e d * /
/* Fall-through on common case, 4-byte alignment */
1 :
srli a5 , a3 , 5 / * 3 2 - b y t e c h u n k s * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a5 , 2 f
# else
beqz a5 , 2 f
slli a5 , a5 , 5
add a5 , a5 , a2 / * a5 = e n d o f l a s t 3 2 - b y t e c h u n k * /
.Loop1 :
# endif
l3 2 i a6 , a2 , 0
l3 2 i a7 , a2 , 4
ONES_ A D D ( a4 , a6 )
ONES_ A D D ( a4 , a7 )
l3 2 i a6 , a2 , 8
l3 2 i a7 , a2 , 1 2
ONES_ A D D ( a4 , a6 )
ONES_ A D D ( a4 , a7 )
l3 2 i a6 , a2 , 1 6
l3 2 i a7 , a2 , 2 0
ONES_ A D D ( a4 , a6 )
ONES_ A D D ( a4 , a7 )
l3 2 i a6 , a2 , 2 4
l3 2 i a7 , a2 , 2 8
ONES_ A D D ( a4 , a6 )
ONES_ A D D ( a4 , a7 )
addi a2 , a2 , 4 * 8
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a5 , . L o o p1
# endif
2 :
extui a5 , a3 , 2 , 3 / * r e m a i n i n g 4 - b y t e c h u n k s * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a5 , 3 f
# else
beqz a5 , 3 f
slli a5 , a5 , 2
add a5 , a5 , a2 / * a5 = e n d o f l a s t 4 - b y t e c h u n k * /
.Loop2 :
# endif
l3 2 i a6 , a2 , 0
ONES_ A D D ( a4 , a6 )
addi a2 , a2 , 4
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a5 , . L o o p2
# endif
3 :
_ bbci. l a3 , 1 , 5 f / * r e m a i n i n g 2 - b y t e c h u n k * /
l1 6 u i a6 , a2 , 0
ONES_ A D D ( a4 , a6 )
addi a2 , a2 , 2
5 :
_ bbci. l a3 , 0 , 7 f / * r e m a i n i n g 1 - b y t e c h u n k * /
6 : l8 u i a6 , a2 , 0
# ifdef _ _ X T E N S A _ E B _ _
slli a6 , a6 , 8 / * l o a d b y t e i n t o b i t s 8 . . 1 5 * /
# endif
ONES_ A D D ( a4 , a6 )
7 :
mov a2 , a4
retw
/* uncommon case, buf is 2-byte aligned */
8 :
beqz a3 , 7 b / * b r a n c h i f l e n = = 0 * /
beqi a3 , 1 , 6 b / * b r a n c h i f l e n = = 1 * /
extui a5 , a2 , 0 , 1
bnez a5 , 8 f / * b r a n c h i f 1 - b y t e a l i g n e d * /
l1 6 u i a6 , a2 , 0 / * c o m m o n c a s e , l e n > = 2 * /
ONES_ A D D ( a4 , a6 )
addi a2 , a2 , 2 / * a d j u s t b u f * /
addi a3 , a3 , - 2 / * a d j u s t l e n * /
j 1 b / * n o w b u f i s 4 - b y t e a l i g n e d * /
/ * case : odd- b y t e a l i g n e d , l e n > 1
* This c a s e i s d o g s l o w , s o d o n ' t g i v e u s a n o d d a d d r e s s .
* ( I d o n ' t t h i n k t h i s e v e r h a p p e n s , b u t j u s t i n c a s e . )
* /
8 :
srli a5 , a3 , 2 / * 4 - b y t e c h u n k s * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a5 , 2 f
# else
beqz a5 , 2 f
slli a5 , a5 , 2
add a5 , a5 , a2 / * a5 = e n d o f l a s t 4 - b y t e c h u n k * /
.Loop3 :
# endif
l8 u i a6 , a2 , 0 / * b i t s 2 4 . . 3 1 * /
l1 6 u i a7 , a2 , 1 / * b i t s 8 . . 2 3 * /
l8 u i a8 , a2 , 3 / * b i t s 0 . . 8 * /
# ifdef _ _ X T E N S A _ E B _ _
slli a6 , a6 , 2 4
# else
slli a8 , a8 , 2 4
# endif
slli a7 , a7 , 8
or a7 , a7 , a6
or a7 , a7 , a8
ONES_ A D D ( a4 , a7 )
addi a2 , a2 , 4
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a5 , . L o o p3
# endif
2 :
_ bbci. l a3 , 1 , 3 f / * r e m a i n i n g 2 - b y t e c h u n k , s t i l l o d d a d d r * /
l8 u i a6 , a2 , 0
l8 u i a7 , a2 , 1
# ifdef _ _ X T E N S A _ E B _ _
slli a6 , a6 , 8
# else
slli a7 , a7 , 8
# endif
or a7 , a7 , a6
ONES_ A D D ( a4 , a7 )
addi a2 , a2 , 2
3 :
j 5 b / * b r a n c h t o h a n d l e t h e r e m a i n i n g b y t e * /
2012-11-16 16:16:20 -08:00
ENDPROC( c s u m _ p a r t i a l )
2005-06-23 22:01:20 -07:00
/ *
* Copy f r o m d s w h i l e c h e c k s u m m i n g , o t h e r w i s e l i k e c s u m _ p a r t i a l
* /
/ *
unsigned i n t c s u m _ p a r t i a l _ c o p y _ g e n e r i c ( c o n s t c h a r * s r c , c h a r * d s t , i n t l e n ,
int s u m , i n t * s r c _ e r r _ p t r , i n t * d s t _ e r r _ p t r )
a2 = s r c
a3 = d s t
a4 = l e n
a5 = s u m
a6 = s r c _ e r r _ p t r
a7 = d s t _ e r r _ p t r
a8 = t e m p
a9 = t e m p
a1 0 = t e m p
a1 1 = o r i g i n a l l e n f o r e x c e p t i o n h a n d l i n g
a1 2 = o r i g i n a l d s t f o r e x c e p t i o n h a n d l i n g
This f u n c t i o n i s o p t i m i z e d f o r 4 - b y t e a l i g n e d a d d r e s s e s . O t h e r
alignments w o r k , b u t n o t n e a r l y a s e f f i c i e n t l y .
* /
ENTRY( c s u m _ p a r t i a l _ c o p y _ g e n e r i c )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:20 -07:00
entry s p , 3 2
mov a12 , a3
mov a11 , a4
or a10 , a2 , a3
/ * We o p t i m i z e t h e f o l l o w i n g a l i g n m e n t t e s t s f o r t h e 4 - b y t e
aligned c a s e . T w o b b s i . l i n s t r u c t i o n s m i g h t s e e m m o r e o p t i m a l
( commented o u t b e l o w ) . H o w e v e r , b o t h l a b e l s 5 : a n d 3 : a r e o u t
of t h e i m m 8 r a n g e , s o t h e a s s e m b l e r r e l a x e s t h e m i n t o
equivalent b b c i . l , j c o m b i n a t i o n s , w h i c h i s a c t u a l l y
slower. * /
extui a9 , a10 , 0 , 2
beqz a9 , 1 f / * b r a n c h i f b o t h a r e 4 - b y t e a l i g n e d * /
bbsi. l a10 , 0 , 5 f / * b r a n c h i f o n e a d d r e s s i s o d d * /
j 3 f / * o n e a d d r e s s i s 2 - b y t e a l i g n e d * /
/* _bbsi.l a10, 0, 5f */ /* branch if odd address */
/* _bbsi.l a10, 1, 3f */ /* branch if 2-byte-aligned address */
1 :
/* src and dst are both 4-byte aligned */
srli a10 , a4 , 5 / * 3 2 - b y t e c h u n k s * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a10 , 2 f
# else
beqz a10 , 2 f
slli a10 , a10 , 5
add a10 , a10 , a2 / * a10 = e n d o f l a s t 3 2 - b y t e s r c c h u n k * /
.Loop5 :
# endif
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 3 2 i a9 , a2 , 0
EX( 1 0 f ) l 3 2 i a8 , a2 , 4
EX( 1 1 f ) s32 i a9 , a3 , 0
EX( 1 1 f ) s32 i a8 , a3 , 4
2005-06-23 22:01:20 -07:00
ONES_ A D D ( a5 , a9 )
ONES_ A D D ( a5 , a8 )
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 3 2 i a9 , a2 , 8
EX( 1 0 f ) l 3 2 i a8 , a2 , 1 2
EX( 1 1 f ) s32 i a9 , a3 , 8
EX( 1 1 f ) s32 i a8 , a3 , 1 2
2005-06-23 22:01:20 -07:00
ONES_ A D D ( a5 , a9 )
ONES_ A D D ( a5 , a8 )
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 3 2 i a9 , a2 , 1 6
EX( 1 0 f ) l 3 2 i a8 , a2 , 2 0
EX( 1 1 f ) s32 i a9 , a3 , 1 6
EX( 1 1 f ) s32 i a8 , a3 , 2 0
2005-06-23 22:01:20 -07:00
ONES_ A D D ( a5 , a9 )
ONES_ A D D ( a5 , a8 )
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 3 2 i a9 , a2 , 2 4
EX( 1 0 f ) l 3 2 i a8 , a2 , 2 8
EX( 1 1 f ) s32 i a9 , a3 , 2 4
EX( 1 1 f ) s32 i a8 , a3 , 2 8
2005-06-23 22:01:20 -07:00
ONES_ A D D ( a5 , a9 )
ONES_ A D D ( a5 , a8 )
addi a2 , a2 , 3 2
addi a3 , a3 , 3 2
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a10 , . L o o p5
# endif
2 :
extui a10 , a4 , 2 , 3 / * r e m a i n i n g 4 - b y t e c h u n k s * /
extui a4 , a4 , 0 , 2 / * r e s e t l e n f o r g e n e r a l - c a s e , 2 - b y t e c h u n k s * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a10 , 3 f
# else
beqz a10 , 3 f
slli a10 , a10 , 2
add a10 , a10 , a2 / * a10 = e n d o f l a s t 4 - b y t e s r c c h u n k * /
.Loop6 :
# endif
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 3 2 i a9 , a2 , 0
EX( 1 1 f ) s32 i a9 , a3 , 0
2005-06-23 22:01:20 -07:00
ONES_ A D D ( a5 , a9 )
addi a2 , a2 , 4
addi a3 , a3 , 4
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a10 , . L o o p6
# endif
3 :
/ *
Control c o m e s t o h e r e i n t w o c a s e s : ( 1 ) I t m a y f a l l t h r o u g h
to h e r e f r o m t h e 4 - b y t e a l i g n m e n t c a s e t o p r o c e s s , a t m o s t ,
one 2 - b y t e c h u n k . ( 2 ) I t b r a n c h e s t o h e r e f r o m a b o v e i f
either s r c o r d s t i s 2 - b y t e a l i g n e d , a n d w e p r o c e s s a l l b y t e s
here, e x c e p t f o r p e r h a p s a t r a i l i n g o d d b y t e . I t ' s
inefficient, s o a l i g n y o u r a d d r e s s e s t o 4 - b y t e b o u n d a r i e s .
a2 = s r c
a3 = d s t
a4 = l e n
a5 = s u m
* /
srli a10 , a4 , 1 / * 2 - b y t e c h u n k s * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a10 , 4 f
# else
beqz a10 , 4 f
slli a10 , a10 , 1
add a10 , a10 , a2 / * a10 = e n d o f l a s t 2 - b y t e s r c c h u n k * /
.Loop7 :
# endif
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 1 6 u i a9 , a2 , 0
EX( 1 1 f ) s16 i a9 , a3 , 0
2005-06-23 22:01:20 -07:00
ONES_ A D D ( a5 , a9 )
addi a2 , a2 , 2
addi a3 , a3 , 2
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a10 , . L o o p7
# endif
4 :
/* This section processes a possible trailing odd byte. */
_ bbci. l a4 , 0 , 8 f / * 1 - b y t e c h u n k * /
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 8 u i a9 , a2 , 0
EX( 1 1 f ) s8 i a9 , a3 , 0
2005-06-23 22:01:20 -07:00
# ifdef _ _ X T E N S A _ E B _ _
slli a9 , a9 , 8 / * s h i f t b y t e t o b i t s 8 . . 1 5 * /
# endif
ONES_ A D D ( a5 , a9 )
8 :
mov a2 , a5
retw
5 :
/ * Control b r a n c h t o h e r e w h e n e i t h e r s r c o r d s t i s o d d . W e
process a l l b y t e s u s i n g 8 - b i t a c c e s s e s . G r o s s l y i n e f f i c i e n t ,
so d o n ' t f e e d u s a n o d d a d d r e s s . * /
srli a10 , a4 , 1 / * h a n d l e i n p a i r s f o r 1 6 - b i t c s u m * /
# if X C H A L _ H A V E _ L O O P S
loopgtz a10 , 6 f
# else
beqz a10 , 6 f
slli a10 , a10 , 1
add a10 , a10 , a2 / * a10 = e n d o f l a s t o d d - a l i g n e d , 2 - b y t e s r c c h u n k * /
.Loop8 :
# endif
2017-12-09 21:18:47 -08:00
EX( 1 0 f ) l 8 u i a9 , a2 , 0
EX( 1 0 f ) l 8 u i a8 , a2 , 1
EX( 1 1 f ) s8 i a9 , a3 , 0
EX( 1 1 f ) s8 i a8 , a3 , 1
2005-06-23 22:01:20 -07:00
# ifdef _ _ X T E N S A _ E B _ _
slli a9 , a9 , 8 / * c o m b i n e i n t o a s i n g l e 1 6 - b i t v a l u e * /
# else / * f o r c h e c k s u m c o m p u t a t i o n * /
slli a8 , a8 , 8
# endif
or a9 , a9 , a8
ONES_ A D D ( a5 , a9 )
addi a2 , a2 , 2
addi a3 , a3 , 2
# if ! X C H A L _ H A V E _ L O O P S
blt a2 , a10 , . L o o p8
# endif
6 :
j 4 b / * p r o c e s s t h e p o s s i b l e t r a i l i n g o d d b y t e * /
2012-11-16 16:16:20 -08:00
ENDPROC( c s u m _ p a r t i a l _ c o p y _ g e n e r i c )
2005-06-23 22:01:20 -07:00
# Exception h a n d l e r :
.section .fixup , " ax"
/ *
a6 = s r c _ e r r _ p t r
a7 = d s t _ e r r _ p t r
a1 1 = o r i g i n a l l e n f o r e x c e p t i o n h a n d l i n g
a1 2 = o r i g i n a l d s t f o r e x c e p t i o n h a n d l i n g
* /
2017-12-09 21:18:47 -08:00
10 :
2005-06-23 22:01:20 -07:00
_ movi a2 , - E F A U L T
s3 2 i a2 , a6 , 0 / * s r c _ e r r _ p t r * /
# clear t h e c o m p l e t e d e s t i n a t i o n - c o m p u t i n g t h e r e s t
# is t o o m u c h w o r k
movi a2 , 0
# if X C H A L _ H A V E _ L O O P S
loopgtz a11 , 2 f
# else
beqz a11 , 2 f
add a11 , a11 , a12 / * a11 = e n d i n g a d d r e s s * /
.Leloop :
# endif
s8 i a2 , a12 , 0
addi a12 , a12 , 1
# if ! X C H A L _ H A V E _ L O O P S
blt a12 , a11 , . L e l o o p
# endif
2 :
retw
2017-12-09 21:18:47 -08:00
11 :
2005-06-23 22:01:20 -07:00
movi a2 , - E F A U L T
s3 2 i a2 , a7 , 0 / * d s t _ e r r _ p t r * /
movi a2 , 0
retw
.previous