2008-12-25 13:38:36 +01:00
/ *
* Userland i m p l e m e n t a t i o n o f c l o c k _ g e t t i m e ( ) f o r 6 4 b i t s p r o c e s s e s i n a
* s3 9 0 k e r n e l f o r u s e i n t h e v D S O
*
* Copyright I B M C o r p . 2 0 0 8
* Author( s ) : M a r t i n S c h w i d e f s k y ( s c h w i d e f s k y @de.ibm.com)
*
* 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
* it 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 ( v e r s i o n 2 o n l y )
* 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 .
* /
# 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
.align 4
.globl __kernel_clock_gettime
.type _ _ kernel_ c l o c k _ g e t t i m e ,@function
__kernel_clock_gettime :
.cfi_startproc
2014-10-27 08:28:08 +01:00
aghi % r15 ,- 1 6
2008-12-25 13:38:36 +01:00
larl % r5 ,_ v d s o _ d a t a
2014-08-29 12:31:45 +02:00
cghi % r2 ,_ _ C L O C K _ R E A L T I M E _ C O A R S E
je 4 f
2010-10-29 16:50:41 +02:00
cghi % r2 ,_ _ C L O C K _ R E A L T I M E
2014-08-29 10:16:03 +02:00
je 5 f
2015-01-27 15:15:13 +01:00
cghi % r2 ,- 3 / * P e r - t h r e a d C P U C L O C K w i t h P I D =0 , V I R T =1 * /
2008-12-31 15:11:42 +01:00
je 9 f
2014-08-29 12:31:45 +02:00
cghi % r2 ,_ _ C L O C K _ M O N O T O N I C _ C O A R S E
je 3 f
2010-10-29 16:50:41 +02:00
cghi % r2 ,_ _ C L O C K _ M O N O T O N I C
2008-12-31 15:11:42 +01:00
jne 1 2 f
2008-12-25 13:38:36 +01:00
/* CLOCK_MONOTONIC */
0 : lg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * l o a d u p d a t e c o u n t e r * /
tmll % r4 ,0 x00 0 1 / * p e n d i n g u p d a t e ? l o o p * /
jnz 0 b
2014-10-27 08:28:08 +01:00
stcke 0 ( % r15 ) / * S t o r e T O D c l o c k * /
2013-11-22 10:04:53 +01:00
lgf % r2 ,_ _ V D S O _ T K _ S H I F T ( % r5 ) / * T i m e k e e p e r s h i f t * /
2013-12-02 18:00:36 +01:00
lg % r0 ,_ _ V D S O _ W T O M _ S E C ( % r5 )
2014-10-27 08:28:08 +01:00
lg % r1 ,1 ( % r15 )
2008-12-25 13:38:36 +01:00
sg % r1 ,_ _ V D S O _ X T I M E _ S T A M P ( % r5 ) / * T O D - c y c l e _ l a s t * /
2013-11-22 10:04:53 +01:00
msgf % r1 ,_ _ V D S O _ T K _ M U L T ( % r5 ) / * * t k - > m u l t * /
2013-12-02 18:00:36 +01:00
alg % r1 ,_ _ V D S O _ W T O M _ N S E C ( % r5 )
2013-11-22 10:04:53 +01:00
srlg % r1 ,% r1 ,0 ( % r2 ) / * > > t k - > s h i f t * /
2008-12-25 13:38:36 +01:00
clg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * c h e c k u p d a t e c o u n t e r * /
jne 0 b
2008-12-31 15:11:42 +01:00
larl % r5 ,1 3 f
2008-12-25 13:38:36 +01:00
1 : clg % r1 ,0 ( % r5 )
jl 2 f
slg % r1 ,0 ( % r5 )
aghi % r0 ,1
j 1 b
2 : stg % r0 ,0 ( % r3 ) / * s t o r e t p - > t v _ s e c * /
stg % r1 ,8 ( % r3 ) / * s t o r e t p - > t v _ n s e c * /
2014-08-29 10:16:03 +02:00
lghi % r2 ,0
2014-10-27 08:28:08 +01:00
aghi % r15 ,1 6
2008-12-25 13:38:36 +01:00
br % r14
2014-08-29 12:31:45 +02:00
/* CLOCK_MONOTONIC_COARSE */
3 : lg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * l o a d u p d a t e c o u n t e r * /
tmll % r4 ,0 x00 0 1 / * p e n d i n g u p d a t e ? l o o p * /
jnz 3 b
lg % r0 ,_ _ V D S O _ W T O M _ C R S _ S E C ( % r5 )
lg % r1 ,_ _ V D S O _ W T O M _ C R S _ N S E C ( % r5 )
clg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * c h e c k u p d a t e c o u n t e r * /
jne 3 b
j 2 b
/* CLOCK_REALTIME_COARSE */
4 : lg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * l o a d u p d a t e c o u n t e r * /
tmll % r4 ,0 x00 0 1 / * p e n d i n g u p d a t e ? l o o p * /
jnz 4 b
lg % r0 ,_ _ V D S O _ X T I M E _ C R S _ S E C ( % r5 )
lg % r1 ,_ _ V D S O _ X T I M E _ C R S _ N S E C ( % r5 )
clg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * c h e c k u p d a t e c o u n t e r * /
jne 4 b
j 7 f
2008-12-25 13:38:36 +01:00
/* CLOCK_REALTIME */
5 : lg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * l o a d u p d a t e c o u n t e r * /
tmll % r4 ,0 x00 0 1 / * p e n d i n g u p d a t e ? l o o p * /
jnz 5 b
2014-10-27 08:28:08 +01:00
stcke 0 ( % r15 ) / * S t o r e T O D c l o c k * /
2013-11-22 10:04:53 +01:00
lgf % r2 ,_ _ V D S O _ T K _ S H I F T ( % r5 ) / * T i m e k e e p e r s h i f t * /
2014-10-27 08:28:08 +01:00
lg % r1 ,1 ( % r15 )
2008-12-25 13:38:36 +01:00
sg % r1 ,_ _ V D S O _ X T I M E _ S T A M P ( % r5 ) / * T O D - c y c l e _ l a s t * /
2013-11-22 10:04:53 +01:00
msgf % r1 ,_ _ V D S O _ T K _ M U L T ( % r5 ) / * * t k - > m u l t * /
alg % r1 ,_ _ V D S O _ X T I M E _ N S E C ( % r5 ) / * + t k - > x t i m e _ n s e c * /
srlg % r1 ,% r1 ,0 ( % r2 ) / * > > t k - > s h i f t * /
lg % r0 ,_ _ V D S O _ X T I M E _ S E C ( % r5 ) / * t k - > x t i m e _ s e c * /
2008-12-25 13:38:36 +01:00
clg % r4 ,_ _ V D S O _ U P D _ C O U N T ( % r5 ) / * c h e c k u p d a t e c o u n t e r * /
jne 5 b
2008-12-31 15:11:42 +01:00
larl % r5 ,1 3 f
2008-12-25 13:38:36 +01:00
6 : clg % r1 ,0 ( % r5 )
jl 7 f
slg % r1 ,0 ( % r5 )
aghi % r0 ,1
j 6 b
7 : stg % r0 ,0 ( % r3 ) / * s t o r e t p - > t v _ s e c * /
stg % r1 ,8 ( % r3 ) / * s t o r e t p - > t v _ n s e c * /
2014-08-29 10:16:03 +02:00
lghi % r2 ,0
2014-10-27 08:28:08 +01:00
aghi % r15 ,1 6
2008-12-25 13:38:36 +01:00
br % r14
2015-01-27 15:15:13 +01:00
/* CPUCLOCK_VIRT for this thread */
2008-12-31 15:11:42 +01:00
9 : icm % r0 ,1 5 ,_ _ V D S O _ E C T G _ O K ( % r5 )
jz 1 2 f
ear % r2 ,% a4
llilh % r4 ,0 x01 0 0
sar % a4 ,% r4
lghi % r4 ,0
2009-07-24 12:39:52 +02:00
epsw % r5 ,0
2008-12-31 15:11:42 +01:00
sacf 5 1 2 / * M a g i c e c t g i n s t r u c t i o n * /
.insn ssf,0 x c80 1 0 0 0 0 0 0 0 0 ,_ _ V D S O _ E C T G _ B A S E ( 4 ) ,_ _ V D S O _ E C T G _ U S E R ( 4 ) ,4
2009-07-24 12:39:52 +02:00
tml % r5 ,0 x40 0 0
jo 1 1 f
tml % r5 ,0 x80 0 0
jno 1 0 f
sacf 2 5 6
j 1 1 f
10 : sacf 0
11 : sar % a4 ,% r2
2008-12-31 15:11:42 +01:00
algr % r1 ,% r0 / * r1 = c p u t i m e a s T O D v a l u e * /
mghi % r1 ,1 0 0 0 / * c o n v e r t t o n a n o s e c o n d s * /
srlg % r1 ,% r1 ,1 2 / * r1 = c p u t i m e i n n a n o s e c * /
lgr % r4 ,% r1
larl % r5 ,1 3 f
srlg % r1 ,% r1 ,9 / * d i v i d e b y 1 0 0 0 0 0 0 0 0 0 * /
mlg % r0 ,8 ( % r5 )
srlg % r0 ,% r0 ,1 1 / * r0 = t v _ s e c * /
stg % r0 ,0 ( % r3 )
msg % r0 ,0 ( % r5 ) / * c a l c u l a t e t v _ n s e c * /
slgr % r4 ,% r0 / * r4 = t v _ n s e c * /
stg % r4 ,8 ( % r3 )
lghi % r2 ,0
2014-10-27 08:28:08 +01:00
aghi % r15 ,1 6
2008-12-31 15:11:42 +01:00
br % r14
2008-12-25 13:38:36 +01:00
/* Fallback to system call */
2008-12-31 15:11:42 +01:00
12 : lghi % r1 ,_ _ N R _ c l o c k _ g e t t i m e
2008-12-25 13:38:36 +01:00
svc 0
2014-10-27 08:28:08 +01:00
aghi % r15 ,1 6
2008-12-25 13:38:36 +01:00
br % r14
2008-12-31 15:11:42 +01:00
13 : .quad 1000000000
14 : .quad 19342813113834067
2008-12-25 13:38:36 +01:00
.cfi_endproc
.size _ _ kernel_ c l o c k _ g e t t i m e ,. - _ _ k e r n e l _ c l o c k _ g e t t i m e