2005-06-23 22:01:16 -07:00
/ *
* arch/ x t e n s a / k e r n e l / c o p r o c e s s o r . S
*
* Xtensa p r o c e s s o r c o n f i g u r a t i o n - s p e c i f i c t a b l e o f c o p r o c e s s o r a n d
* other c u s t o m r e g i s t e r l a y o u t i n f o r m a t i o n .
*
* This f i l e i s s u b j e c t t o t h e t e r m s a n d c o n d i t i o n s o f t h e G N U G e n e r a l P u b l i c
* License. S e e t h e f i l e " C O P Y I N G " i n t h e m a i n d i r e c t o r y o f t h i s a r c h i v e
* for m o r e d e t a i l s .
*
* Copyright ( C ) 2 0 0 3 - 2 0 0 5 T e n s i l i c a I n c .
*
* Marc G a u t h i e r < m a r c @tensilica.com> <marc@alumni.uwaterloo.ca>
* /
/ *
* This m o d u l e c o n t a i n s a t a b l e t h a t d e s c r i b e s t h e l a y o u t o f t h e v a r i o u s
* custom r e g i s t e r s a n d s t a t e s a s s o c i a t e d w i t h e a c h c o p r o c e s s o r , a s w e l l
* as t h o s e n o t a s s o c i a t e d w i t h a n y c o p r o c e s s o r ( " e x t r a s t a t e " ) .
* This t a b l e i s i n c l u d e d w i t h c o r e d u m p s a n d i s a v a i l a b l e v i a t h e p t r a c e
* interface, a l l o w i n g t h e l a y o u t o f s u c h r e g i s t e r / s t a t e i n f o r m a t i o n t o
* be m o d i f i e d i n t h e k e r n e l w i t h o u t a f f e c t i n g t h e d e b u g g e r . E a c h
* register o r s t a t e i s i d e n t i f i e d u s i n g a 3 2 - b i t " l i b d b t a r g e t n u m b e r "
* assigned w h e n t h e X t e n s a p r o c e s s o r i s g e n e r a t e d .
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / p r o c e s s o r . h >
# if X C H A L _ H A V E _ C P
# define C P _ L A S T ( ( X C H A L _ C P _ M A X - 1 ) * C O P R O C E S S O R _ I N F O _ S I Z E )
ENTRY( r e l e a s e _ c o p r o c e s s o r s )
entry a1 , 1 6
# a2 : task
movi a3 , 1 < < X C H A L _ C P _ M A X # a 3 : c o p r o c e s s o r - b i t
movi a4 , c o p r o c e s s o r _ i n f o + C P _ L A S T # a 4 : o w n e r - t a b l e
# a5 : tmp
movi a6 , 0 # a 6 : 0
rsil a7 , L O C K L E V E L # a 7 : P S
1 : /* Check if task is coprocessor owner of coprocessor[i]. */
l3 2 i a5 , a4 , C O P R O C E S S O R _ I N F O _ O W N E R
srli a3 , a3 , 1
beqz a3 , 1 f
addi a4 , a4 , - 8
beq a2 , a5 , 1 b
/* Found an entry: Clear entry CPENABLE bit to disable CP. */
rsr a5 , C P E N A B L E
s3 2 i a6 , a4 , C O P R O C E S S O R _ I N F O _ O W N E R
xor a5 , a3 , a5
wsr a5 , C P E N A B L E
bnez a3 , 1 b
1 : wsr a7 , P S
rsync
retw
ENTRY( d i s a b l e _ c o p r o c e s s o r )
entry s p , 1 6
rsil a7 , L O C K L E V E L
rsr a3 , C P E N A B L E
movi a4 , 1
ssl a2
sll a4 , a4
and a4 , a3 , a4
xor a3 , a3 , a4
wsr a3 , C P E N A B L E
wsr a7 , P S
rsync
retw
ENTRY( e n a b l e _ c o p r o c e s s o r )
entry s p , 1 6
rsil a7 , L O C K L E V E L
rsr a3 , C P E N A B L E
movi a4 , 1
ssl a2
sll a4 , a4
or a3 , a3 , a4
wsr a3 , C P E N A B L E
wsr a7 , P S
rsync
retw
ENTRY( s a v e _ c o p r o c e s s o r _ e x t r a )
entry s p , 1 6
xchal_ e x t r a _ s t o r e _ f u n c b o d y
retw
ENTRY( r e s t o r e _ c o p r o c e s s o r _ e x t r a )
entry s p , 1 6
xchal_ e x t r a _ l o a d _ f u n c b o d y
retw
ENTRY( s a v e _ c o p r o c e s s o r _ r e g i s t e r s )
entry s p , 1 6
xchal_ c p i _ s t o r e _ f u n c b o d y
retw
ENTRY( r e s t o r e _ c o p r o c e s s o r _ r e g i s t e r s )
entry s p , 1 6
xchal_ c p i _ l o a d _ f u n c b o d y
retw
/ *
* The X t e n s a c o m p i l e - t i m e H A L ( c o r e . h ) X C H A L _ * _ S A _ C O N T E N T S _ L I B D B m a c r o s
* describe t h e c o n t e n t s o f c o p r o c e s s o r & e x t r a s a v e a r e a s i n t e r m s o f
* undefined C O N T E N T S _ L I B D B _ { S R E G ,U R E G ,R E G F } m a c r o s . W e d e f i n e t h e s e
* latter m a c r o s h e r e ; they expand into a table of the format we want.
* The g e n e r a l f o r m a t i s :
*
* CONTENTS_ L I B D B _ S R E G ( l i b d b n u m , o f f s e t , s i z e , a l i g n , r s v1 , n a m e , s r e g n u m ,
* bitmask, r s v2 , r s v3 )
* CONTENTS_ L I B D B _ U R E G ( l i b d b n u m , o f f s e t , s i z e , a l i g n , r s v1 , n a m e , u r e g n u m ,
* bitmask, r s v2 , r s v3 )
* CONTENTS_ L I B D B _ R E G F ( l i b d b n u m , o f f s e t , s i z e , a l i g n , r s v1 , n a m e , i n d e x ,
* numentries, c o n t e n t s i z e , r e g n a m e _ b a s e ,
* regfile_ n a m e , r s v2 , r s v3 )
*
* For t h i s t a b l e , w e o n l y c a r e a b o u t t h e < l i b d b n u m > , < o f f s e t > a n d < s i z e >
* fields.
* /
/* Map all XCHAL CONTENTS macros to the reg_entry asm macro defined below: */
# define C O N T E N T S _ L I B D B _ S R E G ( l i b d b n u m ,o f f s e t ,s i z e ,a l i g n ,r s v1 ,n a m e ,s r e g n u m , \
bitmask, r s v2 , r s v3 ) \
reg_ e n t r y l i b d b n u m , o f f s e t , s i z e ;
# define C O N T E N T S _ L I B D B _ U R E G ( l i b d b n u m ,o f f s e t ,s i z e ,a l i g n ,r s v1 ,n a m e ,u r e g n u m , \
bitmask, r s v2 , r s v3 ) \
reg_ e n t r y l i b d b n u m , o f f s e t , s i z e ;
# define C O N T E N T S _ L I B D B _ R E G F ( l i b d b n u m , o f f s e t , s i z e , a l i g n , r s v1 , n a m e , i n d e x , \
numentries, c o n t e n t s i z e , r e g n a m e _ b a s e , \
regfile_ n a m e , r s v2 , r s v3 ) \
reg_ e n t r y l i b d b n u m , o f f s e t , s i z e ;
/* A single table entry: */
.macro reg_entry libdbnum, o f f s e t , s i z e
.ifne ( _ _ last_ o f f s e t - ( _ _ l a s t _ g r o u p _ o f f s e t + \ o f f s e t ) )
/* padding entry */
.word ( 0 xFC0 0 0 0 0 0 + _ _ l a s t _ o f f s e t - ( _ _ l a s t _ g r o u p _ o f f s e t + \ o f f s e t ) )
.endif
.word \ libdbnum / * a c t u a l e n t r y * /
.set _ _ last_ o f f s e t , _ _ l a s t _ g r o u p _ o f f s e t + \ o f f s e t + \ s i z e
.endm /* reg_entry */
/* Table entry that marks the beginning of a group (coprocessor or "extra"): */
.macro reg_group cpnum, n u m _ e n t r i e s , a l i g n
.set _ _ last_ g r o u p _ o f f s e t , ( _ _ l a s t _ o f f s e t + \ a l i g n - 1 ) & - \ a l i g n
.ifne \ num_ e n t r i e s
.word 0 xFD0 0 0 0 0 0 + ( \ c p n u m < < 1 6 ) + \ n u m _ e n t r i e s
.endif
.endm /* reg_group */
/ *
* Register i n f o t a b l e s .
* /
.section .rodata , " a"
.globl _xtensa_reginfo_tables
.globl _xtensa_reginfo_table_size
.align 4
_xtensa_reginfo_table_size :
.word _xtensa_reginfo_table_end - _ xtensa_ r e g i n f o _ t a b l e s
_xtensa_reginfo_tables :
.set _ _ last_ o f f s e t , 0
reg_ g r o u p 0 x F F , X C H A L _ E X T R A _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ E X T R A _ S A _ A L I G N
XCHAL_ E X T R A _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 0 , X C H A L _ C P 0 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 0 _ S A _ A L I G N
XCHAL_ C P 0 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 1 , X C H A L _ C P 1 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 1 _ S A _ A L I G N
XCHAL_ C P 1 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 2 , X C H A L _ C P 2 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 2 _ S A _ A L I G N
XCHAL_ C P 2 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 3 , X C H A L _ C P 3 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 3 _ S A _ A L I G N
XCHAL_ C P 3 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 4 , X C H A L _ C P 4 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 4 _ S A _ A L I G N
XCHAL_ C P 4 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 5 , X C H A L _ C P 5 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 5 _ S A _ A L I G N
XCHAL_ C P 5 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 6 , X C H A L _ C P 6 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 6 _ S A _ A L I G N
XCHAL_ C P 6 _ S A _ C O N T E N T S _ L I B D B
reg_ g r o u p 7 , X C H A L _ C P 7 _ S A _ C O N T E N T S _ L I B D B _ N U M , X C H A L _ C P 7 _ S A _ A L I G N
XCHAL_ C P 7 _ S A _ C O N T E N T S _ L I B D B
.word 0xFC000000 /* invalid register number,marks end of table*/
_xtensa_reginfo_table_end :
2006-12-10 02:18:48 -08:00
# endif
2005-06-23 22:01:16 -07:00