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 "android/charpipe.h"
26 #include "android/log-rotate.h"
27 #include "android/snaphost-android.h"
28 #include "block/aio.h"
29 #include "exec/hax.h"
30 #include "hw/hw.h"
31 #include "monitor/monitor.h"
32 #include "net/net.h"
33 #include "qemu-common.h"
34 #include "qemu/sockets.h"
35 #include "qemu/timer.h"
36 #include "slirp-android/libslirp.h"
37 #include "sysemu/cpus.h"
38 #include "sysemu/sysemu.h"
39
40 #ifdef __linux__
41 #include <sys/ioctl.h>
42 #endif
43
44 #ifdef _WIN32
45 #include <windows.h>
46 #include <mmsystem.h>
47 #endif
48
49 int qemu_calculate_timeout(void);
50
51 #ifndef CONFIG_ANDROID
52 /* Conversion factor from emulated instructions to virtual clock ticks. */
53 int icount_time_shift;
54 /* Arbitrarily pick 1MIPS as the minimum allowable speed. */
55 #define MAX_ICOUNT_SHIFT 10
56 /* Compensate for varying guest execution speed. */
57 int64_t qemu_icount_bias;
58 static QEMUTimer *icount_rt_timer;
59 static QEMUTimer *icount_vm_timer;
60 #endif // !CONFIG_ANDROID
61
62 #ifndef _WIN32
63 static int io_thread_fd = -1;
64
qemu_event_read(void * opaque)65 static void qemu_event_read(void *opaque)
66 {
67 int fd = (unsigned long)opaque;
68 ssize_t len;
69
70 /* Drain the notify pipe */
71 do {
72 char buffer[512];
73 len = read(fd, buffer, sizeof(buffer));
74 } while ((len == -1 && errno == EINTR) || len > 0);
75 }
76
qemu_main_loop_event_init(void)77 static int qemu_main_loop_event_init(void)
78 {
79 int err;
80 int fds[2];
81
82 err = pipe(fds);
83 if (err == -1)
84 return -errno;
85
86 err = fcntl_setfl(fds[0], O_NONBLOCK);
87 if (err < 0)
88 goto fail;
89
90 err = fcntl_setfl(fds[1], O_NONBLOCK);
91 if (err < 0)
92 goto fail;
93
94 qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL,
95 (void *)(unsigned long)fds[0]);
96
97 io_thread_fd = fds[1];
98 return 0;
99
100 fail:
101 close(fds[0]);
102 close(fds[1]);
103 return err;
104 }
105 #else
106 HANDLE qemu_event_handle;
107
dummy_event_handler(void * opaque)108 static void dummy_event_handler(void *opaque)
109 {
110 }
111
qemu_main_loop_event_init(void)112 static int qemu_main_loop_event_init(void)
113 {
114 qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
115 if (!qemu_event_handle) {
116 perror("Failed CreateEvent");
117 return -1;
118 }
119 qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL);
120 return 0;
121 }
122 #endif
123
qemu_init_main_loop(void)124 int qemu_init_main_loop(void)
125 {
126 return qemu_main_loop_event_init();
127 }
128
129 #ifndef _WIN32
130
os_host_main_loop_wait(int * timeout)131 static inline void os_host_main_loop_wait(int *timeout)
132 {
133 }
134
135 #else // _WIN32
136
137 /***********************************************************/
138 /* Polling handling */
139
140 typedef struct PollingEntry {
141 PollingFunc *func;
142 void *opaque;
143 struct PollingEntry *next;
144 } PollingEntry;
145
146 static PollingEntry *first_polling_entry;
147
qemu_add_polling_cb(PollingFunc * func,void * opaque)148 int qemu_add_polling_cb(PollingFunc *func, void *opaque)
149 {
150 PollingEntry **ppe, *pe;
151 pe = g_malloc0(sizeof(PollingEntry));
152 pe->func = func;
153 pe->opaque = opaque;
154 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
155 *ppe = pe;
156 return 0;
157 }
158
qemu_del_polling_cb(PollingFunc * func,void * opaque)159 void qemu_del_polling_cb(PollingFunc *func, void *opaque)
160 {
161 PollingEntry **ppe, *pe;
162 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
163 pe = *ppe;
164 if (pe->func == func && pe->opaque == opaque) {
165 *ppe = pe->next;
166 g_free(pe);
167 break;
168 }
169 }
170 }
171
172 /***********************************************************/
173 /* Wait objects support */
174 typedef struct WaitObjects {
175 int num;
176 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
177 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
178 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
179 } WaitObjects;
180
181 static WaitObjects wait_objects = {0};
182
qemu_add_wait_object(HANDLE handle,WaitObjectFunc * func,void * opaque)183 int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
184 {
185 WaitObjects *w = &wait_objects;
186
187 if (w->num >= MAXIMUM_WAIT_OBJECTS)
188 return -1;
189 w->events[w->num] = handle;
190 w->func[w->num] = func;
191 w->opaque[w->num] = opaque;
192 w->num++;
193 return 0;
194 }
195
qemu_del_wait_object(HANDLE handle,WaitObjectFunc * func,void * opaque)196 void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
197 {
198 int i, found;
199 WaitObjects *w = &wait_objects;
200
201 found = 0;
202 for (i = 0; i < w->num; i++) {
203 if (w->events[i] == handle)
204 found = 1;
205 if (found) {
206 w->events[i] = w->events[i + 1];
207 w->func[i] = w->func[i + 1];
208 w->opaque[i] = w->opaque[i + 1];
209 }
210 }
211 if (found)
212 w->num--;
213 }
214
os_host_main_loop_wait(int * timeout)215 void os_host_main_loop_wait(int *timeout)
216 {
217 int ret, ret2, i;
218 PollingEntry *pe;
219
220 /* XXX: need to suppress polling by better using win32 events */
221 ret = 0;
222 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
223 ret |= pe->func(pe->opaque);
224 }
225 if (ret == 0) {
226 int err;
227 WaitObjects *w = &wait_objects;
228
229 qemu_mutex_unlock_iothread();
230 ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
231 qemu_mutex_lock_iothread();
232 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
233 if (w->func[ret - WAIT_OBJECT_0])
234 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
235
236 /* Check for additional signaled events */
237 for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
238
239 /* Check if event is signaled */
240 ret2 = WaitForSingleObject(w->events[i], 0);
241 if(ret2 == WAIT_OBJECT_0) {
242 if (w->func[i])
243 w->func[i](w->opaque[i]);
244 } else if (ret2 == WAIT_TIMEOUT) {
245 } else {
246 err = GetLastError();
247 fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
248 }
249 }
250 } else if (ret == WAIT_TIMEOUT) {
251 } else {
252 err = GetLastError();
253 fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
254 }
255 }
256
257 *timeout = 0;
258 }
259
260 #endif // _WIN32
261
262 static void qemu_run_alarm_timer(void); // forward
263
main_loop_wait(int timeout)264 void main_loop_wait(int timeout)
265 {
266 fd_set rfds, wfds, xfds;
267 int ret, nfds;
268 struct timeval tv;
269
270 qemu_bh_update_timeout(&timeout);
271
272 os_host_main_loop_wait(&timeout);
273
274 tv.tv_sec = timeout / 1000;
275 tv.tv_usec = (timeout % 1000) * 1000;
276
277 /* poll any events */
278
279 /* XXX: separate device handlers from system ones */
280 nfds = -1;
281 FD_ZERO(&rfds);
282 FD_ZERO(&wfds);
283 FD_ZERO(&xfds);
284 qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
285 if (slirp_is_inited()) {
286 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
287 }
288
289 qemu_mutex_unlock_iothread();
290 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
291 qemu_mutex_lock_iothread();
292 qemu_iohandler_poll(&rfds, &wfds, &xfds, ret);
293 if (slirp_is_inited()) {
294 if (ret < 0) {
295 FD_ZERO(&rfds);
296 FD_ZERO(&wfds);
297 FD_ZERO(&xfds);
298 }
299 slirp_select_poll(&rfds, &wfds, &xfds);
300 }
301 charpipe_poll();
302
303 qemu_clock_run_all_timers();
304
305 qemu_run_alarm_timer();
306
307 /* Check bottom-halves last in case any of the earlier events triggered
308 them. */
309 qemu_bh_poll();
310
311 }
312
main_loop(void)313 void main_loop(void)
314 {
315 int r;
316
317 #ifdef CONFIG_HAX
318 if (hax_enabled())
319 hax_sync_vcpus();
320 #endif
321
322 for (;;) {
323 do {
324 #ifdef CONFIG_PROFILER
325 int64_t ti;
326 #endif
327 tcg_cpu_exec();
328 #ifdef CONFIG_PROFILER
329 ti = profile_getclock();
330 #endif
331 main_loop_wait(qemu_calculate_timeout());
332 #ifdef CONFIG_PROFILER
333 dev_time += profile_getclock() - ti;
334 #endif
335
336 qemu_log_rotation_poll();
337
338 } while (vm_can_run());
339
340 if (qemu_debug_requested())
341 vm_stop(EXCP_DEBUG);
342 if (qemu_shutdown_requested()) {
343 if (no_shutdown) {
344 vm_stop(0);
345 no_shutdown = 0;
346 } else {
347 if (savevm_on_exit != NULL) {
348 /* Prior to saving VM to the snapshot file, save HW config
349 * settings for that VM, so we can match them when VM gets
350 * loaded from the snapshot. */
351 snaphost_save_config(savevm_on_exit);
352 do_savevm(cur_mon, savevm_on_exit);
353 }
354 break;
355 }
356 }
357 if (qemu_reset_requested()) {
358 pause_all_vcpus();
359 qemu_system_reset();
360 resume_all_vcpus();
361 }
362 if (qemu_powerdown_requested())
363 qemu_system_powerdown();
364 if ((r = qemu_vmstop_requested()))
365 vm_stop(r);
366 }
367 pause_all_vcpus();
368 }
369
370 // TODO(digit): Re-enable icount handling int he future.
configure_icount(const char * opts)371 void configure_icount(const char* opts) {
372 }
373
374 struct qemu_alarm_timer {
375 char const *name;
376 int (*start)(struct qemu_alarm_timer *t);
377 void (*stop)(struct qemu_alarm_timer *t);
378 void (*rearm)(struct qemu_alarm_timer *t);
379 #if defined(__linux__)
380 int fd;
381 timer_t timer;
382 #elif defined(_WIN32)
383 HANDLE timer;
384 #endif
385 char expired;
386 };
387
388 static struct qemu_alarm_timer *alarm_timer;
389
alarm_has_dynticks(struct qemu_alarm_timer * t)390 static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
391 {
392 return t->rearm != NULL;
393 }
394
qemu_rearm_alarm_timer(struct qemu_alarm_timer * t)395 static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
396 {
397 if (t->rearm) {
398 t->rearm(t);
399 }
400 }
401
qemu_run_alarm_timer(void)402 static void qemu_run_alarm_timer(void) {
403 /* rearm timer, if not periodic */
404 if (alarm_timer->expired) {
405 alarm_timer->expired = 0;
406 qemu_rearm_alarm_timer(alarm_timer);
407 }
408 }
409
410 /* TODO: MIN_TIMER_REARM_NS should be optimized */
411 #define MIN_TIMER_REARM_NS 250000
412
413 #ifdef _WIN32
414
415 static int mm_start_timer(struct qemu_alarm_timer *t);
416 static void mm_stop_timer(struct qemu_alarm_timer *t);
417 static void mm_rearm_timer(struct qemu_alarm_timer *t);
418
419 static int win32_start_timer(struct qemu_alarm_timer *t);
420 static void win32_stop_timer(struct qemu_alarm_timer *t);
421 static void win32_rearm_timer(struct qemu_alarm_timer *t);
422
423 #else
424
425 static int unix_start_timer(struct qemu_alarm_timer *t);
426 static void unix_stop_timer(struct qemu_alarm_timer *t);
427
428 #ifdef __linux__
429
430 static int dynticks_start_timer(struct qemu_alarm_timer *t);
431 static void dynticks_stop_timer(struct qemu_alarm_timer *t);
432 static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
433
434 #endif /* __linux__ */
435
436 #endif /* _WIN32 */
437
qemu_icount_round(int64_t count)438 int64_t qemu_icount_round(int64_t count)
439 {
440 return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
441 }
442
443 static struct qemu_alarm_timer alarm_timers[] = {
444 #ifndef _WIN32
445 {"unix", unix_start_timer, unix_stop_timer, NULL},
446 #ifdef __linux__
447 /* on Linux, the 'dynticks' clock sometimes doesn't work
448 * properly. this results in the UI freezing while emulation
449 * continues, for several seconds... So move it to the end
450 * of the list. */
451 {"dynticks", dynticks_start_timer,
452 dynticks_stop_timer, dynticks_rearm_timer},
453 #endif
454 #else
455 {"mmtimer", mm_start_timer, mm_stop_timer, NULL},
456 {"mmtimer2", mm_start_timer, mm_stop_timer, mm_rearm_timer},
457 {"dynticks", win32_start_timer, win32_stop_timer, win32_rearm_timer},
458 {"win32", win32_start_timer, win32_stop_timer, NULL},
459 #endif
460 {NULL, }
461 };
462
show_available_alarms(void)463 static void show_available_alarms(void)
464 {
465 int i;
466
467 printf("Available alarm timers, in order of precedence:\n");
468 for (i = 0; alarm_timers[i].name; i++)
469 printf("%s\n", alarm_timers[i].name);
470 }
471
configure_alarms(char const * opt)472 void configure_alarms(char const *opt)
473 {
474 int i;
475 int cur = 0;
476 int count = ARRAY_SIZE(alarm_timers) - 1;
477 char *arg;
478 char *name;
479 struct qemu_alarm_timer tmp;
480
481 if (!strcmp(opt, "?")) {
482 show_available_alarms();
483 exit(0);
484 }
485
486 arg = g_strdup(opt);
487
488 /* Reorder the array */
489 name = strtok(arg, ",");
490 while (name) {
491 for (i = 0; i < count && alarm_timers[i].name; i++) {
492 if (!strcmp(alarm_timers[i].name, name))
493 break;
494 }
495
496 if (i == count) {
497 fprintf(stderr, "Unknown clock %s\n", name);
498 goto next;
499 }
500
501 if (i < cur)
502 /* Ignore */
503 goto next;
504
505 /* Swap */
506 tmp = alarm_timers[i];
507 alarm_timers[i] = alarm_timers[cur];
508 alarm_timers[cur] = tmp;
509
510 cur++;
511 next:
512 name = strtok(NULL, ",");
513 }
514
515 g_free(arg);
516
517 if (cur) {
518 /* Disable remaining timers */
519 for (i = cur; i < count; i++)
520 alarm_timers[i].name = NULL;
521 } else {
522 show_available_alarms();
523 exit(1);
524 }
525 }
526
527 // This variable is used to notify the qemu_timer_alarm_pending() caller
528 // (really tcg_cpu_exec()) that an alarm has expired. It is set in the
529 // timer callback, which can be a signal handler on non-Windows platforms.
530 static volatile sig_atomic_t timer_alarm_pending = 1;
531
qemu_timer_alarm_pending(void)532 int qemu_timer_alarm_pending(void)
533 {
534 int ret = timer_alarm_pending;
535 timer_alarm_pending = 0;
536 return ret;
537 }
538
539 // Compute the next alarm deadline, return a timeout in nanoseconds.
540 // NOTE: This function cannot be called from a signal handler since
541 // it calls qemu-timer.c functions that acquire/release global mutexes.
qemu_next_alarm_deadline(void)542 static int64_t qemu_next_alarm_deadline(void)
543 {
544 int64_t delta = INT32_MAX;
545 if (!use_icount) {
546 delta = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
547 }
548 int64_t hdelta = qemu_clock_deadline_ns_all(QEMU_CLOCK_HOST);
549 if (hdelta < delta) {
550 delta = hdelta;
551 }
552 int64_t rtdelta = qemu_clock_deadline_ns_all(QEMU_CLOCK_REALTIME);
553 if (rtdelta < delta) {
554 delta = rtdelta;
555 }
556 return delta;
557 }
558
559 #ifdef _WIN32
host_alarm_handler(PVOID lpParam,BOOLEAN unused)560 static void CALLBACK host_alarm_handler(PVOID lpParam, BOOLEAN unused)
561 #else
562 static void host_alarm_handler(int host_signum)
563 #endif
564 {
565 struct qemu_alarm_timer *t = alarm_timer;
566 if (!t)
567 return;
568
569 // It's not possible to call qemu_next_alarm_deadline() to know
570 // if a timer has really expired, in the case of non-dynamic alarms,
571 // so just signal and let the main loop thread do the checks instead.
572 timer_alarm_pending = 1;
573
574 // Ensure a dynamic alarm will be properly rescheduled.
575 if (alarm_has_dynticks(t))
576 t->expired = 1;
577
578 // This forces a cpu_exit() call that will end the current CPU
579 // execution ASAP.
580 qemu_notify_event();
581 }
582
583 #if defined(__linux__)
584
dynticks_start_timer(struct qemu_alarm_timer * t)585 static int dynticks_start_timer(struct qemu_alarm_timer *t)
586 {
587 struct sigevent ev;
588 timer_t host_timer;
589 struct sigaction act;
590
591 sigfillset(&act.sa_mask);
592 act.sa_flags = 0;
593 act.sa_handler = host_alarm_handler;
594
595 sigaction(SIGALRM, &act, NULL);
596
597 /*
598 * Initialize ev struct to 0 to avoid valgrind complaining
599 * about uninitialized data in timer_create call
600 */
601 memset(&ev, 0, sizeof(ev));
602 ev.sigev_value.sival_int = 0;
603 ev.sigev_notify = SIGEV_SIGNAL;
604 ev.sigev_signo = SIGALRM;
605
606 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
607 perror("timer_create");
608
609 /* disable dynticks */
610 fprintf(stderr, "Dynamic Ticks disabled\n");
611
612 return -1;
613 }
614
615 t->timer = host_timer;
616
617 return 0;
618 }
619
dynticks_stop_timer(struct qemu_alarm_timer * t)620 static void dynticks_stop_timer(struct qemu_alarm_timer *t)
621 {
622 timer_t host_timer = t->timer;
623
624 timer_delete(host_timer);
625 }
626
dynticks_rearm_timer(struct qemu_alarm_timer * t)627 static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
628 {
629 timer_t host_timer = t->timer;
630 struct itimerspec timeout;
631 int64_t nearest_delta_ns = INT64_MAX;
632 int64_t current_ns;
633
634 assert(alarm_has_dynticks(t));
635 if (!qemu_clock_has_timers(QEMU_CLOCK_REALTIME) &&
636 !qemu_clock_has_timers(QEMU_CLOCK_VIRTUAL) &&
637 !qemu_clock_has_timers(QEMU_CLOCK_HOST))
638 return;
639
640 nearest_delta_ns = qemu_next_alarm_deadline();
641 if (nearest_delta_ns < MIN_TIMER_REARM_NS)
642 nearest_delta_ns = MIN_TIMER_REARM_NS;
643
644 /* check whether a timer is already running */
645 if (timer_gettime(host_timer, &timeout)) {
646 perror("gettime");
647 fprintf(stderr, "Internal timer error: aborting\n");
648 exit(1);
649 }
650 current_ns = timeout.it_value.tv_sec * 1000000000LL + timeout.it_value.tv_nsec;
651 if (current_ns && current_ns <= nearest_delta_ns)
652 return;
653
654 timeout.it_interval.tv_sec = 0;
655 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
656 timeout.it_value.tv_sec = nearest_delta_ns / 1000000000;
657 timeout.it_value.tv_nsec = nearest_delta_ns % 1000000000;
658 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
659 perror("settime");
660 fprintf(stderr, "Internal timer error: aborting\n");
661 exit(1);
662 }
663 }
664
665 #endif /* defined(__linux__) */
666
667 #if !defined(_WIN32)
668
unix_start_timer(struct qemu_alarm_timer * t)669 static int unix_start_timer(struct qemu_alarm_timer *t)
670 {
671 struct sigaction act;
672 struct itimerval itv;
673 int err;
674
675 /* timer signal */
676 sigfillset(&act.sa_mask);
677 act.sa_flags = 0;
678 act.sa_handler = host_alarm_handler;
679
680 sigaction(SIGALRM, &act, NULL);
681
682 itv.it_interval.tv_sec = 0;
683 /* for i386 kernel 2.6 to get 1 ms */
684 itv.it_interval.tv_usec = 999;
685 itv.it_value.tv_sec = 0;
686 itv.it_value.tv_usec = 10 * 1000;
687
688 err = setitimer(ITIMER_REAL, &itv, NULL);
689 if (err)
690 return -1;
691
692 return 0;
693 }
694
unix_stop_timer(struct qemu_alarm_timer * t)695 static void unix_stop_timer(struct qemu_alarm_timer *t)
696 {
697 struct itimerval itv;
698
699 memset(&itv, 0, sizeof(itv));
700 setitimer(ITIMER_REAL, &itv, NULL);
701 }
702
703 #endif /* !defined(_WIN32) */
704
705
706 #ifdef _WIN32
707
708 static MMRESULT mm_timer;
709 static unsigned mm_period;
710
mm_alarm_handler(UINT uTimerID,UINT uMsg,DWORD_PTR dwUser,DWORD_PTR dw1,DWORD_PTR dw2)711 static void CALLBACK mm_alarm_handler(UINT uTimerID, UINT uMsg,
712 DWORD_PTR dwUser, DWORD_PTR dw1,
713 DWORD_PTR dw2)
714 {
715 struct qemu_alarm_timer *t = alarm_timer;
716 if (!t) {
717 return;
718 }
719 // We can actually call qemu_next_alarm_deadline() here since this
720 // doesn't run in a signal handler, but a different thread.
721 if (alarm_has_dynticks(t) || qemu_next_alarm_deadline() <= 0) {
722 t->expired = 1;
723 timer_alarm_pending = 1;
724 qemu_notify_event();
725 }
726 }
727
mm_start_timer(struct qemu_alarm_timer * t)728 static int mm_start_timer(struct qemu_alarm_timer *t)
729 {
730 TIMECAPS tc;
731 UINT flags;
732
733 memset(&tc, 0, sizeof(tc));
734 timeGetDevCaps(&tc, sizeof(tc));
735
736 mm_period = tc.wPeriodMin;
737 timeBeginPeriod(mm_period);
738
739 flags = TIME_CALLBACK_FUNCTION;
740 if (alarm_has_dynticks(t)) {
741 flags |= TIME_ONESHOT;
742 } else {
743 flags |= TIME_PERIODIC;
744 }
745
746 mm_timer = timeSetEvent(1, /* interval (ms) */
747 mm_period, /* resolution */
748 mm_alarm_handler, /* function */
749 (DWORD_PTR)t, /* parameter */
750 flags);
751
752 if (!mm_timer) {
753 fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
754 GetLastError());
755 timeEndPeriod(mm_period);
756 return -1;
757 }
758
759 return 0;
760 }
761
mm_stop_timer(struct qemu_alarm_timer * t)762 static void mm_stop_timer(struct qemu_alarm_timer *t)
763 {
764 timeKillEvent(mm_timer);
765 timeEndPeriod(mm_period);
766 }
767
mm_rearm_timer(struct qemu_alarm_timer * t)768 static void mm_rearm_timer(struct qemu_alarm_timer *t)
769 {
770 int nearest_delta_ms;
771
772 assert(alarm_has_dynticks(t));
773 if (!qemu_clock_has_timers(QEMU_CLOCK_REALTIME) &&
774 !qemu_clock_has_timers(QEMU_CLOCK_VIRTUAL) &&
775 !qemu_clock_has_timers(QEMU_CLOCK_HOST)) {
776 return;
777 }
778
779 timeKillEvent(mm_timer);
780
781 nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
782 if (nearest_delta_ms < 1) {
783 nearest_delta_ms = 1;
784 }
785 mm_timer = timeSetEvent(nearest_delta_ms,
786 mm_period,
787 mm_alarm_handler,
788 (DWORD_PTR)t,
789 TIME_ONESHOT | TIME_CALLBACK_FUNCTION);
790
791 if (!mm_timer) {
792 fprintf(stderr, "Failed to re-arm win32 alarm timer %ld\n",
793 GetLastError());
794
795 timeEndPeriod(mm_period);
796 exit(1);
797 }
798 }
799
win32_start_timer(struct qemu_alarm_timer * t)800 static int win32_start_timer(struct qemu_alarm_timer *t)
801 {
802 HANDLE hTimer;
803 BOOLEAN success;
804
805 /* If you call ChangeTimerQueueTimer on a one-shot timer (its period
806 is zero) that has already expired, the timer is not updated. Since
807 creating a new timer is relatively expensive, set a bogus one-hour
808 interval in the dynticks case. */
809 success = CreateTimerQueueTimer(&hTimer,
810 NULL,
811 host_alarm_handler,
812 t,
813 1,
814 alarm_has_dynticks(t) ? 3600000 : 1,
815 WT_EXECUTEINTIMERTHREAD);
816
817 if (!success) {
818 fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
819 GetLastError());
820 return -1;
821 }
822
823 t->timer = hTimer;
824 return 0;
825 }
826
win32_stop_timer(struct qemu_alarm_timer * t)827 static void win32_stop_timer(struct qemu_alarm_timer *t)
828 {
829 HANDLE hTimer = t->timer;
830
831 if (hTimer) {
832 DeleteTimerQueueTimer(NULL, hTimer, NULL);
833 }
834 }
835
win32_rearm_timer(struct qemu_alarm_timer * t)836 static void win32_rearm_timer(struct qemu_alarm_timer *t)
837 {
838 HANDLE hTimer = t->timer;
839 int nearest_delta_ms;
840 BOOLEAN success;
841
842 assert(alarm_has_dynticks(t));
843 if (!qemu_clock_has_timers(QEMU_CLOCK_REALTIME) &&
844 !qemu_clock_has_timers(QEMU_CLOCK_VIRTUAL) &&
845 !qemu_clock_has_timers(QEMU_CLOCK_HOST)) {
846 return;
847 }
848 nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
849 if (nearest_delta_ms < 1) {
850 nearest_delta_ms = 1;
851 }
852 success = ChangeTimerQueueTimer(NULL,
853 hTimer,
854 nearest_delta_ms,
855 3600000);
856
857 if (!success) {
858 fprintf(stderr, "Failed to rearm win32 alarm timer: %ld\n",
859 GetLastError());
860 exit(-1);
861 }
862 }
863
864 #endif /* _WIN32 */
865
alarm_timer_on_change_state_rearm(void * opaque,int running,int reason)866 static void alarm_timer_on_change_state_rearm(void *opaque,
867 int running,
868 int reason)
869 {
870 if (running)
871 qemu_rearm_alarm_timer((struct qemu_alarm_timer *) opaque);
872 }
873
init_timer_alarm(void)874 int init_timer_alarm(void)
875 {
876 struct qemu_alarm_timer *t = NULL;
877 int i, err = -1;
878
879 for (i = 0; alarm_timers[i].name; i++) {
880 t = &alarm_timers[i];
881
882 err = t->start(t);
883 if (!err)
884 break;
885 }
886
887 if (err) {
888 err = -ENOENT;
889 goto fail;
890 }
891
892 /* first event is at time 0 */
893 alarm_timer = t;
894 timer_alarm_pending = 1;
895 qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
896
897 return 0;
898
899 fail:
900 return err;
901 }
902
quit_timers(void)903 void quit_timers(void)
904 {
905 struct qemu_alarm_timer *t = alarm_timer;
906 alarm_timer = NULL;
907 t->stop(t);
908 }
909
qemu_calculate_timeout(void)910 int qemu_calculate_timeout(void)
911 {
912 int timeout;
913
914 if (!vm_running)
915 timeout = 5000;
916 else if (tcg_has_work())
917 timeout = 0;
918 else {
919 #ifdef WIN32
920 /* This corresponds to the case where the emulated system is
921 * totally idle and waiting for i/o. The problem is that on
922 * Windows, the default value will prevent Windows user events
923 * to be delivered in less than 5 seconds.
924 *
925 * Upstream contains a different way to handle this, for now
926 * this hack should be sufficient until we integrate it into
927 * our tree.
928 */
929 timeout = 1000/15; /* deliver user events every 15/th of second */
930 #else
931 timeout = 5000;
932 #endif
933 int64_t timeout_ns = (int64_t)timeout * 1000000LL;
934 timeout_ns = qemu_soonest_timeout(
935 timeout_ns, timerlistgroup_deadline_ns(&main_loop_tlg));
936 timeout = (int)((timeout_ns + 999999LL) / 1000000LL);
937 }
938
939 return timeout;
940 }
941