Statistics
| Branch: | Revision:

root / qemu-timer.c @ d25f89c9

History | View | Annotate | Download (32 kB)

1 db1a4972 Paolo Bonzini
/*
2 db1a4972 Paolo Bonzini
 * QEMU System Emulator
3 db1a4972 Paolo Bonzini
 *
4 db1a4972 Paolo Bonzini
 * Copyright (c) 2003-2008 Fabrice Bellard
5 db1a4972 Paolo Bonzini
 *
6 db1a4972 Paolo Bonzini
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 db1a4972 Paolo Bonzini
 * of this software and associated documentation files (the "Software"), to deal
8 db1a4972 Paolo Bonzini
 * in the Software without restriction, including without limitation the rights
9 db1a4972 Paolo Bonzini
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 db1a4972 Paolo Bonzini
 * copies of the Software, and to permit persons to whom the Software is
11 db1a4972 Paolo Bonzini
 * furnished to do so, subject to the following conditions:
12 db1a4972 Paolo Bonzini
 *
13 db1a4972 Paolo Bonzini
 * The above copyright notice and this permission notice shall be included in
14 db1a4972 Paolo Bonzini
 * all copies or substantial portions of the Software.
15 db1a4972 Paolo Bonzini
 *
16 db1a4972 Paolo Bonzini
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 db1a4972 Paolo Bonzini
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 db1a4972 Paolo Bonzini
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 db1a4972 Paolo Bonzini
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 db1a4972 Paolo Bonzini
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 db1a4972 Paolo Bonzini
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 db1a4972 Paolo Bonzini
 * THE SOFTWARE.
23 db1a4972 Paolo Bonzini
 */
24 db1a4972 Paolo Bonzini
25 db1a4972 Paolo Bonzini
#include "sysemu.h"
26 db1a4972 Paolo Bonzini
#include "net.h"
27 db1a4972 Paolo Bonzini
#include "monitor.h"
28 db1a4972 Paolo Bonzini
#include "console.h"
29 db1a4972 Paolo Bonzini
30 db1a4972 Paolo Bonzini
#include "hw/hw.h"
31 db1a4972 Paolo Bonzini
32 db1a4972 Paolo Bonzini
#include <unistd.h>
33 db1a4972 Paolo Bonzini
#include <fcntl.h>
34 db1a4972 Paolo Bonzini
#include <time.h>
35 db1a4972 Paolo Bonzini
#include <errno.h>
36 db1a4972 Paolo Bonzini
#include <sys/time.h>
37 db1a4972 Paolo Bonzini
#include <signal.h>
38 44459349 Juergen Lock
#ifdef __FreeBSD__
39 44459349 Juergen Lock
#include <sys/param.h>
40 44459349 Juergen Lock
#endif
41 db1a4972 Paolo Bonzini
42 db1a4972 Paolo Bonzini
#ifdef _WIN32
43 db1a4972 Paolo Bonzini
#include <windows.h>
44 db1a4972 Paolo Bonzini
#include <mmsystem.h>
45 db1a4972 Paolo Bonzini
#endif
46 db1a4972 Paolo Bonzini
47 db1a4972 Paolo Bonzini
#include "qemu-timer.h"
48 db1a4972 Paolo Bonzini
49 db1a4972 Paolo Bonzini
/* Conversion factor from emulated instructions to virtual clock ticks.  */
50 29e922b6 Blue Swirl
int icount_time_shift;
51 db1a4972 Paolo Bonzini
/* Arbitrarily pick 1MIPS as the minimum allowable speed.  */
52 db1a4972 Paolo Bonzini
#define MAX_ICOUNT_SHIFT 10
53 db1a4972 Paolo Bonzini
/* Compensate for varying guest execution speed.  */
54 29e922b6 Blue Swirl
int64_t qemu_icount_bias;
55 db1a4972 Paolo Bonzini
static QEMUTimer *icount_rt_timer;
56 db1a4972 Paolo Bonzini
static QEMUTimer *icount_vm_timer;
57 db1a4972 Paolo Bonzini
58 db1a4972 Paolo Bonzini
/***********************************************************/
59 db1a4972 Paolo Bonzini
/* guest cycle counter */
60 db1a4972 Paolo Bonzini
61 db1a4972 Paolo Bonzini
typedef struct TimersState {
62 db1a4972 Paolo Bonzini
    int64_t cpu_ticks_prev;
63 db1a4972 Paolo Bonzini
    int64_t cpu_ticks_offset;
64 db1a4972 Paolo Bonzini
    int64_t cpu_clock_offset;
65 db1a4972 Paolo Bonzini
    int32_t cpu_ticks_enabled;
66 db1a4972 Paolo Bonzini
    int64_t dummy;
67 db1a4972 Paolo Bonzini
} TimersState;
68 db1a4972 Paolo Bonzini
69 db1a4972 Paolo Bonzini
TimersState timers_state;
70 db1a4972 Paolo Bonzini
71 db1a4972 Paolo Bonzini
/* return the host CPU cycle counter and handle stop/restart */
72 db1a4972 Paolo Bonzini
int64_t cpu_get_ticks(void)
73 db1a4972 Paolo Bonzini
{
74 db1a4972 Paolo Bonzini
    if (use_icount) {
75 db1a4972 Paolo Bonzini
        return cpu_get_icount();
76 db1a4972 Paolo Bonzini
    }
77 db1a4972 Paolo Bonzini
    if (!timers_state.cpu_ticks_enabled) {
78 db1a4972 Paolo Bonzini
        return timers_state.cpu_ticks_offset;
79 db1a4972 Paolo Bonzini
    } else {
80 db1a4972 Paolo Bonzini
        int64_t ticks;
81 db1a4972 Paolo Bonzini
        ticks = cpu_get_real_ticks();
82 db1a4972 Paolo Bonzini
        if (timers_state.cpu_ticks_prev > ticks) {
83 db1a4972 Paolo Bonzini
            /* Note: non increasing ticks may happen if the host uses
84 db1a4972 Paolo Bonzini
               software suspend */
85 db1a4972 Paolo Bonzini
            timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
86 db1a4972 Paolo Bonzini
        }
87 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_prev = ticks;
88 db1a4972 Paolo Bonzini
        return ticks + timers_state.cpu_ticks_offset;
89 db1a4972 Paolo Bonzini
    }
90 db1a4972 Paolo Bonzini
}
91 db1a4972 Paolo Bonzini
92 db1a4972 Paolo Bonzini
/* return the host CPU monotonic timer and handle stop/restart */
93 db1a4972 Paolo Bonzini
static int64_t cpu_get_clock(void)
94 db1a4972 Paolo Bonzini
{
95 db1a4972 Paolo Bonzini
    int64_t ti;
96 db1a4972 Paolo Bonzini
    if (!timers_state.cpu_ticks_enabled) {
97 db1a4972 Paolo Bonzini
        return timers_state.cpu_clock_offset;
98 db1a4972 Paolo Bonzini
    } else {
99 db1a4972 Paolo Bonzini
        ti = get_clock();
100 db1a4972 Paolo Bonzini
        return ti + timers_state.cpu_clock_offset;
101 db1a4972 Paolo Bonzini
    }
102 db1a4972 Paolo Bonzini
}
103 db1a4972 Paolo Bonzini
104 1ece93a9 Paolo Bonzini
#ifndef CONFIG_IOTHREAD
105 db1a4972 Paolo Bonzini
static int64_t qemu_icount_delta(void)
106 db1a4972 Paolo Bonzini
{
107 1ece93a9 Paolo Bonzini
    if (!use_icount) {
108 1ece93a9 Paolo Bonzini
        return 5000 * (int64_t) 1000000;
109 1ece93a9 Paolo Bonzini
    } else if (use_icount == 1) {
110 db1a4972 Paolo Bonzini
        /* When not using an adaptive execution frequency
111 db1a4972 Paolo Bonzini
           we tend to get badly out of sync with real time,
112 db1a4972 Paolo Bonzini
           so just delay for a reasonable amount of time.  */
113 db1a4972 Paolo Bonzini
        return 0;
114 db1a4972 Paolo Bonzini
    } else {
115 db1a4972 Paolo Bonzini
        return cpu_get_icount() - cpu_get_clock();
116 db1a4972 Paolo Bonzini
    }
117 db1a4972 Paolo Bonzini
}
118 1ece93a9 Paolo Bonzini
#endif
119 db1a4972 Paolo Bonzini
120 db1a4972 Paolo Bonzini
/* enable cpu_get_ticks() */
121 db1a4972 Paolo Bonzini
void cpu_enable_ticks(void)
122 db1a4972 Paolo Bonzini
{
123 db1a4972 Paolo Bonzini
    if (!timers_state.cpu_ticks_enabled) {
124 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_offset -= cpu_get_real_ticks();
125 db1a4972 Paolo Bonzini
        timers_state.cpu_clock_offset -= get_clock();
126 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_enabled = 1;
127 db1a4972 Paolo Bonzini
    }
128 db1a4972 Paolo Bonzini
}
129 db1a4972 Paolo Bonzini
130 db1a4972 Paolo Bonzini
/* disable cpu_get_ticks() : the clock is stopped. You must not call
131 db1a4972 Paolo Bonzini
   cpu_get_ticks() after that.  */
