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 41typedef enum { 42 QEMU_CLOCK_REALTIME = 0, 43 QEMU_CLOCK_VIRTUAL = 1, 44 QEMU_CLOCK_HOST = 2, 45 QEMU_CLOCK_MAX 46} QEMUClockType; 47 48typedef struct QEMUTimerList QEMUTimerList; 49 50struct QEMUTimerListGroup { 51 QEMUTimerList *tl[QEMU_CLOCK_MAX]; 52}; 53 54typedef void QEMUTimerCB(void *opaque); 55typedef void QEMUTimerListNotifyCB(void *opaque); 56 57struct 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 66extern 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 */ 81int64_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 */ 92static 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 */ 106static 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 */ 125bool 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 */ 137bool 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 */ 153bool 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 */ 165int64_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 */ 175QEMUTimerList *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 */ 184void 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 */ 199void 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 */ 207void 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 */ 217void 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 */ 228void 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 */ 240bool 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 */ 250bool 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 */ 267QEMUTimerList *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 */ 276void 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 */ 290bool 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 */ 302bool 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 */ 315int64_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 */ 326QEMUClockType 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 */ 336bool 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 */ 344void 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 */ 363void 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 */ 373void 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 */ 384bool 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 */ 398int64_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 */ 418void 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 */ 437static 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 */ 459static 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 */ 476static 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 */ 493static 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 */ 510static 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 */ 522void 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 */ 533void 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 */ 545void 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 */ 558void 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 */ 571void 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 */ 584void 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 */ 595bool 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 */ 605bool 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 */ 615uint64_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 */ 624void timer_get(QEMUFile *f, QEMUTimer *ts); 625 626/** 627 * timer_put: 628 * @f: the file 629 * @ts: the timer 630 */ 631void 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 */ 646int 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 */ 659int 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 */ 671static 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 */ 685void init_clocks(void); 686 687int64_t cpu_get_ticks(void); 688/* Caller must hold BQL */ 689void cpu_enable_ticks(void); 690/* Caller must hold BQL */ 691void cpu_disable_ticks(void); 692 693static 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 */ 703static 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 715extern int64_t clock_freq; 716 717static 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 726extern int use_rt_clock; 727 728static 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 */ 746int64_t cpu_get_icount(void); 747int64_t cpu_get_clock(void); 748 749/*******************************************/ 750/* host CPU ticks (if available) */ 751 752#if defined(_ARCH_PPC) 753 754static 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 780static 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 789static 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 802static 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 811static 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 820static 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 829static 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 867static 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 883static 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. */ 898static 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 906static inline int64_t profile_getclock(void) 907{ 908 return cpu_get_real_ticks(); 909} 910 911extern int64_t qemu_time, qemu_time_start; 912extern int64_t tlb_flush_time; 913extern int64_t dev_time; 914#endif 915 916#endif 917