1 /* 2 * QEMU System Emulator 3 * 4 * Copyright (c) 2003-2008 Fabrice Bellard 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 #include "sysemu/sysemu.h" 26 #include "monitor/monitor.h" 27 #include "ui/console.h" 28 29 #include "hw/hw.h" 30 31 #include "qemu/timer.h" 32 #ifdef CONFIG_POSIX 33 #include <pthread.h> 34 #endif 35 36 #ifdef _WIN32 37 #include <mmsystem.h> 38 #endif 39 40 /***********************************************************/ 41 /* timers */ 42 43 struct QEMUClock { 44 QEMUTimer *active_timers; 45 46 NotifierList reset_notifiers; 47 int64_t last; 48 49 int type; 50 bool enabled; 51 }; 52 53 struct QEMUTimer { 54 int64_t expire_time; /* in nanoseconds */ 55 QEMUClock *clock; 56 QEMUTimerCB *cb; 57 void *opaque; 58 QEMUTimer *next; 59 int scale; 60 }; 61 62 struct qemu_alarm_timer { 63 char const *name; 64 int (*start)(struct qemu_alarm_timer *t); 65 void (*stop)(struct qemu_alarm_timer *t); 66 void (*rearm)(struct qemu_alarm_timer *t, int64_t nearest_delta_ns); 67 #if defined(__linux__) 68 timer_t timer; 69 int fd; 70 #elif defined(_WIN32) 71 HANDLE timer; 72 #endif 73 bool expired; 74 bool pending; 75 }; 76 77 static struct qemu_alarm_timer *alarm_timer; 78 79 static bool timer_expired_ns(QEMUTimer *timer_head, int64_t current_time) 80 { 81 return timer_head && (timer_head->expire_time <= current_time); 82 } 83 84 static int64_t qemu_next_alarm_deadline(void) 85 { 86 int64_t delta = INT64_MAX; 87 int64_t rtdelta; 88 89 if (!use_icount && vm_clock->enabled && vm_clock->active_timers) { 90 delta = vm_clock->active_timers->expire_time - 91 qemu_get_clock_ns(vm_clock); 92 } 93 if (host_clock->enabled && host_clock->active_timers) { 94 int64_t hdelta = host_clock->active_timers->expire_time - 95 qemu_get_clock_ns(host_clock); 96 if (hdelta < delta) { 97 delta = hdelta; 98 } 99 } 100 if (rt_clock->enabled && rt_clock->active_timers) { 101 rtdelta = (rt_clock->active_timers->expire_time - 102 qemu_get_clock_ns(rt_clock)); 103 if (rtdelta < delta) { 104 delta = rtdelta; 105 } 106 } 107 108 return delta; 109 } 110 111 static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t) 112 { 113 int64_t nearest_delta_ns = qemu_next_alarm_deadline(); 114 if (nearest_delta_ns < INT64_MAX) { 115 t->rearm(t, nearest_delta_ns); 116 } 117 } 118 119 /* TODO: MIN_TIMER_REARM_NS should be optimized */ 120 #define MIN_TIMER_REARM_NS 250000 121 122 #ifdef _WIN32 123 124 static int mm_start_timer(struct qemu_alarm_timer *t); 125 static void mm_stop_timer(struct qemu_alarm_timer *t); 126 static void mm_rearm_timer(struct qemu_alarm_timer *t, int64_t delta); 127 128 static int win32_start_timer(struct qemu_alarm_timer *t); 129 static void win32_stop_timer(struct qemu_alarm_timer *t); 130 static void win32_rearm_timer(struct qemu_alarm_timer *t, int64_t delta); 131 132 #else 133 134 static int unix_start_timer(struct qemu_alarm_timer *t); 135 static void unix_stop_timer(struct qemu_alarm_timer *t); 136 static void unix_rearm_timer(struct qemu_alarm_timer *t, int64_t delta); 137 138 #ifdef __linux__ 139 140 static int dynticks_start_timer(struct qemu_alarm_timer *t); 141 static void dynticks_stop_timer(struct qemu_alarm_timer *t); 142 static void dynticks_rearm_timer(struct qemu_alarm_timer *t, int64_t delta); 143 144 #endif /* __linux__ */ 145 146 #endif /* _WIN32 */ 147 148 static struct qemu_alarm_timer alarm_timers[] = { 149 #ifndef _WIN32 150 #ifdef __linux__ 151 {"dynticks", dynticks_start_timer, 152 dynticks_stop_timer, dynticks_rearm_timer}, 153 #endif 154 {"unix", unix_start_timer, unix_stop_timer, unix_rearm_timer}, 155 #else 156 {"mmtimer", mm_start_timer, mm_stop_timer, mm_rearm_timer}, 157 {"dynticks", win32_start_timer, win32_stop_timer, win32_rearm_timer}, 158 #endif 159 {NULL, } 160 }; 161 162 static void show_available_alarms(void) 163 { 164 int i; 165 166 printf("Available alarm timers, in order of precedence:\n"); 167 for (i = 0; alarm_timers[i].name; i++) 168 printf("%s\n", alarm_timers[i].name); 169 } 170 171 void configure_alarms(char const *opt) 172 { 173 int i; 174 int cur = 0; 175 int count = ARRAY_SIZE(alarm_timers) - 1; 176 char *arg; 177 char *name; 178 struct qemu_alarm_timer tmp; 179 180 if (is_help_option(opt)) { 181 show_available_alarms(); 182 exit(0); 183 } 184 185 arg = g_strdup(opt); 186 187 /* Reorder the array */ 188 name = strtok(arg, ","); 189 while (name) { 190 for (i = 0; i < count && alarm_timers[i].name; i++) { 191 if (!strcmp(alarm_timers[i].name, name)) 192 break; 193 } 194 195 if (i == count) { 196 fprintf(stderr, "Unknown clock %s\n", name); 197 goto next; 198 } 199 200 if (i < cur) 201 /* Ignore */ 202 goto next; 203 204 /* Swap */ 205 tmp = alarm_timers[i]; 206 alarm_timers[i] = alarm_timers[cur]; 207 alarm_timers[cur] = tmp; 208 209 cur++; 210 next: 211 name = strtok(NULL, ","); 212 } 213 214 g_free(arg); 215 216 if (cur) { 217 /* Disable remaining timers */ 218 for (i = cur; i < count; i++) 219 alarm_timers[i].name = NULL; 220 } else { 221 show_available_alarms(); 222 exit(1); 223 } 224 } 225 226 QEMUClock *rt_clock; 227 QEMUClock *vm_clock; 228 QEMUClock *host_clock; 229 230 static QEMUClock *qemu_clock_new(int type) 231 { 232 QEMUClock *clock; 233 234 clock = g_malloc0(sizeof(QEMUClock)); 235 clock->type = type; 236 clock->enabled = true; 237 clock->last = INT64_MIN; 238 notifier_list_init(&clock->reset_notifiers); 239 return clock; 240 } 241 242 void qemu_clock_enable(QEMUClock *clock, bool enabled) 243 { 244 bool old = clock->enabled; 245 clock->enabled = enabled; 246 if (enabled && !old) { 247 qemu_rearm_alarm_timer(alarm_timer); 248 } 249 } 250 251 int64_t qemu_clock_has_timers(QEMUClock *clock) 252 { 253 return !!clock->active_timers; 254 } 255 256 int64_t qemu_clock_expired(QEMUClock *clock) 257 { 258 return (clock->active_timers && 259 clock->active_timers->expire_time < qemu_get_clock_ns(clock)); 260 } 261 262 int64_t qemu_clock_deadline(QEMUClock *clock) 263 { 264 /* To avoid problems with overflow limit this to 2^32. */ 265 int64_t delta = INT32_MAX; 266 267 if (clock->active_timers) { 268 delta = clock->active_timers->expire_time - qemu_get_clock_ns(clock); 269 } 270 if (delta < 0) { 271 delta = 0; 272 } 273 return delta; 274 } 275 276 QEMUTimer *qemu_new_timer(QEMUClock *clock, int scale, 277 QEMUTimerCB *cb, void *opaque) 278 { 279 QEMUTimer *ts; 280 281 ts = g_malloc0(sizeof(QEMUTimer)); 282 ts->clock = clock; 283 ts->cb = cb; 284 ts->opaque = opaque; 285 ts->scale = scale; 286 return ts; 287 } 288 289 void qemu_free_timer(QEMUTimer *ts) 290 { 291 g_free(ts); 292 } 293 294 /* stop a timer, but do not dealloc it */ 295 void qemu_del_timer(QEMUTimer *ts) 296 { 297 QEMUTimer **pt, *t; 298 299 /* NOTE: this code must be signal safe because 300 timer_expired() can be called from a signal. */ 301 pt = &ts->clock->active_timers; 302 for(;;) { 303 t = *pt; 304 if (!t) 305 break; 306 if (t == ts) { 307 *pt = t->next; 308 break; 309 } 310 pt = &t->next; 311 } 312 } 313 314 /* modify the current timer so that it will be fired when current_time 315 >= expire_time. The corresponding callback will be called. */ 316 void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time) 317 { 318 QEMUTimer **pt, *t; 319 320 qemu_del_timer(ts); 321 322 /* add the timer in the sorted list */ 323 /* NOTE: this code must be signal safe because 324 timer_expired() can be called from a signal. */ 325 pt = &ts->clock->active_timers; 326 for(;;) { 327 t = *pt; 328 if (!timer_expired_ns(t, expire_time)) { 329 break; 330 } 331 pt = &t->next; 332 } 333 ts->expire_time = expire_time; 334 ts->next = *pt; 335 *pt = ts; 336 337 /* Rearm if necessary */ 338 if (pt == &ts->clock->active_timers) { 339 if (!alarm_timer->pending) { 340 qemu_rearm_alarm_timer(alarm_timer); 341 } 342 /* Interrupt execution to force deadline recalculation. */ 343 qemu_clock_warp(ts->clock); 344 if (use_icount) { 345 qemu_notify_event(); 346 } 347 } 348 } 349 350 void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time) 351 { 352 qemu_mod_timer_ns(ts, expire_time * ts->scale); 353 } 354 355 bool timer_pending(QEMUTimer *ts) 356 { 357 QEMUTimer *t; 358 for (t = ts->clock->active_timers; t != NULL; t = t->next) { 359 if (t == ts) { 360 return true; 361 } 362 } 363 return false; 364 } 365 366 bool timer_expired(QEMUTimer *timer_head, int64_t current_time) 367 { 368 return timer_expired_ns(timer_head, current_time * timer_head->scale); 369 } 370 371 void qemu_run_timers(QEMUClock *clock) 372 { 373 QEMUTimer *ts; 374 int64_t current_time; 375 376 if (!clock->enabled) 377 return; 378 379 current_time = qemu_get_clock_ns(clock); 380 for(;;) { 381 ts = clock->active_timers; 382 if (!timer_expired_ns(ts, current_time)) { 383 break; 384 } 385 /* remove timer from the list before calling the callback */ 386 clock->active_timers = ts->next; 387 ts->next = NULL; 388 389 /* run the callback (the timer list can be modified) */ 390 ts->cb(ts->opaque); 391 } 392 } 393 394 int64_t qemu_get_clock_ns(QEMUClock *clock) 395 { 396 int64_t now, last; 397 398 switch(clock->type) { 399 case QEMU_CLOCK_REALTIME: 400 return get_clock(); 401 default: 402 case QEMU_CLOCK_VIRTUAL: 403 if (use_icount) { 404 return cpu_get_icount(); 405 } else { 406 return cpu_get_clock(); 407 } 408 case QEMU_CLOCK_HOST: 409 now = get_clock_realtime(); 410 last = clock->last; 411 clock->last = now; 412 if (now < last) { 413 notifier_list_notify(&clock->reset_notifiers, &now); 414 } 415 return now; 416 } 417 } 418 419 void qemu_register_clock_reset_notifier(QEMUClock *clock, Notifier *notifier) 420 { 421 notifier_list_add(&clock->reset_notifiers, notifier); 422 } 423 424 void qemu_unregister_clock_reset_notifier(QEMUClock *clock, Notifier *notifier) 425 { 426 notifier_remove(notifier); 427 } 428 429 void init_clocks(void) 430 { 431 if (!rt_clock) { 432 rt_clock = qemu_clock_new(QEMU_CLOCK_REALTIME); 433 vm_clock = qemu_clock_new(QEMU_CLOCK_VIRTUAL); 434 host_clock = qemu_clock_new(QEMU_CLOCK_HOST); 435 } 436 } 437 438 uint64_t timer_expire_time_ns(QEMUTimer *ts) 439 { 440 return timer_pending(ts) ? ts->expire_time : -1; 441 } 442 443 void qemu_run_all_timers(void) 444 { 445 alarm_timer->pending = false; 446 447 /* vm time timers */ 448 qemu_run_timers(vm_clock); 449 qemu_run_timers(rt_clock); 450 qemu_run_timers(host_clock); 451 452 /* rearm timer, if not periodic */ 453 if (alarm_timer->expired) { 454 alarm_timer->expired = false; 455 qemu_rearm_alarm_timer(alarm_timer); 456 } 457 } 458 459 #ifdef _WIN32 460 static void CALLBACK host_alarm_handler(PVOID lpParam, BOOLEAN unused) 461 #else 462 static void host_alarm_handler(int host_signum) 463 #endif 464 { 465 struct qemu_alarm_timer *t = alarm_timer; 466 if (!t) 467 return; 468 469 t->expired = true; 470 t->pending = true; 471 qemu_notify_event(); 472 } 473 474 #if defined(__linux__) 475 476 #include "qemu/compatfd.h" 477 478 static int dynticks_start_timer(struct qemu_alarm_timer *t) 479 { 480 struct sigevent ev; 481 timer_t host_timer; 482 struct sigaction act; 483 484 sigfillset(&act.sa_mask); 485 act.sa_flags = 0; 486 act.sa_handler = host_alarm_handler; 487 488 sigaction(SIGALRM, &act, NULL); 489 490 /* 491 * Initialize ev struct to 0 to avoid valgrind complaining 492 * about uninitialized data in timer_create call 493 */ 494 memset(&ev, 0, sizeof(ev)); 495 ev.sigev_value.sival_int = 0; 496 ev.sigev_notify = SIGEV_SIGNAL; 497 #ifdef CONFIG_SIGEV_THREAD_ID 498 if (qemu_signalfd_available()) { 499 ev.sigev_notify = SIGEV_THREAD_ID; 500 ev._sigev_un._tid = qemu_get_thread_id(); 501 } 502 #endif /* CONFIG_SIGEV_THREAD_ID */ 503 ev.sigev_signo = SIGALRM; 504 505 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) { 506 perror("timer_create"); 507 return -1; 508 } 509 510 t->timer = host_timer; 511 512 return 0; 513 } 514 515 static void dynticks_stop_timer(struct qemu_alarm_timer *t) 516 { 517 timer_t host_timer = t->timer; 518 519 timer_delete(host_timer); 520 } 521 522 static void dynticks_rearm_timer(struct qemu_alarm_timer *t, 523 int64_t nearest_delta_ns) 524 { 525 timer_t host_timer = t->timer; 526 struct itimerspec timeout; 527 int64_t current_ns; 528 529 if (nearest_delta_ns < MIN_TIMER_REARM_NS) 530 nearest_delta_ns = MIN_TIMER_REARM_NS; 531 532 /* check whether a timer is already running */ 533 if (timer_gettime(host_timer, &timeout)) { 534 perror("gettime"); 535 fprintf(stderr, "Internal timer error: aborting\n"); 536 exit(1); 537 } 538 current_ns = timeout.it_value.tv_sec * 1000000000LL + timeout.it_value.tv_nsec; 539 if (current_ns && current_ns <= nearest_delta_ns) 540 return; 541 542 timeout.it_interval.tv_sec = 0; 543 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */ 544 timeout.it_value.tv_sec = nearest_delta_ns / 1000000000; 545 timeout.it_value.tv_nsec = nearest_delta_ns % 1000000000; 546 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) { 547 perror("settime"); 548 fprintf(stderr, "Internal timer error: aborting\n"); 549 exit(1); 550 } 551 } 552 553 #endif /* defined(__linux__) */ 554 555 #if !defined(_WIN32) 556 557 static int unix_start_timer(struct qemu_alarm_timer *t) 558 { 559 struct sigaction act; 560 561 /* timer signal */ 562 sigfillset(&act.sa_mask); 563 act.sa_flags = 0; 564 act.sa_handler = host_alarm_handler; 565 566 sigaction(SIGALRM, &act, NULL); 567 return 0; 568 } 569 570 static void unix_rearm_timer(struct qemu_alarm_timer *t, 571 int64_t nearest_delta_ns) 572 { 573 struct itimerval itv; 574 int err; 575 576 if (nearest_delta_ns < MIN_TIMER_REARM_NS) 577 nearest_delta_ns = MIN_TIMER_REARM_NS; 578 579 itv.it_interval.tv_sec = 0; 580 itv.it_interval.tv_usec = 0; /* 0 for one-shot timer */ 581 itv.it_value.tv_sec = nearest_delta_ns / 1000000000; 582 itv.it_value.tv_usec = (nearest_delta_ns % 1000000000) / 1000; 583 err = setitimer(ITIMER_REAL, &itv, NULL); 584 if (err) { 585 perror("setitimer"); 586 fprintf(stderr, "Internal timer error: aborting\n"); 587 exit(1); 588 } 589 } 590 591 static void unix_stop_timer(struct qemu_alarm_timer *t) 592 { 593 struct itimerval itv; 594 595 memset(&itv, 0, sizeof(itv)); 596 setitimer(ITIMER_REAL, &itv, NULL); 597 } 598 599 #endif /* !defined(_WIN32) */ 600 601 602 #ifdef _WIN32 603 604 static MMRESULT mm_timer; 605 static TIMECAPS mm_tc; 606 607 static void CALLBACK mm_alarm_handler(UINT uTimerID, UINT uMsg, 608 DWORD_PTR dwUser, DWORD_PTR dw1, 609 DWORD_PTR dw2) 610 { 611 struct qemu_alarm_timer *t = alarm_timer; 612 if (!t) { 613 return; 614 } 615 t->expired = true; 616 t->pending = true; 617 qemu_notify_event(); 618 } 619 620 static int mm_start_timer(struct qemu_alarm_timer *t) 621 { 622 timeGetDevCaps(&mm_tc, sizeof(mm_tc)); 623 return 0; 624 } 625 626 static void mm_stop_timer(struct qemu_alarm_timer *t) 627 { 628 if (mm_timer) { 629 timeKillEvent(mm_timer); 630 } 631 } 632 633 static void mm_rearm_timer(struct qemu_alarm_timer *t, int64_t delta) 634 { 635 int64_t nearest_delta_ms = delta / 1000000; 636 if (nearest_delta_ms < mm_tc.wPeriodMin) { 637 nearest_delta_ms = mm_tc.wPeriodMin; 638 } else if (nearest_delta_ms > mm_tc.wPeriodMax) { 639 nearest_delta_ms = mm_tc.wPeriodMax; 640 } 641 642 if (mm_timer) { 643 timeKillEvent(mm_timer); 644 } 645 mm_timer = timeSetEvent((UINT)nearest_delta_ms, 646 mm_tc.wPeriodMin, 647 mm_alarm_handler, 648 (DWORD_PTR)t, 649 TIME_ONESHOT | TIME_CALLBACK_FUNCTION); 650 651 if (!mm_timer) { 652 fprintf(stderr, "Failed to re-arm win32 alarm timer\n"); 653 timeEndPeriod(mm_tc.wPeriodMin); 654 exit(1); 655 } 656 } 657 658 static int win32_start_timer(struct qemu_alarm_timer *t) 659 { 660 HANDLE hTimer; 661 BOOLEAN success; 662 663 /* If you call ChangeTimerQueueTimer on a one-shot timer (its period 664 is zero) that has already expired, the timer is not updated. Since 665 creating a new timer is relatively expensive, set a bogus one-hour 666 interval in the dynticks case. */ 667 success = CreateTimerQueueTimer(&hTimer, 668 NULL, 669 host_alarm_handler, 670 t, 671 1, 672 3600000, 673 WT_EXECUTEINTIMERTHREAD); 674 675 if (!success) { 676 fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n", 677 GetLastError()); 678 return -1; 679 } 680 681 t->timer = hTimer; 682 return 0; 683 } 684 685 static void win32_stop_timer(struct qemu_alarm_timer *t) 686 { 687 HANDLE hTimer = t->timer; 688 689 if (hTimer) { 690 DeleteTimerQueueTimer(NULL, hTimer, NULL); 691 } 692 } 693 694 static void win32_rearm_timer(struct qemu_alarm_timer *t, 695 int64_t nearest_delta_ns) 696 { 697 HANDLE hTimer = t->timer; 698 int64_t nearest_delta_ms; 699 BOOLEAN success; 700 701 nearest_delta_ms = nearest_delta_ns / 1000000; 702 if (nearest_delta_ms < 1) { 703 nearest_delta_ms = 1; 704 } 705 /* ULONG_MAX can be 32 bit */ 706 if (nearest_delta_ms > ULONG_MAX) { 707 nearest_delta_ms = ULONG_MAX; 708 } 709 success = ChangeTimerQueueTimer(NULL, 710 hTimer, 711 (unsigned long) nearest_delta_ms, 712 3600000); 713 714 if (!success) { 715 fprintf(stderr, "Failed to rearm win32 alarm timer: %ld\n", 716 GetLastError()); 717 exit(-1); 718 } 719 720 } 721 722 #endif /* _WIN32 */ 723 724 static void quit_timers(void) 725 { 726 struct qemu_alarm_timer *t = alarm_timer; 727 alarm_timer = NULL; 728 t->stop(t); 729 } 730 731 #ifdef CONFIG_POSIX 732 static void reinit_timers(void) 733 { 734 struct qemu_alarm_timer *t = alarm_timer; 735 t->stop(t); 736 if (t->start(t)) { 737 fprintf(stderr, "Internal timer error: aborting\n"); 738 exit(1); 739 } 740 qemu_rearm_alarm_timer(t); 741 } 742 #endif /* CONFIG_POSIX */ 743 744 int init_timer_alarm(void) 745 { 746 struct qemu_alarm_timer *t = NULL; 747 int i, err = -1; 748 749 if (alarm_timer) { 750 return 0; 751 } 752 753 for (i = 0; alarm_timers[i].name; i++) { 754 t = &alarm_timers[i]; 755 756 err = t->start(t); 757 if (!err) 758 break; 759 } 760 761 if (err) { 762 err = -ENOENT; 763 goto fail; 764 } 765 766 atexit(quit_timers); 767 #ifdef CONFIG_POSIX 768 pthread_atfork(NULL, NULL, reinit_timers); 769 #endif 770 alarm_timer = t; 771 return 0; 772 773 fail: 774 return err; 775 } 776 777