132 db1a4972 Paolo Bonzini
void cpu_disable_ticks(void)
133 db1a4972 Paolo Bonzini
{
134 db1a4972 Paolo Bonzini
    if (timers_state.cpu_ticks_enabled) {
135 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_offset = cpu_get_ticks();
136 db1a4972 Paolo Bonzini
        timers_state.cpu_clock_offset = cpu_get_clock();
137 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_enabled = 0;
138 db1a4972 Paolo Bonzini
    }
139 db1a4972 Paolo Bonzini
}
140 db1a4972 Paolo Bonzini
141 db1a4972 Paolo Bonzini
/***********************************************************/
142 db1a4972 Paolo Bonzini
/* timers */
143 db1a4972 Paolo Bonzini
144 db1a4972 Paolo Bonzini
#define QEMU_CLOCK_REALTIME 0
145 db1a4972 Paolo Bonzini
#define QEMU_CLOCK_VIRTUAL  1
146 db1a4972 Paolo Bonzini
#define QEMU_CLOCK_HOST     2
147 db1a4972 Paolo Bonzini
148 db1a4972 Paolo Bonzini
struct QEMUClock {
149 db1a4972 Paolo Bonzini
    int type;
150 db1a4972 Paolo Bonzini
    int enabled;
151 ab33fcda Paolo Bonzini
152 ab33fcda Paolo Bonzini
    QEMUTimer *warp_timer;
153 691a0c9c Jan Kiszka
154 691a0c9c Jan Kiszka
    NotifierList reset_notifiers;
155 691a0c9c Jan Kiszka
    int64_t last;
156 db1a4972 Paolo Bonzini
};
157 db1a4972 Paolo Bonzini
158 db1a4972 Paolo Bonzini
struct QEMUTimer {
159 db1a4972 Paolo Bonzini
    QEMUClock *clock;
160 4a998740 Paolo Bonzini
    int64_t expire_time;        /* in nanoseconds */
161 4a998740 Paolo Bonzini
    int scale;
162 db1a4972 Paolo Bonzini
    QEMUTimerCB *cb;
163 db1a4972 Paolo Bonzini
    void *opaque;
164 db1a4972 Paolo Bonzini
    struct QEMUTimer *next;
165 db1a4972 Paolo Bonzini
};
166 db1a4972 Paolo Bonzini
167 db1a4972 Paolo Bonzini
struct qemu_alarm_timer {
168 db1a4972 Paolo Bonzini
    char const *name;
169 db1a4972 Paolo Bonzini
    int (*start)(struct qemu_alarm_timer *t);
170 db1a4972 Paolo Bonzini
    void (*stop)(struct qemu_alarm_timer *t);
171 db1a4972 Paolo Bonzini
    void (*rearm)(struct qemu_alarm_timer *t);
172 cd0544ee Stefan Weil
#if defined(__linux__)
173 cd0544ee Stefan Weil
    int fd;
174 cd0544ee Stefan Weil
    timer_t timer;
175 cd0544ee Stefan Weil
#elif defined(_WIN32)
176 cd0544ee Stefan Weil
    HANDLE timer;
177 cd0544ee Stefan Weil
#endif
178 db1a4972 Paolo Bonzini
    char expired;
179 db1a4972 Paolo Bonzini
    char pending;
180 db1a4972 Paolo Bonzini
};
181 db1a4972 Paolo Bonzini
182 db1a4972 Paolo Bonzini
static struct qemu_alarm_timer *alarm_timer;
183 db1a4972 Paolo Bonzini
184 45c7b37f Stefan Weil
static bool qemu_timer_expired_ns(QEMUTimer *timer_head, int64_t current_time)
185 45c7b37f Stefan Weil
{
186 45c7b37f Stefan Weil
    return timer_head && (timer_head->expire_time <= current_time);
187 45c7b37f Stefan Weil
}
188 45c7b37f Stefan Weil
189 db1a4972 Paolo Bonzini
int qemu_alarm_pending(void)
190 db1a4972 Paolo Bonzini
{
191 db1a4972 Paolo Bonzini
    return alarm_timer->pending;
192 db1a4972 Paolo Bonzini
}
193 db1a4972 Paolo Bonzini
194 db1a4972 Paolo Bonzini
static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
195 db1a4972 Paolo Bonzini
{
196 db1a4972 Paolo Bonzini
    return !!t->rearm;
197 db1a4972 Paolo Bonzini
}
198 db1a4972 Paolo Bonzini
199 db1a4972 Paolo Bonzini
static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
200 db1a4972 Paolo Bonzini
{
201 db1a4972 Paolo Bonzini
    if (!alarm_has_dynticks(t))
202 db1a4972 Paolo Bonzini
        return;
203 db1a4972 Paolo Bonzini
204 db1a4972 Paolo Bonzini
    t->rearm(t);
205 db1a4972 Paolo Bonzini
}
206 db1a4972 Paolo Bonzini
207 9c13246a Paolo Bonzini
/* TODO: MIN_TIMER_REARM_NS should be optimized */
208 9c13246a Paolo Bonzini
#define MIN_TIMER_REARM_NS 250000
209 db1a4972 Paolo Bonzini
210 db1a4972 Paolo Bonzini
#ifdef _WIN32
211 db1a4972 Paolo Bonzini
212 2f9cba0c Stefan Weil
static int mm_start_timer(struct qemu_alarm_timer *t);
213 2f9cba0c Stefan Weil
static void mm_stop_timer(struct qemu_alarm_timer *t);
214 2f9cba0c Stefan Weil
static void mm_rearm_timer(struct qemu_alarm_timer *t);
215 2f9cba0c Stefan Weil
216 db1a4972 Paolo Bonzini
static int win32_start_timer(struct qemu_alarm_timer *t);
217 db1a4972 Paolo Bonzini
static void win32_stop_timer(struct qemu_alarm_timer *t);
218 db1a4972 Paolo Bonzini
static void win32_rearm_timer(struct qemu_alarm_timer *t);
219 db1a4972 Paolo Bonzini
220 db1a4972 Paolo Bonzini
#else
221 db1a4972 Paolo Bonzini
222 db1a4972 Paolo Bonzini
static int unix_start_timer(struct qemu_alarm_timer *t);
223 db1a4972 Paolo Bonzini
static void unix_stop_timer(struct qemu_alarm_timer *t);
224 84682834 Paolo Bonzini
static void unix_rearm_timer(struct qemu_alarm_timer *t);
225 db1a4972 Paolo Bonzini
226 db1a4972 Paolo Bonzini
#ifdef __linux__
227 db1a4972 Paolo Bonzini
228 db1a4972 Paolo Bonzini
static int dynticks_start_timer(struct qemu_alarm_timer *t);
229 db1a4972 Paolo Bonzini
static void dynticks_stop_timer(struct qemu_alarm_timer *t);
230 db1a4972 Paolo Bonzini
static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
231 db1a4972 Paolo Bonzini
232 db1a4972 Paolo Bonzini
#endif /* __linux__ */
233 db1a4972 Paolo Bonzini
234 db1a4972 Paolo Bonzini
#endif /* _WIN32 */
235 db1a4972 Paolo Bonzini
236 db1a4972 Paolo Bonzini
/* Correlation between real and virtual time is always going to be
237 db1a4972 Paolo Bonzini
   fairly approximate, so ignore small variation.
238 db1a4972 Paolo Bonzini
   When the guest is idle real and virtual time will be aligned in
239 db1a4972 Paolo Bonzini
   the IO wait loop.  */
240 db1a4972 Paolo Bonzini
#define ICOUNT_WOBBLE (get_ticks_per_sec() / 10)
241 db1a4972 Paolo Bonzini
242 db1a4972 Paolo Bonzini
static void icount_adjust(void)
243 db1a4972 Paolo Bonzini
{
244 db1a4972 Paolo Bonzini
    int64_t cur_time;
245 db1a4972 Paolo Bonzini
    int64_t cur_icount;
246 db1a4972 Paolo Bonzini
    int64_t delta;
247 db1a4972 Paolo Bonzini
    static int64_t last_delta;
248 db1a4972 Paolo Bonzini
    /* If the VM is not running, then do nothing.  */
249 db1a4972 Paolo Bonzini
    if (!vm_running)
250 db1a4972 Paolo Bonzini
        return;
251 db1a4972 Paolo Bonzini
252 db1a4972 Paolo Bonzini
    cur_time = cpu_get_clock();
253 74475455 Paolo Bonzini
    cur_icount = qemu_get_clock_ns(vm_clock);
254 db1a4972 Paolo Bonzini
    delta = cur_icount - cur_time;
255 db1a4972 Paolo Bonzini
    /* FIXME: This is a very crude algorithm, somewhat prone to oscillation.  */
256 db1a4972 Paolo Bonzini
    if (delta > 0
257 db1a4972 Paolo Bonzini
        && last_delta + ICOUNT_WOBBLE < delta * 2
258 db1a4972 Paolo Bonzini
        && icount_time_shift > 0) {
259 db1a4972 Paolo Bonzini
        /* The guest is getting too far ahead.  Slow time down.  */
260 db1a4972 Paolo Bonzini
        icount_time_shift--;
261 db1a4972 Paolo Bonzini
    }
262 db1a4972 Paolo Bonzini
    if (delta < 0
263 db1a4972 Paolo Bonzini
        && last_delta - ICOUNT_WOBBLE > delta * 2
264 db1a4972 Paolo Bonzini
        && icount_time_shift < MAX_ICOUNT_SHIFT) {
265 db1a4972 Paolo Bonzini
        /* The guest is getting too far behind.  Speed time up.  */
266 db1a4972 Paolo Bonzini
        icount_time_shift++;
267 db1a4972 Paolo Bonzini
    }
268 db1a4972 Paolo Bonzini
    last_delta = delta;
269 db1a4972 Paolo Bonzini
    qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
270 db1a4972 Paolo Bonzini
}
271 db1a4972 Paolo Bonzini
272 db1a4972 Paolo Bonzini
static void icount_adjust_rt(void * opaque)
273 db1a4972 Paolo Bonzini
{
274 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_rt_timer,
275 7bd427d8 Paolo Bonzini
                   qemu_get_clock_ms(rt_clock) + 1000);
276 db1a4972 Paolo Bonzini
    icount_adjust();
277 db1a4972 Paolo Bonzini
}
278 db1a4972 Paolo Bonzini
279 db1a4972 Paolo Bonzini
static void icount_adjust_vm(void * opaque)
280 db1a4972 Paolo Bonzini
{
281 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_vm_timer,
282 74475455 Paolo Bonzini
                   qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 10);
283 db1a4972 Paolo Bonzini
    icount_adjust();
