Statistics
| Branch: | Revision:

root / qemu-timer.c @ 6643e2f0

History | View | Annotate | Download (27.9 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 __linux__
43 db1a4972 Paolo Bonzini
#include <sys/ioctl.h>
44 db1a4972 Paolo Bonzini
#include <linux/rtc.h>
45 db1a4972 Paolo Bonzini
/* For the benefit of older linux systems which don't supply it,
46 db1a4972 Paolo Bonzini
   we use a local copy of hpet.h. */
47 db1a4972 Paolo Bonzini
/* #include <linux/hpet.h> */
48 db1a4972 Paolo Bonzini
#include "hpet.h"
49 db1a4972 Paolo Bonzini
#endif
50 db1a4972 Paolo Bonzini
51 db1a4972 Paolo Bonzini
#ifdef _WIN32
52 db1a4972 Paolo Bonzini
#include <windows.h>
53 db1a4972 Paolo Bonzini
#include <mmsystem.h>
54 db1a4972 Paolo Bonzini
#endif
55 db1a4972 Paolo Bonzini
56 db1a4972 Paolo Bonzini
#include "qemu-timer.h"
57 db1a4972 Paolo Bonzini
58 db1a4972 Paolo Bonzini
/* Conversion factor from emulated instructions to virtual clock ticks.  */
59 29e922b6 Blue Swirl
int icount_time_shift;
60 db1a4972 Paolo Bonzini
/* Arbitrarily pick 1MIPS as the minimum allowable speed.  */
61 db1a4972 Paolo Bonzini
#define MAX_ICOUNT_SHIFT 10
62 db1a4972 Paolo Bonzini
/* Compensate for varying guest execution speed.  */
63 29e922b6 Blue Swirl
int64_t qemu_icount_bias;
64 db1a4972 Paolo Bonzini
static QEMUTimer *icount_rt_timer;
65 db1a4972 Paolo Bonzini
static QEMUTimer *icount_vm_timer;
66 db1a4972 Paolo Bonzini
67 db1a4972 Paolo Bonzini
/***********************************************************/
68 db1a4972 Paolo Bonzini
/* guest cycle counter */
69 db1a4972 Paolo Bonzini
70 db1a4972 Paolo Bonzini
typedef struct TimersState {
71 db1a4972 Paolo Bonzini
    int64_t cpu_ticks_prev;
72 db1a4972 Paolo Bonzini
    int64_t cpu_ticks_offset;
73 db1a4972 Paolo Bonzini
    int64_t cpu_clock_offset;
74 db1a4972 Paolo Bonzini
    int32_t cpu_ticks_enabled;
75 db1a4972 Paolo Bonzini
    int64_t dummy;
76 db1a4972 Paolo Bonzini
} TimersState;
77 db1a4972 Paolo Bonzini
78 db1a4972 Paolo Bonzini
TimersState timers_state;
79 db1a4972 Paolo Bonzini
80 db1a4972 Paolo Bonzini
/* return the host CPU cycle counter and handle stop/restart */
81 db1a4972 Paolo Bonzini
int64_t cpu_get_ticks(void)
82 db1a4972 Paolo Bonzini
{
83 db1a4972 Paolo Bonzini
    if (use_icount) {
84 db1a4972 Paolo Bonzini
        return cpu_get_icount();
85 db1a4972 Paolo Bonzini
    }
86 db1a4972 Paolo Bonzini
    if (!timers_state.cpu_ticks_enabled) {
87 db1a4972 Paolo Bonzini
        return timers_state.cpu_ticks_offset;
88 db1a4972 Paolo Bonzini
    } else {
89 db1a4972 Paolo Bonzini
        int64_t ticks;
90 db1a4972 Paolo Bonzini
        ticks = cpu_get_real_ticks();
91 db1a4972 Paolo Bonzini
        if (timers_state.cpu_ticks_prev > ticks) {
92 db1a4972 Paolo Bonzini
            /* Note: non increasing ticks may happen if the host uses
93 db1a4972 Paolo Bonzini
               software suspend */
94 db1a4972 Paolo Bonzini
            timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
95 db1a4972 Paolo Bonzini
        }
96 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_prev = ticks;
97 db1a4972 Paolo Bonzini
        return ticks + timers_state.cpu_ticks_offset;
98 db1a4972 Paolo Bonzini
    }
99 db1a4972 Paolo Bonzini
}
100 db1a4972 Paolo Bonzini
101 db1a4972 Paolo Bonzini
/* return the host CPU monotonic timer and handle stop/restart */
102 db1a4972 Paolo Bonzini
static int64_t cpu_get_clock(void)
103 db1a4972 Paolo Bonzini
{
104 db1a4972 Paolo Bonzini
    int64_t ti;
105 db1a4972 Paolo Bonzini
    if (!timers_state.cpu_ticks_enabled) {
106 db1a4972 Paolo Bonzini
        return timers_state.cpu_clock_offset;
107 db1a4972 Paolo Bonzini
    } else {
108 db1a4972 Paolo Bonzini
        ti = get_clock();
109 db1a4972 Paolo Bonzini
        return ti + timers_state.cpu_clock_offset;
110 db1a4972 Paolo Bonzini
    }
111 db1a4972 Paolo Bonzini
}
112 db1a4972 Paolo Bonzini
113 db1a4972 Paolo Bonzini
#ifndef CONFIG_IOTHREAD
114 db1a4972 Paolo Bonzini
static int64_t qemu_icount_delta(void)
115 db1a4972 Paolo Bonzini
{
116 db1a4972 Paolo Bonzini
    if (!use_icount) {
117 db1a4972 Paolo Bonzini
        return 5000 * (int64_t) 1000000;
118 db1a4972 Paolo Bonzini
    } else if (use_icount == 1) {
119 db1a4972 Paolo Bonzini
        /* When not using an adaptive execution frequency
120 db1a4972 Paolo Bonzini
           we tend to get badly out of sync with real time,
121 db1a4972 Paolo Bonzini
           so just delay for a reasonable amount of time.  */
122 db1a4972 Paolo Bonzini
        return 0;
123 db1a4972 Paolo Bonzini
    } else {
124 db1a4972 Paolo Bonzini
        return cpu_get_icount() - cpu_get_clock();
125 db1a4972 Paolo Bonzini
    }
126 db1a4972 Paolo Bonzini
}
127 db1a4972 Paolo Bonzini
#endif
128 db1a4972 Paolo Bonzini
129 db1a4972 Paolo Bonzini
/* enable cpu_get_ticks() */
130 db1a4972 Paolo Bonzini
void cpu_enable_ticks(void)
131 db1a4972 Paolo Bonzini
{
132 db1a4972 Paolo Bonzini
    if (!timers_state.cpu_ticks_enabled) {
133 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_offset -= cpu_get_real_ticks();
134 db1a4972 Paolo Bonzini
        timers_state.cpu_clock_offset -= get_clock();
135 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_enabled = 1;
136 db1a4972 Paolo Bonzini
    }
137 db1a4972 Paolo Bonzini
}
138 db1a4972 Paolo Bonzini
139 db1a4972 Paolo Bonzini
/* disable cpu_get_ticks() : the clock is stopped. You must not call
140 db1a4972 Paolo Bonzini
   cpu_get_ticks() after that.  */
141 db1a4972 Paolo Bonzini
void cpu_disable_ticks(void)
142 db1a4972 Paolo Bonzini
{
143 db1a4972 Paolo Bonzini
    if (timers_state.cpu_ticks_enabled) {
144 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_offset = cpu_get_ticks();
145 db1a4972 Paolo Bonzini
        timers_state.cpu_clock_offset = cpu_get_clock();
146 db1a4972 Paolo Bonzini
        timers_state.cpu_ticks_enabled = 0;
147 db1a4972 Paolo Bonzini
    }
148 db1a4972 Paolo Bonzini
}
149 db1a4972 Paolo Bonzini
150 db1a4972 Paolo Bonzini
/***********************************************************/
151 db1a4972 Paolo Bonzini
/* timers */
152 db1a4972 Paolo Bonzini
153 db1a4972 Paolo Bonzini
#define QEMU_CLOCK_REALTIME 0
154 db1a4972 Paolo Bonzini
#define QEMU_CLOCK_VIRTUAL  1
155 db1a4972 Paolo Bonzini
#define QEMU_CLOCK_HOST     2
156 db1a4972 Paolo Bonzini
157 db1a4972 Paolo Bonzini
struct QEMUClock {
158 db1a4972 Paolo Bonzini
    int type;
159 db1a4972 Paolo Bonzini
    int enabled;
160 db1a4972 Paolo Bonzini
    /* XXX: add frequency */
161 db1a4972 Paolo Bonzini
};
162 db1a4972 Paolo Bonzini
163 db1a4972 Paolo Bonzini
struct QEMUTimer {
164 db1a4972 Paolo Bonzini
    QEMUClock *clock;
165 db1a4972 Paolo Bonzini
    int64_t expire_time;
166 db1a4972 Paolo Bonzini
    QEMUTimerCB *cb;
167 db1a4972 Paolo Bonzini
    void *opaque;
168 db1a4972 Paolo Bonzini
    struct QEMUTimer *next;
169 db1a4972 Paolo Bonzini
};
170 db1a4972 Paolo Bonzini
171 db1a4972 Paolo Bonzini
struct qemu_alarm_timer {
172 db1a4972 Paolo Bonzini
    char const *name;
173 db1a4972 Paolo Bonzini
    int (*start)(struct qemu_alarm_timer *t);
174 db1a4972 Paolo Bonzini
    void (*stop)(struct qemu_alarm_timer *t);
175 db1a4972 Paolo Bonzini
    void (*rearm)(struct qemu_alarm_timer *t);
176 db1a4972 Paolo Bonzini
    void *priv;
177 db1a4972 Paolo Bonzini
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 db1a4972 Paolo Bonzini
int qemu_alarm_pending(void)
185 db1a4972 Paolo Bonzini
{
186 db1a4972 Paolo Bonzini
    return alarm_timer->pending;
187 db1a4972 Paolo Bonzini
}
188 db1a4972 Paolo Bonzini
189 db1a4972 Paolo Bonzini
static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
190 db1a4972 Paolo Bonzini
{
191 db1a4972 Paolo Bonzini
    return !!t->rearm;
192 db1a4972 Paolo Bonzini
}
193 db1a4972 Paolo Bonzini
194 db1a4972 Paolo Bonzini
static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
195 db1a4972 Paolo Bonzini
{
196 db1a4972 Paolo Bonzini
    if (!alarm_has_dynticks(t))
197 db1a4972 Paolo Bonzini
        return;
198 db1a4972 Paolo Bonzini
199 db1a4972 Paolo Bonzini
    t->rearm(t);
200 db1a4972 Paolo Bonzini
}
201 db1a4972 Paolo Bonzini
202 db1a4972 Paolo Bonzini
/* TODO: MIN_TIMER_REARM_US should be optimized */
203 db1a4972 Paolo Bonzini
#define MIN_TIMER_REARM_US 250
204 db1a4972 Paolo Bonzini
205 db1a4972 Paolo Bonzini
#ifdef _WIN32
206 db1a4972 Paolo Bonzini
207 db1a4972 Paolo Bonzini
struct qemu_alarm_win32 {
208 db1a4972 Paolo Bonzini
    MMRESULT timerId;
209 db1a4972 Paolo Bonzini
    unsigned int period;
210 db1a4972 Paolo Bonzini
} alarm_win32_data = {0, 0};
211 db1a4972 Paolo Bonzini
212 db1a4972 Paolo Bonzini
static int win32_start_timer(struct qemu_alarm_timer *t);
213 db1a4972 Paolo Bonzini
static void win32_stop_timer(struct qemu_alarm_timer *t);
214 db1a4972 Paolo Bonzini
static void win32_rearm_timer(struct qemu_alarm_timer *t);
215 db1a4972 Paolo Bonzini
216 db1a4972 Paolo Bonzini
#else
217 db1a4972 Paolo Bonzini
218 db1a4972 Paolo Bonzini
static int unix_start_timer(struct qemu_alarm_timer *t);
219 db1a4972 Paolo Bonzini
static void unix_stop_timer(struct qemu_alarm_timer *t);
220 db1a4972 Paolo Bonzini
221 db1a4972 Paolo Bonzini
#ifdef __linux__
222 db1a4972 Paolo Bonzini
223 db1a4972 Paolo Bonzini
static int dynticks_start_timer(struct qemu_alarm_timer *t);
224 db1a4972 Paolo Bonzini
static void dynticks_stop_timer(struct qemu_alarm_timer *t);
225 db1a4972 Paolo Bonzini
static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
226 db1a4972 Paolo Bonzini
227 db1a4972 Paolo Bonzini
static int hpet_start_timer(struct qemu_alarm_timer *t);
228 db1a4972 Paolo Bonzini
static void hpet_stop_timer(struct qemu_alarm_timer *t);
229 db1a4972 Paolo Bonzini
230 db1a4972 Paolo Bonzini
static int rtc_start_timer(struct qemu_alarm_timer *t);
231 db1a4972 Paolo Bonzini
static void rtc_stop_timer(struct qemu_alarm_timer *t);
232 db1a4972 Paolo Bonzini
233 db1a4972 Paolo Bonzini
#endif /* __linux__ */
234 db1a4972 Paolo Bonzini
235 db1a4972 Paolo Bonzini
#endif /* _WIN32 */
236 db1a4972 Paolo Bonzini
237 db1a4972 Paolo Bonzini
/* Correlation between real and virtual time is always going to be
238 db1a4972 Paolo Bonzini
   fairly approximate, so ignore small variation.
239 db1a4972 Paolo Bonzini
   When the guest is idle real and virtual time will be aligned in
240 db1a4972 Paolo Bonzini
   the IO wait loop.  */
241 db1a4972 Paolo Bonzini
#define ICOUNT_WOBBLE (get_ticks_per_sec() / 10)
242 db1a4972 Paolo Bonzini
243 db1a4972 Paolo Bonzini
static void icount_adjust(void)
244 db1a4972 Paolo Bonzini
{
245 db1a4972 Paolo Bonzini
    int64_t cur_time;
246 db1a4972 Paolo Bonzini
    int64_t cur_icount;
247 db1a4972 Paolo Bonzini
    int64_t delta;
248 db1a4972 Paolo Bonzini
    static int64_t last_delta;
249 db1a4972 Paolo Bonzini
    /* If the VM is not running, then do nothing.  */
250 db1a4972 Paolo Bonzini
    if (!vm_running)
251 db1a4972 Paolo Bonzini
        return;
252 db1a4972 Paolo Bonzini
253 db1a4972 Paolo Bonzini
    cur_time = cpu_get_clock();
254 db1a4972 Paolo Bonzini
    cur_icount = qemu_get_clock(vm_clock);
255 db1a4972 Paolo Bonzini
    delta = cur_icount - cur_time;
256 db1a4972 Paolo Bonzini
    /* FIXME: This is a very crude algorithm, somewhat prone to oscillation.  */
257 db1a4972 Paolo Bonzini
    if (delta > 0
258 db1a4972 Paolo Bonzini
        && last_delta + ICOUNT_WOBBLE < delta * 2
259 db1a4972 Paolo Bonzini
        && icount_time_shift > 0) {
260 db1a4972 Paolo Bonzini
        /* The guest is getting too far ahead.  Slow time down.  */
261 db1a4972 Paolo Bonzini
        icount_time_shift--;
262 db1a4972 Paolo Bonzini
    }
263 db1a4972 Paolo Bonzini
    if (delta < 0
264 db1a4972 Paolo Bonzini
        && last_delta - ICOUNT_WOBBLE > delta * 2
265 db1a4972 Paolo Bonzini
        && icount_time_shift < MAX_ICOUNT_SHIFT) {
266 db1a4972 Paolo Bonzini
        /* The guest is getting too far behind.  Speed time up.  */
267 db1a4972 Paolo Bonzini
        icount_time_shift++;
268 db1a4972 Paolo Bonzini
    }
269 db1a4972 Paolo Bonzini
    last_delta = delta;
270 db1a4972 Paolo Bonzini
    qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
271 db1a4972 Paolo Bonzini
}
272 db1a4972 Paolo Bonzini
273 db1a4972 Paolo Bonzini
static void icount_adjust_rt(void * opaque)
274 db1a4972 Paolo Bonzini
{
275 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_rt_timer,
276 db1a4972 Paolo Bonzini
                   qemu_get_clock(rt_clock) + 1000);
277 db1a4972 Paolo Bonzini
    icount_adjust();
278 db1a4972 Paolo Bonzini
}
279 db1a4972 Paolo Bonzini
280 db1a4972 Paolo Bonzini
static void icount_adjust_vm(void * opaque)
281 db1a4972 Paolo Bonzini
{
282 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_vm_timer,
283 db1a4972 Paolo Bonzini
                   qemu_get_clock(vm_clock) + get_ticks_per_sec() / 10);
284 db1a4972 Paolo Bonzini
    icount_adjust();
285 db1a4972 Paolo Bonzini
}
286 db1a4972 Paolo Bonzini
287 db1a4972 Paolo Bonzini
int64_t qemu_icount_round(int64_t count)
288 db1a4972 Paolo Bonzini
{
289 db1a4972 Paolo Bonzini
    return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
290 db1a4972 Paolo Bonzini
}
291 db1a4972 Paolo Bonzini
292 db1a4972 Paolo Bonzini
static struct qemu_alarm_timer alarm_timers[] = {
293 db1a4972 Paolo Bonzini
#ifndef _WIN32
294 db1a4972 Paolo Bonzini
#ifdef __linux__
295 db1a4972 Paolo Bonzini
    {"dynticks", dynticks_start_timer,
296 db1a4972 Paolo Bonzini
     dynticks_stop_timer, dynticks_rearm_timer, NULL},
297 db1a4972 Paolo Bonzini
    /* HPET - if available - is preferred */
298 db1a4972 Paolo Bonzini
    {"hpet", hpet_start_timer, hpet_stop_timer, NULL, NULL},
299 db1a4972 Paolo Bonzini
    /* ...otherwise try RTC */
300 db1a4972 Paolo Bonzini
    {"rtc", rtc_start_timer, rtc_stop_timer, NULL, NULL},
301 db1a4972 Paolo Bonzini
#endif
302 db1a4972 Paolo Bonzini
    {"unix", unix_start_timer, unix_stop_timer, NULL, NULL},
303 db1a4972 Paolo Bonzini
#else
304 db1a4972 Paolo Bonzini
    {"dynticks", win32_start_timer,
305 db1a4972 Paolo Bonzini
     win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
306 db1a4972 Paolo Bonzini
    {"win32", win32_start_timer,
307 db1a4972 Paolo Bonzini
     win32_stop_timer, NULL, &alarm_win32_data},
308 db1a4972 Paolo Bonzini
#endif
309 db1a4972 Paolo Bonzini
    {NULL, }
310 db1a4972 Paolo Bonzini
};
311 db1a4972 Paolo Bonzini
312 db1a4972 Paolo Bonzini
static void show_available_alarms(void)
313 db1a4972 Paolo Bonzini
{
314 db1a4972 Paolo Bonzini
    int i;
315 db1a4972 Paolo Bonzini
316 db1a4972 Paolo Bonzini
    printf("Available alarm timers, in order of precedence:\n");
317 db1a4972 Paolo Bonzini
    for (i = 0; alarm_timers[i].name; i++)
318 db1a4972 Paolo Bonzini
        printf("%s\n", alarm_timers[i].name);
319 db1a4972 Paolo Bonzini
}
320 db1a4972 Paolo Bonzini
321 db1a4972 Paolo Bonzini
void configure_alarms(char const *opt)
322 db1a4972 Paolo Bonzini
{
323 db1a4972 Paolo Bonzini
    int i;
324 db1a4972 Paolo Bonzini
    int cur = 0;
325 db1a4972 Paolo Bonzini
    int count = ARRAY_SIZE(alarm_timers) - 1;
326 db1a4972 Paolo Bonzini
    char *arg;
327 db1a4972 Paolo Bonzini
    char *name;
328 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer tmp;
329 db1a4972 Paolo Bonzini
330 db1a4972 Paolo Bonzini
    if (!strcmp(opt, "?")) {
331 db1a4972 Paolo Bonzini
        show_available_alarms();
332 db1a4972 Paolo Bonzini
        exit(0);
333 db1a4972 Paolo Bonzini
    }
334 db1a4972 Paolo Bonzini
335 db1a4972 Paolo Bonzini
    arg = qemu_strdup(opt);
336 db1a4972 Paolo Bonzini
337 db1a4972 Paolo Bonzini
    /* Reorder the array */
338 db1a4972 Paolo Bonzini
    name = strtok(arg, ",");
339 db1a4972 Paolo Bonzini
    while (name) {
340 db1a4972 Paolo Bonzini
        for (i = 0; i < count && alarm_timers[i].name; i++) {
341 db1a4972 Paolo Bonzini
            if (!strcmp(alarm_timers[i].name, name))
342 db1a4972 Paolo Bonzini
                break;
343 db1a4972 Paolo Bonzini
        }
344 db1a4972 Paolo Bonzini
345 db1a4972 Paolo Bonzini
        if (i == count) {
346 db1a4972 Paolo Bonzini
            fprintf(stderr, "Unknown clock %s\n", name);
347 db1a4972 Paolo Bonzini
            goto next;
348 db1a4972 Paolo Bonzini
        }
349 db1a4972 Paolo Bonzini
350 db1a4972 Paolo Bonzini
        if (i < cur)
351 db1a4972 Paolo Bonzini
            /* Ignore */
352 db1a4972 Paolo Bonzini
            goto next;
353 db1a4972 Paolo Bonzini
354 db1a4972 Paolo Bonzini
        /* Swap */
355 db1a4972 Paolo Bonzini
        tmp = alarm_timers[i];
356 db1a4972 Paolo Bonzini
        alarm_timers[i] = alarm_timers[cur];
357 db1a4972 Paolo Bonzini
        alarm_timers[cur] = tmp;
358 db1a4972 Paolo Bonzini
359 db1a4972 Paolo Bonzini
        cur++;
360 db1a4972 Paolo Bonzini
next:
361 db1a4972 Paolo Bonzini
        name = strtok(NULL, ",");
362 db1a4972 Paolo Bonzini
    }
363 db1a4972 Paolo Bonzini
364 db1a4972 Paolo Bonzini
    qemu_free(arg);
365 db1a4972 Paolo Bonzini
366 db1a4972 Paolo Bonzini
    if (cur) {
367 db1a4972 Paolo Bonzini
        /* Disable remaining timers */
368 db1a4972 Paolo Bonzini
        for (i = cur; i < count; i++)
369 db1a4972 Paolo Bonzini
            alarm_timers[i].name = NULL;
370 db1a4972 Paolo Bonzini
    } else {
371 db1a4972 Paolo Bonzini
        show_available_alarms();
372 db1a4972 Paolo Bonzini
        exit(1);
373 db1a4972 Paolo Bonzini
    }
374 db1a4972 Paolo Bonzini
}
375 db1a4972 Paolo Bonzini
376 db1a4972 Paolo Bonzini
#define QEMU_NUM_CLOCKS 3
377 db1a4972 Paolo Bonzini
378 db1a4972 Paolo Bonzini
QEMUClock *rt_clock;
379 db1a4972 Paolo Bonzini
QEMUClock *vm_clock;
380 db1a4972 Paolo Bonzini
QEMUClock *host_clock;
381 db1a4972 Paolo Bonzini
382 db1a4972 Paolo Bonzini
static QEMUTimer *active_timers[QEMU_NUM_CLOCKS];
383 db1a4972 Paolo Bonzini
384 db1a4972 Paolo Bonzini
static QEMUClock *qemu_new_clock(int type)
385 db1a4972 Paolo Bonzini
{
386 db1a4972 Paolo Bonzini
    QEMUClock *clock;
387 db1a4972 Paolo Bonzini
    clock = qemu_mallocz(sizeof(QEMUClock));
388 db1a4972 Paolo Bonzini
    clock->type = type;
389 db1a4972 Paolo Bonzini
    clock->enabled = 1;
390 db1a4972 Paolo Bonzini
    return clock;
391 db1a4972 Paolo Bonzini
}
392 db1a4972 Paolo Bonzini
393 db1a4972 Paolo Bonzini
void qemu_clock_enable(QEMUClock *clock, int enabled)
394 db1a4972 Paolo Bonzini
{
395 db1a4972 Paolo Bonzini
    clock->enabled = enabled;
396 db1a4972 Paolo Bonzini
}
397 db1a4972 Paolo Bonzini
398 db1a4972 Paolo Bonzini
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
399 db1a4972 Paolo Bonzini
{
400 db1a4972 Paolo Bonzini
    QEMUTimer *ts;
401 db1a4972 Paolo Bonzini
402 db1a4972 Paolo Bonzini
    ts = qemu_mallocz(sizeof(QEMUTimer));
403 db1a4972 Paolo Bonzini
    ts->clock = clock;
404 db1a4972 Paolo Bonzini
    ts->cb = cb;
405 db1a4972 Paolo Bonzini
    ts->opaque = opaque;
406 db1a4972 Paolo Bonzini
    return ts;
407 db1a4972 Paolo Bonzini
}
408 db1a4972 Paolo Bonzini
409 db1a4972 Paolo Bonzini
void qemu_free_timer(QEMUTimer *ts)
410 db1a4972 Paolo Bonzini
{
411 db1a4972 Paolo Bonzini
    qemu_free(ts);
412 db1a4972 Paolo Bonzini
}
413 db1a4972 Paolo Bonzini
414 db1a4972 Paolo Bonzini
/* stop a timer, but do not dealloc it */
415 db1a4972 Paolo Bonzini
void qemu_del_timer(QEMUTimer *ts)
416 db1a4972 Paolo Bonzini
{
417 db1a4972 Paolo Bonzini
    QEMUTimer **pt, *t;
418 db1a4972 Paolo Bonzini
419 db1a4972 Paolo Bonzini
    /* NOTE: this code must be signal safe because
420 db1a4972 Paolo Bonzini
       qemu_timer_expired() can be called from a signal. */
421 db1a4972 Paolo Bonzini
    pt = &active_timers[ts->clock->type];
422 db1a4972 Paolo Bonzini
    for(;;) {
423 db1a4972 Paolo Bonzini
        t = *pt;
424 db1a4972 Paolo Bonzini
        if (!t)
425 db1a4972 Paolo Bonzini
            break;
426 db1a4972 Paolo Bonzini
        if (t == ts) {
427 db1a4972 Paolo Bonzini
            *pt = t->next;
428 db1a4972 Paolo Bonzini
            break;
429 db1a4972 Paolo Bonzini
        }
430 db1a4972 Paolo Bonzini
        pt = &t->next;
431 db1a4972 Paolo Bonzini
    }
432 db1a4972 Paolo Bonzini
}
433 db1a4972 Paolo Bonzini
434 db1a4972 Paolo Bonzini
/* modify the current timer so that it will be fired when current_time
435 db1a4972 Paolo Bonzini
   >= expire_time. The corresponding callback will be called. */
436 db1a4972 Paolo Bonzini
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
437 db1a4972 Paolo Bonzini
{
438 db1a4972 Paolo Bonzini
    QEMUTimer **pt, *t;
439 db1a4972 Paolo Bonzini
440 db1a4972 Paolo Bonzini
    qemu_del_timer(ts);
441 db1a4972 Paolo Bonzini
442 db1a4972 Paolo Bonzini
    /* add the timer in the sorted list */
443 db1a4972 Paolo Bonzini
    /* NOTE: this code must be signal safe because
444 db1a4972 Paolo Bonzini
       qemu_timer_expired() can be called from a signal. */
445 db1a4972 Paolo Bonzini
    pt = &active_timers[ts->clock->type];
446 db1a4972 Paolo Bonzini
    for(;;) {
447 db1a4972 Paolo Bonzini
        t = *pt;
448 db1a4972 Paolo Bonzini
        if (!t)
449 db1a4972 Paolo Bonzini
            break;
450 db1a4972 Paolo Bonzini
        if (t->expire_time > expire_time)
451 db1a4972 Paolo Bonzini
            break;
452 db1a4972 Paolo Bonzini
        pt = &t->next;
453 db1a4972 Paolo Bonzini
    }
454 db1a4972 Paolo Bonzini
    ts->expire_time = expire_time;
455 db1a4972 Paolo Bonzini
    ts->next = *pt;
456 db1a4972 Paolo Bonzini
    *pt = ts;
457 db1a4972 Paolo Bonzini
458 db1a4972 Paolo Bonzini
    /* Rearm if necessary  */
459 db1a4972 Paolo Bonzini
    if (pt == &active_timers[ts->clock->type]) {
460 db1a4972 Paolo Bonzini
        if (!alarm_timer->pending) {
461 db1a4972 Paolo Bonzini
            qemu_rearm_alarm_timer(alarm_timer);
462 db1a4972 Paolo Bonzini
        }
463 db1a4972 Paolo Bonzini
        /* Interrupt execution to force deadline recalculation.  */
464 db1a4972 Paolo Bonzini
        if (use_icount)
465 db1a4972 Paolo Bonzini
            qemu_notify_event();
466 db1a4972 Paolo Bonzini
    }
467 db1a4972 Paolo Bonzini
}
468 db1a4972 Paolo Bonzini
469 db1a4972 Paolo Bonzini
int qemu_timer_pending(QEMUTimer *ts)
470 db1a4972 Paolo Bonzini
{
471 db1a4972 Paolo Bonzini
    QEMUTimer *t;
472 db1a4972 Paolo Bonzini
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
473 db1a4972 Paolo Bonzini
        if (t == ts)
474 db1a4972 Paolo Bonzini
            return 1;
475 db1a4972 Paolo Bonzini
    }
476 db1a4972 Paolo Bonzini
    return 0;
477 db1a4972 Paolo Bonzini
}
478 db1a4972 Paolo Bonzini
479 db1a4972 Paolo Bonzini
int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
480 db1a4972 Paolo Bonzini
{
481 db1a4972 Paolo Bonzini
    if (!timer_head)
482 db1a4972 Paolo Bonzini
        return 0;
483 db1a4972 Paolo Bonzini
    return (timer_head->expire_time <= current_time);
484 db1a4972 Paolo Bonzini
}
485 db1a4972 Paolo Bonzini
486 db1a4972 Paolo Bonzini
static void qemu_run_timers(QEMUClock *clock)
487 db1a4972 Paolo Bonzini
{
488 db1a4972 Paolo Bonzini
    QEMUTimer **ptimer_head, *ts;
489 db1a4972 Paolo Bonzini
    int64_t current_time;
490 db1a4972 Paolo Bonzini
   
491 db1a4972 Paolo Bonzini
    if (!clock->enabled)
492 db1a4972 Paolo Bonzini
        return;
493 db1a4972 Paolo Bonzini
494 db1a4972 Paolo Bonzini
    current_time = qemu_get_clock (clock);
495 db1a4972 Paolo Bonzini
    ptimer_head = &active_timers[clock->type];
496 db1a4972 Paolo Bonzini
    for(;;) {
497 db1a4972 Paolo Bonzini
        ts = *ptimer_head;
498 db1a4972 Paolo Bonzini
        if (!ts || ts->expire_time > current_time)
499 db1a4972 Paolo Bonzini
            break;
500 db1a4972 Paolo Bonzini
        /* remove timer from the list before calling the callback */
501 db1a4972 Paolo Bonzini
        *ptimer_head = ts->next;
502 db1a4972 Paolo Bonzini
        ts->next = NULL;
503 db1a4972 Paolo Bonzini
504 db1a4972 Paolo Bonzini
        /* run the callback (the timer list can be modified) */
505 db1a4972 Paolo Bonzini
        ts->cb(ts->opaque);
506 db1a4972 Paolo Bonzini
    }
507 db1a4972 Paolo Bonzini
}
508 db1a4972 Paolo Bonzini
509 db1a4972 Paolo Bonzini
int64_t qemu_get_clock(QEMUClock *clock)
510 db1a4972 Paolo Bonzini
{
511 db1a4972 Paolo Bonzini
    switch(clock->type) {
512 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_REALTIME:
513 db1a4972 Paolo Bonzini
        return get_clock() / 1000000;
514 db1a4972 Paolo Bonzini
    default:
515 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_VIRTUAL:
516 db1a4972 Paolo Bonzini
        if (use_icount) {
517 db1a4972 Paolo Bonzini
            return cpu_get_icount();
518 db1a4972 Paolo Bonzini
        } else {
519 db1a4972 Paolo Bonzini
            return cpu_get_clock();
520 db1a4972 Paolo Bonzini
        }
521 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_HOST:
522 db1a4972 Paolo Bonzini
        return get_clock_realtime();
523 db1a4972 Paolo Bonzini
    }
524 db1a4972 Paolo Bonzini
}
525 db1a4972 Paolo Bonzini
526 db1a4972 Paolo Bonzini
int64_t qemu_get_clock_ns(QEMUClock *clock)
527 db1a4972 Paolo Bonzini
{
528 db1a4972 Paolo Bonzini
    switch(clock->type) {
529 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_REALTIME:
530 db1a4972 Paolo Bonzini
        return get_clock();
531 db1a4972 Paolo Bonzini
    default:
532 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_VIRTUAL:
533 db1a4972 Paolo Bonzini
        if (use_icount) {
534 db1a4972 Paolo Bonzini
            return cpu_get_icount();
535 db1a4972 Paolo Bonzini
        } else {
536 db1a4972 Paolo Bonzini
            return cpu_get_clock();
537 db1a4972 Paolo Bonzini
        }
538 db1a4972 Paolo Bonzini
    case QEMU_CLOCK_HOST:
539 db1a4972 Paolo Bonzini
        return get_clock_realtime();
540 db1a4972 Paolo Bonzini
    }
541 db1a4972 Paolo Bonzini
}
542 db1a4972 Paolo Bonzini
543 db1a4972 Paolo Bonzini
void init_clocks(void)
544 db1a4972 Paolo Bonzini
{
545 db1a4972 Paolo Bonzini
    rt_clock = qemu_new_clock(QEMU_CLOCK_REALTIME);
546 db1a4972 Paolo Bonzini
    vm_clock = qemu_new_clock(QEMU_CLOCK_VIRTUAL);
547 db1a4972 Paolo Bonzini
    host_clock = qemu_new_clock(QEMU_CLOCK_HOST);
548 db1a4972 Paolo Bonzini
549 db1a4972 Paolo Bonzini
    rtc_clock = host_clock;
550 db1a4972 Paolo Bonzini
}
551 db1a4972 Paolo Bonzini
552 db1a4972 Paolo Bonzini
/* save a timer */
553 db1a4972 Paolo Bonzini
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
554 db1a4972 Paolo Bonzini
{
555 db1a4972 Paolo Bonzini
    uint64_t expire_time;
556 db1a4972 Paolo Bonzini
557 db1a4972 Paolo Bonzini
    if (qemu_timer_pending(ts)) {
558 db1a4972 Paolo Bonzini
        expire_time = ts->expire_time;
559 db1a4972 Paolo Bonzini
    } else {
560 db1a4972 Paolo Bonzini
        expire_time = -1;
561 db1a4972 Paolo Bonzini
    }
562 db1a4972 Paolo Bonzini
    qemu_put_be64(f, expire_time);
563 db1a4972 Paolo Bonzini
}
564 db1a4972 Paolo Bonzini
565 db1a4972 Paolo Bonzini
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
566 db1a4972 Paolo Bonzini
{
567 db1a4972 Paolo Bonzini
    uint64_t expire_time;
568 db1a4972 Paolo Bonzini
569 db1a4972 Paolo Bonzini
    expire_time = qemu_get_be64(f);
570 db1a4972 Paolo Bonzini
    if (expire_time != -1) {
571 db1a4972 Paolo Bonzini
        qemu_mod_timer(ts, expire_time);
572 db1a4972 Paolo Bonzini
    } else {
573 db1a4972 Paolo Bonzini
        qemu_del_timer(ts);
574 db1a4972 Paolo Bonzini
    }
575 db1a4972 Paolo Bonzini
}
576 db1a4972 Paolo Bonzini
577 db1a4972 Paolo Bonzini
static const VMStateDescription vmstate_timers = {
578 db1a4972 Paolo Bonzini
    .name = "timer",
579 db1a4972 Paolo Bonzini
    .version_id = 2,
580 db1a4972 Paolo Bonzini
    .minimum_version_id = 1,
581 db1a4972 Paolo Bonzini
    .minimum_version_id_old = 1,
582 db1a4972 Paolo Bonzini
    .fields      = (VMStateField []) {
583 db1a4972 Paolo Bonzini
        VMSTATE_INT64(cpu_ticks_offset, TimersState),
584 db1a4972 Paolo Bonzini
        VMSTATE_INT64(dummy, TimersState),
585 db1a4972 Paolo Bonzini
        VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
586 db1a4972 Paolo Bonzini
        VMSTATE_END_OF_LIST()
587 db1a4972 Paolo Bonzini
    }
588 db1a4972 Paolo Bonzini
};
589 db1a4972 Paolo Bonzini
590 db1a4972 Paolo Bonzini
void configure_icount(const char *option)
591 db1a4972 Paolo Bonzini
{
592 0be71e32 Alex Williamson
    vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
593 db1a4972 Paolo Bonzini
    if (!option)
594 db1a4972 Paolo Bonzini
        return;
595 db1a4972 Paolo Bonzini
596 db1a4972 Paolo Bonzini
    if (strcmp(option, "auto") != 0) {
597 db1a4972 Paolo Bonzini
        icount_time_shift = strtol(option, NULL, 0);
598 db1a4972 Paolo Bonzini
        use_icount = 1;
599 db1a4972 Paolo Bonzini
        return;
600 db1a4972 Paolo Bonzini
    }
601 db1a4972 Paolo Bonzini
602 db1a4972 Paolo Bonzini
    use_icount = 2;
603 db1a4972 Paolo Bonzini
604 db1a4972 Paolo Bonzini
    /* 125MIPS seems a reasonable initial guess at the guest speed.
605 db1a4972 Paolo Bonzini
       It will be corrected fairly quickly anyway.  */
606 db1a4972 Paolo Bonzini
    icount_time_shift = 3;
607 db1a4972 Paolo Bonzini
608 db1a4972 Paolo Bonzini
    /* Have both realtime and virtual time triggers for speed adjustment.
609 db1a4972 Paolo Bonzini
       The realtime trigger catches emulated time passing too slowly,
610 db1a4972 Paolo Bonzini
       the virtual time trigger catches emulated time passing too fast.
611 db1a4972 Paolo Bonzini
       Realtime triggers occur even when idle, so use them less frequently
612 db1a4972 Paolo Bonzini
       than VM triggers.  */
613 db1a4972 Paolo Bonzini
    icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
614 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_rt_timer,
615 db1a4972 Paolo Bonzini
                   qemu_get_clock(rt_clock) + 1000);
