Statistics
| Branch: | Revision:

root / qemu-timer.c @ 39ac8455

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
};
157 db1a4972 Paolo Bonzini
158 db1a4972 Paolo Bonzini
struct QEMUTimer {
159 db1a4972 Paolo Bonzini
    QEMUClock *clock;
160 4a998740 Paolo Bonzini
    int64_t expire_time;        /* in nanoseconds */
161 4a998740 Paolo Bonzini
    int scale;
162 db1a4972 Paolo Bonzini
    QEMUTimerCB *cb;
163 db1a4972 Paolo Bonzini
    void *opaque;
164 db1a4972 Paolo Bonzini
    struct QEMUTimer *next;
165 db1a4972 Paolo Bonzini
};
166 db1a4972 Paolo Bonzini
167 db1a4972 Paolo Bonzini
struct qemu_alarm_timer {
168 db1a4972 Paolo Bonzini
    char const *name;
169 db1a4972 Paolo Bonzini
    int (*start)(struct qemu_alarm_timer *t);
170 db1a4972 Paolo Bonzini
    void (*stop)(struct qemu_alarm_timer *t);
171 db1a4972 Paolo Bonzini
    void (*rearm)(struct qemu_alarm_timer *t);
172 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 74475455 Paolo Bonzini
    cur_icount = qemu_get_clock_ns(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 7bd427d8 Paolo Bonzini
                   qemu_get_clock_ms(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 74475455 Paolo Bonzini
                   qemu_get_clock_ns(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 4a998740 Paolo Bonzini
QEMUTimer *qemu_new_timer(QEMUClock *clock, int scale,
390 4a998740 Paolo Bonzini
                          QEMUTimerCB *cb, void *opaque)
391 db1a4972 Paolo Bonzini
{
392 db1a4972 Paolo Bonzini
    QEMUTimer *ts;
393 db1a4972 Paolo Bonzini
394 db1a4972 Paolo Bonzini
    ts = qemu_mallocz(sizeof(QEMUTimer));
395 db1a4972 Paolo Bonzini
    ts->clock = clock;
396 db1a4972 Paolo Bonzini
    ts->cb = cb;
397 db1a4972 Paolo Bonzini
    ts->opaque = opaque;
398 4a998740 Paolo Bonzini
    ts->scale = scale;
399 db1a4972 Paolo Bonzini
    return ts;
400 db1a4972 Paolo Bonzini
}
401 db1a4972 Paolo Bonzini
402 db1a4972 Paolo Bonzini
void qemu_free_timer(QEMUTimer *ts)
403 db1a4972 Paolo Bonzini
{
404 db1a4972 Paolo Bonzini
    qemu_free(ts);
405 db1a4972 Paolo Bonzini
}
406 db1a4972 Paolo Bonzini
407 db1a4972 Paolo Bonzini
/* stop a timer, but do not dealloc it */
408 db1a4972 Paolo Bonzini
void qemu_del_timer(QEMUTimer *ts)
409 db1a4972 Paolo Bonzini
{
410 db1a4972 Paolo Bonzini
    QEMUTimer **pt, *t;
411 db1a4972 Paolo Bonzini
412 db1a4972 Paolo Bonzini
    /* NOTE: this code must be signal safe because
413 db1a4972 Paolo Bonzini
       qemu_timer_expired() can be called from a signal. */
414 db1a4972 Paolo Bonzini
    pt = &active_timers[ts->clock->type];
415 db1a4972 Paolo Bonzini
    for(;;) {
416 db1a4972 Paolo Bonzini
        t = *pt;
417 db1a4972 Paolo Bonzini
        if (!t)
418 db1a4972 Paolo Bonzini
            break;
419 db1a4972 Paolo Bonzini
        if (t == ts) {
420 db1a4972 Paolo Bonzini
            *pt = t->next;
421 db1a4972 Paolo Bonzini
            break;
422 db1a4972 Paolo Bonzini
        }
423 db1a4972 Paolo Bonzini
        pt = &t->next;
424 db1a4972 Paolo Bonzini
    }
425 db1a4972 Paolo Bonzini
}
426 db1a4972 Paolo Bonzini
427 db1a4972 Paolo Bonzini
/* modify the current timer so that it will be fired when current_time
428 db1a4972 Paolo Bonzini
   >= expire_time. The corresponding callback will be called. */
429 4a998740 Paolo Bonzini
static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
430 db1a4972 Paolo Bonzini
{
431 db1a4972 Paolo Bonzini
    QEMUTimer **pt, *t;
432 db1a4972 Paolo Bonzini
433 db1a4972 Paolo Bonzini
    qemu_del_timer(ts);
434 db1a4972 Paolo Bonzini
435 db1a4972 Paolo Bonzini
    /* add the timer in the sorted list */
436 db1a4972 Paolo Bonzini
    /* NOTE: this code must be signal safe because
437 db1a4972 Paolo Bonzini
       qemu_timer_expired() can be called from a signal. */
438 db1a4972 Paolo Bonzini
    pt = &active_timers[ts->clock->type];
439 db1a4972 Paolo Bonzini
    for(;;) {
440 db1a4972 Paolo Bonzini
        t = *pt;
441 db1a4972 Paolo Bonzini
        if (!t)
442 db1a4972 Paolo Bonzini
            break;
443 db1a4972 Paolo Bonzini
        if (t->expire_time > expire_time)
444 db1a4972 Paolo Bonzini
            break;
445 db1a4972 Paolo Bonzini
        pt = &t->next;
446 db1a4972 Paolo Bonzini
    }
447 db1a4972 Paolo Bonzini
    ts->expire_time = expire_time;
448 db1a4972 Paolo Bonzini
    ts->next = *pt;
449 db1a4972 Paolo Bonzini
    *pt = ts;
450 db1a4972 Paolo Bonzini
451 db1a4972 Paolo Bonzini
    /* Rearm if necessary  */
452 db1a4972 Paolo Bonzini
    if (pt == &active_timers[ts->clock->type]) {
453 db1a4972 Paolo Bonzini
        if (!alarm_timer->pending) {
454 db1a4972 Paolo Bonzini
            qemu_rearm_alarm_timer(alarm_timer);
455 db1a4972 Paolo Bonzini
        }
456 db1a4972 Paolo Bonzini
        /* Interrupt execution to force deadline recalculation.  */
457 db1a4972 Paolo Bonzini
        if (use_icount)
458 db1a4972 Paolo Bonzini
            qemu_notify_event();
459 db1a4972 Paolo Bonzini
    }
460 db1a4972 Paolo Bonzini
}
461 db1a4972 Paolo Bonzini
462 4a998740 Paolo Bonzini
/* modify the current timer so that it will be fired when current_time
463 4a998740 Paolo Bonzini
   >= expire_time. The corresponding callback will be called. */
464 4a998740 Paolo Bonzini
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
465 4a998740 Paolo Bonzini
{
466 4a998740 Paolo Bonzini
    qemu_mod_timer_ns(ts, expire_time * ts->scale);
467 4a998740 Paolo Bonzini
}
468 4a998740 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 4a998740 Paolo Bonzini
    return (timer_head->expire_time <= current_time * timer_head->scale);
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 4a998740 Paolo Bonzini
    current_time = qemu_get_clock_ns(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_ns(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();
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
void init_clocks(void)
527 db1a4972 Paolo Bonzini
{
528 db1a4972 Paolo Bonzini
    rt_clock = qemu_new_clock(QEMU_CLOCK_REALTIME);
529 db1a4972 Paolo Bonzini
    vm_clock = qemu_new_clock(QEMU_CLOCK_VIRTUAL);
530 db1a4972 Paolo Bonzini
    host_clock = qemu_new_clock(QEMU_CLOCK_HOST);
531 db1a4972 Paolo Bonzini
532 db1a4972 Paolo Bonzini
    rtc_clock = host_clock;
533 db1a4972 Paolo Bonzini
}
534 db1a4972 Paolo Bonzini
535 db1a4972 Paolo Bonzini
/* save a timer */
536 db1a4972 Paolo Bonzini
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
537 db1a4972 Paolo Bonzini
{
538 db1a4972 Paolo Bonzini
    uint64_t expire_time;
539 db1a4972 Paolo Bonzini
540 db1a4972 Paolo Bonzini
    if (qemu_timer_pending(ts)) {
541 db1a4972 Paolo Bonzini
        expire_time = ts->expire_time;
542 db1a4972 Paolo Bonzini
    } else {
543 db1a4972 Paolo Bonzini
        expire_time = -1;
544 db1a4972 Paolo Bonzini
    }
545 db1a4972 Paolo Bonzini
    qemu_put_be64(f, expire_time);
546 db1a4972 Paolo Bonzini
}
547 db1a4972 Paolo Bonzini
548 db1a4972 Paolo Bonzini
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
549 db1a4972 Paolo Bonzini
{
550 db1a4972 Paolo Bonzini
    uint64_t expire_time;
551 db1a4972 Paolo Bonzini
552 db1a4972 Paolo Bonzini
    expire_time = qemu_get_be64(f);
553 db1a4972 Paolo Bonzini
    if (expire_time != -1) {
554 4a998740 Paolo Bonzini
        qemu_mod_timer_ns(ts, expire_time);
555 db1a4972 Paolo Bonzini
    } else {
556 db1a4972 Paolo Bonzini
        qemu_del_timer(ts);
557 db1a4972 Paolo Bonzini
    }
558 db1a4972 Paolo Bonzini
}
559 db1a4972 Paolo Bonzini
560 db1a4972 Paolo Bonzini
static const VMStateDescription vmstate_timers = {
561 db1a4972 Paolo Bonzini
    .name = "timer",
562 db1a4972 Paolo Bonzini
    .version_id = 2,
563 db1a4972 Paolo Bonzini
    .minimum_version_id = 1,
564 db1a4972 Paolo Bonzini
    .minimum_version_id_old = 1,
565 db1a4972 Paolo Bonzini
    .fields      = (VMStateField []) {
566 db1a4972 Paolo Bonzini
        VMSTATE_INT64(cpu_ticks_offset, TimersState),
567 db1a4972 Paolo Bonzini
        VMSTATE_INT64(dummy, TimersState),
568 db1a4972 Paolo Bonzini
        VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
569 db1a4972 Paolo Bonzini
        VMSTATE_END_OF_LIST()
570 db1a4972 Paolo Bonzini
    }
571 db1a4972 Paolo Bonzini
};
572 db1a4972 Paolo Bonzini
573 db1a4972 Paolo Bonzini
void configure_icount(const char *option)
574 db1a4972 Paolo Bonzini
{
575 0be71e32 Alex Williamson
    vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
576 db1a4972 Paolo Bonzini
    if (!option)
577 db1a4972 Paolo Bonzini
        return;
578 db1a4972 Paolo Bonzini
579 db1a4972 Paolo Bonzini
    if (strcmp(option, "auto") != 0) {
580 db1a4972 Paolo Bonzini
        icount_time_shift = strtol(option, NULL, 0);
581 db1a4972 Paolo Bonzini
        use_icount = 1;
582 db1a4972 Paolo Bonzini
        return;
583 db1a4972 Paolo Bonzini
    }
584 db1a4972 Paolo Bonzini
585 db1a4972 Paolo Bonzini
    use_icount = 2;
586 db1a4972 Paolo Bonzini
587 db1a4972 Paolo Bonzini
    /* 125MIPS seems a reasonable initial guess at the guest speed.
588 db1a4972 Paolo Bonzini
       It will be corrected fairly quickly anyway.  */
589 db1a4972 Paolo Bonzini
    icount_time_shift = 3;
590 db1a4972 Paolo Bonzini
591 db1a4972 Paolo Bonzini
    /* Have both realtime and virtual time triggers for speed adjustment.
592 db1a4972 Paolo Bonzini
       The realtime trigger catches emulated time passing too slowly,
593 db1a4972 Paolo Bonzini
       the virtual time trigger catches emulated time passing too fast.
594 db1a4972 Paolo Bonzini
       Realtime triggers occur even when idle, so use them less frequently
595 db1a4972 Paolo Bonzini
       than VM triggers.  */
596 7bd427d8 Paolo Bonzini
    icount_rt_timer = qemu_new_timer_ms(rt_clock, icount_adjust_rt, NULL);
597 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_rt_timer,
598 7bd427d8 Paolo Bonzini
                   qemu_get_clock_ms(rt_clock) + 1000);
599 74475455 Paolo Bonzini
    icount_vm_timer = qemu_new_timer_ns(vm_clock, icount_adjust_vm, NULL);
600 db1a4972 Paolo Bonzini
    qemu_mod_timer(icount_vm_timer,
601 74475455 Paolo Bonzini
                   qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 10);
602 db1a4972 Paolo Bonzini
}
603 db1a4972 Paolo Bonzini
604 db1a4972 Paolo Bonzini
void qemu_run_all_timers(void)
605 db1a4972 Paolo Bonzini
{
606 ca5a2a4b Paolo Bonzini
    alarm_timer->pending = 0;
607 ca5a2a4b Paolo Bonzini
608 db1a4972 Paolo Bonzini
    /* rearm timer, if not periodic */
609 db1a4972 Paolo Bonzini
    if (alarm_timer->expired) {
610 db1a4972 Paolo Bonzini
        alarm_timer->expired = 0;
611 db1a4972 Paolo Bonzini
        qemu_rearm_alarm_timer(alarm_timer);
612 db1a4972 Paolo Bonzini
    }
613 db1a4972 Paolo Bonzini
614 db1a4972 Paolo Bonzini
    /* vm time timers */
615 db1a4972 Paolo Bonzini
    if (vm_running) {
616 db1a4972 Paolo Bonzini
        qemu_run_timers(vm_clock);
617 db1a4972 Paolo Bonzini
    }
618 db1a4972 Paolo Bonzini
619 db1a4972 Paolo Bonzini
    qemu_run_timers(rt_clock);
620 db1a4972 Paolo Bonzini
    qemu_run_timers(host_clock);
621 db1a4972 Paolo Bonzini
}
622 db1a4972 Paolo Bonzini
623 4c3d45eb Paolo Bonzini
static int64_t qemu_next_alarm_deadline(void);
624 4c3d45eb Paolo Bonzini
625 db1a4972 Paolo Bonzini
#ifdef _WIN32
626 68c23e55 Paolo Bonzini
static void CALLBACK host_alarm_handler(PVOID lpParam, BOOLEAN unused)
627 db1a4972 Paolo Bonzini
#else
628 db1a4972 Paolo Bonzini
static void host_alarm_handler(int host_signum)
629 db1a4972 Paolo Bonzini
#endif
630 db1a4972 Paolo Bonzini
{
631 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = alarm_timer;
632 db1a4972 Paolo Bonzini
    if (!t)
633 db1a4972 Paolo Bonzini
        return;
634 db1a4972 Paolo Bonzini
635 db1a4972 Paolo Bonzini
#if 0
636 db1a4972 Paolo Bonzini
#define DISP_FREQ 1000
637 db1a4972 Paolo Bonzini
    {
638 db1a4972 Paolo Bonzini
        static int64_t delta_min = INT64_MAX;
639 db1a4972 Paolo Bonzini
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
640 db1a4972 Paolo Bonzini
        static int count;
641 74475455 Paolo Bonzini
        ti = qemu_get_clock_ns(vm_clock);
642 db1a4972 Paolo Bonzini
        if (last_clock != 0) {
643 db1a4972 Paolo Bonzini
            delta = ti - last_clock;
644 db1a4972 Paolo Bonzini
            if (delta < delta_min)
645 db1a4972 Paolo Bonzini
                delta_min = delta;
646 db1a4972 Paolo Bonzini
            if (delta > delta_max)
647 db1a4972 Paolo Bonzini
                delta_max = delta;
648 db1a4972 Paolo Bonzini
            delta_cum += delta;
649 db1a4972 Paolo Bonzini
            if (++count == DISP_FREQ) {
650 db1a4972 Paolo Bonzini
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
651 db1a4972 Paolo Bonzini
                       muldiv64(delta_min, 1000000, get_ticks_per_sec()),
652 db1a4972 Paolo Bonzini
                       muldiv64(delta_max, 1000000, get_ticks_per_sec()),
653 db1a4972 Paolo Bonzini
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, get_ticks_per_sec()),
654 db1a4972 Paolo Bonzini
                       (double)get_ticks_per_sec() / ((double)delta_cum / DISP_FREQ));
655 db1a4972 Paolo Bonzini
                count = 0;
656 db1a4972 Paolo Bonzini
                delta_min = INT64_MAX;
657 db1a4972 Paolo Bonzini
                delta_max = 0;
658 db1a4972 Paolo Bonzini
                delta_cum = 0;
659 db1a4972 Paolo Bonzini
            }
660 db1a4972 Paolo Bonzini
        }
661 db1a4972 Paolo Bonzini
        last_clock = ti;
662 db1a4972 Paolo Bonzini
    }
663 db1a4972 Paolo Bonzini
#endif
664 db1a4972 Paolo Bonzini
    if (alarm_has_dynticks(t) ||
665 4c3d45eb Paolo Bonzini
        qemu_next_alarm_deadline () <= 0) {
666 db1a4972 Paolo Bonzini
        t->expired = alarm_has_dynticks(t);
667 db1a4972 Paolo Bonzini
        t->pending = 1;
668 db1a4972 Paolo Bonzini
        qemu_notify_event();
669 db1a4972 Paolo Bonzini
    }
670 db1a4972 Paolo Bonzini
}
671 db1a4972 Paolo Bonzini
672 db1a4972 Paolo Bonzini
int64_t qemu_next_deadline(void)
673 db1a4972 Paolo Bonzini
{
674 db1a4972 Paolo Bonzini
    /* To avoid problems with overflow limit this to 2^32.  */
675 db1a4972 Paolo Bonzini
    int64_t delta = INT32_MAX;
676 db1a4972 Paolo Bonzini
677 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_VIRTUAL]) {
678 db1a4972 Paolo Bonzini
        delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
679 9c13246a Paolo Bonzini
                     qemu_get_clock_ns(vm_clock);
680 db1a4972 Paolo Bonzini
    }
681 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_HOST]) {
682 db1a4972 Paolo Bonzini
        int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time -
683 9c13246a Paolo Bonzini
                 qemu_get_clock_ns(host_clock);
684 db1a4972 Paolo Bonzini
        if (hdelta < delta)
685 db1a4972 Paolo Bonzini
            delta = hdelta;
686 db1a4972 Paolo Bonzini
    }