284 db1a4972 Paolo Bonzini
}
285 db1a4972 Paolo Bonzini
286 db1a4972 Paolo Bonzini
int64_t qemu_icount_round(int64_t count)
287 db1a4972 Paolo Bonzini
{
288 db1a4972 Paolo Bonzini
    return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
289 db1a4972 Paolo Bonzini
}
290 db1a4972 Paolo Bonzini
291 db1a4972 Paolo Bonzini
static struct qemu_alarm_timer alarm_timers[] = {
292 db1a4972 Paolo Bonzini
#ifndef _WIN32
293 db1a4972 Paolo Bonzini
#ifdef __linux__
294 db1a4972 Paolo Bonzini
    {"dynticks", dynticks_start_timer,
295 cd0544ee Stefan Weil
     dynticks_stop_timer, dynticks_rearm_timer},
296 db1a4972 Paolo Bonzini
#endif
297 84682834 Paolo Bonzini
    {"unix", unix_start_timer, unix_stop_timer, unix_rearm_timer},
298 db1a4972 Paolo Bonzini
#else
299 2f9cba0c Stefan Weil
    {"mmtimer", mm_start_timer, mm_stop_timer, NULL},
300 2f9cba0c Stefan Weil
    {"mmtimer2", mm_start_timer, mm_stop_timer, mm_rearm_timer},
301 cd0544ee Stefan Weil
    {"dynticks", win32_start_timer, win32_stop_timer, win32_rearm_timer},
302 cd0544ee Stefan Weil
    {"win32", win32_start_timer, win32_stop_timer, NULL},
303 db1a4972 Paolo Bonzini
#endif
304 db1a4972 Paolo Bonzini
    {NULL, }
305 db1a4972 Paolo Bonzini
};
306 db1a4972 Paolo Bonzini
307 db1a4972 Paolo Bonzini
static void show_available_alarms(void)
308 db1a4972 Paolo Bonzini
{
309 db1a4972 Paolo Bonzini
    int i;
310 db1a4972 Paolo Bonzini
311 db1a4972 Paolo Bonzini
    printf("Available alarm timers, in order of precedence:\n");
312 db1a4972 Paolo Bonzini
    for (i = 0; alarm_timers[i].name; i++)
313 db1a4972 Paolo Bonzini
        printf("%s\n", alarm_timers[i].name);
314 db1a4972 Paolo Bonzini
}
315 db1a4972 Paolo Bonzini
316 db1a4972 Paolo Bonzini
void configure_alarms(char const *opt)
317 db1a4972 Paolo Bonzini
{
318 db1a4972 Paolo Bonzini
    int i;
319 db1a4972 Paolo Bonzini
    int cur = 0;
320 db1a4972 Paolo Bonzini
    int count = ARRAY_SIZE(alarm_timers) - 1;
321 db1a4972 Paolo Bonzini
    char *arg;
322 db1a4972 Paolo Bonzini
    char *name;
323 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer tmp;
324 db1a4972 Paolo Bonzini
325 db1a4972 Paolo Bonzini
    if (!strcmp(opt, "?")) {
326 db1a4972 Paolo Bonzini
        show_available_alarms();
327 db1a4972 Paolo Bonzini
        exit(0);
328 db1a4972 Paolo Bonzini
    }
329 db1a4972 Paolo Bonzini
330 db1a4972 Paolo Bonzini
    arg = qemu_strdup(opt);
331 db1a4972 Paolo Bonzini
332 db1a4972 Paolo Bonzini
    /* Reorder the array */
333 db1a4972 Paolo Bonzini
    name = strtok(arg, ",");
334 db1a4972 Paolo Bonzini
    while (name) {
335 db1a4972 Paolo Bonzini
        for (i = 0; i < count && alarm_timers[i].name; i++) {
336 db1a4972 Paolo Bonzini
            if (!strcmp(alarm_timers[i].name, name))
337 db1a4972 Paolo Bonzini
                break;
338 db1a4972 Paolo Bonzini
        }
339 db1a4972 Paolo Bonzini
340 db1a4972 Paolo Bonzini
        if (i == count) {
341 db1a4972 Paolo Bonzini
            fprintf(stderr, "Unknown clock %s\n", name);
342 db1a4972 Paolo Bonzini
            goto next;
343 db1a4972 Paolo Bonzini
        }
344 db1a4972 Paolo Bonzini
345 db1a4972 Paolo Bonzini
        if (i < cur)
346 db1a4972 Paolo Bonzini
            /* Ignore */
347 db1a4972 Paolo Bonzini
            goto next;
348 db1a4972 Paolo Bonzini
349 db1a4972 Paolo Bonzini
        /* Swap */
350 db1a4972 Paolo Bonzini
        tmp = alarm_timers[i];
351 db1a4972 Paolo Bonzini
        alarm_timers[i] = alarm_timers[cur];
352 db1a4972 Paolo Bonzini
        alarm_timers[cur] = tmp;
353 db1a4972 Paolo Bonzini
354 db1a4972 Paolo Bonzini
        cur++;
355 db1a4972 Paolo Bonzini
next:
356 db1a4972 Paolo Bonzini
        name = strtok(NULL, ",");
357 db1a4972 Paolo Bonzini
    }
358 db1a4972 Paolo Bonzini
359 db1a4972 Paolo Bonzini
    qemu_free(arg);
360 db1a4972 Paolo Bonzini
361 db1a4972 Paolo Bonzini
    if (cur) {
362 db1a4972 Paolo Bonzini
        /* Disable remaining timers */
363 db1a4972 Paolo Bonzini
        for (i = cur; i < count; i++)
364 db1a4972 Paolo Bonzini
            alarm_timers[i].name = NULL;
365 db1a4972 Paolo Bonzini
    } else {
366 db1a4972 Paolo Bonzini
        show_available_alarms();
367 db1a4972 Paolo Bonzini
        exit(1);
368 db1a4972 Paolo Bonzini
    }
369 db1a4972 Paolo Bonzini
}
370 db1a4972 Paolo Bonzini
371 db1a4972 Paolo Bonzini
#define QEMU_NUM_CLOCKS 3
372 db1a4972 Paolo Bonzini
373 db1a4972 Paolo Bonzini
QEMUClock *rt_clock;
374 db1a4972 Paolo Bonzini
QEMUClock *vm_clock;
375 db1a4972 Paolo Bonzini
QEMUClock *host_clock;
376 db1a4972 Paolo Bonzini
377 db1a4972 Paolo Bonzini
static QEMUTimer *active_timers[QEMU_NUM_CLOCKS];
378 db1a4972 Paolo Bonzini
379 db1a4972 Paolo Bonzini
static QEMUClock *qemu_new_clock(int type)
380 db1a4972 Paolo Bonzini
{
381 db1a4972 Paolo Bonzini
    QEMUClock *clock;
382 691a0c9c Jan Kiszka
383 db1a4972 Paolo Bonzini
    clock = qemu_mallocz(sizeof(QEMUClock));
384 db1a4972 Paolo Bonzini
    clock->type = type;
385 db1a4972 Paolo Bonzini
    clock->enabled = 1;
386 691a0c9c Jan Kiszka
    notifier_list_init(&clock->reset_notifiers);
387 691a0c9c Jan Kiszka
    /* required to detect & report backward jumps */
388 691a0c9c Jan Kiszka
    if (type == QEMU_CLOCK_HOST) {
389 691a0c9c Jan Kiszka
        clock->last = get_clock_realtime();
390 691a0c9c Jan Kiszka
    }
391 db1a4972 Paolo Bonzini
    return clock;
392 db1a4972 Paolo Bonzini
}
393 db1a4972 Paolo Bonzini
394 db1a4972 Paolo Bonzini
void qemu_clock_enable(QEMUClock *clock, int enabled)
395 db1a4972 Paolo Bonzini
{
396 db1a4972 Paolo Bonzini
    clock->enabled = enabled;
397 db1a4972 Paolo Bonzini
}
398 db1a4972 Paolo Bonzini
399 ab33fcda Paolo Bonzini
static int64_t vm_clock_warp_start;
400 ab33fcda Paolo Bonzini
401 ab33fcda Paolo Bonzini
static void icount_warp_rt(void *opaque)
402 ab33fcda Paolo Bonzini
{
403 ab33fcda Paolo Bonzini
    if (vm_clock_warp_start == -1) {
404 ab33fcda Paolo Bonzini
        return;
405 ab33fcda Paolo Bonzini
    }
406 ab33fcda Paolo Bonzini
407 ab33fcda Paolo Bonzini
    if (vm_running) {
408 ab33fcda Paolo Bonzini
        int64_t clock = qemu_get_clock_ns(rt_clock);
409 ab33fcda Paolo Bonzini
        int64_t warp_delta = clock - vm_clock_warp_start;
410 ab33fcda Paolo Bonzini
        if (use_icount == 1) {
411 ab33fcda Paolo Bonzini
            qemu_icount_bias += warp_delta;
412 ab33fcda Paolo Bonzini
        } else {
413 ab33fcda Paolo Bonzini
            /*
414 ab33fcda Paolo Bonzini
             * In adaptive mode, do not let the vm_clock run too
415 ab33fcda Paolo Bonzini
             * far ahead of real time.
416 ab33fcda Paolo Bonzini
             */
417 ab33fcda Paolo Bonzini
            int64_t cur_time = cpu_get_clock();
418 ab33fcda Paolo Bonzini
            int64_t cur_icount = qemu_get_clock_ns(vm_clock);
419 ab33fcda Paolo Bonzini
            int64_t delta = cur_time - cur_icount;
420 ab33fcda Paolo Bonzini
            qemu_icount_bias += MIN(warp_delta, delta);
421 ab33fcda Paolo Bonzini
        }
422 ab33fcda Paolo Bonzini
        if (qemu_timer_expired(active_timers[QEMU_CLOCK_VIRTUAL],
423 ab33fcda Paolo Bonzini
                               qemu_get_clock_ns(vm_clock))) {
424 ab33fcda Paolo Bonzini
            qemu_notify_event();
425 ab33fcda Paolo Bonzini
        }
426 ab33fcda Paolo Bonzini
    }
427 ab33fcda Paolo Bonzini
    vm_clock_warp_start = -1;
428 ab33fcda Paolo Bonzini
}
429 ab33fcda Paolo Bonzini
430 ab33fcda Paolo Bonzini
void qemu_clock_warp(QEMUClock *clock)
431 ab33fcda Paolo Bonzini
{
432 ab33fcda Paolo Bonzini
    int64_t deadline;
433 ab33fcda Paolo Bonzini
434 ab33fcda Paolo Bonzini
    if (!clock->warp_timer) {
435 ab33fcda Paolo Bonzini
        return;
436 ab33fcda Paolo Bonzini
    }
437 ab33fcda Paolo Bonzini
438 ab33fcda Paolo Bonzini
    /*
439 ab33fcda Paolo Bonzini
     * There are too many global variables to make the "warp" behavior
440 ab33fcda Paolo Bonzini
     * applicable to other clocks.  But a clock argument removes the
441 ab33fcda Paolo Bonzini
     * need for if statements all over the place.
442 ab33fcda Paolo Bonzini
     */
443 ab33fcda Paolo Bonzini
    assert(clock == vm_clock);
444 ab33fcda Paolo Bonzini
445 ab33fcda Paolo Bonzini
    /*
446 ab33fcda Paolo Bonzini
     * If the CPUs have been sleeping, advance the vm_clock timer now.  This
447 ab33fcda Paolo Bonzini
     * ensures that the deadline for the timer is computed correctly below.
448 ab33fcda Paolo Bonzini
     * This also makes sure that the insn counter is synchronized before the
449 ab33fcda Paolo Bonzini
     * CPU starts running, in case the CPU is woken by an event other than
450 ab33fcda Paolo Bonzini
     * the earliest vm_clock timer.
451 ab33fcda Paolo Bonzini
     */
452 ab33fcda Paolo Bonzini
    icount_warp_rt(NULL);
453 ab33fcda Paolo Bonzini
    if (!all_cpu_threads_idle() || !active_timers[clock->type]) {
454 ab33fcda Paolo Bonzini
        qemu_del_timer(clock->warp_timer);
455 ab33fcda Paolo Bonzini
        return;
456 ab33fcda Paolo Bonzini
    }
457 ab33fcda Paolo Bonzini
458 ab33fcda Paolo Bonzini
    vm_clock_warp_start = qemu_get_clock_ns(rt_clock);
459 cb842c90 Paolo Bonzini
    deadline = qemu_next_icount_deadline();
460 ab33fcda Paolo Bonzini
    if (deadline > 0) {
461 ab33fcda Paolo Bonzini
        /*
462 ab33fcda Paolo Bonzini
         * Ensure the vm_clock proceeds even when the virtual CPU goes to
463 ab33fcda Paolo Bonzini
         * sleep.  Otherwise, the CPU might be waiting for a future timer
464 ab33fcda Paolo Bonzini
         * interrupt to wake it up, but the interrupt never comes because
465 ab33fcda Paolo Bonzini
         * the vCPU isn't running any insns and thus doesn't advance the
466 ab33fcda Paolo Bonzini
         * vm_clock.
467 ab33fcda Paolo Bonzini
         *
468 ab33fcda Paolo Bonzini
         * An extreme solution for this problem would be to never let VCPUs
469 ab33fcda Paolo Bonzini
         * sleep in icount mode if there is a pending vm_clock timer; rather
470 ab33fcda Paolo Bonzini
         * time could just advance to the next vm_clock event.  Instead, we
471 ab33fcda Paolo Bonzini
         * do stop VCPUs and only advance vm_clock after some "real" time,
472 ab33fcda Paolo Bonzini
         * (related to the time left until the next event) has passed.  This
473 ab33fcda Paolo Bonzini
         * rt_clock timer will do this.  This avoids that the warps are too
474 ab33fcda Paolo Bonzini
         * visible externally---for example, you will not be sending network
475 ab33fcda Paolo Bonzini
         * packets continously instead of every 100ms.
476 ab33fcda Paolo Bonzini
         */
477 ab33fcda Paolo Bonzini
        qemu_mod_timer(clock->warp_timer, vm_clock_warp_start + deadline);
478 ab33fcda Paolo Bonzini
    } else {
479 ab33fcda Paolo Bonzini
        qemu_notify_event();
480 ab33fcda Paolo Bonzini
    }
481 ab33fcda Paolo Bonzini
}
482 ab33fcda Paolo Bonzini
483 4a998740 Paolo Bonzini
QEMUTimer *qemu_new_timer(QEMUClock *clock, int scale,
484 4a998740 Paolo Bonzini
                          QEMUTimerCB *cb, void *opaque)