616 db1a4972 Paolo Bonzini
    icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
617 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_vm_timer,
618 db1a4972 Paolo Bonzini
                   qemu_get_clock(vm_clock) + get_ticks_per_sec() / 10);
619 db1a4972 Paolo Bonzini
}
620 db1a4972 Paolo Bonzini
621 db1a4972 Paolo Bonzini
void qemu_run_all_timers(void)
622 db1a4972 Paolo Bonzini
{
623 ca5a2a4b Paolo Bonzini
    alarm_timer->pending = 0;
624 ca5a2a4b Paolo Bonzini
625 db1a4972 Paolo Bonzini
    /* rearm timer, if not periodic */
626 db1a4972 Paolo Bonzini
    if (alarm_timer->expired) {
627 db1a4972 Paolo Bonzini
        alarm_timer->expired = 0;
628 db1a4972 Paolo Bonzini
        qemu_rearm_alarm_timer(alarm_timer);
629 db1a4972 Paolo Bonzini
    }
630 db1a4972 Paolo Bonzini
631 db1a4972 Paolo Bonzini
    /* vm time timers */
632 db1a4972 Paolo Bonzini
    if (vm_running) {
633 db1a4972 Paolo Bonzini
        qemu_run_timers(vm_clock);
634 db1a4972 Paolo Bonzini
    }
635 db1a4972 Paolo Bonzini
636 db1a4972 Paolo Bonzini
    qemu_run_timers(rt_clock);
637 db1a4972 Paolo Bonzini
    qemu_run_timers(host_clock);
638 db1a4972 Paolo Bonzini
}
639 db1a4972 Paolo Bonzini
640 db1a4972 Paolo Bonzini
#ifdef _WIN32
641 db1a4972 Paolo Bonzini
static void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
642 db1a4972 Paolo Bonzini
                                        DWORD_PTR dwUser, DWORD_PTR dw1,
