2005-06-23 22:01:24 -07:00
/ *
* arch/ x t e n s a / m m / m i s c . S
*
* Miscellaneous a s s e m b l y f u n c t i o n s .
*
* 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 .
*
2007-08-22 10:14:51 -07:00
* Copyright ( C ) 2 0 0 1 - 2 0 0 7 T e n s i l i c a I n c .
2005-06-23 22:01:24 -07:00
*
* Chris Z a n k e l < c h r i s @zankel.net>
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / p a g e . h >
# include < a s m / p g t a b l e . h >
2006-12-10 02:18:48 -08:00
# include < a s m / a s m m a c r o . h >
# include < a s m / c a c h e a s m . h >
2007-08-22 10:14:51 -07:00
# include < a s m / t l b f l u s h . h >
2005-06-23 22:01:24 -07:00
2007-08-22 10:14:51 -07:00
/ *
* clear_ p a g e a n d c l e a r _ u s e r _ p a g e a r e t h e s a m e f o r n o n - c a c h e - a l i a s e d c o n f i g s .
*
* clear_ p a g e ( u n s i g n e d l o n g p a g e )
* a2
* /
2005-06-23 22:01:24 -07:00
ENTRY( c l e a r _ p a g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry a1 , 1 6
2007-08-22 10:14:51 -07:00
movi a3 , 0
_ _ loopi a2 , a7 , P A G E _ S I Z E , 3 2
s3 2 i a3 , a2 , 0
2005-06-23 22:01:24 -07:00
s3 2 i a3 , a2 , 4
s3 2 i a3 , a2 , 8
s3 2 i a3 , a2 , 1 2
s3 2 i a3 , a2 , 1 6
s3 2 i a3 , a2 , 2 0
s3 2 i a3 , a2 , 2 4
s3 2 i a3 , a2 , 2 8
2007-08-22 10:14:51 -07:00
_ _ endla a2 , a7 , 3 2
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( c l e a r _ p a g e )
2005-06-23 22:01:24 -07:00
/ *
2007-08-22 10:14:51 -07:00
* copy_ p a g e a n d c o p y _ u s e r _ p a g e a r e t h e s a m e f o r n o n - c a c h e - a l i a s e d c o n f i g s .
*
2005-06-23 22:01:24 -07:00
* copy_ p a g e ( v o i d * t o , v o i d * f r o m )
2007-08-22 10:14:51 -07:00
* a2 a3
2005-06-23 22:01:24 -07:00
* /
ENTRY( c o p y _ p a g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry a1 , 1 6
2007-08-22 10:14:51 -07:00
_ _ loopi a2 , a4 , P A G E _ S I Z E , 3 2
l3 2 i a8 , a3 , 0
l3 2 i a9 , a3 , 4
s3 2 i a8 , a2 , 0
s3 2 i a9 , a2 , 4
l3 2 i a8 , a3 , 8
l3 2 i a9 , a3 , 1 2
s3 2 i a8 , a2 , 8
s3 2 i a9 , a2 , 1 2
l3 2 i a8 , a3 , 1 6
l3 2 i a9 , a3 , 2 0
s3 2 i a8 , a2 , 1 6
s3 2 i a9 , a2 , 2 0
l3 2 i a8 , a3 , 2 4
l3 2 i a9 , a3 , 2 8
s3 2 i a8 , a2 , 2 4
s3 2 i a9 , a2 , 2 8
addi a2 , a2 , 3 2
addi a3 , a3 , 3 2
_ _ endl a2 , a4
retw
2012-11-16 16:16:20 -08:00
ENDPROC( c o p y _ p a g e )
2009-03-04 16:21:31 +01:00
# ifdef C O N F I G _ M M U
2007-08-22 10:14:51 -07:00
/ *
* If w e h a v e t o d e a l w i t h c a c h e a l i a s i n g , w e u s e t e m p o r a r y m e m o r y m a p p i n g s
* to e n s u r e t h a t t h e s o u r c e a n d d e s t i n a t i o n p a g e s h a v e t h e s a m e c o l o r a s
* the v i r t u a l a d d r e s s . W e u s e w a y 0 a n d 1 f o r t e m p o r a r y m a p p i n g s i n s u c h c a s e s .
*
* The t e m p o r a r y D T L B e n t r i e s s h o u l d n ' t b e f l u s h e d b y i n t e r r u p t s , b u t a r e
* flushed b y p r e e m p t i v e t a s k s w i t c h e s . S p e c i a l c o d e i n t h e
* fast_ s e c o n d _ l e v e l _ m i s s h a n d l e r r e - e s t a b l i s h e d t h e t e m p o r a r y m a p p i n g .
* It r e q u i r e s t h a t t h e P P N s f o r t h e d e s t i n a t i o n a n d s o u r c e a d d r e s s e s a r e
* in a6 , a n d a7 , r e s p e c t i v e l y .
* /
/* TLB miss exceptions are treated special in the following region */
ENTRY( _ _ t l b t e m p _ m a p p i n g _ s t a r t )
# if ( D C A C H E _ W A Y _ S I Z E > P A G E _ S I Z E )
/ *
2014-07-21 18:54:11 +04:00
* clear_ p a g e _ a l i a s ( v o i d * a d d r , u n s i g n e d l o n g p a d d r )
* a2 a3
2007-08-22 10:14:51 -07:00
* /
2014-07-21 18:54:11 +04:00
ENTRY( c l e a r _ p a g e _ a l i a s )
2012-11-16 16:16:20 -08:00
2007-08-22 10:14:51 -07:00
entry a1 , 3 2
2014-07-21 18:54:11 +04:00
/* Skip setting up a temporary DTLB if not aliased low page. */
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
movi a5 , P A G E _ O F F S E T
movi a6 , 0
beqz a3 , 1 f
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
/* Setup a temporary DTLB for the addr. */
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
addi a6 , a3 , ( P A G E _ K E R N E L | _ P A G E _ H W _ W R I T E )
mov a4 , a2
2007-08-22 10:14:51 -07:00
wdtlb a6 , a2
dsync
1 : movi a3 , 0
_ _ loopi a2 , a7 , P A G E _ S I Z E , 3 2
s3 2 i a3 , a2 , 0
s3 2 i a3 , a2 , 4
s3 2 i a3 , a2 , 8
s3 2 i a3 , a2 , 1 2
s3 2 i a3 , a2 , 1 6
s3 2 i a3 , a2 , 2 0
s3 2 i a3 , a2 , 2 4
s3 2 i a3 , a2 , 2 8
_ _ endla a2 , a7 , 3 2
bnez a6 , 1 f
retw
/* We need to invalidate the temporary idtlb entry, if any. */
2014-07-21 18:54:11 +04:00
1 : idtlb a4
2007-08-22 10:14:51 -07:00
dsync
retw
2014-07-21 18:54:11 +04:00
ENDPROC( c l e a r _ p a g e _ a l i a s )
2012-11-16 16:16:20 -08:00
2007-08-22 10:14:51 -07:00
/ *
2014-07-21 18:54:11 +04:00
* copy_ p a g e _ a l i a s ( v o i d * t o , v o i d * f r o m ,
* a2 a3
* unsigned l o n g t o _ p a d d r , u n s i g n e d l o n g f r o m _ p a d d r )
* a4 a5
2007-08-22 10:14:51 -07:00
* /
2014-07-21 18:54:11 +04:00
ENTRY( c o p y _ p a g e _ a l i a s )
2007-08-22 10:14:51 -07:00
2012-11-28 16:53:51 -08:00
entry a1 , 3 2
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
/* Skip setting up a temporary DTLB for destination if not aliased. */
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
movi a6 , 0
movi a7 , 0
beqz a4 , 1 f
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
/* Setup a temporary DTLB for destination. */
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
addi a6 , a4 , ( P A G E _ K E R N E L | _ P A G E _ H W _ W R I T E )
2007-08-22 10:14:51 -07:00
wdtlb a6 , a2
dsync
2014-07-21 18:54:11 +04:00
/* Skip setting up a temporary DTLB for source if not aliased. */
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
1 : beqz a5 , 1 f
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
/* Setup a temporary DTLB for source. */
2007-08-22 10:14:51 -07:00
2014-07-21 18:54:11 +04:00
addi a7 , a5 , P A G E _ K E R N E L
2007-08-22 10:14:51 -07:00
addi a8 , a3 , 1 # w a y 1
wdtlb a7 , a8
dsync
1 : _ _ loopi a2 , a4 , P A G E _ S I Z E , 3 2
l3 2 i a8 , a3 , 0
l3 2 i a9 , a3 , 4
s3 2 i a8 , a2 , 0
s3 2 i a9 , a2 , 4
l3 2 i a8 , a3 , 8
l3 2 i a9 , a3 , 1 2
s3 2 i a8 , a2 , 8
s3 2 i a9 , a2 , 1 2
l3 2 i a8 , a3 , 1 6
l3 2 i a9 , a3 , 2 0
s3 2 i a8 , a2 , 1 6
s3 2 i a9 , a2 , 2 0
l3 2 i a8 , a3 , 2 4
l3 2 i a9 , a3 , 2 8
s3 2 i a8 , a2 , 2 4
s3 2 i a9 , a2 , 2 8
addi a2 , a2 , 3 2
addi a3 , a3 , 3 2
_ _ endl a2 , a4
/* We need to invalidate any temporary mapping! */
bnez a6 , 1 f
bnez a7 , 2 f
retw
1 : addi a2 , a2 , - P A G E _ S I Z E
idtlb a2
dsync
bnez a7 , 2 f
retw
2 : addi a3 , a3 , - P A G E _ S I Z E + 1
idtlb a3
dsync
retw
2014-07-21 18:54:11 +04:00
ENDPROC( c o p y _ p a g e _ a l i a s )
2012-11-16 16:16:20 -08:00
2007-08-22 10:14:51 -07:00
# endif
# if ( D C A C H E _ W A Y _ S I Z E > P A G E _ S I Z E )
/ *
* void _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ p a g e _ a l i a s ( a d d r , p h y s )
* a2 a3
* /
ENTRY( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ p a g e _ a l i a s )
2012-11-16 16:16:20 -08:00
2007-08-22 10:14:51 -07:00
entry s p , 1 6
movi a7 , 0 # r e q u i r e d f o r e x c e p t i o n h a n d l e r
addi a6 , a3 , ( P A G E _ K E R N E L | _ P A G E _ H W _ W R I T E )
mov a4 , a2
wdtlb a6 , a2
dsync
_ _ _ flush_ i n v a l i d a t e _ d c a c h e _ p a g e a2 a3
idtlb a4
dsync
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ p a g e _ a l i a s )
2014-07-21 18:54:11 +04:00
/ *
* void _ _ i n v a l i d a t e _ d c a c h e _ p a g e _ a l i a s ( a d d r , p h y s )
* a2 a3
* /
ENTRY( _ _ i n v a l i d a t e _ d c a c h e _ p a g e _ a l i a s )
entry s p , 1 6
movi a7 , 0 # r e q u i r e d f o r e x c e p t i o n h a n d l e r
addi a6 , a3 , ( P A G E _ K E R N E L | _ P A G E _ H W _ W R I T E )
mov a4 , a2
wdtlb a6 , a2
dsync
_ _ _ invalidate_ d c a c h e _ p a g e a2 a3
idtlb a4
dsync
retw
ENDPROC( _ _ i n v a l i d a t e _ d c a c h e _ p a g e _ a l i a s )
2007-08-22 10:14:51 -07:00
# endif
ENTRY( _ _ t l b t e m p _ m a p p i n g _ i t l b )
# if ( I C A C H E _ W A Y _ S I Z E > P A G E _ S I Z E )
ENTRY( _ _ i n v a l i d a t e _ i c a c h e _ p a g e _ a l i a s )
2012-11-16 16:16:20 -08:00
2007-08-22 10:14:51 -07:00
entry s p , 1 6
2008-02-12 10:11:45 -08:00
addi a6 , a3 , ( P A G E _ K E R N E L _ E X E C | _ P A G E _ H W _ W R I T E )
2007-08-22 10:14:51 -07:00
mov a4 , a2
witlb a6 , a2
isync
_ _ _ invalidate_ i c a c h e _ p a g e a2 a3
iitlb a4
isync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ i c a c h e _ p a g e _ a l i a s )
2007-08-22 10:14:51 -07:00
# endif
/* End of special treatment in tlb miss exception */
ENTRY( _ _ t l b t e m p _ m a p p i n g _ e n d )
2012-11-16 16:16:20 -08:00
2009-03-04 16:21:31 +01:00
# endif / * C O N F I G _ M M U
2007-08-22 10:14:51 -07:00
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ _ i n v a l i d a t e _ i c a c h e _ p a g e ( u l o n g s t a r t )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ i n v a l i d a t e _ i c a c h e _ p a g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ invalidate_ i c a c h e _ p a g e a2 a3
isync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ i c a c h e _ p a g e )
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ _ i n v a l i d a t e _ d c a c h e _ p a g e ( u l o n g s t a r t )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ i n v a l i d a t e _ d c a c h e _ p a g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ invalidate_ d c a c h e _ p a g e a2 a3
dsync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ d c a c h e _ p a g e )
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ p a g e ( u l o n g s t a r t )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ p a g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ flush_ i n v a l i d a t e _ d c a c h e _ p a g e a2 a3
2005-06-23 22:01:24 -07:00
2006-12-10 02:18:48 -08:00
dsync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ p a g e )
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ _ f l u s h _ d c a c h e _ p a g e ( u l o n g s t a r t )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ f l u s h _ d c a c h e _ p a g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ flush_ d c a c h e _ p a g e a2 a3
2005-06-23 22:01:24 -07:00
2006-12-10 02:18:48 -08:00
dsync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ f l u s h _ d c a c h e _ p a g e )
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ _ i n v a l i d a t e _ i c a c h e _ r a n g e ( u l o n g s t a r t , u l o n g s i z e )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ i n v a l i d a t e _ i c a c h e _ r a n g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ invalidate_ i c a c h e _ r a n g e a2 a3 a4
isync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ i c a c h e _ r a n g e )
2005-06-23 22:01:24 -07:00
/ *
* void _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ r a n g e ( u l o n g s t a r t , u l o n g s i z e )
* /
ENTRY( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ r a n g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ flush_ i n v a l i d a t e _ d c a c h e _ r a n g e a2 a3 a4
dsync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ r a n g e )
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ f l u s h _ d c a c h e _ r a n g e ( u l o n g s t a r t , u l o n g s i z e )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ f l u s h _ d c a c h e _ r a n g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ flush_ d c a c h e _ r a n g e a2 a3 a4
2005-06-23 22:01:24 -07:00
dsync
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ f l u s h _ d c a c h e _ r a n g e )
2006-12-10 02:18:48 -08:00
/ *
* void _ i n v a l i d a t e _ d c a c h e _ r a n g e ( u l o n g s t a r t , u l o n g s i z e )
* /
2005-06-23 22:01:24 -07:00
2006-12-10 02:18:48 -08:00
ENTRY( _ _ i n v a l i d a t e _ d c a c h e _ r a n g e )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ invalidate_ d c a c h e _ r a n g e a2 a3 a4
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ d c a c h e _ r a n g e )
2006-12-10 02:18:48 -08:00
/ *
* void _ i n v a l i d a t e _ i c a c h e _ a l l ( v o i d )
* /
2005-06-23 22:01:24 -07:00
2006-12-10 02:18:48 -08:00
ENTRY( _ _ i n v a l i d a t e _ i c a c h e _ a l l )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ invalidate_ i c a c h e _ a l l a2 a3
isync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ i c a c h e _ a l l )
2005-06-23 22:01:24 -07:00
/ *
2006-12-10 02:18:48 -08:00
* void _ f l u s h _ i n v a l i d a t e _ d c a c h e _ a l l ( v o i d )
2005-06-23 22:01:24 -07:00
* /
2006-12-10 02:18:48 -08:00
ENTRY( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ a l l )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ flush_ i n v a l i d a t e _ d c a c h e _ a l l a2 a3
dsync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ f l u s h _ i n v a l i d a t e _ d c a c h e _ a l l )
2006-12-10 02:18:48 -08:00
/ *
* void _ i n v a l i d a t e _ d c a c h e _ a l l ( v o i d )
* /
2005-06-23 22:01:24 -07:00
2006-12-10 02:18:48 -08:00
ENTRY( _ _ i n v a l i d a t e _ d c a c h e _ a l l )
2012-11-16 16:16:20 -08:00
2005-06-23 22:01:24 -07:00
entry s p , 1 6
2006-12-10 02:18:48 -08:00
_ _ _ invalidate_ d c a c h e _ a l l a2 a3
dsync
2005-06-23 22:01:24 -07:00
retw
2012-11-16 16:16:20 -08:00
ENDPROC( _ _ i n v a l i d a t e _ d c a c h e _ a l l )