485 db1a4972 Paolo Bonzini
{
486 db1a4972 Paolo Bonzini
    QEMUTimer *ts;
487 db1a4972 Paolo Bonzini
488 db1a4972 Paolo Bonzini
    ts = qemu_mallocz(sizeof(QEMUTimer));
489 db1a4972 Paolo Bonzini
    ts->clock = clock;
490 db1a4972 Paolo Bonzini
    ts->cb = cb;
491 db1a4972 Paolo Bonzini
    ts->opaque = opaque;
492 4a998740 Paolo Bonzini
    ts->scale = scale;
493 db1a4972 Paolo Bonzini
    return ts;
494 db1a4972 Paolo Bonzini
}
495 db1a4972 Paolo Bonzini
496 db1a4972 Paolo Bonzini
void qemu_free_timer(QEMUTimer *ts)
497 db1a4972 Paolo Bonzini
{
498 db1a4972 Paolo Bonzini
    qemu_free(ts);
499 db1a4972 Paolo Bonzini
}
500 db1a4972 Paolo Bonzini
501 db1a4972 Paolo Bonzini
/* stop a timer, but do not dealloc it */
502 db1a4972 Paolo Bonzini
void qemu_del_timer(QEMUTimer *ts)
503 db1a4972 Paolo Bonzini
{
504 db1a4972 Paolo Bonzini
    QEMUTimer **pt, *t;
505 db1a4972 Paolo Bonzini
506 db1a4972 Paolo Bonzini
    /* NOTE: this code must be signal safe because
507 db1a4972 Paolo Bonzini
       qemu_timer_expired() can be called from a signal. */
508 db1a4972 Paolo Bonzini
    pt = &active_timers[ts->clock->type];
509 db1a4972 Paolo Bonzini
    for(;;) {
510 db1a4972 Paolo Bonzini
        t = *pt;
511 db1a4972 Paolo Bonzini
        if (!t)
512 db1a4972 Paolo Bonzini
            break;
513 db1a4972 Paolo Bonzini
        if (t == ts) {
514 db1a4972 Paolo Bonzini
            *pt = t->next;
515 db1a4972 Paolo Bonzini
            break;
516 db1a4972 Paolo Bonzini
        }
517 db1a4972 Paolo Bonzini
        pt = &t->next;
518 db1a4972 Paolo Bonzini
    }
519 db1a4972 Paolo Bonzini
}
520 db1a4972 Paolo Bonzini
521 db1a4972 Paolo Bonzini
/* modify the current timer so that it will be fired when current_time
522 db1a4972 Paolo Bonzini
   >= expire_time. The corresponding callback will be called. */
523 4a998740 Paolo Bonzini
static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
524 db1a4972 Paolo Bonzini
{
525 db1a4972 Paolo Bonzini
    QEMUTimer **pt, *t;
526 db1a4972 Paolo Bonzini
527 db1a4972 Paolo Bonzini
    qemu_del_timer(ts);
528 db1a4972 Paolo Bonzini
529 db1a4972 Paolo Bonzini
    /* add the timer in the sorted list */
530 db1a4972 Paolo Bonzini
    /* NOTE: this code must be signal safe because
531 db1a4972 Paolo Bonzini
       qemu_timer_expired() can be called from a signal. */
532 db1a4972 Paolo Bonzini
    pt = &active_timers[ts->clock->type];
533 db1a4972 Paolo Bonzini
    for(;;) {
534 db1a4972 Paolo Bonzini
        t = *pt;
535 45c7b37f Stefan Weil
        if (!qemu_timer_expired_ns(t, expire_time)) {
536 db1a4972 Paolo Bonzini
            break;
537 45c7b37f Stefan Weil
        }
538 db1a4972 Paolo Bonzini
        pt = &t->next;
539 db1a4972 Paolo Bonzini
    }
540 db1a4972 Paolo Bonzini
    ts->expire_time = expire_time;
541 db1a4972 Paolo Bonzini
    ts->next = *pt;
542 db1a4972 Paolo Bonzini
    *pt = ts;
543 db1a4972 Paolo Bonzini
544 db1a4972 Paolo Bonzini
    /* Rearm if necessary  */
545 db1a4972 Paolo Bonzini
    if (pt == &active_timers[ts->clock->type]) {
546 db1a4972 Paolo Bonzini
        if (!alarm_timer->pending) {
547 db1a4972 Paolo Bonzini
            qemu_rearm_alarm_timer(alarm_timer);
548 db1a4972 Paolo Bonzini
        }
549 db1a4972 Paolo Bonzini
        /* Interrupt execution to force deadline recalculation.  */
550 ab33fcda Paolo Bonzini
        qemu_clock_warp(ts->clock);
551 ab33fcda Paolo Bonzini
        if (use_icount) {
552 db1a4972 Paolo Bonzini
            qemu_notify_event();
553 ab33fcda Paolo Bonzini
        }
554 db1a4972 Paolo Bonzini
    }
555 db1a4972 Paolo Bonzini
}
556 db1a4972 Paolo Bonzini
557 4a998740 Paolo Bonzini
/* modify the current timer so that it will be fired when current_time
558 4a998740 Paolo Bonzini
   >= expire_time. The corresponding callback will be called. */
559 4a998740 Paolo Bonzini
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
560 4a998740 Paolo Bonzini
{
561 4a998740 Paolo Bonzini
    qemu_mod_timer_ns(ts, expire_time * ts->scale);
562 4a998740 Paolo Bonzini
}
563 4a998740 Paolo Bonzini
564 db1a4972 Paolo Bonzini
int qemu_timer_pending(QEMUTimer *ts)
565 db1a4972 Paolo Bonzini
{
566 db1a4972 Paolo Bonzini
    QEMUTimer *t;
567 db1a4972 Paolo Bonzini
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
568 db1a4972 Paolo Bonzini
        if (t == ts)
569 db1a4972 Paolo Bonzini
            return 1;
570 db1a4972 Paolo Bonzini
    }
571 db1a4972 Paolo Bonzini
    return 0;