643 db1a4972 Paolo Bonzini
                                        DWORD_PTR dw2)
644 db1a4972 Paolo Bonzini
#else
645 db1a4972 Paolo Bonzini
static void host_alarm_handler(int host_signum)
646 db1a4972 Paolo Bonzini
#endif
647 db1a4972 Paolo Bonzini
{
648 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = alarm_timer;
649 db1a4972 Paolo Bonzini
    if (!t)
650 db1a4972 Paolo Bonzini
        return;
651 db1a4972 Paolo Bonzini
652 db1a4972 Paolo Bonzini
#if 0
653 db1a4972 Paolo Bonzini
#define DISP_FREQ 1000
654 db1a4972 Paolo Bonzini
    {
655 db1a4972 Paolo Bonzini
        static int64_t delta_min = INT64_MAX;
656 db1a4972 Paolo Bonzini
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
657 db1a4972 Paolo Bonzini
        static int count;
658 db1a4972 Paolo Bonzini
        ti = qemu_get_clock(vm_clock);
659 db1a4972 Paolo Bonzini
        if (last_clock != 0) {
660 db1a4972 Paolo Bonzini
            delta = ti - last_clock;
661 db1a4972 Paolo Bonzini
            if (delta < delta_min)
662 db1a4972 Paolo Bonzini
                delta_min = delta;
663 db1a4972 Paolo Bonzini
            if (delta > delta_max)
664 db1a4972 Paolo Bonzini
                delta_max = delta;
665 db1a4972 Paolo Bonzini
            delta_cum += delta;
666 db1a4972 Paolo Bonzini
            if (++count == DISP_FREQ) {
667 db1a4972 Paolo Bonzini
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
668 db1a4972 Paolo Bonzini
                       muldiv64(delta_min, 1000000, get_ticks_per_sec()),
669 db1a4972 Paolo Bonzini
                       muldiv64(delta_max, 1000000, get_ticks_per_sec()),
670 db1a4972 Paolo Bonzini
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, get_ticks_per_sec()),
671 db1a4972 Paolo Bonzini
                       (double)get_ticks_per_sec() / ((double)delta_cum / DISP_FREQ));
672 db1a4972 Paolo Bonzini
                count = 0;
673 db1a4972 Paolo Bonzini
                delta_min = INT64_MAX;
674 db1a4972 Paolo Bonzini
                delta_max = 0;
675 db1a4972 Paolo Bonzini
                delta_cum = 0;
676 db1a4972 Paolo Bonzini
            }
677 db1a4972 Paolo Bonzini
        }