687 db1a4972 Paolo Bonzini
688 db1a4972 Paolo Bonzini
    if (delta < 0)
689 db1a4972 Paolo Bonzini
        delta = 0;
690 db1a4972 Paolo Bonzini
691 db1a4972 Paolo Bonzini
    return delta;
692 db1a4972 Paolo Bonzini
}
693 db1a4972 Paolo Bonzini
694 4c3d45eb Paolo Bonzini
static int64_t qemu_next_alarm_deadline(void)
695 db1a4972 Paolo Bonzini
{
696 db1a4972 Paolo Bonzini
    int64_t delta;
697 db1a4972 Paolo Bonzini
    int64_t rtdelta;
698 db1a4972 Paolo Bonzini
699 6ad0a1ed Paolo Bonzini
    if (!use_icount && active_timers[QEMU_CLOCK_VIRTUAL]) {
700 6ad0a1ed Paolo Bonzini
        delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
701 74475455 Paolo Bonzini
                     qemu_get_clock_ns(vm_clock);
702 6ad0a1ed Paolo Bonzini
    } else {
703 db1a4972 Paolo Bonzini
        delta = INT32_MAX;
704 6ad0a1ed Paolo Bonzini
    }
705 6ad0a1ed Paolo Bonzini
    if (active_timers[QEMU_CLOCK_HOST]) {
706 6ad0a1ed Paolo Bonzini
        int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time -
707 6ad0a1ed Paolo Bonzini
                 qemu_get_clock_ns(host_clock);
708 6ad0a1ed Paolo Bonzini
        if (hdelta < delta)
709 6ad0a1ed Paolo Bonzini
            delta = hdelta;
710 6ad0a1ed Paolo Bonzini
    }
711 db1a4972 Paolo Bonzini
    if (active_timers[QEMU_CLOCK_REALTIME]) {
712 4a998740 Paolo Bonzini
        rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time -
713 9c13246a Paolo Bonzini
                 qemu_get_clock_ns(rt_clock));
714 db1a4972 Paolo Bonzini
        if (rtdelta < delta)
715 db1a4972 Paolo Bonzini
            delta = rtdelta;
716 db1a4972 Paolo Bonzini
    }
