2005-11-11 21:15:21 +11:00
/ *
* Userland i m p l e m e n t a t i o n o f g e t t i m e o f d a y ( ) f o r 3 2 b i t s p r o c e s s e s i n a
* ppc6 4 k e r n e l f o r u s e i n t h e v D S O
*
* Copyright ( C ) 2 0 0 4 B e n j a m i n H e r r e n s c h m u i d t ( b e n h @kernel.crashing.org,
* IBM C o r p .
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or
* modify i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* as p u b l i s h e d b y t h e F r e e S o f t w a r e F o u n d a t i o n ; either version
* 2 of t h e L i c e n s e , o r ( a t y o u r o p t i o n ) a n y l a t e r v e r s i o n .
* /
# include < a s m / p r o c e s s o r . h >
# include < a s m / p p c _ a s m . h >
# include < a s m / v d s o . h >
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / u n i s t d . h >
.text
/ *
* Exact p r o t o t y p e o f g e t t i m e o f d a y
*
* int _ _ k e r n e l _ g e t t i m e o f d a y ( s t r u c t t i m e v a l * t v , s t r u c t t i m e z o n e * t z ) ;
*
* /
V_ F U N C T I O N _ B E G I N ( _ _ k e r n e l _ g e t t i m e o f d a y )
.cfi_startproc
mflr r12
.cfi_register lr,r12
mr r10 ,r3 / * r10 s a v e s t v * /
mr r11 ,r4 / * r11 s a v e s t z * /
bl _ _ g e t _ d a t a p a g e @local /* get data page */
mr r9 , r3 / * d a t a p a g e p t r i n r9 * /
2007-06-26 09:50:32 +10:00
cmplwi r10 ,0 / * c h e c k i f t v i s N U L L * /
beq 3 f
2005-11-11 21:15:21 +11:00
bl _ _ d o _ g e t _ x s e c @local /* get xsec from tb & kernel */
bne- 2 f / * o u t o f l i n e - > d o s y s c a l l * /
/* seconds are xsec >> 20 */
rlwinm r5 ,r4 ,1 2 ,2 0 ,3 1
rlwimi r5 ,r3 ,1 2 ,0 ,1 9
stw r5 ,T V A L 3 2 _ T V _ S E C ( r10 )
/ * get r e m a i n i n g x s e c a n d c o n v e r t t o u s e c . w e s c a l e
* up r e m a i n i n g x s e c b y 1 2 b i t s a n d g e t t h e t o p 3 2 b i t s
* of t h e m u l t i p l i c a t i o n
* /
rlwinm r5 ,r4 ,1 2 ,0 ,1 9
lis r6 ,1 0 0 0 0 0 0 @h
ori r6 ,r6 ,1 0 0 0 0 0 0 @l
mulhwu r5 ,r5 ,r6
stw r5 ,T V A L 3 2 _ T V _ U S E C ( r10 )
2007-06-26 09:50:32 +10:00
3 : cmplwi r11 ,0 / * c h e c k i f t z i s N U L L * /
2005-11-11 21:15:21 +11:00
beq 1 f
lwz r4 ,C F G _ T Z _ M I N U T E W E S T ( r9 ) / * f i l l t z * /
lwz r5 ,C F G _ T Z _ D S T T I M E ( r9 )
stw r4 ,T Z O N E _ T Z _ M I N W E S T ( r11 )
stw r5 ,T Z O N E _ T Z _ D S T T I M E ( r11 )
1 : mtlr r12
2005-11-16 13:54:32 +11:00
crclr c r0 * 4 + s o
2005-11-11 21:15:21 +11:00
li r3 ,0
blr
2 :
mtlr r12
mr r3 ,r10
mr r4 ,r11
li r0 ,_ _ N R _ g e t t i m e o f d a y
sc
blr
.cfi_endproc
V_ F U N C T I O N _ E N D ( _ _ k e r n e l _ g e t t i m e o f d a y )
/ *
* Exact p r o t o t y p e o f c l o c k _ g e t t i m e ( )
*
* int _ _ k e r n e l _ c l o c k _ g e t t i m e ( c l o c k i d _ t c l o c k _ i d , s t r u c t t i m e s p e c * t p ) ;
*
* /
V_ F U N C T I O N _ B E G I N ( _ _ k e r n e l _ c l o c k _ g e t t i m e )
.cfi_startproc
/* Check for supported clock IDs */
cmpli c r0 ,r3 ,C L O C K _ R E A L T I M E
cmpli c r1 ,r3 ,C L O C K _ M O N O T O N I C
2005-11-14 14:55:58 +11:00
cror c r0 * 4 + e q ,c r0 * 4 + e q ,c r1 * 4 + e q
2005-11-11 21:15:21 +11:00
bne c r0 ,9 9 f
mflr r12 / * r12 s a v e s l r * /
.cfi_register lr,r12
mr r10 ,r3 / * r10 s a v e s i d * /
mr r11 ,r4 / * r11 s a v e s t p * /
bl _ _ g e t _ d a t a p a g e @local /* get data page */
2005-11-14 14:55:58 +11:00
mr r9 ,r3 / * d a t a p a g e p t r i n r9 * /
2005-11-11 21:15:21 +11:00
beq c r1 ,5 0 f / * i f m o n o t o n i c - > j u m p t h e r e * /
/ *
* CLOCK_ R E A L T I M E
* /
bl _ _ d o _ g e t _ x s e c @local /* get xsec from tb & kernel */
bne- 9 8 f / * o u t o f l i n e - > d o s y s c a l l * /
/* seconds are xsec >> 20 */
rlwinm r5 ,r4 ,1 2 ,2 0 ,3 1
rlwimi r5 ,r3 ,1 2 ,0 ,1 9
stw r5 ,T S P C 3 2 _ T V _ S E C ( r11 )
/ * get r e m a i n i n g x s e c a n d c o n v e r t t o n s e c . w e s c a l e
* up r e m a i n i n g x s e c b y 1 2 b i t s a n d g e t t h e t o p 3 2 b i t s
* of t h e m u l t i p l i c a t i o n , t h e n w e m u l t i p l y b y 1 0 0 0
* /
rlwinm r5 ,r4 ,1 2 ,0 ,1 9
lis r6 ,1 0 0 0 0 0 0 @h
ori r6 ,r6 ,1 0 0 0 0 0 0 @l
mulhwu r5 ,r5 ,r6
mulli r5 ,r5 ,1 0 0 0
stw r5 ,T S P C 3 2 _ T V _ N S E C ( r11 )
mtlr r12
2005-11-16 13:54:32 +11:00
crclr c r0 * 4 + s o
2005-11-11 21:15:21 +11:00
li r3 ,0
blr
/ *
* CLOCK_ M O N O T O N I C
* /
50 : bl _ _ d o _ g e t _ x s e c @local /* get xsec from tb & kernel */
bne- 9 8 f / * o u t o f l i n e - > d o s y s c a l l * /
/* seconds are xsec >> 20 */
rlwinm r6 ,r4 ,1 2 ,2 0 ,3 1
rlwimi r6 ,r3 ,1 2 ,0 ,1 9
/ * get r e m a i n i n g x s e c a n d c o n v e r t t o n s e c . w e s c a l e
* up r e m a i n i n g x s e c b y 1 2 b i t s a n d g e t t h e t o p 3 2 b i t s
* of t h e m u l t i p l i c a t i o n , t h e n w e m u l t i p l y b y 1 0 0 0
* /
rlwinm r7 ,r4 ,1 2 ,0 ,1 9
lis r5 ,1 0 0 0 0 0 0 @h
ori r5 ,r5 ,1 0 0 0 0 0 0 @l
mulhwu r7 ,r7 ,r5
mulli r7 ,r7 ,1 0 0 0
/ * now w e m u s t f i x u p u s i n g w a l l t o m o n o t o n i c . W e n e e d t o s n a p s h o t
* that v a l u e a n d d o t h e c o u n t e r t r i c k a g a i n . F o r t u n a t e l y , w e s t i l l
* have t h e c o u n t e r v a l u e i n r8 t h a t w a s r e t u r n e d b y _ _ d o _ g e t _ x s e c .
* At t h i s p o i n t , r6 ,r7 c o n t a i n o u r s e c / n s e c v a l u e s , r3 ,r4 a n d r5
* can b e u s e d
* /
lwz r3 ,W T O M _ C L O C K _ S E C ( r9 )
lwz r4 ,W T O M _ C L O C K _ N S E C ( r9 )
/ * We n o w h a v e o u r r e s u l t i n r3 ,r4 . W e c r e a t e a f a k e d e p e n d e n c y
* on t h a t r e s u l t a n d r e - c h e c k t h e c o u n t e r
* /
or r5 ,r4 ,r3
xor r0 ,r5 ,r5
add r9 ,r9 ,r0
# ifdef C O N F I G _ P P C 6 4
lwz r0 ,( C F G _ T B _ U P D A T E _ C O U N T + 4 ) ( r9 )
# else
lwz r0 ,( C F G _ T B _ U P D A T E _ C O U N T ) ( r9 )
# endif
cmpl c r0 ,r8 ,r0 / * c h e c k i f u p d a t e d * /
bne- 5 0 b
/ * Calculate a n d s t o r e r e s u l t . N o t e t h a t t h i s m i m m i c s t h e C c o d e ,
* which m a y c a u s e f u n n y r e s u l t s i f n s e c g o e s n e g a t i v e . . . i s t h a t
* possible a t a l l ?
* /
add r3 ,r3 ,r6
add r4 ,r4 ,r7
lis r5 ,N S E C _ P E R _ S E C @h
ori r5 ,r5 ,N S E C _ P E R _ S E C @l
2005-11-14 14:55:58 +11:00
cmpl c r0 ,r4 ,r5
cmpli c r1 ,r4 ,0
2005-11-11 21:15:21 +11:00
blt 1 f
subf r4 ,r5 ,r4
addi r3 ,r3 ,1
2005-11-14 14:55:58 +11:00
1 : bge c r1 ,1 f
addi r3 ,r3 ,- 1
add r4 ,r4 ,r5
2005-11-11 21:15:21 +11:00
1 : stw r3 ,T S P C 3 2 _ T V _ S E C ( r11 )
stw r4 ,T S P C 3 2 _ T V _ N S E C ( r11 )
mtlr r12
2005-11-16 13:54:32 +11:00
crclr c r0 * 4 + s o
2005-11-11 21:15:21 +11:00
li r3 ,0
blr
/ *
* syscall f a l l b a c k
* /
98 :
mtlr r12
mr r3 ,r10
mr r4 ,r11
99 :
li r0 ,_ _ N R _ c l o c k _ g e t t i m e
sc
blr
.cfi_endproc
V_ F U N C T I O N _ E N D ( _ _ k e r n e l _ c l o c k _ g e t t i m e )
/ *
* Exact p r o t o t y p e o f c l o c k _ g e t r e s ( )
*
* int _ _ k e r n e l _ c l o c k _ g e t r e s ( c l o c k i d _ t c l o c k _ i d , s t r u c t t i m e s p e c * r e s ) ;
*
* /
V_ F U N C T I O N _ B E G I N ( _ _ k e r n e l _ c l o c k _ g e t r e s )
.cfi_startproc
/* Check for supported clock IDs */
cmpwi c r0 ,r3 ,C L O C K _ R E A L T I M E
cmpwi c r1 ,r3 ,C L O C K _ M O N O T O N I C
2005-11-14 14:55:58 +11:00
cror c r0 * 4 + e q ,c r0 * 4 + e q ,c r1 * 4 + e q
2005-11-11 21:15:21 +11:00
bne c r0 ,9 9 f
li r3 ,0
cmpli c r0 ,r4 ,0
2005-11-16 13:54:32 +11:00
crclr c r0 * 4 + s o
2005-11-11 21:15:21 +11:00
beqlr
lis r5 ,C L O C K _ R E A L T I M E _ R E S @h
ori r5 ,r5 ,C L O C K _ R E A L T I M E _ R E S @l
stw r3 ,T S P C 3 2 _ T V _ S E C ( r4 )
stw r5 ,T S P C 3 2 _ T V _ N S E C ( r4 )
blr
/ *
* syscall f a l l b a c k
* /
99 :
li r0 ,_ _ N R _ c l o c k _ g e t r e s
sc
blr
.cfi_endproc
V_ F U N C T I O N _ E N D ( _ _ k e r n e l _ c l o c k _ g e t r e s )
/ *
* This i s t h e c o r e o f g e t t i m e o f d a y ( ) & f r i e n d s , i t r e t u r n s t h e x s e c
* value i n r3 & r4 a n d e x p e c t s t h e d a t a p a g e p t r ( n o n c l o b b e r e d )
* in r9 . c l o b b e r s r0 ,r4 ,r5 ,r6 ,r7 ,r8 .
* When r e t u r n i n g , r8 c o n t a i n s t h e c o u n t e r v a l u e t h a t c a n b e r e u s e d
* by t h e m o n o t o n i c c l o c k i m p l e m e n t a t i o n
* /
__do_get_xsec :
.cfi_startproc
/ * Check f o r u p d a t e c o u n t & l o a d v a l u e s . W e u s e t h e l o w
* order 3 2 b i t s o f t h e u p d a t e c o u n t
* /
# ifdef C O N F I G _ P P C 6 4
1 : lwz r8 ,( C F G _ T B _ U P D A T E _ C O U N T + 4 ) ( r9 )
# else
1 : lwz r8 ,( C F G _ T B _ U P D A T E _ C O U N T ) ( r9 )
# endif
andi. r0 ,r8 ,1 / * p e n d i n g u p d a t e ? l o o p * /
bne- 1 b
xor r0 ,r8 ,r8 / * c r e a t e d e p e n d e n c y * /
add r9 ,r9 ,r0
/* Load orig stamp (offset to TB) */
lwz r5 ,C F G _ T B _ O R I G _ S T A M P ( r9 )
lwz r6 ,( C F G _ T B _ O R I G _ S T A M P + 4 ) ( r9 )
/* Get a stable TB value */
2 : mftbu r3
mftbl r4
mftbu r0
cmpl c r0 ,r3 ,r0
bne- 2 b
/ * Substract t b o r i g s t a m p . I f t h e h i g h p a r t i s n o n - z e r o , w e j u m p t o
* the s l o w p a t h w h i c h c a l l t h e s y s c a l l .
* If i t ' s o k , t h e n w e h a v e o u r 3 2 b i t s t b _ t i c k s v a l u e i n r7
* /
subfc r7 ,r6 ,r4
subfe. r0 ,r5 ,r3
bne- 3 f
/* Load scale factor & do multiplication */
lwz r5 ,C F G _ T B _ T O _ X S ( r9 ) / * l o a d v a l u e s * /
lwz r6 ,( C F G _ T B _ T O _ X S + 4 ) ( r9 )
mulhwu r4 ,r7 ,r5
mulhwu r6 ,r7 ,r6
mullw r0 ,r7 ,r5
addc r6 ,r6 ,r0
/ * At t h i s p o i n t , w e h a v e t h e s c a l e d x s e c v a l u e i n r4 + X E R : C A
* we l o a d & a d d t h e s t a m p s i n c e e p o c h
* /
lwz r5 ,C F G _ S T A M P _ X S E C ( r9 )
lwz r6 ,( C F G _ S T A M P _ X S E C + 4 ) ( r9 )
adde r4 ,r4 ,r6
addze r3 ,r5
/ * We n o w h a v e o u r r e s u l t i n r3 ,r4 . W e c r e a t e a f a k e d e p e n d e n c y
* on t h a t r e s u l t a n d r e - c h e c k t h e c o u n t e r
* /
or r6 ,r4 ,r3
xor r0 ,r6 ,r6
add r9 ,r9 ,r0
# ifdef C O N F I G _ P P C 6 4
lwz r0 ,( C F G _ T B _ U P D A T E _ C O U N T + 4 ) ( r9 )
# else
lwz r0 ,( C F G _ T B _ U P D A T E _ C O U N T ) ( r9 )
# endif
cmpl c r0 ,r8 ,r0 / * c h e c k i f u p d a t e d * /
bne- 1 b
/ * Warning ! T h e c a l l e r e x p e c t s C R : E Q t o b e s e t t o i n d i c a t e a
* successful c a l c u l a t i o n ( s o i t w o n ' t f a l l b a c k t o t h e s y s c a l l
* method) . W e h a v e o v e r r i d e n t h a t C R b i t i n t h e c o u n t e r c h e c k ,
* but f o r t u n a t e l y , t h e l o o p e x i t c o n d i t i o n _ i s _ C R : E Q s e t , s o
* we c a n e x i t s a f e l y h e r e . I f y o u c h a n g e t h i s c o d e , b e c a r e f u l
* of t h a t s i d e e f f e c t .
* /
3 : blr
.cfi_endproc