678 db1a4972 Paolo Bonzini
        last_clock = ti;
679 db1a4972 Paolo Bonzini
    }
680 db1a4972 Paolo Bonzini
#endif
681 db1a4972 Paolo Bonzini
    if (alarm_has_dynticks(t) ||
682 db1a4972 Paolo Bonzini
        (!use_icount &&
683 db1a4972 Paolo Bonzini
            qemu_timer_expired(active_timers[QEMU_CLOCK_VIRTUAL],
684 db1a4972 Paolo Bonzini
                               qemu_get_clock(vm_clock))) ||
685 db1a4972 Paolo Bonzini
        qemu_timer_expired(active_timers[QEMU_CLOCK_REALTIME],
686 db1a4972 Paolo Bonzini
                           qemu_get_clock(rt_clock)) ||
687 db1a4972 Paolo Bonzini
        qemu_timer_expired(active_timers[QEMU_CLOCK_HOST],
688 db1a4972 Paolo Bonzini
                           qemu_get_clock(host_clock))) {
689 db1a4972 Paolo Bonzini
690 db1a4972 Paolo Bonzini
        t->expired = alarm_has_dynticks(t);
691 db1a4972 Paolo Bonzini
        t->pending = 1;
692 db1a4972 Paolo Bonzini
        qemu_notify_event();
693 db1a4972 Paolo Bonzini
    }