717 db1a4972 Paolo Bonzini
718 db1a4972 Paolo Bonzini
    return delta;
719 db1a4972 Paolo Bonzini
}
720 db1a4972 Paolo Bonzini
721 4c3d45eb Paolo Bonzini
#if defined(__linux__)
722 4c3d45eb Paolo Bonzini
723 4c3d45eb Paolo Bonzini
#define RTC_FREQ 1024
724 4c3d45eb Paolo Bonzini
725 db1a4972 Paolo Bonzini
static void enable_sigio_timer(int fd)
726 db1a4972 Paolo Bonzini
{
727 db1a4972 Paolo Bonzini
    struct sigaction act;
728 db1a4972 Paolo Bonzini
729 db1a4972 Paolo Bonzini
    /* timer signal */
730 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
731 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
732 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
733 db1a4972 Paolo Bonzini
734 db1a4972 Paolo Bonzini
    sigaction(SIGIO, &act, NULL);
735 db1a4972 Paolo Bonzini
    fcntl_setfl(fd, O_ASYNC);
736 db1a4972 Paolo Bonzini
    fcntl(fd, F_SETOWN, getpid());
737 db1a4972 Paolo Bonzini
}
738 db1a4972 Paolo Bonzini
739 db1a4972 Paolo Bonzini
static int hpet_start_timer(struct qemu_alarm_timer *t)
740 db1a4972 Paolo Bonzini
{
741 db1a4972 Paolo Bonzini
    struct hpet_info info;
742 db1a4972 Paolo Bonzini
    int r, fd;
743 db1a4972 Paolo Bonzini
744 db1a4972 Paolo Bonzini
    fd = qemu_open("/dev/hpet", O_RDONLY);
745 db1a4972 Paolo Bonzini
    if (fd < 0)
746 db1a4972 Paolo Bonzini
        return -1;
747 db1a4972 Paolo Bonzini
748 db1a4972 Paolo Bonzini
    /* Set frequency */
749 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
750 db1a4972 Paolo Bonzini
    if (r < 0) {
751 db1a4972 Paolo Bonzini
        fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
752 db1a4972 Paolo Bonzini
                "error, but for better emulation accuracy type:\n"
753 db1a4972 Paolo Bonzini
                "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
754 db1a4972 Paolo Bonzini
        goto fail;
755 db1a4972 Paolo Bonzini
    }
756 db1a4972 Paolo Bonzini
757 db1a4972 Paolo Bonzini
    /* Check capabilities */
758 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_INFO, &info);
759 db1a4972 Paolo Bonzini
    if (r < 0)