572 db1a4972 Paolo Bonzini
}
573 db1a4972 Paolo Bonzini
574 db1a4972 Paolo Bonzini
int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
575 db1a4972 Paolo Bonzini
{
576 45c7b37f Stefan Weil
    return qemu_timer_expired_ns(timer_head, current_time * timer_head->scale);
577 db1a4972 Paolo Bonzini
}
578 db1a4972 Paolo Bonzini
579 db1a4972 Paolo Bonzini
static void qemu_run_timers(QEMUClock *clock)
580 db1a4972 Paolo Bonzini
{
581 db1a4972 Paolo Bonzini
    QEMUTimer **ptimer_head, *ts;
582 db1a4972 Paolo Bonzini
    int64_t current_time;
583 db1a4972 Paolo Bonzini
   
584 db1a4972 Paolo Bonzini
    if (!clock->enabled)
585 db1a4972 Paolo Bonzini
        return;
586 db1a4972 Paolo Bonzini
587 4a998740 Paolo Bonzini
    current_time = qemu_get_clock_ns(clock);
588 db1a4972 Paolo Bonzini
    ptimer_head = &active_timers[clock->type];
589 db1a4972 Paolo Bonzini
    for(;;) {
590 db1a4972 Paolo Bonzini
        ts = *ptimer_head;
591 45c7b37f Stefan Weil
        if (!qemu_timer_expired_ns(ts, current_time)) {
592 db1a4972 Paolo Bonzini
            break;
593 45c7b37f Stefan Weil
        }
594 db1a4972 Paolo Bonzini
        /* remove timer from the list before calling the callback */
595 db1a4972 Paolo Bonzini
        *ptimer_head = ts->next;
596 db1a4972 Paolo Bonzini
        ts->next = NULL;
597 db1a4972 Paolo Bonzini
598 db1a4972 Paolo Bonzini
        /* run the callback (the timer list can be modified) */
599 db1a4972 Paolo Bonzini
        ts->cb(ts->opaque);
600 db1a4972 Paolo Bonzini
    }
601 db1a4972 Paolo Bonzini
}
602 db1a4972 Paolo Bonzini
603 db1a4972 Paolo Bonzini
int64_t qemu_get_clock_ns(QEMUClock *clock)
604 db1a4972 Paolo Bonzini
{
605 691a0c9c Jan Kiszka
    int64_t now, last;
606 691a0c9c Jan Kiszka
607 db1a4972 Paolo Bonzini
    switch(clock->type) {
608 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_REALTIME:
609 db1a4972 Paolo Bonzini
        return get_clock();
610 db1a4972 Paolo Bonzini
    default:
611 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_VIRTUAL:
612 db1a4972 Paolo Bonzini
        if (use_icount) {
613 db1a4972 Paolo Bonzini
            return cpu_get_icount();
614 db1a4972 Paolo Bonzini
        } else {
615 db1a4972 Paolo Bonzini
            return cpu_get_clock();
616 db1a4972 Paolo Bonzini
        }
617 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_HOST:
618 691a0c9c Jan Kiszka
        now = get_clock_realtime();
619 691a0c9c Jan Kiszka
        last = clock->last;
620 691a0c9c Jan Kiszka
        clock->last = now;
621 691a0c9c Jan Kiszka
        if (now < last) {
622 691a0c9c Jan Kiszka
            notifier_list_notify(&clock->reset_notifiers, &now);
623 691a0c9c Jan Kiszka
        }
624 691a0c9c Jan Kiszka
        return now;
625 db1a4972 Paolo Bonzini
    }
626 db1a4972 Paolo Bonzini
}
627 db1a4972 Paolo Bonzini
628 691a0c9c Jan Kiszka
void qemu_register_clock_reset_notifier(QEMUClock *clock, Notifier *notifier)
629 691a0c9c Jan Kiszka
{
630 691a0c9c Jan Kiszka
    notifier_list_add(&clock->reset_notifiers, notifier);
631 691a0c9c Jan Kiszka
}
632 691a0c9c Jan Kiszka
633 691a0c9c Jan Kiszka
void qemu_unregister_clock_reset_notifier(QEMUClock *clock, Notifier *notifier)
634 691a0c9c Jan Kiszka
{
635 691a0c9c Jan Kiszka
    notifier_list_remove(&clock->reset_notifiers, notifier);
636 691a0c9c Jan Kiszka
}
637 691a0c9c Jan Kiszka
638 db1a4972 Paolo Bonzini
void init_clocks(void)
639 db1a4972 Paolo Bonzini
{
640 db1a4972 Paolo Bonzini
    rt_clock = qemu_new_clock(QEMU_CLOCK_REALTIME);
641 db1a4972 Paolo Bonzini
    vm_clock = qemu_new_clock(QEMU_CLOCK_VIRTUAL);
642 db1a4972 Paolo Bonzini
    host_clock = qemu_new_clock(QEMU_CLOCK_HOST);
643 db1a4972 Paolo Bonzini
644 db1a4972 Paolo Bonzini
    rtc_clock = host_clock;
645 db1a4972 Paolo Bonzini
}
646 db1a4972 Paolo Bonzini
647 db1a4972 Paolo Bonzini
/* save a timer */
648 db1a4972 Paolo Bonzini
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
649 db1a4972 Paolo Bonzini
{
650 db1a4972 Paolo Bonzini
    uint64_t expire_time;
651 db1a4972 Paolo Bonzini
652 db1a4972 Paolo Bonzini
    if (qemu_timer_pending(ts)) {
653 db1a4972 Paolo Bonzini
        expire_time = ts->expire_time;
654 db1a4972 Paolo Bonzini
    } else {
655 db1a4972 Paolo Bonzini
        expire_time = -1;
656 db1a4972 Paolo Bonzini
    }
657 db1a4972 Paolo Bonzini
    qemu_put_be64(f, expire_time);
658 db1a4972 Paolo Bonzini
}
659 db1a4972 Paolo Bonzini
660 db1a4972 Paolo Bonzini
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
661 db1a4972 Paolo Bonzini
{
662 db1a4972 Paolo Bonzini
    uint64_t expire_time;
663 db1a4972 Paolo Bonzini
664 db1a4972 Paolo Bonzini
    expire_time = qemu_get_be64(f);
665 db1a4972 Paolo Bonzini
    if (expire_time != -1) {
666 4a998740 Paolo Bonzini
        qemu_mod_timer_ns(ts, expire_time);
667 db1a4972 Paolo Bonzini
    } else {
668 db1a4972 Paolo Bonzini
        qemu_del_timer(ts);
669 db1a4972 Paolo Bonzini
    }
670 db1a4972 Paolo Bonzini
}
671 db1a4972 Paolo Bonzini
672 db1a4972 Paolo Bonzini
static const VMStateDescription vmstate_timers = {
673 db1a4972 Paolo Bonzini
    .name = "timer",
674 db1a4972 Paolo Bonzini
    .version_id = 2,
675 db1a4972 Paolo Bonzini
    .minimum_version_id = 1,
676 db1a4972 Paolo Bonzini
    .minimum_version_id_old = 1,
677 db1a4972 Paolo Bonzini
    .fields      = (VMStateField []) {
678 db1a4972 Paolo Bonzini
        VMSTATE_INT64(cpu_ticks_offset, TimersState),
679 db1a4972 Paolo Bonzini
        VMSTATE_INT64(dummy, TimersState),
680 db1a4972 Paolo Bonzini
        VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
681 db1a4972 Paolo Bonzini
        VMSTATE_END_OF_LIST()
682 db1a4972 Paolo Bonzini
    }
683 db1a4972 Paolo Bonzini
};
684 db1a4972 Paolo Bonzini
685 db1a4972 Paolo Bonzini
void configure_icount(const char *option)
686 db1a4972 Paolo Bonzini
{
687 0be71e32 Alex Williamson
    vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
688 db1a4972 Paolo Bonzini
    if (!option)
689 db1a4972 Paolo Bonzini
        return;
690 db1a4972 Paolo Bonzini
691 ab33fcda Paolo Bonzini
#ifdef CONFIG_IOTHREAD
692 ab33fcda Paolo Bonzini
    vm_clock->warp_timer = qemu_new_timer_ns(rt_clock, icount_warp_rt, NULL);
693 ab33fcda Paolo Bonzini
#endif
694 ab33fcda Paolo Bonzini
695 db1a4972 Paolo Bonzini
    if (strcmp(option, "auto") != 0) {
696 db1a4972 Paolo Bonzini
        icount_time_shift = strtol(option, NULL, 0);
697 db1a4972 Paolo Bonzini
        use_icount = 1;
698 db1a4972 Paolo Bonzini
        return;
699 db1a4972 Paolo Bonzini
    }
700 db1a4972 Paolo Bonzini
701 db1a4972 Paolo Bonzini
    use_icount = 2;
702 db1a4972 Paolo Bonzini
703 db1a4972 Paolo Bonzini
    /* 125MIPS seems a reasonable initial guess at the guest speed.
704 db1a4972 Paolo Bonzini
       It will be corrected fairly quickly anyway.  */
705 db1a4972 Paolo Bonzini
    icount_time_shift = 3;
706 db1a4972 Paolo Bonzini
707 db1a4972 Paolo Bonzini
    /* Have both realtime and virtual time triggers for speed adjustment.
708 db1a4972 Paolo Bonzini
       The realtime trigger catches emulated time passing too slowly,
709 db1a4972 Paolo Bonzini
       the virtual time trigger catches emulated time passing too fast.
710 db1a4972 Paolo Bonzini
       Realtime triggers occur even when idle, so use them less frequently
711 db1a4972 Paolo Bonzini
       than VM triggers.  */
712 7bd427d8 Paolo Bonzini
    icount_rt_timer = qemu_new_timer_ms(rt_clock, icount_adjust_rt, NULL);
713 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_rt_timer,
714 7bd427d8 Paolo Bonzini
                   qemu_get_clock_ms(rt_clock) + 1000);
715 74475455 Paolo Bonzini
    icount_vm_timer = qemu_new_timer_ns(vm_clock, icount_adjust_vm, NULL);
716 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_vm_timer,
717 74475455 Paolo Bonzini
                   qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 10);
718 db1a4972 Paolo Bonzini
}
719 db1a4972 Paolo Bonzini
720 db1a4972 Paolo Bonzini
void qemu_run_all_timers(void)
721 db1a4972 Paolo Bonzini
{
722 ca5a2a4b Paolo Bonzini
    alarm_timer->pending = 0;
723 ca5a2a4b Paolo Bonzini
724 db1a4972 Paolo Bonzini
    /* rearm timer, if not periodic */
725 db1a4972 Paolo Bonzini
    if (alarm_timer->expired) {
726 db1a4972 Paolo Bonzini
        alarm_timer->expired = 0;
727 db1a4972 Paolo Bonzini
        qemu_rearm_alarm_timer(alarm_timer);
728 db1a4972 Paolo Bonzini
    }
729 db1a4972 Paolo Bonzini
730 db1a4972 Paolo Bonzini
    /* vm time timers */
731 db1a4972 Paolo Bonzini
    if (vm_running) {
732 db1a4972 Paolo Bonzini
        qemu_run_timers(vm_clock);
733 db1a4972 Paolo Bonzini
    }
734 db1a4972 Paolo Bonzini
735 db1a4972 Paolo Bonzini
    qemu_run_timers(rt_clock);
736 db1a4972 Paolo Bonzini
    qemu_run_timers(host_clock);
737 db1a4972 Paolo Bonzini
}
738 db1a4972 Paolo Bonzini
739 4c3d45eb Paolo Bonzini
static int64_t qemu_next_alarm_deadline(void);
740 4c3d45eb Paolo Bonzini
741 db1a4972 Paolo Bonzini
#ifdef _WIN32
742 68c23e55 Paolo Bonzini
static void CALLBACK host_alarm_handler(PVOID lpParam, BOOLEAN unused)
743 db1a4972 Paolo Bonzini
#else
744 db1a4972 Paolo Bonzini
static void host_alarm_handler(int host_signum)
745 db1a4972 Paolo Bonzini
#endif
746 db1a4972 Paolo Bonzini
{
747 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = alarm_timer;
748 db1a4972 Paolo Bonzini
    if (!t)
749 db1a4972 Paolo Bonzini
        return;
750 db1a4972 Paolo Bonzini
751 db1a4972 Paolo Bonzini
#if 0
752 db1a4972 Paolo Bonzini
#define DISP_FREQ 1000
753 db1a4972 Paolo Bonzini
    {
754 db1a4972 Paolo Bonzini
        static int64_t delta_min = INT64_MAX;
755 db1a4972 Paolo Bonzini
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
756 db1a4972 Paolo Bonzini
        static int count;
757 74475455 Paolo Bonzini
        ti = qemu_get_clock_ns(vm_clock);
758 db1a4972 Paolo Bonzini
        if (last_clock != 0) {
759 db1a4972 Paolo Bonzini
            delta = ti - last_clock;
760 db1a4972 Paolo Bonzini
            if (delta < delta_min)
761 db1a4972 Paolo Bonzini
                delta_min = delta;
762 db1a4972 Paolo Bonzini
            if (delta > delta_max)
763 db1a4972 Paolo Bonzini
                delta_max = delta;
764 db1a4972 Paolo Bonzini
            delta_cum += delta;
765 db1a4972 Paolo Bonzini
            if (++count == DISP_FREQ) {
766 db1a4972 Paolo Bonzini
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
767 db1a4972 Paolo Bonzini
                       muldiv64(delta_min, 1000000, get_ticks_per_sec()),
768 db1a4972 Paolo Bonzini
                       muldiv64(delta_max, 1000000, get_ticks_per_sec()),
769 db1a4972 Paolo Bonzini
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, get_ticks_per_sec()),
770 db1a4972 Paolo Bonzini
                       (double)get_ticks_per_sec() / ((double)delta_cum / DISP_FREQ));
771 db1a4972 Paolo Bonzini
                count = 0;
772 db1a4972 Paolo Bonzini
                delta_min = INT64_MAX;
773 db1a4972 Paolo Bonzini
                delta_max = 0;
774 db1a4972 Paolo Bonzini
                delta_cum = 0;
775 db1a4972 Paolo Bonzini
            }
776 db1a4972 Paolo Bonzini
        }
