Statistics
| Branch: | Revision:

root / qemu-timer.c @ 68c23e55

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