760 db1a4972 Paolo Bonzini
        goto fail;
761 db1a4972 Paolo Bonzini
762 db1a4972 Paolo Bonzini
    /* Enable periodic mode */
763 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_EPI, 0);
764 db1a4972 Paolo Bonzini
    if (info.hi_flags && (r < 0))
765 db1a4972 Paolo Bonzini
        goto fail;
766 db1a4972 Paolo Bonzini
767 db1a4972 Paolo Bonzini
    /* Enable interrupt */
768 db1a4972 Paolo Bonzini
    r = ioctl(fd, HPET_IE_ON, 0);
769 db1a4972 Paolo Bonzini
    if (r < 0)
770 db1a4972 Paolo Bonzini
        goto fail;
771 db1a4972 Paolo Bonzini
772 db1a4972 Paolo Bonzini
    enable_sigio_timer(fd);
773 db1a4972 Paolo Bonzini
    t->priv = (void *)(long)fd;
774 db1a4972 Paolo Bonzini
775 db1a4972 Paolo Bonzini
    return 0;
776 db1a4972 Paolo Bonzini
fail:
777 db1a4972 Paolo Bonzini
    close(fd);
778 db1a4972 Paolo Bonzini
    return -1;
779 db1a4972 Paolo Bonzini
}
780 db1a4972 Paolo Bonzini
781 db1a4972 Paolo Bonzini
static void hpet_stop_timer(struct qemu_alarm_timer *t)
782 db1a4972 Paolo Bonzini
{
783 db1a4972 Paolo Bonzini
    int fd = (long)t->priv;
784 db1a4972 Paolo Bonzini
785 db1a4972 Paolo Bonzini
    close(fd);
786 db1a4972 Paolo Bonzini
}
787 db1a4972 Paolo Bonzini
788 db1a4972 Paolo Bonzini
static int rtc_start_timer(struct qemu_alarm_timer *t)
789 db1a4972 Paolo Bonzini
{
790 db1a4972 Paolo Bonzini
    int rtc_fd;
791 db1a4972 Paolo Bonzini
    unsigned long current_rtc_freq = 0;
792 db1a4972 Paolo Bonzini
793 db1a4972 Paolo Bonzini
    TFR(rtc_fd = qemu_open("/dev/rtc", O_RDONLY));
794 db1a4972 Paolo Bonzini
    if (rtc_fd < 0)
795 db1a4972 Paolo Bonzini
        return -1;
796 db1a4972 Paolo Bonzini
    ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
797 db1a4972 Paolo Bonzini
    if (current_rtc_freq != RTC_FREQ &&
798 db1a4972 Paolo Bonzini
        ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
799 db1a4972 Paolo Bonzini
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
800 db1a4972 Paolo Bonzini
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
801 db1a4972 Paolo Bonzini
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
802 db1a4972 Paolo Bonzini
        goto fail;
803 db1a4972 Paolo Bonzini
    }
804 db1a4972 Paolo Bonzini
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
805 db1a4972 Paolo Bonzini
    fail:
806 db1a4972 Paolo Bonzini
        close(rtc_fd);
807 db1a4972 Paolo Bonzini
        return -1;
808 db1a4972 Paolo Bonzini
    }
