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 .
*
2008-02-12 13:17:07 -08:00
* Copyright ( C ) 2 0 0 3 - 2 0 0 7 T e n s i l i c a I n c .
2005-06-23 22:01:16 -07:00
* /
# include < l i n u x / l i n k a g e . h >
2008-02-12 13:17:07 -08:00
# include < a s m / a s m - o f f s e t s . h >
2019-07-24 17:39:47 -07:00
# include < a s m / a s m m a c r o . h >
2008-02-12 13:17:07 -08:00
# include < a s m / c o p r o c e s s o r . h >
# include < a s m / c u r r e n t . h >
2019-11-25 12:57:02 -08:00
# include < a s m / r e g s . h >
2005-06-23 22:01:16 -07:00
2022-04-15 03:05:31 -07:00
/ *
* Rules f o r c o p r o c e s s o r s t a t e m a n i p u l a t i o n o n S M P :
*
* - a t a s k m a y h a v e l i v e c o p r o c e s s o r s o n l y o n o n e C P U .
*
* - whether c o p r o c e s s o r c o n t e x t o f t a s k T i s l i v e o n s o m e C P U i s
* denoted b y T ' s t h r e a d _ i n f o - > c p e n a b l e .
*
* - non- z e r o t h r e a d _ i n f o - > c p e n a b l e m e a n s t h a t t h r e a d _ i n f o - > c p _ o w n e r _ c p u
* is v a l i d i n t h e T ' s t h r e a d _ i n f o . Z e r o t h r e a d _ i n f o - > c p e n a b l e m e a n s t h a t
* coprocessor c o n t e x t i s v a l i d i n t h e T ' s t h r e a d _ i n f o .
*
* - if a c o p r o c e s s o r c o n t e x t o f t a s k T i s l i v e o n C P U X , o n l y C P U X c h a n g e s
* T' s t h r e a d _ i n f o - > c p e n a b l e , c p _ o w n e r _ c p u a n d c o p r o c e s s o r s a v e a r e a .
* This i s d o n e b y m a k i n g s u r e t h a t f o r t h e t a s k T w i t h l i v e c o p r o c e s s o r
* on C P U X c p e n a b l e S R i s 0 w h e n T r u n s o n a n y o t h e r C P U Y .
* When f a s t _ c o p r o c e s s o r e x c e p t i o n i s t a k e n o n C P U Y i t g o e s t o t h e
* C- l e v e l d o _ c o p r o c e s s o r t h a t u s e s I P I t o m a k e C P U X f l u s h T ' s c o p r o c e s s o r s .
* /
2008-02-12 13:17:07 -08:00
# if X T E N S A _ H A V E _ C O P R O C E S S O R S
2005-06-23 22:01:16 -07:00
2008-02-12 13:17:07 -08:00
/ *
* Macros f o r l a z y c o n t e x t s w i t c h .
* /
2005-06-23 22:01:16 -07:00
2008-02-12 13:17:07 -08:00
# define S A V E _ C P _ R E G S ( x ) \
.if XTENSA_ H A V E _ C O P R O C E S S O R ( x ) ; \
2018-11-25 23:32:28 -08:00
.align 4 ; \
.Lsave_cp_regs_cp # # x : \
2022-04-13 22:44:36 -07:00
xchal_ c p ## x # # _ s t o r e a 2 a3 a4 a5 a6 ; \
2022-04-13 22:50:54 -07:00
ret; \
2018-11-25 23:32:28 -08:00
.endif
2005-06-23 22:01:16 -07:00
2008-02-12 13:17:07 -08:00
# define L O A D _ C P _ R E G S ( x ) \
.if XTENSA_ H A V E _ C O P R O C E S S O R ( x ) ; \
2018-11-25 23:32:28 -08:00
.align 4 ; \
.Lload_cp_regs_cp # # x : \
2022-04-13 22:44:36 -07:00
xchal_ c p ## x # # _ l o a d a 2 a3 a4 a5 a6 ; \
2022-04-13 22:50:54 -07:00
ret; \
2018-11-25 23:32:28 -08:00
.endif
2005-06-23 22:01:16 -07:00
2022-04-18 12:44:49 -07:00
# define C P _ R E G S _ T A B ( x ) \
2008-02-12 13:17:07 -08:00
.if XTENSA_ H A V E _ C O P R O C E S S O R ( x ) ; \
2022-04-18 12:44:49 -07:00
.long .Lsave_cp_regs_cp # # x; \
2018-11-25 23:32:28 -08:00
.long .Lload_cp_regs_cp # # x; \
2008-02-12 13:17:07 -08:00
.else ; \
2022-04-18 12:44:49 -07:00
.long 0 , 0 ; \
2008-02-12 13:17:07 -08:00
.endif ; \
.long THREAD_ X T R E G S _ C P ## x
2005-06-23 22:01:16 -07:00
2022-04-18 12:44:49 -07:00
# define C P _ R E G S _ T A B _ S A V E 0
# define C P _ R E G S _ T A B _ L O A D 4
# define C P _ R E G S _ T A B _ O F F S E T 8
2020-01-31 18:48:43 -08:00
_ _ XTENSA_ H A N D L E R
2008-02-12 13:17:07 -08:00
SAVE_ C P _ R E G S ( 0 )
SAVE_ C P _ R E G S ( 1 )
SAVE_ C P _ R E G S ( 2 )
SAVE_ C P _ R E G S ( 3 )
SAVE_ C P _ R E G S ( 4 )
SAVE_ C P _ R E G S ( 5 )
SAVE_ C P _ R E G S ( 6 )
SAVE_ C P _ R E G S ( 7 )
2005-06-23 22:01:16 -07:00
2008-02-12 13:17:07 -08:00
LOAD_ C P _ R E G S ( 0 )
LOAD_ C P _ R E G S ( 1 )
LOAD_ C P _ R E G S ( 2 )
LOAD_ C P _ R E G S ( 3 )
LOAD_ C P _ R E G S ( 4 )
LOAD_ C P _ R E G S ( 5 )
LOAD_ C P _ R E G S ( 6 )
LOAD_ C P _ R E G S ( 7 )
2005-06-23 22:01:16 -07:00
2008-02-12 13:17:07 -08:00
.align 4
2022-04-18 12:44:49 -07:00
.Lcp_regs_jump_table :
CP_ R E G S _ T A B ( 0 )
CP_ R E G S _ T A B ( 1 )
CP_ R E G S _ T A B ( 2 )
CP_ R E G S _ T A B ( 3 )
CP_ R E G S _ T A B ( 4 )
CP_ R E G S _ T A B ( 5 )
CP_ R E G S _ T A B ( 6 )
CP_ R E G S _ T A B ( 7 )
2005-06-23 22:01:16 -07:00
/ *
2008-02-12 13:17:07 -08:00
* Entry c o n d i t i o n :
2005-06-23 22:01:16 -07:00
*
2008-02-12 13:17:07 -08:00
* a0 : trashed, o r i g i n a l v a l u e s a v e d o n s t a c k ( P T _ A R E G 0 )
* a1 : a1
* a2 : new s t a c k p o i n t e r , o r i g i n a l i n D E P C
2013-07-03 20:23:28 +04:00
* a3 : a3
2008-02-12 13:17:07 -08:00
* depc : a2 , o r i g i n a l v a l u e s a v e d o n s t a c k ( P T _ D E P C )
2013-07-03 20:23:28 +04:00
* excsave_1 : dispatch t a b l e
2005-06-23 22:01:16 -07:00
*
2008-02-12 13:17:07 -08:00
* PT_ D E P C > = V A L I D _ D O U B L E _ E X C E P T I O N _ A D D R E S S : d o u b l e e x c e p t i o n , D E P C
* < VALID_DOUBLE_EXCEPTION_ADDRESS : regular e x c e p t i o n
2005-06-23 22:01:16 -07:00
* /
2008-02-12 13:17:07 -08:00
ENTRY( f a s t _ c o p r o c e s s o r )
2022-04-15 03:05:31 -07:00
s3 2 i a3 , a2 , P T _ A R E G 3
# ifdef C O N F I G _ S M P
/ *
* Check i f a n y c o p r o c e s s o r c o n t e x t i s l i v e o n a n o t h e r C P U
* and i f s o g o t h r o u g h t h e C - l e v e l c o p r o c e s s o r e x c e p t i o n h a n d l e r
* to f l u s h i t t o m e m o r y .
* /
GET_ T H R E A D _ I N F O ( a0 , a2 )
l3 2 i a3 , a0 , T H R E A D _ C P E N A B L E
beqz a3 , . L l o a d _ l o c a l
/ *
* Pairs w i t h s m p _ w m b i n l o c a l _ c o p r o c e s s o r _ r e l e a s e _ a l l
* and w i t h b o t h m e m w s b e l o w .
* /
memw
l3 2 i a3 , a0 , T H R E A D _ C P U
l3 2 i a0 , a0 , T H R E A D _ C P _ O W N E R _ C P U
beq a0 , a3 , . L l o a d _ l o c a l
rsr a0 , p s
l3 2 i a3 , a2 , P T _ A R E G 3
bbci. l a0 , P S _ U M _ B I T , 1 f
call0 u s e r _ e x c e p t i o n
1 : call0 k e r n e l _ e x c e p t i o n
# endif
2008-02-12 13:17:07 -08:00
/* Save remaining registers a1-a3 and SAR */
2022-04-15 03:05:31 -07:00
.Lload_local :
2012-10-15 03:55:38 +04:00
rsr a3 , s a r
2008-02-12 13:17:07 -08:00
s3 2 i a1 , a2 , P T _ A R E G 1
s3 2 i a3 , a2 , P T _ S A R
mov a1 , a2
2012-10-15 03:55:38 +04:00
rsr a2 , d e p c
2008-02-12 13:17:07 -08:00
s3 2 i a2 , a1 , P T _ A R E G 2
2022-04-18 12:44:49 -07:00
/* The hal macros require up to 4 temporary registers. We use a3..a6. */
2008-02-12 13:17:07 -08:00
s3 2 i a4 , a1 , P T _ A R E G 4
s3 2 i a5 , a1 , P T _ A R E G 5
s3 2 i a6 , a1 , P T _ A R E G 6
2022-04-18 12:44:49 -07:00
s3 2 i a7 , a1 , P T _ A R E G 7
2022-04-15 03:05:31 -07:00
s3 2 i a8 , a1 , P T _ A R E G 8
s3 2 i a9 , a1 , P T _ A R E G 9
s3 2 i a10 , a1 , P T _ A R E G 1 0
2008-02-12 13:17:07 -08:00
/* Find coprocessor number. Subtract first CP EXCCAUSE from EXCCAUSE */
2012-10-15 03:55:38 +04:00
rsr a3 , e x c c a u s e
2008-02-12 13:17:07 -08:00
addi a3 , a3 , - E X C C A U S E _ C O P R O C E S S O R 0 _ D I S A B L E D
/* Set corresponding CPENABLE bit -> (sar:cp-index, a3: 1<<cp-index)*/
ssl a3 # S A R : 32 - c o p r o c e s s o r _ n u m b e r
movi a2 , 1
2012-10-15 03:55:38 +04:00
rsr a0 , c p e n a b l e
2008-02-12 13:17:07 -08:00
sll a2 , a2
or a0 , a0 , a2
2012-10-15 03:55:38 +04:00
wsr a0 , c p e n a b l e
2008-02-12 13:17:07 -08:00
rsync
2022-04-18 12:44:49 -07:00
/* Get coprocessor save/load table entry (a7). */
movi a7 , . L c p _ r e g s _ j u m p _ t a b l e
addx8 a7 , a3 , a7
addx4 a7 , a3 , a7
2022-04-15 03:05:31 -07:00
/* Retrieve previous owner (a8). */
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
rsr a0 , e x c s a v e 1 # e x c _ t a b l e
2008-02-12 13:17:07 -08:00
addx4 a0 , a3 , a0 # e n t r y f o r C P
2022-04-15 03:05:31 -07:00
l3 2 i a8 , a0 , E X C _ T A B L E _ C O P R O C E S S O R _ O W N E R
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
/* Set new owner (a9). */
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
GET_ T H R E A D _ I N F O ( a9 , a1 )
l3 2 i a4 , a9 , T H R E A D _ C P U
s3 2 i a9 , a0 , E X C _ T A B L E _ C O P R O C E S S O R _ O W N E R
s3 2 i a4 , a9 , T H R E A D _ C P _ O W N E R _ C P U
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
/ *
* Enable c o p r o c e s s o r f o r t h e n e w o w n e r . ( a2 = 1 < < C P n u m b e r )
* This c a n b e d o n e b e f o r e l o a d i n g c o n t e x t i n t o t h e c o p r o c e s s o r .
* /
l3 2 i a4 , a9 , T H R E A D _ C P E N A B L E
or a4 , a4 , a2
2008-02-12 13:17:07 -08:00
/ *
2022-04-15 03:05:31 -07:00
* Make s u r e T H R E A D _ C P _ O W N E R _ C P U i s i n m e m o r y b e f o r e u p d a t i n g
* THREAD_ C P E N A B L E
2008-02-12 13:17:07 -08:00
* /
2022-04-15 03:05:31 -07:00
memw # ( 2 )
s3 2 i a4 , a9 , T H R E A D _ C P E N A B L E
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
beqz a8 , 1 f # s k i p ' s a v e ' i f n o p r e v i o u s o w n e r
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
/* Disable coprocessor for previous owner. (a2 = 1 << CP number) */
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
l3 2 i a10 , a8 , T H R E A D _ C P E N A B L E
xor a10 , a10 , a2
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
/* Get context save area and call save routine. */
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
l3 2 i a2 , a7 , C P _ R E G S _ T A B _ O F F S E T
l3 2 i a3 , a7 , C P _ R E G S _ T A B _ S A V E
add a2 , a2 , a8
callx0 a3
2008-02-12 13:17:07 -08:00
2022-04-15 03:05:31 -07:00
/ *
* Make s u r e c o p r o c e s s o r c o n t e x t a n d T H R E A D _ C P _ O W N E R _ C P U a r e i n m e m o r y
* before u p d a t i n g T H R E A D _ C P E N A B L E
* /
memw # ( 3 )
s3 2 i a10 , a8 , T H R E A D _ C P E N A B L E
1 :
2022-04-13 22:50:54 -07:00
/* Get context save area and call load routine. */
2008-02-12 13:17:07 -08:00
2022-04-18 12:44:49 -07:00
l3 2 i a2 , a7 , C P _ R E G S _ T A B _ O F F S E T
l3 2 i a3 , a7 , C P _ R E G S _ T A B _ L O A D
2022-04-15 03:05:31 -07:00
add a2 , a2 , a9
2022-04-13 22:50:54 -07:00
callx0 a3
2008-02-12 13:17:07 -08:00
/* Restore all registers and return from exception handler. */
2022-04-15 03:05:31 -07:00
l3 2 i a10 , a1 , P T _ A R E G 1 0
l3 2 i a9 , a1 , P T _ A R E G 9
l3 2 i a8 , a1 , P T _ A R E G 8
2022-04-18 12:44:49 -07:00
l3 2 i a7 , a1 , P T _ A R E G 7
2022-04-13 22:50:54 -07:00
l3 2 i a6 , a1 , P T _ A R E G 6
2008-02-12 13:17:07 -08:00
l3 2 i a5 , a1 , P T _ A R E G 5
l3 2 i a4 , a1 , P T _ A R E G 4
l3 2 i a0 , a1 , P T _ S A R
l3 2 i a3 , a1 , P T _ A R E G 3
l3 2 i a2 , a1 , P T _ A R E G 2
2012-10-15 03:55:38 +04:00
wsr a0 , s a r
2008-02-12 13:17:07 -08:00
l3 2 i a0 , a1 , P T _ A R E G 0
l3 2 i a1 , a1 , P T _ A R E G 1
rfe
2012-11-16 16:16:20 -08:00
ENDPROC( f a s t _ c o p r o c e s s o r )
2021-02-25 11:42:46 -08:00
.text
/ *
* coprocessor_ f l u s h ( s t r u c t t h r e a d _ i n f o * , i n d e x )
* a2 a3
*
* Save c o p r o c e s s o r r e g i s t e r s f o r c o p r o c e s s o r ' i n d e x ' .
* The r e g i s t e r v a l u e s a r e s a v e d t o o r l o a d e d f r o m t h e c o p r o c e s s o r a r e a
* inside t h e t a s k _ i n f o s t r u c t u r e .
*
* Note t h a t t h i s f u n c t i o n d o e s n ' t u p d a t e t h e c o p r o c e s s o r _ o w n e r i n f o r m a t i o n !
*
* /
ENTRY( c o p r o c e s s o r _ f l u s h )
2022-04-18 00:14:00 -07:00
abi_ e n t r y _ d e f a u l t
2021-02-25 11:42:46 -08:00
2022-04-18 12:44:49 -07:00
movi a4 , . L c p _ r e g s _ j u m p _ t a b l e
addx8 a4 , a3 , a4
addx4 a3 , a3 , a4
l3 2 i a4 , a3 , C P _ R E G S _ T A B _ S A V E
beqz a4 , 1 f
l3 2 i a3 , a3 , C P _ R E G S _ T A B _ O F F S E T
add a2 , a2 , a3
2022-04-18 00:14:00 -07:00
mov a7 , a0
2022-04-18 12:44:49 -07:00
callx0 a4
2022-04-18 00:14:00 -07:00
mov a0 , a7
1 :
abi_ r e t _ d e f a u l t
2021-02-25 11:42:46 -08:00
ENDPROC( c o p r o c e s s o r _ f l u s h )
2008-02-12 13:17:07 -08:00
# endif / * X T E N S A _ H A V E _ C O P R O C E S S O R S * /