694 db1a4972 Paolo Bonzini
}
695 db1a4972 Paolo Bonzini
696 db1a4972 Paolo Bonzini
int64_t qemu_next_deadline(void)
697 db1a4972 Paolo Bonzini
{
698 db1a4972 Paolo Bonzini
    /* To avoid problems with overflow limit this to 2^32.  */
699 db1a4972 Paolo Bonzini
    int64_t delta = INT32_MAX;
700 db1a4972 Paolo Bonzini
701 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_VIRTUAL]) {
702 db1a4972 Paolo Bonzini
        delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
703 db1a4972 Paolo Bonzini
                     qemu_get_clock(vm_clock);
704 db1a4972 Paolo Bonzini
    }
705 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_HOST]) {
706 db1a4972 Paolo Bonzini
        int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time -
707 db1a4972 Paolo Bonzini
                 qemu_get_clock(host_clock);
708 db1a4972 Paolo Bonzini
        if (hdelta < delta)
709 db1a4972 Paolo Bonzini
            delta = hdelta;
710 db1a4972 Paolo Bonzini
    }
711 db1a4972 Paolo Bonzini
712 db1a4972 Paolo Bonzini
    if (delta < 0)
713 db1a4972 Paolo Bonzini
        delta = 0;
714 db1a4972 Paolo Bonzini
715 db1a4972 Paolo Bonzini
    return delta;