809 db1a4972 Paolo Bonzini
810 db1a4972 Paolo Bonzini
    enable_sigio_timer(rtc_fd);
811 db1a4972 Paolo Bonzini
812 db1a4972 Paolo Bonzini
    t->priv = (void *)(long)rtc_fd;
813 db1a4972 Paolo Bonzini
814 db1a4972 Paolo Bonzini
    return 0;
815 db1a4972 Paolo Bonzini
}
816 db1a4972 Paolo Bonzini
817 db1a4972 Paolo Bonzini
static void rtc_stop_timer(struct qemu_alarm_timer *t)
818 db1a4972 Paolo Bonzini
{
819 db1a4972 Paolo Bonzini
    int rtc_fd = (long)t->priv;
820 db1a4972 Paolo Bonzini
821 db1a4972 Paolo Bonzini
    close(rtc_fd);
822 db1a4972 Paolo Bonzini
}
823 db1a4972 Paolo Bonzini
824 db1a4972 Paolo Bonzini
static int dynticks_start_timer(struct qemu_alarm_timer *t)
825 db1a4972 Paolo Bonzini
{
826 db1a4972 Paolo Bonzini
    struct sigevent ev;
827 db1a4972 Paolo Bonzini
    timer_t host_timer;
828 db1a4972 Paolo Bonzini
    struct sigaction act;
829 db1a4972 Paolo Bonzini
830 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
831 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
832 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
833 db1a4972 Paolo Bonzini
834 db1a4972 Paolo Bonzini
    sigaction(SIGALRM, &act, NULL);
835 db1a4972 Paolo Bonzini
836 db1a4972 Paolo Bonzini
    /* 
837 db1a4972 Paolo Bonzini
     * Initialize ev struct to 0 to avoid valgrind complaining
838 db1a4972 Paolo Bonzini
     * about uninitialized data in timer_create call
839 db1a4972 Paolo Bonzini
     */
840 db1a4972 Paolo Bonzini
    memset(&ev, 0, sizeof(ev));
841 db1a4972 Paolo Bonzini
    ev.sigev_value.sival_int = 0;
842 db1a4972 Paolo Bonzini
    ev.sigev_notify = SIGEV_SIGNAL;
843 db1a4972 Paolo Bonzini
    ev.sigev_signo = SIGALRM;
844 db1a4972 Paolo Bonzini
845 db1a4972 Paolo Bonzini
    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
846 db1a4972 Paolo Bonzini
        perror("timer_create");
847 db1a4972 Paolo Bonzini
848 db1a4972 Paolo Bonzini
        /* disable dynticks */
849 db1a4972 Paolo Bonzini
        fprintf(stderr, "Dynamic Ticks disabled\n");
850 db1a4972 Paolo Bonzini
851 db1a4972 Paolo Bonzini
        return -1;
852 db1a4972 Paolo Bonzini
    }
