Statistics
| Branch: | Revision:

root / qemu-timer.c @ c1568af5

History | View | Annotate | Download (29.4 kB)

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