2005-04-16 15:20:36 -07:00
/ * clear_ p a g e . S : U l t r a S p a r c o p t i m i z e d c o p y p a g e .
*
* Copyright ( C ) 1 9 9 6 , 1 9 9 8 , 1 9 9 9 , 2 0 0 0 , 2 0 0 4 D a v i d S . M i l l e r ( d a v e m @redhat.com)
* Copyright ( C ) 1 9 9 7 J a k u b J e l i n e k ( j a k u b @redhat.com)
* /
# include < a s m / v i s a s m . h >
# include < a s m / t h r e a d _ i n f o . h >
# include < a s m / p a g e . h >
# include < a s m / p g t a b l e . h >
# include < a s m / s p i t f i r e . h >
# include < a s m / h e a d . h >
/ * What w e u s e d t o d o w a s l o c k a T L B e n t r y i n t o a s p e c i f i c
* TLB s l o t , c l e a r t h e p a g e w i t h i n t e r r u p t s d i s a b l e d , t h e n
* restore t h e o r i g i n a l T L B e n t r y . T h i s w a s g r e a t f o r
* disturbing t h e T L B a s l i t t l e a s p o s s i b l e , b u t i t m e a n t
* we h a d t o k e e p i n t e r r u p t s d i s a b l e d f o r a l o n g t i m e .
*
* Now, w e s i m p l y u s e t h e n o r m a l T L B l o a d i n g m e c h a n i s m ,
* and t h i s m a k e s t h e c p u c h o o s e a s l o t a l l b y i t s e l f .
* Then w e d o a n o r m a l T L B f l u s h o n e x i t . W e n e e d o n l y
* disable p r e e m p t i o n d u r i n g t h e c l e a r .
* /
# define D C A C H E _ S I Z E ( P A G E _ S I Z E * 2 )
2008-07-17 23:43:55 -07:00
# if ( P A G E _ S H I F T = = 1 3 )
2005-04-16 15:20:36 -07:00
# define P A G E _ S I Z E _ R E M 0 x80
2008-07-17 23:43:55 -07:00
# elif ( P A G E _ S H I F T = = 1 6 )
2005-04-16 15:20:36 -07:00
# define P A G E _ S I Z E _ R E M 0 x10 0
# else
# error W r o n g P A G E _ S H I F T s p e c i f i e d
# endif
# define T O U C H ( r e g 0 , r e g 1 , r e g 2 , r e g 3 , r e g 4 , r e g 5 , r e g 6 , r e g 7 ) \
2012-06-27 01:25:23 -07:00
fsrc2 % r e g 0 , % f48 ; fsrc2 %reg1, %f50; \
fsrc2 % r e g 2 , % f52 ; fsrc2 %reg3, %f54; \
fsrc2 % r e g 4 , % f56 ; fsrc2 %reg5, %f58; \
fsrc2 % r e g 6 , % f60 ; fsrc2 %reg7, %f62;
2005-04-16 15:20:36 -07:00
.text
.align 32
.globl copy_user_page
.type copy_ u s e r _ p a g e ,#f u n c t i o n
copy_user_page : /* %o0=dest, %o1=src, %o2=vaddr */
lduw [ % g 6 + T I _ P R E _ C O U N T ] , % o 4
sethi % u h i ( P A G E _ O F F S E T ) , % g 2
sethi % h i ( P A G E _ S I Z E ) , % o 3
sllx % g 2 , 3 2 , % g 2
2006-02-11 21:57:54 -08:00
sethi % h i ( P A G E _ K E R N E L _ L O C K E D ) , % g 3
2005-04-16 15:20:36 -07:00
2006-02-11 21:57:54 -08:00
ldx [ % g 3 + % l o ( P A G E _ K E R N E L _ L O C K E D ) ] , % g 3
2005-04-16 15:20:36 -07:00
sub % o 0 , % g 2 , % g 1 ! d e s t p a d d r
sub % o 1 , % g 2 , % g 2 ! s r c p a d d r
and % o 2 , % o 3 , % o 0 ! v a d d r D - c a c h e a l i a s b i t
or % g 1 , % g 3 , % g 1 ! d e s t T T E d a t a
or % g 2 , % g 3 , % g 2 ! s r c T T E d a t a
sethi % h i ( T L B T E M P _ B A S E ) , % o 3
sethi % h i ( D C A C H E _ S I Z E ) , % o 1
add % o 0 , % o 3 , % o 0 ! d e s t T T E v a d d r
add % o 4 , 1 , % o 2
add % o 0 , % o 1 , % o 1 ! s r c T T E v a d d r
/* Disable preemption. */
mov T L B _ T A G _ A C C E S S , % g 3
stw % o 2 , [ % g 6 + T I _ P R E _ C O U N T ]
/* Load TLB entries. */
rdpr % p s t a t e , % o 2
wrpr % o 2 , P S T A T E _ I E , % p s t a t e
stxa % o 0 , [ % g 3 ] A S I _ D M M U
stxa % g 1 , [ % g 0 ] A S I _ D T L B _ D A T A _ I N
membar #S y n c
stxa % o 1 , [ % g 3 ] A S I _ D M M U
stxa % g 2 , [ % g 0 ] A S I _ D T L B _ D A T A _ I N
membar #S y n c
wrpr % o 2 , 0 x0 , % p s t a t e
2005-08-30 11:26:15 -07:00
cheetah_copy_page_insn :
2005-04-16 15:20:36 -07:00
ba,p t % x c c , 9 f
nop
1 :
VISEntryHalf
membar #S t o r e L o a d | # S t o r e S t o r e | # L o a d S t o r e
sethi % h i ( ( P A G E _ S I Z E / 6 4 ) - 2 ) , % o 2
mov % o 0 , % g 1
prefetch [ % o 1 + 0 x00 0 ] , #o n e _ r e a d
or % o 2 , % l o ( ( P A G E _ S I Z E / 6 4 ) - 2 ) , % o 2
prefetch [ % o 1 + 0 x04 0 ] , #o n e _ r e a d
prefetch [ % o 1 + 0 x08 0 ] , #o n e _ r e a d
prefetch [ % o 1 + 0 x0 c0 ] , #o n e _ r e a d
ldd [ % o 1 + 0 x00 0 ] , % f0
prefetch [ % o 1 + 0 x10 0 ] , #o n e _ r e a d
ldd [ % o 1 + 0 x00 8 ] , % f2
prefetch [ % o 1 + 0 x14 0 ] , #o n e _ r e a d
ldd [ % o 1 + 0 x01 0 ] , % f4
prefetch [ % o 1 + 0 x18 0 ] , #o n e _ r e a d
2012-06-27 01:25:23 -07:00
fsrc2 % f0 , % f16
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x01 8 ] , % f6
2012-06-27 01:25:23 -07:00
fsrc2 % f2 , % f18
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x02 0 ] , % f8
2012-06-27 01:25:23 -07:00
fsrc2 % f4 , % f20
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x02 8 ] , % f10
2012-06-27 01:25:23 -07:00
fsrc2 % f6 , % f22
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x03 0 ] , % f12
2012-06-27 01:25:23 -07:00
fsrc2 % f8 , % f24
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x03 8 ] , % f14
2012-06-27 01:25:23 -07:00
fsrc2 % f10 , % f26
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x04 0 ] , % f0
1 : ldd [ % o 1 + 0 x04 8 ] , % f2
2012-06-27 01:25:23 -07:00
fsrc2 % f12 , % f28
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x05 0 ] , % f4
2012-06-27 01:25:23 -07:00
fsrc2 % f14 , % f30
2005-04-16 15:20:36 -07:00
stda % f16 , [ % o 0 ] A S I _ B L K _ P
ldd [ % o 1 + 0 x05 8 ] , % f6
2012-06-27 01:25:23 -07:00
fsrc2 % f0 , % f16
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x06 0 ] , % f8
2012-06-27 01:25:23 -07:00
fsrc2 % f2 , % f18
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x06 8 ] , % f10
2012-06-27 01:25:23 -07:00
fsrc2 % f4 , % f20
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x07 0 ] , % f12
2012-06-27 01:25:23 -07:00
fsrc2 % f6 , % f22
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x07 8 ] , % f14
2012-06-27 01:25:23 -07:00
fsrc2 % f8 , % f24
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x08 0 ] , % f0
prefetch [ % o 1 + 0 x18 0 ] , #o n e _ r e a d
2012-06-27 01:25:23 -07:00
fsrc2 % f10 , % f26
2005-04-16 15:20:36 -07:00
subcc % o 2 , 1 , % o 2
add % o 0 , 0 x40 , % o 0
bne,p t % x c c , 1 b
add % o 1 , 0 x40 , % o 1
ldd [ % o 1 + 0 x04 8 ] , % f2
2012-06-27 01:25:23 -07:00
fsrc2 % f12 , % f28
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x05 0 ] , % f4
2012-06-27 01:25:23 -07:00
fsrc2 % f14 , % f30
2005-04-16 15:20:36 -07:00
stda % f16 , [ % o 0 ] A S I _ B L K _ P
ldd [ % o 1 + 0 x05 8 ] , % f6
2012-06-27 01:25:23 -07:00
fsrc2 % f0 , % f16
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x06 0 ] , % f8
2012-06-27 01:25:23 -07:00
fsrc2 % f2 , % f18
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x06 8 ] , % f10
2012-06-27 01:25:23 -07:00
fsrc2 % f4 , % f20
2005-04-16 15:20:36 -07:00
ldd [ % o 1 + 0 x07 0 ] , % f12
2012-06-27 01:25:23 -07:00
fsrc2 % f6 , % f22
2005-04-16 15:20:36 -07:00
add % o 0 , 0 x40 , % o 0
ldd [ % o 1 + 0 x07 8 ] , % f14
2012-06-27 01:25:23 -07:00
fsrc2 % f8 , % f24
fsrc2 % f10 , % f26
fsrc2 % f12 , % f28
fsrc2 % f14 , % f30
2005-04-16 15:20:36 -07:00
stda % f16 , [ % o 0 ] A S I _ B L K _ P
membar #S y n c
VISExitHalf
ba,p t % x c c , 5 f
nop
9 :
VISEntry
ldub [ % g 6 + T I _ F A U L T _ C O D E ] , % g 3
mov % o 0 , % g 1
cmp % g 3 , 0
rd % a s i , % g 3
be,a ,p t % i c c , 1 f
wr % g 0 , A S I _ B L K _ P , % a s i
wr % g 0 , A S I _ B L K _ C O M M I T _ P , % a s i
1 : ldda [ % o 1 ] A S I _ B L K _ P , % f0
add % o 1 , 0 x40 , % o 1
ldda [ % o 1 ] A S I _ B L K _ P , % f16
add % o 1 , 0 x40 , % o 1
sethi % h i ( P A G E _ S I Z E ) , % o 2
1 : TOUCH( f0 , f2 , f4 , f6 , f8 , f10 , f12 , f14 )
ldda [ % o 1 ] A S I _ B L K _ P , % f32
stda % f48 , [ % o 0 ] % a s i
add % o 1 , 0 x40 , % o 1
sub % o 2 , 0 x40 , % o 2
add % o 0 , 0 x40 , % o 0
TOUCH( f16 , f18 , f20 , f22 , f24 , f26 , f28 , f30 )
ldda [ % o 1 ] A S I _ B L K _ P , % f0
stda % f48 , [ % o 0 ] % a s i
add % o 1 , 0 x40 , % o 1
sub % o 2 , 0 x40 , % o 2
add % o 0 , 0 x40 , % o 0
TOUCH( f32 , f34 , f36 , f38 , f40 , f42 , f44 , f46 )
ldda [ % o 1 ] A S I _ B L K _ P , % f16
stda % f48 , [ % o 0 ] % a s i
sub % o 2 , 0 x40 , % o 2
add % o 1 , 0 x40 , % o 1
cmp % o 2 , P A G E _ S I Z E _ R E M
bne,p t % x c c , 1 b
add % o 0 , 0 x40 , % o 0
2008-07-17 23:43:55 -07:00
# if ( P A G E _ S H I F T = = 1 6 )
2005-04-16 15:20:36 -07:00
TOUCH( f0 , f2 , f4 , f6 , f8 , f10 , f12 , f14 )
ldda [ % o 1 ] A S I _ B L K _ P , % f32
stda % f48 , [ % o 0 ] % a s i
add % o 1 , 0 x40 , % o 1
sub % o 2 , 0 x40 , % o 2
add % o 0 , 0 x40 , % o 0
TOUCH( f16 , f18 , f20 , f22 , f24 , f26 , f28 , f30 )
ldda [ % o 1 ] A S I _ B L K _ P , % f0
stda % f48 , [ % o 0 ] % a s i
add % o 1 , 0 x40 , % o 1
sub % o 2 , 0 x40 , % o 2
add % o 0 , 0 x40 , % o 0
membar #S y n c
stda % f32 , [ % o 0 ] % a s i
add % o 0 , 0 x40 , % o 0
stda % f0 , [ % o 0 ] % a s i
# else
membar #S y n c
stda % f0 , [ % o 0 ] % a s i
add % o 0 , 0 x40 , % o 0
stda % f16 , [ % o 0 ] % a s i
# endif
membar #S y n c
wr % g 3 , 0 x0 , % a s i
VISExit
5 :
stxa % g 0 , [ % g 1 ] A S I _ D M M U _ D E M A P
membar #S y n c
sethi % h i ( D C A C H E _ S I Z E ) , % g 2
stxa % g 0 , [ % g 1 + % g 2 ] A S I _ D M M U _ D E M A P
membar #S y n c
retl
stw % o 4 , [ % g 6 + T I _ P R E _ C O U N T ]
.size copy_ u s e r _ p a g e , . - c o p y _ u s e r _ p a g e
2005-08-30 11:26:15 -07:00
.globl cheetah_patch_copy_page
cheetah_patch_copy_page :
sethi % h i ( 0 x01 0 0 0 0 0 0 ) , % o 1 ! N O P
sethi % h i ( c h e e t a h _ c o p y _ p a g e _ i n s n ) , % o 0
or % o 0 , % l o ( c h e e t a h _ c o p y _ p a g e _ i n s n ) , % o 0
stw % o 1 , [ % o 0 ]
membar #S t o r e S t o r e
flush % o 0
retl
nop