Commit | Line | Data |
---|---|---|
b020632e MS |
1 | /* |
2 | * Userland implementation of clock_gettime() for 32 bits processes in a | |
3 | * s390 kernel for use in the vDSO | |
4 | * | |
5 | * Copyright IBM Corp. 2008 | |
6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License (version 2 only) | |
10 | * as published by the Free Software Foundation. | |
11 | */ | |
12 | #include <asm/vdso.h> | |
13 | #include <asm/asm-offsets.h> | |
14 | #include <asm/unistd.h> | |
15 | ||
16 | .text | |
17 | .align 4 | |
18 | .globl __kernel_clock_gettime | |
19 | .type __kernel_clock_gettime,@function | |
20 | __kernel_clock_gettime: | |
21 | .cfi_startproc | |
22 | basr %r5,0 | |
23 | 0: al %r5,21f-0b(%r5) /* get &_vdso_data */ | |
b3423982 | 24 | chi %r2,__CLOCK_REALTIME |
b020632e | 25 | je 10f |
b3423982 | 26 | chi %r2,__CLOCK_MONOTONIC |
b020632e MS |
27 | jne 19f |
28 | ||
29 | /* CLOCK_MONOTONIC */ | |
30 | ltr %r3,%r3 | |
31 | jz 9f /* tp == NULL */ | |
32 | 1: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ | |
33 | tml %r4,0x0001 /* pending update ? loop */ | |
34 | jnz 1b | |
35 | stck 24(%r15) /* Store TOD clock */ | |
36 | lm %r0,%r1,24(%r15) | |
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 */ | |
70 | 9: lhi %r2,0 | |
71 | br %r14 | |
72 | ||
73 | /* CLOCK_REALTIME */ | |
74 | 10: ltr %r3,%r3 /* tp == NULL */ | |
75 | jz 18f | |
76 | 11: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ | |
77 | tml %r4,0x0001 /* pending update ? loop */ | |
78 | jnz 11b | |
79 | stck 24(%r15) /* Store TOD clock */ | |
80 | lm %r0,%r1,24(%r15) | |
81 | s %r0,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | |
82 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | |
83 | brc 3,12f | |
84 | ahi %r0,-1 | |
79c74ecb | 85 | 12: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
b020632e | 86 | lr %r2,%r0 |
79c74ecb | 87 | l %r0,__VDSO_TK_MULT(%r5) |
b020632e MS |
88 | ltr %r1,%r1 |
89 | mr %r0,%r0 | |
90 | jnm 13f | |
79c74ecb | 91 | a %r0,__VDSO_TK_MULT(%r5) |
b020632e | 92 | 13: alr %r0,%r2 |
79c74ecb | 93 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
b020632e MS |
94 | al %r1,__VDSO_XTIME_NSEC+4(%r5) |
95 | brc 12,14f | |
96 | ahi %r0,1 | |
79c74ecb MS |
97 | 14: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
98 | srdl %r0,0(%r2) /* >> tk->shift */ | |
99 | l %r2,__VDSO_XTIME_SEC+4(%r5) | |
b020632e MS |
100 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
101 | jne 11b | |
102 | basr %r5,0 | |
103 | 15: ltr %r0,%r0 | |
104 | jnz 16f | |
105 | cl %r1,20f-15b(%r5) | |
106 | jl 17f | |
107 | 16: ahi %r2,1 | |
108 | sl %r1,20f-15b(%r5) | |
109 | brc 3,15b | |
110 | ahi %r0,-1 | |
111 | j 15b | |
112 | 17: st %r2,0(%r3) /* store tp->tv_sec */ | |
113 | st %r1,4(%r3) /* store tp->tv_nsec */ | |
114 | 18: lhi %r2,0 | |
115 | br %r14 | |
116 | ||
117 | /* Fallback to system call */ | |
118 | 19: lhi %r1,__NR_clock_gettime | |
119 | svc 0 | |
120 | br %r14 | |
121 | ||
122 | 20: .long 1000000000 | |
123 | 21: .long _vdso_data - 0b | |
124 | .cfi_endproc | |
125 | .size __kernel_clock_gettime,.-__kernel_clock_gettime |