777 db1a4972 Paolo Bonzini
        last_clock = ti;
778 db1a4972 Paolo Bonzini
    }
779 db1a4972 Paolo Bonzini
#endif
780 db1a4972 Paolo Bonzini
    if (alarm_has_dynticks(t) ||
781 4c3d45eb Paolo Bonzini
        qemu_next_alarm_deadline () <= 0) {
782 db1a4972 Paolo Bonzini
        t->expired = alarm_has_dynticks(t);
783 db1a4972 Paolo Bonzini
        t->pending = 1;
784 db1a4972 Paolo Bonzini
        qemu_notify_event();
785 db1a4972 Paolo Bonzini
    }
786 db1a4972 Paolo Bonzini
}
787 db1a4972 Paolo Bonzini
788 cb842c90 Paolo Bonzini
int64_t qemu_next_icount_deadline(void)
789 db1a4972 Paolo Bonzini
{
790 db1a4972 Paolo Bonzini
    /* To avoid problems with overflow limit this to 2^32.  */
791 db1a4972 Paolo Bonzini
    int64_t delta = INT32_MAX;
792 db1a4972 Paolo Bonzini
793 cb842c90 Paolo Bonzini
    assert(use_icount);
794 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_VIRTUAL]) {
795 db1a4972 Paolo Bonzini
        delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
796 9c13246a Paolo Bonzini
                     qemu_get_clock_ns(vm_clock);
797 db1a4972 Paolo Bonzini
    }
798 db1a4972 Paolo Bonzini
799 db1a4972 Paolo Bonzini
    if (delta < 0)
800 db1a4972 Paolo Bonzini
        delta = 0;
801 db1a4972 Paolo Bonzini
802 db1a4972 Paolo Bonzini
    return delta;
803 db1a4972 Paolo Bonzini
}
804 db1a4972 Paolo Bonzini
805 4c3d45eb Paolo Bonzini
static int64_t qemu_next_alarm_deadline(void)
806 db1a4972 Paolo Bonzini
{
807 db1a4972 Paolo Bonzini
    int64_t delta;
808 db1a4972 Paolo Bonzini
    int64_t rtdelta;
809 db1a4972 Paolo Bonzini
810 6ad0a1ed Paolo Bonzini
    if (!use_icount && active_timers[QEMU_CLOCK_VIRTUAL]) {
811 6ad0a1ed Paolo Bonzini
        delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
812 74475455 Paolo Bonzini
                     qemu_get_clock_ns(vm_clock);
813 6ad0a1ed Paolo Bonzini
    } else {
814 db1a4972 Paolo Bonzini
        delta = INT32_MAX;
815 6ad0a1ed Paolo Bonzini
    }
816 6ad0a1ed Paolo Bonzini
    if (active_timers[QEMU_CLOCK_HOST]) {
817 6ad0a1ed Paolo Bonzini
        int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time -
818 6ad0a1ed Paolo Bonzini
                 qemu_get_clock_ns(host_clock);
819 6ad0a1ed Paolo Bonzini
        if (hdelta < delta)
820 6ad0a1ed Paolo Bonzini
            delta = hdelta;
821 6ad0a1ed Paolo Bonzini
    }
822 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_REALTIME]) {
823 4a998740 Paolo Bonzini
        rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time -
824 9c13246a Paolo Bonzini
                 qemu_get_clock_ns(rt_clock));
825 db1a4972 Paolo Bonzini
        if (rtdelta < delta)
826 db1a4972 Paolo Bonzini
            delta = rtdelta;
827 db1a4972 Paolo Bonzini
    }
828 db1a4972 Paolo Bonzini
829 db1a4972 Paolo Bonzini
    return delta;
830 db1a4972 Paolo Bonzini
}
831 db1a4972 Paolo Bonzini
832 4c3d45eb Paolo Bonzini
#if defined(__linux__)
833 4c3d45eb Paolo Bonzini
834 d25f89c9 Jan Kiszka
#include "compatfd.h"
835 d25f89c9 Jan Kiszka
836 db1a4972 Paolo Bonzini
static int dynticks_start_timer(struct qemu_alarm_timer *t)
837 db1a4972 Paolo Bonzini
{
838 db1a4972 Paolo Bonzini
    struct sigevent ev;
839 db1a4972 Paolo Bonzini
    timer_t host_timer;
840 db1a4972 Paolo Bonzini
    struct sigaction act;
841 db1a4972 Paolo Bonzini
842 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
843 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
844 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
845 db1a4972 Paolo Bonzini
846 db1a4972 Paolo Bonzini
    sigaction(SIGALRM, &act, NULL);
847 db1a4972 Paolo Bonzini
848 db1a4972 Paolo Bonzini
    /* 
849 db1a4972 Paolo Bonzini
     * Initialize ev struct to 0 to avoid valgrind complaining
850 db1a4972 Paolo Bonzini
     * about uninitialized data in timer_create call
851 db1a4972 Paolo Bonzini
     */
852 db1a4972 Paolo Bonzini
    memset(&ev, 0, sizeof(ev));
853 db1a4972 Paolo Bonzini
    ev.sigev_value.sival_int = 0;
854 db1a4972 Paolo Bonzini
    ev.sigev_notify = SIGEV_SIGNAL;
855 d25f89c9 Jan Kiszka
#ifdef SIGEV_THREAD_ID
856 d25f89c9 Jan Kiszka
    if (qemu_signalfd_available()) {
857 d25f89c9 Jan Kiszka
        ev.sigev_notify = SIGEV_THREAD_ID;
858 d25f89c9 Jan Kiszka
        ev._sigev_un._tid = qemu_get_thread_id();
859 d25f89c9 Jan Kiszka
    }
860 d25f89c9 Jan Kiszka
#endif /* SIGEV_THREAD_ID */
861 db1a4972 Paolo Bonzini
    ev.sigev_signo = SIGALRM;
862 db1a4972 Paolo Bonzini
863 db1a4972 Paolo Bonzini
    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
864 db1a4972 Paolo Bonzini
        perror("timer_create");
865 db1a4972 Paolo Bonzini
866 db1a4972 Paolo Bonzini
        /* disable dynticks */
867 db1a4972 Paolo Bonzini
        fprintf(stderr, "Dynamic Ticks disabled\n");
868 db1a4972 Paolo Bonzini
869 db1a4972 Paolo Bonzini
        return -1;
870 db1a4972 Paolo Bonzini
    }
871 db1a4972 Paolo Bonzini
872 cd0544ee Stefan Weil
    t->timer = host_timer;
873 db1a4972 Paolo Bonzini
874 db1a4972 Paolo Bonzini
    return 0;
875 db1a4972 Paolo Bonzini
}
876 db1a4972 Paolo Bonzini
877 db1a4972 Paolo Bonzini
static void dynticks_stop_timer(struct qemu_alarm_timer *t)
878 db1a4972 Paolo Bonzini
{
879 cd0544ee Stefan Weil
    timer_t host_timer = t->timer;
880 db1a4972 Paolo Bonzini
881 db1a4972 Paolo Bonzini
    timer_delete(host_timer);
882 db1a4972 Paolo Bonzini
}
883 db1a4972 Paolo Bonzini
884 db1a4972 Paolo Bonzini
static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
885 db1a4972 Paolo Bonzini
{
886 cd0544ee Stefan Weil
    timer_t host_timer = t->timer;
887 db1a4972 Paolo Bonzini
    struct itimerspec timeout;
888 9c13246a Paolo Bonzini
    int64_t nearest_delta_ns = INT64_MAX;
889 9c13246a Paolo Bonzini
    int64_t current_ns;
890 db1a4972 Paolo Bonzini
891 db1a4972 Paolo Bonzini
    assert(alarm_has_dynticks(t));
892 db1a4972 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
893 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
894 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
895 db1a4972 Paolo Bonzini
        return;
896 db1a4972 Paolo Bonzini
897 4c3d45eb Paolo Bonzini
    nearest_delta_ns = qemu_next_alarm_deadline();
898 4c3d45eb Paolo Bonzini
    if (nearest_delta_ns < MIN_TIMER_REARM_NS)
899 4c3d45eb Paolo Bonzini
        nearest_delta_ns = MIN_TIMER_REARM_NS;
900 db1a4972 Paolo Bonzini
901 db1a4972 Paolo Bonzini
    /* check whether a timer is already running */
902 db1a4972 Paolo Bonzini
    if (timer_gettime(host_timer, &timeout)) {
903 db1a4972 Paolo Bonzini
        perror("gettime");
904 db1a4972 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
905 db1a4972 Paolo Bonzini
        exit(1);
906 db1a4972 Paolo Bonzini
    }
907 9c13246a Paolo Bonzini
    current_ns = timeout.it_value.tv_sec * 1000000000LL + timeout.it_value.tv_nsec;
908 9c13246a Paolo Bonzini
    if (current_ns && current_ns <= nearest_delta_ns)
909 db1a4972 Paolo Bonzini
        return;
910 db1a4972 Paolo Bonzini
911 db1a4972 Paolo Bonzini
    timeout.it_interval.tv_sec = 0;
912 db1a4972 Paolo Bonzini
    timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
913 9c13246a Paolo Bonzini
    timeout.it_value.tv_sec =  nearest_delta_ns / 1000000000;
914 9c13246a Paolo Bonzini
    timeout.it_value.tv_nsec = nearest_delta_ns % 1000000000;
915 db1a4972 Paolo Bonzini
    if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
916 db1a4972 Paolo Bonzini
        perror("settime");
917 db1a4972 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
918 db1a4972 Paolo Bonzini
        exit(1);
919 db1a4972 Paolo Bonzini
    }