716 db1a4972 Paolo Bonzini
}
717 db1a4972 Paolo Bonzini
718 db1a4972 Paolo Bonzini
#ifndef _WIN32
719 db1a4972 Paolo Bonzini
720 db1a4972 Paolo Bonzini
#if defined(__linux__)
721 db1a4972 Paolo Bonzini
722 db1a4972 Paolo Bonzini
#define RTC_FREQ 1024
723 db1a4972 Paolo Bonzini
724 db1a4972 Paolo Bonzini
static uint64_t qemu_next_deadline_dyntick(void)
725 db1a4972 Paolo Bonzini
{
726 db1a4972 Paolo Bonzini
    int64_t delta;
727 db1a4972 Paolo Bonzini
    int64_t rtdelta;
728 db1a4972 Paolo Bonzini
729 db1a4972 Paolo Bonzini
    if (use_icount)
730 db1a4972 Paolo Bonzini
        delta = INT32_MAX;
731 db1a4972 Paolo Bonzini
    else
732 db1a4972 Paolo Bonzini
        delta = (qemu_next_deadline() + 999) / 1000;
733 db1a4972 Paolo Bonzini
734 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_REALTIME]) {
735 db1a4972 Paolo Bonzini
        rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time -
736 db1a4972 Paolo Bonzini
                 qemu_get_clock(rt_clock))*1000;
737 db1a4972 Paolo Bonzini
        if (rtdelta < delta)
738 db1a4972 Paolo Bonzini
            delta = rtdelta;
739 db1a4972 Paolo Bonzini
    }
740 db1a4972 Paolo Bonzini
741 db1a4972 Paolo Bonzini
    if (delta < MIN_TIMER_REARM_US)
742 db1a4972 Paolo Bonzini
        delta = MIN_TIMER_REARM_US;
743 db1a4972 Paolo Bonzini
744 db1a4972 Paolo Bonzini
    return delta;
745 db1a4972 Paolo Bonzini
}
746 db1a4972 Paolo Bonzini
747 db1a4972 Paolo Bonzini
static void enable_sigio_timer(int fd)
748 db1a4972 Paolo Bonzini
{
749 db1a4972 Paolo Bonzini
    struct sigaction act;
750 db1a4972 Paolo Bonzini
751 db1a4972 Paolo Bonzini
    /* timer signal */
752 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
753 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
754 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
755 db1a4972 Paolo Bonzini
756 db1a4972 Paolo Bonzini
    sigaction(SIGIO, &act, NULL);
757 db1a4972 Paolo Bonzini
    fcntl_setfl(fd, O_ASYNC);
758 db1a4972 Paolo Bonzini
    fcntl(fd, F_SETOWN, getpid());
759 db1a4972 Paolo Bonzini
}
760 db1a4972 Paolo Bonzini
761 db1a4972 Paolo Bonzini
static int hpet_start_timer(struct qemu_alarm_timer *t)
762 db1a4972 Paolo Bonzini
{
763 db1a4972 Paolo Bonzini
    struct hpet_info info;
764 db1a4972 Paolo Bonzini
    int r, fd;
765 db1a4972 Paolo Bonzini
766 db1a4972 Paolo Bonzini
    fd = qemu_open("/dev/hpet", O_RDONLY);
767 db1a4972 Paolo Bonzini
    if (fd < 0)
768 db1a4972 Paolo Bonzini
        return -1;
769 db1a4972 Paolo Bonzini
770 db1a4972 Paolo Bonzini
    /* Set frequency */
771 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
772 db1a4972 Paolo Bonzini
    if (r < 0) {
773 db1a4972 Paolo Bonzini
        fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
774 db1a4972 Paolo Bonzini
                "error, but for better emulation accuracy type:\n"
775 db1a4972 Paolo Bonzini
                "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
776 db1a4972 Paolo Bonzini
        goto fail;
777 db1a4972 Paolo Bonzini
    }
778 db1a4972 Paolo Bonzini
779 db1a4972 Paolo Bonzini
    /* Check capabilities */
780 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_INFO, &info);
781 db1a4972 Paolo Bonzini
    if (r < 0)
782 db1a4972 Paolo Bonzini
        goto fail;
783 db1a4972 Paolo Bonzini
784 db1a4972 Paolo Bonzini
    /* Enable periodic mode */
785 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_EPI, 0);
786 db1a4972 Paolo Bonzini
    if (info.hi_flags && (r < 0))
787 db1a4972 Paolo Bonzini
        goto fail;
788 db1a4972 Paolo Bonzini
789 db1a4972 Paolo Bonzini
    /* Enable interrupt */
790 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_IE_ON, 0);
791 db1a4972 Paolo Bonzini
    if (r < 0)
792 db1a4972 Paolo Bonzini
        goto fail;
793 db1a4972 Paolo Bonzini
794 db1a4972 Paolo Bonzini
    enable_sigio_timer(fd);
795 db1a4972 Paolo Bonzini
    t->priv = (void *)(long)fd;
796 db1a4972 Paolo Bonzini
797 db1a4972 Paolo Bonzini
    return 0;
798 db1a4972 Paolo Bonzini
fail:
799 db1a4972 Paolo Bonzini
    close(fd);
800 db1a4972 Paolo Bonzini
    return -1;
801 db1a4972 Paolo Bonzini
}
802 db1a4972 Paolo Bonzini
803 db1a4972 Paolo Bonzini
static void hpet_stop_timer(struct qemu_alarm_timer *t)
804 db1a4972 Paolo Bonzini
{
805 db1a4972 Paolo Bonzini
    int fd = (long)t->priv;
806 db1a4972 Paolo Bonzini
807 db1a4972 Paolo Bonzini
    close(fd);
808 db1a4972 Paolo Bonzini
}
809 db1a4972 Paolo Bonzini
810 db1a4972 Paolo Bonzini
static int rtc_start_timer(struct qemu_alarm_timer *t)
811 db1a4972 Paolo Bonzini
{
812 db1a4972 Paolo Bonzini
    int rtc_fd;
813 db1a4972 Paolo Bonzini
    unsigned long current_rtc_freq = 0;
814 db1a4972 Paolo Bonzini
815 db1a4972 Paolo Bonzini
    TFR(rtc_fd = qemu_open("/dev/rtc", O_RDONLY));
816 db1a4972 Paolo Bonzini
    if (rtc_fd < 0)
817 db1a4972 Paolo Bonzini
        return -1;
818 db1a4972 Paolo Bonzini
    ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
819 db1a4972 Paolo Bonzini
    if (current_rtc_freq != RTC_FREQ &&
820 db1a4972 Paolo Bonzini
        ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
821 db1a4972 Paolo Bonzini
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
822 db1a4972 Paolo Bonzini
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
823 db1a4972 Paolo Bonzini
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
824 db1a4972 Paolo Bonzini
        goto fail;
825 db1a4972 Paolo Bonzini
    }
826 db1a4972 Paolo Bonzini
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
827 db1a4972 Paolo Bonzini
    fail:
828 db1a4972 Paolo Bonzini
        close(rtc_fd);
829 db1a4972 Paolo Bonzini
        return -1;
830 db1a4972 Paolo Bonzini
    }
831 db1a4972 Paolo Bonzini
832 db1a4972 Paolo Bonzini
    enable_sigio_timer(rtc_fd);
833 db1a4972 Paolo Bonzini
834 db1a4972 Paolo Bonzini
    t->priv = (void *)(long)rtc_fd;
835 db1a4972 Paolo Bonzini
836 db1a4972 Paolo Bonzini
    return 0;
