Blame view
arch/s390/kernel/vdso64/clock_gettime.S
3.79 KB
b020632e4 [S390] introduce ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * Userland implementation of clock_gettime() for 64 bits processes in a * s390 kernel for use in the vDSO * * Copyright IBM Corp. 2008 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License (version 2 only) * as published by the Free Software Foundation. */ #include <asm/vdso.h> #include <asm/asm-offsets.h> #include <asm/unistd.h> .text .align 4 .globl __kernel_clock_gettime .type __kernel_clock_gettime,@function __kernel_clock_gettime: .cfi_startproc |
9b2efe035 s390/vdso: fix st... |
22 |
aghi %r15,-16 |
b020632e4 [S390] introduce ... |
23 |
larl %r5,_vdso_data |
b7eacb59c s390/vdso: add vd... |
24 25 |
cghi %r2,__CLOCK_REALTIME_COARSE je 4f |
b3423982b [S390] vdso: get ... |
26 |
cghi %r2,__CLOCK_REALTIME |
5da76157a s390/vdso: remove... |
27 |
je 5f |
49253925c s390/vdso: fix cl... |
28 |
cghi %r2,-3 /* Per-thread CPUCLOCK with PID=0, VIRT=1 */ |
c742b31c0 [PATCH] fast vdso... |
29 |
je 9f |
b7eacb59c s390/vdso: add vd... |
30 31 |
cghi %r2,__CLOCK_MONOTONIC_COARSE je 3f |
b3423982b [S390] vdso: get ... |
32 |
cghi %r2,__CLOCK_MONOTONIC |
c742b31c0 [PATCH] fast vdso... |
33 |
jne 12f |
b020632e4 [S390] introduce ... |
34 35 |
/* CLOCK_MONOTONIC */ |
b020632e4 [S390] introduce ... |
36 37 38 |
0: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ tmll %r4,0x0001 /* pending update ? loop */ jnz 0b |
9b2efe035 s390/vdso: fix st... |
39 |
stcke 0(%r15) /* Store TOD clock */ |
79c74ecbe s390/time,vdso: c... |
40 |
lgf %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
ca5de58ba s390/time,vdso: f... |
41 |
lg %r0,__VDSO_WTOM_SEC(%r5) |
9b2efe035 s390/vdso: fix st... |
42 |
lg %r1,1(%r15) |
b020632e4 [S390] introduce ... |
43 |
sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
79c74ecbe s390/time,vdso: c... |
44 |
msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
ca5de58ba s390/time,vdso: f... |
45 |
alg %r1,__VDSO_WTOM_NSEC(%r5) |
79c74ecbe s390/time,vdso: c... |
46 |
srlg %r1,%r1,0(%r2) /* >> tk->shift */ |
b020632e4 [S390] introduce ... |
47 48 |
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ jne 0b |
c742b31c0 [PATCH] fast vdso... |
49 |
larl %r5,13f |
b020632e4 [S390] introduce ... |
50 51 52 53 54 55 56 |
1: clg %r1,0(%r5) jl 2f slg %r1,0(%r5) aghi %r0,1 j 1b 2: stg %r0,0(%r3) /* store tp->tv_sec */ stg %r1,8(%r3) /* store tp->tv_nsec */ |
5da76157a s390/vdso: remove... |
57 |
lghi %r2,0 |
9b2efe035 s390/vdso: fix st... |
58 |
aghi %r15,16 |
b020632e4 [S390] introduce ... |
59 |
br %r14 |
b7eacb59c s390/vdso: add vd... |
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
/* CLOCK_MONOTONIC_COARSE */ 3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ tmll %r4,0x0001 /* pending update ? loop */ jnz 3b lg %r0,__VDSO_WTOM_CRS_SEC(%r5) lg %r1,__VDSO_WTOM_CRS_NSEC(%r5) clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ jne 3b j 2b /* CLOCK_REALTIME_COARSE */ 4: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ tmll %r4,0x0001 /* pending update ? loop */ jnz 4b lg %r0,__VDSO_XTIME_CRS_SEC(%r5) lg %r1,__VDSO_XTIME_CRS_NSEC(%r5) clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ jne 4b j 7f |
b020632e4 [S390] introduce ... |
79 |
/* CLOCK_REALTIME */ |
b020632e4 [S390] introduce ... |
80 81 82 |
5: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ tmll %r4,0x0001 /* pending update ? loop */ jnz 5b |
9b2efe035 s390/vdso: fix st... |
83 |
stcke 0(%r15) /* Store TOD clock */ |
79c74ecbe s390/time,vdso: c... |
84 |
lgf %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
9b2efe035 s390/vdso: fix st... |
85 |
lg %r1,1(%r15) |
b020632e4 [S390] introduce ... |
86 |
sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
79c74ecbe s390/time,vdso: c... |
87 88 89 90 |
msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ alg %r1,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ srlg %r1,%r1,0(%r2) /* >> tk->shift */ lg %r0,__VDSO_XTIME_SEC(%r5) /* tk->xtime_sec */ |
b020632e4 [S390] introduce ... |
91 92 |
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ jne 5b |
c742b31c0 [PATCH] fast vdso... |
93 |
larl %r5,13f |
b020632e4 [S390] introduce ... |
94 95 96 97 98 99 100 |
6: clg %r1,0(%r5) jl 7f slg %r1,0(%r5) aghi %r0,1 j 6b 7: stg %r0,0(%r3) /* store tp->tv_sec */ stg %r1,8(%r3) /* store tp->tv_nsec */ |
5da76157a s390/vdso: remove... |
101 |
lghi %r2,0 |
9b2efe035 s390/vdso: fix st... |
102 |
aghi %r15,16 |
b020632e4 [S390] introduce ... |
103 |
br %r14 |
49253925c s390/vdso: fix cl... |
104 |
/* CPUCLOCK_VIRT for this thread */ |
c742b31c0 [PATCH] fast vdso... |
105 106 107 108 109 110 |
9: icm %r0,15,__VDSO_ECTG_OK(%r5) jz 12f ear %r2,%a4 llilh %r4,0x0100 sar %a4,%r4 lghi %r4,0 |
1277580fe [S390] vdso: cloc... |
111 |
epsw %r5,0 |
c742b31c0 [PATCH] fast vdso... |
112 113 |
sacf 512 /* Magic ectg instruction */ .insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4 |
1277580fe [S390] vdso: cloc... |
114 115 116 117 118 119 120 121 |
tml %r5,0x4000 jo 11f tml %r5,0x8000 jno 10f sacf 256 j 11f 10: sacf 0 11: sar %a4,%r2 |
c742b31c0 [PATCH] fast vdso... |
122 123 124 125 126 127 128 129 130 131 132 133 134 |
algr %r1,%r0 /* r1 = cputime as TOD value */ mghi %r1,1000 /* convert to nanoseconds */ srlg %r1,%r1,12 /* r1 = cputime in nanosec */ lgr %r4,%r1 larl %r5,13f srlg %r1,%r1,9 /* divide by 1000000000 */ mlg %r0,8(%r5) srlg %r0,%r0,11 /* r0 = tv_sec */ stg %r0,0(%r3) msg %r0,0(%r5) /* calculate tv_nsec */ slgr %r4,%r0 /* r4 = tv_nsec */ stg %r4,8(%r3) lghi %r2,0 |
9b2efe035 s390/vdso: fix st... |
135 |
aghi %r15,16 |
c742b31c0 [PATCH] fast vdso... |
136 |
br %r14 |
b020632e4 [S390] introduce ... |
137 |
/* Fallback to system call */ |
c742b31c0 [PATCH] fast vdso... |
138 |
12: lghi %r1,__NR_clock_gettime |
b020632e4 [S390] introduce ... |
139 |
svc 0 |
9b2efe035 s390/vdso: fix st... |
140 |
aghi %r15,16 |
b020632e4 [S390] introduce ... |
141 |
br %r14 |
c742b31c0 [PATCH] fast vdso... |
142 143 |
13: .quad 1000000000 14: .quad 19342813113834067 |
b020632e4 [S390] introduce ... |
144 145 |
.cfi_endproc .size __kernel_clock_gettime,.-__kernel_clock_gettime |