920 db1a4972 Paolo Bonzini
}
921 db1a4972 Paolo Bonzini
922 db1a4972 Paolo Bonzini
#endif /* defined(__linux__) */
923 db1a4972 Paolo Bonzini
924 f26e5a54 Stefan Weil
#if !defined(_WIN32)
925 f26e5a54 Stefan Weil
926 db1a4972 Paolo Bonzini
static int unix_start_timer(struct qemu_alarm_timer *t)
927 db1a4972 Paolo Bonzini
{
928 db1a4972 Paolo Bonzini
    struct sigaction act;
929 db1a4972 Paolo Bonzini
930 db1a4972 Paolo Bonzini
    /* timer signal */
931 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
932 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
933 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
934 db1a4972 Paolo Bonzini
935 db1a4972 Paolo Bonzini
    sigaction(SIGALRM, &act, NULL);
936 84682834 Paolo Bonzini
    return 0;
937 84682834 Paolo Bonzini
}
938 db1a4972 Paolo Bonzini
939 84682834 Paolo Bonzini
static void unix_rearm_timer(struct qemu_alarm_timer *t)
940 84682834 Paolo Bonzini
{
941 84682834 Paolo Bonzini
    struct itimerval itv;
942 84682834 Paolo Bonzini
    int64_t nearest_delta_ns = INT64_MAX;
943 84682834 Paolo Bonzini
    int err;
944 db1a4972 Paolo Bonzini
945 84682834 Paolo Bonzini
    assert(alarm_has_dynticks(t));
946 84682834 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
947 84682834 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
948 84682834 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
949 84682834 Paolo Bonzini
        return;
950 db1a4972 Paolo Bonzini
951 84682834 Paolo Bonzini
    nearest_delta_ns = qemu_next_alarm_deadline();
952 84682834 Paolo Bonzini
    if (nearest_delta_ns < MIN_TIMER_REARM_NS)
953 84682834 Paolo Bonzini
        nearest_delta_ns = MIN_TIMER_REARM_NS;
954 84682834 Paolo Bonzini
955 84682834 Paolo Bonzini
    itv.it_interval.tv_sec = 0;
956 84682834 Paolo Bonzini
    itv.it_interval.tv_usec = 0; /* 0 for one-shot timer */
957 84682834 Paolo Bonzini
    itv.it_value.tv_sec =  nearest_delta_ns / 1000000000;
958 84682834 Paolo Bonzini
    itv.it_value.tv_usec = (nearest_delta_ns % 1000000000) / 1000;
959 84682834 Paolo Bonzini
    err = setitimer(ITIMER_REAL, &itv, NULL);
960 84682834 Paolo Bonzini
    if (err) {
961 84682834 Paolo Bonzini
        perror("setitimer");
962 84682834 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
963 84682834 Paolo Bonzini
        exit(1);
964 84682834 Paolo Bonzini
    }
965 db1a4972 Paolo Bonzini
}
966 db1a4972 Paolo Bonzini
967 db1a4972 Paolo Bonzini
static void unix_stop_timer(struct qemu_alarm_timer *t)
968 db1a4972 Paolo Bonzini
{
969 db1a4972 Paolo Bonzini
    struct itimerval itv;
970 db1a4972 Paolo Bonzini
971 db1a4972 Paolo Bonzini
    memset(&itv, 0, sizeof(itv));
972 db1a4972 Paolo Bonzini
    setitimer(ITIMER_REAL, &itv, NULL);
973 db1a4972 Paolo Bonzini
}
974 db1a4972 Paolo Bonzini
975 db1a4972 Paolo Bonzini
#endif /* !defined(_WIN32) */
976 db1a4972 Paolo Bonzini
977 db1a4972 Paolo Bonzini
978 db1a4972 Paolo Bonzini
#ifdef _WIN32
979 db1a4972 Paolo Bonzini
980 2f9cba0c Stefan Weil
static MMRESULT mm_timer;
981 2f9cba0c Stefan Weil
static unsigned mm_period;
982 2f9cba0c Stefan Weil
983 2f9cba0c Stefan Weil
static void CALLBACK mm_alarm_handler(UINT uTimerID, UINT uMsg,
984 2f9cba0c Stefan Weil
                                      DWORD_PTR dwUser, DWORD_PTR dw1,
985 2f9cba0c Stefan Weil
                                      DWORD_PTR dw2)
986 2f9cba0c Stefan Weil
{
987 2f9cba0c Stefan Weil
    struct qemu_alarm_timer *t = alarm_timer;
988 2f9cba0c Stefan Weil
    if (!t) {
989 2f9cba0c Stefan Weil
        return;
990 2f9cba0c Stefan Weil
    }
991 2f9cba0c Stefan Weil
    if (alarm_has_dynticks(t) || qemu_next_alarm_deadline() <= 0) {
992 2f9cba0c Stefan Weil
        t->expired = alarm_has_dynticks(t);
993 2f9cba0c Stefan Weil
        t->pending = 1;
994 2f9cba0c Stefan Weil
        qemu_notify_event();
995 2f9cba0c Stefan Weil
    }
996 2f9cba0c Stefan Weil
}
997 2f9cba0c Stefan Weil
998 2f9cba0c Stefan Weil
static int mm_start_timer(struct qemu_alarm_timer *t)
999 2f9cba0c Stefan Weil
{
1000 2f9cba0c Stefan Weil
    TIMECAPS tc;
1001 2f9cba0c Stefan Weil
    UINT flags;
1002 2f9cba0c Stefan Weil
1003 2f9cba0c Stefan Weil
    memset(&tc, 0, sizeof(tc));
1004 2f9cba0c Stefan Weil
    timeGetDevCaps(&tc, sizeof(tc));
1005 2f9cba0c Stefan Weil
1006 2f9cba0c Stefan Weil
    mm_period = tc.wPeriodMin;
1007 2f9cba0c Stefan Weil
    timeBeginPeriod(mm_period);
1008 2f9cba0c Stefan Weil
1009 2f9cba0c Stefan Weil
    flags = TIME_CALLBACK_FUNCTION;
1010 2f9cba0c Stefan Weil
    if (alarm_has_dynticks(t)) {
1011 2f9cba0c Stefan Weil
        flags |= TIME_ONESHOT;
1012 2f9cba0c Stefan Weil
    } else {
1013 2f9cba0c Stefan Weil
        flags |= TIME_PERIODIC;
1014 2f9cba0c Stefan Weil
    }
1015 2f9cba0c Stefan Weil
1016 2f9cba0c Stefan Weil
    mm_timer = timeSetEvent(1,                  /* interval (ms) */
1017 2f9cba0c Stefan Weil
                            mm_period,          /* resolution */
1018 2f9cba0c Stefan Weil
                            mm_alarm_handler,   /* function */
1019 2f9cba0c Stefan Weil
                            (DWORD_PTR)t,       /* parameter */
1020 2f9cba0c Stefan Weil
                            flags);
1021 2f9cba0c Stefan Weil
1022 2f9cba0c Stefan Weil
    if (!mm_timer) {
1023 2f9cba0c Stefan Weil
        fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
1024 2f9cba0c Stefan Weil
                GetLastError());
1025 2f9cba0c Stefan Weil
        timeEndPeriod(mm_period);
1026 2f9cba0c Stefan Weil
        return -1;
1027 2f9cba0c Stefan Weil
    }
1028 2f9cba0c Stefan Weil
1029 2f9cba0c Stefan Weil
    return 0;
1030 2f9cba0c Stefan Weil
}
1031 2f9cba0c Stefan Weil
1032 2f9cba0c Stefan Weil
static void mm_stop_timer(struct qemu_alarm_timer *t)
1033 2f9cba0c Stefan Weil
{
1034 2f9cba0c Stefan Weil
    timeKillEvent(mm_timer);
1035 2f9cba0c Stefan Weil
    timeEndPeriod(mm_period);
1036 2f9cba0c Stefan Weil
}
1037 2f9cba0c Stefan Weil
1038 2f9cba0c Stefan Weil
static void mm_rearm_timer(struct qemu_alarm_timer *t)
1039 2f9cba0c Stefan Weil
{
1040 2f9cba0c Stefan Weil
    int nearest_delta_ms;
1041 2f9cba0c Stefan Weil
1042 2f9cba0c Stefan Weil
    assert(alarm_has_dynticks(t));
1043 2f9cba0c Stefan Weil
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
1044 2f9cba0c Stefan Weil
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
1045 2f9cba0c Stefan Weil
        !active_timers[QEMU_CLOCK_HOST]) {
1046 2f9cba0c Stefan Weil
        return;
1047 2f9cba0c Stefan Weil
    }
1048 2f9cba0c Stefan Weil
1049 2f9cba0c Stefan Weil
    timeKillEvent(mm_timer);
1050 2f9cba0c Stefan Weil
1051 2f9cba0c Stefan Weil
    nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
1052 2f9cba0c Stefan Weil
    if (nearest_delta_ms < 1) {
1053 2f9cba0c Stefan Weil
        nearest_delta_ms = 1;
1054 2f9cba0c Stefan Weil
    }
1055 2f9cba0c Stefan Weil
    mm_timer = timeSetEvent(nearest_delta_ms,
1056 2f9cba0c Stefan Weil
                            mm_period,
1057 2f9cba0c Stefan Weil
                            mm_alarm_handler,
1058 2f9cba0c Stefan Weil
                            (DWORD_PTR)t,
1059 2f9cba0c Stefan Weil
                            TIME_ONESHOT | TIME_CALLBACK_FUNCTION);
