2006-02-08 03:09:12 +03:00
/ * NGpage. S : N i a g a r a o p t i m i z e c l e a r a n d c o p y p a g e .
*
* Copyright ( C ) 2 0 0 6 ( d a v e m @davemloft.net)
* /
# include < a s m / a s i . h >
# include < a s m / p a g e . h >
.text
.align 32
/ * This i s h e a v i l y s i m p l i f i e d f r o m t h e s u n 4 u v a r i a n t s
* because N i a g a r a d o e s n o t h a v e a n y D - c a c h e a l i a s i n g i s s u e s
* and a l s o w e d o n ' t n e e d t o u s e t h e F P U i n o r d e r t o i m p l e m e n t
* an o p t i m a l p a g e c o p y / c l e a r .
* /
NGcopy_user_page : /* %o0=dest, %o1=src, %o2=vaddr */
2011-08-02 05:18:57 +04:00
save % s p , - 1 9 2 , % s p
rd % a s i , % g 3
wr % g 0 , A S I _ B L K _ I N I T _ Q U A D _ L D D _ P , % a s i
2006-02-08 03:09:12 +03:00
set P A G E _ S I Z E , % g 7
2011-08-02 05:18:57 +04:00
prefetch [ % i 1 + 0 x00 ] , #o n e _ r e a d
prefetch [ % i 1 + 0 x40 ] , #o n e _ r e a d
2006-02-08 03:09:12 +03:00
2011-08-02 05:18:57 +04:00
1 : prefetch [ % i 1 + 0 x80 ] , #o n e _ r e a d
prefetch [ % i 1 + 0 x c0 ] , #o n e _ r e a d
ldda [ % i 1 + 0 x00 ] % a s i , % o 2
ldda [ % i 1 + 0 x10 ] % a s i , % o 4
ldda [ % i 1 + 0 x20 ] % a s i , % l 2
ldda [ % i 1 + 0 x30 ] % a s i , % l 4
stxa % o 2 , [ % i 0 + 0 x00 ] % a s i
stxa % o 3 , [ % i 0 + 0 x08 ] % a s i
stxa % o 4 , [ % i 0 + 0 x10 ] % a s i
stxa % o 5 , [ % i 0 + 0 x18 ] % a s i
stxa % l 2 , [ % i 0 + 0 x20 ] % a s i
stxa % l 3 , [ % i 0 + 0 x28 ] % a s i
stxa % l 4 , [ % i 0 + 0 x30 ] % a s i
stxa % l 5 , [ % i 0 + 0 x38 ] % a s i
ldda [ % i 1 + 0 x40 ] % a s i , % o 2
ldda [ % i 1 + 0 x50 ] % a s i , % o 4
ldda [ % i 1 + 0 x60 ] % a s i , % l 2
ldda [ % i 1 + 0 x70 ] % a s i , % l 4
stxa % o 2 , [ % i 0 + 0 x40 ] % a s i
stxa % o 3 , [ % i 0 + 0 x48 ] % a s i
stxa % o 4 , [ % i 0 + 0 x50 ] % a s i
stxa % o 5 , [ % i 0 + 0 x58 ] % a s i
stxa % l 2 , [ % i 0 + 0 x60 ] % a s i
stxa % l 3 , [ % i 0 + 0 x68 ] % a s i
stxa % l 4 , [ % i 0 + 0 x70 ] % a s i
stxa % l 5 , [ % i 0 + 0 x78 ] % a s i
add % i 1 , 1 2 8 , % i 1
subcc % g 7 , 1 2 8 , % g 7
2006-02-08 03:09:12 +03:00
bne,p t % x c c , 1 b
2011-08-02 05:18:57 +04:00
add % i 0 , 1 2 8 , % i 0
wr % g 3 , 0 x0 , % a s i
2007-03-19 23:27:33 +03:00
membar #S y n c
2011-08-02 05:18:57 +04:00
ret
restore
2006-02-08 03:09:12 +03:00
2011-08-02 05:18:57 +04:00
.align 32
2012-09-27 08:11:01 +04:00
.globl NGclear_page
.globl NGclear_user_page
2006-02-08 03:09:12 +03:00
NGclear_page : /* %o0=dest */
NGclear_user_page : /* %o0=dest, %o1=vaddr */
2011-08-02 05:18:57 +04:00
rd % a s i , % g 3
wr % g 0 , A S I _ B L K _ I N I T _ Q U A D _ L D D _ P , % a s i
2006-02-08 03:09:12 +03:00
set P A G E _ S I Z E , % g 7
2011-08-02 05:18:57 +04:00
1 : stxa % g 0 , [ % o 0 + 0 x00 ] % a s i
stxa % g 0 , [ % o 0 + 0 x08 ] % a s i
stxa % g 0 , [ % o 0 + 0 x10 ] % a s i
stxa % g 0 , [ % o 0 + 0 x18 ] % a s i
stxa % g 0 , [ % o 0 + 0 x20 ] % a s i
stxa % g 0 , [ % o 0 + 0 x28 ] % a s i
stxa % g 0 , [ % o 0 + 0 x30 ] % a s i
stxa % g 0 , [ % o 0 + 0 x38 ] % a s i
stxa % g 0 , [ % o 0 + 0 x40 ] % a s i
stxa % g 0 , [ % o 0 + 0 x48 ] % a s i
stxa % g 0 , [ % o 0 + 0 x50 ] % a s i
stxa % g 0 , [ % o 0 + 0 x58 ] % a s i
stxa % g 0 , [ % o 0 + 0 x60 ] % a s i
stxa % g 0 , [ % o 0 + 0 x68 ] % a s i
stxa % g 0 , [ % o 0 + 0 x70 ] % a s i
stxa % g 0 , [ % o 0 + 0 x78 ] % a s i
stxa % g 0 , [ % o 0 + 0 x80 ] % a s i
stxa % g 0 , [ % o 0 + 0 x88 ] % a s i
stxa % g 0 , [ % o 0 + 0 x90 ] % a s i
stxa % g 0 , [ % o 0 + 0 x98 ] % a s i
stxa % g 0 , [ % o 0 + 0 x a0 ] % a s i
stxa % g 0 , [ % o 0 + 0 x a8 ] % a s i
stxa % g 0 , [ % o 0 + 0 x b0 ] % a s i
stxa % g 0 , [ % o 0 + 0 x b8 ] % a s i
stxa % g 0 , [ % o 0 + 0 x c0 ] % a s i
stxa % g 0 , [ % o 0 + 0 x c8 ] % a s i
stxa % g 0 , [ % o 0 + 0 x d0 ] % a s i
stxa % g 0 , [ % o 0 + 0 x d8 ] % a s i
stxa % g 0 , [ % o 0 + 0 x e 0 ] % a s i
stxa % g 0 , [ % o 0 + 0 x e 8 ] % a s i
stxa % g 0 , [ % o 0 + 0 x f0 ] % a s i
stxa % g 0 , [ % o 0 + 0 x f8 ] % a s i
subcc % g 7 , 2 5 6 , % g 7
2006-02-08 03:09:12 +03:00
bne,p t % x c c , 1 b
2011-08-02 05:18:57 +04:00
add % o 0 , 2 5 6 , % o 0
wr % g 3 , 0 x0 , % a s i
2007-03-19 23:27:33 +03:00
membar #S y n c
2006-02-08 03:09:12 +03:00
retl
nop
# define B R A N C H _ A L W A Y S 0 x10 6 8 0 0 0 0
# define N O P 0 x01 0 0 0 0 0 0
# define N G _ D O _ P A T C H ( O L D , N E W ) \
sethi % h i ( N E W ) , % g 1 ; \
or % g 1 , % l o ( N E W ) , % g 1 ; \
sethi % h i ( O L D ) , % g 2 ; \
or % g 2 , % l o ( O L D ) , % g 2 ; \
sub % g 1 , % g 2 , % g 1 ; \
sethi % h i ( B R A N C H _ A L W A Y S ) , % g 3 ; \
2006-02-12 10:28:40 +03:00
sll % g 1 , 1 1 , % g 1 ; \
srl % g 1 , 1 1 + 2 , % g 1 ; \
2006-02-08 03:09:12 +03:00
or % g 3 , % l o ( B R A N C H _ A L W A Y S ) , % g 3 ; \
or % g 3 , % g 1 , % g 3 ; \
stw % g 3 , [ % g 2 ] ; \
sethi % h i ( N O P ) , % g 3 ; \
or % g 3 , % l o ( N O P ) , % g 3 ; \
stw % g 3 , [ % g 2 + 0 x4 ] ; \
flush % g 2 ;
.globl niagara_patch_pageops
.type niagara_ p a t c h _ p a g e o p s ,#f u n c t i o n
niagara_patch_pageops :
NG_ D O _ P A T C H ( c o p y _ u s e r _ p a g e , N G c o p y _ u s e r _ p a g e )
NG_ D O _ P A T C H ( _ c l e a r _ p a g e , N G c l e a r _ p a g e )
NG_ D O _ P A T C H ( c l e a r _ u s e r _ p a g e , N G c l e a r _ u s e r _ p a g e )
retl
nop
.size niagara_ p a t c h _ p a g e o p s ,. - n i a g a r a _ p a t c h _ p a g e o p s