]>
Commit | Line | Data |
---|---|---|
a17ae4c3 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
b020632e MS |
2 | /* |
3 | * Userland implementation of clock_gettime() for 32 bits processes in a | |
4 | * s390 kernel for use in the vDSO | |
5 | * | |
6 | * Copyright IBM Corp. 2008 | |
7 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | |
b020632e MS |
8 | */ |
9 | #include <asm/vdso.h> | |
10 | #include <asm/asm-offsets.h> | |
11 | #include <asm/unistd.h> | |
12 | ||
13 | .text | |
14 | .align 4 | |
15 | .globl __kernel_clock_gettime | |
16 | .type __kernel_clock_gettime,@function | |
17 | __kernel_clock_gettime: | |
18 | .cfi_startproc | |
9b2efe03 | 19 | ahi %r15,-16 |
b020632e MS |
20 | basr %r5,0 |
21 | 0: al %r5,21f-0b(%r5) /* get &_vdso_data */ | |
b7eacb59 MS |
22 | chi %r2,__CLOCK_REALTIME_COARSE |
23 | je 10f | |
b3423982 | 24 | chi %r2,__CLOCK_REALTIME |
5da76157 | 25 | je 11f |
b7eacb59 MS |
26 | chi %r2,__CLOCK_MONOTONIC_COARSE |
27 | je 9f | |
b3423982 | 28 | chi %r2,__CLOCK_MONOTONIC |
b020632e MS |
29 | jne 19f |
30 | ||
31 | /* CLOCK_MONOTONIC */ | |
b020632e MS |
32 | 1: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ |
33 | tml %r4,0x0001 /* pending update ? loop */ | |
34 | jnz 1b | |
9b2efe03 HC |
35 | stcke 0(%r15) /* Store TOD clock */ |
36 | lm %r0,%r1,1(%r15) | |
b020632e MS |
37 | s %r0,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | |
39 | brc 3,2f | |
40 | ahi %r0,-1 | |
79c74ecb | 41 | 2: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
b020632e | 42 | lr %r2,%r0 |
79c74ecb | 43 | l %r0,__VDSO_TK_MULT(%r5) |
b020632e MS |
44 | ltr %r1,%r1 |
45 | mr %r0,%r0 | |
46 | jnm 3f | |
79c74ecb | 47 | a %r0,__VDSO_TK_MULT(%r5) |
b020632e | 48 | 3: alr %r0,%r2 |
ca5de58b | 49 | al %r0,__VDSO_WTOM_NSEC(%r5) |
b020632e MS |
50 | al %r1,__VDSO_WTOM_NSEC+4(%r5) |
51 | brc 12,5f | |
52 | ahi %r0,1 | |
79c74ecb MS |
53 | 5: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
54 | srdl %r0,0(%r2) /* >> tk->shift */ | |
ca5de58b | 55 | l %r2,__VDSO_WTOM_SEC+4(%r5) |
b020632e MS |
56 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
57 | jne 1b | |
58 | basr %r5,0 | |
59 | 6: ltr %r0,%r0 | |
60 | jnz 7f | |
61 | cl %r1,20f-6b(%r5) | |
62 | jl 8f | |
63 | 7: ahi %r2,1 | |
64 | sl %r1,20f-6b(%r5) | |
65 | brc 3,6b | |
66 | ahi %r0,-1 | |
67 | j 6b | |
68 | 8: st %r2,0(%r3) /* store tp->tv_sec */ | |
69 | st %r1,4(%r3) /* store tp->tv_nsec */ | |
5da76157 | 70 | lhi %r2,0 |
9b2efe03 | 71 | ahi %r15,16 |
b020632e MS |
72 | br %r14 |
73 | ||
b7eacb59 MS |
74 | /* CLOCK_MONOTONIC_COARSE */ |
75 | 9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ | |
76 | tml %r4,0x0001 /* pending update ? loop */ | |
77 | jnz 9b | |
78 | l %r2,__VDSO_WTOM_CRS_SEC+4(%r5) | |
79 | l %r1,__VDSO_WTOM_CRS_NSEC+4(%r5) | |
80 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | |
81 | jne 9b | |
82 | j 8b | |
83 | ||
84 | /* CLOCK_REALTIME_COARSE */ | |
85 | 10: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ | |
86 | tml %r4,0x0001 /* pending update ? loop */ | |
87 | jnz 10b | |
88 | l %r2,__VDSO_XTIME_CRS_SEC+4(%r5) | |
89 | l %r1,__VDSO_XTIME_CRS_NSEC+4(%r5) | |
90 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | |
91 | jne 10b | |
92 | j 17f | |
93 | ||
b020632e | 94 | /* CLOCK_REALTIME */ |
b020632e MS |
95 | 11: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ |
96 | tml %r4,0x0001 /* pending update ? loop */ | |
97 | jnz 11b | |
9b2efe03 | 98 | stcke 0(%r15) /* Store TOD clock */ |
75c7b6f3 MS |
99 | lm %r0,%r1,__VDSO_TS_END(%r5) /* TOD steering end time */ |
100 | s %r0,1(%r15) /* no - ts_steering_end */ | |
101 | sl %r1,5(%r15) | |
102 | brc 3,22f | |
103 | ahi %r0,-1 | |
104 | 22: ltr %r0,%r0 /* past end of steering? */ | |
105 | jm 24f | |
106 | srdl %r0,15 /* 1 per 2^16 */ | |
107 | tm __VDSO_TS_DIR+3(%r5),0x01 /* steering direction? */ | |
108 | jz 23f | |
109 | lcr %r0,%r0 /* negative TOD offset */ | |
110 | lcr %r1,%r1 | |
111 | je 23f | |
112 | ahi %r0,-1 | |
113 | 23: a %r0,1(%r15) /* add TOD timestamp */ | |
114 | al %r1,5(%r15) | |
115 | brc 12,25f | |
116 | ahi %r0,1 | |
117 | j 25f | |
118 | 24: lm %r0,%r1,1(%r15) /* load TOD timestamp */ | |
119 | 25: s %r0,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | |
b020632e MS |
120 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
121 | brc 3,12f | |
122 | ahi %r0,-1 | |
79c74ecb | 123 | 12: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
b020632e | 124 | lr %r2,%r0 |
79c74ecb | 125 | l %r0,__VDSO_TK_MULT(%r5) |
b020632e MS |
126 | ltr %r1,%r1 |
127 | mr %r0,%r0 | |
128 | jnm 13f | |
79c74ecb | 129 | a %r0,__VDSO_TK_MULT(%r5) |
b020632e | 130 | 13: alr %r0,%r2 |
79c74ecb | 131 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
b020632e MS |
132 | al %r1,__VDSO_XTIME_NSEC+4(%r5) |
133 | brc 12,14f | |
134 | ahi %r0,1 | |
79c74ecb MS |
135 | 14: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
136 | srdl %r0,0(%r2) /* >> tk->shift */ | |
137 | l %r2,__VDSO_XTIME_SEC+4(%r5) | |
b020632e MS |
138 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
139 | jne 11b | |
140 | basr %r5,0 | |
141 | 15: ltr %r0,%r0 | |
142 | jnz 16f | |
143 | cl %r1,20f-15b(%r5) | |
144 | jl 17f | |
145 | 16: ahi %r2,1 | |
146 | sl %r1,20f-15b(%r5) | |
147 | brc 3,15b | |
148 | ahi %r0,-1 | |
149 | j 15b | |
150 | 17: st %r2,0(%r3) /* store tp->tv_sec */ | |
151 | st %r1,4(%r3) /* store tp->tv_nsec */ | |
5da76157 | 152 | lhi %r2,0 |
9b2efe03 | 153 | ahi %r15,16 |
b020632e MS |
154 | br %r14 |
155 | ||
156 | /* Fallback to system call */ | |
157 | 19: lhi %r1,__NR_clock_gettime | |
158 | svc 0 | |
9b2efe03 | 159 | ahi %r15,16 |
b020632e MS |
160 | br %r14 |
161 | ||
162 | 20: .long 1000000000 | |
163 | 21: .long _vdso_data - 0b | |
164 | .cfi_endproc | |
165 | .size __kernel_clock_gettime,.-__kernel_clock_gettime |