853 db1a4972 Paolo Bonzini
854 db1a4972 Paolo Bonzini
    t->priv = (void *)(long)host_timer;
855 db1a4972 Paolo Bonzini
856 db1a4972 Paolo Bonzini
    return 0;
857 db1a4972 Paolo Bonzini
}
858 db1a4972 Paolo Bonzini
859 db1a4972 Paolo Bonzini
static void dynticks_stop_timer(struct qemu_alarm_timer *t)
860 db1a4972 Paolo Bonzini
{
861 db1a4972 Paolo Bonzini
    timer_t host_timer = (timer_t)(long)t->priv;
862 db1a4972 Paolo Bonzini
863 db1a4972 Paolo Bonzini
    timer_delete(host_timer);
864 db1a4972 Paolo Bonzini
}
865 db1a4972 Paolo Bonzini
866 db1a4972 Paolo Bonzini
static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
867 db1a4972 Paolo Bonzini
{
868 db1a4972 Paolo Bonzini
    timer_t host_timer = (timer_t)(long)t->priv;
869 db1a4972 Paolo Bonzini
    struct itimerspec timeout;
870 9c13246a Paolo Bonzini
    int64_t nearest_delta_ns = INT64_MAX;
871 9c13246a Paolo Bonzini
    int64_t current_ns;
872 db1a4972 Paolo Bonzini
873 db1a4972 Paolo Bonzini
    assert(alarm_has_dynticks(t));
874 db1a4972 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
875 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
876 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
877 db1a4972 Paolo Bonzini
        return;
878 db1a4972 Paolo Bonzini
879 4c3d45eb Paolo Bonzini
    nearest_delta_ns = qemu_next_alarm_deadline();
880 4c3d45eb Paolo Bonzini
    if (nearest_delta_ns < MIN_TIMER_REARM_NS)
881 4c3d45eb Paolo Bonzini
        nearest_delta_ns = MIN_TIMER_REARM_NS;
882 db1a4972 Paolo Bonzini
883 db1a4972 Paolo Bonzini
    /* check whether a timer is already running */
884 db1a4972 Paolo Bonzini
    if (timer_gettime(host_timer, &timeout)) {
885 db1a4972 Paolo Bonzini
        perror("gettime");
886 db1a4972 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
887 db1a4972 Paolo Bonzini
        exit(1);
888 db1a4972 Paolo Bonzini
    }
889 9c13246a Paolo Bonzini
    current_ns = timeout.it_value.tv_sec * 1000000000LL + timeout.it_value.tv_nsec;
890 9c13246a Paolo Bonzini
    if (current_ns && current_ns <= nearest_delta_ns)
891 db1a4972 Paolo Bonzini
        return;
892 db1a4972 Paolo Bonzini
893 db1a4972 Paolo Bonzini
    timeout.it_interval.tv_sec = 0;
894 db1a4972 Paolo Bonzini
    timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
895 9c13246a Paolo Bonzini
    timeout.it_value.tv_sec =  nearest_delta_ns / 1000000000;
896 9c13246a Paolo Bonzini
    timeout.it_value.tv_nsec = nearest_delta_ns % 1000000000;
897 db1a4972 Paolo Bonzini
    if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
898 db1a4972 Paolo Bonzini
        perror("settime");
899 db1a4972 Paolo Bonzini
        fprintf(stderr, "Internal timer error: aborting\n");
900 db1a4972 Paolo Bonzini
        exit(1);
901 db1a4972 Paolo Bonzini
    }
