Statistics
| Branch: | Revision:

root / qemu-timer.c @ 25f3151e

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