837 db1a4972 Paolo Bonzini
}
838 db1a4972 Paolo Bonzini
839 db1a4972 Paolo Bonzini
static void rtc_stop_timer(struct qemu_alarm_timer *t)
840 db1a4972 Paolo Bonzini
{
841 db1a4972 Paolo Bonzini
    int rtc_fd = (long)t->priv;
842 db1a4972 Paolo Bonzini
843 db1a4972 Paolo Bonzini
    close(rtc_fd);
844 db1a4972 Paolo Bonzini
}
845 db1a4972 Paolo Bonzini
846 db1a4972 Paolo Bonzini
static int dynticks_start_timer(struct qemu_alarm_timer *t)
847 db1a4972 Paolo Bonzini
{
848 db1a4972 Paolo Bonzini
    struct sigevent ev;
849 db1a4972 Paolo Bonzini
    timer_t host_timer;
850 db1a4972 Paolo Bonzini
    struct sigaction act;
851 db1a4972 Paolo Bonzini
852 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
853 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
854 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
855 db1a4972 Paolo Bonzini
856 db1a4972 Paolo Bonzini
    sigaction(SIGALRM, &act, NULL);
857 db1a4972 Paolo Bonzini
858 db1a4972 Paolo Bonzini
    /* 
859 db1a4972 Paolo Bonzini
     * Initialize ev struct to 0 to avoid valgrind complaining
860 db1a4972 Paolo Bonzini
     * about uninitialized data in timer_create call
861 db1a4972 Paolo Bonzini
     */
862 db1a4972 Paolo Bonzini
    memset(&ev, 0, sizeof(ev));
863 db1a4972 Paolo Bonzini
    ev.sigev_value.sival_int = 0;
864 db1a4972 Paolo Bonzini
    ev.sigev_notify = SIGEV_SIGNAL;
865 db1a4972 Paolo Bonzini
    ev.sigev_signo = SIGALRM;
866 db1a4972 Paolo Bonzini
867 db1a4972 Paolo Bonzini
    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
868 db1a4972 Paolo Bonzini
        perror("timer_create");
869 db1a4972 Paolo Bonzini
870 db1a4972 Paolo Bonzini
        /* disable dynticks */
871 db1a4972 Paolo Bonzini
        fprintf(stderr, "Dynamic Ticks disabled\n");
872 db1a4972 Paolo Bonzini
873 db1a4972 Paolo Bonzini
        return -1;
874 db1a4972 Paolo Bonzini
    }
875 db1a4972 Paolo Bonzini
876 db1a4972 Paolo Bonzini
    t->priv = (void *)(long)host_timer;
877 db1a4972 Paolo Bonzini
878 db1a4972 Paolo Bonzini
    return 0;
879 db1a4972 Paolo Bonzini
}
880 db1a4972 Paolo Bonzini
881 db1a4972 Paolo Bonzini
static void dynticks_stop_timer(struct qemu_alarm_timer *t)
882 db1a4972 Paolo Bonzini
{
883 db1a4972 Paolo Bonzini
    timer_t host_timer = (timer_t)(long)t->priv;
884 db1a4972 Paolo Bonzini
885 db1a4972 Paolo Bonzini
    timer_delete(host_timer);
886 db1a4972 Paolo Bonzini
}
887 db1a4972 Paolo Bonzini
888 db1a4972 Paolo Bonzini
static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
889 db1a4972 Paolo Bonzini
{
890 db1a4972 Paolo Bonzini
    timer_t host_timer = (timer_t)(long)t->priv;
891 db1a4972 Paolo Bonzini
    struct itimerspec timeout;
892 db1a4972 Paolo Bonzini
    int64_t nearest_delta_us = INT64_MAX;
893 db1a4972 Paolo Bonzini
    int64_t current_us;
894 db1a4972 Paolo Bonzini
895 db1a4972 Paolo Bonzini
    assert(alarm_has_dynticks(t));
896 db1a4972 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
897 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
898 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
899 db1a4972 Paolo Bonzini
        return;
900 db1a4972 Paolo Bonzini
901 db1a4972 Paolo Bonzini
    nearest_delta_us = qemu_next_deadline_dyntick();
902 db1a4972 Paolo Bonzini
903 db1a4972 Paolo Bonzini
    /* check whether a timer is already running */
904 db1a4972 Paolo Bonzini
    if (timer_gettime(host_timer, &timeout)) {
905 db1a4972 Paolo Bonzini
        perror("gettime");
906 db1a4972 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
907 db1a4972 Paolo Bonzini
        exit(1);
908 db1a4972 Paolo Bonzini
    }
909 db1a4972 Paolo Bonzini
    current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
910 db1a4972 Paolo Bonzini
    if (current_us && current_us <= nearest_delta_us)
911 db1a4972 Paolo Bonzini
        return;
912 db1a4972 Paolo Bonzini
913 db1a4972 Paolo Bonzini
    timeout.it_interval.tv_sec = 0;
914 db1a4972 Paolo Bonzini
    timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
915 db1a4972 Paolo Bonzini
    timeout.it_value.tv_sec =  nearest_delta_us / 1000000;
916 db1a4972 Paolo Bonzini
    timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
917 db1a4972 Paolo Bonzini
    if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
918 db1a4972 Paolo Bonzini
        perror("settime");
919 db1a4972 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
920 db1a4972 Paolo Bonzini
        exit(1);
921 db1a4972 Paolo Bonzini
    }
922 db1a4972 Paolo Bonzini
}
923 db1a4972 Paolo Bonzini
924 db1a4972 Paolo Bonzini
#endif /* defined(__linux__) */
925 db1a4972 Paolo Bonzini
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
    struct itimerval itv;
930 db1a4972 Paolo Bonzini
    int err;
931 db1a4972 Paolo Bonzini
932 db1a4972 Paolo Bonzini
    /* timer signal */
933 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
934 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
935 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
936 db1a4972 Paolo Bonzini
937 db1a4972 Paolo Bonzini
    sigaction(SIGALRM, &act, NULL);
938 db1a4972 Paolo Bonzini
939 db1a4972 Paolo Bonzini
    itv.it_interval.tv_sec = 0;
940 db1a4972 Paolo Bonzini
    /* for i386 kernel 2.6 to get 1 ms */
941 db1a4972 Paolo Bonzini
    itv.it_interval.tv_usec = 999;
942 db1a4972 Paolo Bonzini
    itv.it_value.tv_sec = 0;
943 db1a4972 Paolo Bonzini
    itv.it_value.tv_usec = 10 * 1000;
944 db1a4972 Paolo Bonzini
945 db1a4972 Paolo Bonzini
    err = setitimer(ITIMER_REAL, &itv, NULL);
946 db1a4972 Paolo Bonzini
    if (err)
947 db1a4972 Paolo Bonzini
        return -1;
948 db1a4972 Paolo Bonzini
949 db1a4972 Paolo Bonzini
    return 0;
950 db1a4972 Paolo Bonzini
}
951 db1a4972 Paolo Bonzini
952 db1a4972 Paolo Bonzini
static void unix_stop_timer(struct qemu_alarm_timer *t)
953 db1a4972 Paolo Bonzini
{
954 db1a4972 Paolo Bonzini
    struct itimerval itv;
955 db1a4972 Paolo Bonzini
956 db1a4972 Paolo Bonzini
    memset(&itv, 0, sizeof(itv));
957 db1a4972 Paolo Bonzini
    setitimer(ITIMER_REAL, &itv, NULL);
958 db1a4972 Paolo Bonzini
}
959 db1a4972 Paolo Bonzini
960 db1a4972 Paolo Bonzini
#endif /* !defined(_WIN32) */
961 db1a4972 Paolo Bonzini
962 db1a4972 Paolo Bonzini
963 db1a4972 Paolo Bonzini
#ifdef _WIN32
964 db1a4972 Paolo Bonzini
965 db1a4972 Paolo Bonzini
static int win32_start_timer(struct qemu_alarm_timer *t)
966 db1a4972 Paolo Bonzini
{
967 db1a4972 Paolo Bonzini
    TIMECAPS tc;
968 db1a4972 Paolo Bonzini
    struct qemu_alarm_win32 *data = t->priv;
969 db1a4972 Paolo Bonzini
    UINT flags;
970 db1a4972 Paolo Bonzini
971 db1a4972 Paolo Bonzini
    memset(&tc, 0, sizeof(tc));
972 db1a4972 Paolo Bonzini
    timeGetDevCaps(&tc, sizeof(tc));
973 db1a4972 Paolo Bonzini
974 db1a4972 Paolo Bonzini
    data->period = tc.wPeriodMin;
975 db1a4972 Paolo Bonzini
    timeBeginPeriod(data->period);
976 db1a4972 Paolo Bonzini
977 db1a4972 Paolo Bonzini
    flags = TIME_CALLBACK_FUNCTION;
978 db1a4972 Paolo Bonzini
    if (alarm_has_dynticks(t))
979 db1a4972 Paolo Bonzini
        flags |= TIME_ONESHOT;
980 db1a4972 Paolo Bonzini
    else
981 db1a4972 Paolo Bonzini
        flags |= TIME_PERIODIC;
982 db1a4972 Paolo Bonzini
983 db1a4972 Paolo Bonzini
    data->timerId = timeSetEvent(1,         // interval (ms)
984 db1a4972 Paolo Bonzini
                        data->period,       // resolution
985 db1a4972 Paolo Bonzini
                        host_alarm_handler, // function
986 db1a4972 Paolo Bonzini
                        (DWORD)t,           // parameter
987 db1a4972 Paolo Bonzini
                        flags);
988 db1a4972 Paolo Bonzini
989 db1a4972 Paolo Bonzini
    if (!data->timerId) {
990 db1a4972 Paolo Bonzini
        fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
991 db1a4972 Paolo Bonzini
                GetLastError());
992 db1a4972 Paolo Bonzini
        timeEndPeriod(data->period);
993 db1a4972 Paolo Bonzini
        return -1;
994 db1a4972 Paolo Bonzini
    }