902 db1a4972 Paolo Bonzini
}
903 db1a4972 Paolo Bonzini
904 db1a4972 Paolo Bonzini
#endif /* defined(__linux__) */
905 db1a4972 Paolo Bonzini
906 f26e5a54 Stefan Weil
#if !defined(_WIN32)
907 f26e5a54 Stefan Weil
908 db1a4972 Paolo Bonzini
static int unix_start_timer(struct qemu_alarm_timer *t)
909 db1a4972 Paolo Bonzini
{
910 db1a4972 Paolo Bonzini
    struct sigaction act;
911 db1a4972 Paolo Bonzini
    struct itimerval itv;
912 db1a4972 Paolo Bonzini
    int err;
913 db1a4972 Paolo Bonzini
914 db1a4972 Paolo Bonzini
    /* timer signal */
915 db1a4972 Paolo Bonzini
    sigfillset(&act.sa_mask);
916 db1a4972 Paolo Bonzini
    act.sa_flags = 0;
917 db1a4972 Paolo Bonzini
    act.sa_handler = host_alarm_handler;
918 db1a4972 Paolo Bonzini
919 db1a4972 Paolo Bonzini
    sigaction(SIGALRM, &act, NULL);
920 db1a4972 Paolo Bonzini
921 db1a4972 Paolo Bonzini
    itv.it_interval.tv_sec = 0;
922 db1a4972 Paolo Bonzini
    /* for i386 kernel 2.6 to get 1 ms */
923 db1a4972 Paolo Bonzini
    itv.it_interval.tv_usec = 999;
924 db1a4972 Paolo Bonzini
    itv.it_value.tv_sec = 0;
925 db1a4972 Paolo Bonzini
    itv.it_value.tv_usec = 10 * 1000;
926 db1a4972 Paolo Bonzini
927 db1a4972 Paolo Bonzini
    err = setitimer(ITIMER_REAL, &itv, NULL);
928 db1a4972 Paolo Bonzini
    if (err)
929 db1a4972 Paolo Bonzini
        return -1;
930 db1a4972 Paolo Bonzini
931 db1a4972 Paolo Bonzini
    return 0;
932 db1a4972 Paolo Bonzini
}
933 db1a4972 Paolo Bonzini
934 db1a4972 Paolo Bonzini
static void unix_stop_timer(struct qemu_alarm_timer *t)
935 db1a4972 Paolo Bonzini
{
936 db1a4972 Paolo Bonzini
    struct itimerval itv;
937 db1a4972 Paolo Bonzini
938 db1a4972 Paolo Bonzini
    memset(&itv, 0, sizeof(itv));
939 db1a4972 Paolo Bonzini
    setitimer(ITIMER_REAL, &itv, NULL);
940 db1a4972 Paolo Bonzini
}
941 db1a4972 Paolo Bonzini
942 db1a4972 Paolo Bonzini
#endif /* !defined(_WIN32) */
943 db1a4972 Paolo Bonzini
944 db1a4972 Paolo Bonzini
945 db1a4972 Paolo Bonzini
#ifdef _WIN32
946 db1a4972 Paolo Bonzini
947 db1a4972 Paolo Bonzini
static int win32_start_timer(struct qemu_alarm_timer *t)
948 db1a4972 Paolo Bonzini
{
949 68c23e55 Paolo Bonzini
    HANDLE hTimer;
950 68c23e55 Paolo Bonzini
    BOOLEAN success;
951 68c23e55 Paolo Bonzini
952 68c23e55 Paolo Bonzini
    /* If you call ChangeTimerQueueTimer on a one-shot timer (its period
953 68c23e55 Paolo Bonzini
       is zero) that has already expired, the timer is not updated.  Since
954 68c23e55 Paolo Bonzini
       creating a new timer is relatively expensive, set a bogus one-hour
955 68c23e55 Paolo Bonzini
       interval in the dynticks case.  */
956 68c23e55 Paolo Bonzini
    success = CreateTimerQueueTimer(&hTimer,
957 68c23e55 Paolo Bonzini
                          NULL,
958 68c23e55 Paolo Bonzini
                          host_alarm_handler,
959 68c23e55 Paolo Bonzini
                          t,
960 68c23e55 Paolo Bonzini
                          1,
961 68c23e55 Paolo Bonzini
                          alarm_has_dynticks(t) ? 3600000 : 1,
962 68c23e55 Paolo Bonzini
                          WT_EXECUTEINTIMERTHREAD);
963 68c23e55 Paolo Bonzini
964 68c23e55 Paolo Bonzini
    if (!success) {
965 db1a4972 Paolo Bonzini
        fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
966 db1a4972 Paolo Bonzini
                GetLastError());
967 db1a4972 Paolo Bonzini
        return -1;
968 db1a4972 Paolo Bonzini
    }
969 db1a4972 Paolo Bonzini
970 68c23e55 Paolo Bonzini
    t->priv = (PVOID) hTimer;
971 db1a4972 Paolo Bonzini
    return 0;
972 db1a4972 Paolo Bonzini
}
973 db1a4972 Paolo Bonzini
974 db1a4972 Paolo Bonzini
static void win32_stop_timer(struct qemu_alarm_timer *t)
975 db1a4972 Paolo Bonzini
{
976 68c23e55 Paolo Bonzini
    HANDLE hTimer = t->priv;
977 db1a4972 Paolo Bonzini
978 68c23e55 Paolo Bonzini
    if (hTimer) {
979 68c23e55 Paolo Bonzini
        DeleteTimerQueueTimer(NULL, hTimer, NULL);
980 68c23e55 Paolo Bonzini
    }
981 db1a4972 Paolo Bonzini
}
982 db1a4972 Paolo Bonzini
983 db1a4972 Paolo Bonzini
static void win32_rearm_timer(struct qemu_alarm_timer *t)
984 db1a4972 Paolo Bonzini
{
985 68c23e55 Paolo Bonzini
    HANDLE hTimer = t->priv;
986 cfced5b2 Paolo Bonzini
    int nearest_delta_ms;
987 68c23e55 Paolo Bonzini
    BOOLEAN success;
988 db1a4972 Paolo Bonzini
989 db1a4972 Paolo Bonzini
    assert(alarm_has_dynticks(t));
990 db1a4972 Paolo Bonzini
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
991 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
992 db1a4972 Paolo Bonzini
        !active_timers[QEMU_CLOCK_HOST])
993 db1a4972 Paolo Bonzini
        return;
994 db1a4972 Paolo Bonzini
995 cfced5b2 Paolo Bonzini
    nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
996 cfced5b2 Paolo Bonzini
    if (nearest_delta_ms < 1) {
997 cfced5b2 Paolo Bonzini
        nearest_delta_ms = 1;
998 cfced5b2 Paolo Bonzini
    }
999 68c23e55 Paolo Bonzini
    success = ChangeTimerQueueTimer(NULL,
1000 68c23e55 Paolo Bonzini
                                    hTimer,
1001 68c23e55 Paolo Bonzini
                                    nearest_delta_ms,
1002 68c23e55 Paolo Bonzini
                                    3600000);
1003 db1a4972 Paolo Bonzini
1004 68c23e55 Paolo Bonzini
    if (!success) {
1005 68c23e55 Paolo Bonzini
        fprintf(stderr, "Failed to rearm win32 alarm timer: %ld\n",
1006 68c23e55 Paolo Bonzini
                GetLastError());
1007 68c23e55 Paolo Bonzini
        exit(-1);
1008 db1a4972 Paolo Bonzini
    }