1060 2f9cba0c Stefan Weil
1061 2f9cba0c Stefan Weil
    if (!mm_timer) {
1062 2f9cba0c Stefan Weil
        fprintf(stderr, "Failed to re-arm win32 alarm timer %ld\n",
1063 2f9cba0c Stefan Weil
                GetLastError());
1064 2f9cba0c Stefan Weil
1065 2f9cba0c Stefan Weil
        timeEndPeriod(mm_period);
1066 2f9cba0c Stefan Weil
        exit(1);
1067 2f9cba0c Stefan Weil
    }
1068 2f9cba0c Stefan Weil
}
1069 2f9cba0c Stefan Weil
1070 db1a4972 Paolo Bonzini
static int win32_start_timer(struct qemu_alarm_timer *t)
1071 db1a4972 Paolo Bonzini
{
1072 68c23e55 Paolo Bonzini
    HANDLE hTimer;
1073 68c23e55 Paolo Bonzini
    BOOLEAN success;
1074 68c23e55 Paolo Bonzini
1075 68c23e55 Paolo Bonzini
    /* If you call ChangeTimerQueueTimer on a one-shot timer (its period
1076 68c23e55 Paolo Bonzini
       is zero) that has already expired, the timer is not updated.  Since
1077 68c23e55 Paolo Bonzini
       creating a new timer is relatively expensive, set a bogus one-hour
1078 68c23e55 Paolo Bonzini
       interval in the dynticks case.  */
1079 68c23e55 Paolo Bonzini
    success = CreateTimerQueueTimer(&hTimer,
1080 68c23e55 Paolo Bonzini
                          NULL,
1081 68c23e55 Paolo Bonzini
                          host_alarm_handler,
1082 68c23e55 Paolo Bonzini
                          t,
1083 68c23e55 Paolo Bonzini
                          1,
1084 68c23e55 Paolo Bonzini
                          alarm_has_dynticks(t) ? 3600000 : 1,
1085 68c23e55 Paolo Bonzini
                          WT_EXECUTEINTIMERTHREAD);
1086 68c23e55 Paolo Bonzini
1087 68c23e55 Paolo Bonzini
    if (!success) {
1088 db1a4972 Paolo Bonzini
        fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
1089 db1a4972 Paolo Bonzini
                GetLastError());
1090 db1a4972 Paolo Bonzini
        return -1;
1091 db1a4972 Paolo Bonzini
    }
1092 db1a4972 Paolo Bonzini
1093 cd0544ee Stefan Weil
    t->timer = hTimer;
1094 db1a4972 Paolo Bonzini
    return 0;
1095 db1a4972 Paolo Bonzini
}
1096 db1a4972 Paolo Bonzini
1097 db1a4972 Paolo Bonzini
static void win32_stop_timer(struct qemu_alarm_timer *t)
1098 db1a4972 Paolo Bonzini
{
1099 cd0544ee Stefan Weil
    HANDLE hTimer = t->timer;
1100 db1a4972 Paolo Bonzini
1101 68c23e55 Paolo Bonzini
    if (hTimer) {
1102 68c23e55 Paolo Bonzini
        DeleteTimerQueueTimer(NULL, hTimer, NULL);
1103 68c23e55 Paolo Bonzini
    }
1104 db1a4972 Paolo Bonzini
}
1105 db1a4972 Paolo Bonzini
1106 db1a4972 Paolo Bonzini
static void win32_rearm_timer(struct qemu_alarm_timer *t)
1107 db1a4972 Paolo Bonzini
{
1108 cd0544ee Stefan Weil
    HANDLE hTimer = t->timer;
1109 cfced5b2 Paolo Bonzini
    int nearest_delta_ms;
1110 68c23e55 Paolo Bonzini
    BOOLEAN success;
1111 db1a4972 Paolo Bonzini
1112 db1a4972 Paolo Bonzini
    assert(alarm_has_dynticks(t));
1113 db1a4972 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
1114 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
1115 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
1116 db1a4972 Paolo Bonzini
        return;
1117 db1a4972 Paolo Bonzini
1118 cfced5b2 Paolo Bonzini
    nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
1119 cfced5b2 Paolo Bonzini
    if (nearest_delta_ms < 1) {
1120 cfced5b2 Paolo Bonzini
        nearest_delta_ms = 1;
1121 cfced5b2 Paolo Bonzini
    }
1122 68c23e55 Paolo Bonzini
    success = ChangeTimerQueueTimer(NULL,
1123 68c23e55 Paolo Bonzini
                                    hTimer,
1124 68c23e55 Paolo Bonzini
                                    nearest_delta_ms,
1125 68c23e55 Paolo Bonzini
                                    3600000);
1126 db1a4972 Paolo Bonzini
1127 68c23e55 Paolo Bonzini
    if (!success) {
1128 68c23e55 Paolo Bonzini
        fprintf(stderr, "Failed to rearm win32 alarm timer: %ld\n",
1129 68c23e55 Paolo Bonzini
                GetLastError());
1130 68c23e55 Paolo Bonzini
        exit(-1);
1131 db1a4972 Paolo Bonzini
    }
1132 68c23e55 Paolo Bonzini
1133 db1a4972 Paolo Bonzini
}
1134 db1a4972 Paolo Bonzini
1135 db1a4972 Paolo Bonzini
#endif /* _WIN32 */
1136 db1a4972 Paolo Bonzini
1137 db1a4972 Paolo Bonzini
static void alarm_timer_on_change_state_rearm(void *opaque, int running, int reason)
1138 db1a4972 Paolo Bonzini
{
1139 db1a4972 Paolo Bonzini
    if (running)
1140 db1a4972 Paolo Bonzini
        qemu_rearm_alarm_timer((struct qemu_alarm_timer *) opaque);
1141 db1a4972 Paolo Bonzini
}
1142 db1a4972 Paolo Bonzini
1143 db1a4972 Paolo Bonzini
int init_timer_alarm(void)
1144 db1a4972 Paolo Bonzini
{
1145 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = NULL;
1146 db1a4972 Paolo Bonzini
    int i, err = -1;
1147 db1a4972 Paolo Bonzini
1148 db1a4972 Paolo Bonzini
    for (i = 0; alarm_timers[i].name; i++) {
1149 db1a4972 Paolo Bonzini
        t = &alarm_timers[i];
1150 db1a4972 Paolo Bonzini
1151 db1a4972 Paolo Bonzini
        err = t->start(t);
1152 db1a4972 Paolo Bonzini
        if (!err)
1153 db1a4972 Paolo Bonzini
            break;
1154 db1a4972 Paolo Bonzini
    }
1155 db1a4972 Paolo Bonzini
1156 db1a4972 Paolo Bonzini
    if (err) {
1157 db1a4972 Paolo Bonzini
        err = -ENOENT;
1158 db1a4972 Paolo Bonzini
        goto fail;
1159 db1a4972 Paolo Bonzini
    }
1160 db1a4972 Paolo Bonzini
1161 db1a4972 Paolo Bonzini
    /* first event is at time 0 */
1162 db1a4972 Paolo Bonzini
    t->pending = 1;
1163 db1a4972 Paolo Bonzini
    alarm_timer = t;
1164 db1a4972 Paolo Bonzini
    qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
1165 db1a4972 Paolo Bonzini
1166 db1a4972 Paolo Bonzini
    return 0;
1167 db1a4972 Paolo Bonzini
1168 db1a4972 Paolo Bonzini
fail:
1169 db1a4972 Paolo Bonzini
    return err;
1170 db1a4972 Paolo Bonzini
}
1171 db1a4972 Paolo Bonzini
1172 db1a4972 Paolo Bonzini
void quit_timers(void)
1173 db1a4972 Paolo Bonzini
{
1174 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = alarm_timer;
1175 db1a4972 Paolo Bonzini
    alarm_timer = NULL;
1176 db1a4972 Paolo Bonzini
    t->stop(t);
1177 db1a4972 Paolo Bonzini
}
1178 db1a4972 Paolo Bonzini
1179 db1a4972 Paolo Bonzini
int qemu_calculate_timeout(void)
1180 db1a4972 Paolo Bonzini
{
1181 1ece93a9 Paolo Bonzini
#ifndef CONFIG_IOTHREAD
1182 db1a4972 Paolo Bonzini
    int timeout;
1183 db1a4972 Paolo Bonzini
1184 1ece93a9 Paolo Bonzini
    if (!vm_running)
1185 1ece93a9 Paolo Bonzini
        timeout = 5000;
1186 1ece93a9 Paolo Bonzini
    else {
1187 1ece93a9 Paolo Bonzini
     /* XXX: use timeout computed from timers */
1188 1ece93a9 Paolo Bonzini
        int64_t add;
1189 1ece93a9 Paolo Bonzini
        int64_t delta;
1190 1ece93a9 Paolo Bonzini
        /* Advance virtual time to the next event.  */
1191 1ece93a9 Paolo Bonzini
        delta = qemu_icount_delta();
1192 1ece93a9 Paolo Bonzini
        if (delta > 0) {
1193 1ece93a9 Paolo Bonzini
            /* If virtual time is ahead of real time then just
1194 1ece93a9 Paolo Bonzini
               wait for IO.  */
1195 1ece93a9 Paolo Bonzini
            timeout = (delta + 999999) / 1000000;
1196 1ece93a9 Paolo Bonzini
        } else {
1197 1ece93a9 Paolo Bonzini
            /* Wait for either IO to occur or the next
1198 1ece93a9 Paolo Bonzini
               timer event.  */
1199 cb842c90 Paolo Bonzini
            add = qemu_next_icount_deadline();
1200 1ece93a9 Paolo Bonzini
            /* We advance the timer before checking for IO.
1201 1ece93a9 Paolo Bonzini
               Limit the amount we advance so that early IO
1202 1ece93a9 Paolo Bonzini
               activity won't get the guest too far ahead.  */
1203 1ece93a9 Paolo Bonzini
            if (add > 10000000)
1204 1ece93a9 Paolo Bonzini
                add = 10000000;
1205 1ece93a9 Paolo Bonzini
            delta += add;
1206 1ece93a9 Paolo Bonzini
            qemu_icount += qemu_icount_round (add);
1207 1ece93a9 Paolo Bonzini
            timeout = delta / 1000000;
1208 1ece93a9 Paolo Bonzini
            if (timeout < 0)
1209 1ece93a9 Paolo Bonzini
                timeout = 0;
1210 1ece93a9 Paolo Bonzini
        }
1211 db1a4972 Paolo Bonzini
    }
1212 db1a4972 Paolo Bonzini
1213 db1a4972 Paolo Bonzini
    return timeout;
1214 1ece93a9 Paolo Bonzini
#else /* CONFIG_IOTHREAD */
1215 1ece93a9 Paolo Bonzini
    return 1000;
1216 1ece93a9 Paolo Bonzini
#endif
1217 db1a4972 Paolo Bonzini
}