995 db1a4972 Paolo Bonzini
996 db1a4972 Paolo Bonzini
    return 0;
997 db1a4972 Paolo Bonzini
}
998 db1a4972 Paolo Bonzini
999 db1a4972 Paolo Bonzini
static void win32_stop_timer(struct qemu_alarm_timer *t)
1000 db1a4972 Paolo Bonzini
{
1001 db1a4972 Paolo Bonzini
    struct qemu_alarm_win32 *data = t->priv;
1002 db1a4972 Paolo Bonzini
1003 db1a4972 Paolo Bonzini
    timeKillEvent(data->timerId);
1004 db1a4972 Paolo Bonzini
    timeEndPeriod(data->period);
1005 db1a4972 Paolo Bonzini
}
1006 db1a4972 Paolo Bonzini
1007 db1a4972 Paolo Bonzini
static void win32_rearm_timer(struct qemu_alarm_timer *t)
1008 db1a4972 Paolo Bonzini
{
1009 db1a4972 Paolo Bonzini
    struct qemu_alarm_win32 *data = t->priv;
1010 db1a4972 Paolo Bonzini
1011 db1a4972 Paolo Bonzini
    assert(alarm_has_dynticks(t));
1012 db1a4972 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
1013 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
1014 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
1015 db1a4972 Paolo Bonzini
        return;
1016 db1a4972 Paolo Bonzini
1017 db1a4972 Paolo Bonzini
    timeKillEvent(data->timerId);
1018 db1a4972 Paolo Bonzini
1019 db1a4972 Paolo Bonzini
    data->timerId = timeSetEvent(1,
1020 db1a4972 Paolo Bonzini
                        data->period,
1021 db1a4972 Paolo Bonzini
                        host_alarm_handler,
1022 db1a4972 Paolo Bonzini
                        (DWORD)t,
1023 db1a4972 Paolo Bonzini
                        TIME_ONESHOT | TIME_CALLBACK_FUNCTION);
1024 db1a4972 Paolo Bonzini
1025 db1a4972 Paolo Bonzini
    if (!data->timerId) {
1026 db1a4972 Paolo Bonzini
        fprintf(stderr, "Failed to re-arm win32 alarm timer %ld\n",
1027 db1a4972 Paolo Bonzini
                GetLastError());
1028 db1a4972 Paolo Bonzini
1029 db1a4972 Paolo Bonzini
        timeEndPeriod(data->period);
1030 db1a4972 Paolo Bonzini
        exit(1);
1031 db1a4972 Paolo Bonzini
    }
1032 db1a4972 Paolo Bonzini
}
1033 db1a4972 Paolo Bonzini
1034 db1a4972 Paolo Bonzini
#endif /* _WIN32 */
1035 db1a4972 Paolo Bonzini
1036 db1a4972 Paolo Bonzini
static void alarm_timer_on_change_state_rearm(void *opaque, int running, int reason)
1037 db1a4972 Paolo Bonzini
{
1038 db1a4972 Paolo Bonzini
    if (running)
1039 db1a4972 Paolo Bonzini
        qemu_rearm_alarm_timer((struct qemu_alarm_timer *) opaque);
1040 db1a4972 Paolo Bonzini
}
1041 db1a4972 Paolo Bonzini
1042 db1a4972 Paolo Bonzini
int init_timer_alarm(void)
1043 db1a4972 Paolo Bonzini
{
1044 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = NULL;
1045 db1a4972 Paolo Bonzini
    int i, err = -1;
1046 db1a4972 Paolo Bonzini
1047 db1a4972 Paolo Bonzini
    for (i = 0; alarm_timers[i].name; i++) {
1048 db1a4972 Paolo Bonzini
        t = &alarm_timers[i];
1049 db1a4972 Paolo Bonzini
1050 db1a4972 Paolo Bonzini
        err = t->start(t);
1051 db1a4972 Paolo Bonzini
        if (!err)
1052 db1a4972 Paolo Bonzini
            break;
1053 db1a4972 Paolo Bonzini
    }
1054 db1a4972 Paolo Bonzini
1055 db1a4972 Paolo Bonzini
    if (err) {
1056 db1a4972 Paolo Bonzini
        err = -ENOENT;
1057 db1a4972 Paolo Bonzini
        goto fail;
1058 db1a4972 Paolo Bonzini
    }
1059 db1a4972 Paolo Bonzini
1060 db1a4972 Paolo Bonzini
    /* first event is at time 0 */
1061 db1a4972 Paolo Bonzini
    t->pending = 1;
1062 db1a4972 Paolo Bonzini
    alarm_timer = t;
1063 db1a4972 Paolo Bonzini
    qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
1064 db1a4972 Paolo Bonzini
1065 db1a4972 Paolo Bonzini
    return 0;
1066 db1a4972 Paolo Bonzini
1067 db1a4972 Paolo Bonzini
fail:
1068 db1a4972 Paolo Bonzini
    return err;
1069 db1a4972 Paolo Bonzini
}
1070 db1a4972 Paolo Bonzini
1071 db1a4972 Paolo Bonzini
void quit_timers(void)
1072 db1a4972 Paolo Bonzini
{
1073 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = alarm_timer;
1074 db1a4972 Paolo Bonzini
    alarm_timer = NULL;
1075 db1a4972 Paolo Bonzini
    t->stop(t);
1076 db1a4972 Paolo Bonzini
}
1077 db1a4972 Paolo Bonzini
1078 db1a4972 Paolo Bonzini
int qemu_calculate_timeout(void)
1079 db1a4972 Paolo Bonzini
{
1080 db1a4972 Paolo Bonzini
#ifndef CONFIG_IOTHREAD
1081 db1a4972 Paolo Bonzini
    int timeout;
1082 db1a4972 Paolo Bonzini
1083 db1a4972 Paolo Bonzini
    if (!vm_running)
1084 db1a4972 Paolo Bonzini
        timeout = 5000;
1085 db1a4972 Paolo Bonzini
    else {
1086 db1a4972 Paolo Bonzini
     /* XXX: use timeout computed from timers */
1087 db1a4972 Paolo Bonzini
        int64_t add;
1088 db1a4972 Paolo Bonzini
        int64_t delta;
1089 db1a4972 Paolo Bonzini
        /* Advance virtual time to the next event.  */
1090 db1a4972 Paolo Bonzini
        delta = qemu_icount_delta();
1091 db1a4972 Paolo Bonzini
        if (delta > 0) {
1092 db1a4972 Paolo Bonzini
            /* If virtual time is ahead of real time then just
1093 db1a4972 Paolo Bonzini
               wait for IO.  */
1094 db1a4972 Paolo Bonzini
            timeout = (delta + 999999) / 1000000;
1095 db1a4972 Paolo Bonzini
        } else {
1096 db1a4972 Paolo Bonzini
            /* Wait for either IO to occur or the next
1097 db1a4972 Paolo Bonzini
               timer event.  */
1098 db1a4972 Paolo Bonzini
            add = qemu_next_deadline();
1099 db1a4972 Paolo Bonzini
            /* We advance the timer before checking for IO.
1100 db1a4972 Paolo Bonzini
               Limit the amount we advance so that early IO
1101 db1a4972 Paolo Bonzini
               activity won't get the guest too far ahead.  */
1102 db1a4972 Paolo Bonzini
            if (add > 10000000)
1103 db1a4972 Paolo Bonzini
                add = 10000000;
1104 db1a4972 Paolo Bonzini
            delta += add;
1105 db1a4972 Paolo Bonzini
            qemu_icount += qemu_icount_round (add);
1106 db1a4972 Paolo Bonzini
            timeout = delta / 1000000;
1107 db1a4972 Paolo Bonzini
            if (timeout < 0)
1108 db1a4972 Paolo Bonzini
                timeout = 0;
1109 db1a4972 Paolo Bonzini
        }
1110 db1a4972 Paolo Bonzini
    }
1111 db1a4972 Paolo Bonzini
1112 db1a4972 Paolo Bonzini
    return timeout;
1113 db1a4972 Paolo Bonzini
#else /* CONFIG_IOTHREAD */
1114 db1a4972 Paolo Bonzini
    return 1000;
1115 db1a4972 Paolo Bonzini
#endif
1116 db1a4972 Paolo Bonzini
}