1009 68c23e55 Paolo Bonzini
1010 db1a4972 Paolo Bonzini
}
1011 db1a4972 Paolo Bonzini
1012 db1a4972 Paolo Bonzini
#endif /* _WIN32 */
1013 db1a4972 Paolo Bonzini
1014 db1a4972 Paolo Bonzini
static void alarm_timer_on_change_state_rearm(void *opaque, int running, int reason)
1015 db1a4972 Paolo Bonzini
{
1016 db1a4972 Paolo Bonzini
    if (running)
1017 db1a4972 Paolo Bonzini
        qemu_rearm_alarm_timer((struct qemu_alarm_timer *) opaque);
1018 db1a4972 Paolo Bonzini
}
1019 db1a4972 Paolo Bonzini
1020 db1a4972 Paolo Bonzini
int init_timer_alarm(void)
1021 db1a4972 Paolo Bonzini
{
1022 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = NULL;
1023 db1a4972 Paolo Bonzini
    int i, err = -1;
1024 db1a4972 Paolo Bonzini
1025 db1a4972 Paolo Bonzini
    for (i = 0; alarm_timers[i].name; i++) {
1026 db1a4972 Paolo Bonzini
        t = &alarm_timers[i];
1027 db1a4972 Paolo Bonzini
1028 db1a4972 Paolo Bonzini
        err = t->start(t);
1029 db1a4972 Paolo Bonzini
        if (!err)
1030 db1a4972 Paolo Bonzini
            break;
1031 db1a4972 Paolo Bonzini
    }
1032 db1a4972 Paolo Bonzini
1033 db1a4972 Paolo Bonzini
    if (err) {
1034 db1a4972 Paolo Bonzini
        err = -ENOENT;
1035 db1a4972 Paolo Bonzini
        goto fail;
1036 db1a4972 Paolo Bonzini
    }
1037 db1a4972 Paolo Bonzini
1038 db1a4972 Paolo Bonzini
    /* first event is at time 0 */
1039 db1a4972 Paolo Bonzini
    t->pending = 1;
1040 db1a4972 Paolo Bonzini
    alarm_timer = t;
1041 db1a4972 Paolo Bonzini
    qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
1042 db1a4972 Paolo Bonzini
1043 db1a4972 Paolo Bonzini
    return 0;
1044 db1a4972 Paolo Bonzini
1045 db1a4972 Paolo Bonzini
fail:
1046 db1a4972 Paolo Bonzini
    return err;
1047 db1a4972 Paolo Bonzini
}
1048 db1a4972 Paolo Bonzini
1049 db1a4972 Paolo Bonzini
void quit_timers(void)
1050 db1a4972 Paolo Bonzini
{
1051 db1a4972 Paolo Bonzini
    struct qemu_alarm_timer *t = alarm_timer;
1052 db1a4972 Paolo Bonzini
    alarm_timer = NULL;
1053 db1a4972 Paolo Bonzini
    t->stop(t);
1054 db1a4972 Paolo Bonzini
}
1055 db1a4972 Paolo Bonzini
1056 db1a4972 Paolo Bonzini
int qemu_calculate_timeout(void)
1057 db1a4972 Paolo Bonzini
{
1058 db1a4972 Paolo Bonzini
    int timeout;
1059 c9f7383c Paolo Bonzini
    int64_t add;
1060 c9f7383c Paolo Bonzini
    int64_t delta;
1061 db1a4972 Paolo Bonzini
1062 225d02cd Edgar E. Iglesias
    /* When using icount, making forward progress with qemu_icount when the
1063 225d02cd Edgar E. Iglesias
       guest CPU is idle is critical. We only use the static io-thread timeout
1064 225d02cd Edgar E. Iglesias
       for non icount runs.  */
1065 c9f7383c Paolo Bonzini
    if (!use_icount || !vm_running) {
1066 c9f7383c Paolo Bonzini
        return 5000;
1067 225d02cd Edgar E. Iglesias
    }
1068 225d02cd Edgar E. Iglesias
1069 c9f7383c Paolo Bonzini
    /* Advance virtual time to the next event.  */
1070 c9f7383c Paolo Bonzini
    delta = qemu_icount_delta();
1071 c9f7383c Paolo Bonzini
    if (delta > 0) {
1072 c9f7383c Paolo Bonzini
        /* If virtual time is ahead of real time then just
1073 c9f7383c Paolo Bonzini
           wait for IO.  */
1074 c9f7383c Paolo Bonzini
        timeout = (delta + 999999) / 1000000;
1075 c9f7383c Paolo Bonzini
    } else {
1076 c9f7383c Paolo Bonzini
        /* Wait for either IO to occur or the next
1077 c9f7383c Paolo Bonzini
           timer event.  */
1078 c9f7383c Paolo Bonzini
        add = qemu_next_deadline();
1079 c9f7383c Paolo Bonzini
        /* We advance the timer before checking for IO.
1080 c9f7383c Paolo Bonzini
           Limit the amount we advance so that early IO
1081 c9f7383c Paolo Bonzini
           activity won't get the guest too far ahead.  */
1082 c9f7383c Paolo Bonzini
        if (add > 10000000)
1083 c9f7383c Paolo Bonzini
            add = 10000000;
1084 c9f7383c Paolo Bonzini
        delta += add;
1085 c9f7383c Paolo Bonzini
        qemu_icount += qemu_icount_round (add);
1086 c9f7383c Paolo Bonzini
        timeout = delta / 1000000;
1087 c9f7383c Paolo Bonzini
        if (timeout < 0)
1088 c9f7383c Paolo Bonzini
            timeout = 0;
1089 db1a4972 Paolo Bonzini
    }
1090 db1a4972 Paolo Bonzini
1091 db1a4972 Paolo Bonzini
    return timeout;
1092 db1a4972 Paolo Bonzini
}