1
2
3
4
5
6
7
8
9 #include <asm/vdso.h>
10 #include <asm/asm-offsets.h>
11 #include <asm/unistd.h>
12 #include <asm/dwarf.h>
13 #include <asm/ptrace.h>
14
15 .text
16 .align 4
17 .globl __kernel_clock_gettime
18 .type __kernel_clock_gettime,@function
19 __kernel_clock_gettime:
20 CFI_STARTPROC
21 ahi %r15,-16
22 CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
23 CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
24 basr %r5,0
25 0: al %r5,21f-0b(%r5)
26 chi %r2,__CLOCK_REALTIME_COARSE
27 je 10f
28 chi %r2,__CLOCK_REALTIME
29 je 11f
30 chi %r2,__CLOCK_MONOTONIC_COARSE
31 je 9f
32 chi %r2,__CLOCK_MONOTONIC
33 jne 19f
34
35
36 1: l %r4,__VDSO_UPD_COUNT+4(%r5)
37 tml %r4,0x0001
38 jnz 1b
39 stcke 0(%r15)
40 lm %r0,%r1,1(%r15)
41 s %r0,__VDSO_XTIME_STAMP(%r5)
42 sl %r1,__VDSO_XTIME_STAMP+4(%r5)
43 brc 3,2f
44 ahi %r0,-1
45 2: ms %r0,__VDSO_TK_MULT(%r5)
46 lr %r2,%r0
47 l %r0,__VDSO_TK_MULT(%r5)
48 ltr %r1,%r1
49 mr %r0,%r0
50 jnm 3f
51 a %r0,__VDSO_TK_MULT(%r5)
52 3: alr %r0,%r2
53 al %r0,__VDSO_WTOM_NSEC(%r5)
54 al %r1,__VDSO_WTOM_NSEC+4(%r5)
55 brc 12,5f
56 ahi %r0,1
57 5: l %r2,__VDSO_TK_SHIFT(%r5)
58 srdl %r0,0(%r2)
59 l %r2,__VDSO_WTOM_SEC+4(%r5)
60 cl %r4,__VDSO_UPD_COUNT+4(%r5)
61 jne 1b
62 basr %r5,0
63 6: ltr %r0,%r0
64 jnz 7f
65 cl %r1,20f-6b(%r5)
66 jl 8f
67 7: ahi %r2,1
68 sl %r1,20f-6b(%r5)
69 brc 3,6b
70 ahi %r0,-1
71 j 6b
72 8: st %r2,0(%r3)
73 st %r1,4(%r3)
74 lhi %r2,0
75 ahi %r15,16
76 CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
77 CFI_RESTORE 15
78 br %r14
79
80
81 CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
82 CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
83 9: l %r4,__VDSO_UPD_COUNT+4(%r5)
84 tml %r4,0x0001
85 jnz 9b
86 l %r2,__VDSO_WTOM_CRS_SEC+4(%r5)
87 l %r1,__VDSO_WTOM_CRS_NSEC+4(%r5)
88 cl %r4,__VDSO_UPD_COUNT+4(%r5)
89 jne 9b
90 j 8b
91
92
93 10: l %r4,__VDSO_UPD_COUNT+4(%r5)
94 tml %r4,0x0001
95 jnz 10b
96 l %r2,__VDSO_XTIME_CRS_SEC+4(%r5)
97 l %r1,__VDSO_XTIME_CRS_NSEC+4(%r5)
98 cl %r4,__VDSO_UPD_COUNT+4(%r5)
99 jne 10b
100 j 17f
101
102
103 11: l %r4,__VDSO_UPD_COUNT+4(%r5)
104 tml %r4,0x0001
105 jnz 11b
106 stcke 0(%r15)
107 lm %r0,%r1,__VDSO_TS_END(%r5)
108 s %r0,1(%r15)
109 sl %r1,5(%r15)
110 brc 3,22f
111 ahi %r0,-1
112 22: ltr %r0,%r0
113 jm 24f
114 srdl %r0,15
115 tm __VDSO_TS_DIR+3(%r5),0x01
116 jz 23f
117 lcr %r0,%r0
118 lcr %r1,%r1
119 je 23f
120 ahi %r0,-1
121 23: a %r0,1(%r15)
122 al %r1,5(%r15)
123 brc 12,25f
124 ahi %r0,1
125 j 25f
126 24: lm %r0,%r1,1(%r15)
127 25: s %r0,__VDSO_XTIME_STAMP(%r5)
128 sl %r1,__VDSO_XTIME_STAMP+4(%r5)
129 brc 3,12f
130 ahi %r0,-1
131 12: ms %r0,__VDSO_TK_MULT(%r5)
132 lr %r2,%r0
133 l %r0,__VDSO_TK_MULT(%r5)
134 ltr %r1,%r1
135 mr %r0,%r0
136 jnm 13f
137 a %r0,__VDSO_TK_MULT(%r5)
138 13: alr %r0,%r2
139 al %r0,__VDSO_XTIME_NSEC(%r5)
140 al %r1,__VDSO_XTIME_NSEC+4(%r5)
141 brc 12,14f
142 ahi %r0,1
143 14: l %r2,__VDSO_TK_SHIFT(%r5)
144 srdl %r0,0(%r2)
145 l %r2,__VDSO_XTIME_SEC+4(%r5)
146 cl %r4,__VDSO_UPD_COUNT+4(%r5)
147 jne 11b
148 basr %r5,0
149 15: ltr %r0,%r0
150 jnz 16f
151 cl %r1,20f-15b(%r5)
152 jl 17f
153 16: ahi %r2,1
154 sl %r1,20f-15b(%r5)
155 brc 3,15b
156 ahi %r0,-1
157 j 15b
158 17: st %r2,0(%r3)
159 st %r1,4(%r3)
160 lhi %r2,0
161 ahi %r15,16
162 CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
163 CFI_RESTORE 15
164 br %r14
165
166
167 CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
168 CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
169 19: lhi %r1,__NR_clock_gettime
170 svc 0
171 ahi %r15,16
172 CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
173 CFI_RESTORE 15
174 br %r14
175 CFI_ENDPROC
176
177 20: .long 1000000000
178 21: .long _vdso_data - 0b
179 .size __kernel_clock_gettime,.-__kernel_clock_gettime