1
2
3
4
5
6
7
8
9
10
11
12
13#include <asm/processor.h>
14#include <asm/ppc_asm.h>
15#include <asm/vdso.h>
16#include <asm/asm-offsets.h>
17#include <asm/unistd.h>
18
19
20#ifdef CONFIG_PPC64
21#define LOPART 4
22#define TSPEC_TV_SEC TSPC64_TV_SEC+LOPART
23#else
24#define LOPART 0
25#define TSPEC_TV_SEC TSPC32_TV_SEC
26#endif
27
28 .text
29
30
31
32
33
34
35V_FUNCTION_BEGIN(__kernel_gettimeofday)
36 .cfi_startproc
37 mflr r12
38 .cfi_register lr,r12
39
40 mr r10,r3
41 mr r11,r4
42 bl __get_datapage@local
43 mr r9, r3
44 cmplwi r10,0
45 beq 3f
46 lis r7,1000000@ha
47 addi r7,r7,1000000@l
48 bl __do_get_tspec@local
49 stw r3,TVAL32_TV_SEC(r10)
50 stw r4,TVAL32_TV_USEC(r10)
51
523: cmplwi r11,0
53 beq 1f
54 lwz r4,CFG_TZ_MINUTEWEST(r9)
55 lwz r5,CFG_TZ_DSTTIME(r9)
56 stw r4,TZONE_TZ_MINWEST(r11)
57 stw r5,TZONE_TZ_DSTTIME(r11)
58
591: mtlr r12
60 crclr cr0*4+so
61 li r3,0
62 blr
63 .cfi_endproc
64V_FUNCTION_END(__kernel_gettimeofday)
65
66
67
68
69
70
71
72V_FUNCTION_BEGIN(__kernel_clock_gettime)
73 .cfi_startproc
74
75 cmpli cr0,r3,CLOCK_REALTIME
76 cmpli cr1,r3,CLOCK_MONOTONIC
77 cror cr0*4+eq,cr0*4+eq,cr1*4+eq
78 bne cr0,99f
79
80 mflr r12
81 .cfi_register lr,r12
82 mr r11,r4
83 bl __get_datapage@local
84 mr r9,r3
85 lis r7,NSEC_PER_SEC@h
86 ori r7,r7,NSEC_PER_SEC@l
8750: bl __do_get_tspec@local
88 bne cr1,80f
89
90
91
92
93
94
95
96
97
98
99
100
101 lwz r5,WTOM_CLOCK_SEC(r9)
102 lwz r6,WTOM_CLOCK_NSEC(r9)
103
104
105
106
107 or r0,r6,r5
108 xor r0,r0,r0
109 add r9,r9,r0
110 lwz r0,(CFG_TB_UPDATE_COUNT+LOPART)(r9)
111 cmpl cr0,r8,r0
112 bne- 50b
113
114
115
116
117
118 add r3,r3,r5
119 add r4,r4,r6
120 cmpw cr0,r4,r7
121 cmpwi cr1,r4,0
122 blt 1f
123 subf r4,r7,r4
124 addi r3,r3,1
1251: bge cr1,80f
126 addi r3,r3,-1
127 add r4,r4,r7
128
12980: stw r3,TSPC32_TV_SEC(r11)
130 stw r4,TSPC32_TV_NSEC(r11)
131
132 mtlr r12
133 crclr cr0*4+so
134 li r3,0
135 blr
136
137
138
139
14099:
141 li r0,__NR_clock_gettime
142 sc
143 blr
144 .cfi_endproc
145V_FUNCTION_END(__kernel_clock_gettime)
146
147
148
149
150
151
152
153
154V_FUNCTION_BEGIN(__kernel_clock_getres)
155 .cfi_startproc
156
157 cmpwi cr0,r3,CLOCK_REALTIME
158 cmpwi cr1,r3,CLOCK_MONOTONIC
159 cror cr0*4+eq,cr0*4+eq,cr1*4+eq
160 bne cr0,99f
161
162 li r3,0
163 cmpli cr0,r4,0
164 crclr cr0*4+so
165 beqlr
166 lis r5,CLOCK_REALTIME_RES@h
167 ori r5,r5,CLOCK_REALTIME_RES@l
168 stw r3,TSPC32_TV_SEC(r4)
169 stw r5,TSPC32_TV_NSEC(r4)
170 blr
171
172
173
174
17599:
176 li r0,__NR_clock_getres
177 sc
178 blr
179 .cfi_endproc
180V_FUNCTION_END(__kernel_clock_getres)
181
182
183
184
185
186
187
188
189V_FUNCTION_BEGIN(__kernel_time)
190 .cfi_startproc
191 mflr r12
192 .cfi_register lr,r12
193
194 mr r11,r3
195 bl __get_datapage@local
196 mr r9, r3
197
198 lwz r3,STAMP_XTIME+TSPEC_TV_SEC(r9)
199
200 cmplwi r11,0
201 beq 2f
202 stw r3,0(r11)
2032: mtlr r12
204 crclr cr0*4+so
205 blr
206 .cfi_endproc
207V_FUNCTION_END(__kernel_time)
208
209
210
211
212
213
214
215
216
217
218
219__do_get_tspec:
220 .cfi_startproc
221
222
223
2241: lwz r8,(CFG_TB_UPDATE_COUNT+LOPART)(r9)
225 andi. r0,r8,1
226 bne- 1b
227 xor r0,r8,r8
228 add r9,r9,r0
229
230
231 lwz r5,CFG_TB_ORIG_STAMP(r9)
232 lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
233
234
2352: mfspr r3, SPRN_TBRU
236 mfspr r4, SPRN_TBRL
237 mfspr r0, SPRN_TBRU
238 cmplw cr0,r3,r0
239 bne- 2b
240
241
242
243 subfc r4,r6,r4
244 subfe r0,r5,r3
245 slwi r0,r0,12
246 rlwimi. r0,r4,12,20,31
247 slwi r4,r4,12
248
249
250
251
252
253
254
255
256
257
258
259
260 lwz r5,CFG_TB_TO_XS(r9)
261 mulhwu r4,r4,r5
262 li r3,0
263
264 beq+ 4f
265 mulhwu r3,r0,r5
266 mullw r5,r0,r5
267 addc r4,r4,r5
268 addze r3,r3
2694:
270
271
272
273
274 lwz r5,STAMP_XTIME+TSPEC_TV_SEC(r9)
275 lwz r6,STAMP_SEC_FRAC(r9)
276 addc r4,r4,r6
277 adde r3,r3,r5
278
279
280
281
282 or r6,r4,r3
283 xor r0,r6,r6
284 add r9,r9,r0
285 lwz r0,(CFG_TB_UPDATE_COUNT+LOPART)(r9)
286 cmplw cr0,r8,r0
287 bne- 1b
288
289 mulhwu r4,r4,r7
290
291 blr
292 .cfi_endproc
293