• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef QEMU_TIMER_H
2 #define QEMU_TIMER_H
3 
4 #include "qemu/typedefs.h"
5 #include "qemu-common.h"
6 #include "qemu/notify.h"
7 
8 /* timers */
9 
10 #define SCALE_MS 1000000
11 #define SCALE_US 1000
12 #define SCALE_NS 1
13 
14 /**
15  * QEMUClockType:
16  *
17  * The following clock types are available:
18  *
19  * @QEMU_CLOCK_REALTIME: Real time clock
20  *
21  * The real time clock should be used only for stuff which does not
22  * change the virtual machine state, as it is run even if the virtual
23  * machine is stopped. The real time clock has a frequency of 1000
24  * Hz.
25  *
26  * @QEMU_CLOCK_VIRTUAL: virtual clock
27  *
28  * The virtual clock is only run during the emulation. It is stopped
29  * when the virtual machine is stopped. Virtual timers use a high
30  * precision clock, usually cpu cycles (use ticks_per_sec).
31  *
32  * @QEMU_CLOCK_HOST: host clock
33  *
34  * The host clock should be use for device models that emulate accurate
35  * real time sources. It will continue to run when the virtual machine
36  * is suspended, and it will reflect system time changes the host may
37  * undergo (e.g. due to NTP). The host clock has the same precision as
38  * the virtual clock.
39  */
40 
41 typedef enum {
42     QEMU_CLOCK_REALTIME = 0,
43     QEMU_CLOCK_VIRTUAL = 1,
44     QEMU_CLOCK_HOST = 2,
45     QEMU_CLOCK_MAX
46 } QEMUClockType;
47 
48 typedef struct QEMUTimerList QEMUTimerList;
49 
50 struct QEMUTimerListGroup {
51     QEMUTimerList *tl[QEMU_CLOCK_MAX];
52 };
53 
54 typedef void QEMUTimerCB(void *opaque);
55 typedef void QEMUTimerListNotifyCB(void *opaque);
56 
57 struct QEMUTimer {
58     int64_t expire_time;        /* in nanoseconds */
59     QEMUTimerList *timer_list;
60     QEMUTimerCB *cb;
61     void *opaque;
62     QEMUTimer *next;
63     int scale;
64 };
65 
66 extern QEMUTimerListGroup main_loop_tlg;
67 
68 /*
69  * QEMUClockType
70  */
71 
72 /*
73  * qemu_clock_get_ns;
74  * @type: the clock type
75  *
76  * Get the nanosecond value of a clock with
77  * type @type
78  *
79  * Returns: the clock value in nanoseconds
80  */
81 int64_t qemu_clock_get_ns(QEMUClockType type);
82 
83 /**
84  * qemu_clock_get_ms;
85  * @type: the clock type
86  *
87  * Get the millisecond value of a clock with
88  * type @type
89  *
90  * Returns: the clock value in milliseconds
91  */
qemu_clock_get_ms(QEMUClockType type)92 static inline int64_t qemu_clock_get_ms(QEMUClockType type)
93 {
94     return qemu_clock_get_ns(type) / SCALE_MS;
95 }
96 
97 /**
98  * qemu_clock_get_us;
99  * @type: the clock type
100  *
101  * Get the microsecond value of a clock with
102  * type @type
103  *
104  * Returns: the clock value in microseconds
105  */
qemu_clock_get_us(QEMUClockType type)106 static inline int64_t qemu_clock_get_us(QEMUClockType type)
107 {
108     return qemu_clock_get_ns(type) / SCALE_US;
109 }
110 
111 /**
112  * qemu_clock_has_timers:
113  * @type: the clock type
114  *
115  * Determines whether a clock's default timer list
116  * has timers attached
117  *
118  * Note that this function should not be used when other threads also access
119  * the timer list.  The return value may be outdated by the time it is acted
120  * upon.
121  *
122  * Returns: true if the clock's default timer list
123  * has timers attached
124  */
125 bool qemu_clock_has_timers(QEMUClockType type);
126 
127 /**
128  * qemu_clock_expired:
129  * @type: the clock type
130  *
131  * Determines whether a clock's default timer list
132  * has an expired clock.
133  *
134  * Returns: true if the clock's default timer list has
135  * an expired timer
136  */
137 bool qemu_clock_expired(QEMUClockType type);
138 
139 /**
140  * qemu_clock_use_for_deadline:
141  * @type: the clock type
142  *
143  * Determine whether a clock should be used for deadline
144  * calculations. Some clocks, for instance vm_clock with
145  * use_icount set, do not count in nanoseconds. Such clocks
146  * are not used for deadline calculations, and are presumed
147  * to interrupt any poll using qemu_notify/aio_notify
148  * etc.
149  *
150  * Returns: true if the clock runs in nanoseconds and
151  * should be used for a deadline.
152  */
153 bool qemu_clock_use_for_deadline(QEMUClockType type);
154 
155 /**
156  * qemu_clock_deadline_ns_all:
157  * @type: the clock type
158  *
159  * Calculate the deadline across all timer lists associated
160  * with a clock (as opposed to just the default one)
161  * in nanoseconds, or -1 if no timer is set to expire.
162  *
163  * Returns: time until expiry in nanoseconds or -1
164  */
165 int64_t qemu_clock_deadline_ns_all(QEMUClockType type);
166 
167 /**
168  * qemu_clock_get_main_loop_timerlist:
169  * @type: the clock type
170  *
171  * Return the default timer list assocatiated with a clock.
172  *
173  * Returns: the default timer list
174  */
175 QEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type);
176 
177 /**
178  * qemu_clock_nofify:
179  * @type: the clock type
180  *
181  * Call the notifier callback connected with the default timer
182  * list linked to the clock, or qemu_notify() if none.
183  */
184 void qemu_clock_notify(QEMUClockType type);
185 
186 /**
187  * qemu_clock_enable:
188  * @type: the clock type
189  * @enabled: true to enable, false to disable
190  *
191  * Enable or disable a clock
192  * Disabling the clock will wait for related timerlists to stop
193  * executing qemu_run_timers.  Thus, this functions should not
194  * be used from the callback of a timer that is based on @clock.
195  * Doing so would cause a deadlock.
196  *
197  * Caller should hold BQL.
198  */
199 void qemu_clock_enable(QEMUClockType type, bool enabled);
200 
201 /**
202  * qemu_clock_warp:
203  * @type: the clock type
204  *
205  * Warp a clock to a new value
206  */
207 void qemu_clock_warp(QEMUClockType type);
208 
209 /**
210  * qemu_clock_register_reset_notifier:
211  * @type: the clock type
212  * @notifier: the notifier function
213  *
214  * Register a notifier function to call when the clock
215  * concerned is reset.
216  */
217 void qemu_clock_register_reset_notifier(QEMUClockType type,
218                                         Notifier *notifier);
219 
220 /**
221  * qemu_clock_unregister_reset_notifier:
222  * @type: the clock type
223  * @notifier: the notifier function
224  *
225  * Unregister a notifier function to call when the clock
226  * concerned is reset.
227  */
228 void qemu_clock_unregister_reset_notifier(QEMUClockType type,
229                                           Notifier *notifier);
230 
231 /**
232  * qemu_clock_run_timers:
233  * @type: clock on which to operate
234  *
235  * Run all the timers associated with the default timer list
236  * of a clock.
237  *
238  * Returns: true if any timer ran.
239  */
240 bool qemu_clock_run_timers(QEMUClockType type);
241 
242 /**
243  * qemu_clock_run_all_timers:
244  *
245  * Run all the timers associated with the default timer list
246  * of every clock.
247  *
248  * Returns: true if any timer ran.
249  */
250 bool qemu_clock_run_all_timers(void);
251 
252 /*
253  * QEMUTimerList
254  */
255 
256 /**
257  * timerlist_new:
258  * @type: the clock type to associate with the timerlist
259  * @cb: the callback to call on notification
260  * @opaque: the opaque pointer to pass to the callback
261  *
262  * Create a new timerlist associated with the clock of
263  * type @type.
264  *
265  * Returns: a pointer to the QEMUTimerList created
266  */
267 QEMUTimerList *timerlist_new(QEMUClockType type,
268                              QEMUTimerListNotifyCB *cb, void *opaque);
269 
270 /**
271  * timerlist_free:
272  * @timer_list: the timer list to free
273  *
274  * Frees a timer_list. It must have no active timers.
275  */
276 void timerlist_free(QEMUTimerList *timer_list);
277 
278 /**
279  * timerlist_has_timers:
280  * @timer_list: the timer list to operate on
281  *
282  * Determine whether a timer list has active timers
283  *
284  * Note that this function should not be used when other threads also access
285  * the timer list.  The return value may be outdated by the time it is acted
286  * upon.
287  *
288  * Returns: true if the timer list has timers.
289  */
290 bool timerlist_has_timers(QEMUTimerList *timer_list);
291 
292 /**
293  * timerlist_expired:
294  * @timer_list: the timer list to operate on
295  *
296  * Determine whether a timer list has any timers which
297  * are expired.
298  *
299  * Returns: true if the timer list has timers which
300  * have expired.
301  */
302 bool timerlist_expired(QEMUTimerList *timer_list);
303 
304 /**
305  * timerlist_deadline_ns:
306  * @timer_list: the timer list to operate on
307  *
308  * Determine the deadline for a timer_list, i.e.
309  * the number of nanoseconds until the first timer
310  * expires. Return -1 if there are no timers.
311  *
312  * Returns: the number of nanoseconds until the earliest
313  * timer expires -1 if none
314  */
315 int64_t timerlist_deadline_ns(QEMUTimerList *timer_list);
316 
317 /**
318  * timerlist_get_clock:
319  * @timer_list: the timer list to operate on
320  *
321  * Determine the clock type associated with a timer list.
322  *
323  * Returns: the clock type associated with the
324  * timer list.
325  */
326 QEMUClockType timerlist_get_clock(QEMUTimerList *timer_list);
327 
328 /**
329  * timerlist_run_timers:
330  * @timer_list: the timer list to use
331  *
332  * Call all expired timers associated with the timer list.
333  *
334  * Returns: true if any timer expired
335  */
336 bool timerlist_run_timers(QEMUTimerList *timer_list);
337 
338 /**
339  * timerlist_notify:
340  * @timer_list: the timer list to use
341  *
342  * call the notifier callback associated with the timer list.
343  */
344 void timerlist_notify(QEMUTimerList *timer_list);
345 
346 /*
347  * QEMUTimerListGroup
348  */
349 
350 /**
351  * timerlistgroup_init:
352  * @tlg: the timer list group
353  * @cb: the callback to call when a notify is required
354  * @opaque: the opaque pointer to be passed to the callback.
355  *
356  * Initialise a timer list group. This must already be
357  * allocated in memory and zeroed. The notifier callback is
358  * called whenever a clock in the timer list group is
359  * reenabled or whenever a timer associated with any timer
360  * list is modified. If @cb is specified as null, qemu_notify()
361  * is used instead.
362  */
363 void timerlistgroup_init(QEMUTimerListGroup *tlg,
364                          QEMUTimerListNotifyCB *cb, void *opaque);
365 
366 /**
367  * timerlistgroup_deinit:
368  * @tlg: the timer list group
369  *
370  * Deinitialise a timer list group. This must already be
371  * initialised. Note the memory is not freed.
372  */
373 void timerlistgroup_deinit(QEMUTimerListGroup *tlg);
374 
375 /**
376  * timerlistgroup_run_timers:
377  * @tlg: the timer list group
378  *
379  * Run the timers associated with a timer list group.
380  * This will run timers on multiple clocks.
381  *
382  * Returns: true if any timer callback ran
383  */
384 bool timerlistgroup_run_timers(QEMUTimerListGroup *tlg);
385 
386 /**
387  * timerlistgroup_deadline_ns:
388  * @tlg: the timer list group
389  *
390  * Determine the deadline of the soonest timer to
391  * expire associated with any timer list linked to
392  * the timer list group. Only clocks suitable for
393  * deadline calculation are included.
394  *
395  * Returns: the deadline in nanoseconds or -1 if no
396  * timers are to expire.
397  */
398 int64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg);
399 
400 /*
401  * QEMUTimer
402  */
403 
404 /**
405  * timer_init:
406  * @ts: the timer to be initialised
407  * @timer_list: the timer list to attach the timer to
408  * @scale: the scale value for the tiemr
409  * @cb: the callback to be called when the timer expires
410  * @opaque: the opaque pointer to be passed to the callback
411  *
412  * Initialise a new timer and associate it with @timer_list.
413  * The caller is responsible for allocating the memory.
414  *
415  * You need not call an explicit deinit call. Simply make
416  * sure it is not on a list with timer_del.
417  */
418 void timer_init(QEMUTimer *ts,
419                 QEMUTimerList *timer_list, int scale,
420                 QEMUTimerCB *cb, void *opaque);
421 
422 /**
423  * timer_new_tl:
424  * @timer_list: the timer list to attach the timer to
425  * @scale: the scale value for the tiemr
426  * @cb: the callback to be called when the timer expires
427  * @opaque: the opaque pointer to be passed to the callback
428  *
429  * Creeate a new timer and associate it with @timer_list.
430  * The memory is allocated by the function.
431  *
432  * This is not the preferred interface unless you know you
433  * are going to call timer_free. Use timer_init instead.
434  *
435  * Returns: a pointer to the timer
436  */
timer_new_tl(QEMUTimerList * timer_list,int scale,QEMUTimerCB * cb,void * opaque)437 static inline QEMUTimer *timer_new_tl(QEMUTimerList *timer_list,
438                                       int scale,
439                                       QEMUTimerCB *cb,
440                                       void *opaque)
441 {
442     QEMUTimer *ts = g_malloc0(sizeof(QEMUTimer));
443     timer_init(ts, timer_list, scale, cb, opaque);
444     return ts;
445 }
446 
447 /**
448  * timer_new:
449  * @type: the clock type to use
450  * @scale: the scale value for the tiemr
451  * @cb: the callback to be called when the timer expires
452  * @opaque: the opaque pointer to be passed to the callback
453  *
454  * Creeate a new timer and associate it with the default
455  * timer list for the clock type @type.
456  *
457  * Returns: a pointer to the timer
458  */
timer_new(QEMUClockType type,int scale,QEMUTimerCB * cb,void * opaque)459 static inline QEMUTimer *timer_new(QEMUClockType type, int scale,
460                                    QEMUTimerCB *cb, void *opaque)
461 {
462     return timer_new_tl(main_loop_tlg.tl[type], scale, cb, opaque);
463 }
464 
465 /**
466  * timer_new_ns:
467  * @clock: the clock to associate with the timer
468  * @callback: the callback to call when the timer expires
469  * @opaque: the opaque pointer to pass to the callback
470  *
471  * Create a new timer with nanosecond scale on the default timer list
472  * associated with the clock.
473  *
474  * Returns: a pointer to the newly created timer
475  */
timer_new_ns(QEMUClockType type,QEMUTimerCB * cb,void * opaque)476 static inline QEMUTimer *timer_new_ns(QEMUClockType type, QEMUTimerCB *cb,
477                                       void *opaque)
478 {
479     return timer_new(type, SCALE_NS, cb, opaque);
480 }
481 
482 /**
483  * timer_new_us:
484  * @clock: the clock to associate with the timer
485  * @callback: the callback to call when the timer expires
486  * @opaque: the opaque pointer to pass to the callback
487  *
488  * Create a new timer with microsecond scale on the default timer list
489  * associated with the clock.
490  *
491  * Returns: a pointer to the newly created timer
492  */
timer_new_us(QEMUClockType type,QEMUTimerCB * cb,void * opaque)493 static inline QEMUTimer *timer_new_us(QEMUClockType type, QEMUTimerCB *cb,
494                                       void *opaque)
495 {
496     return timer_new(type, SCALE_US, cb, opaque);
497 }
498 
499 /**
500  * timer_new_ms:
501  * @clock: the clock to associate with the timer
502  * @callback: the callback to call when the timer expires
503  * @opaque: the opaque pointer to pass to the callback
504  *
505  * Create a new timer with millisecond scale on the default timer list
506  * associated with the clock.
507  *
508  * Returns: a pointer to the newly created timer
509  */
timer_new_ms(QEMUClockType type,QEMUTimerCB * cb,void * opaque)510 static inline QEMUTimer *timer_new_ms(QEMUClockType type, QEMUTimerCB *cb,
511                                       void *opaque)
512 {
513     return timer_new(type, SCALE_MS, cb, opaque);
514 }
515 
516 /**
517  * timer_free:
518  * @ts: the timer
519  *
520  * Free a timer (it must not be on the active list)
521  */
522 void timer_free(QEMUTimer *ts);
523 
524 /**
525  * timer_del:
526  * @ts: the timer
527  *
528  * Delete a timer from the active list.
529  *
530  * This function is thread-safe but the timer and its timer list must not be
531  * freed while this function is running.
532  */
533 void timer_del(QEMUTimer *ts);
534 
535 /**
536  * timer_mod_ns:
537  * @ts: the timer
538  * @expire_time: the expiry time in nanoseconds
539  *
540  * Modify a timer to expire at @expire_time
541  *
542  * This function is thread-safe but the timer and its timer list must not be
543  * freed while this function is running.
544  */
545 void timer_mod_ns(QEMUTimer *ts, int64_t expire_time);
546 
547 /**
548  * timer_mod_anticipate_ns:
549  * @ts: the timer
550  * @expire_time: the expiry time in nanoseconds
551  *
552  * Modify a timer to expire at @expire_time or the current time,
553  * whichever comes earlier.
554  *
555  * This function is thread-safe but the timer and its timer list must not be
556  * freed while this function is running.
557  */
558 void timer_mod_anticipate_ns(QEMUTimer *ts, int64_t expire_time);
559 
560 /**
561  * timer_mod:
562  * @ts: the timer
563  * @expire_time: the expire time in the units associated with the timer
564  *
565  * Modify a timer to expiry at @expire_time, taking into
566  * account the scale associated with the timer.
567  *
568  * This function is thread-safe but the timer and its timer list must not be
569  * freed while this function is running.
570  */
571 void timer_mod(QEMUTimer *ts, int64_t expire_timer);
572 
573 /**
574  * timer_mod_anticipate:
575  * @ts: the timer
576  * @expire_time: the expiry time in nanoseconds
577  *
578  * Modify a timer to expire at @expire_time or the current time, whichever
579  * comes earlier, taking into account the scale associated with the timer.
580  *
581  * This function is thread-safe but the timer and its timer list must not be
582  * freed while this function is running.
583  */
584 void timer_mod_anticipate(QEMUTimer *ts, int64_t expire_time);
585 
586 /**
587  * timer_pending:
588  * @ts: the timer
589  *
590  * Determines whether a timer is pending (i.e. is on the
591  * active list of timers, whether or not it has not yet expired).
592  *
593  * Returns: true if the timer is pending
594  */
595 bool timer_pending(QEMUTimer *ts);
596 
597 /**
598  * timer_expired:
599  * @ts: the timer
600  *
601  * Determines whether a timer has expired.
602  *
603  * Returns: true if the timer has expired
604  */
605 bool timer_expired(QEMUTimer *timer_head, int64_t current_time);
606 
607 /**
608  * timer_expire_time_ns:
609  * @ts: the timer
610  *
611  * Determine the expiry time of a timer
612  *
613  * Returns: the expiry time in nanoseconds
614  */
615 uint64_t timer_expire_time_ns(QEMUTimer *ts);
616 
617 /**
618  * timer_get:
619  * @f: the file
620  * @ts: the timer
621  *
622  * Read a timer @ts from a file @f
623  */
624 void timer_get(QEMUFile *f, QEMUTimer *ts);
625 
626 /**
627  * timer_put:
628  * @f: the file
629  * @ts: the timer
630  */
631 void timer_put(QEMUFile *f, QEMUTimer *ts);
632 
633 /*
634  * General utility functions
635  */
636 
637 /**
638  * qemu_timeout_ns_to_ms:
639  * @ns: nanosecond timeout value
640  *
641  * Convert a nanosecond timeout value (or -1) to
642  * a millisecond value (or -1), always rounding up.
643  *
644  * Returns: millisecond timeout value
645  */
646 int qemu_timeout_ns_to_ms(int64_t ns);
647 
648 /**
649  * qemu_poll_ns:
650  * @fds: Array of file descriptors
651  * @nfds: number of file descriptors
652  * @timeout: timeout in nanoseconds
653  *
654  * Perform a poll like g_poll but with a timeout in nanoseconds.
655  * See g_poll documentation for further details.
656  *
657  * Returns: number of fds ready
658  */
659 int qemu_poll_ns(GPollFD *fds, guint nfds, int64_t timeout);
660 
661 /**
662  * qemu_soonest_timeout:
663  * @timeout1: first timeout in nanoseconds (or -1 for infinite)
664  * @timeout2: second timeout in nanoseconds (or -1 for infinite)
665  *
666  * Calculates the soonest of two timeout values. -1 means infinite, which
667  * is later than any other value.
668  *
669  * Returns: soonest timeout value in nanoseconds (or -1 for infinite)
670  */
qemu_soonest_timeout(int64_t timeout1,int64_t timeout2)671 static inline int64_t qemu_soonest_timeout(int64_t timeout1, int64_t timeout2)
672 {
673     /* we can abuse the fact that -1 (which means infinite) is a maximal
674      * value when cast to unsigned. As this is disgusting, it's kept in
675      * one inline function.
676      */
677     return ((uint64_t) timeout1 < (uint64_t) timeout2) ? timeout1 : timeout2;
678 }
679 
680 /**
681  * initclocks:
682  *
683  * Initialise the clock & timer infrastructure
684  */
685 void init_clocks(void);
686 
687 int64_t cpu_get_ticks(void);
688 /* Caller must hold BQL */
689 void cpu_enable_ticks(void);
690 /* Caller must hold BQL */
691 void cpu_disable_ticks(void);
692 
get_ticks_per_sec(void)693 static inline int64_t get_ticks_per_sec(void)
694 {
695     return 1000000000LL;
696 }
697 
698 /*
699  * Low level clock functions
700  */
701 
702 /* real time host monotonic timer */
get_clock_realtime(void)703 static inline int64_t get_clock_realtime(void)
704 {
705     struct timeval tv;
706 
707     gettimeofday(&tv, NULL);
708     return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
709 }
710 
711 /* Warning: don't insert tracepoints into these functions, they are
712    also used by simpletrace backend and tracepoints would cause
713    an infinite recursion! */
714 #ifdef _WIN32
715 extern int64_t clock_freq;
716 
get_clock(void)717 static inline int64_t get_clock(void)
718 {
719     LARGE_INTEGER ti;
720     QueryPerformanceCounter(&ti);
721     return muldiv64(ti.QuadPart, get_ticks_per_sec(), clock_freq);
722 }
723 
724 #else
725 
726 extern int use_rt_clock;
727 
get_clock(void)728 static inline int64_t get_clock(void)
729 {
730 #ifdef CLOCK_MONOTONIC
731     if (use_rt_clock) {
732         struct timespec ts;
733         clock_gettime(CLOCK_MONOTONIC, &ts);
734         return ts.tv_sec * 1000000000LL + ts.tv_nsec;
735     } else
736 #endif
737     {
738         /* XXX: using gettimeofday leads to problems if the date
739            changes, so it should be avoided. */
740         return get_clock_realtime();
741     }
742 }
743 #endif
744 
745 /* icount */
746 int64_t cpu_get_icount(void);
747 int64_t cpu_get_clock(void);
748 
749 /*******************************************/
750 /* host CPU ticks (if available) */
751 
752 #if defined(_ARCH_PPC)
753 
cpu_get_real_ticks(void)754 static inline int64_t cpu_get_real_ticks(void)
755 {
756     int64_t retval;
757 #ifdef _ARCH_PPC64
758     /* This reads timebase in one 64bit go and includes Cell workaround from:
759        http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027052.html
760     */
761     __asm__ __volatile__ ("mftb    %0\n\t"
762                           "cmpwi   %0,0\n\t"
763                           "beq-    $-8"
764                           : "=r" (retval));
765 #else
766     /* http://ozlabs.org/pipermail/linuxppc-dev/1999-October/003889.html */
767     unsigned long junk;
768     __asm__ __volatile__ ("mfspr   %1,269\n\t"  /* mftbu */
769                           "mfspr   %L0,268\n\t" /* mftb */
770                           "mfspr   %0,269\n\t"  /* mftbu */
771                           "cmpw    %0,%1\n\t"
772                           "bne     $-16"
773                           : "=r" (retval), "=r" (junk));
774 #endif
775     return retval;
776 }
777 
778 #elif defined(__i386__)
779 
cpu_get_real_ticks(void)780 static inline int64_t cpu_get_real_ticks(void)
781 {
782     int64_t val;
783     asm volatile ("rdtsc" : "=A" (val));
784     return val;
785 }
786 
787 #elif defined(__x86_64__)
788 
cpu_get_real_ticks(void)789 static inline int64_t cpu_get_real_ticks(void)
790 {
791     uint32_t low,high;
792     int64_t val;
793     asm volatile("rdtsc" : "=a" (low), "=d" (high));
794     val = high;
795     val <<= 32;
796     val |= low;
797     return val;
798 }
799 
800 #elif defined(__hppa__)
801 
cpu_get_real_ticks(void)802 static inline int64_t cpu_get_real_ticks(void)
803 {
804     int val;
805     asm volatile ("mfctl %%cr16, %0" : "=r"(val));
806     return val;
807 }
808 
809 #elif defined(__ia64)
810 
cpu_get_real_ticks(void)811 static inline int64_t cpu_get_real_ticks(void)
812 {
813     int64_t val;
814     asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory");
815     return val;
816 }
817 
818 #elif defined(__s390__)
819 
cpu_get_real_ticks(void)820 static inline int64_t cpu_get_real_ticks(void)
821 {
822     int64_t val;
823     asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc");
824     return val;
825 }
826 
827 #elif defined(__sparc__)
828 
cpu_get_real_ticks(void)829 static inline int64_t cpu_get_real_ticks (void)
830 {
831 #if defined(_LP64)
832     uint64_t        rval;
833     asm volatile("rd %%tick,%0" : "=r"(rval));
834     return rval;
835 #else
836     /* We need an %o or %g register for this.  For recent enough gcc
837        there is an "h" constraint for that.  Don't bother with that.  */
838     union {
839         uint64_t i64;
840         struct {
841             uint32_t high;
842             uint32_t low;
843         }       i32;
844     } rval;
845     asm volatile("rd %%tick,%%g1; srlx %%g1,32,%0; mov %%g1,%1"
846                  : "=r"(rval.i32.high), "=r"(rval.i32.low) : : "g1");
847     return rval.i64;
848 #endif
849 }
850 
851 #elif defined(__mips__) && \
852     ((defined(__mips_isa_rev) && __mips_isa_rev >= 2) || defined(__linux__))
853 /*
854  * binutils wants to use rdhwr only on mips32r2
855  * but as linux kernel emulate it, it's fine
856  * to use it.
857  *
858  */
859 #define MIPS_RDHWR(rd, value) {                         \
860         __asm__ __volatile__ (".set   push\n\t"         \
861                               ".set mips32r2\n\t"       \
862                               "rdhwr  %0, "rd"\n\t"     \
863                               ".set   pop"              \
864                               : "=r" (value));          \
865     }
866 
cpu_get_real_ticks(void)867 static inline int64_t cpu_get_real_ticks(void)
868 {
869     /* On kernels >= 2.6.25 rdhwr <reg>, $2 and $3 are emulated */
870     uint32_t count;
871     static uint32_t cyc_per_count = 0;
872 
873     if (!cyc_per_count) {
874         MIPS_RDHWR("$3", cyc_per_count);
875     }
876 
877     MIPS_RDHWR("$2", count);
878     return (int64_t)(count * cyc_per_count);
879 }
880 
881 #elif defined(__alpha__)
882 
cpu_get_real_ticks(void)883 static inline int64_t cpu_get_real_ticks(void)
884 {
885     uint64_t cc;
886     uint32_t cur, ofs;
887 
888     asm volatile("rpcc %0" : "=r"(cc));
889     cur = cc;
890     ofs = cc >> 32;
891     return cur - ofs;
892 }
893 
894 #else
895 /* The host CPU doesn't have an easily accessible cycle counter.
896    Just return a monotonically increasing value.  This will be
897    totally wrong, but hopefully better than nothing.  */
cpu_get_real_ticks(void)898 static inline int64_t cpu_get_real_ticks (void)
899 {
900     static int64_t ticks = 0;
901     return ticks++;
902 }
903 #endif
904 
905 #ifdef CONFIG_PROFILER
profile_getclock(void)906 static inline int64_t profile_getclock(void)
907 {
908     return cpu_get_real_ticks();
909 }
910 
911 extern int64_t qemu_time, qemu_time_start;
912 extern int64_t tlb_flush_time;
913 extern int64_t dev_time;
914 #endif
915 
916 #endif
917