Statistics
| Branch: | Revision:

root / qemu-timer.c @ 7e581fb3

History | View | Annotate | Download (29.9 kB)

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