Statistics
| Branch: | Revision:

root / vl.c @ bc578fe0

History | View | Annotate | Download (153.7 kB)

1 0824d6fc bellard
/*
2 80cabfad bellard
 * QEMU System Emulator
3 5fafdf24 ths
 *
4 68d0f70e bellard
 * Copyright (c) 2003-2008 Fabrice Bellard
5 5fafdf24 ths
 *
6 1df912cf bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 1df912cf bellard
 * of this software and associated documentation files (the "Software"), to deal
8 1df912cf bellard
 * in the Software without restriction, including without limitation the rights
9 1df912cf bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 1df912cf bellard
 * copies of the Software, and to permit persons to whom the Software is
11 1df912cf bellard
 * furnished to do so, subject to the following conditions:
12 1df912cf bellard
 *
13 1df912cf bellard
 * The above copyright notice and this permission notice shall be included in
14 1df912cf bellard
 * all copies or substantial portions of the Software.
15 1df912cf bellard
 *
16 1df912cf bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 1df912cf bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 1df912cf bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 1df912cf bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 1df912cf bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 1df912cf bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 1df912cf bellard
 * THE SOFTWARE.
23 0824d6fc bellard
 */
24 0824d6fc bellard
#include <unistd.h>
25 0824d6fc bellard
#include <fcntl.h>
26 0824d6fc bellard
#include <signal.h>
27 0824d6fc bellard
#include <time.h>
28 0824d6fc bellard
#include <errno.h>
29 67b915a5 bellard
#include <sys/time.h>
30 c88676f8 bellard
#include <zlib.h>
31 67b915a5 bellard
32 71e72a19 Juan Quintela
/* Needed early for CONFIG_BSD etc. */
33 d40cdb10 blueswir1
#include "config-host.h"
34 d40cdb10 blueswir1
35 67b915a5 bellard
#ifndef _WIN32
36 5cea8590 Paul Brook
#include <libgen.h>
37 0858532e aliguori
#include <pwd.h>
38 67b915a5 bellard
#include <sys/times.h>
39 f1510b2c bellard
#include <sys/wait.h>
40 67b915a5 bellard
#include <termios.h>
41 67b915a5 bellard
#include <sys/mman.h>
42 f1510b2c bellard
#include <sys/ioctl.h>
43 24646c7e blueswir1
#include <sys/resource.h>
44 f1510b2c bellard
#include <sys/socket.h>
45 c94c8d64 bellard
#include <netinet/in.h>
46 24646c7e blueswir1
#include <net/if.h>
47 24646c7e blueswir1
#if defined(__NetBSD__)
48 24646c7e blueswir1
#include <net/if_tap.h>
49 24646c7e blueswir1
#endif
50 24646c7e blueswir1
#ifdef __linux__
51 24646c7e blueswir1
#include <linux/if_tun.h>
52 24646c7e blueswir1
#endif
53 24646c7e blueswir1
#include <arpa/inet.h>
54 9d728e8c bellard
#include <dirent.h>
55 7c9d8e07 bellard
#include <netdb.h>
56 cb4b976b ths
#include <sys/select.h>
57 71e72a19 Juan Quintela
#ifdef CONFIG_BSD
58 7d3505c5 bellard
#include <sys/stat.h>
59 c5e97233 blueswir1
#if defined(__FreeBSD__) || defined(__DragonFly__)
60 7d3505c5 bellard
#include <libutil.h>
61 24646c7e blueswir1
#else
62 24646c7e blueswir1
#include <util.h>
63 128ab2ff blueswir1
#endif
64 5c40d2bd ths
#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
65 5c40d2bd ths
#include <freebsd/stdlib.h>
66 7d3505c5 bellard
#else
67 223f0d72 blueswir1
#ifdef __linux__
68 7d3505c5 bellard
#include <pty.h>
69 7d3505c5 bellard
#include <malloc.h>
70 fd872598 bellard
#include <linux/rtc.h>
71 1889465a Andi Kleen
#include <sys/prctl.h>
72 bd494f4c ths
73 bd494f4c ths
/* For the benefit of older linux systems which don't supply it,
74 bd494f4c ths
   we use a local copy of hpet.h. */
75 bd494f4c ths
/* #include <linux/hpet.h> */
76 bd494f4c ths
#include "hpet.h"
77 bd494f4c ths
78 e57a8c0e bellard
#include <linux/ppdev.h>
79 5867c88a ths
#include <linux/parport.h>
80 223f0d72 blueswir1
#endif
81 223f0d72 blueswir1
#ifdef __sun__
82 d5d10bc3 ths
#include <sys/stat.h>
83 d5d10bc3 ths
#include <sys/ethernet.h>
84 d5d10bc3 ths
#include <sys/sockio.h>
85 d5d10bc3 ths
#include <netinet/arp.h>
86 d5d10bc3 ths
#include <netinet/in.h>
87 d5d10bc3 ths
#include <netinet/in_systm.h>
88 d5d10bc3 ths
#include <netinet/ip.h>
89 d5d10bc3 ths
#include <netinet/ip_icmp.h> // must come after ip.h
90 d5d10bc3 ths
#include <netinet/udp.h>
91 d5d10bc3 ths
#include <netinet/tcp.h>
92 d5d10bc3 ths
#include <net/if.h>
93 d5d10bc3 ths
#include <syslog.h>
94 d5d10bc3 ths
#include <stropts.h>
95 8d32cf0e Blue Swirl
/* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for
96 8d32cf0e Blue Swirl
   discussion about Solaris header problems */
97 8d32cf0e Blue Swirl
extern int madvise(caddr_t, size_t, int);
98 67b915a5 bellard
#endif
99 7d3505c5 bellard
#endif
100 ec530c81 bellard
#endif
101 67b915a5 bellard
102 9892fbfb blueswir1
#if defined(__OpenBSD__)
103 9892fbfb blueswir1
#include <util.h>
104 9892fbfb blueswir1
#endif
105 9892fbfb blueswir1
106 8a16d273 ths
#if defined(CONFIG_VDE)
107 8a16d273 ths
#include <libvdeplug.h>
108 8a16d273 ths
#endif
109 8a16d273 ths
110 67b915a5 bellard
#ifdef _WIN32
111 49dc768d aliguori
#include <windows.h>
112 4fddf62a ths
#include <mmsystem.h>
113 67b915a5 bellard
#endif
114 67b915a5 bellard
115 73332e5c bellard
#ifdef CONFIG_SDL
116 59a36a2f Stefan Weil
#if defined(__APPLE__) || defined(main)
117 6693665a Stefan Weil
#include <SDL.h>
118 880fec5d malc
int qemu_main(int argc, char **argv, char **envp);
119 880fec5d malc
int main(int argc, char **argv)
120 880fec5d malc
{
121 59a36a2f Stefan Weil
    return qemu_main(argc, argv, NULL);
122 880fec5d malc
}
123 880fec5d malc
#undef main
124 880fec5d malc
#define main qemu_main
125 96bcd4f8 bellard
#endif
126 73332e5c bellard
#endif /* CONFIG_SDL */
127 0824d6fc bellard
128 5b0753e0 bellard
#ifdef CONFIG_COCOA
129 5b0753e0 bellard
#undef main
130 5b0753e0 bellard
#define main qemu_main
131 5b0753e0 bellard
#endif /* CONFIG_COCOA */
132 5b0753e0 bellard
133 511d2b14 blueswir1
#include "hw/hw.h"
134 511d2b14 blueswir1
#include "hw/boards.h"
135 511d2b14 blueswir1
#include "hw/usb.h"
136 511d2b14 blueswir1
#include "hw/pcmcia.h"
137 511d2b14 blueswir1
#include "hw/pc.h"
138 511d2b14 blueswir1
#include "hw/audiodev.h"
139 511d2b14 blueswir1
#include "hw/isa.h"
140 511d2b14 blueswir1
#include "hw/baum.h"
141 511d2b14 blueswir1
#include "hw/bt.h"
142 9dd986cc Richard W.M. Jones
#include "hw/watchdog.h"
143 b6f6e3d3 aliguori
#include "hw/smbios.h"
144 e37630ca aliguori
#include "hw/xen.h"
145 bd3c948d Gerd Hoffmann
#include "hw/qdev.h"
146 45a50b16 Gerd Hoffmann
#include "hw/loader.h"
147 5ef4efa4 aurel32
#include "bt-host.h"
148 511d2b14 blueswir1
#include "net.h"
149 511d2b14 blueswir1
#include "monitor.h"
150 511d2b14 blueswir1
#include "console.h"
151 511d2b14 blueswir1
#include "sysemu.h"
152 511d2b14 blueswir1
#include "gdbstub.h"
153 511d2b14 blueswir1
#include "qemu-timer.h"
154 511d2b14 blueswir1
#include "qemu-char.h"
155 511d2b14 blueswir1
#include "cache-utils.h"
156 511d2b14 blueswir1
#include "block.h"
157 a718acec blueswir1
#include "dma.h"
158 511d2b14 blueswir1
#include "audio/audio.h"
159 511d2b14 blueswir1
#include "migration.h"
160 511d2b14 blueswir1
#include "kvm.h"
161 511d2b14 blueswir1
#include "balloon.h"
162 d3f24367 Kevin Wolf
#include "qemu-option.h"
163 7282a033 Gerd Hoffmann
#include "qemu-config.h"
164 511d2b14 blueswir1
165 0824d6fc bellard
#include "disas.h"
166 fc01f7e7 bellard
167 8a7ddc38 bellard
#include "exec-all.h"
168 0824d6fc bellard
169 511d2b14 blueswir1
#include "qemu_socket.h"
170 511d2b14 blueswir1
171 d918f23e Jan Kiszka
#include "slirp/libslirp.h"
172 511d2b14 blueswir1
173 72cf2d4f Blue Swirl
#include "qemu-queue.h"
174 72cf2d4f Blue Swirl
175 9dc63a1e blueswir1
//#define DEBUG_NET
176 9dc63a1e blueswir1
//#define DEBUG_SLIRP
177 330d0414 bellard
178 1bfe856e bellard
#define DEFAULT_RAM_SIZE 128
179 313aa567 bellard
180 ddd9bbd9 Jan Kiszka
/* Maximum number of monitor devices */
181 ddd9bbd9 Jan Kiszka
#define MAX_MONITOR_DEVICES 10
182 ddd9bbd9 Jan Kiszka
183 5cea8590 Paul Brook
static const char *data_dir;
184 1192dad8 j_mayer
const char *bios_name = NULL;
185 e4bcb14c ths
/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
186 faea38e7 bellard
   to store the VM snapshots */
187 72cf2d4f Blue Swirl
struct drivelist drives = QTAILQ_HEAD_INITIALIZER(drives);
188 72cf2d4f Blue Swirl
struct driveoptlist driveopts = QTAILQ_HEAD_INITIALIZER(driveopts);
189 cb5a7aa8 malc
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
190 3023f332 aliguori
static DisplayState *display_state;
191 993fbfdb Anthony Liguori
DisplayType display_type = DT_DEFAULT;
192 3d11d0eb bellard
const char* keyboard_layout = NULL;
193 c227f099 Anthony Liguori
ram_addr_t ram_size;
194 c4b1fcc0 bellard
int nb_nics;
195 7c9d8e07 bellard
NICInfo nd_table[MAX_NICS];
196 8a7ddc38 bellard
int vm_running;
197 d399f677 Paolo Bonzini
int autostart;
198 f6503059 balrog
static int rtc_utc = 1;
199 f6503059 balrog
static int rtc_date_offset = -1; /* -1 means no change */
200 6875204c Jan Kiszka
QEMUClock *rtc_clock;
201 86176759 Zachary Amsden
int vga_interface_type = VGA_CIRRUS;
202 d827220b bellard
#ifdef TARGET_SPARC
203 d827220b bellard
int graphic_width = 1024;
204 d827220b bellard
int graphic_height = 768;
205 eee0b836 blueswir1
int graphic_depth = 8;
206 d827220b bellard
#else
207 1bfe856e bellard
int graphic_width = 800;
208 1bfe856e bellard
int graphic_height = 600;
209 e9b137c2 bellard
int graphic_depth = 15;
210 eee0b836 blueswir1
#endif
211 dbed7e40 blueswir1
static int full_screen = 0;
212 634a21f6 blueswir1
#ifdef CONFIG_SDL
213 dbed7e40 blueswir1
static int no_frame = 0;
214 634a21f6 blueswir1
#endif
215 667accab ths
int no_quit = 0;
216 8d11df9e bellard
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
217 6508fe59 bellard
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
218 9ede2fde aliguori
CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
219 a09db21f bellard
#ifdef TARGET_I386
220 a09db21f bellard
int win2k_install_hack = 0;
221 73822ec8 aliguori
int rtc_td_hack = 0;
222 a09db21f bellard
#endif
223 bb36d470 bellard
int usb_enabled = 0;
224 1b530a6d aurel32
int singlestep = 0;
225 6a00d601 bellard
int smp_cpus = 1;
226 6be68d7e Jes Sorensen
int max_cpus = 0;
227 dc6b1c09 Andre Przywara
int smp_cores = 1;
228 dc6b1c09 Andre Przywara
int smp_threads = 1;
229 73fc9742 ths
const char *vnc_display;
230 6515b203 bellard
int acpi_enabled = 1;
231 16b29ae1 aliguori
int no_hpet = 0;
232 52ca8d6a bellard
int fd_bootchk = 1;
233 d1beab82 bellard
int no_reboot = 0;
234 b2f76161 aurel32
int no_shutdown = 0;
235 9467cd46 balrog
int cursor_hide = 1;
236 a171fe39 balrog
int graphic_rotate = 0;
237 6b35e7bf Jes Sorensen
uint8_t irq0override = 1;
238 b9e82a59 blueswir1
#ifndef _WIN32
239 71e3ceb8 ths
int daemonize = 0;
240 b9e82a59 blueswir1
#endif
241 09aaa160 Markus Armbruster
const char *watchdog;
242 9ae02555 ths
const char *option_rom[MAX_OPTION_ROMS];
243 9ae02555 ths
int nb_option_roms;
244 8e71621f pbrook
int semihosting_enabled = 0;
245 2b8f2d41 balrog
#ifdef TARGET_ARM
246 2b8f2d41 balrog
int old_param = 0;
247 2b8f2d41 balrog
#endif
248 c35734b2 ths
const char *qemu_name;
249 3780e197 ths
int alt_grab = 0;
250 0ca9f8a4 Dustin Kirkland
int ctrl_grab = 0;
251 95efd11c blueswir1
#if defined(TARGET_SPARC) || defined(TARGET_PPC)
252 66508601 blueswir1
unsigned int nb_prom_envs = 0;
253 66508601 blueswir1
const char *prom_envs[MAX_PROM_ENVS];
254 66508601 blueswir1
#endif
255 95387491 Jan Kiszka
int boot_menu;
256 0824d6fc bellard
257 268a362c aliguori
int nb_numa_nodes;
258 268a362c aliguori
uint64_t node_mem[MAX_NODES];
259 268a362c aliguori
uint64_t node_cpumask[MAX_NODES];
260 268a362c aliguori
261 ee5605e5 balrog
static CPUState *cur_cpu;
262 ee5605e5 balrog
static CPUState *next_cpu;
263 43b96858 aliguori
static int timer_alarm_pending = 1;
264 bf20dc07 ths
/* Conversion factor from emulated instructions to virtual clock ticks.  */
265 2e70f6ef pbrook
static int icount_time_shift;
266 bf20dc07 ths
/* Arbitrarily pick 1MIPS as the minimum allowable speed.  */
267 2e70f6ef pbrook
#define MAX_ICOUNT_SHIFT 10
268 2e70f6ef pbrook
/* Compensate for varying guest execution speed.  */
269 2e70f6ef pbrook
static int64_t qemu_icount_bias;
270 dbed7e40 blueswir1
static QEMUTimer *icount_rt_timer;
271 dbed7e40 blueswir1
static QEMUTimer *icount_vm_timer;
272 9043b62d blueswir1
static QEMUTimer *nographic_timer;
273 ee5605e5 balrog
274 8fcb1b90 blueswir1
uint8_t qemu_uuid[16];
275 8fcb1b90 blueswir1
276 76e30d0f Jan Kiszka
static QEMUBootSetHandler *boot_set_handler;
277 76e30d0f Jan Kiszka
static void *boot_set_opaque;
278 76e30d0f Jan Kiszka
279 0824d6fc bellard
/***********************************************************/
280 26aa7d72 bellard
/* x86 ISA bus support */
281 26aa7d72 bellard
282 c227f099 Anthony Liguori
target_phys_addr_t isa_mem_base = 0;
283 3de388f6 bellard
PicState2 *isa_pic;
284 0824d6fc bellard
285 0824d6fc bellard
/***********************************************************/
286 0824d6fc bellard
void hw_error(const char *fmt, ...)
287 0824d6fc bellard
{
288 0824d6fc bellard
    va_list ap;
289 6a00d601 bellard
    CPUState *env;
290 0824d6fc bellard
291 0824d6fc bellard
    va_start(ap, fmt);
292 0824d6fc bellard
    fprintf(stderr, "qemu: hardware error: ");
293 0824d6fc bellard
    vfprintf(stderr, fmt, ap);
294 0824d6fc bellard
    fprintf(stderr, "\n");
295 6a00d601 bellard
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
296 6a00d601 bellard
        fprintf(stderr, "CPU #%d:\n", env->cpu_index);
297 0824d6fc bellard
#ifdef TARGET_I386
298 6a00d601 bellard
        cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
299 c45886db bellard
#else
300 6a00d601 bellard
        cpu_dump_state(env, stderr, fprintf, 0);
301 0824d6fc bellard
#endif
302 6a00d601 bellard
    }
303 0824d6fc bellard
    va_end(ap);
304 0824d6fc bellard
    abort();
305 0824d6fc bellard
}
306 1889465a Andi Kleen
307 1889465a Andi Kleen
static void set_proc_name(const char *s)
308 1889465a Andi Kleen
{
309 6ca8d0fd Nathan Froyd
#if defined(__linux__) && defined(PR_SET_NAME)
310 1889465a Andi Kleen
    char name[16];
311 1889465a Andi Kleen
    if (!s)
312 1889465a Andi Kleen
        return;
313 1889465a Andi Kleen
    name[sizeof(name) - 1] = 0;
314 1889465a Andi Kleen
    strncpy(name, s, sizeof(name));
315 1889465a Andi Kleen
    /* Could rewrite argv[0] too, but that's a bit more complicated.
316 1889465a Andi Kleen
       This simple way is enough for `top'. */
317 1889465a Andi Kleen
    prctl(PR_SET_NAME, name);
318 1889465a Andi Kleen
#endif            
319 1889465a Andi Kleen
}
320 df751fa8 aliguori
 
321 df751fa8 aliguori
/***************/
322 df751fa8 aliguori
/* ballooning */
323 df751fa8 aliguori
324 df751fa8 aliguori
static QEMUBalloonEvent *qemu_balloon_event;
325 df751fa8 aliguori
void *qemu_balloon_event_opaque;
326 df751fa8 aliguori
327 df751fa8 aliguori
void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque)
328 df751fa8 aliguori
{
329 df751fa8 aliguori
    qemu_balloon_event = func;
330 df751fa8 aliguori
    qemu_balloon_event_opaque = opaque;
331 df751fa8 aliguori
}
332 df751fa8 aliguori
333 c227f099 Anthony Liguori
void qemu_balloon(ram_addr_t target)
334 df751fa8 aliguori
{
335 df751fa8 aliguori
    if (qemu_balloon_event)
336 df751fa8 aliguori
        qemu_balloon_event(qemu_balloon_event_opaque, target);
337 df751fa8 aliguori
}
338 df751fa8 aliguori
339 c227f099 Anthony Liguori
ram_addr_t qemu_balloon_status(void)
340 df751fa8 aliguori
{
341 df751fa8 aliguori
    if (qemu_balloon_event)
342 df751fa8 aliguori
        return qemu_balloon_event(qemu_balloon_event_opaque, 0);
343 df751fa8 aliguori
    return 0;
344 df751fa8 aliguori
}
345 0824d6fc bellard
346 8a7ddc38 bellard
/***********************************************************/
347 63066f4f bellard
/* keyboard/mouse */
348 63066f4f bellard
349 63066f4f bellard
static QEMUPutKBDEvent *qemu_put_kbd_event;
350 63066f4f bellard
static void *qemu_put_kbd_event_opaque;
351 455204eb ths
static QEMUPutMouseEntry *qemu_put_mouse_event_head;
352 455204eb ths
static QEMUPutMouseEntry *qemu_put_mouse_event_current;
353 63066f4f bellard
354 63066f4f bellard
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
355 63066f4f bellard
{
356 63066f4f bellard
    qemu_put_kbd_event_opaque = opaque;
357 63066f4f bellard
    qemu_put_kbd_event = func;
358 63066f4f bellard
}
359 63066f4f bellard
360 455204eb ths
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
361 455204eb ths
                                                void *opaque, int absolute,
362 455204eb ths
                                                const char *name)
363 63066f4f bellard
{
364 455204eb ths
    QEMUPutMouseEntry *s, *cursor;
365 455204eb ths
366 455204eb ths
    s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
367 455204eb ths
368 455204eb ths
    s->qemu_put_mouse_event = func;
369 455204eb ths
    s->qemu_put_mouse_event_opaque = opaque;
370 455204eb ths
    s->qemu_put_mouse_event_absolute = absolute;
371 455204eb ths
    s->qemu_put_mouse_event_name = qemu_strdup(name);
372 455204eb ths
    s->next = NULL;
373 455204eb ths
374 455204eb ths
    if (!qemu_put_mouse_event_head) {
375 455204eb ths
        qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
376 455204eb ths
        return s;
377 455204eb ths
    }
378 455204eb ths
379 455204eb ths
    cursor = qemu_put_mouse_event_head;
380 455204eb ths
    while (cursor->next != NULL)
381 455204eb ths
        cursor = cursor->next;
382 455204eb ths
383 455204eb ths
    cursor->next = s;
384 455204eb ths
    qemu_put_mouse_event_current = s;
385 455204eb ths
386 455204eb ths
    return s;
387 455204eb ths
}
388 455204eb ths
389 455204eb ths
void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
390 455204eb ths
{
391 455204eb ths
    QEMUPutMouseEntry *prev = NULL, *cursor;
392 455204eb ths
393 455204eb ths
    if (!qemu_put_mouse_event_head || entry == NULL)
394 455204eb ths
        return;
395 455204eb ths
396 455204eb ths
    cursor = qemu_put_mouse_event_head;
397 455204eb ths
    while (cursor != NULL && cursor != entry) {
398 455204eb ths
        prev = cursor;
399 455204eb ths
        cursor = cursor->next;
400 455204eb ths
    }
401 455204eb ths
402 455204eb ths
    if (cursor == NULL) // does not exist or list empty
403 455204eb ths
        return;
404 455204eb ths
    else if (prev == NULL) { // entry is head
405 455204eb ths
        qemu_put_mouse_event_head = cursor->next;
406 455204eb ths
        if (qemu_put_mouse_event_current == entry)
407 455204eb ths
            qemu_put_mouse_event_current = cursor->next;
408 455204eb ths
        qemu_free(entry->qemu_put_mouse_event_name);
409 455204eb ths
        qemu_free(entry);
410 455204eb ths
        return;
411 455204eb ths
    }
412 455204eb ths
413 455204eb ths
    prev->next = entry->next;
414 455204eb ths
415 455204eb ths
    if (qemu_put_mouse_event_current == entry)
416 455204eb ths
        qemu_put_mouse_event_current = prev;
417 455204eb ths
418 455204eb ths
    qemu_free(entry->qemu_put_mouse_event_name);
419 455204eb ths
    qemu_free(entry);
420 63066f4f bellard
}
421 63066f4f bellard
422 63066f4f bellard
void kbd_put_keycode(int keycode)
423 63066f4f bellard
{
424 63066f4f bellard
    if (qemu_put_kbd_event) {
425 63066f4f bellard
        qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
426 63066f4f bellard
    }
427 63066f4f bellard
}
428 63066f4f bellard
429 63066f4f bellard
void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
430 63066f4f bellard
{
431 455204eb ths
    QEMUPutMouseEvent *mouse_event;
432 455204eb ths
    void *mouse_event_opaque;
433 a171fe39 balrog
    int width;
434 455204eb ths
435 455204eb ths
    if (!qemu_put_mouse_event_current) {
436 455204eb ths
        return;
437 455204eb ths
    }
438 455204eb ths
439 455204eb ths
    mouse_event =
440 455204eb ths
        qemu_put_mouse_event_current->qemu_put_mouse_event;
441 455204eb ths
    mouse_event_opaque =
442 455204eb ths
        qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
443 455204eb ths
444 455204eb ths
    if (mouse_event) {
445 a171fe39 balrog
        if (graphic_rotate) {
446 a171fe39 balrog
            if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
447 a171fe39 balrog
                width = 0x7fff;
448 a171fe39 balrog
            else
449 b94ed577 aurel32
                width = graphic_width - 1;
450 a171fe39 balrog
            mouse_event(mouse_event_opaque,
451 a171fe39 balrog
                                 width - dy, dx, dz, buttons_state);
452 a171fe39 balrog
        } else
453 a171fe39 balrog
            mouse_event(mouse_event_opaque,
454 a171fe39 balrog
                                 dx, dy, dz, buttons_state);
455 63066f4f bellard
    }
456 63066f4f bellard
}
457 63066f4f bellard
458 09b26c5e bellard
int kbd_mouse_is_absolute(void)
459 09b26c5e bellard
{
460 455204eb ths
    if (!qemu_put_mouse_event_current)
461 455204eb ths
        return 0;
462 455204eb ths
463 455204eb ths
    return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
464 455204eb ths
}
465 455204eb ths
466 376253ec aliguori
void do_info_mice(Monitor *mon)
467 455204eb ths
{
468 455204eb ths
    QEMUPutMouseEntry *cursor;
469 455204eb ths
    int index = 0;
470 455204eb ths
471 455204eb ths
    if (!qemu_put_mouse_event_head) {
472 376253ec aliguori
        monitor_printf(mon, "No mouse devices connected\n");
473 455204eb ths
        return;
474 455204eb ths
    }
475 455204eb ths
476 376253ec aliguori
    monitor_printf(mon, "Mouse devices available:\n");
477 455204eb ths
    cursor = qemu_put_mouse_event_head;
478 455204eb ths
    while (cursor != NULL) {
479 376253ec aliguori
        monitor_printf(mon, "%c Mouse #%d: %s\n",
480 376253ec aliguori
                       (cursor == qemu_put_mouse_event_current ? '*' : ' '),
481 376253ec aliguori
                       index, cursor->qemu_put_mouse_event_name);
482 455204eb ths
        index++;
483 455204eb ths
        cursor = cursor->next;
484 455204eb ths
    }
485 455204eb ths
}
486 455204eb ths
487 d54908a5 Luiz Capitulino
void do_mouse_set(Monitor *mon, const QDict *qdict)
488 455204eb ths
{
489 455204eb ths
    QEMUPutMouseEntry *cursor;
490 455204eb ths
    int i = 0;
491 d54908a5 Luiz Capitulino
    int index = qdict_get_int(qdict, "index");
492 455204eb ths
493 455204eb ths
    if (!qemu_put_mouse_event_head) {
494 376253ec aliguori
        monitor_printf(mon, "No mouse devices connected\n");
495 455204eb ths
        return;
496 455204eb ths
    }
497 455204eb ths
498 455204eb ths
    cursor = qemu_put_mouse_event_head;
499 455204eb ths
    while (cursor != NULL && index != i) {
500 455204eb ths
        i++;
501 455204eb ths
        cursor = cursor->next;
502 455204eb ths
    }
503 455204eb ths
504 455204eb ths
    if (cursor != NULL)
505 455204eb ths
        qemu_put_mouse_event_current = cursor;
506 455204eb ths
    else
507 376253ec aliguori
        monitor_printf(mon, "Mouse at given index not found\n");
508 09b26c5e bellard
}
509 09b26c5e bellard
510 1dce7c3c bellard
/* compute with 96 bit intermediate result: (a*b)/c */
511 1dce7c3c bellard
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
512 0824d6fc bellard
{
513 1dce7c3c bellard
    union {
514 1dce7c3c bellard
        uint64_t ll;
515 1dce7c3c bellard
        struct {
516 e2542fe2 Juan Quintela
#ifdef HOST_WORDS_BIGENDIAN
517 1dce7c3c bellard
            uint32_t high, low;
518 1dce7c3c bellard
#else
519 1dce7c3c bellard
            uint32_t low, high;
520 3b46e624 ths
#endif
521 1dce7c3c bellard
        } l;
522 1dce7c3c bellard
    } u, res;
523 1dce7c3c bellard
    uint64_t rl, rh;
524 0824d6fc bellard
525 1dce7c3c bellard
    u.ll = a;
526 1dce7c3c bellard
    rl = (uint64_t)u.l.low * (uint64_t)b;
527 1dce7c3c bellard
    rh = (uint64_t)u.l.high * (uint64_t)b;
528 1dce7c3c bellard
    rh += (rl >> 32);
529 1dce7c3c bellard
    res.l.high = rh / c;
530 1dce7c3c bellard
    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
531 1dce7c3c bellard
    return res.ll;
532 34865134 bellard
}
533 34865134 bellard
534 1dce7c3c bellard
/***********************************************************/
535 1dce7c3c bellard
/* real time host monotonic timer */
536 34865134 bellard
537 21d5d12b Jan Kiszka
static int64_t get_clock_realtime(void)
538 21d5d12b Jan Kiszka
{
539 21d5d12b Jan Kiszka
    struct timeval tv;
540 21d5d12b Jan Kiszka
541 21d5d12b Jan Kiszka
    gettimeofday(&tv, NULL);
542 21d5d12b Jan Kiszka
    return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
543 21d5d12b Jan Kiszka
}
544 21d5d12b Jan Kiszka
545 1dce7c3c bellard
#ifdef WIN32
546 0824d6fc bellard
547 1dce7c3c bellard
static int64_t clock_freq;
548 1115dde7 bellard
549 1dce7c3c bellard
static void init_get_clock(void)
550 1115dde7 bellard
{
551 a8e5ac33 bellard
    LARGE_INTEGER freq;
552 a8e5ac33 bellard
    int ret;
553 1dce7c3c bellard
    ret = QueryPerformanceFrequency(&freq);
554 1dce7c3c bellard
    if (ret == 0) {
555 1dce7c3c bellard
        fprintf(stderr, "Could not calibrate ticks\n");
556 1dce7c3c bellard
        exit(1);
557 1dce7c3c bellard
    }
558 1dce7c3c bellard
    clock_freq = freq.QuadPart;
559 1115dde7 bellard
}
560 1115dde7 bellard
561 1dce7c3c bellard
static int64_t get_clock(void)
562 b8076a74 bellard
{
563 1dce7c3c bellard
    LARGE_INTEGER ti;
564 1dce7c3c bellard
    QueryPerformanceCounter(&ti);
565 274dfed8 Anthony Liguori
    return muldiv64(ti.QuadPart, get_ticks_per_sec(), clock_freq);
566 b8076a74 bellard
}
567 b8076a74 bellard
568 1dce7c3c bellard
#else
569 90cb9493 bellard
570 1dce7c3c bellard
static int use_rt_clock;
571 1dce7c3c bellard
572 1dce7c3c bellard
static void init_get_clock(void)
573 90cb9493 bellard
{
574 1dce7c3c bellard
    use_rt_clock = 0;
575 c5e97233 blueswir1
#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
576 c5e97233 blueswir1
    || defined(__DragonFly__)
577 1dce7c3c bellard
    {
578 1dce7c3c bellard
        struct timespec ts;
579 1dce7c3c bellard
        if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
580 1dce7c3c bellard
            use_rt_clock = 1;
581 1dce7c3c bellard
        }
582 1dce7c3c bellard
    }
583 1dce7c3c bellard
#endif
584 90cb9493 bellard
}
585 90cb9493 bellard
586 1dce7c3c bellard
static int64_t get_clock(void)
587 fdbb4691 bellard
{
588 c5e97233 blueswir1
#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
589 c5e97233 blueswir1
        || defined(__DragonFly__)
590 1dce7c3c bellard
    if (use_rt_clock) {
591 1dce7c3c bellard
        struct timespec ts;
592 1dce7c3c bellard
        clock_gettime(CLOCK_MONOTONIC, &ts);
593 1dce7c3c bellard
        return ts.tv_sec * 1000000000LL + ts.tv_nsec;
594 5fafdf24 ths
    } else
595 fdbb4691 bellard
#endif
596 1dce7c3c bellard
    {
597 1dce7c3c bellard
        /* XXX: using gettimeofday leads to problems if the date
598 1dce7c3c bellard
           changes, so it should be avoided. */
599 21d5d12b Jan Kiszka
        return get_clock_realtime();
600 1dce7c3c bellard
    }
601 fdbb4691 bellard
}
602 34865134 bellard
#endif
603 34865134 bellard
604 2e70f6ef pbrook
/* Return the virtual CPU time, based on the instruction counter.  */
605 2e70f6ef pbrook
static int64_t cpu_get_icount(void)
606 2e70f6ef pbrook
{
607 2e70f6ef pbrook
    int64_t icount;
608 2e70f6ef pbrook
    CPUState *env = cpu_single_env;;
609 2e70f6ef pbrook
    icount = qemu_icount;
610 2e70f6ef pbrook
    if (env) {
611 2e70f6ef pbrook
        if (!can_do_io(env))
612 2e70f6ef pbrook
            fprintf(stderr, "Bad clock read\n");
613 2e70f6ef pbrook
        icount -= (env->icount_decr.u16.low + env->icount_extra);
614 2e70f6ef pbrook
    }
615 2e70f6ef pbrook
    return qemu_icount_bias + (icount << icount_time_shift);
616 2e70f6ef pbrook
}
617 2e70f6ef pbrook
618 1dce7c3c bellard
/***********************************************************/
619 1dce7c3c bellard
/* guest cycle counter */
620 1dce7c3c bellard
621 6f68e33e Juan Quintela
typedef struct TimersState {
622 6f68e33e Juan Quintela
    int64_t cpu_ticks_prev;
623 6f68e33e Juan Quintela
    int64_t cpu_ticks_offset;
624 6f68e33e Juan Quintela
    int64_t cpu_clock_offset;
625 6f68e33e Juan Quintela
    int32_t cpu_ticks_enabled;
626 274dfed8 Anthony Liguori
    int64_t dummy;
627 6f68e33e Juan Quintela
} TimersState;
628 6f68e33e Juan Quintela
629 6f68e33e Juan Quintela
TimersState timers_state;
630 34865134 bellard
631 1dce7c3c bellard
/* return the host CPU cycle counter and handle stop/restart */
632 1dce7c3c bellard
int64_t cpu_get_ticks(void)
633 34865134 bellard
{
634 2e70f6ef pbrook
    if (use_icount) {
635 2e70f6ef pbrook
        return cpu_get_icount();
636 2e70f6ef pbrook
    }
637 6f68e33e Juan Quintela
    if (!timers_state.cpu_ticks_enabled) {
638 6f68e33e Juan Quintela
        return timers_state.cpu_ticks_offset;
639 8a7ddc38 bellard
    } else {
640 eade0f19 bellard
        int64_t ticks;
641 eade0f19 bellard
        ticks = cpu_get_real_ticks();
642 6f68e33e Juan Quintela
        if (timers_state.cpu_ticks_prev > ticks) {
643 eade0f19 bellard
            /* Note: non increasing ticks may happen if the host uses
644 eade0f19 bellard
               software suspend */
645 6f68e33e Juan Quintela
            timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
646 eade0f19 bellard
        }
647 6f68e33e Juan Quintela
        timers_state.cpu_ticks_prev = ticks;
648 6f68e33e Juan Quintela
        return ticks + timers_state.cpu_ticks_offset;
649 8a7ddc38 bellard
    }
650 34865134 bellard
}
651 34865134 bellard
652 1dce7c3c bellard
/* return the host CPU monotonic timer and handle stop/restart */
653 1dce7c3c bellard
static int64_t cpu_get_clock(void)
654 1dce7c3c bellard
{
655 1dce7c3c bellard
    int64_t ti;
656 6f68e33e Juan Quintela
    if (!timers_state.cpu_ticks_enabled) {
657 6f68e33e Juan Quintela
        return timers_state.cpu_clock_offset;
658 1dce7c3c bellard
    } else {
659 1dce7c3c bellard
        ti = get_clock();
660 6f68e33e Juan Quintela
        return ti + timers_state.cpu_clock_offset;
661 1dce7c3c bellard
    }
662 1dce7c3c bellard
}
663 1dce7c3c bellard
664 34865134 bellard
/* enable cpu_get_ticks() */
665 34865134 bellard
void cpu_enable_ticks(void)
666 34865134 bellard
{
667 6f68e33e Juan Quintela
    if (!timers_state.cpu_ticks_enabled) {
668 6f68e33e Juan Quintela
        timers_state.cpu_ticks_offset -= cpu_get_real_ticks();
669 6f68e33e Juan Quintela
        timers_state.cpu_clock_offset -= get_clock();
670 6f68e33e Juan Quintela
        timers_state.cpu_ticks_enabled = 1;
671 8a7ddc38 bellard
    }
672 34865134 bellard
}
673 34865134 bellard
674 34865134 bellard
/* disable cpu_get_ticks() : the clock is stopped. You must not call
675 34865134 bellard
   cpu_get_ticks() after that.  */
676 34865134 bellard
void cpu_disable_ticks(void)
677 34865134 bellard
{
678 6f68e33e Juan Quintela
    if (timers_state.cpu_ticks_enabled) {
679 6f68e33e Juan Quintela
        timers_state.cpu_ticks_offset = cpu_get_ticks();
680 6f68e33e Juan Quintela
        timers_state.cpu_clock_offset = cpu_get_clock();
681 6f68e33e Juan Quintela
        timers_state.cpu_ticks_enabled = 0;
682 8a7ddc38 bellard
    }
683 34865134 bellard
}
684 34865134 bellard
685 1dce7c3c bellard
/***********************************************************/
686 1dce7c3c bellard
/* timers */
687 5fafdf24 ths
688 0fdddf80 Jan Kiszka
#define QEMU_CLOCK_REALTIME 0
689 0fdddf80 Jan Kiszka
#define QEMU_CLOCK_VIRTUAL  1
690 21d5d12b Jan Kiszka
#define QEMU_CLOCK_HOST     2
691 8a7ddc38 bellard
692 8a7ddc38 bellard
struct QEMUClock {
693 8a7ddc38 bellard
    int type;
694 8a7ddc38 bellard
    /* XXX: add frequency */
695 8a7ddc38 bellard
};
696 8a7ddc38 bellard
697 8a7ddc38 bellard
struct QEMUTimer {
698 8a7ddc38 bellard
    QEMUClock *clock;
699 8a7ddc38 bellard
    int64_t expire_time;
700 8a7ddc38 bellard
    QEMUTimerCB *cb;
701 8a7ddc38 bellard
    void *opaque;
702 8a7ddc38 bellard
    struct QEMUTimer *next;
703 8a7ddc38 bellard
};
704 8a7ddc38 bellard
705 c8994013 ths
struct qemu_alarm_timer {
706 c8994013 ths
    char const *name;
707 efe75411 ths
    unsigned int flags;
708 c8994013 ths
709 c8994013 ths
    int (*start)(struct qemu_alarm_timer *t);
710 c8994013 ths
    void (*stop)(struct qemu_alarm_timer *t);
711 efe75411 ths
    void (*rearm)(struct qemu_alarm_timer *t);
712 c8994013 ths
    void *priv;
713 c8994013 ths
};
714 c8994013 ths
715 efe75411 ths
#define ALARM_FLAG_DYNTICKS  0x1
716 d5d08334 balrog
#define ALARM_FLAG_EXPIRED   0x2
717 efe75411 ths
718 efe75411 ths
static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
719 efe75411 ths
{
720 e332340a Jean-Christophe Dubois
    return t && (t->flags & ALARM_FLAG_DYNTICKS);
721 efe75411 ths
}
722 efe75411 ths
723 efe75411 ths
static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
724 efe75411 ths
{
725 efe75411 ths
    if (!alarm_has_dynticks(t))
726 efe75411 ths
        return;
727 efe75411 ths
728 efe75411 ths
    t->rearm(t);
729 efe75411 ths
}
730 efe75411 ths
731 efe75411 ths
/* TODO: MIN_TIMER_REARM_US should be optimized */
732 efe75411 ths
#define MIN_TIMER_REARM_US 250
733 efe75411 ths
734 c8994013 ths
static struct qemu_alarm_timer *alarm_timer;
735 8a7ddc38 bellard
736 40c3bac3 bellard
#ifdef _WIN32
737 c8994013 ths
738 c8994013 ths
struct qemu_alarm_win32 {
739 c8994013 ths
    MMRESULT timerId;
740 c8994013 ths
    unsigned int period;
741 ef28c4b0 Blue Swirl
} alarm_win32_data = {0, -1};
742 c8994013 ths
743 c8994013 ths
static int win32_start_timer(struct qemu_alarm_timer *t);
744 c8994013 ths
static void win32_stop_timer(struct qemu_alarm_timer *t);
745 efe75411 ths
static void win32_rearm_timer(struct qemu_alarm_timer *t);
746 c8994013 ths
747 40c3bac3 bellard
#else
748 c8994013 ths
749 c8994013 ths
static int unix_start_timer(struct qemu_alarm_timer *t);
750 c8994013 ths
static void unix_stop_timer(struct qemu_alarm_timer *t);
751 c8994013 ths
752 231c6586 ths
#ifdef __linux__
753 231c6586 ths
754 efe75411 ths
static int dynticks_start_timer(struct qemu_alarm_timer *t);
755 efe75411 ths
static void dynticks_stop_timer(struct qemu_alarm_timer *t);
756 efe75411 ths
static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
757 efe75411 ths
758 c40ec5a9 ths
static int hpet_start_timer(struct qemu_alarm_timer *t);
759 c40ec5a9 ths
static void hpet_stop_timer(struct qemu_alarm_timer *t);
760 c40ec5a9 ths
761 c8994013 ths
static int rtc_start_timer(struct qemu_alarm_timer *t);
762 c8994013 ths
static void rtc_stop_timer(struct qemu_alarm_timer *t);
763 c8994013 ths
764 efe75411 ths
#endif /* __linux__ */
765 8a7ddc38 bellard
766 c8994013 ths
#endif /* _WIN32 */
767 c8994013 ths
768 2e70f6ef pbrook
/* Correlation between real and virtual time is always going to be
769 bf20dc07 ths
   fairly approximate, so ignore small variation.
770 2e70f6ef pbrook
   When the guest is idle real and virtual time will be aligned in
771 2e70f6ef pbrook
   the IO wait loop.  */
772 274dfed8 Anthony Liguori
#define ICOUNT_WOBBLE (get_ticks_per_sec() / 10)
773 2e70f6ef pbrook
774 2e70f6ef pbrook
static void icount_adjust(void)
775 2e70f6ef pbrook
{
776 2e70f6ef pbrook
    int64_t cur_time;
777 2e70f6ef pbrook
    int64_t cur_icount;
778 2e70f6ef pbrook
    int64_t delta;
779 2e70f6ef pbrook
    static int64_t last_delta;
780 2e70f6ef pbrook
    /* If the VM is not running, then do nothing.  */
781 2e70f6ef pbrook
    if (!vm_running)
782 2e70f6ef pbrook
        return;
783 2e70f6ef pbrook
784 2e70f6ef pbrook
    cur_time = cpu_get_clock();
785 2e70f6ef pbrook
    cur_icount = qemu_get_clock(vm_clock);
786 2e70f6ef pbrook
    delta = cur_icount - cur_time;
787 2e70f6ef pbrook
    /* FIXME: This is a very crude algorithm, somewhat prone to oscillation.  */
788 2e70f6ef pbrook
    if (delta > 0
789 2e70f6ef pbrook
        && last_delta + ICOUNT_WOBBLE < delta * 2
790 2e70f6ef pbrook
        && icount_time_shift > 0) {
791 2e70f6ef pbrook
        /* The guest is getting too far ahead.  Slow time down.  */
792 2e70f6ef pbrook
        icount_time_shift--;
793 2e70f6ef pbrook
    }
794 2e70f6ef pbrook
    if (delta < 0
795 2e70f6ef pbrook
        && last_delta - ICOUNT_WOBBLE > delta * 2
796 2e70f6ef pbrook
        && icount_time_shift < MAX_ICOUNT_SHIFT) {
797 2e70f6ef pbrook
        /* The guest is getting too far behind.  Speed time up.  */
798 2e70f6ef pbrook
        icount_time_shift++;
799 2e70f6ef pbrook
    }
800 2e70f6ef pbrook
    last_delta = delta;
801 2e70f6ef pbrook
    qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
802 2e70f6ef pbrook
}
803 2e70f6ef pbrook
804 2e70f6ef pbrook
static void icount_adjust_rt(void * opaque)
805 2e70f6ef pbrook
{
806 2e70f6ef pbrook
    qemu_mod_timer(icount_rt_timer,
807 2e70f6ef pbrook
                   qemu_get_clock(rt_clock) + 1000);
808 2e70f6ef pbrook
    icount_adjust();
809 2e70f6ef pbrook
}
810 2e70f6ef pbrook
811 2e70f6ef pbrook
static void icount_adjust_vm(void * opaque)
812 2e70f6ef pbrook
{
813 2e70f6ef pbrook
    qemu_mod_timer(icount_vm_timer,
814 274dfed8 Anthony Liguori
                   qemu_get_clock(vm_clock) + get_ticks_per_sec() / 10);
815 2e70f6ef pbrook
    icount_adjust();
816 2e70f6ef pbrook
}
817 2e70f6ef pbrook
818 2e70f6ef pbrook
static void init_icount_adjust(void)
819 2e70f6ef pbrook
{
820 2e70f6ef pbrook
    /* Have both realtime and virtual time triggers for speed adjustment.
821 2e70f6ef pbrook
       The realtime trigger catches emulated time passing too slowly,
822 2e70f6ef pbrook
       the virtual time trigger catches emulated time passing too fast.
823 2e70f6ef pbrook
       Realtime triggers occur even when idle, so use them less frequently
824 2e70f6ef pbrook
       than VM triggers.  */
825 2e70f6ef pbrook
    icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
826 2e70f6ef pbrook
    qemu_mod_timer(icount_rt_timer,
827 2e70f6ef pbrook
                   qemu_get_clock(rt_clock) + 1000);
828 2e70f6ef pbrook
    icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
829 2e70f6ef pbrook
    qemu_mod_timer(icount_vm_timer,
830 274dfed8 Anthony Liguori
                   qemu_get_clock(vm_clock) + get_ticks_per_sec() / 10);
831 2e70f6ef pbrook
}
832 2e70f6ef pbrook
833 c8994013 ths
static struct qemu_alarm_timer alarm_timers[] = {
834 efe75411 ths
#ifndef _WIN32
835 231c6586 ths
#ifdef __linux__
836 efe75411 ths
    {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
837 efe75411 ths
     dynticks_stop_timer, dynticks_rearm_timer, NULL},
838 c40ec5a9 ths
    /* HPET - if available - is preferred */
839 efe75411 ths
    {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
840 c40ec5a9 ths
    /* ...otherwise try RTC */
841 efe75411 ths
    {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
842 c8994013 ths
#endif
843 efe75411 ths
    {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
844 c8994013 ths
#else
845 efe75411 ths
    {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
846 efe75411 ths
     win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
847 efe75411 ths
    {"win32", 0, win32_start_timer,
848 efe75411 ths
     win32_stop_timer, NULL, &alarm_win32_data},
849 c8994013 ths
#endif
850 c8994013 ths
    {NULL, }
851 c8994013 ths
};
852 c8994013 ths
853 3f47aa8c blueswir1
static void show_available_alarms(void)
854 f3dcfada ths
{
855 f3dcfada ths
    int i;
856 f3dcfada ths
857 f3dcfada ths
    printf("Available alarm timers, in order of precedence:\n");
858 f3dcfada ths
    for (i = 0; alarm_timers[i].name; i++)
859 f3dcfada ths
        printf("%s\n", alarm_timers[i].name);
860 f3dcfada ths
}
861 f3dcfada ths
862 f3dcfada ths
static void configure_alarms(char const *opt)
863 f3dcfada ths
{
864 f3dcfada ths
    int i;
865 f3dcfada ths
    int cur = 0;
866 b1503cda malc
    int count = ARRAY_SIZE(alarm_timers) - 1;
867 f3dcfada ths
    char *arg;
868 f3dcfada ths
    char *name;
869 2e70f6ef pbrook
    struct qemu_alarm_timer tmp;
870 f3dcfada ths
871 3adda04c aurel32
    if (!strcmp(opt, "?")) {
872 f3dcfada ths
        show_available_alarms();
873 f3dcfada ths
        exit(0);
874 f3dcfada ths
    }
875 f3dcfada ths
876 73ffc805 Jean-Christophe DUBOIS
    arg = qemu_strdup(opt);
877 f3dcfada ths
878 f3dcfada ths
    /* Reorder the array */
879 f3dcfada ths
    name = strtok(arg, ",");
880 f3dcfada ths
    while (name) {
881 e2b577e5 balrog
        for (i = 0; i < count && alarm_timers[i].name; i++) {
882 f3dcfada ths
            if (!strcmp(alarm_timers[i].name, name))
883 f3dcfada ths
                break;
884 f3dcfada ths
        }
885 f3dcfada ths
886 f3dcfada ths
        if (i == count) {
887 f3dcfada ths
            fprintf(stderr, "Unknown clock %s\n", name);
888 f3dcfada ths
            goto next;
889 f3dcfada ths
        }
890 f3dcfada ths
891 f3dcfada ths
        if (i < cur)
892 f3dcfada ths
            /* Ignore */
893 f3dcfada ths
            goto next;
894 f3dcfada ths
895 f3dcfada ths
        /* Swap */
896 f3dcfada ths
        tmp = alarm_timers[i];
897 f3dcfada ths
        alarm_timers[i] = alarm_timers[cur];
898 f3dcfada ths
        alarm_timers[cur] = tmp;
899 f3dcfada ths
900 f3dcfada ths
        cur++;
901 f3dcfada ths
next:
902 f3dcfada ths
        name = strtok(NULL, ",");
903 f3dcfada ths
    }
904 f3dcfada ths
905 73ffc805 Jean-Christophe DUBOIS
    qemu_free(arg);
906 f3dcfada ths
907 f3dcfada ths
    if (cur) {
908 2e70f6ef pbrook
        /* Disable remaining timers */
909 f3dcfada ths
        for (i = cur; i < count; i++)
910 f3dcfada ths
            alarm_timers[i].name = NULL;
911 3adda04c aurel32
    } else {
912 3adda04c aurel32
        show_available_alarms();
913 3adda04c aurel32
        exit(1);
914 f3dcfada ths
    }
915 f3dcfada ths
}
916 f3dcfada ths
917 21d5d12b Jan Kiszka
#define QEMU_NUM_CLOCKS 3
918 21d5d12b Jan Kiszka
919 c8994013 ths
QEMUClock *rt_clock;
920 c8994013 ths
QEMUClock *vm_clock;
921 21d5d12b Jan Kiszka
QEMUClock *host_clock;
922 c8994013 ths
923 21d5d12b Jan Kiszka
static QEMUTimer *active_timers[QEMU_NUM_CLOCKS];
924 c8994013 ths
925 9596ebb7 pbrook
static QEMUClock *qemu_new_clock(int type)
926 8a7ddc38 bellard
{
927 8a7ddc38 bellard
    QEMUClock *clock;
928 8a7ddc38 bellard
    clock = qemu_mallocz(sizeof(QEMUClock));
929 8a7ddc38 bellard
    clock->type = type;
930 8a7ddc38 bellard
    return clock;
931 8a7ddc38 bellard
}
932 8a7ddc38 bellard
933 8a7ddc38 bellard
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
934 8a7ddc38 bellard
{
935 8a7ddc38 bellard
    QEMUTimer *ts;
936 8a7ddc38 bellard
937 8a7ddc38 bellard
    ts = qemu_mallocz(sizeof(QEMUTimer));
938 8a7ddc38 bellard
    ts->clock = clock;
939 8a7ddc38 bellard
    ts->cb = cb;
940 8a7ddc38 bellard
    ts->opaque = opaque;
941 8a7ddc38 bellard
    return ts;
942 8a7ddc38 bellard
}
943 8a7ddc38 bellard
944 8a7ddc38 bellard
void qemu_free_timer(QEMUTimer *ts)
945 8a7ddc38 bellard
{
946 8a7ddc38 bellard
    qemu_free(ts);
947 8a7ddc38 bellard
}
948 8a7ddc38 bellard
949 8a7ddc38 bellard
/* stop a timer, but do not dealloc it */
950 8a7ddc38 bellard
void qemu_del_timer(QEMUTimer *ts)
951 8a7ddc38 bellard
{
952 8a7ddc38 bellard
    QEMUTimer **pt, *t;
953 8a7ddc38 bellard
954 8a7ddc38 bellard
    /* NOTE: this code must be signal safe because
955 8a7ddc38 bellard
       qemu_timer_expired() can be called from a signal. */
956 8a7ddc38 bellard
    pt = &active_timers[ts->clock->type];
957 8a7ddc38 bellard
    for(;;) {
958 8a7ddc38 bellard
        t = *pt;
959 8a7ddc38 bellard
        if (!t)
960 8a7ddc38 bellard
            break;
961 8a7ddc38 bellard
        if (t == ts) {
962 8a7ddc38 bellard
            *pt = t->next;
963 8a7ddc38 bellard
            break;
964 8a7ddc38 bellard
        }
965 8a7ddc38 bellard
        pt = &t->next;
966 8a7ddc38 bellard
    }
967 8a7ddc38 bellard
}
968 8a7ddc38 bellard
969 8a7ddc38 bellard
/* modify the current timer so that it will be fired when current_time
970 8a7ddc38 bellard
   >= expire_time. The corresponding callback will be called. */
971 8a7ddc38 bellard
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
972 8a7ddc38 bellard
{
973 8a7ddc38 bellard
    QEMUTimer **pt, *t;
974 8a7ddc38 bellard
975 8a7ddc38 bellard
    qemu_del_timer(ts);
976 8a7ddc38 bellard
977 8a7ddc38 bellard
    /* add the timer in the sorted list */
978 8a7ddc38 bellard
    /* NOTE: this code must be signal safe because
979 8a7ddc38 bellard
       qemu_timer_expired() can be called from a signal. */
980 8a7ddc38 bellard
    pt = &active_timers[ts->clock->type];
981 8a7ddc38 bellard
    for(;;) {
982 8a7ddc38 bellard
        t = *pt;
983 8a7ddc38 bellard
        if (!t)
984 8a7ddc38 bellard
            break;
985 5fafdf24 ths
        if (t->expire_time > expire_time)
986 8a7ddc38 bellard
            break;
987 8a7ddc38 bellard
        pt = &t->next;
988 8a7ddc38 bellard
    }
989 8a7ddc38 bellard
    ts->expire_time = expire_time;
990 8a7ddc38 bellard
    ts->next = *pt;
991 8a7ddc38 bellard
    *pt = ts;
992 d5d08334 balrog
993 d5d08334 balrog
    /* Rearm if necessary  */
994 2e70f6ef pbrook
    if (pt == &active_timers[ts->clock->type]) {
995 2e70f6ef pbrook
        if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
996 2e70f6ef pbrook
            qemu_rearm_alarm_timer(alarm_timer);
997 2e70f6ef pbrook
        }
998 2e70f6ef pbrook
        /* Interrupt execution to force deadline recalculation.  */
999 d9f75a4e aliguori
        if (use_icount)
1000 d9f75a4e aliguori
            qemu_notify_event();
1001 2e70f6ef pbrook
    }
1002 8a7ddc38 bellard
}
1003 8a7ddc38 bellard
1004 8a7ddc38 bellard
int qemu_timer_pending(QEMUTimer *ts)
1005 8a7ddc38 bellard
{
1006 8a7ddc38 bellard
    QEMUTimer *t;
1007 8a7ddc38 bellard
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
1008 8a7ddc38 bellard
        if (t == ts)
1009 8a7ddc38 bellard
            return 1;
1010 8a7ddc38 bellard
    }
1011 8a7ddc38 bellard
    return 0;
1012 8a7ddc38 bellard
}
1013 8a7ddc38 bellard
1014 2430ffe4 Stefano Stabellini
int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
1015 8a7ddc38 bellard
{
1016 8a7ddc38 bellard
    if (!timer_head)
1017 8a7ddc38 bellard
        return 0;
1018 8a7ddc38 bellard
    return (timer_head->expire_time <= current_time);
1019 8a7ddc38 bellard
}
1020 8a7ddc38 bellard
1021 8a7ddc38 bellard
static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1022 8a7ddc38 bellard
{
1023 8a7ddc38 bellard
    QEMUTimer *ts;
1024 3b46e624 ths
1025 8a7ddc38 bellard
    for(;;) {
1026 8a7ddc38 bellard
        ts = *ptimer_head;
1027 e95c8d51 bellard
        if (!ts || ts->expire_time > current_time)
1028 8a7ddc38 bellard
            break;
1029 8a7ddc38 bellard
        /* remove timer from the list before calling the callback */
1030 8a7ddc38 bellard
        *ptimer_head = ts->next;
1031 8a7ddc38 bellard
        ts->next = NULL;
1032 3b46e624 ths
1033 8a7ddc38 bellard
        /* run the callback (the timer list can be modified) */
1034 8a7ddc38 bellard
        ts->cb(ts->opaque);
1035 8a7ddc38 bellard
    }
1036 8a7ddc38 bellard
}
1037 8a7ddc38 bellard
1038 8a7ddc38 bellard
int64_t qemu_get_clock(QEMUClock *clock)
1039 8a7ddc38 bellard
{
1040 8a7ddc38 bellard
    switch(clock->type) {
1041 0fdddf80 Jan Kiszka
    case QEMU_CLOCK_REALTIME:
1042 1dce7c3c bellard
        return get_clock() / 1000000;
1043 8a7ddc38 bellard
    default:
1044 0fdddf80 Jan Kiszka
    case QEMU_CLOCK_VIRTUAL:
1045 2e70f6ef pbrook
        if (use_icount) {
1046 2e70f6ef pbrook
            return cpu_get_icount();
1047 2e70f6ef pbrook
        } else {
1048 2e70f6ef pbrook
            return cpu_get_clock();
1049 2e70f6ef pbrook
        }
1050 21d5d12b Jan Kiszka
    case QEMU_CLOCK_HOST:
1051 21d5d12b Jan Kiszka
        return get_clock_realtime();
1052 8a7ddc38 bellard
    }
1053 8a7ddc38 bellard
}
1054 8a7ddc38 bellard
1055 0fdddf80 Jan Kiszka
static void init_clocks(void)
1056 1dce7c3c bellard
{
1057 1dce7c3c bellard
    init_get_clock();
1058 0fdddf80 Jan Kiszka
    rt_clock = qemu_new_clock(QEMU_CLOCK_REALTIME);
1059 0fdddf80 Jan Kiszka
    vm_clock = qemu_new_clock(QEMU_CLOCK_VIRTUAL);
1060 21d5d12b Jan Kiszka
    host_clock = qemu_new_clock(QEMU_CLOCK_HOST);
1061 6875204c Jan Kiszka
1062 6875204c Jan Kiszka
    rtc_clock = host_clock;
1063 1dce7c3c bellard
}
1064 1dce7c3c bellard
1065 8a7ddc38 bellard
/* save a timer */
1066 8a7ddc38 bellard
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1067 8a7ddc38 bellard
{
1068 8a7ddc38 bellard
    uint64_t expire_time;
1069 8a7ddc38 bellard
1070 8a7ddc38 bellard
    if (qemu_timer_pending(ts)) {
1071 8a7ddc38 bellard
        expire_time = ts->expire_time;
1072 8a7ddc38 bellard
    } else {
1073 8a7ddc38 bellard
        expire_time = -1;
1074 8a7ddc38 bellard
    }
1075 8a7ddc38 bellard
    qemu_put_be64(f, expire_time);
1076 8a7ddc38 bellard
}
1077 8a7ddc38 bellard
1078 8a7ddc38 bellard
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1079 8a7ddc38 bellard
{
1080 8a7ddc38 bellard
    uint64_t expire_time;
1081 8a7ddc38 bellard
1082 8a7ddc38 bellard
    expire_time = qemu_get_be64(f);
1083 8a7ddc38 bellard
    if (expire_time != -1) {
1084 8a7ddc38 bellard
        qemu_mod_timer(ts, expire_time);
1085 8a7ddc38 bellard
    } else {
1086 8a7ddc38 bellard
        qemu_del_timer(ts);
1087 8a7ddc38 bellard
    }
1088 8a7ddc38 bellard
}
1089 8a7ddc38 bellard
1090 2faf58cd Juan Quintela
static const VMStateDescription vmstate_timers = {
1091 2faf58cd Juan Quintela
    .name = "timer",
1092 2faf58cd Juan Quintela
    .version_id = 2,
1093 2faf58cd Juan Quintela
    .minimum_version_id = 1,
1094 2faf58cd Juan Quintela
    .minimum_version_id_old = 1,
1095 2faf58cd Juan Quintela
    .fields      = (VMStateField []) {
1096 2faf58cd Juan Quintela
        VMSTATE_INT64(cpu_ticks_offset, TimersState),
1097 274dfed8 Anthony Liguori
        VMSTATE_INT64(dummy, TimersState),
1098 2faf58cd Juan Quintela
        VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
1099 2faf58cd Juan Quintela
        VMSTATE_END_OF_LIST()
1100 c88676f8 bellard
    }
1101 2faf58cd Juan Quintela
};
1102 8a7ddc38 bellard
1103 50317c7f aliguori
static void qemu_event_increment(void);
1104 50317c7f aliguori
1105 67b915a5 bellard
#ifdef _WIN32
1106 b9e82a59 blueswir1
static void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
1107 b9e82a59 blueswir1
                                        DWORD_PTR dwUser, DWORD_PTR dw1,
1108 b9e82a59 blueswir1
                                        DWORD_PTR dw2)
1109 67b915a5 bellard
#else
1110 8a7ddc38 bellard
static void host_alarm_handler(int host_signum)
1111 67b915a5 bellard
#endif
1112 8a7ddc38 bellard
{
1113 02ba45c5 bellard
#if 0
1114 02ba45c5 bellard
#define DISP_FREQ 1000
1115 02ba45c5 bellard
    {
1116 02ba45c5 bellard
        static int64_t delta_min = INT64_MAX;
1117 02ba45c5 bellard
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
1118 02ba45c5 bellard
        static int count;
1119 02ba45c5 bellard
        ti = qemu_get_clock(vm_clock);
1120 02ba45c5 bellard
        if (last_clock != 0) {
1121 02ba45c5 bellard
            delta = ti - last_clock;
1122 02ba45c5 bellard
            if (delta < delta_min)
1123 02ba45c5 bellard
                delta_min = delta;
1124 02ba45c5 bellard
            if (delta > delta_max)
1125 02ba45c5 bellard
                delta_max = delta;
1126 02ba45c5 bellard
            delta_cum += delta;
1127 02ba45c5 bellard
            if (++count == DISP_FREQ) {
1128 26a76461 bellard
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
1129 6ee093c9 Juan Quintela
                       muldiv64(delta_min, 1000000, get_ticks_per_sec()),
1130 6ee093c9 Juan Quintela
                       muldiv64(delta_max, 1000000, get_ticks_per_sec()),
1131 6ee093c9 Juan Quintela
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, get_ticks_per_sec()),
1132 6ee093c9 Juan Quintela
                       (double)get_ticks_per_sec() / ((double)delta_cum / DISP_FREQ));
1133 02ba45c5 bellard
                count = 0;
1134 02ba45c5 bellard
                delta_min = INT64_MAX;
1135 02ba45c5 bellard
                delta_max = 0;
1136 02ba45c5 bellard
                delta_cum = 0;
1137 02ba45c5 bellard
            }
1138 02ba45c5 bellard
        }
1139 02ba45c5 bellard
        last_clock = ti;
1140 02ba45c5 bellard
    }
1141 02ba45c5 bellard
#endif
1142 efe75411 ths
    if (alarm_has_dynticks(alarm_timer) ||
1143 2e70f6ef pbrook
        (!use_icount &&
1144 0fdddf80 Jan Kiszka
            qemu_timer_expired(active_timers[QEMU_CLOCK_VIRTUAL],
1145 2e70f6ef pbrook
                               qemu_get_clock(vm_clock))) ||
1146 0fdddf80 Jan Kiszka
        qemu_timer_expired(active_timers[QEMU_CLOCK_REALTIME],
1147 21d5d12b Jan Kiszka
                           qemu_get_clock(rt_clock)) ||
1148 21d5d12b Jan Kiszka
        qemu_timer_expired(active_timers[QEMU_CLOCK_HOST],
1149 21d5d12b Jan Kiszka
                           qemu_get_clock(host_clock))) {
1150 50317c7f aliguori
        qemu_event_increment();
1151 e332340a Jean-Christophe Dubois
        if (alarm_timer) alarm_timer->flags |= ALARM_FLAG_EXPIRED;
1152 d5d08334 balrog
1153 d6dc3d42 aliguori
#ifndef CONFIG_IOTHREAD
1154 d6dc3d42 aliguori
        if (next_cpu) {
1155 4f8eb8da balrog
            /* stop the currently executing cpu because a timer occured */
1156 d6dc3d42 aliguori
            cpu_exit(next_cpu);
1157 4f8eb8da balrog
        }
1158 d6dc3d42 aliguori
#endif
1159 43b96858 aliguori
        timer_alarm_pending = 1;
1160 d9f75a4e aliguori
        qemu_notify_event();
1161 8a7ddc38 bellard
    }
1162 8a7ddc38 bellard
}
1163 8a7ddc38 bellard
1164 2e70f6ef pbrook
static int64_t qemu_next_deadline(void)
1165 efe75411 ths
{
1166 21d5d12b Jan Kiszka
    /* To avoid problems with overflow limit this to 2^32.  */
1167 21d5d12b Jan Kiszka
    int64_t delta = INT32_MAX;
1168 efe75411 ths
1169 0fdddf80 Jan Kiszka
    if (active_timers[QEMU_CLOCK_VIRTUAL]) {
1170 0fdddf80 Jan Kiszka
        delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
1171 2e70f6ef pbrook
                     qemu_get_clock(vm_clock);
1172 21d5d12b Jan Kiszka
    }
1173 21d5d12b Jan Kiszka
    if (active_timers[QEMU_CLOCK_HOST]) {
1174 21d5d12b Jan Kiszka
        int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time -
1175 21d5d12b Jan Kiszka
                 qemu_get_clock(host_clock);
1176 21d5d12b Jan Kiszka
        if (hdelta < delta)
1177 21d5d12b Jan Kiszka
            delta = hdelta;
1178 efe75411 ths
    }
1179 efe75411 ths
1180 2e70f6ef pbrook
    if (delta < 0)
1181 2e70f6ef pbrook
        delta = 0;
1182 efe75411 ths
1183 2e70f6ef pbrook
    return delta;
1184 2e70f6ef pbrook
}
1185 2e70f6ef pbrook
1186 f64382ba Jan Kiszka
#if defined(__linux__)
1187 2e70f6ef pbrook
static uint64_t qemu_next_deadline_dyntick(void)
1188 2e70f6ef pbrook
{
1189 2e70f6ef pbrook
    int64_t delta;
1190 2e70f6ef pbrook
    int64_t rtdelta;
1191 2e70f6ef pbrook
1192 2e70f6ef pbrook
    if (use_icount)
1193 2e70f6ef pbrook
        delta = INT32_MAX;
1194 2e70f6ef pbrook
    else
1195 2e70f6ef pbrook
        delta = (qemu_next_deadline() + 999) / 1000;
1196 2e70f6ef pbrook
1197 0fdddf80 Jan Kiszka
    if (active_timers[QEMU_CLOCK_REALTIME]) {
1198 0fdddf80 Jan Kiszka
        rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time -
1199 2e70f6ef pbrook
                 qemu_get_clock(rt_clock))*1000;
1200 2e70f6ef pbrook
        if (rtdelta < delta)
1201 2e70f6ef pbrook
            delta = rtdelta;
1202 2e70f6ef pbrook
    }
1203 2e70f6ef pbrook
1204 2e70f6ef pbrook
    if (delta < MIN_TIMER_REARM_US)
1205 2e70f6ef pbrook
        delta = MIN_TIMER_REARM_US;
1206 2e70f6ef pbrook
1207 2e70f6ef pbrook
    return delta;
1208 efe75411 ths
}
1209 8632fb9a blueswir1
#endif
1210 efe75411 ths
1211 fd872598 bellard
#ifndef _WIN32
1212 fd872598 bellard
1213 7183b4b4 aliguori
/* Sets a specific flag */
1214 7183b4b4 aliguori
static int fcntl_setfl(int fd, int flag)
1215 7183b4b4 aliguori
{
1216 7183b4b4 aliguori
    int flags;
1217 7183b4b4 aliguori
1218 7183b4b4 aliguori
    flags = fcntl(fd, F_GETFL);
1219 7183b4b4 aliguori
    if (flags == -1)
1220 7183b4b4 aliguori
        return -errno;
1221 7183b4b4 aliguori
1222 7183b4b4 aliguori
    if (fcntl(fd, F_SETFL, flags | flag) == -1)
1223 7183b4b4 aliguori
        return -errno;
1224 7183b4b4 aliguori
1225 7183b4b4 aliguori
    return 0;
1226 7183b4b4 aliguori
}
1227 7183b4b4 aliguori
1228 829309c7 bellard
#if defined(__linux__)
1229 829309c7 bellard
1230 fd872598 bellard
#define RTC_FREQ 1024
1231 fd872598 bellard
1232 de9a95f0 aurel32
static void enable_sigio_timer(int fd)
1233 c8994013 ths
{
1234 c8994013 ths
    struct sigaction act;
1235 c8994013 ths
1236 c8994013 ths
    /* timer signal */
1237 c8994013 ths
    sigfillset(&act.sa_mask);
1238 c8994013 ths
    act.sa_flags = 0;
1239 c8994013 ths
    act.sa_handler = host_alarm_handler;
1240 c8994013 ths
1241 c8994013 ths
    sigaction(SIGIO, &act, NULL);
1242 7183b4b4 aliguori
    fcntl_setfl(fd, O_ASYNC);
1243 c8994013 ths
    fcntl(fd, F_SETOWN, getpid());
1244 c8994013 ths
}
1245 829309c7 bellard
1246 c40ec5a9 ths
static int hpet_start_timer(struct qemu_alarm_timer *t)
1247 c40ec5a9 ths
{
1248 c40ec5a9 ths
    struct hpet_info info;
1249 c40ec5a9 ths
    int r, fd;
1250 c40ec5a9 ths
1251 c40ec5a9 ths
    fd = open("/dev/hpet", O_RDONLY);
1252 c40ec5a9 ths
    if (fd < 0)
1253 c40ec5a9 ths
        return -1;
1254 c40ec5a9 ths
1255 c40ec5a9 ths
    /* Set frequency */
1256 c40ec5a9 ths
    r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1257 c40ec5a9 ths
    if (r < 0) {
1258 c40ec5a9 ths
        fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1259 c40ec5a9 ths
                "error, but for better emulation accuracy type:\n"
1260 c40ec5a9 ths
                "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1261 c40ec5a9 ths
        goto fail;
1262 c40ec5a9 ths
    }
1263 c40ec5a9 ths
1264 c40ec5a9 ths
    /* Check capabilities */
1265 c40ec5a9 ths
    r = ioctl(fd, HPET_INFO, &info);
1266 c40ec5a9 ths
    if (r < 0)
1267 c40ec5a9 ths
        goto fail;
1268 c40ec5a9 ths
1269 c40ec5a9 ths
    /* Enable periodic mode */
1270 c40ec5a9 ths
    r = ioctl(fd, HPET_EPI, 0);
1271 c40ec5a9 ths
    if (info.hi_flags && (r < 0))
1272 c40ec5a9 ths
        goto fail;
1273 c40ec5a9 ths
1274 c40ec5a9 ths
    /* Enable interrupt */
1275 c40ec5a9 ths
    r = ioctl(fd, HPET_IE_ON, 0);
1276 c40ec5a9 ths
    if (r < 0)
1277 c40ec5a9 ths
        goto fail;
1278 c40ec5a9 ths
1279 c40ec5a9 ths
    enable_sigio_timer(fd);
1280 fcdc2129 pbrook
    t->priv = (void *)(long)fd;
1281 c40ec5a9 ths
1282 c40ec5a9 ths
    return 0;
1283 c40ec5a9 ths
fail:
1284 c40ec5a9 ths
    close(fd);
1285 c40ec5a9 ths
    return -1;
1286 c40ec5a9 ths
}
1287 c40ec5a9 ths
1288 c40ec5a9 ths
static void hpet_stop_timer(struct qemu_alarm_timer *t)
1289 c40ec5a9 ths
{
1290 fcdc2129 pbrook
    int fd = (long)t->priv;
1291 c40ec5a9 ths
1292 c40ec5a9 ths
    close(fd);
1293 c40ec5a9 ths
}
1294 c40ec5a9 ths
1295 c8994013 ths
static int rtc_start_timer(struct qemu_alarm_timer *t)
1296 fd872598 bellard
{
1297 c8994013 ths
    int rtc_fd;
1298 b5a23ad4 balrog
    unsigned long current_rtc_freq = 0;
1299 c8994013 ths
1300 aeb30be6 balrog
    TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
1301 fd872598 bellard
    if (rtc_fd < 0)
1302 fd872598 bellard
        return -1;
1303 b5a23ad4 balrog
    ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
1304 b5a23ad4 balrog
    if (current_rtc_freq != RTC_FREQ &&
1305 b5a23ad4 balrog
        ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
1306 fd872598 bellard
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1307 fd872598 bellard
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1308 fd872598 bellard
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1309 fd872598 bellard
        goto fail;
1310 fd872598 bellard
    }
1311 fd872598 bellard
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1312 fd872598 bellard
    fail:
1313 fd872598 bellard
        close(rtc_fd);
1314 fd872598 bellard
        return -1;
1315 fd872598 bellard
    }
1316 c8994013 ths
1317 c8994013 ths
    enable_sigio_timer(rtc_fd);
1318 c8994013 ths
1319 fcdc2129 pbrook
    t->priv = (void *)(long)rtc_fd;
1320 c8994013 ths
1321 fd872598 bellard
    return 0;
1322 fd872598 bellard
}
1323 fd872598 bellard
1324 c8994013 ths
static void rtc_stop_timer(struct qemu_alarm_timer *t)
1325 829309c7 bellard
{
1326 fcdc2129 pbrook
    int rtc_fd = (long)t->priv;
1327 c8994013 ths
1328 c8994013 ths
    close(rtc_fd);
1329 829309c7 bellard
}
1330 829309c7 bellard
1331 efe75411 ths
static int dynticks_start_timer(struct qemu_alarm_timer *t)
1332 efe75411 ths
{
1333 efe75411 ths
    struct sigevent ev;
1334 efe75411 ths
    timer_t host_timer;
1335 efe75411 ths
    struct sigaction act;
1336 efe75411 ths
1337 efe75411 ths
    sigfillset(&act.sa_mask);
1338 efe75411 ths
    act.sa_flags = 0;
1339 efe75411 ths
    act.sa_handler = host_alarm_handler;
1340 efe75411 ths
1341 efe75411 ths
    sigaction(SIGALRM, &act, NULL);
1342 efe75411 ths
1343 9ed415b2 Jean-Christophe Dubois
    /* 
1344 9ed415b2 Jean-Christophe Dubois
     * Initialize ev struct to 0 to avoid valgrind complaining
1345 9ed415b2 Jean-Christophe Dubois
     * about uninitialized data in timer_create call
1346 9ed415b2 Jean-Christophe Dubois
     */
1347 9ed415b2 Jean-Christophe Dubois
    memset(&ev, 0, sizeof(ev));
1348 efe75411 ths
    ev.sigev_value.sival_int = 0;
1349 efe75411 ths
    ev.sigev_notify = SIGEV_SIGNAL;
1350 efe75411 ths
    ev.sigev_signo = SIGALRM;
1351 efe75411 ths
1352 efe75411 ths
    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1353 efe75411 ths
        perror("timer_create");
1354 efe75411 ths
1355 efe75411 ths
        /* disable dynticks */
1356 efe75411 ths
        fprintf(stderr, "Dynamic Ticks disabled\n");
1357 efe75411 ths
1358 efe75411 ths
        return -1;
1359 efe75411 ths
    }
1360 efe75411 ths
1361 0399bfe0 blueswir1
    t->priv = (void *)(long)host_timer;
1362 efe75411 ths
1363 efe75411 ths
    return 0;
1364 efe75411 ths
}
1365 efe75411 ths
1366 efe75411 ths
static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1367 efe75411 ths
{
1368 0399bfe0 blueswir1
    timer_t host_timer = (timer_t)(long)t->priv;
1369 efe75411 ths
1370 efe75411 ths
    timer_delete(host_timer);
1371 efe75411 ths
}
1372 efe75411 ths
1373 efe75411 ths
static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1374 efe75411 ths
{
1375 0399bfe0 blueswir1
    timer_t host_timer = (timer_t)(long)t->priv;
1376 efe75411 ths
    struct itimerspec timeout;
1377 efe75411 ths
    int64_t nearest_delta_us = INT64_MAX;
1378 efe75411 ths
    int64_t current_us;
1379 efe75411 ths
1380 0fdddf80 Jan Kiszka
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
1381 21d5d12b Jan Kiszka
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
1382 21d5d12b Jan Kiszka
        !active_timers[QEMU_CLOCK_HOST])
1383 d5d08334 balrog
        return;
1384 efe75411 ths
1385 2e70f6ef pbrook
    nearest_delta_us = qemu_next_deadline_dyntick();
1386 efe75411 ths
1387 efe75411 ths
    /* check whether a timer is already running */
1388 efe75411 ths
    if (timer_gettime(host_timer, &timeout)) {
1389 efe75411 ths
        perror("gettime");
1390 efe75411 ths
        fprintf(stderr, "Internal timer error: aborting\n");
1391 efe75411 ths
        exit(1);
1392 efe75411 ths
    }
1393 efe75411 ths
    current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1394 efe75411 ths
    if (current_us && current_us <= nearest_delta_us)
1395 efe75411 ths
        return;
1396 efe75411 ths
1397 efe75411 ths
    timeout.it_interval.tv_sec = 0;
1398 efe75411 ths
    timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1399 efe75411 ths
    timeout.it_value.tv_sec =  nearest_delta_us / 1000000;
1400 efe75411 ths
    timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1401 efe75411 ths
    if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1402 efe75411 ths
        perror("settime");
1403 efe75411 ths
        fprintf(stderr, "Internal timer error: aborting\n");
1404 efe75411 ths
        exit(1);
1405 efe75411 ths
    }
1406 efe75411 ths
}
1407 efe75411 ths
1408 70744b3a ths
#endif /* defined(__linux__) */
1409 231c6586 ths
1410 c8994013 ths
static int unix_start_timer(struct qemu_alarm_timer *t)
1411 c8994013 ths
{
1412 c8994013 ths
    struct sigaction act;
1413 c8994013 ths
    struct itimerval itv;
1414 c8994013 ths
    int err;
1415 c8994013 ths
1416 c8994013 ths
    /* timer signal */
1417 c8994013 ths
    sigfillset(&act.sa_mask);
1418 c8994013 ths
    act.sa_flags = 0;
1419 c8994013 ths
    act.sa_handler = host_alarm_handler;
1420 c8994013 ths
1421 c8994013 ths
    sigaction(SIGALRM, &act, NULL);
1422 c8994013 ths
1423 c8994013 ths
    itv.it_interval.tv_sec = 0;
1424 c8994013 ths
    /* for i386 kernel 2.6 to get 1 ms */
1425 c8994013 ths
    itv.it_interval.tv_usec = 999;
1426 c8994013 ths
    itv.it_value.tv_sec = 0;
1427 c8994013 ths
    itv.it_value.tv_usec = 10 * 1000;
1428 c8994013 ths
1429 c8994013 ths
    err = setitimer(ITIMER_REAL, &itv, NULL);
1430 c8994013 ths
    if (err)
1431 c8994013 ths
        return -1;
1432 c8994013 ths
1433 c8994013 ths
    return 0;
1434 c8994013 ths
}
1435 c8994013 ths
1436 c8994013 ths
static void unix_stop_timer(struct qemu_alarm_timer *t)
1437 c8994013 ths
{
1438 c8994013 ths
    struct itimerval itv;
1439 c8994013 ths
1440 c8994013 ths
    memset(&itv, 0, sizeof(itv));
1441 c8994013 ths
    setitimer(ITIMER_REAL, &itv, NULL);
1442 c8994013 ths
}
1443 c8994013 ths
1444 829309c7 bellard
#endif /* !defined(_WIN32) */
1445 fd872598 bellard
1446 f49e58dc aliguori
1447 c8994013 ths
#ifdef _WIN32
1448 c8994013 ths
1449 c8994013 ths
static int win32_start_timer(struct qemu_alarm_timer *t)
1450 c8994013 ths
{
1451 c8994013 ths
    TIMECAPS tc;
1452 c8994013 ths
    struct qemu_alarm_win32 *data = t->priv;
1453 efe75411 ths
    UINT flags;
1454 c8994013 ths
1455 c8994013 ths
    memset(&tc, 0, sizeof(tc));
1456 c8994013 ths
    timeGetDevCaps(&tc, sizeof(tc));
1457 c8994013 ths
1458 c8994013 ths
    if (data->period < tc.wPeriodMin)
1459 c8994013 ths
        data->period = tc.wPeriodMin;
1460 c8994013 ths
1461 c8994013 ths
    timeBeginPeriod(data->period);
1462 c8994013 ths
1463 efe75411 ths
    flags = TIME_CALLBACK_FUNCTION;
1464 efe75411 ths
    if (alarm_has_dynticks(t))
1465 efe75411 ths
        flags |= TIME_ONESHOT;
1466 efe75411 ths
    else
1467 efe75411 ths
        flags |= TIME_PERIODIC;
1468 efe75411 ths
1469 c8994013 ths
    data->timerId = timeSetEvent(1,         // interval (ms)
1470 c8994013 ths
                        data->period,       // resolution
1471 c8994013 ths
                        host_alarm_handler, // function
1472 c8994013 ths
                        (DWORD)t,           // parameter
1473 efe75411 ths
                        flags);
1474 c8994013 ths
1475 c8994013 ths
    if (!data->timerId) {
1476 20889d4e Blue Swirl
        fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
1477 705e83f6 malc
                GetLastError());
1478 c8994013 ths
        timeEndPeriod(data->period);
1479 c8994013 ths
        return -1;
1480 c8994013 ths
    }
1481 c8994013 ths
1482 c8994013 ths
    return 0;
1483 c8994013 ths
}
1484 c8994013 ths
1485 c8994013 ths
static void win32_stop_timer(struct qemu_alarm_timer *t)
1486 c8994013 ths
{
1487 c8994013 ths
    struct qemu_alarm_win32 *data = t->priv;
1488 c8994013 ths
1489 c8994013 ths
    timeKillEvent(data->timerId);
1490 c8994013 ths
    timeEndPeriod(data->period);
1491 c8994013 ths
}
1492 c8994013 ths
1493 efe75411 ths
static void win32_rearm_timer(struct qemu_alarm_timer *t)
1494 efe75411 ths
{
1495 efe75411 ths
    struct qemu_alarm_win32 *data = t->priv;
1496 efe75411 ths
1497 0fdddf80 Jan Kiszka
    if (!active_timers[QEMU_CLOCK_REALTIME] &&
1498 21d5d12b Jan Kiszka
        !active_timers[QEMU_CLOCK_VIRTUAL] &&
1499 21d5d12b Jan Kiszka
        !active_timers[QEMU_CLOCK_HOST])
1500 d5d08334 balrog
        return;
1501 efe75411 ths
1502 efe75411 ths
    timeKillEvent(data->timerId);
1503 efe75411 ths
1504 efe75411 ths
    data->timerId = timeSetEvent(1,
1505 efe75411 ths
                        data->period,
1506 efe75411 ths
                        host_alarm_handler,
1507 efe75411 ths
                        (DWORD)t,
1508 efe75411 ths
                        TIME_ONESHOT | TIME_PERIODIC);
1509 efe75411 ths
1510 efe75411 ths
    if (!data->timerId) {
1511 20889d4e Blue Swirl
        fprintf(stderr, "Failed to re-arm win32 alarm timer %ld\n",
1512 705e83f6 malc
                GetLastError());
1513 efe75411 ths
1514 efe75411 ths
        timeEndPeriod(data->period);
1515 efe75411 ths
        exit(1);
1516 efe75411 ths
    }
1517 efe75411 ths
}
1518 efe75411 ths
1519 c8994013 ths
#endif /* _WIN32 */
1520 c8994013 ths
1521 7183b4b4 aliguori
static int init_timer_alarm(void)
1522 8a7ddc38 bellard
{
1523 223f0d72 blueswir1
    struct qemu_alarm_timer *t = NULL;
1524 c8994013 ths
    int i, err = -1;
1525 f49e58dc aliguori
1526 c8994013 ths
    for (i = 0; alarm_timers[i].name; i++) {
1527 c8994013 ths
        t = &alarm_timers[i];
1528 c8994013 ths
1529 c8994013 ths
        err = t->start(t);
1530 c8994013 ths
        if (!err)
1531 c8994013 ths
            break;
1532 67b915a5 bellard
    }
1533 fd872598 bellard
1534 c8994013 ths
    if (err) {
1535 7183b4b4 aliguori
        err = -ENOENT;
1536 7183b4b4 aliguori
        goto fail;
1537 67b915a5 bellard
    }
1538 c8994013 ths
1539 c8994013 ths
    alarm_timer = t;
1540 7183b4b4 aliguori
1541 6abfbd79 aliguori
    return 0;
1542 7183b4b4 aliguori
1543 7183b4b4 aliguori
fail:
1544 7183b4b4 aliguori
    return err;
1545 8a7ddc38 bellard
}
1546 8a7ddc38 bellard
1547 9596ebb7 pbrook
static void quit_timers(void)
1548 40c3bac3 bellard
{
1549 c8994013 ths
    alarm_timer->stop(alarm_timer);
1550 c8994013 ths
    alarm_timer = NULL;
1551 40c3bac3 bellard
}
1552 40c3bac3 bellard
1553 c4b1fcc0 bellard
/***********************************************************/
1554 f6503059 balrog
/* host time/date access */
1555 f6503059 balrog
void qemu_get_timedate(struct tm *tm, int offset)
1556 f6503059 balrog
{
1557 f6503059 balrog
    time_t ti;
1558 f6503059 balrog
    struct tm *ret;
1559 f6503059 balrog
1560 f6503059 balrog
    time(&ti);
1561 f6503059 balrog
    ti += offset;
1562 f6503059 balrog
    if (rtc_date_offset == -1) {
1563 f6503059 balrog
        if (rtc_utc)
1564 f6503059 balrog
            ret = gmtime(&ti);
1565 f6503059 balrog
        else
1566 f6503059 balrog
            ret = localtime(&ti);
1567 f6503059 balrog
    } else {
1568 f6503059 balrog
        ti -= rtc_date_offset;
1569 f6503059 balrog
        ret = gmtime(&ti);
1570 f6503059 balrog
    }
1571 f6503059 balrog
1572 f6503059 balrog
    memcpy(tm, ret, sizeof(struct tm));
1573 f6503059 balrog
}
1574 f6503059 balrog
1575 f6503059 balrog
int qemu_timedate_diff(struct tm *tm)
1576 f6503059 balrog
{
1577 f6503059 balrog
    time_t seconds;
1578 f6503059 balrog
1579 f6503059 balrog
    if (rtc_date_offset == -1)
1580 f6503059 balrog
        if (rtc_utc)
1581 f6503059 balrog
            seconds = mktimegm(tm);
1582 f6503059 balrog
        else
1583 f6503059 balrog
            seconds = mktime(tm);
1584 f6503059 balrog
    else
1585 f6503059 balrog
        seconds = mktimegm(tm) + rtc_date_offset;
1586 f6503059 balrog
1587 f6503059 balrog
    return seconds - time(NULL);
1588 f6503059 balrog
}
1589 f6503059 balrog
1590 1ed2fc1f Jan Kiszka
static void configure_rtc_date_offset(const char *startdate, int legacy)
1591 1ed2fc1f Jan Kiszka
{
1592 1ed2fc1f Jan Kiszka
    time_t rtc_start_date;
1593 1ed2fc1f Jan Kiszka
    struct tm tm;
1594 1ed2fc1f Jan Kiszka
1595 1ed2fc1f Jan Kiszka
    if (!strcmp(startdate, "now") && legacy) {
1596 1ed2fc1f Jan Kiszka
        rtc_date_offset = -1;
1597 1ed2fc1f Jan Kiszka
    } else {
1598 1ed2fc1f Jan Kiszka
        if (sscanf(startdate, "%d-%d-%dT%d:%d:%d",
1599 1ed2fc1f Jan Kiszka
                   &tm.tm_year,
1600 1ed2fc1f Jan Kiszka
                   &tm.tm_mon,
1601 1ed2fc1f Jan Kiszka
                   &tm.tm_mday,
1602 1ed2fc1f Jan Kiszka
                   &tm.tm_hour,
1603 1ed2fc1f Jan Kiszka
                   &tm.tm_min,
1604 1ed2fc1f Jan Kiszka
                   &tm.tm_sec) == 6) {
1605 1ed2fc1f Jan Kiszka
            /* OK */
1606 1ed2fc1f Jan Kiszka
        } else if (sscanf(startdate, "%d-%d-%d",
1607 1ed2fc1f Jan Kiszka
                          &tm.tm_year,
1608 1ed2fc1f Jan Kiszka
                          &tm.tm_mon,
1609 1ed2fc1f Jan Kiszka
                          &tm.tm_mday) == 3) {
1610 1ed2fc1f Jan Kiszka
            tm.tm_hour = 0;
1611 1ed2fc1f Jan Kiszka
            tm.tm_min = 0;
1612 1ed2fc1f Jan Kiszka
            tm.tm_sec = 0;
1613 1ed2fc1f Jan Kiszka
        } else {
1614 1ed2fc1f Jan Kiszka
            goto date_fail;
1615 1ed2fc1f Jan Kiszka
        }
1616 1ed2fc1f Jan Kiszka
        tm.tm_year -= 1900;
1617 1ed2fc1f Jan Kiszka
        tm.tm_mon--;
1618 1ed2fc1f Jan Kiszka
        rtc_start_date = mktimegm(&tm);
1619 1ed2fc1f Jan Kiszka
        if (rtc_start_date == -1) {
1620 1ed2fc1f Jan Kiszka
        date_fail:
1621 1ed2fc1f Jan Kiszka
            fprintf(stderr, "Invalid date format. Valid formats are:\n"
1622 1ed2fc1f Jan Kiszka
                            "'2006-06-17T16:01:21' or '2006-06-17'\n");
1623 1ed2fc1f Jan Kiszka
            exit(1);
1624 1ed2fc1f Jan Kiszka
        }
1625 1ed2fc1f Jan Kiszka
        rtc_date_offset = time(NULL) - rtc_start_date;
1626 1ed2fc1f Jan Kiszka
    }
1627 1ed2fc1f Jan Kiszka
}
1628 1ed2fc1f Jan Kiszka
1629 1ed2fc1f Jan Kiszka
static void configure_rtc(QemuOpts *opts)
1630 1ed2fc1f Jan Kiszka
{
1631 1ed2fc1f Jan Kiszka
    const char *value;
1632 1ed2fc1f Jan Kiszka
1633 1ed2fc1f Jan Kiszka
    value = qemu_opt_get(opts, "base");
1634 1ed2fc1f Jan Kiszka
    if (value) {
1635 1ed2fc1f Jan Kiszka
        if (!strcmp(value, "utc")) {
1636 1ed2fc1f Jan Kiszka
            rtc_utc = 1;
1637 1ed2fc1f Jan Kiszka
        } else if (!strcmp(value, "localtime")) {
1638 1ed2fc1f Jan Kiszka
            rtc_utc = 0;
1639 1ed2fc1f Jan Kiszka
        } else {
1640 1ed2fc1f Jan Kiszka
            configure_rtc_date_offset(value, 0);
1641 1ed2fc1f Jan Kiszka
        }
1642 1ed2fc1f Jan Kiszka
    }
1643 6875204c Jan Kiszka
    value = qemu_opt_get(opts, "clock");
1644 6875204c Jan Kiszka
    if (value) {
1645 6875204c Jan Kiszka
        if (!strcmp(value, "host")) {
1646 6875204c Jan Kiszka
            rtc_clock = host_clock;
1647 6875204c Jan Kiszka
        } else if (!strcmp(value, "vm")) {
1648 6875204c Jan Kiszka
            rtc_clock = vm_clock;
1649 6875204c Jan Kiszka
        } else {
1650 6875204c Jan Kiszka
            fprintf(stderr, "qemu: invalid option value '%s'\n", value);
1651 6875204c Jan Kiszka
            exit(1);
1652 6875204c Jan Kiszka
        }
1653 6875204c Jan Kiszka
    }
1654 1ed2fc1f Jan Kiszka
#ifdef CONFIG_TARGET_I386
1655 1ed2fc1f Jan Kiszka
    value = qemu_opt_get(opts, "driftfix");
1656 1ed2fc1f Jan Kiszka
    if (value) {
1657 1ed2fc1f Jan Kiszka
        if (!strcmp(buf, "slew")) {
1658 1ed2fc1f Jan Kiszka
            rtc_td_hack = 1;
1659 1ed2fc1f Jan Kiszka
        } else if (!strcmp(buf, "none")) {
1660 1ed2fc1f Jan Kiszka
            rtc_td_hack = 0;
1661 1ed2fc1f Jan Kiszka
        } else {
1662 1ed2fc1f Jan Kiszka
            fprintf(stderr, "qemu: invalid option value '%s'\n", value);
1663 1ed2fc1f Jan Kiszka
            exit(1);
1664 1ed2fc1f Jan Kiszka
        }
1665 1ed2fc1f Jan Kiszka
    }
1666 1ed2fc1f Jan Kiszka
#endif
1667 1ed2fc1f Jan Kiszka
}
1668 1ed2fc1f Jan Kiszka
1669 fd1dff4b bellard
#ifdef _WIN32
1670 fd1dff4b bellard
static void socket_cleanup(void)
1671 fd1dff4b bellard
{
1672 fd1dff4b bellard
    WSACleanup();
1673 fd1dff4b bellard
}
1674 82c643ff bellard
1675 fd1dff4b bellard
static int socket_init(void)
1676 fd1dff4b bellard
{
1677 fd1dff4b bellard
    WSADATA Data;
1678 fd1dff4b bellard
    int ret, err;
1679 fd1dff4b bellard
1680 fd1dff4b bellard
    ret = WSAStartup(MAKEWORD(2,2), &Data);
1681 fd1dff4b bellard
    if (ret != 0) {
1682 fd1dff4b bellard
        err = WSAGetLastError();
1683 fd1dff4b bellard
        fprintf(stderr, "WSAStartup: %d\n", err);
1684 fd1dff4b bellard
        return -1;
1685 fd1dff4b bellard
    }
1686 fd1dff4b bellard
    atexit(socket_cleanup);
1687 fd1dff4b bellard
    return 0;
1688 fd1dff4b bellard
}
1689 64b7b733 aurel32
#endif
1690 64b7b733 aurel32
1691 1ae26a18 balrog
/***********************************************************/
1692 1ae26a18 balrog
/* Bluetooth support */
1693 1ae26a18 balrog
static int nb_hcis;
1694 1ae26a18 balrog
static int cur_hci;
1695 1ae26a18 balrog
static struct HCIInfo *hci_table[MAX_NICS];
1696 dc72ac14 balrog
1697 1ae26a18 balrog
static struct bt_vlan_s {
1698 1ae26a18 balrog
    struct bt_scatternet_s net;
1699 1ae26a18 balrog
    int id;
1700 1ae26a18 balrog
    struct bt_vlan_s *next;
1701 1ae26a18 balrog
} *first_bt_vlan;
1702 1ae26a18 balrog
1703 1ae26a18 balrog
/* find or alloc a new bluetooth "VLAN" */
1704 674bb261 blueswir1
static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
1705 1ae26a18 balrog
{
1706 1ae26a18 balrog
    struct bt_vlan_s **pvlan, *vlan;
1707 1ae26a18 balrog
    for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
1708 1ae26a18 balrog
        if (vlan->id == id)
1709 1ae26a18 balrog
            return &vlan->net;
1710 1ae26a18 balrog
    }
1711 1ae26a18 balrog
    vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
1712 1ae26a18 balrog
    vlan->id = id;
1713 1ae26a18 balrog
    pvlan = &first_bt_vlan;
1714 1ae26a18 balrog
    while (*pvlan != NULL)
1715 1ae26a18 balrog
        pvlan = &(*pvlan)->next;
1716 1ae26a18 balrog
    *pvlan = vlan;
1717 1ae26a18 balrog
    return &vlan->net;
1718 1ae26a18 balrog
}
1719 1ae26a18 balrog
1720 1ae26a18 balrog
static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
1721 1ae26a18 balrog
{
1722 1ae26a18 balrog
}
1723 1ae26a18 balrog
1724 1ae26a18 balrog
static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
1725 1ae26a18 balrog
{
1726 1ae26a18 balrog
    return -ENOTSUP;
1727 1ae26a18 balrog
}
1728 1ae26a18 balrog
1729 1ae26a18 balrog
static struct HCIInfo null_hci = {
1730 1ae26a18 balrog
    .cmd_send = null_hci_send,
1731 1ae26a18 balrog
    .sco_send = null_hci_send,
1732 1ae26a18 balrog
    .acl_send = null_hci_send,
1733 1ae26a18 balrog
    .bdaddr_set = null_hci_addr_set,
1734 1ae26a18 balrog
};
1735 1ae26a18 balrog
1736 1ae26a18 balrog
struct HCIInfo *qemu_next_hci(void)
1737 1ae26a18 balrog
{
1738 1ae26a18 balrog
    if (cur_hci == nb_hcis)
1739 1ae26a18 balrog
        return &null_hci;
1740 1ae26a18 balrog
1741 1ae26a18 balrog
    return hci_table[cur_hci++];
1742 1ae26a18 balrog
}
1743 1ae26a18 balrog
1744 dc72ac14 balrog
static struct HCIInfo *hci_init(const char *str)
1745 dc72ac14 balrog
{
1746 dc72ac14 balrog
    char *endp;
1747 dc72ac14 balrog
    struct bt_scatternet_s *vlan = 0;
1748 dc72ac14 balrog
1749 dc72ac14 balrog
    if (!strcmp(str, "null"))
1750 dc72ac14 balrog
        /* null */
1751 dc72ac14 balrog
        return &null_hci;
1752 dc72ac14 balrog
    else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
1753 dc72ac14 balrog
        /* host[:hciN] */
1754 dc72ac14 balrog
        return bt_host_hci(str[4] ? str + 5 : "hci0");
1755 dc72ac14 balrog
    else if (!strncmp(str, "hci", 3)) {
1756 dc72ac14 balrog
        /* hci[,vlan=n] */
1757 dc72ac14 balrog
        if (str[3]) {
1758 dc72ac14 balrog
            if (!strncmp(str + 3, ",vlan=", 6)) {
1759 dc72ac14 balrog
                vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
1760 dc72ac14 balrog
                if (*endp)
1761 dc72ac14 balrog
                    vlan = 0;
1762 dc72ac14 balrog
            }
1763 dc72ac14 balrog
        } else
1764 dc72ac14 balrog
            vlan = qemu_find_bt_vlan(0);
1765 dc72ac14 balrog
        if (vlan)
1766 dc72ac14 balrog
           return bt_new_hci(vlan);
1767 dc72ac14 balrog
    }
1768 dc72ac14 balrog
1769 dc72ac14 balrog
    fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
1770 dc72ac14 balrog
1771 dc72ac14 balrog
    return 0;
1772 dc72ac14 balrog
}
1773 dc72ac14 balrog
1774 dc72ac14 balrog
static int bt_hci_parse(const char *str)
1775 dc72ac14 balrog
{
1776 dc72ac14 balrog
    struct HCIInfo *hci;
1777 c227f099 Anthony Liguori
    bdaddr_t bdaddr;
1778 dc72ac14 balrog
1779 dc72ac14 balrog
    if (nb_hcis >= MAX_NICS) {
1780 dc72ac14 balrog
        fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n", MAX_NICS);
1781 dc72ac14 balrog
        return -1;
1782 dc72ac14 balrog
    }
1783 dc72ac14 balrog
1784 dc72ac14 balrog
    hci = hci_init(str);
1785 dc72ac14 balrog
    if (!hci)
1786 dc72ac14 balrog
        return -1;
1787 dc72ac14 balrog
1788 dc72ac14 balrog
    bdaddr.b[0] = 0x52;
1789 dc72ac14 balrog
    bdaddr.b[1] = 0x54;
1790 dc72ac14 balrog
    bdaddr.b[2] = 0x00;
1791 dc72ac14 balrog
    bdaddr.b[3] = 0x12;
1792 dc72ac14 balrog
    bdaddr.b[4] = 0x34;
1793 dc72ac14 balrog
    bdaddr.b[5] = 0x56 + nb_hcis;
1794 dc72ac14 balrog
    hci->bdaddr_set(hci, bdaddr.b);
1795 dc72ac14 balrog
1796 dc72ac14 balrog
    hci_table[nb_hcis++] = hci;
1797 dc72ac14 balrog
1798 dc72ac14 balrog
    return 0;
1799 dc72ac14 balrog
}
1800 dc72ac14 balrog
1801 dc72ac14 balrog
static void bt_vhci_add(int vlan_id)
1802 dc72ac14 balrog
{
1803 dc72ac14 balrog
    struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);
1804 dc72ac14 balrog
1805 dc72ac14 balrog
    if (!vlan->slave)
1806 dc72ac14 balrog
        fprintf(stderr, "qemu: warning: adding a VHCI to "
1807 dc72ac14 balrog
                        "an empty scatternet %i\n", vlan_id);
1808 dc72ac14 balrog
1809 dc72ac14 balrog
    bt_vhci_init(bt_new_hci(vlan));
1810 dc72ac14 balrog
}
1811 dc72ac14 balrog
1812 dc72ac14 balrog
static struct bt_device_s *bt_device_add(const char *opt)
1813 dc72ac14 balrog
{
1814 dc72ac14 balrog
    struct bt_scatternet_s *vlan;
1815 dc72ac14 balrog
    int vlan_id = 0;
1816 dc72ac14 balrog
    char *endp = strstr(opt, ",vlan=");
1817 dc72ac14 balrog
    int len = (endp ? endp - opt : strlen(opt)) + 1;
1818 dc72ac14 balrog
    char devname[10];
1819 dc72ac14 balrog
1820 dc72ac14 balrog
    pstrcpy(devname, MIN(sizeof(devname), len), opt);
1821 dc72ac14 balrog
1822 dc72ac14 balrog
    if (endp) {
1823 dc72ac14 balrog
        vlan_id = strtol(endp + 6, &endp, 0);
1824 dc72ac14 balrog
        if (*endp) {
1825 dc72ac14 balrog
            fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
1826 dc72ac14 balrog
            return 0;
1827 dc72ac14 balrog
        }
1828 dc72ac14 balrog
    }
1829 dc72ac14 balrog
1830 dc72ac14 balrog
    vlan = qemu_find_bt_vlan(vlan_id);
1831 dc72ac14 balrog
1832 dc72ac14 balrog
    if (!vlan->slave)
1833 dc72ac14 balrog
        fprintf(stderr, "qemu: warning: adding a slave device to "
1834 dc72ac14 balrog
                        "an empty scatternet %i\n", vlan_id);
1835 dc72ac14 balrog
1836 dc72ac14 balrog
    if (!strcmp(devname, "keyboard"))
1837 dc72ac14 balrog
        return bt_keyboard_init(vlan);
1838 dc72ac14 balrog
1839 dc72ac14 balrog
    fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
1840 dc72ac14 balrog
    return 0;
1841 dc72ac14 balrog
}
1842 dc72ac14 balrog
1843 dc72ac14 balrog
static int bt_parse(const char *opt)
1844 dc72ac14 balrog
{
1845 dc72ac14 balrog
    const char *endp, *p;
1846 dc72ac14 balrog
    int vlan;
1847 dc72ac14 balrog
1848 dc72ac14 balrog
    if (strstart(opt, "hci", &endp)) {
1849 dc72ac14 balrog
        if (!*endp || *endp == ',') {
1850 dc72ac14 balrog
            if (*endp)
1851 dc72ac14 balrog
                if (!strstart(endp, ",vlan=", 0))
1852 dc72ac14 balrog
                    opt = endp + 1;
1853 dc72ac14 balrog
1854 dc72ac14 balrog
            return bt_hci_parse(opt);
1855 dc72ac14 balrog
       }
1856 dc72ac14 balrog
    } else if (strstart(opt, "vhci", &endp)) {
1857 dc72ac14 balrog
        if (!*endp || *endp == ',') {
1858 dc72ac14 balrog
            if (*endp) {
1859 dc72ac14 balrog
                if (strstart(endp, ",vlan=", &p)) {
1860 dc72ac14 balrog
                    vlan = strtol(p, (char **) &endp, 0);
1861 dc72ac14 balrog
                    if (*endp) {
1862 dc72ac14 balrog
                        fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
1863 dc72ac14 balrog
                        return 1;
1864 dc72ac14 balrog
                    }
1865 dc72ac14 balrog
                } else {
1866 dc72ac14 balrog
                    fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
1867 dc72ac14 balrog
                    return 1;
1868 dc72ac14 balrog
                }
1869 dc72ac14 balrog
            } else
1870 dc72ac14 balrog
                vlan = 0;
1871 dc72ac14 balrog
1872 dc72ac14 balrog
            bt_vhci_add(vlan);
1873 dc72ac14 balrog
            return 0;
1874 dc72ac14 balrog
        }
1875 dc72ac14 balrog
    } else if (strstart(opt, "device:", &endp))
1876 dc72ac14 balrog
        return !bt_device_add(endp);
1877 dc72ac14 balrog
1878 dc72ac14 balrog
    fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
1879 dc72ac14 balrog
    return 1;
1880 dc72ac14 balrog
}
1881 dc72ac14 balrog
1882 1ae26a18 balrog
/***********************************************************/
1883 1ae26a18 balrog
/* QEMU Block devices */
1884 1ae26a18 balrog
1885 609497ab balrog
#define HD_ALIAS "index=%d,media=disk"
1886 e4bcb14c ths
#define CDROM_ALIAS "index=2,media=cdrom"
1887 e4bcb14c ths
#define FD_ALIAS "index=%d,if=floppy"
1888 609497ab balrog
#define PFLASH_ALIAS "if=pflash"
1889 609497ab balrog
#define MTD_ALIAS "if=mtd"
1890 9d413d1d balrog
#define SD_ALIAS "index=0,if=sd"
1891 e4bcb14c ths
1892 9dfd7c7a Gerd Hoffmann
QemuOpts *drive_add(const char *file, const char *fmt, ...)
1893 e4bcb14c ths
{
1894 e4bcb14c ths
    va_list ap;
1895 9dfd7c7a Gerd Hoffmann
    char optstr[1024];
1896 9dfd7c7a Gerd Hoffmann
    QemuOpts *opts;
1897 e4bcb14c ths
1898 e4bcb14c ths
    va_start(ap, fmt);
1899 9dfd7c7a Gerd Hoffmann
    vsnprintf(optstr, sizeof(optstr), fmt, ap);
1900 e4bcb14c ths
    va_end(ap);
1901 e4bcb14c ths
1902 7282a033 Gerd Hoffmann
    opts = qemu_opts_parse(&qemu_drive_opts, optstr, NULL);
1903 9dfd7c7a Gerd Hoffmann
    if (!opts) {
1904 9dfd7c7a Gerd Hoffmann
        fprintf(stderr, "%s: huh? duplicate? (%s)\n",
1905 9dfd7c7a Gerd Hoffmann
                __FUNCTION__, optstr);
1906 9dfd7c7a Gerd Hoffmann
        return NULL;
1907 9dfd7c7a Gerd Hoffmann
    }
1908 9dfd7c7a Gerd Hoffmann
    if (file)
1909 9dfd7c7a Gerd Hoffmann
        qemu_opt_set(opts, "file", file);
1910 9dfd7c7a Gerd Hoffmann
    return opts;
1911 b01b1111 aliguori
}
1912 b01b1111 aliguori
1913 751c6a17 Gerd Hoffmann
DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
1914 e4bcb14c ths
{
1915 751c6a17 Gerd Hoffmann
    DriveInfo *dinfo;
1916 e4bcb14c ths
1917 e4bcb14c ths
    /* seek interface, bus and unit */
1918 e4bcb14c ths
1919 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(dinfo, &drives, next) {
1920 751c6a17 Gerd Hoffmann
        if (dinfo->type == type &&
1921 751c6a17 Gerd Hoffmann
            dinfo->bus == bus &&
1922 751c6a17 Gerd Hoffmann
            dinfo->unit == unit)
1923 751c6a17 Gerd Hoffmann
            return dinfo;
1924 751c6a17 Gerd Hoffmann
    }
1925 e4bcb14c ths
1926 751c6a17 Gerd Hoffmann
    return NULL;
1927 e4bcb14c ths
}
1928 e4bcb14c ths
1929 2e810b36 Gerd Hoffmann
DriveInfo *drive_get_by_id(const char *id)
1930 1dae12e6 Gerd Hoffmann
{
1931 1dae12e6 Gerd Hoffmann
    DriveInfo *dinfo;
1932 1dae12e6 Gerd Hoffmann
1933 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(dinfo, &drives, next) {
1934 1dae12e6 Gerd Hoffmann
        if (strcmp(id, dinfo->id))
1935 1dae12e6 Gerd Hoffmann
            continue;
1936 1dae12e6 Gerd Hoffmann
        return dinfo;
1937 1dae12e6 Gerd Hoffmann
    }
1938 1dae12e6 Gerd Hoffmann
    return NULL;
1939 1dae12e6 Gerd Hoffmann
}
1940 1dae12e6 Gerd Hoffmann
1941 f60d39bc ths
int drive_get_max_bus(BlockInterfaceType type)
1942 e4bcb14c ths
{
1943 e4bcb14c ths
    int max_bus;
1944 751c6a17 Gerd Hoffmann
    DriveInfo *dinfo;
1945 e4bcb14c ths
1946 e4bcb14c ths
    max_bus = -1;
1947 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(dinfo, &drives, next) {
1948 751c6a17 Gerd Hoffmann
        if(dinfo->type == type &&
1949 751c6a17 Gerd Hoffmann
           dinfo->bus > max_bus)
1950 751c6a17 Gerd Hoffmann
            max_bus = dinfo->bus;
1951 e4bcb14c ths
    }
1952 e4bcb14c ths
    return max_bus;
1953 e4bcb14c ths
}
1954 e4bcb14c ths
1955 fa879c64 aliguori
const char *drive_get_serial(BlockDriverState *bdrv)
1956 fa879c64 aliguori
{
1957 751c6a17 Gerd Hoffmann
    DriveInfo *dinfo;
1958 fa879c64 aliguori
1959 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(dinfo, &drives, next) {
1960 751c6a17 Gerd Hoffmann
        if (dinfo->bdrv == bdrv)
1961 751c6a17 Gerd Hoffmann
            return dinfo->serial;
1962 751c6a17 Gerd Hoffmann
    }
1963 fa879c64 aliguori
1964 fa879c64 aliguori
    return "\0";
1965 fa879c64 aliguori
}
1966 fa879c64 aliguori
1967 428c5705 aliguori
BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv)
1968 428c5705 aliguori
{
1969 751c6a17 Gerd Hoffmann
    DriveInfo *dinfo;
1970 428c5705 aliguori
1971 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(dinfo, &drives, next) {
1972 751c6a17 Gerd Hoffmann
        if (dinfo->bdrv == bdrv)
1973 751c6a17 Gerd Hoffmann
            return dinfo->onerror;
1974 751c6a17 Gerd Hoffmann
    }
1975 428c5705 aliguori
1976 cdad4bd8 aliguori
    return BLOCK_ERR_STOP_ENOSPC;
1977 428c5705 aliguori
}
1978 428c5705 aliguori
1979 a1620fac aurel32
static void bdrv_format_print(void *opaque, const char *name)
1980 a1620fac aurel32
{
1981 a1620fac aurel32
    fprintf(stderr, " %s", name);
1982 a1620fac aurel32
}
1983 a1620fac aurel32
1984 56a14938 Gerd Hoffmann
void drive_uninit(DriveInfo *dinfo)
1985 b01b1111 aliguori
{
1986 56a14938 Gerd Hoffmann
    qemu_opts_del(dinfo->opts);
1987 56a14938 Gerd Hoffmann
    bdrv_delete(dinfo->bdrv);
1988 56a14938 Gerd Hoffmann
    QTAILQ_REMOVE(&drives, dinfo, next);
1989 56a14938 Gerd Hoffmann
    qemu_free(dinfo);
1990 b01b1111 aliguori
}
1991 b01b1111 aliguori
1992 9dfd7c7a Gerd Hoffmann
DriveInfo *drive_init(QemuOpts *opts, void *opaque,
1993 751c6a17 Gerd Hoffmann
                      int *fatal_error)
1994 e4bcb14c ths
{
1995 9dfd7c7a Gerd Hoffmann
    const char *buf;
1996 9dfd7c7a Gerd Hoffmann
    const char *file = NULL;
1997 c8522bdf balrog
    char devname[128];
1998 9dfd7c7a Gerd Hoffmann
    const char *serial;
1999 c8522bdf balrog
    const char *mediastr = "";
2000 f60d39bc ths
    BlockInterfaceType type;
2001 e4bcb14c ths
    enum { MEDIA_DISK, MEDIA_CDROM } media;
2002 e4bcb14c ths
    int bus_id, unit_id;
2003 e4bcb14c ths
    int cyls, heads, secs, translation;
2004 1e72d3b7 aurel32
    BlockDriver *drv = NULL;
2005 4d73cd3b aliguori
    QEMUMachine *machine = opaque;
2006 e4bcb14c ths
    int max_devs;
2007 e4bcb14c ths
    int index;
2008 33f00271 balrog
    int cache;
2009 5c6c3a6c Christoph Hellwig
    int aio = 0;
2010 428c5705 aliguori
    int bdrv_flags, onerror;
2011 c2cc47a4 Markus Armbruster
    const char *devaddr;
2012 751c6a17 Gerd Hoffmann
    DriveInfo *dinfo;
2013 9dfd7c7a Gerd Hoffmann
    int snapshot = 0;
2014 e4bcb14c ths
2015 9dfd7c7a Gerd Hoffmann
    *fatal_error = 1;
2016 e4bcb14c ths
2017 e4bcb14c ths
    translation = BIOS_ATA_TRANSLATION_AUTO;
2018 0aa217e4 Kevin Wolf
    cache = 1;
2019 e4bcb14c ths
2020 4d007814 Gerd Hoffmann
    if (machine && machine->use_scsi) {
2021 f60d39bc ths
        type = IF_SCSI;
2022 e4bcb14c ths
        max_devs = MAX_SCSI_DEVS;
2023 363a37d5 blueswir1
        pstrcpy(devname, sizeof(devname), "scsi");
2024 e4bcb14c ths
    } else {
2025 f60d39bc ths
        type = IF_IDE;
2026 e4bcb14c ths
        max_devs = MAX_IDE_DEVS;
2027 363a37d5 blueswir1
        pstrcpy(devname, sizeof(devname), "ide");
2028 e4bcb14c ths
    }
2029 e4bcb14c ths
    media = MEDIA_DISK;
2030 e4bcb14c ths
2031 e4bcb14c ths
    /* extract parameters */
2032 9dfd7c7a Gerd Hoffmann
    bus_id  = qemu_opt_get_number(opts, "bus", 0);
2033 9dfd7c7a Gerd Hoffmann
    unit_id = qemu_opt_get_number(opts, "unit", -1);
2034 9dfd7c7a Gerd Hoffmann
    index   = qemu_opt_get_number(opts, "index", -1);
2035 e4bcb14c ths
2036 9dfd7c7a Gerd Hoffmann
    cyls  = qemu_opt_get_number(opts, "cyls", 0);
2037 9dfd7c7a Gerd Hoffmann
    heads = qemu_opt_get_number(opts, "heads", 0);
2038 9dfd7c7a Gerd Hoffmann
    secs  = qemu_opt_get_number(opts, "secs", 0);
2039 e4bcb14c ths
2040 9dfd7c7a Gerd Hoffmann
    snapshot = qemu_opt_get_bool(opts, "snapshot", 0);
2041 e4bcb14c ths
2042 9dfd7c7a Gerd Hoffmann
    file = qemu_opt_get(opts, "file");
2043 9dfd7c7a Gerd Hoffmann
    serial = qemu_opt_get(opts, "serial");
2044 9dfd7c7a Gerd Hoffmann
2045 9dfd7c7a Gerd Hoffmann
    if ((buf = qemu_opt_get(opts, "if")) != NULL) {
2046 ae45d369 bellard
        pstrcpy(devname, sizeof(devname), buf);
2047 e4bcb14c ths
        if (!strcmp(buf, "ide")) {
2048 f60d39bc ths
            type = IF_IDE;
2049 e4bcb14c ths
            max_devs = MAX_IDE_DEVS;
2050 e4bcb14c ths
        } else if (!strcmp(buf, "scsi")) {
2051 f60d39bc ths
            type = IF_SCSI;
2052 e4bcb14c ths
            max_devs = MAX_SCSI_DEVS;
2053 e4bcb14c ths
        } else if (!strcmp(buf, "floppy")) {
2054 f60d39bc ths
            type = IF_FLOPPY;
2055 e4bcb14c ths
            max_devs = 0;
2056 e4bcb14c ths
        } else if (!strcmp(buf, "pflash")) {
2057 f60d39bc ths
            type = IF_PFLASH;
2058 e4bcb14c ths
            max_devs = 0;
2059 e4bcb14c ths
        } else if (!strcmp(buf, "mtd")) {
2060 f60d39bc ths
            type = IF_MTD;
2061 e4bcb14c ths
            max_devs = 0;
2062 e4bcb14c ths
        } else if (!strcmp(buf, "sd")) {
2063 f60d39bc ths
            type = IF_SD;
2064 e4bcb14c ths
            max_devs = 0;
2065 6e02c38d aliguori
        } else if (!strcmp(buf, "virtio")) {
2066 6e02c38d aliguori
            type = IF_VIRTIO;
2067 6e02c38d aliguori
            max_devs = 0;
2068 62d23efa aliguori
        } else if (!strcmp(buf, "xen")) {
2069 62d23efa aliguori
            type = IF_XEN;
2070 62d23efa aliguori
            max_devs = 0;
2071 a8659e90 Gerd Hoffmann
        } else if (!strcmp(buf, "none")) {
2072 a8659e90 Gerd Hoffmann
            type = IF_NONE;
2073 a8659e90 Gerd Hoffmann
            max_devs = 0;
2074 62d23efa aliguori
        } else {
2075 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "qemu: unsupported bus type '%s'\n", buf);
2076 751c6a17 Gerd Hoffmann
            return NULL;
2077 e4bcb14c ths
        }
2078 e4bcb14c ths
    }
2079 e4bcb14c ths
2080 e4bcb14c ths
    if (cyls || heads || secs) {
2081 e4bcb14c ths
        if (cyls < 1 || cyls > 16383) {
2082 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", buf);
2083 751c6a17 Gerd Hoffmann
            return NULL;
2084 e4bcb14c ths
        }
2085 e4bcb14c ths
        if (heads < 1 || heads > 16) {
2086 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "qemu: '%s' invalid physical heads number\n", buf);
2087 751c6a17 Gerd Hoffmann
            return NULL;
2088 e4bcb14c ths
        }
2089 e4bcb14c ths
        if (secs < 1 || secs > 63) {
2090 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "qemu: '%s' invalid physical secs number\n", buf);
2091 751c6a17 Gerd Hoffmann
            return NULL;
2092 e4bcb14c ths
        }
2093 e4bcb14c ths
    }
2094 e4bcb14c ths
2095 9dfd7c7a Gerd Hoffmann
    if ((buf = qemu_opt_get(opts, "trans")) != NULL) {
2096 e4bcb14c ths
        if (!cyls) {
2097 e4bcb14c ths
            fprintf(stderr,
2098 e4bcb14c ths
                    "qemu: '%s' trans must be used with cyls,heads and secs\n",
2099 9dfd7c7a Gerd Hoffmann
                    buf);
2100 751c6a17 Gerd Hoffmann
            return NULL;
2101 e4bcb14c ths
        }
2102 e4bcb14c ths
        if (!strcmp(buf, "none"))
2103 e4bcb14c ths
            translation = BIOS_ATA_TRANSLATION_NONE;
2104 e4bcb14c ths
        else if (!strcmp(buf, "lba"))
2105 e4bcb14c ths
            translation = BIOS_ATA_TRANSLATION_LBA;
2106 e4bcb14c ths
        else if (!strcmp(buf, "auto"))
2107 e4bcb14c ths
            translation = BIOS_ATA_TRANSLATION_AUTO;
2108 e4bcb14c ths
        else {
2109 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "qemu: '%s' invalid translation type\n", buf);
2110 751c6a17 Gerd Hoffmann
            return NULL;
2111 e4bcb14c ths
        }
2112 e4bcb14c ths
    }
2113 e4bcb14c ths
2114 9dfd7c7a Gerd Hoffmann
    if ((buf = qemu_opt_get(opts, "media")) != NULL) {
2115 e4bcb14c ths
        if (!strcmp(buf, "disk")) {
2116 e4bcb14c ths
            media = MEDIA_DISK;
2117 e4bcb14c ths
        } else if (!strcmp(buf, "cdrom")) {
2118 e4bcb14c ths
            if (cyls || secs || heads) {
2119 e4bcb14c ths
                fprintf(stderr,
2120 9dfd7c7a Gerd Hoffmann
                        "qemu: '%s' invalid physical CHS format\n", buf);
2121 751c6a17 Gerd Hoffmann
                return NULL;
2122 e4bcb14c ths
            }
2123 e4bcb14c ths
            media = MEDIA_CDROM;
2124 e4bcb14c ths
        } else {
2125 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "qemu: '%s' invalid media\n", buf);
2126 751c6a17 Gerd Hoffmann
            return NULL;
2127 e4bcb14c ths
        }
2128 e4bcb14c ths
    }
2129 e4bcb14c ths
2130 9dfd7c7a Gerd Hoffmann
    if ((buf = qemu_opt_get(opts, "cache")) != NULL) {
2131 9f7965c7 aliguori
        if (!strcmp(buf, "off") || !strcmp(buf, "none"))
2132 33f00271 balrog
            cache = 0;
2133 9f7965c7 aliguori
        else if (!strcmp(buf, "writethrough"))
2134 33f00271 balrog
            cache = 1;
2135 9f7965c7 aliguori
        else if (!strcmp(buf, "writeback"))
2136 9f7965c7 aliguori
            cache = 2;
2137 33f00271 balrog
        else {
2138 33f00271 balrog
           fprintf(stderr, "qemu: invalid cache option\n");
2139 751c6a17 Gerd Hoffmann
           return NULL;
2140 33f00271 balrog
        }
2141 33f00271 balrog
    }
2142 33f00271 balrog
2143 5c6c3a6c Christoph Hellwig
#ifdef CONFIG_LINUX_AIO
2144 5c6c3a6c Christoph Hellwig
    if ((buf = qemu_opt_get(opts, "aio")) != NULL) {
2145 5c6c3a6c Christoph Hellwig
        if (!strcmp(buf, "threads"))
2146 5c6c3a6c Christoph Hellwig
            aio = 0;
2147 5c6c3a6c Christoph Hellwig
        else if (!strcmp(buf, "native"))
2148 5c6c3a6c Christoph Hellwig
            aio = 1;
2149 5c6c3a6c Christoph Hellwig
        else {
2150 5c6c3a6c Christoph Hellwig
           fprintf(stderr, "qemu: invalid aio option\n");
2151 5c6c3a6c Christoph Hellwig
           return NULL;
2152 5c6c3a6c Christoph Hellwig
        }
2153 5c6c3a6c Christoph Hellwig
    }
2154 5c6c3a6c Christoph Hellwig
#endif
2155 5c6c3a6c Christoph Hellwig
2156 9dfd7c7a Gerd Hoffmann
    if ((buf = qemu_opt_get(opts, "format")) != NULL) {
2157 a1620fac aurel32
       if (strcmp(buf, "?") == 0) {
2158 a1620fac aurel32
            fprintf(stderr, "qemu: Supported formats:");
2159 a1620fac aurel32
            bdrv_iterate_format(bdrv_format_print, NULL);
2160 a1620fac aurel32
            fprintf(stderr, "\n");
2161 751c6a17 Gerd Hoffmann
            return NULL;
2162 a1620fac aurel32
        }
2163 1e72d3b7 aurel32
        drv = bdrv_find_format(buf);
2164 1e72d3b7 aurel32
        if (!drv) {
2165 1e72d3b7 aurel32
            fprintf(stderr, "qemu: '%s' invalid format\n", buf);
2166 751c6a17 Gerd Hoffmann
            return NULL;
2167 1e72d3b7 aurel32
        }
2168 1e72d3b7 aurel32
    }
2169 1e72d3b7 aurel32
2170 cdad4bd8 aliguori
    onerror = BLOCK_ERR_STOP_ENOSPC;
2171 9dfd7c7a Gerd Hoffmann
    if ((buf = qemu_opt_get(opts, "werror")) != NULL) {
2172 869a5c6d aliguori
        if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) {
2173 ea8a5d7f aliguori
            fprintf(stderr, "werror is no supported by this format\n");
2174 751c6a17 Gerd Hoffmann
            return NULL;
2175 428c5705 aliguori
        }
2176 428c5705 aliguori
        if (!strcmp(buf, "ignore"))
2177 428c5705 aliguori
            onerror = BLOCK_ERR_IGNORE;
2178 428c5705 aliguori
        else if (!strcmp(buf, "enospc"))
2179 428c5705 aliguori
            onerror = BLOCK_ERR_STOP_ENOSPC;
2180 428c5705 aliguori
        else if (!strcmp(buf, "stop"))
2181 428c5705 aliguori
            onerror = BLOCK_ERR_STOP_ANY;
2182 428c5705 aliguori
        else if (!strcmp(buf, "report"))
2183 428c5705 aliguori
            onerror = BLOCK_ERR_REPORT;
2184 428c5705 aliguori
        else {
2185 428c5705 aliguori
            fprintf(stderr, "qemu: '%s' invalid write error action\n", buf);
2186 751c6a17 Gerd Hoffmann
            return NULL;
2187 428c5705 aliguori
        }
2188 428c5705 aliguori
    }
2189 428c5705 aliguori
2190 9dfd7c7a Gerd Hoffmann
    if ((devaddr = qemu_opt_get(opts, "addr")) != NULL) {
2191 c2cc47a4 Markus Armbruster
        if (type != IF_VIRTIO) {
2192 9dfd7c7a Gerd Hoffmann
            fprintf(stderr, "addr is not supported\n");
2193 751c6a17 Gerd Hoffmann
            return NULL;
2194 c2cc47a4 Markus Armbruster
        }
2195 c2cc47a4 Markus Armbruster
    }
2196 c2cc47a4 Markus Armbruster
2197 e4bcb14c ths
    /* compute bus and unit according index */
2198 e4bcb14c ths
2199 e4bcb14c ths
    if (index != -1) {
2200 e4bcb14c ths
        if (bus_id != 0 || unit_id != -1) {
2201 e4bcb14c ths
            fprintf(stderr,
2202 9dfd7c7a Gerd Hoffmann
                    "qemu: index cannot be used with bus and unit\n");
2203 751c6a17 Gerd Hoffmann
            return NULL;
2204 e4bcb14c ths
        }
2205 e4bcb14c ths
        if (max_devs == 0)
2206 e4bcb14c ths
        {
2207 e4bcb14c ths
            unit_id = index;
2208 e4bcb14c ths
            bus_id = 0;
2209 e4bcb14c ths
        } else {
2210 e4bcb14c ths
            unit_id = index % max_devs;
2211 e4bcb14c ths
            bus_id = index / max_devs;
2212 e4bcb14c ths
        }
2213 e4bcb14c ths
    }
2214 e4bcb14c ths
2215 e4bcb14c ths
    /* if user doesn't specify a unit_id,
2216 e4bcb14c ths
     * try to find the first free
2217 e4bcb14c ths
     */
2218 e4bcb14c ths
2219 e4bcb14c ths
    if (unit_id == -1) {
2220 e4bcb14c ths
       unit_id = 0;
2221 751c6a17 Gerd Hoffmann
       while (drive_get(type, bus_id, unit_id) != NULL) {
2222 e4bcb14c ths
           unit_id++;
2223 e4bcb14c ths
           if (max_devs && unit_id >= max_devs) {
2224 e4bcb14c ths
               unit_id -= max_devs;
2225 e4bcb14c ths
               bus_id++;
2226 e4bcb14c ths
           }
2227 e4bcb14c ths
       }
2228 e4bcb14c ths
    }
2229 e4bcb14c ths
2230 e4bcb14c ths
    /* check unit id */
2231 e4bcb14c ths
2232 e4bcb14c ths
    if (max_devs && unit_id >= max_devs) {
2233 9dfd7c7a Gerd Hoffmann
        fprintf(stderr, "qemu: unit %d too big (max is %d)\n",
2234 9dfd7c7a Gerd Hoffmann
                unit_id, max_devs - 1);
2235 751c6a17 Gerd Hoffmann
        return NULL;
2236 e4bcb14c ths
    }
2237 e4bcb14c ths
2238 e4bcb14c ths
    /*
2239 e4bcb14c ths
     * ignore multiple definitions
2240 e4bcb14c ths
     */
2241 e4bcb14c ths
2242 751c6a17 Gerd Hoffmann
    if (drive_get(type, bus_id, unit_id) != NULL) {
2243 751c6a17 Gerd Hoffmann
        *fatal_error = 0;
2244 751c6a17 Gerd Hoffmann
        return NULL;
2245 751c6a17 Gerd Hoffmann
    }
2246 e4bcb14c ths
2247 e4bcb14c ths
    /* init */
2248 e4bcb14c ths
2249 751c6a17 Gerd Hoffmann
    dinfo = qemu_mallocz(sizeof(*dinfo));
2250 e23d9c4d Gerd Hoffmann
    if ((buf = qemu_opts_id(opts)) != NULL) {
2251 9dfd7c7a Gerd Hoffmann
        dinfo->id = qemu_strdup(buf);
2252 9dfd7c7a Gerd Hoffmann
    } else {
2253 1dae12e6 Gerd Hoffmann
        /* no id supplied -> create one */
2254 9dfd7c7a Gerd Hoffmann
        dinfo->id = qemu_mallocz(32);
2255 1dae12e6 Gerd Hoffmann
        if (type == IF_IDE || type == IF_SCSI)
2256 1dae12e6 Gerd Hoffmann
            mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
2257 1dae12e6 Gerd Hoffmann
        if (max_devs)
2258 9dfd7c7a Gerd Hoffmann
            snprintf(dinfo->id, 32, "%s%i%s%i",
2259 1dae12e6 Gerd Hoffmann
                     devname, bus_id, mediastr, unit_id);
2260 1dae12e6 Gerd Hoffmann
        else
2261 9dfd7c7a Gerd Hoffmann
            snprintf(dinfo->id, 32, "%s%s%i",
2262 1dae12e6 Gerd Hoffmann
                     devname, mediastr, unit_id);
2263 1dae12e6 Gerd Hoffmann
    }
2264 1dae12e6 Gerd Hoffmann
    dinfo->bdrv = bdrv_new(dinfo->id);
2265 751c6a17 Gerd Hoffmann
    dinfo->devaddr = devaddr;
2266 751c6a17 Gerd Hoffmann
    dinfo->type = type;
2267 751c6a17 Gerd Hoffmann
    dinfo->bus = bus_id;
2268 751c6a17 Gerd Hoffmann
    dinfo->unit = unit_id;
2269 751c6a17 Gerd Hoffmann
    dinfo->onerror = onerror;
2270 9dfd7c7a Gerd Hoffmann
    dinfo->opts = opts;
2271 9dfd7c7a Gerd Hoffmann
    if (serial)
2272 9dfd7c7a Gerd Hoffmann
        strncpy(dinfo->serial, serial, sizeof(serial));
2273 72cf2d4f Blue Swirl
    QTAILQ_INSERT_TAIL(&drives, dinfo, next);
2274 e4bcb14c ths
2275 f60d39bc ths
    switch(type) {
2276 e4bcb14c ths
    case IF_IDE:
2277 e4bcb14c ths
    case IF_SCSI:
2278 62d23efa aliguori
    case IF_XEN:
2279 c219331e Gerd Hoffmann
    case IF_NONE:
2280 e4bcb14c ths
        switch(media) {
2281 e4bcb14c ths
        case MEDIA_DISK:
2282 e4bcb14c ths
            if (cyls != 0) {
2283 1dae12e6 Gerd Hoffmann
                bdrv_set_geometry_hint(dinfo->bdrv, cyls, heads, secs);
2284 1dae12e6 Gerd Hoffmann
                bdrv_set_translation_hint(dinfo->bdrv, translation);
2285 e4bcb14c ths
            }
2286 e4bcb14c ths
            break;
2287 e4bcb14c ths
        case MEDIA_CDROM:
2288 1dae12e6 Gerd Hoffmann
            bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_CDROM);
2289 e4bcb14c ths
            break;
2290 e4bcb14c ths
        }
2291 e4bcb14c ths
        break;
2292 e4bcb14c ths
    case IF_SD:
2293 e4bcb14c ths
        /* FIXME: This isn't really a floppy, but it's a reasonable
2294 e4bcb14c ths
           approximation.  */
2295 e4bcb14c ths
    case IF_FLOPPY:
2296 1dae12e6 Gerd Hoffmann
        bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_FLOPPY);
2297 e4bcb14c ths
        break;
2298 e4bcb14c ths
    case IF_PFLASH:
2299 e4bcb14c ths
    case IF_MTD:
2300 e4bcb14c ths
        break;
2301 d176c495 Gerd Hoffmann
    case IF_VIRTIO:
2302 d176c495 Gerd Hoffmann
        /* add virtio block device */
2303 d176c495 Gerd Hoffmann
        opts = qemu_opts_create(&qemu_device_opts, NULL, 0);
2304 d176c495 Gerd Hoffmann
        qemu_opt_set(opts, "driver", "virtio-blk-pci");
2305 d176c495 Gerd Hoffmann
        qemu_opt_set(opts, "drive", dinfo->id);
2306 d176c495 Gerd Hoffmann
        if (devaddr)
2307 d176c495 Gerd Hoffmann
            qemu_opt_set(opts, "addr", devaddr);
2308 d176c495 Gerd Hoffmann
        break;
2309 aae9460e Paul Brook
    case IF_COUNT:
2310 aae9460e Paul Brook
        abort();
2311 e4bcb14c ths
    }
2312 9dfd7c7a Gerd Hoffmann
    if (!file) {
2313 751c6a17 Gerd Hoffmann
        *fatal_error = 0;
2314 751c6a17 Gerd Hoffmann
        return NULL;
2315 751c6a17 Gerd Hoffmann
    }
2316 33f00271 balrog
    bdrv_flags = 0;
2317 9f7965c7 aliguori
    if (snapshot) {
2318 33f00271 balrog
        bdrv_flags |= BDRV_O_SNAPSHOT;
2319 9f7965c7 aliguori
        cache = 2; /* always use write-back with snapshot */
2320 9f7965c7 aliguori
    }
2321 9f7965c7 aliguori
    if (cache == 0) /* no caching */
2322 9f7965c7 aliguori
        bdrv_flags |= BDRV_O_NOCACHE;
2323 9f7965c7 aliguori
    else if (cache == 2) /* write-back */
2324 9f7965c7 aliguori
        bdrv_flags |= BDRV_O_CACHE_WB;
2325 5c6c3a6c Christoph Hellwig
2326 5c6c3a6c Christoph Hellwig
    if (aio == 1) {
2327 5c6c3a6c Christoph Hellwig
        bdrv_flags |= BDRV_O_NATIVE_AIO;
2328 5c6c3a6c Christoph Hellwig
    } else {
2329 5c6c3a6c Christoph Hellwig
        bdrv_flags &= ~BDRV_O_NATIVE_AIO;
2330 5c6c3a6c Christoph Hellwig
    }
2331 5c6c3a6c Christoph Hellwig
2332 1dae12e6 Gerd Hoffmann
    if (bdrv_open2(dinfo->bdrv, file, bdrv_flags, drv) < 0) {
2333 850810d0 Justin M. Forbes
        fprintf(stderr, "qemu: could not open disk image %s: %s\n",
2334 850810d0 Justin M. Forbes
                        file, strerror(errno));
2335 751c6a17 Gerd Hoffmann
        return NULL;
2336 e4bcb14c ths
    }
2337 5c6c3a6c Christoph Hellwig
2338 1dae12e6 Gerd Hoffmann
    if (bdrv_key_required(dinfo->bdrv))
2339 c0f4ce77 aliguori
        autostart = 0;
2340 751c6a17 Gerd Hoffmann
    *fatal_error = 0;
2341 751c6a17 Gerd Hoffmann
    return dinfo;
2342 e4bcb14c ths
}
2343 e4bcb14c ths
2344 9dfd7c7a Gerd Hoffmann
static int drive_init_func(QemuOpts *opts, void *opaque)
2345 9dfd7c7a Gerd Hoffmann
{
2346 9dfd7c7a Gerd Hoffmann
    QEMUMachine *machine = opaque;
2347 9dfd7c7a Gerd Hoffmann
    int fatal_error = 0;
2348 9dfd7c7a Gerd Hoffmann
2349 9dfd7c7a Gerd Hoffmann
    if (drive_init(opts, machine, &fatal_error) == NULL) {
2350 9dfd7c7a Gerd Hoffmann
        if (fatal_error)
2351 9dfd7c7a Gerd Hoffmann
            return 1;
2352 9dfd7c7a Gerd Hoffmann
    }
2353 9dfd7c7a Gerd Hoffmann
    return 0;
2354 9dfd7c7a Gerd Hoffmann
}
2355 9dfd7c7a Gerd Hoffmann
2356 9dfd7c7a Gerd Hoffmann
static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
2357 9dfd7c7a Gerd Hoffmann
{
2358 9dfd7c7a Gerd Hoffmann
    if (NULL == qemu_opt_get(opts, "snapshot")) {
2359 9dfd7c7a Gerd Hoffmann
        qemu_opt_set(opts, "snapshot", "on");
2360 9dfd7c7a Gerd Hoffmann
    }
2361 9dfd7c7a Gerd Hoffmann
    return 0;
2362 9dfd7c7a Gerd Hoffmann
}
2363 9dfd7c7a Gerd Hoffmann
2364 76e30d0f Jan Kiszka
void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
2365 76e30d0f Jan Kiszka
{
2366 76e30d0f Jan Kiszka
    boot_set_handler = func;
2367 76e30d0f Jan Kiszka
    boot_set_opaque = opaque;
2368 76e30d0f Jan Kiszka
}
2369 76e30d0f Jan Kiszka
2370 76e30d0f Jan Kiszka
int qemu_boot_set(const char *boot_devices)
2371 76e30d0f Jan Kiszka
{
2372 76e30d0f Jan Kiszka
    if (!boot_set_handler) {
2373 76e30d0f Jan Kiszka
        return -EINVAL;
2374 76e30d0f Jan Kiszka
    }
2375 76e30d0f Jan Kiszka
    return boot_set_handler(boot_set_opaque, boot_devices);
2376 76e30d0f Jan Kiszka
}
2377 76e30d0f Jan Kiszka
2378 ef3adf68 Jan Kiszka
static int parse_bootdevices(char *devices)
2379 ef3adf68 Jan Kiszka
{
2380 ef3adf68 Jan Kiszka
    /* We just do some generic consistency checks */
2381 ef3adf68 Jan Kiszka
    const char *p;
2382 ef3adf68 Jan Kiszka
    int bitmap = 0;
2383 ef3adf68 Jan Kiszka
2384 ef3adf68 Jan Kiszka
    for (p = devices; *p != '\0'; p++) {
2385 ef3adf68 Jan Kiszka
        /* Allowed boot devices are:
2386 ef3adf68 Jan Kiszka
         * a-b: floppy disk drives
2387 ef3adf68 Jan Kiszka
         * c-f: IDE disk drives
2388 ef3adf68 Jan Kiszka
         * g-m: machine implementation dependant drives
2389 ef3adf68 Jan Kiszka
         * n-p: network devices
2390 ef3adf68 Jan Kiszka
         * It's up to each machine implementation to check if the given boot
2391 ef3adf68 Jan Kiszka
         * devices match the actual hardware implementation and firmware
2392 ef3adf68 Jan Kiszka
         * features.
2393 ef3adf68 Jan Kiszka
         */
2394 ef3adf68 Jan Kiszka
        if (*p < 'a' || *p > 'p') {
2395 ef3adf68 Jan Kiszka
            fprintf(stderr, "Invalid boot device '%c'\n", *p);
2396 ef3adf68 Jan Kiszka
            exit(1);
2397 ef3adf68 Jan Kiszka
        }
2398 ef3adf68 Jan Kiszka
        if (bitmap & (1 << (*p - 'a'))) {
2399 ef3adf68 Jan Kiszka
            fprintf(stderr, "Boot device '%c' was given twice\n", *p);
2400 ef3adf68 Jan Kiszka
            exit(1);
2401 ef3adf68 Jan Kiszka
        }
2402 ef3adf68 Jan Kiszka
        bitmap |= 1 << (*p - 'a');
2403 ef3adf68 Jan Kiszka
    }
2404 ef3adf68 Jan Kiszka
    return bitmap;
2405 ef3adf68 Jan Kiszka
}
2406 ef3adf68 Jan Kiszka
2407 e0f084bf Jan Kiszka
static void restore_boot_devices(void *opaque)
2408 e0f084bf Jan Kiszka
{
2409 e0f084bf Jan Kiszka
    char *standard_boot_devices = opaque;
2410 e0f084bf Jan Kiszka
2411 e0f084bf Jan Kiszka
    qemu_boot_set(standard_boot_devices);
2412 e0f084bf Jan Kiszka
2413 e0f084bf Jan Kiszka
    qemu_unregister_reset(restore_boot_devices, standard_boot_devices);
2414 e0f084bf Jan Kiszka
    qemu_free(standard_boot_devices);
2415 e0f084bf Jan Kiszka
}
2416 e0f084bf Jan Kiszka
2417 268a362c aliguori
static void numa_add(const char *optarg)
2418 268a362c aliguori
{
2419 268a362c aliguori
    char option[128];
2420 268a362c aliguori
    char *endptr;
2421 268a362c aliguori
    unsigned long long value, endvalue;
2422 268a362c aliguori
    int nodenr;
2423 268a362c aliguori
2424 268a362c aliguori
    optarg = get_opt_name(option, 128, optarg, ',') + 1;
2425 268a362c aliguori
    if (!strcmp(option, "node")) {
2426 268a362c aliguori
        if (get_param_value(option, 128, "nodeid", optarg) == 0) {
2427 268a362c aliguori
            nodenr = nb_numa_nodes;
2428 268a362c aliguori
        } else {
2429 268a362c aliguori
            nodenr = strtoull(option, NULL, 10);
2430 268a362c aliguori
        }
2431 268a362c aliguori
2432 268a362c aliguori
        if (get_param_value(option, 128, "mem", optarg) == 0) {
2433 268a362c aliguori
            node_mem[nodenr] = 0;
2434 268a362c aliguori
        } else {
2435 268a362c aliguori
            value = strtoull(option, &endptr, 0);
2436 268a362c aliguori
            switch (*endptr) {
2437 268a362c aliguori
            case 0: case 'M': case 'm':
2438 268a362c aliguori
                value <<= 20;
2439 268a362c aliguori
                break;
2440 268a362c aliguori
            case 'G': case 'g':
2441 268a362c aliguori
                value <<= 30;
2442 268a362c aliguori
                break;
2443 268a362c aliguori
            }
2444 268a362c aliguori
            node_mem[nodenr] = value;
2445 268a362c aliguori
        }
2446 268a362c aliguori
        if (get_param_value(option, 128, "cpus", optarg) == 0) {
2447 268a362c aliguori
            node_cpumask[nodenr] = 0;
2448 268a362c aliguori
        } else {
2449 268a362c aliguori
            value = strtoull(option, &endptr, 10);
2450 268a362c aliguori
            if (value >= 64) {
2451 268a362c aliguori
                value = 63;
2452 268a362c aliguori
                fprintf(stderr, "only 64 CPUs in NUMA mode supported.\n");
2453 268a362c aliguori
            } else {
2454 268a362c aliguori
                if (*endptr == '-') {
2455 268a362c aliguori
                    endvalue = strtoull(endptr+1, &endptr, 10);
2456 268a362c aliguori
                    if (endvalue >= 63) {
2457 268a362c aliguori
                        endvalue = 62;
2458 268a362c aliguori
                        fprintf(stderr,
2459 268a362c aliguori
                            "only 63 CPUs in NUMA mode supported.\n");
2460 268a362c aliguori
                    }
2461 268a362c aliguori
                    value = (1 << (endvalue + 1)) - (1 << value);
2462 268a362c aliguori
                } else {
2463 268a362c aliguori
                    value = 1 << value;
2464 268a362c aliguori
                }
2465 268a362c aliguori
            }
2466 268a362c aliguori
            node_cpumask[nodenr] = value;
2467 268a362c aliguori
        }
2468 268a362c aliguori
        nb_numa_nodes++;
2469 268a362c aliguori
    }
2470 268a362c aliguori
    return;
2471 268a362c aliguori
}
2472 268a362c aliguori
2473 dc6b1c09 Andre Przywara
static void smp_parse(const char *optarg)
2474 dc6b1c09 Andre Przywara
{
2475 dc6b1c09 Andre Przywara
    int smp, sockets = 0, threads = 0, cores = 0;
2476 dc6b1c09 Andre Przywara
    char *endptr;
2477 dc6b1c09 Andre Przywara
    char option[128];
2478 dc6b1c09 Andre Przywara
2479 dc6b1c09 Andre Przywara
    smp = strtoul(optarg, &endptr, 10);
2480 dc6b1c09 Andre Przywara
    if (endptr != optarg) {
2481 dc6b1c09 Andre Przywara
        if (*endptr == ',') {
2482 dc6b1c09 Andre Przywara
            endptr++;
2483 dc6b1c09 Andre Przywara
        }
2484 dc6b1c09 Andre Przywara
    }
2485 dc6b1c09 Andre Przywara
    if (get_param_value(option, 128, "sockets", endptr) != 0)
2486 dc6b1c09 Andre Przywara
        sockets = strtoull(option, NULL, 10);
2487 dc6b1c09 Andre Przywara
    if (get_param_value(option, 128, "cores", endptr) != 0)
2488 dc6b1c09 Andre Przywara
        cores = strtoull(option, NULL, 10);
2489 dc6b1c09 Andre Przywara
    if (get_param_value(option, 128, "threads", endptr) != 0)
2490 dc6b1c09 Andre Przywara
        threads = strtoull(option, NULL, 10);
2491 dc6b1c09 Andre Przywara
    if (get_param_value(option, 128, "maxcpus", endptr) != 0)
2492 dc6b1c09 Andre Przywara
        max_cpus = strtoull(option, NULL, 10);
2493 dc6b1c09 Andre Przywara
2494 dc6b1c09 Andre Przywara
    /* compute missing values, prefer sockets over cores over threads */
2495 dc6b1c09 Andre Przywara
    if (smp == 0 || sockets == 0) {
2496 dc6b1c09 Andre Przywara
        sockets = sockets > 0 ? sockets : 1;
2497 dc6b1c09 Andre Przywara
        cores = cores > 0 ? cores : 1;
2498 dc6b1c09 Andre Przywara
        threads = threads > 0 ? threads : 1;
2499 dc6b1c09 Andre Przywara
        if (smp == 0) {
2500 dc6b1c09 Andre Przywara
            smp = cores * threads * sockets;
2501 dc6b1c09 Andre Przywara
        } else {
2502 dc6b1c09 Andre Przywara
            sockets = smp / (cores * threads);
2503 dc6b1c09 Andre Przywara
        }
2504 dc6b1c09 Andre Przywara
    } else {
2505 dc6b1c09 Andre Przywara
        if (cores == 0) {
2506 dc6b1c09 Andre Przywara
            threads = threads > 0 ? threads : 1;
2507 dc6b1c09 Andre Przywara
            cores = smp / (sockets * threads);
2508 dc6b1c09 Andre Przywara
        } else {
2509 dc6b1c09 Andre Przywara
            if (sockets == 0) {
2510 dc6b1c09 Andre Przywara
                sockets = smp / (cores * threads);
2511 dc6b1c09 Andre Przywara
            } else {
2512 dc6b1c09 Andre Przywara
                threads = smp / (cores * sockets);
2513 dc6b1c09 Andre Przywara
            }
2514 dc6b1c09 Andre Przywara
        }
2515 dc6b1c09 Andre Przywara
    }
2516 dc6b1c09 Andre Przywara
    smp_cpus = smp;
2517 dc6b1c09 Andre Przywara
    smp_cores = cores > 0 ? cores : 1;
2518 dc6b1c09 Andre Przywara
    smp_threads = threads > 0 ? threads : 1;
2519 dc6b1c09 Andre Przywara
    if (max_cpus == 0)
2520 dc6b1c09 Andre Przywara
        max_cpus = smp_cpus;
2521 dc6b1c09 Andre Przywara
}
2522 dc6b1c09 Andre Przywara
2523 330d0414 bellard
/***********************************************************/
2524 a594cfbf bellard
/* USB devices */
2525 a594cfbf bellard
2526 bb5fc20f aliguori
static void usb_msd_password_cb(void *opaque, int err)
2527 bb5fc20f aliguori
{
2528 bb5fc20f aliguori
    USBDevice *dev = opaque;
2529 bb5fc20f aliguori
2530 bb5fc20f aliguori
    if (!err)
2531 a5d2f727 Gerd Hoffmann
        usb_device_attach(dev);
2532 bb5fc20f aliguori
    else
2533 806b6024 Gerd Hoffmann
        dev->info->handle_destroy(dev);
2534 bb5fc20f aliguori
}
2535 bb5fc20f aliguori
2536 a5d2f727 Gerd Hoffmann
static struct {
2537 a5d2f727 Gerd Hoffmann
    const char *name;
2538 a5d2f727 Gerd Hoffmann
    const char *qdev;
2539 a5d2f727 Gerd Hoffmann
} usbdevs[] = {
2540 a5d2f727 Gerd Hoffmann
    {
2541 a5d2f727 Gerd Hoffmann
        .name = "mouse",
2542 a5d2f727 Gerd Hoffmann
        .qdev = "QEMU USB Mouse",
2543 a5d2f727 Gerd Hoffmann
    },{
2544 a5d2f727 Gerd Hoffmann
        .name = "tablet",
2545 a5d2f727 Gerd Hoffmann
        .qdev = "QEMU USB Tablet",
2546 a5d2f727 Gerd Hoffmann
    },{
2547 a5d2f727 Gerd Hoffmann
        .name = "keyboard",
2548 a5d2f727 Gerd Hoffmann
        .qdev = "QEMU USB Keyboard",
2549 a5d2f727 Gerd Hoffmann
    },{
2550 a5d2f727 Gerd Hoffmann
        .name = "wacom-tablet",
2551 a5d2f727 Gerd Hoffmann
        .qdev = "QEMU PenPartner Tablet",
2552 a5d2f727 Gerd Hoffmann
    }
2553 a5d2f727 Gerd Hoffmann
};
2554 a5d2f727 Gerd Hoffmann
2555 c0f4ce77 aliguori
static int usb_device_add(const char *devname, int is_hotplug)
2556 a594cfbf bellard
{
2557 a594cfbf bellard
    const char *p;
2558 a5d2f727 Gerd Hoffmann
    USBBus *bus = usb_bus_find(-1 /* any */);
2559 a5d2f727 Gerd Hoffmann
    USBDevice *dev = NULL;
2560 a5d2f727 Gerd Hoffmann
    int i;
2561 a594cfbf bellard
2562 a5d2f727 Gerd Hoffmann
    if (!usb_enabled)
2563 a594cfbf bellard
        return -1;
2564 a594cfbf bellard
2565 a5d2f727 Gerd Hoffmann
    /* simple devices which don't need extra care */
2566 a5d2f727 Gerd Hoffmann
    for (i = 0; i < ARRAY_SIZE(usbdevs); i++) {
2567 a5d2f727 Gerd Hoffmann
        if (strcmp(devname, usbdevs[i].name) != 0)
2568 a5d2f727 Gerd Hoffmann
            continue;
2569 a5d2f727 Gerd Hoffmann
        dev = usb_create_simple(bus, usbdevs[i].qdev);
2570 a5d2f727 Gerd Hoffmann
        goto done;
2571 a5d2f727 Gerd Hoffmann
    }
2572 a5d2f727 Gerd Hoffmann
2573 a5d2f727 Gerd Hoffmann
    /* the other ones */
2574 a594cfbf bellard
    if (strstart(devname, "host:", &p)) {
2575 a594cfbf bellard
        dev = usb_host_device_open(p);
2576 2e5d83bb pbrook
    } else if (strstart(devname, "disk:", &p)) {
2577 c0f4ce77 aliguori
        BlockDriverState *bs;
2578 c0f4ce77 aliguori
2579 bb5fc20f aliguori
        dev = usb_msd_init(p);
2580 c0f4ce77 aliguori
        if (!dev)
2581 c0f4ce77 aliguori
            return -1;
2582 bb5fc20f aliguori
        bs = usb_msd_get_bdrv(dev);
2583 c0f4ce77 aliguori
        if (bdrv_key_required(bs)) {
2584 c0f4ce77 aliguori
            autostart = 0;
2585 bb5fc20f aliguori
            if (is_hotplug) {
2586 376253ec aliguori
                monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb,
2587 376253ec aliguori
                                            dev);
2588 bb5fc20f aliguori
                return 0;
2589 c0f4ce77 aliguori
            }
2590 c0f4ce77 aliguori
        }
2591 a7954218 balrog
    } else if (strstart(devname, "serial:", &p)) {
2592 a7954218 balrog
        dev = usb_serial_init(p);
2593 2e4d9fb1 aurel32
#ifdef CONFIG_BRLAPI
2594 2e4d9fb1 aurel32
    } else if (!strcmp(devname, "braille")) {
2595 2e4d9fb1 aurel32
        dev = usb_baum_init();
2596 2e4d9fb1 aurel32
#endif
2597 6c9f886c balrog
    } else if (strstart(devname, "net:", &p)) {
2598 13cf8f21 Mark McLoughlin
        QemuOpts *opts;
2599 13cf8f21 Mark McLoughlin
        int idx;
2600 6c9f886c balrog
2601 13cf8f21 Mark McLoughlin
        opts = qemu_opts_parse(&qemu_net_opts, p, NULL);
2602 13cf8f21 Mark McLoughlin
        if (!opts) {
2603 6c9f886c balrog
            return -1;
2604 13cf8f21 Mark McLoughlin
        }
2605 13cf8f21 Mark McLoughlin
2606 13cf8f21 Mark McLoughlin
        qemu_opt_set(opts, "type", "nic");
2607 13cf8f21 Mark McLoughlin
        qemu_opt_set(opts, "model", "usb");
2608 13cf8f21 Mark McLoughlin
2609 dc1c9fe8 Mark McLoughlin
        idx = net_client_init(NULL, opts);
2610 13cf8f21 Mark McLoughlin
        if (idx == -1) {
2611 13cf8f21 Mark McLoughlin
            return -1;
2612 13cf8f21 Mark McLoughlin
        }
2613 13cf8f21 Mark McLoughlin
2614 13cf8f21 Mark McLoughlin
        dev = usb_net_init(&nd_table[idx]);
2615 dc72ac14 balrog
    } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
2616 dc72ac14 balrog
        dev = usb_bt_init(devname[2] ? hci_init(p) :
2617 dc72ac14 balrog
                        bt_new_hci(qemu_find_bt_vlan(0)));
2618 a594cfbf bellard
    } else {
2619 a594cfbf bellard
        return -1;
2620 a594cfbf bellard
    }
2621 0d92ed30 pbrook
    if (!dev)
2622 0d92ed30 pbrook
        return -1;
2623 0d92ed30 pbrook
2624 a5d2f727 Gerd Hoffmann
done:
2625 a594cfbf bellard
    return 0;
2626 a594cfbf bellard
}
2627 a594cfbf bellard
2628 1f3870ab aliguori
static int usb_device_del(const char *devname)
2629 1f3870ab aliguori
{
2630 1f3870ab aliguori
    int bus_num, addr;
2631 1f3870ab aliguori
    const char *p;
2632 1f3870ab aliguori
2633 5d0c5750 aliguori
    if (strstart(devname, "host:", &p))
2634 5d0c5750 aliguori
        return usb_host_device_close(p);
2635 5d0c5750 aliguori
2636 a5d2f727 Gerd Hoffmann
    if (!usb_enabled)
2637 1f3870ab aliguori
        return -1;
2638 1f3870ab aliguori
2639 1f3870ab aliguori
    p = strchr(devname, '.');
2640 1f3870ab aliguori
    if (!p)
2641 1f3870ab aliguori
        return -1;
2642 1f3870ab aliguori
    bus_num = strtoul(devname, NULL, 0);
2643 1f3870ab aliguori
    addr = strtoul(p + 1, NULL, 0);
2644 1f3870ab aliguori
2645 a5d2f727 Gerd Hoffmann
    return usb_device_delete_addr(bus_num, addr);
2646 1f3870ab aliguori
}
2647 1f3870ab aliguori
2648 bd3c948d Gerd Hoffmann
static int usb_parse(const char *cmdline)
2649 bd3c948d Gerd Hoffmann
{
2650 bd3c948d Gerd Hoffmann
    return usb_device_add(cmdline, 0);
2651 bd3c948d Gerd Hoffmann
}
2652 bd3c948d Gerd Hoffmann
2653 d54908a5 Luiz Capitulino
void do_usb_add(Monitor *mon, const QDict *qdict)
2654 a594cfbf bellard
{
2655 d54908a5 Luiz Capitulino
    usb_device_add(qdict_get_str(qdict, "devname"), 1);
2656 a594cfbf bellard
}
2657 a594cfbf bellard
2658 d54908a5 Luiz Capitulino
void do_usb_del(Monitor *mon, const QDict *qdict)
2659 a594cfbf bellard
{
2660 d54908a5 Luiz Capitulino
    usb_device_del(qdict_get_str(qdict, "devname"));
2661 a594cfbf bellard
}
2662 a594cfbf bellard
2663 f7cce898 bellard
/***********************************************************/
2664 201a51fc balrog
/* PCMCIA/Cardbus */
2665 201a51fc balrog
2666 201a51fc balrog
static struct pcmcia_socket_entry_s {
2667 bc24a225 Paul Brook
    PCMCIASocket *socket;
2668 201a51fc balrog
    struct pcmcia_socket_entry_s *next;
2669 201a51fc balrog
} *pcmcia_sockets = 0;
2670 201a51fc balrog
2671 bc24a225 Paul Brook
void pcmcia_socket_register(PCMCIASocket *socket)
2672 201a51fc balrog
{
2673 201a51fc balrog
    struct pcmcia_socket_entry_s *entry;
2674 201a51fc balrog
2675 201a51fc balrog
    entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
2676 201a51fc balrog
    entry->socket = socket;
2677 201a51fc balrog
    entry->next = pcmcia_sockets;
2678 201a51fc balrog
    pcmcia_sockets = entry;
2679 201a51fc balrog
}
2680 201a51fc balrog
2681 bc24a225 Paul Brook
void pcmcia_socket_unregister(PCMCIASocket *socket)
2682 201a51fc balrog
{
2683 201a51fc balrog
    struct pcmcia_socket_entry_s *entry, **ptr;
2684 201a51fc balrog
2685 201a51fc balrog
    ptr = &pcmcia_sockets;
2686 201a51fc balrog
    for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
2687 201a51fc balrog
        if (entry->socket == socket) {
2688 201a51fc balrog
            *ptr = entry->next;
2689 201a51fc balrog
            qemu_free(entry);
2690 201a51fc balrog
        }
2691 201a51fc balrog
}
2692 201a51fc balrog
2693 376253ec aliguori
void pcmcia_info(Monitor *mon)
2694 201a51fc balrog
{
2695 201a51fc balrog
    struct pcmcia_socket_entry_s *iter;
2696 376253ec aliguori
2697 201a51fc balrog
    if (!pcmcia_sockets)
2698 376253ec aliguori
        monitor_printf(mon, "No PCMCIA sockets\n");
2699 201a51fc balrog
2700 201a51fc balrog
    for (iter = pcmcia_sockets; iter; iter = iter->next)
2701 376253ec aliguori
        monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
2702 376253ec aliguori
                       iter->socket->attached ? iter->socket->card_string :
2703 376253ec aliguori
                       "Empty");
2704 201a51fc balrog
}
2705 201a51fc balrog
2706 201a51fc balrog
/***********************************************************/
2707 3023f332 aliguori
/* register display */
2708 3023f332 aliguori
2709 7b5d76da aliguori
struct DisplayAllocator default_allocator = {
2710 7b5d76da aliguori
    defaultallocator_create_displaysurface,
2711 7b5d76da aliguori
    defaultallocator_resize_displaysurface,
2712 7b5d76da aliguori
    defaultallocator_free_displaysurface
2713 7b5d76da aliguori
};
2714 7b5d76da aliguori
2715 3023f332 aliguori
void register_displaystate(DisplayState *ds)
2716 3023f332 aliguori
{
2717 3023f332 aliguori
    DisplayState **s;
2718 3023f332 aliguori
    s = &display_state;
2719 3023f332 aliguori
    while (*s != NULL)
2720 3023f332 aliguori
        s = &(*s)->next;
2721 3023f332 aliguori
    ds->next = NULL;
2722 3023f332 aliguori
    *s = ds;
2723 3023f332 aliguori
}
2724 3023f332 aliguori
2725 3023f332 aliguori
DisplayState *get_displaystate(void)
2726 3023f332 aliguori
{
2727 3023f332 aliguori
    return display_state;
2728 3023f332 aliguori
}
2729 3023f332 aliguori
2730 7b5d76da aliguori
DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da)
2731 7b5d76da aliguori
{
2732 7b5d76da aliguori
    if(ds->allocator ==  &default_allocator) ds->allocator = da;
2733 7b5d76da aliguori
    return ds->allocator;
2734 7b5d76da aliguori
}
2735 7b5d76da aliguori
2736 2ff89790 ths
/* dumb display */
2737 2ff89790 ths
2738 8f391ab4 aliguori
static void dumb_display_init(void)
2739 2ff89790 ths
{
2740 8f391ab4 aliguori
    DisplayState *ds = qemu_mallocz(sizeof(DisplayState));
2741 7b5d76da aliguori
    ds->allocator = &default_allocator;
2742 7b5d76da aliguori
    ds->surface = qemu_create_displaysurface(ds, 640, 480);
2743 8f391ab4 aliguori
    register_displaystate(ds);
2744 2ff89790 ths
}
2745 2ff89790 ths
2746 2ff89790 ths
/***********************************************************/
2747 8a7ddc38 bellard
/* I/O handling */
2748 0824d6fc bellard
2749 c4b1fcc0 bellard
typedef struct IOHandlerRecord {
2750 c4b1fcc0 bellard
    int fd;
2751 7c9d8e07 bellard
    IOCanRWHandler *fd_read_poll;
2752 7c9d8e07 bellard
    IOHandler *fd_read;
2753 7c9d8e07 bellard
    IOHandler *fd_write;
2754 cafffd40 ths
    int deleted;
2755 c4b1fcc0 bellard
    void *opaque;
2756 c4b1fcc0 bellard
    /* temporary data */
2757 c4b1fcc0 bellard
    struct pollfd *ufd;
2758 8a7ddc38 bellard
    struct IOHandlerRecord *next;
2759 c4b1fcc0 bellard
} IOHandlerRecord;
2760 c4b1fcc0 bellard
2761 8a7ddc38 bellard
static IOHandlerRecord *first_io_handler;
2762 c4b1fcc0 bellard
2763 7c9d8e07 bellard
/* XXX: fd_read_poll should be suppressed, but an API change is
2764 7c9d8e07 bellard
   necessary in the character devices to suppress fd_can_read(). */
2765 5fafdf24 ths
int qemu_set_fd_handler2(int fd,
2766 5fafdf24 ths
                         IOCanRWHandler *fd_read_poll,
2767 5fafdf24 ths
                         IOHandler *fd_read,
2768 5fafdf24 ths
                         IOHandler *fd_write,
2769 7c9d8e07 bellard
                         void *opaque)
2770 c4b1fcc0 bellard
{
2771 7c9d8e07 bellard
    IOHandlerRecord **pioh, *ioh;
2772 c4b1fcc0 bellard
2773 7c9d8e07 bellard
    if (!fd_read && !fd_write) {
2774 7c9d8e07 bellard
        pioh = &first_io_handler;
2775 7c9d8e07 bellard
        for(;;) {
2776 7c9d8e07 bellard
            ioh = *pioh;
2777 7c9d8e07 bellard
            if (ioh == NULL)
2778 7c9d8e07 bellard
                break;
2779 7c9d8e07 bellard
            if (ioh->fd == fd) {
2780 cafffd40 ths
                ioh->deleted = 1;
2781 7c9d8e07 bellard
                break;
2782 7c9d8e07 bellard
            }
2783 7c9d8e07 bellard
            pioh = &ioh->next;
2784 7c9d8e07 bellard
        }
2785 7c9d8e07 bellard
    } else {
2786 7c9d8e07 bellard
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
2787 7c9d8e07 bellard
            if (ioh->fd == fd)
2788 7c9d8e07 bellard
                goto found;
2789 7c9d8e07 bellard
        }
2790 7c9d8e07 bellard
        ioh = qemu_mallocz(sizeof(IOHandlerRecord));
2791 7c9d8e07 bellard
        ioh->next = first_io_handler;
2792 7c9d8e07 bellard
        first_io_handler = ioh;
2793 7c9d8e07 bellard
    found:
2794 7c9d8e07 bellard
        ioh->fd = fd;
2795 7c9d8e07 bellard
        ioh->fd_read_poll = fd_read_poll;
2796 7c9d8e07 bellard
        ioh->fd_read = fd_read;
2797 7c9d8e07 bellard
        ioh->fd_write = fd_write;
2798 7c9d8e07 bellard
        ioh->opaque = opaque;
2799 cafffd40 ths
        ioh->deleted = 0;
2800 7c9d8e07 bellard
    }
2801 c4b1fcc0 bellard
    return 0;
2802 c4b1fcc0 bellard
}
2803 c4b1fcc0 bellard
2804 5fafdf24 ths
int qemu_set_fd_handler(int fd,
2805 5fafdf24 ths
                        IOHandler *fd_read,
2806 5fafdf24 ths
                        IOHandler *fd_write,
2807 7c9d8e07 bellard
                        void *opaque)
2808 8a7ddc38 bellard
{
2809 7c9d8e07 bellard
    return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
2810 8a7ddc38 bellard
}
2811 8a7ddc38 bellard
2812 56f3a5d0 aliguori
#ifdef _WIN32
2813 8a7ddc38 bellard
/***********************************************************/
2814 f331110f bellard
/* Polling handling */
2815 f331110f bellard
2816 f331110f bellard
typedef struct PollingEntry {
2817 f331110f bellard
    PollingFunc *func;
2818 f331110f bellard
    void *opaque;
2819 f331110f bellard
    struct PollingEntry *next;
2820 f331110f bellard
} PollingEntry;
2821 f331110f bellard
2822 f331110f bellard
static PollingEntry *first_polling_entry;
2823 f331110f bellard
2824 f331110f bellard
int qemu_add_polling_cb(PollingFunc *func, void *opaque)
2825 f331110f bellard
{
2826 f331110f bellard
    PollingEntry **ppe, *pe;
2827 f331110f bellard
    pe = qemu_mallocz(sizeof(PollingEntry));
2828 f331110f bellard
    pe->func = func;
2829 f331110f bellard
    pe->opaque = opaque;
2830 f331110f bellard
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
2831 f331110f bellard
    *ppe = pe;
2832 f331110f bellard
    return 0;
2833 f331110f bellard
}
2834 f331110f bellard
2835 f331110f bellard
void qemu_del_polling_cb(PollingFunc *func, void *opaque)
2836 f331110f bellard
{
2837 f331110f bellard
    PollingEntry **ppe, *pe;
2838 f331110f bellard
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
2839 f331110f bellard
        pe = *ppe;
2840 f331110f bellard
        if (pe->func == func && pe->opaque == opaque) {
2841 f331110f bellard
            *ppe = pe->next;
2842 f331110f bellard
            qemu_free(pe);
2843 f331110f bellard
            break;
2844 f331110f bellard
        }
2845 f331110f bellard
    }
2846 f331110f bellard
}
2847 f331110f bellard
2848 a18e524a bellard
/***********************************************************/
2849 a18e524a bellard
/* Wait objects support */
2850 a18e524a bellard
typedef struct WaitObjects {
2851 a18e524a bellard
    int num;
2852 a18e524a bellard
    HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
2853 a18e524a bellard
    WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
2854 a18e524a bellard
    void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
2855 a18e524a bellard
} WaitObjects;
2856 a18e524a bellard
2857 a18e524a bellard
static WaitObjects wait_objects = {0};
2858 3b46e624 ths
2859 a18e524a bellard
int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
2860 a18e524a bellard
{
2861 a18e524a bellard
    WaitObjects *w = &wait_objects;
2862 a18e524a bellard
2863 a18e524a bellard
    if (w->num >= MAXIMUM_WAIT_OBJECTS)
2864 a18e524a bellard
        return -1;
2865 a18e524a bellard
    w->events[w->num] = handle;
2866 a18e524a bellard
    w->func[w->num] = func;
2867 a18e524a bellard
    w->opaque[w->num] = opaque;
2868 a18e524a bellard
    w->num++;
2869 a18e524a bellard
    return 0;
2870 a18e524a bellard
}
2871 a18e524a bellard
2872 a18e524a bellard
void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
2873 a18e524a bellard
{
2874 a18e524a bellard
    int i, found;
2875 a18e524a bellard
    WaitObjects *w = &wait_objects;
2876 a18e524a bellard
2877 a18e524a bellard
    found = 0;
2878 a18e524a bellard
    for (i = 0; i < w->num; i++) {
2879 a18e524a bellard
        if (w->events[i] == handle)
2880 a18e524a bellard
            found = 1;
2881 a18e524a bellard
        if (found) {
2882 a18e524a bellard
            w->events[i] = w->events[i + 1];
2883 a18e524a bellard
            w->func[i] = w->func[i + 1];
2884 a18e524a bellard
            w->opaque[i] = w->opaque[i + 1];
2885 3b46e624 ths
        }
2886 a18e524a bellard
    }
2887 a18e524a bellard
    if (found)
2888 a18e524a bellard
        w->num--;
2889 a18e524a bellard
}
2890 a18e524a bellard
#endif
2891 a18e524a bellard
2892 8a7ddc38 bellard
/***********************************************************/
2893 8a7ddc38 bellard
/* ram save/restore */
2894 8a7ddc38 bellard
2895 94fb0909 Juan Quintela
#define RAM_SAVE_FLAG_FULL        0x01 /* Obsolete, not used anymore */
2896 475e4277 aliguori
#define RAM_SAVE_FLAG_COMPRESS        0x02
2897 475e4277 aliguori
#define RAM_SAVE_FLAG_MEM_SIZE        0x04
2898 475e4277 aliguori
#define RAM_SAVE_FLAG_PAGE        0x08
2899 475e4277 aliguori
#define RAM_SAVE_FLAG_EOS        0x10
2900 475e4277 aliguori
2901 475e4277 aliguori
static int is_dup_page(uint8_t *page, uint8_t ch)
2902 8a7ddc38 bellard
{
2903 475e4277 aliguori
    uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
2904 475e4277 aliguori
    uint32_t *array = (uint32_t *)page;
2905 475e4277 aliguori
    int i;
2906 3b46e624 ths
2907 475e4277 aliguori
    for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
2908 475e4277 aliguori
        if (array[i] != val)
2909 475e4277 aliguori
            return 0;
2910 475e4277 aliguori
    }
2911 475e4277 aliguori
2912 475e4277 aliguori
    return 1;
2913 475e4277 aliguori
}
2914 475e4277 aliguori
2915 475e4277 aliguori
static int ram_save_block(QEMUFile *f)
2916 475e4277 aliguori
{
2917 c227f099 Anthony Liguori
    static ram_addr_t current_addr = 0;
2918 c227f099 Anthony Liguori
    ram_addr_t saved_addr = current_addr;
2919 c227f099 Anthony Liguori
    ram_addr_t addr = 0;
2920 475e4277 aliguori
    int found = 0;
2921 475e4277 aliguori
2922 94a6b54f pbrook
    while (addr < last_ram_offset) {
2923 475e4277 aliguori
        if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
2924 5579c7f3 pbrook
            uint8_t *p;
2925 475e4277 aliguori
2926 475e4277 aliguori
            cpu_physical_memory_reset_dirty(current_addr,
2927 475e4277 aliguori
                                            current_addr + TARGET_PAGE_SIZE,
2928 475e4277 aliguori
                                            MIGRATION_DIRTY_FLAG);
2929 475e4277 aliguori
2930 5579c7f3 pbrook
            p = qemu_get_ram_ptr(current_addr);
2931 475e4277 aliguori
2932 5579c7f3 pbrook
            if (is_dup_page(p, *p)) {
2933 475e4277 aliguori
                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
2934 5579c7f3 pbrook
                qemu_put_byte(f, *p);
2935 475e4277 aliguori
            } else {
2936 475e4277 aliguori
                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
2937 5579c7f3 pbrook
                qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
2938 c88676f8 bellard
            }
2939 475e4277 aliguori
2940 475e4277 aliguori
            found = 1;
2941 475e4277 aliguori
            break;
2942 c88676f8 bellard
        }
2943 475e4277 aliguori
        addr += TARGET_PAGE_SIZE;
2944 94a6b54f pbrook
        current_addr = (saved_addr + addr) % last_ram_offset;
2945 8a7ddc38 bellard
    }
2946 475e4277 aliguori
2947 475e4277 aliguori
    return found;
2948 8a7ddc38 bellard
}
2949 8a7ddc38 bellard
2950 9f9e28cd Glauber Costa
static uint64_t bytes_transferred = 0;
2951 475e4277 aliguori
2952 c227f099 Anthony Liguori
static ram_addr_t ram_save_remaining(void)
2953 475e4277 aliguori
{
2954 c227f099 Anthony Liguori
    ram_addr_t addr;
2955 c227f099 Anthony Liguori
    ram_addr_t count = 0;
2956 475e4277 aliguori
2957 94a6b54f pbrook
    for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
2958 475e4277 aliguori
        if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
2959 475e4277 aliguori
            count++;
2960 475e4277 aliguori
    }
2961 475e4277 aliguori
2962 475e4277 aliguori
    return count;
2963 475e4277 aliguori
}
2964 475e4277 aliguori
2965 9f9e28cd Glauber Costa
uint64_t ram_bytes_remaining(void)
2966 9f9e28cd Glauber Costa
{
2967 9f9e28cd Glauber Costa
    return ram_save_remaining() * TARGET_PAGE_SIZE;
2968 9f9e28cd Glauber Costa
}
2969 9f9e28cd Glauber Costa
2970 9f9e28cd Glauber Costa
uint64_t ram_bytes_transferred(void)
2971 9f9e28cd Glauber Costa
{
2972 9f9e28cd Glauber Costa
    return bytes_transferred;
2973 9f9e28cd Glauber Costa
}
2974 9f9e28cd Glauber Costa
2975 9f9e28cd Glauber Costa
uint64_t ram_bytes_total(void)
2976 9f9e28cd Glauber Costa
{
2977 9f9e28cd Glauber Costa
    return last_ram_offset;
2978 9f9e28cd Glauber Costa
}
2979 9f9e28cd Glauber Costa
2980 475e4277 aliguori
static int ram_save_live(QEMUFile *f, int stage, void *opaque)
2981 475e4277 aliguori
{
2982 c227f099 Anthony Liguori
    ram_addr_t addr;
2983 a0a3fd60 Glauber Costa
    uint64_t bytes_transferred_last;
2984 a0a3fd60 Glauber Costa
    double bwidth = 0;
2985 a0a3fd60 Glauber Costa
    uint64_t expected_time = 0;
2986 475e4277 aliguori
2987 9fa06385 Jan Kiszka
    if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
2988 b0a46a33 Jan Kiszka
        qemu_file_set_error(f);
2989 b0a46a33 Jan Kiszka
        return 0;
2990 b0a46a33 Jan Kiszka
    }
2991 b0a46a33 Jan Kiszka
2992 475e4277 aliguori
    if (stage == 1) {
2993 475e4277 aliguori
        /* Make sure all dirty bits are set */
2994 94a6b54f pbrook
        for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
2995 475e4277 aliguori
            if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
2996 475e4277 aliguori
                cpu_physical_memory_set_dirty(addr);
2997 475e4277 aliguori
        }
2998 b0a46a33 Jan Kiszka
2999 475e4277 aliguori
        /* Enable dirty memory tracking */
3000 475e4277 aliguori
        cpu_physical_memory_set_dirty_tracking(1);
3001 475e4277 aliguori
3002 94a6b54f pbrook
        qemu_put_be64(f, last_ram_offset | RAM_SAVE_FLAG_MEM_SIZE);
3003 475e4277 aliguori
    }
3004 475e4277 aliguori
3005 a0a3fd60 Glauber Costa
    bytes_transferred_last = bytes_transferred;
3006 a0a3fd60 Glauber Costa
    bwidth = get_clock();
3007 a0a3fd60 Glauber Costa
3008 475e4277 aliguori
    while (!qemu_file_rate_limit(f)) {
3009 475e4277 aliguori
        int ret;
3010 475e4277 aliguori
3011 475e4277 aliguori
        ret = ram_save_block(f);
3012 9f9e28cd Glauber Costa
        bytes_transferred += ret * TARGET_PAGE_SIZE;
3013 475e4277 aliguori
        if (ret == 0) /* no more blocks */
3014 475e4277 aliguori
            break;
3015 475e4277 aliguori
    }
3016 475e4277 aliguori
3017 a0a3fd60 Glauber Costa
    bwidth = get_clock() - bwidth;
3018 a0a3fd60 Glauber Costa
    bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
3019 a0a3fd60 Glauber Costa
3020 a0a3fd60 Glauber Costa
    /* if we haven't transferred anything this round, force expected_time to a
3021 a0a3fd60 Glauber Costa
     * a very high value, but without crashing */
3022 a0a3fd60 Glauber Costa
    if (bwidth == 0)
3023 a0a3fd60 Glauber Costa
        bwidth = 0.000001;
3024 a0a3fd60 Glauber Costa
3025 475e4277 aliguori
    /* try transferring iterative blocks of memory */
3026 475e4277 aliguori
3027 475e4277 aliguori
    if (stage == 3) {
3028 475e4277 aliguori
3029 475e4277 aliguori
        /* flush all remaining blocks regardless of rate limiting */
3030 9f9e28cd Glauber Costa
        while (ram_save_block(f) != 0) {
3031 9f9e28cd Glauber Costa
            bytes_transferred += TARGET_PAGE_SIZE;
3032 9f9e28cd Glauber Costa
        }
3033 8215e914 aliguori
        cpu_physical_memory_set_dirty_tracking(0);
3034 475e4277 aliguori
    }
3035 475e4277 aliguori
3036 475e4277 aliguori
    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
3037 475e4277 aliguori
3038 a0a3fd60 Glauber Costa
    expected_time = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
3039 a0a3fd60 Glauber Costa
3040 a0a3fd60 Glauber Costa
    return (stage == 2) && (expected_time <= migrate_max_downtime());
3041 475e4277 aliguori
}
3042 475e4277 aliguori
3043 475e4277 aliguori
static int ram_load(QEMUFile *f, void *opaque, int version_id)
3044 475e4277 aliguori
{
3045 c227f099 Anthony Liguori
    ram_addr_t addr;
3046 475e4277 aliguori
    int flags;
3047 475e4277 aliguori
3048 475e4277 aliguori
    if (version_id != 3)
3049 475e4277 aliguori
        return -EINVAL;
3050 475e4277 aliguori
3051 475e4277 aliguori
    do {
3052 475e4277 aliguori
        addr = qemu_get_be64(f);
3053 475e4277 aliguori
3054 475e4277 aliguori
        flags = addr & ~TARGET_PAGE_MASK;
3055 475e4277 aliguori
        addr &= TARGET_PAGE_MASK;
3056 475e4277 aliguori
3057 475e4277 aliguori
        if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
3058 94a6b54f pbrook
            if (addr != last_ram_offset)
3059 475e4277 aliguori
                return -EINVAL;
3060 475e4277 aliguori
        }
3061 475e4277 aliguori
3062 475e4277 aliguori
        if (flags & RAM_SAVE_FLAG_COMPRESS) {
3063 475e4277 aliguori
            uint8_t ch = qemu_get_byte(f);
3064 779c6bef Anthony Liguori
            memset(qemu_get_ram_ptr(addr), ch, TARGET_PAGE_SIZE);
3065 779c6bef Anthony Liguori
#ifndef _WIN32
3066 30868442 Anthony Liguori
            if (ch == 0 &&
3067 30868442 Anthony Liguori
                (!kvm_enabled() || kvm_has_sync_mmu())) {
3068 30868442 Anthony Liguori
                madvise(qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE, MADV_DONTNEED);
3069 779c6bef Anthony Liguori
            }
3070 30868442 Anthony Liguori
#endif
3071 475e4277 aliguori
        } else if (flags & RAM_SAVE_FLAG_PAGE)
3072 5579c7f3 pbrook
            qemu_get_buffer(f, qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE);
3073 475e4277 aliguori
    } while (!(flags & RAM_SAVE_FLAG_EOS));
3074 475e4277 aliguori
3075 8a7ddc38 bellard
    return 0;
3076 8a7ddc38 bellard
}
3077 8a7ddc38 bellard
3078 9e472e10 aliguori
void qemu_service_io(void)
3079 9e472e10 aliguori
{
3080 d9f75a4e aliguori
    qemu_notify_event();
3081 9e472e10 aliguori
}
3082 9e472e10 aliguori
3083 8a7ddc38 bellard
/***********************************************************/
3084 83f64091 bellard
/* bottom halves (can be seen as timers which expire ASAP) */
3085 83f64091 bellard
3086 83f64091 bellard
struct QEMUBH {
3087 83f64091 bellard
    QEMUBHFunc *cb;
3088 83f64091 bellard
    void *opaque;
3089 83f64091 bellard
    int scheduled;
3090 1b435b10 aliguori
    int idle;
3091 1b435b10 aliguori
    int deleted;
3092 83f64091 bellard
    QEMUBH *next;
3093 83f64091 bellard
};
3094 83f64091 bellard
3095 83f64091 bellard
static QEMUBH *first_bh = NULL;
3096 83f64091 bellard
3097 83f64091 bellard
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
3098 83f64091 bellard
{
3099 83f64091 bellard
    QEMUBH *bh;
3100 83f64091 bellard
    bh = qemu_mallocz(sizeof(QEMUBH));
3101 83f64091 bellard
    bh->cb = cb;
3102 83f64091 bellard
    bh->opaque = opaque;
3103 1b435b10 aliguori
    bh->next = first_bh;
3104 1b435b10 aliguori
    first_bh = bh;
3105 83f64091 bellard
    return bh;
3106 83f64091 bellard
}
3107 83f64091 bellard
3108 6eb5733a bellard
int qemu_bh_poll(void)
3109 83f64091 bellard
{
3110 1b435b10 aliguori
    QEMUBH *bh, **bhp;
3111 6eb5733a bellard
    int ret;
3112 83f64091 bellard
3113 6eb5733a bellard
    ret = 0;
3114 1b435b10 aliguori
    for (bh = first_bh; bh; bh = bh->next) {
3115 1b435b10 aliguori
        if (!bh->deleted && bh->scheduled) {
3116 1b435b10 aliguori
            bh->scheduled = 0;
3117 1b435b10 aliguori
            if (!bh->idle)
3118 1b435b10 aliguori
                ret = 1;
3119 1b435b10 aliguori
            bh->idle = 0;
3120 1b435b10 aliguori
            bh->cb(bh->opaque);
3121 1b435b10 aliguori
        }
3122 83f64091 bellard
    }
3123 1b435b10 aliguori
3124 1b435b10 aliguori
    /* remove deleted bhs */
3125 1b435b10 aliguori
    bhp = &first_bh;
3126 1b435b10 aliguori
    while (*bhp) {
3127 1b435b10 aliguori
        bh = *bhp;
3128 1b435b10 aliguori
        if (bh->deleted) {
3129 1b435b10 aliguori
            *bhp = bh->next;
3130 1b435b10 aliguori
            qemu_free(bh);
3131 1b435b10 aliguori
        } else
3132 1b435b10 aliguori
            bhp = &bh->next;
3133 1b435b10 aliguori
    }
3134 1b435b10 aliguori
3135 6eb5733a bellard
    return ret;
3136 83f64091 bellard
}
3137 83f64091 bellard
3138 1b435b10 aliguori
void qemu_bh_schedule_idle(QEMUBH *bh)
3139 1b435b10 aliguori
{
3140 1b435b10 aliguori
    if (bh->scheduled)
3141 1b435b10 aliguori
        return;
3142 1b435b10 aliguori
    bh->scheduled = 1;
3143 1b435b10 aliguori
    bh->idle = 1;
3144 1b435b10 aliguori
}
3145 1b435b10 aliguori
3146 83f64091 bellard
void qemu_bh_schedule(QEMUBH *bh)
3147 83f64091 bellard
{
3148 83f64091 bellard
    if (bh->scheduled)
3149 83f64091 bellard
        return;
3150 83f64091 bellard
    bh->scheduled = 1;
3151 1b435b10 aliguori
    bh->idle = 0;
3152 83f64091 bellard
    /* stop the currently executing CPU to execute the BH ASAP */
3153 d9f75a4e aliguori
    qemu_notify_event();
3154 83f64091 bellard
}
3155 83f64091 bellard
3156 83f64091 bellard
void qemu_bh_cancel(QEMUBH *bh)
3157 83f64091 bellard
{
3158 1b435b10 aliguori
    bh->scheduled = 0;
3159 83f64091 bellard
}
3160 83f64091 bellard
3161 83f64091 bellard
void qemu_bh_delete(QEMUBH *bh)
3162 83f64091 bellard
{
3163 1b435b10 aliguori
    bh->scheduled = 0;
3164 1b435b10 aliguori
    bh->deleted = 1;
3165 83f64091 bellard
}
3166 83f64091 bellard
3167 56f3a5d0 aliguori
static void qemu_bh_update_timeout(int *timeout)
3168 56f3a5d0 aliguori
{
3169 56f3a5d0 aliguori
    QEMUBH *bh;
3170 56f3a5d0 aliguori
3171 56f3a5d0 aliguori
    for (bh = first_bh; bh; bh = bh->next) {
3172 56f3a5d0 aliguori
        if (!bh->deleted && bh->scheduled) {
3173 56f3a5d0 aliguori
            if (bh->idle) {
3174 56f3a5d0 aliguori
                /* idle bottom halves will be polled at least
3175 56f3a5d0 aliguori
                 * every 10ms */
3176 56f3a5d0 aliguori
                *timeout = MIN(10, *timeout);
3177 56f3a5d0 aliguori
            } else {
3178 56f3a5d0 aliguori
                /* non-idle bottom halves will be executed
3179 56f3a5d0 aliguori
                 * immediately */
3180 56f3a5d0 aliguori
                *timeout = 0;
3181 56f3a5d0 aliguori
                break;
3182 56f3a5d0 aliguori
            }
3183 56f3a5d0 aliguori
        }
3184 56f3a5d0 aliguori
    }
3185 56f3a5d0 aliguori
}
3186 56f3a5d0 aliguori
3187 83f64091 bellard
/***********************************************************/
3188 cc1daa40 bellard
/* machine registration */
3189 cc1daa40 bellard
3190 bdaf78e0 blueswir1
static QEMUMachine *first_machine = NULL;
3191 6f338c34 aliguori
QEMUMachine *current_machine = NULL;
3192 cc1daa40 bellard
3193 cc1daa40 bellard
int qemu_register_machine(QEMUMachine *m)
3194 cc1daa40 bellard
{
3195 cc1daa40 bellard
    QEMUMachine **pm;
3196 cc1daa40 bellard
    pm = &first_machine;
3197 cc1daa40 bellard
    while (*pm != NULL)
3198 cc1daa40 bellard
        pm = &(*pm)->next;
3199 cc1daa40 bellard
    m->next = NULL;
3200 cc1daa40 bellard
    *pm = m;
3201 cc1daa40 bellard
    return 0;
3202 cc1daa40 bellard
}
3203 cc1daa40 bellard
3204 9596ebb7 pbrook
static QEMUMachine *find_machine(const char *name)
3205 cc1daa40 bellard
{
3206 cc1daa40 bellard
    QEMUMachine *m;
3207 cc1daa40 bellard
3208 cc1daa40 bellard
    for(m = first_machine; m != NULL; m = m->next) {
3209 cc1daa40 bellard
        if (!strcmp(m->name, name))
3210 cc1daa40 bellard
            return m;
3211 3f6599e6 Mark McLoughlin
        if (m->alias && !strcmp(m->alias, name))
3212 3f6599e6 Mark McLoughlin
            return m;
3213 cc1daa40 bellard
    }
3214 cc1daa40 bellard
    return NULL;
3215 cc1daa40 bellard
}
3216 cc1daa40 bellard
3217 0c257437 Anthony Liguori
static QEMUMachine *find_default_machine(void)
3218 0c257437 Anthony Liguori
{
3219 0c257437 Anthony Liguori
    QEMUMachine *m;
3220 0c257437 Anthony Liguori
3221 0c257437 Anthony Liguori
    for(m = first_machine; m != NULL; m = m->next) {
3222 0c257437 Anthony Liguori
        if (m->is_default) {
3223 0c257437 Anthony Liguori
            return m;
3224 0c257437 Anthony Liguori
        }
3225 0c257437 Anthony Liguori
    }
3226 0c257437 Anthony Liguori
    return NULL;
3227 0c257437 Anthony Liguori
}
3228 0c257437 Anthony Liguori
3229 cc1daa40 bellard
/***********************************************************/
3230 8a7ddc38 bellard
/* main execution loop */
3231 8a7ddc38 bellard
3232 9596ebb7 pbrook
static void gui_update(void *opaque)
3233 8a7ddc38 bellard
{
3234 7d957bd8 aliguori
    uint64_t interval = GUI_REFRESH_INTERVAL;
3235 740733bb ths
    DisplayState *ds = opaque;
3236 7d957bd8 aliguori
    DisplayChangeListener *dcl = ds->listeners;
3237 7d957bd8 aliguori
3238 7d957bd8 aliguori
    dpy_refresh(ds);
3239 7d957bd8 aliguori
3240 7d957bd8 aliguori
    while (dcl != NULL) {
3241 7d957bd8 aliguori
        if (dcl->gui_timer_interval &&
3242 7d957bd8 aliguori
            dcl->gui_timer_interval < interval)
3243 7d957bd8 aliguori
            interval = dcl->gui_timer_interval;
3244 7d957bd8 aliguori
        dcl = dcl->next;
3245 7d957bd8 aliguori
    }
3246 7d957bd8 aliguori
    qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock(rt_clock));
3247 8a7ddc38 bellard
}
3248 8a7ddc38 bellard
3249 9043b62d blueswir1
static void nographic_update(void *opaque)
3250 9043b62d blueswir1
{
3251 9043b62d blueswir1
    uint64_t interval = GUI_REFRESH_INTERVAL;
3252 9043b62d blueswir1
3253 9043b62d blueswir1
    qemu_mod_timer(nographic_timer, interval + qemu_get_clock(rt_clock));
3254 9043b62d blueswir1
}
3255 9043b62d blueswir1
3256 0bd48850 bellard
struct vm_change_state_entry {
3257 0bd48850 bellard
    VMChangeStateHandler *cb;
3258 0bd48850 bellard
    void *opaque;
3259 72cf2d4f Blue Swirl
    QLIST_ENTRY (vm_change_state_entry) entries;
3260 0bd48850 bellard
};
3261 0bd48850 bellard
3262 72cf2d4f Blue Swirl
static QLIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
3263 0bd48850 bellard
3264 0bd48850 bellard
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
3265 0bd48850 bellard
                                                     void *opaque)
3266 0bd48850 bellard
{
3267 0bd48850 bellard
    VMChangeStateEntry *e;
3268 0bd48850 bellard
3269 0bd48850 bellard
    e = qemu_mallocz(sizeof (*e));
3270 0bd48850 bellard
3271 0bd48850 bellard
    e->cb = cb;
3272 0bd48850 bellard
    e->opaque = opaque;
3273 72cf2d4f Blue Swirl
    QLIST_INSERT_HEAD(&vm_change_state_head, e, entries);
3274 0bd48850 bellard
    return e;
3275 0bd48850 bellard
}
3276 0bd48850 bellard
3277 0bd48850 bellard
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
3278 0bd48850 bellard
{
3279 72cf2d4f Blue Swirl
    QLIST_REMOVE (e, entries);
3280 0bd48850 bellard
    qemu_free (e);
3281 0bd48850 bellard
}
3282 0bd48850 bellard
3283 9781e040 aliguori
static void vm_state_notify(int running, int reason)
3284 0bd48850 bellard
{
3285 0bd48850 bellard
    VMChangeStateEntry *e;
3286 0bd48850 bellard
3287 0bd48850 bellard
    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
3288 9781e040 aliguori
        e->cb(e->opaque, running, reason);
3289 0bd48850 bellard
    }
3290 0bd48850 bellard
}
3291 0bd48850 bellard
3292 d6dc3d42 aliguori
static void resume_all_vcpus(void);
3293 d6dc3d42 aliguori
static void pause_all_vcpus(void);
3294 d6dc3d42 aliguori
3295 8a7ddc38 bellard
void vm_start(void)
3296 8a7ddc38 bellard
{
3297 8a7ddc38 bellard
    if (!vm_running) {
3298 8a7ddc38 bellard
        cpu_enable_ticks();
3299 8a7ddc38 bellard
        vm_running = 1;
3300 9781e040 aliguori
        vm_state_notify(1, 0);
3301 efe75411 ths
        qemu_rearm_alarm_timer(alarm_timer);
3302 d6dc3d42 aliguori
        resume_all_vcpus();
3303 8a7ddc38 bellard
    }
3304 8a7ddc38 bellard
}
3305 8a7ddc38 bellard
3306 bb0c6722 bellard
/* reset/shutdown handler */
3307 bb0c6722 bellard
3308 bb0c6722 bellard
typedef struct QEMUResetEntry {
3309 72cf2d4f Blue Swirl
    QTAILQ_ENTRY(QEMUResetEntry) entry;
3310 bb0c6722 bellard
    QEMUResetHandler *func;
3311 bb0c6722 bellard
    void *opaque;
3312 bb0c6722 bellard
} QEMUResetEntry;
3313 bb0c6722 bellard
3314 72cf2d4f Blue Swirl
static QTAILQ_HEAD(reset_handlers, QEMUResetEntry) reset_handlers =
3315 72cf2d4f Blue Swirl
    QTAILQ_HEAD_INITIALIZER(reset_handlers);
3316 bb0c6722 bellard
static int reset_requested;
3317 bb0c6722 bellard
static int shutdown_requested;
3318 3475187d bellard
static int powerdown_requested;
3319 e568902a aliguori
static int debug_requested;
3320 6e29f5da aliguori
static int vmstop_requested;
3321 bb0c6722 bellard
3322 cf7a2fe2 aurel32
int qemu_shutdown_requested(void)
3323 cf7a2fe2 aurel32
{
3324 cf7a2fe2 aurel32
    int r = shutdown_requested;
3325 cf7a2fe2 aurel32
    shutdown_requested = 0;
3326 cf7a2fe2 aurel32
    return r;
3327 cf7a2fe2 aurel32
}
3328 cf7a2fe2 aurel32
3329 cf7a2fe2 aurel32
int qemu_reset_requested(void)
3330 cf7a2fe2 aurel32
{
3331 cf7a2fe2 aurel32
    int r = reset_requested;
3332 cf7a2fe2 aurel32
    reset_requested = 0;
3333 cf7a2fe2 aurel32
    return r;
3334 cf7a2fe2 aurel32
}
3335 cf7a2fe2 aurel32
3336 cf7a2fe2 aurel32
int qemu_powerdown_requested(void)
3337 cf7a2fe2 aurel32
{
3338 cf7a2fe2 aurel32
    int r = powerdown_requested;
3339 cf7a2fe2 aurel32
    powerdown_requested = 0;
3340 cf7a2fe2 aurel32
    return r;
3341 cf7a2fe2 aurel32
}
3342 cf7a2fe2 aurel32
3343 e568902a aliguori
static int qemu_debug_requested(void)
3344 e568902a aliguori
{
3345 e568902a aliguori
    int r = debug_requested;
3346 e568902a aliguori
    debug_requested = 0;
3347 e568902a aliguori
    return r;
3348 e568902a aliguori
}
3349 e568902a aliguori
3350 6e29f5da aliguori
static int qemu_vmstop_requested(void)
3351 6e29f5da aliguori
{
3352 6e29f5da aliguori
    int r = vmstop_requested;
3353 6e29f5da aliguori
    vmstop_requested = 0;
3354 6e29f5da aliguori
    return r;
3355 6e29f5da aliguori
}
3356 6e29f5da aliguori
3357 6e29f5da aliguori
static void do_vm_stop(int reason)
3358 6e29f5da aliguori
{
3359 6e29f5da aliguori
    if (vm_running) {
3360 6e29f5da aliguori
        cpu_disable_ticks();
3361 6e29f5da aliguori
        vm_running = 0;
3362 d6dc3d42 aliguori
        pause_all_vcpus();
3363 6e29f5da aliguori
        vm_state_notify(0, reason);
3364 6e29f5da aliguori
    }
3365 6e29f5da aliguori
}
3366 6e29f5da aliguori
3367 a08d4367 Jan Kiszka
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
3368 bb0c6722 bellard
{
3369 55ddfe8e Jan Kiszka
    QEMUResetEntry *re = qemu_mallocz(sizeof(QEMUResetEntry));
3370 bb0c6722 bellard
3371 bb0c6722 bellard
    re->func = func;
3372 bb0c6722 bellard
    re->opaque = opaque;
3373 72cf2d4f Blue Swirl
    QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
3374 bb0c6722 bellard
}
3375 bb0c6722 bellard
3376 dda9b29f Jan Kiszka
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
3377 bb0c6722 bellard
{
3378 bb0c6722 bellard
    QEMUResetEntry *re;
3379 bb0c6722 bellard
3380 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(re, &reset_handlers, entry) {
3381 dda9b29f Jan Kiszka
        if (re->func == func && re->opaque == opaque) {
3382 72cf2d4f Blue Swirl
            QTAILQ_REMOVE(&reset_handlers, re, entry);
3383 dda9b29f Jan Kiszka
            qemu_free(re);
3384 dda9b29f Jan Kiszka
            return;
3385 dda9b29f Jan Kiszka
        }
3386 dda9b29f Jan Kiszka
    }
3387 dda9b29f Jan Kiszka
}
3388 dda9b29f Jan Kiszka
3389 dda9b29f Jan Kiszka
void qemu_system_reset(void)
3390 dda9b29f Jan Kiszka
{
3391 dda9b29f Jan Kiszka
    QEMUResetEntry *re, *nre;
3392 dda9b29f Jan Kiszka
3393 dda9b29f Jan Kiszka
    /* reset all devices */
3394 72cf2d4f Blue Swirl
    QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
3395 bb0c6722 bellard
        re->func(re->opaque);
3396 bb0c6722 bellard
    }
3397 bb0c6722 bellard
}
3398 bb0c6722 bellard
3399 bb0c6722 bellard
void qemu_system_reset_request(void)
3400 bb0c6722 bellard
{
3401 d1beab82 bellard
    if (no_reboot) {
3402 d1beab82 bellard
        shutdown_requested = 1;
3403 d1beab82 bellard
    } else {
3404 d1beab82 bellard
        reset_requested = 1;
3405 d1beab82 bellard
    }
3406 d9f75a4e aliguori
    qemu_notify_event();
3407 bb0c6722 bellard
}
3408 bb0c6722 bellard
3409 bb0c6722 bellard
void qemu_system_shutdown_request(void)
3410 bb0c6722 bellard
{
3411 bb0c6722 bellard
    shutdown_requested = 1;
3412 d9f75a4e aliguori
    qemu_notify_event();
3413 bb0c6722 bellard
}
3414 bb0c6722 bellard
3415 3475187d bellard
void qemu_system_powerdown_request(void)
3416 3475187d bellard
{
3417 3475187d bellard
    powerdown_requested = 1;
3418 d9f75a4e aliguori
    qemu_notify_event();
3419 d9f75a4e aliguori
}
3420 d9f75a4e aliguori
3421 d6dc3d42 aliguori
#ifdef CONFIG_IOTHREAD
3422 d6dc3d42 aliguori
static void qemu_system_vmstop_request(int reason)
3423 d9f75a4e aliguori
{
3424 d6dc3d42 aliguori
    vmstop_requested = reason;
3425 d6dc3d42 aliguori
    qemu_notify_event();
3426 bb0c6722 bellard
}
3427 d6dc3d42 aliguori
#endif
3428 bb0c6722 bellard
3429 50317c7f aliguori
#ifndef _WIN32
3430 50317c7f aliguori
static int io_thread_fd = -1;
3431 50317c7f aliguori
3432 50317c7f aliguori
static void qemu_event_increment(void)
3433 3fcf7b6b aliguori
{
3434 50317c7f aliguori
    static const char byte = 0;
3435 50317c7f aliguori
3436 50317c7f aliguori
    if (io_thread_fd == -1)
3437 50317c7f aliguori
        return;
3438 50317c7f aliguori
3439 50317c7f aliguori
    write(io_thread_fd, &byte, sizeof(byte));
3440 50317c7f aliguori
}
3441 50317c7f aliguori
3442 50317c7f aliguori
static void qemu_event_read(void *opaque)
3443 50317c7f aliguori
{
3444 50317c7f aliguori
    int fd = (unsigned long)opaque;
3445 50317c7f aliguori
    ssize_t len;
3446 50317c7f aliguori
3447 50317c7f aliguori
    /* Drain the notify pipe */
3448 50317c7f aliguori
    do {
3449 50317c7f aliguori
        char buffer[512];
3450 50317c7f aliguori
        len = read(fd, buffer, sizeof(buffer));
3451 50317c7f aliguori
    } while ((len == -1 && errno == EINTR) || len > 0);
3452 50317c7f aliguori
}
3453 50317c7f aliguori
3454 50317c7f aliguori
static int qemu_event_init(void)
3455 50317c7f aliguori
{
3456 50317c7f aliguori
    int err;
3457 50317c7f aliguori
    int fds[2];
3458 50317c7f aliguori
3459 50317c7f aliguori
    err = pipe(fds);
3460 50317c7f aliguori
    if (err == -1)
3461 50317c7f aliguori
        return -errno;
3462 50317c7f aliguori
3463 50317c7f aliguori
    err = fcntl_setfl(fds[0], O_NONBLOCK);
3464 50317c7f aliguori
    if (err < 0)
3465 50317c7f aliguori
        goto fail;
3466 50317c7f aliguori
3467 50317c7f aliguori
    err = fcntl_setfl(fds[1], O_NONBLOCK);
3468 50317c7f aliguori
    if (err < 0)
3469 50317c7f aliguori
        goto fail;
3470 50317c7f aliguori
3471 50317c7f aliguori
    qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL,
3472 50317c7f aliguori
                         (void *)(unsigned long)fds[0]);
3473 50317c7f aliguori
3474 50317c7f aliguori
    io_thread_fd = fds[1];
3475 a7e21219 Jan Kiszka
    return 0;
3476 a7e21219 Jan Kiszka
3477 50317c7f aliguori
fail:
3478 50317c7f aliguori
    close(fds[0]);
3479 50317c7f aliguori
    close(fds[1]);
3480 50317c7f aliguori
    return err;
3481 50317c7f aliguori
}
3482 50317c7f aliguori
#else
3483 50317c7f aliguori
HANDLE qemu_event_handle;
3484 50317c7f aliguori
3485 50317c7f aliguori
static void dummy_event_handler(void *opaque)
3486 50317c7f aliguori
{
3487 50317c7f aliguori
}
3488 50317c7f aliguori
3489 50317c7f aliguori
static int qemu_event_init(void)
3490 50317c7f aliguori
{
3491 50317c7f aliguori
    qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
3492 50317c7f aliguori
    if (!qemu_event_handle) {
3493 20889d4e Blue Swirl
        fprintf(stderr, "Failed CreateEvent: %ld\n", GetLastError());
3494 50317c7f aliguori
        return -1;
3495 50317c7f aliguori
    }
3496 50317c7f aliguori
    qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL);
3497 3fcf7b6b aliguori
    return 0;
3498 3fcf7b6b aliguori
}
3499 3fcf7b6b aliguori
3500 50317c7f aliguori
static void qemu_event_increment(void)
3501 50317c7f aliguori
{
3502 de1c90cf malc
    if (!SetEvent(qemu_event_handle)) {
3503 20889d4e Blue Swirl
        fprintf(stderr, "qemu_event_increment: SetEvent failed: %ld\n",
3504 de1c90cf malc
                GetLastError());
3505 de1c90cf malc
        exit (1);
3506 de1c90cf malc
    }
3507 50317c7f aliguori
}
3508 50317c7f aliguori
#endif
3509 50317c7f aliguori
3510 d6dc3d42 aliguori
static int cpu_can_run(CPUState *env)
3511 d6dc3d42 aliguori
{
3512 d6dc3d42 aliguori
    if (env->stop)
3513 d6dc3d42 aliguori
        return 0;
3514 d6dc3d42 aliguori
    if (env->stopped)
3515 d6dc3d42 aliguori
        return 0;
3516 d6dc3d42 aliguori
    return 1;
3517 d6dc3d42 aliguori
}
3518 d6dc3d42 aliguori
3519 d6dc3d42 aliguori
#ifndef CONFIG_IOTHREAD
3520 50317c7f aliguori
static int qemu_init_main_loop(void)
3521 50317c7f aliguori
{
3522 50317c7f aliguori
    return qemu_event_init();
3523 50317c7f aliguori
}
3524 50317c7f aliguori
3525 0bf46a40 aliguori
void qemu_init_vcpu(void *_env)
3526 0bf46a40 aliguori
{
3527 0bf46a40 aliguori
    CPUState *env = _env;
3528 0bf46a40 aliguori
3529 0bf46a40 aliguori
    if (kvm_enabled())
3530 0bf46a40 aliguori
        kvm_init_vcpu(env);
3531 dc6b1c09 Andre Przywara
    env->nr_cores = smp_cores;
3532 dc6b1c09 Andre Przywara
    env->nr_threads = smp_threads;
3533 0bf46a40 aliguori
    return;
3534 0bf46a40 aliguori
}
3535 0bf46a40 aliguori
3536 8edac960 aliguori
int qemu_cpu_self(void *env)
3537 8edac960 aliguori
{
3538 8edac960 aliguori
    return 1;
3539 8edac960 aliguori
}
3540 8edac960 aliguori
3541 d6dc3d42 aliguori
static void resume_all_vcpus(void)
3542 d6dc3d42 aliguori
{
3543 d6dc3d42 aliguori
}
3544 d6dc3d42 aliguori
3545 d6dc3d42 aliguori
static void pause_all_vcpus(void)
3546 d6dc3d42 aliguori
{
3547 d6dc3d42 aliguori
}
3548 d6dc3d42 aliguori
3549 8edac960 aliguori
void qemu_cpu_kick(void *env)
3550 8edac960 aliguori
{
3551 8edac960 aliguori
    return;
3552 8edac960 aliguori
}
3553 8edac960 aliguori
3554 d6dc3d42 aliguori
void qemu_notify_event(void)
3555 d6dc3d42 aliguori
{
3556 d6dc3d42 aliguori
    CPUState *env = cpu_single_env;
3557 d6dc3d42 aliguori
3558 d6dc3d42 aliguori
    if (env) {
3559 d6dc3d42 aliguori
        cpu_exit(env);
3560 4a1418e0 Anthony Liguori
    }
3561 d6dc3d42 aliguori
}
3562 d6dc3d42 aliguori
3563 d549db5a Glauber Costa
void qemu_mutex_lock_iothread(void) {}
3564 d549db5a Glauber Costa
void qemu_mutex_unlock_iothread(void) {}
3565 4870852c aliguori
3566 6e29f5da aliguori
void vm_stop(int reason)
3567 6e29f5da aliguori
{
3568 6e29f5da aliguori
    do_vm_stop(reason);
3569 6e29f5da aliguori
}
3570 6e29f5da aliguori
3571 d6dc3d42 aliguori
#else /* CONFIG_IOTHREAD */
3572 d6dc3d42 aliguori
3573 d6dc3d42 aliguori
#include "qemu-thread.h"
3574 d6dc3d42 aliguori
3575 d6dc3d42 aliguori
QemuMutex qemu_global_mutex;
3576 d6dc3d42 aliguori
static QemuMutex qemu_fair_mutex;
3577 d6dc3d42 aliguori
3578 d6dc3d42 aliguori
static QemuThread io_thread;
3579 d6dc3d42 aliguori
3580 d6dc3d42 aliguori
static QemuThread *tcg_cpu_thread;
3581 d6dc3d42 aliguori
static QemuCond *tcg_halt_cond;
3582 d6dc3d42 aliguori
3583 d6dc3d42 aliguori
static int qemu_system_ready;
3584 d6dc3d42 aliguori
/* cpu creation */
3585 d6dc3d42 aliguori
static QemuCond qemu_cpu_cond;
3586 d6dc3d42 aliguori
/* system init */
3587 d6dc3d42 aliguori
static QemuCond qemu_system_cond;
3588 d6dc3d42 aliguori
static QemuCond qemu_pause_cond;
3589 d6dc3d42 aliguori
3590 d6dc3d42 aliguori
static void block_io_signals(void);
3591 d6dc3d42 aliguori
static void unblock_io_signals(void);
3592 d6dc3d42 aliguori
static int tcg_has_work(void);
3593 d6dc3d42 aliguori
3594 d6dc3d42 aliguori
static int qemu_init_main_loop(void)
3595 d6dc3d42 aliguori
{
3596 d6dc3d42 aliguori
    int ret;
3597 d6dc3d42 aliguori
3598 d6dc3d42 aliguori
    ret = qemu_event_init();
3599 d6dc3d42 aliguori
    if (ret)
3600 d6dc3d42 aliguori
        return ret;
3601 d6dc3d42 aliguori
3602 d6dc3d42 aliguori
    qemu_cond_init(&qemu_pause_cond);
3603 d6dc3d42 aliguori
    qemu_mutex_init(&qemu_fair_mutex);
3604 d6dc3d42 aliguori
    qemu_mutex_init(&qemu_global_mutex);
3605 d6dc3d42 aliguori
    qemu_mutex_lock(&qemu_global_mutex);
3606 d6dc3d42 aliguori
3607 d6dc3d42 aliguori
    unblock_io_signals();
3608 d6dc3d42 aliguori
    qemu_thread_self(&io_thread);
3609 d6dc3d42 aliguori
3610 d6dc3d42 aliguori
    return 0;
3611 d6dc3d42 aliguori
}
3612 d6dc3d42 aliguori
3613 d6dc3d42 aliguori
static void qemu_wait_io_event(CPUState *env)
3614 d6dc3d42 aliguori
{
3615 d6dc3d42 aliguori
    while (!tcg_has_work())
3616 d6dc3d42 aliguori
        qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000);
3617 d6dc3d42 aliguori
3618 d6dc3d42 aliguori
    qemu_mutex_unlock(&qemu_global_mutex);
3619 d6dc3d42 aliguori
3620 d6dc3d42 aliguori
    /*
3621 d6dc3d42 aliguori
     * Users of qemu_global_mutex can be starved, having no chance
3622 d6dc3d42 aliguori
     * to acquire it since this path will get to it first.
3623 d6dc3d42 aliguori
     * So use another lock to provide fairness.
3624 d6dc3d42 aliguori
     */
3625 d6dc3d42 aliguori
    qemu_mutex_lock(&qemu_fair_mutex);
3626 d6dc3d42 aliguori
    qemu_mutex_unlock(&qemu_fair_mutex);
3627 d6dc3d42 aliguori
3628 d6dc3d42 aliguori
    qemu_mutex_lock(&qemu_global_mutex);
3629 d6dc3d42 aliguori
    if (env->stop) {
3630 d6dc3d42 aliguori
        env->stop = 0;
3631 d6dc3d42 aliguori
        env->stopped = 1;
3632 d6dc3d42 aliguori
        qemu_cond_signal(&qemu_pause_cond);
3633 d6dc3d42 aliguori
    }
3634 d6dc3d42 aliguori
}
3635 d6dc3d42 aliguori
3636 d6dc3d42 aliguori
static int qemu_cpu_exec(CPUState *env);
3637 d6dc3d42 aliguori
3638 d6dc3d42 aliguori
static void *kvm_cpu_thread_fn(void *arg)
3639 d6dc3d42 aliguori
{
3640 d6dc3d42 aliguori
    CPUState *env = arg;
3641 d6dc3d42 aliguori
3642 d6dc3d42 aliguori
    block_io_signals();
3643 d6dc3d42 aliguori
    qemu_thread_self(env->thread);
3644 321c1cb1 Jean-Christophe DUBOIS
    if (kvm_enabled())
3645 321c1cb1 Jean-Christophe DUBOIS
        kvm_init_vcpu(env);
3646 d6dc3d42 aliguori
3647 d6dc3d42 aliguori
    /* signal CPU creation */
3648 d6dc3d42 aliguori
    qemu_mutex_lock(&qemu_global_mutex);
3649 d6dc3d42 aliguori
    env->created = 1;
3650 d6dc3d42 aliguori
    qemu_cond_signal(&qemu_cpu_cond);
3651 d6dc3d42 aliguori
3652 d6dc3d42 aliguori
    /* and wait for machine initialization */
3653 d6dc3d42 aliguori
    while (!qemu_system_ready)
3654 d6dc3d42 aliguori
        qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100);
3655 d6dc3d42 aliguori
3656 d6dc3d42 aliguori
    while (1) {
3657 d6dc3d42 aliguori
        if (cpu_can_run(env))
3658 d6dc3d42 aliguori
            qemu_cpu_exec(env);
3659 1c3173b9 Anthony Liguori
        qemu_wait_io_event(env);
3660 d6dc3d42 aliguori
    }
3661 d6dc3d42 aliguori
3662 d6dc3d42 aliguori
    return NULL;
3663 d6dc3d42 aliguori
}
3664 d6dc3d42 aliguori
3665 d6dc3d42 aliguori
static void tcg_cpu_exec(void);
3666 d6dc3d42 aliguori
3667 d6dc3d42 aliguori
static void *tcg_cpu_thread_fn(void *arg)
3668 d6dc3d42 aliguori
{
3669 d6dc3d42 aliguori
    CPUState *env = arg;
3670 d6dc3d42 aliguori
3671 d6dc3d42 aliguori
    block_io_signals();
3672 d6dc3d42 aliguori
    qemu_thread_self(env->thread);
3673 d6dc3d42 aliguori
3674 d6dc3d42 aliguori
    /* signal CPU creation */
3675 d6dc3d42 aliguori
    qemu_mutex_lock(&qemu_global_mutex);
3676 d6dc3d42 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu)
3677 d6dc3d42 aliguori
        env->created = 1;
3678 d6dc3d42 aliguori
    qemu_cond_signal(&qemu_cpu_cond);
3679 d6dc3d42 aliguori
3680 d6dc3d42 aliguori
    /* and wait for machine initialization */
3681 d6dc3d42 aliguori
    while (!qemu_system_ready)
3682 d6dc3d42 aliguori
        qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100);
3683 d6dc3d42 aliguori
3684 d6dc3d42 aliguori
    while (1) {
3685 d6dc3d42 aliguori
        tcg_cpu_exec();
3686 d6dc3d42 aliguori
        qemu_wait_io_event(cur_cpu);
3687 d6dc3d42 aliguori
    }
3688 d6dc3d42 aliguori
3689 d6dc3d42 aliguori
    return NULL;
3690 d6dc3d42 aliguori
}
3691 d6dc3d42 aliguori
3692 d6dc3d42 aliguori
void qemu_cpu_kick(void *_env)
3693 d6dc3d42 aliguori
{
3694 d6dc3d42 aliguori
    CPUState *env = _env;
3695 d6dc3d42 aliguori
    qemu_cond_broadcast(env->halt_cond);
3696 d6dc3d42 aliguori
    if (kvm_enabled())
3697 d6dc3d42 aliguori
        qemu_thread_signal(env->thread, SIGUSR1);
3698 d6dc3d42 aliguori
}
3699 d6dc3d42 aliguori
3700 e5bc201d Glauber Costa
int qemu_cpu_self(void *_env)
3701 d6dc3d42 aliguori
{
3702 e5bc201d Glauber Costa
    CPUState *env = _env;
3703 e5bc201d Glauber Costa
    QemuThread this;
3704 e5bc201d Glauber Costa
 
3705 e5bc201d Glauber Costa
    qemu_thread_self(&this);
3706 e5bc201d Glauber Costa
 
3707 e5bc201d Glauber Costa
    return qemu_thread_equal(&this, env->thread);
3708 d6dc3d42 aliguori
}
3709 d6dc3d42 aliguori
3710 d6dc3d42 aliguori
static void cpu_signal(int sig)
3711 d6dc3d42 aliguori
{
3712 d6dc3d42 aliguori
    if (cpu_single_env)
3713 d6dc3d42 aliguori
        cpu_exit(cpu_single_env);
3714 d6dc3d42 aliguori
}
3715 d6dc3d42 aliguori
3716 d6dc3d42 aliguori
static void block_io_signals(void)
3717 d6dc3d42 aliguori
{
3718 d6dc3d42 aliguori
    sigset_t set;
3719 d6dc3d42 aliguori
    struct sigaction sigact;
3720 d6dc3d42 aliguori
3721 d6dc3d42 aliguori
    sigemptyset(&set);
3722 d6dc3d42 aliguori
    sigaddset(&set, SIGUSR2);
3723 d6dc3d42 aliguori
    sigaddset(&set, SIGIO);
3724 d6dc3d42 aliguori
    sigaddset(&set, SIGALRM);
3725 d6dc3d42 aliguori
    pthread_sigmask(SIG_BLOCK, &set, NULL);
3726 d6dc3d42 aliguori
3727 d6dc3d42 aliguori
    sigemptyset(&set);
3728 d6dc3d42 aliguori
    sigaddset(&set, SIGUSR1);
3729 d6dc3d42 aliguori
    pthread_sigmask(SIG_UNBLOCK, &set, NULL);
3730 d6dc3d42 aliguori
3731 d6dc3d42 aliguori
    memset(&sigact, 0, sizeof(sigact));
3732 d6dc3d42 aliguori
    sigact.sa_handler = cpu_signal;
3733 d6dc3d42 aliguori
    sigaction(SIGUSR1, &sigact, NULL);
3734 d6dc3d42 aliguori
}
3735 d6dc3d42 aliguori
3736 d6dc3d42 aliguori
static void unblock_io_signals(void)
3737 d6dc3d42 aliguori
{
3738 d6dc3d42 aliguori
    sigset_t set;
3739 d6dc3d42 aliguori
3740 d6dc3d42 aliguori
    sigemptyset(&set);
3741 d6dc3d42 aliguori
    sigaddset(&set, SIGUSR2);
3742 d6dc3d42 aliguori
    sigaddset(&set, SIGIO);
3743 d6dc3d42 aliguori
    sigaddset(&set, SIGALRM);
3744 d6dc3d42 aliguori
    pthread_sigmask(SIG_UNBLOCK, &set, NULL);
3745 d6dc3d42 aliguori
3746 d6dc3d42 aliguori
    sigemptyset(&set);
3747 d6dc3d42 aliguori
    sigaddset(&set, SIGUSR1);
3748 d6dc3d42 aliguori
    pthread_sigmask(SIG_BLOCK, &set, NULL);
3749 d6dc3d42 aliguori
}
3750 d6dc3d42 aliguori
3751 d6dc3d42 aliguori
static void qemu_signal_lock(unsigned int msecs)
3752 d6dc3d42 aliguori
{
3753 d6dc3d42 aliguori
    qemu_mutex_lock(&qemu_fair_mutex);
3754 d6dc3d42 aliguori
3755 d6dc3d42 aliguori
    while (qemu_mutex_trylock(&qemu_global_mutex)) {
3756 d6dc3d42 aliguori
        qemu_thread_signal(tcg_cpu_thread, SIGUSR1);
3757 d6dc3d42 aliguori
        if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
3758 d6dc3d42 aliguori
            break;
3759 d6dc3d42 aliguori
    }
3760 d6dc3d42 aliguori
    qemu_mutex_unlock(&qemu_fair_mutex);
3761 d6dc3d42 aliguori
}
3762 d6dc3d42 aliguori
3763 d549db5a Glauber Costa
void qemu_mutex_lock_iothread(void)
3764 d6dc3d42 aliguori
{
3765 d6dc3d42 aliguori
    if (kvm_enabled()) {
3766 d6dc3d42 aliguori
        qemu_mutex_lock(&qemu_fair_mutex);
3767 d6dc3d42 aliguori
        qemu_mutex_lock(&qemu_global_mutex);
3768 d6dc3d42 aliguori
        qemu_mutex_unlock(&qemu_fair_mutex);
3769 d6dc3d42 aliguori
    } else
3770 d6dc3d42 aliguori
        qemu_signal_lock(100);
3771 d6dc3d42 aliguori
}
3772 d6dc3d42 aliguori
3773 d549db5a Glauber Costa
void qemu_mutex_unlock_iothread(void)
3774 d6dc3d42 aliguori
{
3775 d6dc3d42 aliguori
    qemu_mutex_unlock(&qemu_global_mutex);
3776 d6dc3d42 aliguori
}
3777 d6dc3d42 aliguori
3778 d6dc3d42 aliguori
static int all_vcpus_paused(void)
3779 d6dc3d42 aliguori
{
3780 d6dc3d42 aliguori
    CPUState *penv = first_cpu;
3781 d6dc3d42 aliguori
3782 d6dc3d42 aliguori
    while (penv) {
3783 d6dc3d42 aliguori
        if (!penv->stopped)
3784 d6dc3d42 aliguori
            return 0;
3785 d6dc3d42 aliguori
        penv = (CPUState *)penv->next_cpu;
3786 d6dc3d42 aliguori
    }
3787 d6dc3d42 aliguori
3788 d6dc3d42 aliguori
    return 1;
3789 d6dc3d42 aliguori
}
3790 d6dc3d42 aliguori
3791 d6dc3d42 aliguori
static void pause_all_vcpus(void)
3792 d6dc3d42 aliguori
{
3793 d6dc3d42 aliguori
    CPUState *penv = first_cpu;
3794 d6dc3d42 aliguori
3795 d6dc3d42 aliguori
    while (penv) {
3796 d6dc3d42 aliguori
        penv->stop = 1;
3797 d6dc3d42 aliguori
        qemu_thread_signal(penv->thread, SIGUSR1);
3798 d6dc3d42 aliguori
        qemu_cpu_kick(penv);
3799 d6dc3d42 aliguori
        penv = (CPUState *)penv->next_cpu;
3800 d6dc3d42 aliguori
    }
3801 d6dc3d42 aliguori
3802 d6dc3d42 aliguori
    while (!all_vcpus_paused()) {
3803 d6dc3d42 aliguori
        qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100);
3804 d6dc3d42 aliguori
        penv = first_cpu;
3805 d6dc3d42 aliguori
        while (penv) {
3806 d6dc3d42 aliguori
            qemu_thread_signal(penv->thread, SIGUSR1);
3807 d6dc3d42 aliguori
            penv = (CPUState *)penv->next_cpu;
3808 d6dc3d42 aliguori
        }
3809 d6dc3d42 aliguori
    }
3810 d6dc3d42 aliguori
}
3811 d6dc3d42 aliguori
3812 d6dc3d42 aliguori
static void resume_all_vcpus(void)
3813 d6dc3d42 aliguori
{
3814 d6dc3d42 aliguori
    CPUState *penv = first_cpu;
3815 d6dc3d42 aliguori
3816 d6dc3d42 aliguori
    while (penv) {
3817 d6dc3d42 aliguori
        penv->stop = 0;
3818 d6dc3d42 aliguori
        penv->stopped = 0;
3819 d6dc3d42 aliguori
        qemu_thread_signal(penv->thread, SIGUSR1);
3820 d6dc3d42 aliguori
        qemu_cpu_kick(penv);
3821 d6dc3d42 aliguori
        penv = (CPUState *)penv->next_cpu;
3822 d6dc3d42 aliguori
    }
3823 d6dc3d42 aliguori
}
3824 d6dc3d42 aliguori
3825 d6dc3d42 aliguori
static void tcg_init_vcpu(void *_env)
3826 d6dc3d42 aliguori
{
3827 d6dc3d42 aliguori
    CPUState *env = _env;
3828 d6dc3d42 aliguori
    /* share a single thread for all cpus with TCG */
3829 d6dc3d42 aliguori
    if (!tcg_cpu_thread) {
3830 d6dc3d42 aliguori
        env->thread = qemu_mallocz(sizeof(QemuThread));
3831 d6dc3d42 aliguori
        env->halt_cond = qemu_mallocz(sizeof(QemuCond));
3832 d6dc3d42 aliguori
        qemu_cond_init(env->halt_cond);
3833 d6dc3d42 aliguori
        qemu_thread_create(env->thread, tcg_cpu_thread_fn, env);
3834 d6dc3d42 aliguori
        while (env->created == 0)
3835 d6dc3d42 aliguori
            qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100);
3836 d6dc3d42 aliguori
        tcg_cpu_thread = env->thread;
3837 d6dc3d42 aliguori
        tcg_halt_cond = env->halt_cond;
3838 d6dc3d42 aliguori
    } else {
3839 d6dc3d42 aliguori
        env->thread = tcg_cpu_thread;
3840 d6dc3d42 aliguori
        env->halt_cond = tcg_halt_cond;
3841 d6dc3d42 aliguori
    }
3842 d6dc3d42 aliguori
}
3843 d6dc3d42 aliguori
3844 d6dc3d42 aliguori
static void kvm_start_vcpu(CPUState *env)
3845 d6dc3d42 aliguori
{
3846 d6dc3d42 aliguori
    env->thread = qemu_mallocz(sizeof(QemuThread));
3847 d6dc3d42 aliguori
    env->halt_cond = qemu_mallocz(sizeof(QemuCond));
3848 d6dc3d42 aliguori
    qemu_cond_init(env->halt_cond);
3849 d6dc3d42 aliguori
    qemu_thread_create(env->thread, kvm_cpu_thread_fn, env);
3850 d6dc3d42 aliguori
    while (env->created == 0)
3851 d6dc3d42 aliguori
        qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100);
3852 d6dc3d42 aliguori
}
3853 d6dc3d42 aliguori
3854 d6dc3d42 aliguori
void qemu_init_vcpu(void *_env)
3855 d6dc3d42 aliguori
{
3856 d6dc3d42 aliguori
    CPUState *env = _env;
3857 d6dc3d42 aliguori
3858 d6dc3d42 aliguori
    if (kvm_enabled())
3859 d6dc3d42 aliguori
        kvm_start_vcpu(env);
3860 d6dc3d42 aliguori
    else
3861 d6dc3d42 aliguori
        tcg_init_vcpu(env);
3862 dc6b1c09 Andre Przywara
    env->nr_cores = smp_cores;
3863 dc6b1c09 Andre Przywara
    env->nr_threads = smp_threads;
3864 d6dc3d42 aliguori
}
3865 d6dc3d42 aliguori
3866 d6dc3d42 aliguori
void qemu_notify_event(void)
3867 d6dc3d42 aliguori
{
3868 d6dc3d42 aliguori
    qemu_event_increment();
3869 d6dc3d42 aliguori
}
3870 d6dc3d42 aliguori
3871 d6dc3d42 aliguori
void vm_stop(int reason)
3872 d6dc3d42 aliguori
{
3873 d6dc3d42 aliguori
    QemuThread me;
3874 d6dc3d42 aliguori
    qemu_thread_self(&me);
3875 d6dc3d42 aliguori
3876 d6dc3d42 aliguori
    if (!qemu_thread_equal(&me, &io_thread)) {
3877 d6dc3d42 aliguori
        qemu_system_vmstop_request(reason);
3878 d6dc3d42 aliguori
        /*
3879 d6dc3d42 aliguori
         * FIXME: should not return to device code in case
3880 d6dc3d42 aliguori
         * vm_stop() has been requested.
3881 d6dc3d42 aliguori
         */
3882 d6dc3d42 aliguori
        if (cpu_single_env) {
3883 d6dc3d42 aliguori
            cpu_exit(cpu_single_env);
3884 d6dc3d42 aliguori
            cpu_single_env->stop = 1;
3885 d6dc3d42 aliguori
        }
3886 d6dc3d42 aliguori
        return;
3887 d6dc3d42 aliguori
    }
3888 d6dc3d42 aliguori
    do_vm_stop(reason);
3889 d6dc3d42 aliguori
}
3890 d6dc3d42 aliguori
3891 d6dc3d42 aliguori
#endif
3892 d6dc3d42 aliguori
3893 d6dc3d42 aliguori
3894 877cf882 ths
#ifdef _WIN32
3895 69d6451c blueswir1
static void host_main_loop_wait(int *timeout)
3896 56f3a5d0 aliguori
{
3897 56f3a5d0 aliguori
    int ret, ret2, i;
3898 f331110f bellard
    PollingEntry *pe;
3899 f331110f bellard
3900 c4b1fcc0 bellard
3901 f331110f bellard
    /* XXX: need to suppress polling by better using win32 events */
3902 f331110f bellard
    ret = 0;
3903 f331110f bellard
    for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
3904 f331110f bellard
        ret |= pe->func(pe->opaque);
3905 f331110f bellard
    }
3906 e6b1e558 ths
    if (ret == 0) {
3907 a18e524a bellard
        int err;
3908 a18e524a bellard
        WaitObjects *w = &wait_objects;
3909 3b46e624 ths
3910 56f3a5d0 aliguori
        ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
3911 a18e524a bellard
        if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
3912 a18e524a bellard
            if (w->func[ret - WAIT_OBJECT_0])
3913 a18e524a bellard
                w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
3914 3b46e624 ths
3915 5fafdf24 ths
            /* Check for additional signaled events */
3916 e6b1e558 ths
            for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
3917 3b46e624 ths
3918 e6b1e558 ths
                /* Check if event is signaled */
3919 e6b1e558 ths
                ret2 = WaitForSingleObject(w->events[i], 0);
3920 e6b1e558 ths
                if(ret2 == WAIT_OBJECT_0) {
3921 e6b1e558 ths
                    if (w->func[i])
3922 e6b1e558 ths
                        w->func[i](w->opaque[i]);
3923 e6b1e558 ths
                } else if (ret2 == WAIT_TIMEOUT) {
3924 e6b1e558 ths
                } else {
3925 e6b1e558 ths
                    err = GetLastError();
3926 e6b1e558 ths
                    fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
3927 3b46e624 ths
                }
3928 3b46e624 ths
            }
3929 a18e524a bellard
        } else if (ret == WAIT_TIMEOUT) {
3930 a18e524a bellard
        } else {
3931 a18e524a bellard
            err = GetLastError();
3932 e6b1e558 ths
            fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
3933 a18e524a bellard
        }
3934 f331110f bellard
    }
3935 56f3a5d0 aliguori
3936 56f3a5d0 aliguori
    *timeout = 0;
3937 56f3a5d0 aliguori
}
3938 56f3a5d0 aliguori
#else
3939 69d6451c blueswir1
static void host_main_loop_wait(int *timeout)
3940 56f3a5d0 aliguori
{
3941 56f3a5d0 aliguori
}
3942 fd1dff4b bellard
#endif
3943 56f3a5d0 aliguori
3944 56f3a5d0 aliguori
void main_loop_wait(int timeout)
3945 56f3a5d0 aliguori
{
3946 56f3a5d0 aliguori
    IOHandlerRecord *ioh;
3947 56f3a5d0 aliguori
    fd_set rfds, wfds, xfds;
3948 56f3a5d0 aliguori
    int ret, nfds;
3949 56f3a5d0 aliguori
    struct timeval tv;
3950 56f3a5d0 aliguori
3951 56f3a5d0 aliguori
    qemu_bh_update_timeout(&timeout);
3952 56f3a5d0 aliguori
3953 56f3a5d0 aliguori
    host_main_loop_wait(&timeout);
3954 56f3a5d0 aliguori
3955 fd1dff4b bellard
    /* poll any events */
3956 fd1dff4b bellard
    /* XXX: separate device handlers from system ones */
3957 6abfbd79 aliguori
    nfds = -1;
3958 fd1dff4b bellard
    FD_ZERO(&rfds);
3959 fd1dff4b bellard
    FD_ZERO(&wfds);
3960 e035649e bellard
    FD_ZERO(&xfds);
3961 fd1dff4b bellard
    for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3962 cafffd40 ths
        if (ioh->deleted)
3963 cafffd40 ths
            continue;
3964 fd1dff4b bellard
        if (ioh->fd_read &&
3965 fd1dff4b bellard
            (!ioh->fd_read_poll ||
3966 fd1dff4b bellard
             ioh->fd_read_poll(ioh->opaque) != 0)) {
3967 fd1dff4b bellard
            FD_SET(ioh->fd, &rfds);
3968 fd1dff4b bellard
            if (ioh->fd > nfds)
3969 fd1dff4b bellard
                nfds = ioh->fd;
3970 fd1dff4b bellard
        }
3971 fd1dff4b bellard
        if (ioh->fd_write) {
3972 fd1dff4b bellard
            FD_SET(ioh->fd, &wfds);
3973 fd1dff4b bellard
            if (ioh->fd > nfds)
3974 fd1dff4b bellard
                nfds = ioh->fd;
3975 fd1dff4b bellard
        }
3976 fd1dff4b bellard
    }
3977 3b46e624 ths
3978 56f3a5d0 aliguori
    tv.tv_sec = timeout / 1000;
3979 56f3a5d0 aliguori
    tv.tv_usec = (timeout % 1000) * 1000;
3980 56f3a5d0 aliguori
3981 d918f23e Jan Kiszka
    slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
3982 d918f23e Jan Kiszka
3983 4870852c aliguori
    qemu_mutex_unlock_iothread();
3984 e035649e bellard
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
3985 4870852c aliguori
    qemu_mutex_lock_iothread();
3986 fd1dff4b bellard
    if (ret > 0) {
3987 cafffd40 ths
        IOHandlerRecord **pioh;
3988 cafffd40 ths
3989 cafffd40 ths
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3990 6ab43fdc ths
            if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
3991 fd1dff4b bellard
                ioh->fd_read(ioh->opaque);
3992 7c9d8e07 bellard
            }
3993 6ab43fdc ths
            if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
3994 fd1dff4b bellard
                ioh->fd_write(ioh->opaque);
3995 c4b1fcc0 bellard
            }
3996 b4608c04 bellard
        }
3997 cafffd40 ths
3998 cafffd40 ths
        /* remove deleted IO handlers */
3999 cafffd40 ths
        pioh = &first_io_handler;
4000 cafffd40 ths
        while (*pioh) {
4001 cafffd40 ths
            ioh = *pioh;
4002 cafffd40 ths
            if (ioh->deleted) {
4003 cafffd40 ths
                *pioh = ioh->next;
4004 cafffd40 ths
                qemu_free(ioh);
4005 5fafdf24 ths
            } else
4006 cafffd40 ths
                pioh = &ioh->next;
4007 cafffd40 ths
        }
4008 fd1dff4b bellard
    }
4009 d918f23e Jan Kiszka
4010 d918f23e Jan Kiszka
    slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
4011 c20709aa bellard
4012 50317c7f aliguori
    /* rearm timer, if not periodic */
4013 50317c7f aliguori
    if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
4014 50317c7f aliguori
        alarm_timer->flags &= ~ALARM_FLAG_EXPIRED;
4015 50317c7f aliguori
        qemu_rearm_alarm_timer(alarm_timer);
4016 50317c7f aliguori
    }
4017 50317c7f aliguori
4018 357c692c aliguori
    /* vm time timers */
4019 d6dc3d42 aliguori
    if (vm_running) {
4020 d6dc3d42 aliguori
        if (!cur_cpu || likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
4021 0fdddf80 Jan Kiszka
            qemu_run_timers(&active_timers[QEMU_CLOCK_VIRTUAL],
4022 0fdddf80 Jan Kiszka
                            qemu_get_clock(vm_clock));
4023 d6dc3d42 aliguori
    }
4024 357c692c aliguori
4025 357c692c aliguori
    /* real time timers */
4026 0fdddf80 Jan Kiszka
    qemu_run_timers(&active_timers[QEMU_CLOCK_REALTIME],
4027 357c692c aliguori
                    qemu_get_clock(rt_clock));
4028 357c692c aliguori
4029 21d5d12b Jan Kiszka
    qemu_run_timers(&active_timers[QEMU_CLOCK_HOST],
4030 21d5d12b Jan Kiszka
                    qemu_get_clock(host_clock));
4031 21d5d12b Jan Kiszka
4032 423f0742 pbrook
    /* Check bottom-halves last in case any of the earlier events triggered
4033 423f0742 pbrook
       them.  */
4034 423f0742 pbrook
    qemu_bh_poll();
4035 3b46e624 ths
4036 5905b2e5 bellard
}
4037 5905b2e5 bellard
4038 43b96858 aliguori
static int qemu_cpu_exec(CPUState *env)
4039 5905b2e5 bellard
{
4040 43b96858 aliguori
    int ret;
4041 89bfc105 bellard
#ifdef CONFIG_PROFILER
4042 89bfc105 bellard
    int64_t ti;
4043 89bfc105 bellard
#endif
4044 5905b2e5 bellard
4045 89bfc105 bellard
#ifdef CONFIG_PROFILER
4046 43b96858 aliguori
    ti = profile_getclock();
4047 89bfc105 bellard
#endif
4048 43b96858 aliguori
    if (use_icount) {
4049 43b96858 aliguori
        int64_t count;
4050 43b96858 aliguori
        int decr;
4051 43b96858 aliguori
        qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
4052 43b96858 aliguori
        env->icount_decr.u16.low = 0;
4053 43b96858 aliguori
        env->icount_extra = 0;
4054 43b96858 aliguori
        count = qemu_next_deadline();
4055 43b96858 aliguori
        count = (count + (1 << icount_time_shift) - 1)
4056 43b96858 aliguori
                >> icount_time_shift;
4057 43b96858 aliguori
        qemu_icount += count;
4058 43b96858 aliguori
        decr = (count > 0xffff) ? 0xffff : count;
4059 43b96858 aliguori
        count -= decr;
4060 43b96858 aliguori
        env->icount_decr.u16.low = decr;
4061 43b96858 aliguori
        env->icount_extra = count;
4062 43b96858 aliguori
    }
4063 43b96858 aliguori
    ret = cpu_exec(env);
4064 89bfc105 bellard
#ifdef CONFIG_PROFILER
4065 43b96858 aliguori
    qemu_time += profile_getclock() - ti;
4066 89bfc105 bellard
#endif
4067 43b96858 aliguori
    if (use_icount) {
4068 43b96858 aliguori
        /* Fold pending instructions back into the
4069 43b96858 aliguori
           instruction counter, and clear the interrupt flag.  */
4070 43b96858 aliguori
        qemu_icount -= (env->icount_decr.u16.low
4071 43b96858 aliguori
                        + env->icount_extra);
4072 43b96858 aliguori
        env->icount_decr.u32 = 0;
4073 43b96858 aliguori
        env->icount_extra = 0;
4074 43b96858 aliguori
    }
4075 43b96858 aliguori
    return ret;
4076 43b96858 aliguori
}
4077 43b96858 aliguori
4078 e6e35b1e aliguori
static void tcg_cpu_exec(void)
4079 e6e35b1e aliguori
{
4080 d6dc3d42 aliguori
    int ret = 0;
4081 e6e35b1e aliguori
4082 e6e35b1e aliguori
    if (next_cpu == NULL)
4083 e6e35b1e aliguori
        next_cpu = first_cpu;
4084 e6e35b1e aliguori
    for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) {
4085 e6e35b1e aliguori
        CPUState *env = cur_cpu = next_cpu;
4086 e6e35b1e aliguori
4087 e6e35b1e aliguori
        if (!vm_running)
4088 e6e35b1e aliguori
            break;
4089 e6e35b1e aliguori
        if (timer_alarm_pending) {
4090 e6e35b1e aliguori
            timer_alarm_pending = 0;
4091 e6e35b1e aliguori
            break;
4092 e6e35b1e aliguori
        }
4093 d6dc3d42 aliguori
        if (cpu_can_run(env))
4094 d6dc3d42 aliguori
            ret = qemu_cpu_exec(env);
4095 e6e35b1e aliguori
        if (ret == EXCP_DEBUG) {
4096 e6e35b1e aliguori
            gdb_set_stop_cpu(env);
4097 e6e35b1e aliguori
            debug_requested = 1;
4098 e6e35b1e aliguori
            break;
4099 e6e35b1e aliguori
        }
4100 e6e35b1e aliguori
    }
4101 e6e35b1e aliguori
}
4102 e6e35b1e aliguori
4103 43b96858 aliguori
static int cpu_has_work(CPUState *env)
4104 43b96858 aliguori
{
4105 d6dc3d42 aliguori
    if (env->stop)
4106 d6dc3d42 aliguori
        return 1;
4107 d6dc3d42 aliguori
    if (env->stopped)
4108 d6dc3d42 aliguori
        return 0;
4109 43b96858 aliguori
    if (!env->halted)
4110 43b96858 aliguori
        return 1;
4111 43b96858 aliguori
    if (qemu_cpu_has_work(env))
4112 43b96858 aliguori
        return 1;
4113 43b96858 aliguori
    return 0;
4114 43b96858 aliguori
}
4115 43b96858 aliguori
4116 43b96858 aliguori
static int tcg_has_work(void)
4117 43b96858 aliguori
{
4118 43b96858 aliguori
    CPUState *env;
4119 43b96858 aliguori
4120 43b96858 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu)
4121 43b96858 aliguori
        if (cpu_has_work(env))
4122 43b96858 aliguori
            return 1;
4123 43b96858 aliguori
    return 0;
4124 43b96858 aliguori
}
4125 43b96858 aliguori
4126 43b96858 aliguori
static int qemu_calculate_timeout(void)
4127 43b96858 aliguori
{
4128 b319820d Luiz Capitulino
#ifndef CONFIG_IOTHREAD
4129 43b96858 aliguori
    int timeout;
4130 43b96858 aliguori
4131 43b96858 aliguori
    if (!vm_running)
4132 43b96858 aliguori
        timeout = 5000;
4133 43b96858 aliguori
    else if (tcg_has_work())
4134 43b96858 aliguori
        timeout = 0;
4135 43b96858 aliguori
    else if (!use_icount)
4136 43b96858 aliguori
        timeout = 5000;
4137 43b96858 aliguori
    else {
4138 43b96858 aliguori
     /* XXX: use timeout computed from timers */
4139 43b96858 aliguori
        int64_t add;
4140 43b96858 aliguori
        int64_t delta;
4141 43b96858 aliguori
        /* Advance virtual time to the next event.  */
4142 43b96858 aliguori
        if (use_icount == 1) {
4143 43b96858 aliguori
            /* When not using an adaptive execution frequency
4144 43b96858 aliguori
               we tend to get badly out of sync with real time,
4145 43b96858 aliguori
               so just delay for a reasonable amount of time.  */
4146 43b96858 aliguori
            delta = 0;
4147 43b96858 aliguori
        } else {
4148 43b96858 aliguori
            delta = cpu_get_icount() - cpu_get_clock();
4149 43b96858 aliguori
        }
4150 43b96858 aliguori
        if (delta > 0) {
4151 43b96858 aliguori
            /* If virtual time is ahead of real time then just
4152 43b96858 aliguori
               wait for IO.  */
4153 43b96858 aliguori
            timeout = (delta / 1000000) + 1;
4154 43b96858 aliguori
        } else {
4155 43b96858 aliguori
            /* Wait for either IO to occur or the next
4156 43b96858 aliguori
               timer event.  */
4157 43b96858 aliguori
            add = qemu_next_deadline();
4158 43b96858 aliguori
            /* We advance the timer before checking for IO.
4159 43b96858 aliguori
               Limit the amount we advance so that early IO
4160 43b96858 aliguori
               activity won't get the guest too far ahead.  */
4161 43b96858 aliguori
            if (add > 10000000)
4162 43b96858 aliguori
                add = 10000000;
4163 43b96858 aliguori
            delta += add;
4164 43b96858 aliguori
            add = (add + (1 << icount_time_shift) - 1)
4165 43b96858 aliguori
                  >> icount_time_shift;
4166 43b96858 aliguori
            qemu_icount += add;
4167 43b96858 aliguori
            timeout = delta / 1000000;
4168 43b96858 aliguori
            if (timeout < 0)
4169 43b96858 aliguori
                timeout = 0;
4170 43b96858 aliguori
        }
4171 43b96858 aliguori
    }
4172 43b96858 aliguori
4173 43b96858 aliguori
    return timeout;
4174 b319820d Luiz Capitulino
#else /* CONFIG_IOTHREAD */
4175 b319820d Luiz Capitulino
    return 1000;
4176 b319820d Luiz Capitulino
#endif
4177 43b96858 aliguori
}
4178 43b96858 aliguori
4179 43b96858 aliguori
static int vm_can_run(void)
4180 43b96858 aliguori
{
4181 43b96858 aliguori
    if (powerdown_requested)
4182 43b96858 aliguori
        return 0;
4183 43b96858 aliguori
    if (reset_requested)
4184 43b96858 aliguori
        return 0;
4185 43b96858 aliguori
    if (shutdown_requested)
4186 43b96858 aliguori
        return 0;
4187 e568902a aliguori
    if (debug_requested)
4188 e568902a aliguori
        return 0;
4189 43b96858 aliguori
    return 1;
4190 43b96858 aliguori
}
4191 43b96858 aliguori
4192 d9c32310 Blue Swirl
qemu_irq qemu_system_powerdown;
4193 d9c32310 Blue Swirl
4194 43b96858 aliguori
static void main_loop(void)
4195 43b96858 aliguori
{
4196 6e29f5da aliguori
    int r;
4197 e6e35b1e aliguori
4198 d6dc3d42 aliguori
#ifdef CONFIG_IOTHREAD
4199 d6dc3d42 aliguori
    qemu_system_ready = 1;
4200 d6dc3d42 aliguori
    qemu_cond_broadcast(&qemu_system_cond);
4201 d6dc3d42 aliguori
#endif
4202 d6dc3d42 aliguori
4203 6e29f5da aliguori
    for (;;) {
4204 43b96858 aliguori
        do {
4205 e6e35b1e aliguori
#ifdef CONFIG_PROFILER
4206 e6e35b1e aliguori
            int64_t ti;
4207 e6e35b1e aliguori
#endif
4208 d6dc3d42 aliguori
#ifndef CONFIG_IOTHREAD
4209 e6e35b1e aliguori
            tcg_cpu_exec();
4210 d6dc3d42 aliguori
#endif
4211 89bfc105 bellard
#ifdef CONFIG_PROFILER
4212 43b96858 aliguori
            ti = profile_getclock();
4213 89bfc105 bellard
#endif
4214 43b96858 aliguori
            main_loop_wait(qemu_calculate_timeout());
4215 89bfc105 bellard
#ifdef CONFIG_PROFILER
4216 43b96858 aliguori
            dev_time += profile_getclock() - ti;
4217 89bfc105 bellard
#endif
4218 e568902a aliguori
        } while (vm_can_run());
4219 43b96858 aliguori
4220 e568902a aliguori
        if (qemu_debug_requested())
4221 e568902a aliguori
            vm_stop(EXCP_DEBUG);
4222 43b96858 aliguori
        if (qemu_shutdown_requested()) {
4223 43b96858 aliguori
            if (no_shutdown) {
4224 43b96858 aliguori
                vm_stop(0);
4225 43b96858 aliguori
                no_shutdown = 0;
4226 43b96858 aliguori
            } else
4227 43b96858 aliguori
                break;
4228 43b96858 aliguori
        }
4229 d6dc3d42 aliguori
        if (qemu_reset_requested()) {
4230 d6dc3d42 aliguori
            pause_all_vcpus();
4231 43b96858 aliguori
            qemu_system_reset();
4232 d6dc3d42 aliguori
            resume_all_vcpus();
4233 d6dc3d42 aliguori
        }
4234 d9c32310 Blue Swirl
        if (qemu_powerdown_requested()) {
4235 d9c32310 Blue Swirl
            qemu_irq_raise(qemu_system_powerdown);
4236 d9c32310 Blue Swirl
        }
4237 6e29f5da aliguori
        if ((r = qemu_vmstop_requested()))
4238 6e29f5da aliguori
            vm_stop(r);
4239 b4608c04 bellard
    }
4240 d6dc3d42 aliguori
    pause_all_vcpus();
4241 b4608c04 bellard
}
4242 b4608c04 bellard
4243 9bd7e6d9 pbrook
static void version(void)
4244 9bd7e6d9 pbrook
{
4245 4a19f1ec pbrook
    printf("QEMU PC emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n");
4246 9bd7e6d9 pbrook
}
4247 9bd7e6d9 pbrook
4248 15f82208 ths
static void help(int exitcode)
4249 0824d6fc bellard
{
4250 9bd7e6d9 pbrook
    version();
4251 9bd7e6d9 pbrook
    printf("usage: %s [options] [disk_image]\n"
4252 0824d6fc bellard
           "\n"
4253 a20dd508 bellard
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
4254 fc01f7e7 bellard
           "\n"
4255 5824d651 blueswir1
#define DEF(option, opt_arg, opt_enum, opt_help)        \
4256 5824d651 blueswir1
           opt_help
4257 5824d651 blueswir1
#define DEFHEADING(text) stringify(text) "\n"
4258 5824d651 blueswir1
#include "qemu-options.h"
4259 5824d651 blueswir1
#undef DEF
4260 5824d651 blueswir1
#undef DEFHEADING
4261 5824d651 blueswir1
#undef GEN_DOCS
4262 0824d6fc bellard
           "\n"
4263 82c643ff bellard
           "During emulation, the following keys are useful:\n"
4264 032a8c9e bellard
           "ctrl-alt-f      toggle full screen\n"
4265 032a8c9e bellard
           "ctrl-alt-n      switch to virtual console 'n'\n"
4266 032a8c9e bellard
           "ctrl-alt        toggle mouse and keyboard grab\n"
4267 82c643ff bellard
           "\n"
4268 82c643ff bellard
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
4269 82c643ff bellard
           ,
4270 0db63474 bellard
           "qemu",
4271 a00bad7e bellard
           DEFAULT_RAM_SIZE,
4272 7c9d8e07 bellard
#ifndef _WIN32
4273 a00bad7e bellard
           DEFAULT_NETWORK_SCRIPT,
4274 b46a8906 ths
           DEFAULT_NETWORK_DOWN_SCRIPT,
4275 7c9d8e07 bellard
#endif
4276 6e44ba7f bellard
           DEFAULT_GDBSTUB_PORT,
4277 bce61846 bellard
           "/tmp/qemu.log");
4278 15f82208 ths
    exit(exitcode);
4279 0824d6fc bellard
}
4280 0824d6fc bellard
4281 cd6f1169 bellard
#define HAS_ARG 0x0001
4282 cd6f1169 bellard
4283 cd6f1169 bellard
enum {
4284 5824d651 blueswir1
#define DEF(option, opt_arg, opt_enum, opt_help)        \
4285 5824d651 blueswir1
    opt_enum,
4286 5824d651 blueswir1
#define DEFHEADING(text)
4287 5824d651 blueswir1
#include "qemu-options.h"
4288 5824d651 blueswir1
#undef DEF
4289 5824d651 blueswir1
#undef DEFHEADING
4290 5824d651 blueswir1
#undef GEN_DOCS
4291 cd6f1169 bellard
};
4292 cd6f1169 bellard
4293 cd6f1169 bellard
typedef struct QEMUOption {
4294 cd6f1169 bellard
    const char *name;
4295 cd6f1169 bellard
    int flags;
4296 cd6f1169 bellard
    int index;
4297 cd6f1169 bellard
} QEMUOption;
4298 cd6f1169 bellard
4299 dbed7e40 blueswir1
static const QEMUOption qemu_options[] = {
4300 cd6f1169 bellard
    { "h", 0, QEMU_OPTION_h },
4301 5824d651 blueswir1
#define DEF(option, opt_arg, opt_enum, opt_help)        \
4302 5824d651 blueswir1
    { option, opt_arg, opt_enum },
4303 5824d651 blueswir1
#define DEFHEADING(text)
4304 5824d651 blueswir1
#include "qemu-options.h"
4305 5824d651 blueswir1
#undef DEF
4306 5824d651 blueswir1
#undef DEFHEADING
4307 5824d651 blueswir1
#undef GEN_DOCS
4308 cd6f1169 bellard
    { NULL },
4309 fc01f7e7 bellard
};
4310 fc01f7e7 bellard
4311 1d14ffa9 bellard
#ifdef HAS_AUDIO
4312 6a36d84e bellard
struct soundhw soundhw[] = {
4313 b00052e4 balrog
#ifdef HAS_AUDIO_CHOICE
4314 4ce7ff6e aurel32
#if defined(TARGET_I386) || defined(TARGET_MIPS)
4315 fd06c375 bellard
    {
4316 fd06c375 bellard
        "pcspk",
4317 fd06c375 bellard
        "PC speaker",
4318 fd06c375 bellard
        0,
4319 fd06c375 bellard
        1,
4320 fd06c375 bellard
        { .init_isa = pcspk_audio_init }
4321 fd06c375 bellard
    },
4322 fd06c375 bellard
#endif
4323 4c9b53e3 malc
4324 4c9b53e3 malc
#ifdef CONFIG_SB16
4325 6a36d84e bellard
    {
4326 6a36d84e bellard
        "sb16",
4327 6a36d84e bellard
        "Creative Sound Blaster 16",
4328 6a36d84e bellard
        0,
4329 6a36d84e bellard
        1,
4330 6a36d84e bellard
        { .init_isa = SB16_init }
4331 6a36d84e bellard
    },
4332 4c9b53e3 malc
#endif
4333 6a36d84e bellard
4334 cc53d26d malc
#ifdef CONFIG_CS4231A
4335 cc53d26d malc
    {
4336 cc53d26d malc
        "cs4231a",
4337 cc53d26d malc
        "CS4231A",
4338 cc53d26d malc
        0,
4339 cc53d26d malc
        1,
4340 cc53d26d malc
        { .init_isa = cs4231a_init }
4341 cc53d26d malc
    },
4342 cc53d26d malc
#endif
4343 cc53d26d malc
4344 1d14ffa9 bellard
#ifdef CONFIG_ADLIB
4345 6a36d84e bellard
    {
4346 6a36d84e bellard
        "adlib",
4347 1d14ffa9 bellard
#ifdef HAS_YMF262
4348 6a36d84e bellard
        "Yamaha YMF262 (OPL3)",
4349 1d14ffa9 bellard
#else
4350 6a36d84e bellard
        "Yamaha YM3812 (OPL2)",
4351 1d14ffa9 bellard
#endif
4352 6a36d84e bellard
        0,
4353 6a36d84e bellard
        1,
4354 6a36d84e bellard
        { .init_isa = Adlib_init }
4355 6a36d84e bellard
    },
4356 1d14ffa9 bellard
#endif
4357 6a36d84e bellard
4358 1d14ffa9 bellard
#ifdef CONFIG_GUS
4359 6a36d84e bellard
    {
4360 6a36d84e bellard
        "gus",
4361 6a36d84e bellard
        "Gravis Ultrasound GF1",
4362 6a36d84e bellard
        0,
4363 6a36d84e bellard
        1,
4364 6a36d84e bellard
        { .init_isa = GUS_init }
4365 6a36d84e bellard
    },
4366 1d14ffa9 bellard
#endif
4367 6a36d84e bellard
4368 4c9b53e3 malc
#ifdef CONFIG_AC97
4369 e5c9a13e balrog
    {
4370 e5c9a13e balrog
        "ac97",
4371 e5c9a13e balrog
        "Intel 82801AA AC97 Audio",
4372 e5c9a13e balrog
        0,
4373 e5c9a13e balrog
        0,
4374 e5c9a13e balrog
        { .init_pci = ac97_init }
4375 e5c9a13e balrog
    },
4376 4c9b53e3 malc
#endif
4377 e5c9a13e balrog
4378 4c9b53e3 malc
#ifdef CONFIG_ES1370
4379 6a36d84e bellard
    {
4380 6a36d84e bellard
        "es1370",
4381 6a36d84e bellard
        "ENSONIQ AudioPCI ES1370",
4382 6a36d84e bellard
        0,
4383 6a36d84e bellard
        0,
4384 6a36d84e bellard
        { .init_pci = es1370_init }
4385 6a36d84e bellard
    },
4386 b00052e4 balrog
#endif
4387 6a36d84e bellard
4388 4c9b53e3 malc
#endif /* HAS_AUDIO_CHOICE */
4389 4c9b53e3 malc
4390 6a36d84e bellard
    { NULL, NULL, 0, 0, { NULL } }
4391 6a36d84e bellard
};
4392 6a36d84e bellard
4393 6a36d84e bellard
static void select_soundhw (const char *optarg)
4394 6a36d84e bellard
{
4395 6a36d84e bellard
    struct soundhw *c;
4396 6a36d84e bellard
4397 6a36d84e bellard
    if (*optarg == '?') {
4398 6a36d84e bellard
    show_valid_cards:
4399 6a36d84e bellard
4400 6a36d84e bellard
        printf ("Valid sound card names (comma separated):\n");
4401 6a36d84e bellard
        for (c = soundhw; c->name; ++c) {
4402 6a36d84e bellard
            printf ("%-11s %s\n", c->name, c->descr);
4403 6a36d84e bellard
        }
4404 6a36d84e bellard
        printf ("\n-soundhw all will enable all of the above\n");
4405 1d14ffa9 bellard
        exit (*optarg != '?');
4406 1d14ffa9 bellard
    }
4407 1d14ffa9 bellard
    else {
4408 6a36d84e bellard
        size_t l;
4409 1d14ffa9 bellard
        const char *p;
4410 1d14ffa9 bellard
        char *e;
4411 1d14ffa9 bellard
        int bad_card = 0;
4412 1d14ffa9 bellard
4413 6a36d84e bellard
        if (!strcmp (optarg, "all")) {
4414 6a36d84e bellard
            for (c = soundhw; c->name; ++c) {
4415 6a36d84e bellard
                c->enabled = 1;
4416 6a36d84e bellard
            }
4417 6a36d84e bellard
            return;
4418 6a36d84e bellard
        }
4419 1d14ffa9 bellard
4420 6a36d84e bellard
        p = optarg;
4421 1d14ffa9 bellard
        while (*p) {
4422 1d14ffa9 bellard
            e = strchr (p, ',');
4423 1d14ffa9 bellard
            l = !e ? strlen (p) : (size_t) (e - p);
4424 6a36d84e bellard
4425 6a36d84e bellard
            for (c = soundhw; c->name; ++c) {
4426 b3d6fb4a malc
                if (!strncmp (c->name, p, l) && !c->name[l]) {
4427 6a36d84e bellard
                    c->enabled = 1;
4428 1d14ffa9 bellard
                    break;
4429 1d14ffa9 bellard
                }
4430 1d14ffa9 bellard
            }
4431 6a36d84e bellard
4432 6a36d84e bellard
            if (!c->name) {
4433 1d14ffa9 bellard
                if (l > 80) {
4434 1d14ffa9 bellard
                    fprintf (stderr,
4435 1d14ffa9 bellard
                             "Unknown sound card name (too big to show)\n");
4436 1d14ffa9 bellard
                }
4437 1d14ffa9 bellard
                else {
4438 1d14ffa9 bellard
                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
4439 1d14ffa9 bellard
                             (int) l, p);
4440 1d14ffa9 bellard
                }
4441 1d14ffa9 bellard
                bad_card = 1;
4442 1d14ffa9 bellard
            }
4443 1d14ffa9 bellard
            p += l + (e != NULL);
4444 1d14ffa9 bellard
        }
4445 1d14ffa9 bellard
4446 1d14ffa9 bellard
        if (bad_card)
4447 1d14ffa9 bellard
            goto show_valid_cards;
4448 1d14ffa9 bellard
    }
4449 1d14ffa9 bellard
}
4450 1d14ffa9 bellard
#endif
4451 1d14ffa9 bellard
4452 3893c124 malc
static void select_vgahw (const char *p)
4453 3893c124 malc
{
4454 3893c124 malc
    const char *opts;
4455 3893c124 malc
4456 86176759 Zachary Amsden
    vga_interface_type = VGA_NONE;
4457 3893c124 malc
    if (strstart(p, "std", &opts)) {
4458 86176759 Zachary Amsden
        vga_interface_type = VGA_STD;
4459 3893c124 malc
    } else if (strstart(p, "cirrus", &opts)) {
4460 86176759 Zachary Amsden
        vga_interface_type = VGA_CIRRUS;
4461 3893c124 malc
    } else if (strstart(p, "vmware", &opts)) {
4462 86176759 Zachary Amsden
        vga_interface_type = VGA_VMWARE;
4463 94909d9f aliguori
    } else if (strstart(p, "xenfb", &opts)) {
4464 86176759 Zachary Amsden
        vga_interface_type = VGA_XENFB;
4465 28b85ed8 aliguori
    } else if (!strstart(p, "none", &opts)) {
4466 3893c124 malc
    invalid_vga:
4467 3893c124 malc
        fprintf(stderr, "Unknown vga type: %s\n", p);
4468 3893c124 malc
        exit(1);
4469 3893c124 malc
    }
4470 cb5a7aa8 malc
    while (*opts) {
4471 cb5a7aa8 malc
        const char *nextopt;
4472 cb5a7aa8 malc
4473 cb5a7aa8 malc
        if (strstart(opts, ",retrace=", &nextopt)) {
4474 cb5a7aa8 malc
            opts = nextopt;
4475 cb5a7aa8 malc
            if (strstart(opts, "dumb", &nextopt))
4476 cb5a7aa8 malc
                vga_retrace_method = VGA_RETRACE_DUMB;
4477 cb5a7aa8 malc
            else if (strstart(opts, "precise", &nextopt))
4478 cb5a7aa8 malc
                vga_retrace_method = VGA_RETRACE_PRECISE;
4479 cb5a7aa8 malc
            else goto invalid_vga;
4480 cb5a7aa8 malc
        } else goto invalid_vga;
4481 cb5a7aa8 malc
        opts = nextopt;
4482 cb5a7aa8 malc
    }
4483 3893c124 malc
}
4484 3893c124 malc
4485 7d4c3d53 Markus Armbruster
#ifdef TARGET_I386
4486 7d4c3d53 Markus Armbruster
static int balloon_parse(const char *arg)
4487 7d4c3d53 Markus Armbruster
{
4488 382f0743 Gerd Hoffmann
    QemuOpts *opts;
4489 7d4c3d53 Markus Armbruster
4490 382f0743 Gerd Hoffmann
    if (strcmp(arg, "none") == 0) {
4491 382f0743 Gerd Hoffmann
        return 0;
4492 382f0743 Gerd Hoffmann
    }
4493 382f0743 Gerd Hoffmann
4494 382f0743 Gerd Hoffmann
    if (!strncmp(arg, "virtio", 6)) {
4495 382f0743 Gerd Hoffmann
        if (arg[6] == ',') {
4496 382f0743 Gerd Hoffmann
            /* have params -> parse them */
4497 382f0743 Gerd Hoffmann
            opts = qemu_opts_parse(&qemu_device_opts, arg+7, NULL);
4498 382f0743 Gerd Hoffmann
            if (!opts)
4499 382f0743 Gerd Hoffmann
                return  -1;
4500 382f0743 Gerd Hoffmann
        } else {
4501 382f0743 Gerd Hoffmann
            /* create empty opts */
4502 382f0743 Gerd Hoffmann
            opts = qemu_opts_create(&qemu_device_opts, NULL, 0);
4503 7d4c3d53 Markus Armbruster
        }
4504 382f0743 Gerd Hoffmann
        qemu_opt_set(opts, "driver", "virtio-balloon-pci");
4505 382f0743 Gerd Hoffmann
        return 0;
4506 7d4c3d53 Markus Armbruster
    }
4507 382f0743 Gerd Hoffmann
4508 382f0743 Gerd Hoffmann
    return -1;
4509 7d4c3d53 Markus Armbruster
}
4510 7d4c3d53 Markus Armbruster
#endif
4511 7d4c3d53 Markus Armbruster
4512 3587d7e6 bellard
#ifdef _WIN32
4513 3587d7e6 bellard
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
4514 3587d7e6 bellard
{
4515 3587d7e6 bellard
    exit(STATUS_CONTROL_C_EXIT);
4516 3587d7e6 bellard
    return TRUE;
4517 3587d7e6 bellard
}
4518 3587d7e6 bellard
#endif
4519 3587d7e6 bellard
4520 c4be29ff aliguori
int qemu_uuid_parse(const char *str, uint8_t *uuid)
4521 8fcb1b90 blueswir1
{
4522 8fcb1b90 blueswir1
    int ret;
4523 8fcb1b90 blueswir1
4524 8fcb1b90 blueswir1
    if(strlen(str) != 36)
4525 8fcb1b90 blueswir1
        return -1;
4526 8fcb1b90 blueswir1
4527 8fcb1b90 blueswir1
    ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
4528 8fcb1b90 blueswir1
            &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
4529 8fcb1b90 blueswir1
            &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
4530 8fcb1b90 blueswir1
4531 8fcb1b90 blueswir1
    if(ret != 16)
4532 8fcb1b90 blueswir1
        return -1;
4533 8fcb1b90 blueswir1
4534 b6f6e3d3 aliguori
#ifdef TARGET_I386
4535 b6f6e3d3 aliguori
    smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
4536 b6f6e3d3 aliguori
#endif
4537 b6f6e3d3 aliguori
4538 8fcb1b90 blueswir1
    return 0;
4539 8fcb1b90 blueswir1
}
4540 8fcb1b90 blueswir1
4541 5b08fc10 aliguori
#ifndef _WIN32
4542 5b08fc10 aliguori
4543 5b08fc10 aliguori
static void termsig_handler(int signal)
4544 5b08fc10 aliguori
{
4545 5b08fc10 aliguori
    qemu_system_shutdown_request();
4546 5b08fc10 aliguori
}
4547 5b08fc10 aliguori
4548 7c3370d4 Jan Kiszka
static void sigchld_handler(int signal)
4549 7c3370d4 Jan Kiszka
{
4550 7c3370d4 Jan Kiszka
    waitpid(-1, NULL, WNOHANG);
4551 7c3370d4 Jan Kiszka
}
4552 7c3370d4 Jan Kiszka
4553 7c3370d4 Jan Kiszka
static void sighandler_setup(void)
4554 5b08fc10 aliguori
{
4555 5b08fc10 aliguori
    struct sigaction act;
4556 5b08fc10 aliguori
4557 5b08fc10 aliguori
    memset(&act, 0, sizeof(act));
4558 5b08fc10 aliguori
    act.sa_handler = termsig_handler;
4559 5b08fc10 aliguori
    sigaction(SIGINT,  &act, NULL);
4560 5b08fc10 aliguori
    sigaction(SIGHUP,  &act, NULL);
4561 5b08fc10 aliguori
    sigaction(SIGTERM, &act, NULL);
4562 7c3370d4 Jan Kiszka
4563 7c3370d4 Jan Kiszka
    act.sa_handler = sigchld_handler;
4564 7c3370d4 Jan Kiszka
    act.sa_flags = SA_NOCLDSTOP;
4565 7c3370d4 Jan Kiszka
    sigaction(SIGCHLD, &act, NULL);
4566 5b08fc10 aliguori
}
4567 5b08fc10 aliguori
4568 5b08fc10 aliguori
#endif
4569 5b08fc10 aliguori
4570 5cea8590 Paul Brook
#ifdef _WIN32
4571 5cea8590 Paul Brook
/* Look for support files in the same directory as the executable.  */
4572 5cea8590 Paul Brook
static char *find_datadir(const char *argv0)
4573 5cea8590 Paul Brook
{
4574 5cea8590 Paul Brook
    char *p;
4575 5cea8590 Paul Brook
    char buf[MAX_PATH];
4576 5cea8590 Paul Brook
    DWORD len;
4577 5cea8590 Paul Brook
4578 5cea8590 Paul Brook
    len = GetModuleFileName(NULL, buf, sizeof(buf) - 1);
4579 5cea8590 Paul Brook
    if (len == 0) {
4580 c5947808 Blue Swirl
        return NULL;
4581 5cea8590 Paul Brook
    }
4582 5cea8590 Paul Brook
4583 5cea8590 Paul Brook
    buf[len] = 0;
4584 5cea8590 Paul Brook
    p = buf + len - 1;
4585 5cea8590 Paul Brook
    while (p != buf && *p != '\\')
4586 5cea8590 Paul Brook
        p--;
4587 5cea8590 Paul Brook
    *p = 0;
4588 5cea8590 Paul Brook
    if (access(buf, R_OK) == 0) {
4589 5cea8590 Paul Brook
        return qemu_strdup(buf);
4590 5cea8590 Paul Brook
    }
4591 5cea8590 Paul Brook
    return NULL;
4592 5cea8590 Paul Brook
}
4593 5cea8590 Paul Brook
#else /* !_WIN32 */
4594 5cea8590 Paul Brook
4595 5cea8590 Paul Brook
/* Find a likely location for support files using the location of the binary.
4596 5cea8590 Paul Brook
   For installed binaries this will be "$bindir/../share/qemu".  When
4597 5cea8590 Paul Brook
   running from the build tree this will be "$bindir/../pc-bios".  */
4598 5cea8590 Paul Brook
#define SHARE_SUFFIX "/share/qemu"
4599 5cea8590 Paul Brook
#define BUILD_SUFFIX "/pc-bios"
4600 5cea8590 Paul Brook
static char *find_datadir(const char *argv0)
4601 5cea8590 Paul Brook
{
4602 5cea8590 Paul Brook
    char *dir;
4603 5cea8590 Paul Brook
    char *p = NULL;
4604 5cea8590 Paul Brook
    char *res;
4605 5cea8590 Paul Brook
    char buf[PATH_MAX];
4606 3a41759d Blue Swirl
    size_t max_len;
4607 5cea8590 Paul Brook
4608 5cea8590 Paul Brook
#if defined(__linux__)
4609 5cea8590 Paul Brook
    {
4610 5cea8590 Paul Brook
        int len;
4611 5cea8590 Paul Brook
        len = readlink("/proc/self/exe", buf, sizeof(buf) - 1);
4612 5cea8590 Paul Brook
        if (len > 0) {
4613 5cea8590 Paul Brook
            buf[len] = 0;
4614 5cea8590 Paul Brook
            p = buf;
4615 5cea8590 Paul Brook
        }
4616 5cea8590 Paul Brook
    }
4617 5cea8590 Paul Brook
#elif defined(__FreeBSD__)
4618 5cea8590 Paul Brook
    {
4619 5cea8590 Paul Brook
        int len;
4620 5cea8590 Paul Brook
        len = readlink("/proc/curproc/file", buf, sizeof(buf) - 1);
4621 5cea8590 Paul Brook
        if (len > 0) {
4622 5cea8590 Paul Brook
            buf[len] = 0;
4623 5cea8590 Paul Brook
            p = buf;
4624 5cea8590 Paul Brook
        }
4625 5cea8590 Paul Brook
    }
4626 5cea8590 Paul Brook
#endif
4627 5cea8590 Paul Brook
    /* If we don't have any way of figuring out the actual executable
4628 5cea8590 Paul Brook
       location then try argv[0].  */
4629 5cea8590 Paul Brook
    if (!p) {
4630 4d224196 Jean-Christophe DUBOIS
        p = realpath(argv0, buf);
4631 5cea8590 Paul Brook
        if (!p) {
4632 5cea8590 Paul Brook
            return NULL;
4633 5cea8590 Paul Brook
        }
4634 5cea8590 Paul Brook
    }
4635 5cea8590 Paul Brook
    dir = dirname(p);
4636 5cea8590 Paul Brook
    dir = dirname(dir);
4637 5cea8590 Paul Brook
4638 3a41759d Blue Swirl
    max_len = strlen(dir) +
4639 3a41759d Blue Swirl
        MAX(strlen(SHARE_SUFFIX), strlen(BUILD_SUFFIX)) + 1;
4640 3a41759d Blue Swirl
    res = qemu_mallocz(max_len);
4641 3a41759d Blue Swirl
    snprintf(res, max_len, "%s%s", dir, SHARE_SUFFIX);
4642 5cea8590 Paul Brook
    if (access(res, R_OK)) {
4643 3a41759d Blue Swirl
        snprintf(res, max_len, "%s%s", dir, BUILD_SUFFIX);
4644 5cea8590 Paul Brook
        if (access(res, R_OK)) {
4645 5cea8590 Paul Brook
            qemu_free(res);
4646 5cea8590 Paul Brook
            res = NULL;
4647 5cea8590 Paul Brook
        }
4648 5cea8590 Paul Brook
    }
4649 4d224196 Jean-Christophe DUBOIS
4650 5cea8590 Paul Brook
    return res;
4651 5cea8590 Paul Brook
}
4652 5cea8590 Paul Brook
#undef SHARE_SUFFIX
4653 5cea8590 Paul Brook
#undef BUILD_SUFFIX
4654 5cea8590 Paul Brook
#endif
4655 5cea8590 Paul Brook
4656 5cea8590 Paul Brook
char *qemu_find_file(int type, const char *name)
4657 5cea8590 Paul Brook
{
4658 5cea8590 Paul Brook
    int len;
4659 5cea8590 Paul Brook
    const char *subdir;
4660 5cea8590 Paul Brook
    char *buf;
4661 5cea8590 Paul Brook
4662 5cea8590 Paul Brook
    /* If name contains path separators then try it as a straight path.  */
4663 5cea8590 Paul Brook
    if ((strchr(name, '/') || strchr(name, '\\'))
4664 5cea8590 Paul Brook
        && access(name, R_OK) == 0) {
4665 73ffc805 Jean-Christophe DUBOIS
        return qemu_strdup(name);
4666 5cea8590 Paul Brook
    }
4667 5cea8590 Paul Brook
    switch (type) {
4668 5cea8590 Paul Brook
    case QEMU_FILE_TYPE_BIOS:
4669 5cea8590 Paul Brook
        subdir = "";
4670 5cea8590 Paul Brook
        break;
4671 5cea8590 Paul Brook
    case QEMU_FILE_TYPE_KEYMAP:
4672 5cea8590 Paul Brook
        subdir = "keymaps/";
4673 5cea8590 Paul Brook
        break;
4674 5cea8590 Paul Brook
    default:
4675 5cea8590 Paul Brook
        abort();
4676 5cea8590 Paul Brook
    }
4677 5cea8590 Paul Brook
    len = strlen(data_dir) + strlen(name) + strlen(subdir) + 2;
4678 5cea8590 Paul Brook
    buf = qemu_mallocz(len);
4679 3a41759d Blue Swirl
    snprintf(buf, len, "%s/%s%s", data_dir, subdir, name);
4680 5cea8590 Paul Brook
    if (access(buf, R_OK)) {
4681 5cea8590 Paul Brook
        qemu_free(buf);
4682 5cea8590 Paul Brook
        return NULL;
4683 5cea8590 Paul Brook
    }
4684 5cea8590 Paul Brook
    return buf;
4685 5cea8590 Paul Brook
}
4686 5cea8590 Paul Brook
4687 f31d07d1 Gerd Hoffmann
static int device_init_func(QemuOpts *opts, void *opaque)
4688 f31d07d1 Gerd Hoffmann
{
4689 f31d07d1 Gerd Hoffmann
    DeviceState *dev;
4690 f31d07d1 Gerd Hoffmann
4691 f31d07d1 Gerd Hoffmann
    dev = qdev_device_add(opts);
4692 f31d07d1 Gerd Hoffmann
    if (!dev)
4693 f31d07d1 Gerd Hoffmann
        return -1;
4694 f31d07d1 Gerd Hoffmann
    return 0;
4695 f31d07d1 Gerd Hoffmann
}
4696 f31d07d1 Gerd Hoffmann
4697 bd3c948d Gerd Hoffmann
struct device_config {
4698 bd3c948d Gerd Hoffmann
    enum {
4699 bd3c948d Gerd Hoffmann
        DEV_USB,       /* -usbdevice   */
4700 bd3c948d Gerd Hoffmann
        DEV_BT,        /* -bt          */
4701 bd3c948d Gerd Hoffmann
    } type;
4702 bd3c948d Gerd Hoffmann
    const char *cmdline;
4703 72cf2d4f Blue Swirl
    QTAILQ_ENTRY(device_config) next;
4704 bd3c948d Gerd Hoffmann
};
4705 72cf2d4f Blue Swirl
QTAILQ_HEAD(, device_config) device_configs = QTAILQ_HEAD_INITIALIZER(device_configs);
4706 bd3c948d Gerd Hoffmann
4707 bd3c948d Gerd Hoffmann
static void add_device_config(int type, const char *cmdline)
4708 bd3c948d Gerd Hoffmann
{
4709 bd3c948d Gerd Hoffmann
    struct device_config *conf;
4710 bd3c948d Gerd Hoffmann
4711 bd3c948d Gerd Hoffmann
    conf = qemu_mallocz(sizeof(*conf));
4712 bd3c948d Gerd Hoffmann
    conf->type = type;
4713 bd3c948d Gerd Hoffmann
    conf->cmdline = cmdline;
4714 72cf2d4f Blue Swirl
    QTAILQ_INSERT_TAIL(&device_configs, conf, next);
4715 bd3c948d Gerd Hoffmann
}
4716 bd3c948d Gerd Hoffmann
4717 bd3c948d Gerd Hoffmann
static int foreach_device_config(int type, int (*func)(const char *cmdline))
4718 bd3c948d Gerd Hoffmann
{
4719 bd3c948d Gerd Hoffmann
    struct device_config *conf;
4720 bd3c948d Gerd Hoffmann
    int rc;
4721 bd3c948d Gerd Hoffmann
4722 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(conf, &device_configs, next) {
4723 bd3c948d Gerd Hoffmann
        if (conf->type != type)
4724 bd3c948d Gerd Hoffmann
            continue;
4725 bd3c948d Gerd Hoffmann
        rc = func(conf->cmdline);
4726 bd3c948d Gerd Hoffmann
        if (0 != rc)
4727 bd3c948d Gerd Hoffmann
            return rc;
4728 bd3c948d Gerd Hoffmann
    }
4729 bd3c948d Gerd Hoffmann
    return 0;
4730 bd3c948d Gerd Hoffmann
}
4731 bd3c948d Gerd Hoffmann
4732 902b3d5c malc
int main(int argc, char **argv, char **envp)
4733 0824d6fc bellard
{
4734 59030a8c aliguori
    const char *gdbstub_dev = NULL;
4735 28c5af54 j_mayer
    uint32_t boot_devices_bitmap = 0;
4736 e4bcb14c ths
    int i;
4737 28c5af54 j_mayer
    int snapshot, linux_boot, net_boot;
4738 7f7f9873 bellard
    const char *initrd_filename;
4739 a20dd508 bellard
    const char *kernel_filename, *kernel_cmdline;
4740 ef3adf68 Jan Kiszka
    char boot_devices[33] = "cad"; /* default to HD->floppy->CD-ROM */
4741 3023f332 aliguori
    DisplayState *ds;
4742 7d957bd8 aliguori
    DisplayChangeListener *dcl;
4743 46d4767d bellard
    int cyls, heads, secs, translation;
4744 f31d07d1 Gerd Hoffmann
    QemuOpts *hda_opts = NULL, *opts;
4745 cd6f1169 bellard
    int optind;
4746 cd6f1169 bellard
    const char *r, *optarg;
4747 ddd9bbd9 Jan Kiszka
    CharDriverState *monitor_hds[MAX_MONITOR_DEVICES];
4748 ddd9bbd9 Jan Kiszka
    const char *monitor_devices[MAX_MONITOR_DEVICES];
4749 ddd9bbd9 Jan Kiszka
    int monitor_device_index;
4750 fd5f393a pbrook
    const char *serial_devices[MAX_SERIAL_PORTS];
4751 8d11df9e bellard
    int serial_device_index;
4752 fd5f393a pbrook
    const char *parallel_devices[MAX_PARALLEL_PORTS];
4753 6508fe59 bellard
    int parallel_device_index;
4754 9ede2fde aliguori
    const char *virtio_consoles[MAX_VIRTIO_CONSOLES];
4755 9ede2fde aliguori
    int virtio_console_index;
4756 d63d307f bellard
    const char *loadvm = NULL;
4757 cc1daa40 bellard
    QEMUMachine *machine;
4758 94fc95cd j_mayer
    const char *cpu_model;
4759 b9e82a59 blueswir1
#ifndef _WIN32
4760 71e3ceb8 ths
    int fds[2];
4761 b9e82a59 blueswir1
#endif
4762 26a5f13b bellard
    int tb_size;
4763 93815bc2 ths
    const char *pid_file = NULL;
4764 5bb7910a aliguori
    const char *incoming = NULL;
4765 b9e82a59 blueswir1
#ifndef _WIN32
4766 54042bcf aliguori
    int fd = 0;
4767 54042bcf aliguori
    struct passwd *pwd = NULL;
4768 0858532e aliguori
    const char *chroot_dir = NULL;
4769 0858532e aliguori
    const char *run_as = NULL;
4770 b9e82a59 blueswir1
#endif
4771 268a362c aliguori
    CPUState *env;
4772 993fbfdb Anthony Liguori
    int show_vnc_port = 0;
4773 0bd48850 bellard
4774 6875204c Jan Kiszka
    init_clocks();
4775 6875204c Jan Kiszka
4776 ac7531ec Gerd Hoffmann
    qemu_errors_to_file(stderr);
4777 902b3d5c malc
    qemu_cache_utils_init(envp);
4778 902b3d5c malc
4779 72cf2d4f Blue Swirl
    QLIST_INIT (&vm_change_state_head);
4780 be995c27 bellard
#ifndef _WIN32
4781 be995c27 bellard
    {
4782 be995c27 bellard
        struct sigaction act;
4783 be995c27 bellard
        sigfillset(&act.sa_mask);
4784 be995c27 bellard
        act.sa_flags = 0;
4785 be995c27 bellard
        act.sa_handler = SIG_IGN;
4786 be995c27 bellard
        sigaction(SIGPIPE, &act, NULL);
4787 be995c27 bellard
    }
4788 3587d7e6 bellard
#else
4789 3587d7e6 bellard
    SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
4790 a8e5ac33 bellard
    /* Note: cpu_interrupt() is currently not SMP safe, so we force
4791 a8e5ac33 bellard
       QEMU to run on a single CPU */
4792 a8e5ac33 bellard
    {
4793 a8e5ac33 bellard
        HANDLE h;
4794 a8e5ac33 bellard
        DWORD mask, smask;
4795 a8e5ac33 bellard
        int i;
4796 a8e5ac33 bellard
        h = GetCurrentProcess();
4797 a8e5ac33 bellard
        if (GetProcessAffinityMask(h, &mask, &smask)) {
4798 a8e5ac33 bellard
            for(i = 0; i < 32; i++) {
4799 a8e5ac33 bellard
                if (mask & (1 << i))
4800 a8e5ac33 bellard
                    break;
4801 a8e5ac33 bellard
            }
4802 a8e5ac33 bellard
            if (i != 32) {
4803 a8e5ac33 bellard
                mask = 1 << i;
4804 a8e5ac33 bellard
                SetProcessAffinityMask(h, mask);
4805 a8e5ac33 bellard
            }
4806 a8e5ac33 bellard
        }
4807 a8e5ac33 bellard
    }
4808 67b915a5 bellard
#endif
4809 be995c27 bellard
4810 f80f9ec9 Anthony Liguori
    module_call_init(MODULE_INIT_MACHINE);
4811 0c257437 Anthony Liguori
    machine = find_default_machine();
4812 94fc95cd j_mayer
    cpu_model = NULL;
4813 fc01f7e7 bellard
    initrd_filename = NULL;
4814 4fc5d071 aurel32
    ram_size = 0;
4815 33e3963e bellard
    snapshot = 0;
4816 a20dd508 bellard
    kernel_filename = NULL;
4817 a20dd508 bellard
    kernel_cmdline = "";
4818 c4b1fcc0 bellard
    cyls = heads = secs = 0;
4819 46d4767d bellard
    translation = BIOS_ATA_TRANSLATION_AUTO;
4820 c4b1fcc0 bellard
4821 c75a823c aurel32
    serial_devices[0] = "vc:80Cx24C";
4822 8d11df9e bellard
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
4823 fd5f393a pbrook
        serial_devices[i] = NULL;
4824 8d11df9e bellard
    serial_device_index = 0;
4825 3b46e624 ths
4826 8290edda aliguori
    parallel_devices[0] = "vc:80Cx24C";
4827 6508fe59 bellard
    for(i = 1; i < MAX_PARALLEL_PORTS; i++)
4828 fd5f393a pbrook
        parallel_devices[i] = NULL;
4829 6508fe59 bellard
    parallel_device_index = 0;
4830 3b46e624 ths
4831 1b8fc811 aliguori
    for(i = 0; i < MAX_VIRTIO_CONSOLES; i++)
4832 9ede2fde aliguori
        virtio_consoles[i] = NULL;
4833 9ede2fde aliguori
    virtio_console_index = 0;
4834 9ede2fde aliguori
4835 ddd9bbd9 Jan Kiszka
    monitor_devices[0] = "vc:80Cx24C";
4836 ddd9bbd9 Jan Kiszka
    for (i = 1; i < MAX_MONITOR_DEVICES; i++) {
4837 ddd9bbd9 Jan Kiszka
        monitor_devices[i] = NULL;
4838 ddd9bbd9 Jan Kiszka
    }
4839 ddd9bbd9 Jan Kiszka
    monitor_device_index = 0;
4840 ddd9bbd9 Jan Kiszka
4841 268a362c aliguori
    for (i = 0; i < MAX_NODES; i++) {
4842 268a362c aliguori
        node_mem[i] = 0;
4843 268a362c aliguori
        node_cpumask[i] = 0;
4844 268a362c aliguori
    }
4845 268a362c aliguori
4846 268a362c aliguori
    nb_numa_nodes = 0;
4847 7c9d8e07 bellard
    nb_nics = 0;
4848 3b46e624 ths
4849 26a5f13b bellard
    tb_size = 0;
4850 41bd639b blueswir1
    autostart= 1;
4851 41bd639b blueswir1
4852 cd6f1169 bellard
    optind = 1;
4853 0824d6fc bellard
    for(;;) {
4854 cd6f1169 bellard
        if (optind >= argc)
4855 0824d6fc bellard
            break;
4856 cd6f1169 bellard
        r = argv[optind];
4857 cd6f1169 bellard
        if (r[0] != '-') {
4858 9dfd7c7a Gerd Hoffmann
            hda_opts = drive_add(argv[optind++], HD_ALIAS, 0);
4859 cd6f1169 bellard
        } else {
4860 cd6f1169 bellard
            const QEMUOption *popt;
4861 cd6f1169 bellard
4862 cd6f1169 bellard
            optind++;
4863 dff5efc8 pbrook
            /* Treat --foo the same as -foo.  */
4864 dff5efc8 pbrook
            if (r[1] == '-')
4865 dff5efc8 pbrook
                r++;
4866 cd6f1169 bellard
            popt = qemu_options;
4867 cd6f1169 bellard
            for(;;) {
4868 cd6f1169 bellard
                if (!popt->name) {
4869 5fafdf24 ths
                    fprintf(stderr, "%s: invalid option -- '%s'\n",
4870 cd6f1169 bellard
                            argv[0], r);
4871 cd6f1169 bellard
                    exit(1);
4872 cd6f1169 bellard
                }
4873 cd6f1169 bellard
                if (!strcmp(popt->name, r + 1))
4874 cd6f1169 bellard
                    break;
4875 cd6f1169 bellard
                popt++;
4876 cd6f1169 bellard
            }
4877 cd6f1169 bellard
            if (popt->flags & HAS_ARG) {
4878 cd6f1169 bellard
                if (optind >= argc) {
4879 cd6f1169 bellard
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
4880 cd6f1169 bellard
                            argv[0], r);
4881 cd6f1169 bellard
                    exit(1);
4882 cd6f1169 bellard
                }
4883 cd6f1169 bellard
                optarg = argv[optind++];
4884 cd6f1169 bellard
            } else {
4885 cd6f1169 bellard
                optarg = NULL;
4886 cd6f1169 bellard
            }
4887 cd6f1169 bellard
4888 cd6f1169 bellard
            switch(popt->index) {
4889 cc1daa40 bellard
            case QEMU_OPTION_M:
4890 cc1daa40 bellard
                machine = find_machine(optarg);
4891 cc1daa40 bellard
                if (!machine) {
4892 cc1daa40 bellard
                    QEMUMachine *m;
4893 cc1daa40 bellard
                    printf("Supported machines are:\n");
4894 cc1daa40 bellard
                    for(m = first_machine; m != NULL; m = m->next) {
4895 3f6599e6 Mark McLoughlin
                        if (m->alias)
4896 3f6599e6 Mark McLoughlin
                            printf("%-10s %s (alias of %s)\n",
4897 3f6599e6 Mark McLoughlin
                                   m->alias, m->desc, m->name);
4898 cc1daa40 bellard
                        printf("%-10s %s%s\n",
4899 5fafdf24 ths
                               m->name, m->desc,
4900 0c257437 Anthony Liguori
                               m->is_default ? " (default)" : "");
4901 cc1daa40 bellard
                    }
4902 15f82208 ths
                    exit(*optarg != '?');
4903 cc1daa40 bellard
                }
4904 cc1daa40 bellard
                break;
4905 94fc95cd j_mayer
            case QEMU_OPTION_cpu:
4906 94fc95cd j_mayer
                /* hw initialization will check this */
4907 15f82208 ths
                if (*optarg == '?') {
4908 c732abe2 j_mayer
/* XXX: implement xxx_cpu_list for targets that still miss it */
4909 c732abe2 j_mayer
#if defined(cpu_list)
4910 c732abe2 j_mayer
                    cpu_list(stdout, &fprintf);
4911 94fc95cd j_mayer
#endif
4912 15f82208 ths
                    exit(0);
4913 94fc95cd j_mayer
                } else {
4914 94fc95cd j_mayer
                    cpu_model = optarg;
4915 94fc95cd j_mayer
                }
4916 94fc95cd j_mayer
                break;
4917 cd6f1169 bellard
            case QEMU_OPTION_initrd:
4918 fc01f7e7 bellard
                initrd_filename = optarg;
4919 fc01f7e7 bellard
                break;
4920 cd6f1169 bellard
            case QEMU_OPTION_hda:
4921 e4bcb14c ths
                if (cyls == 0)
4922 9dfd7c7a Gerd Hoffmann
                    hda_opts = drive_add(optarg, HD_ALIAS, 0);
4923 e4bcb14c ths
                else
4924 9dfd7c7a Gerd Hoffmann
                    hda_opts = drive_add(optarg, HD_ALIAS
4925 e4bcb14c ths
                             ",cyls=%d,heads=%d,secs=%d%s",
4926 609497ab balrog
                             0, cyls, heads, secs,
4927 e4bcb14c ths
                             translation == BIOS_ATA_TRANSLATION_LBA ?
4928 e4bcb14c ths
                                 ",trans=lba" :
4929 e4bcb14c ths
                             translation == BIOS_ATA_TRANSLATION_NONE ?
4930 e4bcb14c ths
                                 ",trans=none" : "");
4931 e4bcb14c ths
                 break;
4932 cd6f1169 bellard
            case QEMU_OPTION_hdb:
4933 cc1daa40 bellard
            case QEMU_OPTION_hdc:
4934 cc1daa40 bellard
            case QEMU_OPTION_hdd:
4935 609497ab balrog
                drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
4936 fc01f7e7 bellard
                break;
4937 e4bcb14c ths
            case QEMU_OPTION_drive:
4938 609497ab balrog
                drive_add(NULL, "%s", optarg);
4939 e4bcb14c ths
                break;
4940 d058fe03 Gerd Hoffmann
            case QEMU_OPTION_set:
4941 d058fe03 Gerd Hoffmann
                if (qemu_set_option(optarg) != 0)
4942 d058fe03 Gerd Hoffmann
                    exit(1);
4943 d058fe03 Gerd Hoffmann
                break;
4944 3e3d5815 balrog
            case QEMU_OPTION_mtdblock:
4945 609497ab balrog
                drive_add(optarg, MTD_ALIAS);
4946 3e3d5815 balrog
                break;
4947 a1bb27b1 pbrook
            case QEMU_OPTION_sd:
4948 609497ab balrog
                drive_add(optarg, SD_ALIAS);
4949 a1bb27b1 pbrook
                break;
4950 86f55663 j_mayer
            case QEMU_OPTION_pflash:
4951 609497ab balrog
                drive_add(optarg, PFLASH_ALIAS);
4952 86f55663 j_mayer
                break;
4953 cd6f1169 bellard
            case QEMU_OPTION_snapshot:
4954 33e3963e bellard
                snapshot = 1;
4955 33e3963e bellard
                break;
4956 cd6f1169 bellard
            case QEMU_OPTION_hdachs:
4957 330d0414 bellard
                {
4958 330d0414 bellard
                    const char *p;
4959 330d0414 bellard
                    p = optarg;
4960 330d0414 bellard
                    cyls = strtol(p, (char **)&p, 0);
4961 46d4767d bellard
                    if (cyls < 1 || cyls > 16383)
4962 46d4767d bellard
                        goto chs_fail;
4963 330d0414 bellard
                    if (*p != ',')
4964 330d0414 bellard
                        goto chs_fail;
4965 330d0414 bellard
                    p++;
4966 330d0414 bellard
                    heads = strtol(p, (char **)&p, 0);
4967 46d4767d bellard
                    if (heads < 1 || heads > 16)
4968 46d4767d bellard
                        goto chs_fail;
4969 330d0414 bellard
                    if (*p != ',')
4970 330d0414 bellard
                        goto chs_fail;
4971 330d0414 bellard
                    p++;
4972 330d0414 bellard
                    secs = strtol(p, (char **)&p, 0);
4973 46d4767d bellard
                    if (secs < 1 || secs > 63)
4974 46d4767d bellard
                        goto chs_fail;
4975 46d4767d bellard
                    if (*p == ',') {
4976 46d4767d bellard
                        p++;
4977 46d4767d bellard
                        if (!strcmp(p, "none"))
4978 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_NONE;
4979 46d4767d bellard
                        else if (!strcmp(p, "lba"))
4980 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_LBA;
4981 46d4767d bellard
                        else if (!strcmp(p, "auto"))
4982 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_AUTO;
4983 46d4767d bellard
                        else
4984 46d4767d bellard
                            goto chs_fail;
4985 46d4767d bellard
                    } else if (*p != '\0') {
4986 c4b1fcc0 bellard
                    chs_fail:
4987 46d4767d bellard
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
4988 46d4767d bellard
                        exit(1);
4989 c4b1fcc0 bellard
                    }
4990 9dfd7c7a Gerd Hoffmann
                    if (hda_opts != NULL) {
4991 9dfd7c7a Gerd Hoffmann
                        char num[16];
4992 9dfd7c7a Gerd Hoffmann
                        snprintf(num, sizeof(num), "%d", cyls);
4993 9dfd7c7a Gerd Hoffmann
                        qemu_opt_set(hda_opts, "cyls", num);
4994 9dfd7c7a Gerd Hoffmann
                        snprintf(num, sizeof(num), "%d", heads);
4995 9dfd7c7a Gerd Hoffmann
                        qemu_opt_set(hda_opts, "heads", num);
4996 9dfd7c7a Gerd Hoffmann
                        snprintf(num, sizeof(num), "%d", secs);
4997 9dfd7c7a Gerd Hoffmann
                        qemu_opt_set(hda_opts, "secs", num);
4998 9dfd7c7a Gerd Hoffmann
                        if (translation == BIOS_ATA_TRANSLATION_LBA)
4999 9dfd7c7a Gerd Hoffmann
                            qemu_opt_set(hda_opts, "trans", "lba");
5000 9dfd7c7a Gerd Hoffmann
                        if (translation == BIOS_ATA_TRANSLATION_NONE)
5001 9dfd7c7a Gerd Hoffmann
                            qemu_opt_set(hda_opts, "trans", "none");
5002 9dfd7c7a Gerd Hoffmann
                    }
5003 330d0414 bellard
                }
5004 330d0414 bellard
                break;
5005 268a362c aliguori
            case QEMU_OPTION_numa:
5006 268a362c aliguori
                if (nb_numa_nodes >= MAX_NODES) {
5007 268a362c aliguori
                    fprintf(stderr, "qemu: too many NUMA nodes\n");
5008 268a362c aliguori
                    exit(1);
5009 268a362c aliguori
                }
5010 268a362c aliguori
                numa_add(optarg);
5011 268a362c aliguori
                break;
5012 cd6f1169 bellard
            case QEMU_OPTION_nographic:
5013 993fbfdb Anthony Liguori
                display_type = DT_NOGRAPHIC;
5014 a20dd508 bellard
                break;
5015 4d3b6f6e balrog
#ifdef CONFIG_CURSES
5016 4d3b6f6e balrog
            case QEMU_OPTION_curses:
5017 993fbfdb Anthony Liguori
                display_type = DT_CURSES;
5018 4d3b6f6e balrog
                break;
5019 4d3b6f6e balrog
#endif
5020 a171fe39 balrog
            case QEMU_OPTION_portrait:
5021 a171fe39 balrog
                graphic_rotate = 1;
5022 a171fe39 balrog
                break;
5023 cd6f1169 bellard
            case QEMU_OPTION_kernel:
5024 a20dd508 bellard
                kernel_filename = optarg;
5025 a20dd508 bellard
                break;
5026 cd6f1169 bellard
            case QEMU_OPTION_append:
5027 a20dd508 bellard
                kernel_cmdline = optarg;
5028 313aa567 bellard
                break;
5029 cd6f1169 bellard
            case QEMU_OPTION_cdrom:
5030 609497ab balrog
                drive_add(optarg, CDROM_ALIAS);
5031 36b486bb bellard
                break;
5032 cd6f1169 bellard
            case QEMU_OPTION_boot:
5033 28c5af54 j_mayer
                {
5034 ef3adf68 Jan Kiszka
                    static const char * const params[] = {
5035 95387491 Jan Kiszka
                        "order", "once", "menu", NULL
5036 ef3adf68 Jan Kiszka
                    };
5037 ef3adf68 Jan Kiszka
                    char buf[sizeof(boot_devices)];
5038 e0f084bf Jan Kiszka
                    char *standard_boot_devices;
5039 ef3adf68 Jan Kiszka
                    int legacy = 0;
5040 ef3adf68 Jan Kiszka
5041 ef3adf68 Jan Kiszka
                    if (!strchr(optarg, '=')) {
5042 ef3adf68 Jan Kiszka
                        legacy = 1;
5043 ef3adf68 Jan Kiszka
                        pstrcpy(buf, sizeof(buf), optarg);
5044 ef3adf68 Jan Kiszka
                    } else if (check_params(buf, sizeof(buf), params, optarg) < 0) {
5045 ef3adf68 Jan Kiszka
                        fprintf(stderr,
5046 ef3adf68 Jan Kiszka
                                "qemu: unknown boot parameter '%s' in '%s'\n",
5047 ef3adf68 Jan Kiszka
                                buf, optarg);
5048 ef3adf68 Jan Kiszka
                        exit(1);
5049 ef3adf68 Jan Kiszka
                    }
5050 ef3adf68 Jan Kiszka
5051 ef3adf68 Jan Kiszka
                    if (legacy ||
5052 ef3adf68 Jan Kiszka
                        get_param_value(buf, sizeof(buf), "order", optarg)) {
5053 ef3adf68 Jan Kiszka
                        boot_devices_bitmap = parse_bootdevices(buf);
5054 ef3adf68 Jan Kiszka
                        pstrcpy(boot_devices, sizeof(boot_devices), buf);
5055 28c5af54 j_mayer
                    }
5056 e0f084bf Jan Kiszka
                    if (!legacy) {
5057 e0f084bf Jan Kiszka
                        if (get_param_value(buf, sizeof(buf),
5058 e0f084bf Jan Kiszka
                                            "once", optarg)) {
5059 e0f084bf Jan Kiszka
                            boot_devices_bitmap |= parse_bootdevices(buf);
5060 e0f084bf Jan Kiszka
                            standard_boot_devices = qemu_strdup(boot_devices);
5061 e0f084bf Jan Kiszka
                            pstrcpy(boot_devices, sizeof(boot_devices), buf);
5062 e0f084bf Jan Kiszka
                            qemu_register_reset(restore_boot_devices,
5063 e0f084bf Jan Kiszka
                                                standard_boot_devices);
5064 e0f084bf Jan Kiszka
                        }
5065 95387491 Jan Kiszka
                        if (get_param_value(buf, sizeof(buf),
5066 95387491 Jan Kiszka
                                            "menu", optarg)) {
5067 95387491 Jan Kiszka
                            if (!strcmp(buf, "on")) {
5068 95387491 Jan Kiszka
                                boot_menu = 1;
5069 95387491 Jan Kiszka
                            } else if (!strcmp(buf, "off")) {
5070 95387491 Jan Kiszka
                                boot_menu = 0;
5071 95387491 Jan Kiszka
                            } else {
5072 95387491 Jan Kiszka
                                fprintf(stderr,
5073 95387491 Jan Kiszka
                                        "qemu: invalid option value '%s'\n",
5074 95387491 Jan Kiszka
                                        buf);
5075 95387491 Jan Kiszka
                                exit(1);
5076 95387491 Jan Kiszka
                            }
5077 95387491 Jan Kiszka
                        }
5078 e0f084bf Jan Kiszka
                    }
5079 36b486bb bellard
                }
5080 36b486bb bellard
                break;
5081 cd6f1169 bellard
            case QEMU_OPTION_fda:
5082 cd6f1169 bellard
            case QEMU_OPTION_fdb:
5083 609497ab balrog
                drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
5084 c45886db bellard
                break;
5085 52ca8d6a bellard
#ifdef TARGET_I386
5086 52ca8d6a bellard
            case QEMU_OPTION_no_fd_bootchk:
5087 52ca8d6a bellard
                fd_bootchk = 0;
5088 52ca8d6a bellard
                break;
5089 52ca8d6a bellard
#endif
5090 7c9d8e07 bellard
            case QEMU_OPTION_net:
5091 dc1c9fe8 Mark McLoughlin
                if (net_client_parse(optarg) == -1) {
5092 c4b1fcc0 bellard
                    exit(1);
5093 c4b1fcc0 bellard
                }
5094 702c651c bellard
                break;
5095 c7f74643 bellard
#ifdef CONFIG_SLIRP
5096 c7f74643 bellard
            case QEMU_OPTION_tftp:
5097 ad196a9d Jan Kiszka
                legacy_tftp_prefix = optarg;
5098 9bf05444 bellard
                break;
5099 47d5d01a ths
            case QEMU_OPTION_bootp:
5100 ad196a9d Jan Kiszka
                legacy_bootp_filename = optarg;
5101 47d5d01a ths
                break;
5102 c94c8d64 bellard
#ifndef _WIN32
5103 9d728e8c bellard
            case QEMU_OPTION_smb:
5104 0752706d Markus Armbruster
                if (net_slirp_smb(optarg) < 0)
5105 0752706d Markus Armbruster
                    exit(1);
5106 9d728e8c bellard
                break;
5107 c94c8d64 bellard
#endif
5108 9bf05444 bellard
            case QEMU_OPTION_redir:
5109 0752706d Markus Armbruster
                if (net_slirp_redir(optarg) < 0)
5110 0752706d Markus Armbruster
                    exit(1);
5111 9bf05444 bellard
                break;
5112 c7f74643 bellard
#endif
5113 dc72ac14 balrog
            case QEMU_OPTION_bt:
5114 bd3c948d Gerd Hoffmann
                add_device_config(DEV_BT, optarg);
5115 dc72ac14 balrog
                break;
5116 1d14ffa9 bellard
#ifdef HAS_AUDIO
5117 1d14ffa9 bellard
            case QEMU_OPTION_audio_help:
5118 1d14ffa9 bellard
                AUD_help ();
5119 1d14ffa9 bellard
                exit (0);
5120 1d14ffa9 bellard
                break;
5121 1d14ffa9 bellard
            case QEMU_OPTION_soundhw:
5122 1d14ffa9 bellard
                select_soundhw (optarg);
5123 1d14ffa9 bellard
                break;
5124 1d14ffa9 bellard
#endif
5125 cd6f1169 bellard
            case QEMU_OPTION_h:
5126 15f82208 ths
                help(0);
5127 cd6f1169 bellard
                break;
5128 9bd7e6d9 pbrook
            case QEMU_OPTION_version:
5129 9bd7e6d9 pbrook
                version();
5130 9bd7e6d9 pbrook
                exit(0);
5131 9bd7e6d9 pbrook
                break;
5132 00f82b8a aurel32
            case QEMU_OPTION_m: {
5133 00f82b8a aurel32
                uint64_t value;
5134 00f82b8a aurel32
                char *ptr;
5135 00f82b8a aurel32
5136 00f82b8a aurel32
                value = strtoul(optarg, &ptr, 10);
5137 00f82b8a aurel32
                switch (*ptr) {
5138 00f82b8a aurel32
                case 0: case 'M': case 'm':
5139 00f82b8a aurel32
                    value <<= 20;
5140 00f82b8a aurel32
                    break;
5141 00f82b8a aurel32
                case 'G': case 'g':
5142 00f82b8a aurel32
                    value <<= 30;
5143 00f82b8a aurel32
                    break;
5144 00f82b8a aurel32
                default:
5145 00f82b8a aurel32
                    fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
5146 cd6f1169 bellard
                    exit(1);
5147 cd6f1169 bellard
                }
5148 00f82b8a aurel32
5149 00f82b8a aurel32
                /* On 32-bit hosts, QEMU is limited by virtual address space */
5150 4a1418e0 Anthony Liguori
                if (value > (2047 << 20) && HOST_LONG_BITS == 32) {
5151 00f82b8a aurel32
                    fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
5152 00f82b8a aurel32
                    exit(1);
5153 00f82b8a aurel32
                }
5154 c227f099 Anthony Liguori
                if (value != (uint64_t)(ram_addr_t)value) {
5155 00f82b8a aurel32
                    fprintf(stderr, "qemu: ram size too large\n");
5156 00f82b8a aurel32
                    exit(1);
5157 00f82b8a aurel32
                }
5158 00f82b8a aurel32
                ram_size = value;
5159 cd6f1169 bellard
                break;
5160 00f82b8a aurel32
            }
5161 cd6f1169 bellard
            case QEMU_OPTION_d:
5162 cd6f1169 bellard
                {
5163 cd6f1169 bellard
                    int mask;
5164 c7cd6a37 blueswir1
                    const CPULogItem *item;
5165 3b46e624 ths
5166 cd6f1169 bellard
                    mask = cpu_str_to_log_mask(optarg);
5167 cd6f1169 bellard
                    if (!mask) {
5168 cd6f1169 bellard
                        printf("Log items (comma separated):\n");
5169 f193c797 bellard
                    for(item = cpu_log_items; item->mask != 0; item++) {
5170 f193c797 bellard
                        printf("%-10s %s\n", item->name, item->help);
5171 f193c797 bellard
                    }
5172 f193c797 bellard
                    exit(1);
5173 cd6f1169 bellard
                    }
5174 cd6f1169 bellard
                    cpu_set_log(mask);
5175 f193c797 bellard
                }
5176 cd6f1169 bellard
                break;
5177 cd6f1169 bellard
            case QEMU_OPTION_s:
5178 59030a8c aliguori
                gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
5179 cd6f1169 bellard
                break;
5180 59030a8c aliguori
            case QEMU_OPTION_gdb:
5181 59030a8c aliguori
                gdbstub_dev = optarg;
5182 cd6f1169 bellard
                break;
5183 cd6f1169 bellard
            case QEMU_OPTION_L:
5184 5cea8590 Paul Brook
                data_dir = optarg;
5185 cd6f1169 bellard
                break;
5186 1192dad8 j_mayer
            case QEMU_OPTION_bios:
5187 1192dad8 j_mayer
                bios_name = optarg;
5188 1192dad8 j_mayer
                break;
5189 1b530a6d aurel32
            case QEMU_OPTION_singlestep:
5190 1b530a6d aurel32
                singlestep = 1;
5191 1b530a6d aurel32
                break;
5192 cd6f1169 bellard
            case QEMU_OPTION_S:
5193 3c07f8e8 pbrook
                autostart = 0;
5194 cd6f1169 bellard
                break;
5195 5824d651 blueswir1
#ifndef _WIN32
5196 3d11d0eb bellard
            case QEMU_OPTION_k:
5197 3d11d0eb bellard
                keyboard_layout = optarg;
5198 3d11d0eb bellard
                break;
5199 5824d651 blueswir1
#endif
5200 ee22c2f7 bellard
            case QEMU_OPTION_localtime:
5201 ee22c2f7 bellard
                rtc_utc = 0;
5202 ee22c2f7 bellard
                break;
5203 3893c124 malc
            case QEMU_OPTION_vga:
5204 3893c124 malc
                select_vgahw (optarg);
5205 1bfe856e bellard
                break;
5206 5824d651 blueswir1
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
5207 e9b137c2 bellard
            case QEMU_OPTION_g:
5208 e9b137c2 bellard
                {
5209 e9b137c2 bellard
                    const char *p;
5210 e9b137c2 bellard
                    int w, h, depth;
5211 e9b137c2 bellard
                    p = optarg;
5212 e9b137c2 bellard
                    w = strtol(p, (char **)&p, 10);
5213 e9b137c2 bellard
                    if (w <= 0) {
5214 e9b137c2 bellard
                    graphic_error:
5215 e9b137c2 bellard
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
5216 e9b137c2 bellard
                        exit(1);
5217 e9b137c2 bellard
                    }
5218 e9b137c2 bellard
                    if (*p != 'x')
5219 e9b137c2 bellard
                        goto graphic_error;
5220 e9b137c2 bellard
                    p++;
5221 e9b137c2 bellard
                    h = strtol(p, (char **)&p, 10);
5222 e9b137c2 bellard
                    if (h <= 0)
5223 e9b137c2 bellard
                        goto graphic_error;
5224 e9b137c2 bellard
                    if (*p == 'x') {
5225 e9b137c2 bellard
                        p++;
5226 e9b137c2 bellard
                        depth = strtol(p, (char **)&p, 10);
5227 5fafdf24 ths
                        if (depth != 8 && depth != 15 && depth != 16 &&
5228 e9b137c2 bellard
                            depth != 24 && depth != 32)
5229 e9b137c2 bellard
                            goto graphic_error;
5230 e9b137c2 bellard
                    } else if (*p == '\0') {
5231 e9b137c2 bellard
                        depth = graphic_depth;
5232 e9b137c2 bellard
                    } else {
5233 e9b137c2 bellard
                        goto graphic_error;
5234 e9b137c2 bellard
                    }
5235 3b46e624 ths
5236 e9b137c2 bellard
                    graphic_width = w;
5237 e9b137c2 bellard
                    graphic_height = h;
5238 e9b137c2 bellard
                    graphic_depth = depth;
5239 e9b137c2 bellard
                }
5240 e9b137c2 bellard
                break;
5241 5824d651 blueswir1
#endif
5242 20d8a3ed ths
            case QEMU_OPTION_echr:
5243 20d8a3ed ths
                {
5244 20d8a3ed ths
                    char *r;
5245 20d8a3ed ths
                    term_escape_char = strtol(optarg, &r, 0);
5246 20d8a3ed ths
                    if (r == optarg)
5247 20d8a3ed ths
                        printf("Bad argument to echr\n");
5248 20d8a3ed ths
                    break;
5249 20d8a3ed ths
                }
5250 82c643ff bellard
            case QEMU_OPTION_monitor:
5251 ddd9bbd9 Jan Kiszka
                if (monitor_device_index >= MAX_MONITOR_DEVICES) {
5252 ddd9bbd9 Jan Kiszka
                    fprintf(stderr, "qemu: too many monitor devices\n");
5253 ddd9bbd9 Jan Kiszka
                    exit(1);
5254 ddd9bbd9 Jan Kiszka
                }
5255 ddd9bbd9 Jan Kiszka
                monitor_devices[monitor_device_index] = optarg;
5256 ddd9bbd9 Jan Kiszka
                monitor_device_index++;
5257 82c643ff bellard
                break;
5258 191bc01b Gerd Hoffmann
            case QEMU_OPTION_chardev:
5259 191bc01b Gerd Hoffmann
                opts = qemu_opts_parse(&qemu_chardev_opts, optarg, "backend");
5260 191bc01b Gerd Hoffmann
                if (!opts) {
5261 191bc01b Gerd Hoffmann
                    fprintf(stderr, "parse error: %s\n", optarg);
5262 191bc01b Gerd Hoffmann
                    exit(1);
5263 191bc01b Gerd Hoffmann
                }
5264 3df04ac3 Mark McLoughlin
                if (qemu_chr_open_opts(opts, NULL) == NULL) {
5265 191bc01b Gerd Hoffmann
                    exit(1);
5266 191bc01b Gerd Hoffmann
                }
5267 191bc01b Gerd Hoffmann
                break;
5268 82c643ff bellard
            case QEMU_OPTION_serial:
5269 8d11df9e bellard
                if (serial_device_index >= MAX_SERIAL_PORTS) {
5270 8d11df9e bellard
                    fprintf(stderr, "qemu: too many serial ports\n");
5271 8d11df9e bellard
                    exit(1);
5272 8d11df9e bellard
                }
5273 fd5f393a pbrook
                serial_devices[serial_device_index] = optarg;
5274 8d11df9e bellard
                serial_device_index++;
5275 82c643ff bellard
                break;
5276 9dd986cc Richard W.M. Jones
            case QEMU_OPTION_watchdog:
5277 09aaa160 Markus Armbruster
                if (watchdog) {
5278 09aaa160 Markus Armbruster
                    fprintf(stderr,
5279 09aaa160 Markus Armbruster
                            "qemu: only one watchdog option may be given\n");
5280 09aaa160 Markus Armbruster
                    return 1;
5281 09aaa160 Markus Armbruster
                }
5282 09aaa160 Markus Armbruster
                watchdog = optarg;
5283 9dd986cc Richard W.M. Jones
                break;
5284 9dd986cc Richard W.M. Jones
            case QEMU_OPTION_watchdog_action:
5285 9dd986cc Richard W.M. Jones
                if (select_watchdog_action(optarg) == -1) {
5286 9dd986cc Richard W.M. Jones
                    fprintf(stderr, "Unknown -watchdog-action parameter\n");
5287 9dd986cc Richard W.M. Jones
                    exit(1);
5288 9dd986cc Richard W.M. Jones
                }
5289 9dd986cc Richard W.M. Jones
                break;
5290 51ecf136 aliguori
            case QEMU_OPTION_virtiocon:
5291 51ecf136 aliguori
                if (virtio_console_index >= MAX_VIRTIO_CONSOLES) {
5292 51ecf136 aliguori
                    fprintf(stderr, "qemu: too many virtio consoles\n");
5293 51ecf136 aliguori
                    exit(1);
5294 51ecf136 aliguori
                }
5295 51ecf136 aliguori
                virtio_consoles[virtio_console_index] = optarg;
5296 51ecf136 aliguori
                virtio_console_index++;
5297 51ecf136 aliguori
                break;
5298 6508fe59 bellard
            case QEMU_OPTION_parallel:
5299 6508fe59 bellard
                if (parallel_device_index >= MAX_PARALLEL_PORTS) {
5300 6508fe59 bellard
                    fprintf(stderr, "qemu: too many parallel ports\n");
5301 6508fe59 bellard
                    exit(1);
5302 6508fe59 bellard
                }
5303 fd5f393a pbrook
                parallel_devices[parallel_device_index] = optarg;
5304 6508fe59 bellard
                parallel_device_index++;
5305 6508fe59 bellard
                break;
5306 d63d307f bellard
            case QEMU_OPTION_loadvm:
5307 d63d307f bellard
                loadvm = optarg;
5308 d63d307f bellard
                break;
5309 d63d307f bellard
            case QEMU_OPTION_full_screen:
5310 d63d307f bellard
                full_screen = 1;
5311 d63d307f bellard
                break;
5312 667accab ths
#ifdef CONFIG_SDL
5313 43523e93 ths
            case QEMU_OPTION_no_frame:
5314 43523e93 ths
                no_frame = 1;
5315 43523e93 ths
                break;
5316 3780e197 ths
            case QEMU_OPTION_alt_grab:
5317 3780e197 ths
                alt_grab = 1;
5318 3780e197 ths
                break;
5319 0ca9f8a4 Dustin Kirkland
            case QEMU_OPTION_ctrl_grab:
5320 0ca9f8a4 Dustin Kirkland
                ctrl_grab = 1;
5321 0ca9f8a4 Dustin Kirkland
                break;
5322 667accab ths
            case QEMU_OPTION_no_quit:
5323 667accab ths
                no_quit = 1;
5324 667accab ths
                break;
5325 7d957bd8 aliguori
            case QEMU_OPTION_sdl:
5326 993fbfdb Anthony Liguori
                display_type = DT_SDL;
5327 7d957bd8 aliguori
                break;
5328 667accab ths
#endif
5329 f7cce898 bellard
            case QEMU_OPTION_pidfile:
5330 93815bc2 ths
                pid_file = optarg;
5331 f7cce898 bellard
                break;
5332 a09db21f bellard
#ifdef TARGET_I386
5333 a09db21f bellard
            case QEMU_OPTION_win2k_hack:
5334 a09db21f bellard
                win2k_install_hack = 1;
5335 a09db21f bellard
                break;
5336 73822ec8 aliguori
            case QEMU_OPTION_rtc_td_hack:
5337 73822ec8 aliguori
                rtc_td_hack = 1;
5338 73822ec8 aliguori
                break;
5339 8a92ea2f aliguori
            case QEMU_OPTION_acpitable:
5340 8a92ea2f aliguori
                if(acpi_table_add(optarg) < 0) {
5341 8a92ea2f aliguori
                    fprintf(stderr, "Wrong acpi table provided\n");
5342 8a92ea2f aliguori
                    exit(1);
5343 8a92ea2f aliguori
                }
5344 8a92ea2f aliguori
                break;
5345 b6f6e3d3 aliguori
            case QEMU_OPTION_smbios:
5346 b6f6e3d3 aliguori
                if(smbios_entry_add(optarg) < 0) {
5347 b6f6e3d3 aliguori
                    fprintf(stderr, "Wrong smbios provided\n");
5348 b6f6e3d3 aliguori
                    exit(1);
5349 b6f6e3d3 aliguori
                }
5350 b6f6e3d3 aliguori
                break;
5351 a09db21f bellard
#endif
5352 7ba1e619 aliguori
#ifdef CONFIG_KVM
5353 7ba1e619 aliguori
            case QEMU_OPTION_enable_kvm:
5354 7ba1e619 aliguori
                kvm_allowed = 1;
5355 7ba1e619 aliguori
                break;
5356 7ba1e619 aliguori
#endif
5357 bb36d470 bellard
            case QEMU_OPTION_usb:
5358 bb36d470 bellard
                usb_enabled = 1;
5359 bb36d470 bellard
                break;
5360 a594cfbf bellard
            case QEMU_OPTION_usbdevice:
5361 a594cfbf bellard
                usb_enabled = 1;
5362 bd3c948d Gerd Hoffmann
                add_device_config(DEV_USB, optarg);
5363 bd3c948d Gerd Hoffmann
                break;
5364 bd3c948d Gerd Hoffmann
            case QEMU_OPTION_device:
5365 b386becf Mark McLoughlin
                if (!qemu_opts_parse(&qemu_device_opts, optarg, "driver")) {
5366 f31d07d1 Gerd Hoffmann
                    exit(1);
5367 f31d07d1 Gerd Hoffmann
                }
5368 a594cfbf bellard
                break;
5369 6a00d601 bellard
            case QEMU_OPTION_smp:
5370 dc6b1c09 Andre Przywara
                smp_parse(optarg);
5371 b2097003 aliguori
                if (smp_cpus < 1) {
5372 6a00d601 bellard
                    fprintf(stderr, "Invalid number of CPUs\n");
5373 6a00d601 bellard
                    exit(1);
5374 6a00d601 bellard
                }
5375 6be68d7e Jes Sorensen
                if (max_cpus < smp_cpus) {
5376 6be68d7e Jes Sorensen
                    fprintf(stderr, "maxcpus must be equal to or greater than "
5377 6be68d7e Jes Sorensen
                            "smp\n");
5378 6be68d7e Jes Sorensen
                    exit(1);
5379 6be68d7e Jes Sorensen
                }
5380 6be68d7e Jes Sorensen
                if (max_cpus > 255) {
5381 6be68d7e Jes Sorensen
                    fprintf(stderr, "Unsupported number of maxcpus\n");
5382 6be68d7e Jes Sorensen
                    exit(1);
5383 6be68d7e Jes Sorensen
                }
5384 6a00d601 bellard
                break;
5385 24236869 bellard
            case QEMU_OPTION_vnc:
5386 993fbfdb Anthony Liguori
                display_type = DT_VNC;
5387 73fc9742 ths
                vnc_display = optarg;
5388 24236869 bellard
                break;
5389 5824d651 blueswir1
#ifdef TARGET_I386
5390 6515b203 bellard
            case QEMU_OPTION_no_acpi:
5391 6515b203 bellard
                acpi_enabled = 0;
5392 6515b203 bellard
                break;
5393 16b29ae1 aliguori
            case QEMU_OPTION_no_hpet:
5394 16b29ae1 aliguori
                no_hpet = 1;
5395 16b29ae1 aliguori
                break;
5396 7d4c3d53 Markus Armbruster
            case QEMU_OPTION_balloon:
5397 7d4c3d53 Markus Armbruster
                if (balloon_parse(optarg) < 0) {
5398 7d4c3d53 Markus Armbruster
                    fprintf(stderr, "Unknown -balloon argument %s\n", optarg);
5399 7d4c3d53 Markus Armbruster
                    exit(1);
5400 7d4c3d53 Markus Armbruster
                }
5401 df97b920 Eduardo Habkost
                break;
5402 5824d651 blueswir1
#endif
5403 d1beab82 bellard
            case QEMU_OPTION_no_reboot:
5404 d1beab82 bellard
                no_reboot = 1;
5405 d1beab82 bellard
                break;
5406 b2f76161 aurel32
            case QEMU_OPTION_no_shutdown:
5407 b2f76161 aurel32
                no_shutdown = 1;
5408 b2f76161 aurel32
                break;
5409 9467cd46 balrog
            case QEMU_OPTION_show_cursor:
5410 9467cd46 balrog
                cursor_hide = 0;
5411 9467cd46 balrog
                break;
5412 8fcb1b90 blueswir1
            case QEMU_OPTION_uuid:
5413 8fcb1b90 blueswir1
                if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
5414 8fcb1b90 blueswir1
                    fprintf(stderr, "Fail to parse UUID string."
5415 8fcb1b90 blueswir1
                            " Wrong format.\n");
5416 8fcb1b90 blueswir1
                    exit(1);
5417 8fcb1b90 blueswir1
                }
5418 8fcb1b90 blueswir1
                break;
5419 5824d651 blueswir1
#ifndef _WIN32
5420 71e3ceb8 ths
            case QEMU_OPTION_daemonize:
5421 71e3ceb8 ths
                daemonize = 1;
5422 71e3ceb8 ths
                break;
5423 5824d651 blueswir1
#endif
5424 9ae02555 ths
            case QEMU_OPTION_option_rom:
5425 9ae02555 ths
                if (nb_option_roms >= MAX_OPTION_ROMS) {
5426 9ae02555 ths
                    fprintf(stderr, "Too many option ROMs\n");
5427 9ae02555 ths
                    exit(1);
5428 9ae02555 ths
                }
5429 9ae02555 ths
                option_rom[nb_option_roms] = optarg;
5430 9ae02555 ths
                nb_option_roms++;
5431 9ae02555 ths
                break;
5432 5824d651 blueswir1
#if defined(TARGET_ARM) || defined(TARGET_M68K)
5433 8e71621f pbrook
            case QEMU_OPTION_semihosting:
5434 8e71621f pbrook
                semihosting_enabled = 1;
5435 8e71621f pbrook
                break;
5436 5824d651 blueswir1
#endif
5437 c35734b2 ths
            case QEMU_OPTION_name:
5438 1889465a Andi Kleen
                qemu_name = qemu_strdup(optarg);
5439 1889465a Andi Kleen
                 {
5440 1889465a Andi Kleen
                     char *p = strchr(qemu_name, ',');
5441 1889465a Andi Kleen
                     if (p != NULL) {
5442 1889465a Andi Kleen
                        *p++ = 0;
5443 1889465a Andi Kleen
                        if (strncmp(p, "process=", 8)) {
5444 1889465a Andi Kleen
                            fprintf(stderr, "Unknown subargument %s to -name", p);
5445 1889465a Andi Kleen
                            exit(1);
5446 1889465a Andi Kleen
                        }
5447 1889465a Andi Kleen
                        p += 8;
5448 1889465a Andi Kleen
                        set_proc_name(p);
5449 1889465a Andi Kleen
                     }        
5450 1889465a Andi Kleen
                 }        
5451 c35734b2 ths
                break;
5452 95efd11c blueswir1
#if defined(TARGET_SPARC) || defined(TARGET_PPC)
5453 66508601 blueswir1
            case QEMU_OPTION_prom_env:
5454 66508601 blueswir1
                if (nb_prom_envs >= MAX_PROM_ENVS) {
5455 66508601 blueswir1
                    fprintf(stderr, "Too many prom variables\n");
5456 66508601 blueswir1
                    exit(1);
5457 66508601 blueswir1
                }
5458 66508601 blueswir1
                prom_envs[nb_prom_envs] = optarg;
5459 66508601 blueswir1
                nb_prom_envs++;
5460 66508601 blueswir1
                break;
5461 66508601 blueswir1
#endif
5462 2b8f2d41 balrog
#ifdef TARGET_ARM
5463 2b8f2d41 balrog
            case QEMU_OPTION_old_param:
5464 2b8f2d41 balrog
                old_param = 1;
5465 05ebd537 ths
                break;
5466 2b8f2d41 balrog
#endif
5467 f3dcfada ths
            case QEMU_OPTION_clock:
5468 f3dcfada ths
                configure_alarms(optarg);
5469 f3dcfada ths
                break;
5470 7e0af5d0 bellard
            case QEMU_OPTION_startdate:
5471 1ed2fc1f Jan Kiszka
                configure_rtc_date_offset(optarg, 1);
5472 1ed2fc1f Jan Kiszka
                break;
5473 1ed2fc1f Jan Kiszka
            case QEMU_OPTION_rtc:
5474 1ed2fc1f Jan Kiszka
                opts = qemu_opts_parse(&qemu_rtc_opts, optarg, NULL);
5475 1ed2fc1f Jan Kiszka
                if (!opts) {
5476 1ed2fc1f Jan Kiszka
                    fprintf(stderr, "parse error: %s\n", optarg);
5477 1ed2fc1f Jan Kiszka
                    exit(1);
5478 7e0af5d0 bellard
                }
5479 1ed2fc1f Jan Kiszka
                configure_rtc(opts);
5480 7e0af5d0 bellard
                break;
5481 26a5f13b bellard
            case QEMU_OPTION_tb_size:
5482 26a5f13b bellard
                tb_size = strtol(optarg, NULL, 0);
5483 26a5f13b bellard
                if (tb_size < 0)
5484 26a5f13b bellard
                    tb_size = 0;
5485 26a5f13b bellard
                break;
5486 2e70f6ef pbrook
            case QEMU_OPTION_icount:
5487 2e70f6ef pbrook
                use_icount = 1;
5488 2e70f6ef pbrook
                if (strcmp(optarg, "auto") == 0) {
5489 2e70f6ef pbrook
                    icount_time_shift = -1;
5490 2e70f6ef pbrook
                } else {
5491 2e70f6ef pbrook
                    icount_time_shift = strtol(optarg, NULL, 0);
5492 2e70f6ef pbrook
                }
5493 2e70f6ef pbrook
                break;
5494 5bb7910a aliguori
            case QEMU_OPTION_incoming:
5495 5bb7910a aliguori
                incoming = optarg;
5496 5bb7910a aliguori
                break;
5497 5824d651 blueswir1
#ifndef _WIN32
5498 0858532e aliguori
            case QEMU_OPTION_chroot:
5499 0858532e aliguori
                chroot_dir = optarg;
5500 0858532e aliguori
                break;
5501 0858532e aliguori
            case QEMU_OPTION_runas:
5502 0858532e aliguori
                run_as = optarg;
5503 0858532e aliguori
                break;
5504 5824d651 blueswir1
#endif
5505 e37630ca aliguori
#ifdef CONFIG_XEN
5506 e37630ca aliguori
            case QEMU_OPTION_xen_domid:
5507 e37630ca aliguori
                xen_domid = atoi(optarg);
5508 e37630ca aliguori
                break;
5509 e37630ca aliguori
            case QEMU_OPTION_xen_create:
5510 e37630ca aliguori
                xen_mode = XEN_CREATE;
5511 e37630ca aliguori
                break;
5512 e37630ca aliguori
            case QEMU_OPTION_xen_attach:
5513 e37630ca aliguori
                xen_mode = XEN_ATTACH;
5514 e37630ca aliguori
                break;
5515 e37630ca aliguori
#endif
5516 cd6f1169 bellard
            }
5517 0824d6fc bellard
        }
5518 0824d6fc bellard
    }
5519 330d0414 bellard
5520 5cea8590 Paul Brook
    /* If no data_dir is specified then try to find it relative to the
5521 5cea8590 Paul Brook
       executable path.  */
5522 5cea8590 Paul Brook
    if (!data_dir) {
5523 5cea8590 Paul Brook
        data_dir = find_datadir(argv[0]);
5524 5cea8590 Paul Brook
    }
5525 5cea8590 Paul Brook
    /* If all else fails use the install patch specified when building.  */
5526 5cea8590 Paul Brook
    if (!data_dir) {
5527 5cea8590 Paul Brook
        data_dir = CONFIG_QEMU_SHAREDIR;
5528 5cea8590 Paul Brook
    }
5529 5cea8590 Paul Brook
5530 6be68d7e Jes Sorensen
    /*
5531 6be68d7e Jes Sorensen
     * Default to max_cpus = smp_cpus, in case the user doesn't
5532 6be68d7e Jes Sorensen
     * specify a max_cpus value.
5533 6be68d7e Jes Sorensen
     */
5534 6be68d7e Jes Sorensen
    if (!max_cpus)
5535 6be68d7e Jes Sorensen
        max_cpus = smp_cpus;
5536 6be68d7e Jes Sorensen
5537 3d878caa balrog
    machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
5538 b2097003 aliguori
    if (smp_cpus > machine->max_cpus) {
5539 b2097003 aliguori
        fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
5540 b2097003 aliguori
                "supported by machine `%s' (%d)\n", smp_cpus,  machine->name,
5541 b2097003 aliguori
                machine->max_cpus);
5542 b2097003 aliguori
        exit(1);
5543 b2097003 aliguori
    }
5544 b2097003 aliguori
5545 993fbfdb Anthony Liguori
    if (display_type == DT_NOGRAPHIC) {
5546 bc0129d9 aliguori
       if (serial_device_index == 0)
5547 bc0129d9 aliguori
           serial_devices[0] = "stdio";
5548 bc0129d9 aliguori
       if (parallel_device_index == 0)
5549 bc0129d9 aliguori
           parallel_devices[0] = "null";
5550 ddd9bbd9 Jan Kiszka
       if (strncmp(monitor_devices[0], "vc", 2) == 0) {
5551 ddd9bbd9 Jan Kiszka
           monitor_devices[0] = "stdio";
5552 ddd9bbd9 Jan Kiszka
       }
5553 bc0129d9 aliguori
    }
5554 bc0129d9 aliguori
5555 71e3ceb8 ths
#ifndef _WIN32
5556 71e3ceb8 ths
    if (daemonize) {
5557 71e3ceb8 ths
        pid_t pid;
5558 71e3ceb8 ths
5559 71e3ceb8 ths
        if (pipe(fds) == -1)
5560 71e3ceb8 ths
            exit(1);
5561 71e3ceb8 ths
5562 71e3ceb8 ths
        pid = fork();
5563 71e3ceb8 ths
        if (pid > 0) {
5564 71e3ceb8 ths
            uint8_t status;
5565 71e3ceb8 ths
            ssize_t len;
5566 71e3ceb8 ths
5567 71e3ceb8 ths
            close(fds[1]);
5568 71e3ceb8 ths
5569 71e3ceb8 ths
        again:
5570 93815bc2 ths
            len = read(fds[0], &status, 1);
5571 93815bc2 ths
            if (len == -1 && (errno == EINTR))
5572 93815bc2 ths
                goto again;
5573 93815bc2 ths
5574 93815bc2 ths
            if (len != 1)
5575 93815bc2 ths
                exit(1);
5576 93815bc2 ths
            else if (status == 1) {
5577 850810d0 Justin M. Forbes
                fprintf(stderr, "Could not acquire pidfile: %s\n", strerror(errno));
5578 93815bc2 ths
                exit(1);
5579 93815bc2 ths
            } else
5580 93815bc2 ths
                exit(0);
5581 71e3ceb8 ths
        } else if (pid < 0)
5582 93815bc2 ths
            exit(1);
5583 71e3ceb8 ths
5584 71e3ceb8 ths
        setsid();
5585 71e3ceb8 ths
5586 71e3ceb8 ths
        pid = fork();
5587 71e3ceb8 ths
        if (pid > 0)
5588 71e3ceb8 ths
            exit(0);
5589 71e3ceb8 ths
        else if (pid < 0)
5590 71e3ceb8 ths
            exit(1);
5591 71e3ceb8 ths
5592 71e3ceb8 ths
        umask(027);
5593 71e3ceb8 ths
5594 71e3ceb8 ths
        signal(SIGTSTP, SIG_IGN);
5595 71e3ceb8 ths
        signal(SIGTTOU, SIG_IGN);
5596 71e3ceb8 ths
        signal(SIGTTIN, SIG_IGN);
5597 71e3ceb8 ths
    }
5598 71e3ceb8 ths
5599 aa26bb2d ths
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
5600 93815bc2 ths
        if (daemonize) {
5601 93815bc2 ths
            uint8_t status = 1;
5602 93815bc2 ths
            write(fds[1], &status, 1);
5603 93815bc2 ths
        } else
5604 850810d0 Justin M. Forbes
            fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno));
5605 93815bc2 ths
        exit(1);
5606 93815bc2 ths
    }
5607 b9e82a59 blueswir1
#endif
5608 93815bc2 ths
5609 214910a7 Marcelo Tosatti
    if (kvm_enabled()) {
5610 214910a7 Marcelo Tosatti
        int ret;
5611 214910a7 Marcelo Tosatti
5612 214910a7 Marcelo Tosatti
        ret = kvm_init(smp_cpus);
5613 214910a7 Marcelo Tosatti
        if (ret < 0) {
5614 214910a7 Marcelo Tosatti
            fprintf(stderr, "failed to initialize KVM\n");
5615 214910a7 Marcelo Tosatti
            exit(1);
5616 214910a7 Marcelo Tosatti
        }
5617 214910a7 Marcelo Tosatti
    }
5618 214910a7 Marcelo Tosatti
5619 3fcf7b6b aliguori
    if (qemu_init_main_loop()) {
5620 3fcf7b6b aliguori
        fprintf(stderr, "qemu_init_main_loop failed\n");
5621 3fcf7b6b aliguori
        exit(1);
5622 3fcf7b6b aliguori
    }
5623 a20dd508 bellard
    linux_boot = (kernel_filename != NULL);
5624 6c41b272 balrog
5625 f8d39c01 ths
    if (!linux_boot && *kernel_cmdline != '\0') {
5626 f8d39c01 ths
        fprintf(stderr, "-append only allowed with -kernel option\n");
5627 f8d39c01 ths
        exit(1);
5628 f8d39c01 ths
    }
5629 f8d39c01 ths
5630 f8d39c01 ths
    if (!linux_boot && initrd_filename != NULL) {
5631 f8d39c01 ths
        fprintf(stderr, "-initrd only allowed with -kernel option\n");
5632 f8d39c01 ths
        exit(1);
5633 f8d39c01 ths
    }
5634 f8d39c01 ths
5635 bf65f53f Filip Navara
#ifndef _WIN32
5636 bf65f53f Filip Navara
    /* Win32 doesn't support line-buffering and requires size >= 2 */
5637 b118d61e bellard
    setvbuf(stdout, NULL, _IOLBF, 0);
5638 bf65f53f Filip Navara
#endif
5639 3b46e624 ths
5640 7183b4b4 aliguori
    if (init_timer_alarm() < 0) {
5641 7183b4b4 aliguori
        fprintf(stderr, "could not initialize alarm timer\n");
5642 7183b4b4 aliguori
        exit(1);
5643 7183b4b4 aliguori
    }
5644 2e70f6ef pbrook
    if (use_icount && icount_time_shift < 0) {
5645 2e70f6ef pbrook
        use_icount = 2;
5646 2e70f6ef pbrook
        /* 125MIPS seems a reasonable initial guess at the guest speed.
5647 2e70f6ef pbrook
           It will be corrected fairly quickly anyway.  */
5648 2e70f6ef pbrook
        icount_time_shift = 3;
5649 2e70f6ef pbrook
        init_icount_adjust();
5650 2e70f6ef pbrook
    }
5651 634fce96 pbrook
5652 fd1dff4b bellard
#ifdef _WIN32
5653 fd1dff4b bellard
    socket_init();
5654 fd1dff4b bellard
#endif
5655 fd1dff4b bellard
5656 dc1c9fe8 Mark McLoughlin
    if (net_init_clients() < 0) {
5657 dc1c9fe8 Mark McLoughlin
        exit(1);
5658 702c651c bellard
    }
5659 f1510b2c bellard
5660 406c8df3 Glauber Costa
    net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
5661 406c8df3 Glauber Costa
    net_set_boot_mask(net_boot);
5662 406c8df3 Glauber Costa
5663 dc72ac14 balrog
    /* init the bluetooth world */
5664 bd3c948d Gerd Hoffmann
    if (foreach_device_config(DEV_BT, bt_parse))
5665 bd3c948d Gerd Hoffmann
        exit(1);
5666 dc72ac14 balrog
5667 0824d6fc bellard
    /* init the memory */
5668 94a6b54f pbrook
    if (ram_size == 0)
5669 94a6b54f pbrook
        ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
5670 9ae02555 ths
5671 26a5f13b bellard
    /* init the dynamic translator */
5672 26a5f13b bellard
    cpu_exec_init_all(tb_size * 1024 * 1024);
5673 26a5f13b bellard
5674 5905b2e5 bellard
    bdrv_init();
5675 c4b1fcc0 bellard
5676 e4bcb14c ths
    /* we always create the cdrom drive, even if no disk is there */
5677 3b0ba927 Gerd Hoffmann
    drive_add(NULL, CDROM_ALIAS);
5678 c4b1fcc0 bellard
5679 9d413d1d balrog
    /* we always create at least one floppy */
5680 3b0ba927 Gerd Hoffmann
    drive_add(NULL, FD_ALIAS, 0);
5681 86f55663 j_mayer
5682 9d413d1d balrog
    /* we always create one sd slot, even if no card is in it */
5683 3b0ba927 Gerd Hoffmann
    drive_add(NULL, SD_ALIAS);
5684 9d413d1d balrog
5685 e4bcb14c ths
    /* open the virtual block devices */
5686 9dfd7c7a Gerd Hoffmann
    if (snapshot)
5687 7282a033 Gerd Hoffmann
        qemu_opts_foreach(&qemu_drive_opts, drive_enable_snapshot, NULL, 0);
5688 7282a033 Gerd Hoffmann
    if (qemu_opts_foreach(&qemu_drive_opts, drive_init_func, machine, 1) != 0)
5689 9dfd7c7a Gerd Hoffmann
        exit(1);
5690 3e3d5815 balrog
5691 2faf58cd Juan Quintela
    vmstate_register(0, &vmstate_timers ,&timers_state);
5692 475e4277 aliguori
    register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
5693 8a7ddc38 bellard
5694 3023f332 aliguori
    /* Maintain compatibility with multiple stdio monitors */
5695 ddd9bbd9 Jan Kiszka
    if (!strcmp(monitor_devices[0],"stdio")) {
5696 3023f332 aliguori
        for (i = 0; i < MAX_SERIAL_PORTS; i++) {
5697 3023f332 aliguori
            const char *devname = serial_devices[i];
5698 3023f332 aliguori
            if (devname && !strcmp(devname,"mon:stdio")) {
5699 ddd9bbd9 Jan Kiszka
                monitor_devices[0] = NULL;
5700 3023f332 aliguori
                break;
5701 3023f332 aliguori
            } else if (devname && !strcmp(devname,"stdio")) {
5702 ddd9bbd9 Jan Kiszka
                monitor_devices[0] = NULL;
5703 3023f332 aliguori
                serial_devices[i] = "mon:stdio";
5704 3023f332 aliguori
                break;
5705 3023f332 aliguori
            }
5706 3023f332 aliguori
        }
5707 3023f332 aliguori
    }
5708 3023f332 aliguori
5709 268a362c aliguori
    if (nb_numa_nodes > 0) {
5710 268a362c aliguori
        int i;
5711 268a362c aliguori
5712 268a362c aliguori
        if (nb_numa_nodes > smp_cpus) {
5713 268a362c aliguori
            nb_numa_nodes = smp_cpus;
5714 268a362c aliguori
        }
5715 268a362c aliguori
5716 268a362c aliguori
        /* If no memory size if given for any node, assume the default case
5717 268a362c aliguori
         * and distribute the available memory equally across all nodes
5718 268a362c aliguori
         */
5719 268a362c aliguori
        for (i = 0; i < nb_numa_nodes; i++) {
5720 268a362c aliguori
            if (node_mem[i] != 0)
5721 268a362c aliguori
                break;
5722 268a362c aliguori
        }
5723 268a362c aliguori
        if (i == nb_numa_nodes) {
5724 268a362c aliguori
            uint64_t usedmem = 0;
5725 268a362c aliguori
5726 268a362c aliguori
            /* On Linux, the each node's border has to be 8MB aligned,
5727 268a362c aliguori
             * the final node gets the rest.
5728 268a362c aliguori
             */
5729 268a362c aliguori
            for (i = 0; i < nb_numa_nodes - 1; i++) {
5730 268a362c aliguori
                node_mem[i] = (ram_size / nb_numa_nodes) & ~((1 << 23UL) - 1);
5731 268a362c aliguori
                usedmem += node_mem[i];
5732 268a362c aliguori
            }
5733 268a362c aliguori
            node_mem[i] = ram_size - usedmem;
5734 268a362c aliguori
        }
5735 268a362c aliguori
5736 268a362c aliguori
        for (i = 0; i < nb_numa_nodes; i++) {
5737 268a362c aliguori
            if (node_cpumask[i] != 0)
5738 268a362c aliguori
                break;
5739 268a362c aliguori
        }
5740 268a362c aliguori
        /* assigning the VCPUs round-robin is easier to implement, guest OSes
5741 268a362c aliguori
         * must cope with this anyway, because there are BIOSes out there in
5742 268a362c aliguori
         * real machines which also use this scheme.
5743 268a362c aliguori
         */
5744 268a362c aliguori
        if (i == nb_numa_nodes) {
5745 268a362c aliguori
            for (i = 0; i < smp_cpus; i++) {
5746 268a362c aliguori
                node_cpumask[i % nb_numa_nodes] |= 1 << i;
5747 268a362c aliguori
            }
5748 268a362c aliguori
        }
5749 268a362c aliguori
    }
5750 268a362c aliguori
5751 ddd9bbd9 Jan Kiszka
    for (i = 0; i < MAX_MONITOR_DEVICES; i++) {
5752 ddd9bbd9 Jan Kiszka
        const char *devname = monitor_devices[i];
5753 ddd9bbd9 Jan Kiszka
        if (devname && strcmp(devname, "none")) {
5754 ddd9bbd9 Jan Kiszka
            char label[32];
5755 ddd9bbd9 Jan Kiszka
            if (i == 0) {
5756 ddd9bbd9 Jan Kiszka
                snprintf(label, sizeof(label), "monitor");
5757 ddd9bbd9 Jan Kiszka
            } else {
5758 ddd9bbd9 Jan Kiszka
                snprintf(label, sizeof(label), "monitor%d", i);
5759 ddd9bbd9 Jan Kiszka
            }
5760 ddd9bbd9 Jan Kiszka
            monitor_hds[i] = qemu_chr_open(label, devname, NULL);
5761 ddd9bbd9 Jan Kiszka
            if (!monitor_hds[i]) {
5762 ddd9bbd9 Jan Kiszka
                fprintf(stderr, "qemu: could not open monitor device '%s'\n",
5763 ddd9bbd9 Jan Kiszka
                        devname);
5764 ddd9bbd9 Jan Kiszka
                exit(1);
5765 ddd9bbd9 Jan Kiszka
            }
5766 4c621805 aliguori
        }
5767 4c621805 aliguori
    }
5768 4c621805 aliguori
5769 2796dae0 aliguori
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5770 2796dae0 aliguori
        const char *devname = serial_devices[i];
5771 2796dae0 aliguori
        if (devname && strcmp(devname, "none")) {
5772 324a8021 Aurelien Jarno
            char label[32];
5773 324a8021 Aurelien Jarno
            snprintf(label, sizeof(label), "serial%d", i);
5774 ceecf1d1 aurel32
            serial_hds[i] = qemu_chr_open(label, devname, NULL);
5775 324a8021 Aurelien Jarno
            if (!serial_hds[i]) {
5776 850810d0 Justin M. Forbes
                fprintf(stderr, "qemu: could not open serial device '%s': %s\n",
5777 850810d0 Justin M. Forbes
                        devname, strerror(errno));
5778 324a8021 Aurelien Jarno
                exit(1);
5779 324a8021 Aurelien Jarno
            }
5780 2796dae0 aliguori
        }
5781 2796dae0 aliguori
    }
5782 2796dae0 aliguori
5783 2796dae0 aliguori
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5784 2796dae0 aliguori
        const char *devname = parallel_devices[i];
5785 2796dae0 aliguori
        if (devname && strcmp(devname, "none")) {
5786 2796dae0 aliguori
            char label[32];
5787 2796dae0 aliguori
            snprintf(label, sizeof(label), "parallel%d", i);
5788 ceecf1d1 aurel32
            parallel_hds[i] = qemu_chr_open(label, devname, NULL);
5789 2796dae0 aliguori
            if (!parallel_hds[i]) {
5790 850810d0 Justin M. Forbes
                fprintf(stderr, "qemu: could not open parallel device '%s': %s\n",
5791 850810d0 Justin M. Forbes
                        devname, strerror(errno));
5792 2796dae0 aliguori
                exit(1);
5793 2796dae0 aliguori
            }
5794 2796dae0 aliguori
        }
5795 2796dae0 aliguori
    }
5796 2796dae0 aliguori
5797 2796dae0 aliguori
    for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5798 2796dae0 aliguori
        const char *devname = virtio_consoles[i];
5799 2796dae0 aliguori
        if (devname && strcmp(devname, "none")) {
5800 2796dae0 aliguori
            char label[32];
5801 2796dae0 aliguori
            snprintf(label, sizeof(label), "virtcon%d", i);
5802 ceecf1d1 aurel32
            virtcon_hds[i] = qemu_chr_open(label, devname, NULL);
5803 2796dae0 aliguori
            if (!virtcon_hds[i]) {
5804 850810d0 Justin M. Forbes
                fprintf(stderr, "qemu: could not open virtio console '%s': %s\n",
5805 850810d0 Justin M. Forbes
                        devname, strerror(errno));
5806 2796dae0 aliguori
                exit(1);
5807 2796dae0 aliguori
            }
5808 2796dae0 aliguori
        }
5809 2796dae0 aliguori
    }
5810 2796dae0 aliguori
5811 aae9460e Paul Brook
    module_call_init(MODULE_INIT_DEVICE);
5812 aae9460e Paul Brook
5813 09aaa160 Markus Armbruster
    if (watchdog) {
5814 09aaa160 Markus Armbruster
        i = select_watchdog(watchdog);
5815 09aaa160 Markus Armbruster
        if (i > 0)
5816 09aaa160 Markus Armbruster
            exit (i == 1 ? 1 : 0);
5817 09aaa160 Markus Armbruster
    }
5818 09aaa160 Markus Armbruster
5819 b6b61144 Gerd Hoffmann
    if (machine->compat_props) {
5820 b6b61144 Gerd Hoffmann
        qdev_prop_register_compat(machine->compat_props);
5821 b6b61144 Gerd Hoffmann
    }
5822 fbe1b595 Paul Brook
    machine->init(ram_size, boot_devices,
5823 3023f332 aliguori
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
5824 3023f332 aliguori
5825 268a362c aliguori
5826 67b3b71d Juan Quintela
#ifndef _WIN32
5827 67b3b71d Juan Quintela
    /* must be after terminal init, SDL library changes signal handlers */
5828 67b3b71d Juan Quintela
    sighandler_setup();
5829 67b3b71d Juan Quintela
#endif
5830 67b3b71d Juan Quintela
5831 268a362c aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
5832 268a362c aliguori
        for (i = 0; i < nb_numa_nodes; i++) {
5833 268a362c aliguori
            if (node_cpumask[i] & (1 << env->cpu_index)) {
5834 268a362c aliguori
                env->numa_node = i;
5835 268a362c aliguori
            }
5836 268a362c aliguori
        }
5837 268a362c aliguori
    }
5838 268a362c aliguori
5839 6f338c34 aliguori
    current_machine = machine;
5840 6f338c34 aliguori
5841 3023f332 aliguori
    /* init USB devices */
5842 3023f332 aliguori
    if (usb_enabled) {
5843 0752706d Markus Armbruster
        if (foreach_device_config(DEV_USB, usb_parse) < 0)
5844 0752706d Markus Armbruster
            exit(1);
5845 3023f332 aliguori
    }
5846 3023f332 aliguori
5847 bd3c948d Gerd Hoffmann
    /* init generic devices */
5848 f31d07d1 Gerd Hoffmann
    if (qemu_opts_foreach(&qemu_device_opts, device_init_func, NULL, 1) != 0)
5849 bd3c948d Gerd Hoffmann
        exit(1);
5850 bd3c948d Gerd Hoffmann
5851 8f391ab4 aliguori
    if (!display_state)
5852 8f391ab4 aliguori
        dumb_display_init();
5853 3023f332 aliguori
    /* just use the first displaystate for the moment */
5854 3023f332 aliguori
    ds = display_state;
5855 993fbfdb Anthony Liguori
5856 993fbfdb Anthony Liguori
    if (display_type == DT_DEFAULT) {
5857 993fbfdb Anthony Liguori
#if defined(CONFIG_SDL) || defined(CONFIG_COCOA)
5858 993fbfdb Anthony Liguori
        display_type = DT_SDL;
5859 993fbfdb Anthony Liguori
#else
5860 993fbfdb Anthony Liguori
        display_type = DT_VNC;
5861 993fbfdb Anthony Liguori
        vnc_display = "localhost:0,to=99";
5862 993fbfdb Anthony Liguori
        show_vnc_port = 1;
5863 993fbfdb Anthony Liguori
#endif
5864 993fbfdb Anthony Liguori
    }
5865 993fbfdb Anthony Liguori
        
5866 993fbfdb Anthony Liguori
5867 993fbfdb Anthony Liguori
    switch (display_type) {
5868 993fbfdb Anthony Liguori
    case DT_NOGRAPHIC:
5869 993fbfdb Anthony Liguori
        break;
5870 4d3b6f6e balrog
#if defined(CONFIG_CURSES)
5871 993fbfdb Anthony Liguori
    case DT_CURSES:
5872 993fbfdb Anthony Liguori
        curses_display_init(ds, full_screen);
5873 993fbfdb Anthony Liguori
        break;
5874 4d3b6f6e balrog
#endif
5875 5b0753e0 bellard
#if defined(CONFIG_SDL)
5876 993fbfdb Anthony Liguori
    case DT_SDL:
5877 993fbfdb Anthony Liguori
        sdl_display_init(ds, full_screen, no_frame);
5878 993fbfdb Anthony Liguori
        break;
5879 5b0753e0 bellard
#elif defined(CONFIG_COCOA)
5880 993fbfdb Anthony Liguori
    case DT_SDL:
5881 993fbfdb Anthony Liguori
        cocoa_display_init(ds, full_screen);
5882 993fbfdb Anthony Liguori
        break;
5883 313aa567 bellard
#endif
5884 993fbfdb Anthony Liguori
    case DT_VNC:
5885 993fbfdb Anthony Liguori
        vnc_display_init(ds);
5886 993fbfdb Anthony Liguori
        if (vnc_display_open(ds, vnc_display) < 0)
5887 993fbfdb Anthony Liguori
            exit(1);
5888 f92f8afe Anthony Liguori
5889 993fbfdb Anthony Liguori
        if (show_vnc_port) {
5890 993fbfdb Anthony Liguori
            printf("VNC server running on `%s'\n", vnc_display_local_addr(ds));
5891 f92f8afe Anthony Liguori
        }
5892 993fbfdb Anthony Liguori
        break;
5893 993fbfdb Anthony Liguori
    default:
5894 993fbfdb Anthony Liguori
        break;
5895 313aa567 bellard
    }
5896 7d957bd8 aliguori
    dpy_resize(ds);
5897 5b08fc10 aliguori
5898 3023f332 aliguori
    dcl = ds->listeners;
5899 3023f332 aliguori
    while (dcl != NULL) {
5900 3023f332 aliguori
        if (dcl->dpy_refresh != NULL) {
5901 3023f332 aliguori
            ds->gui_timer = qemu_new_timer(rt_clock, gui_update, ds);
5902 3023f332 aliguori
            qemu_mod_timer(ds->gui_timer, qemu_get_clock(rt_clock));
5903 20d8a3ed ths
        }
5904 3023f332 aliguori
        dcl = dcl->next;
5905 20d8a3ed ths
    }
5906 3023f332 aliguori
5907 993fbfdb Anthony Liguori
    if (display_type == DT_NOGRAPHIC || display_type == DT_VNC) {
5908 9043b62d blueswir1
        nographic_timer = qemu_new_timer(rt_clock, nographic_update, NULL);
5909 9043b62d blueswir1
        qemu_mod_timer(nographic_timer, qemu_get_clock(rt_clock));
5910 9043b62d blueswir1
    }
5911 9043b62d blueswir1
5912 2796dae0 aliguori
    text_consoles_set_display(display_state);
5913 2970a6c9 aliguori
    qemu_chr_initial_reset();
5914 2796dae0 aliguori
5915 ddd9bbd9 Jan Kiszka
    for (i = 0; i < MAX_MONITOR_DEVICES; i++) {
5916 ddd9bbd9 Jan Kiszka
        if (monitor_devices[i] && monitor_hds[i]) {
5917 ddd9bbd9 Jan Kiszka
            monitor_init(monitor_hds[i],
5918 ddd9bbd9 Jan Kiszka
                         MONITOR_USE_READLINE |
5919 ddd9bbd9 Jan Kiszka
                         ((i == 0) ? MONITOR_IS_DEFAULT : 0));
5920 ddd9bbd9 Jan Kiszka
        }
5921 ddd9bbd9 Jan Kiszka
    }
5922 82c643ff bellard
5923 8d11df9e bellard
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5924 c03b0f0f bellard
        const char *devname = serial_devices[i];
5925 fd5f393a pbrook
        if (devname && strcmp(devname, "none")) {
5926 af3a9031 ths
            if (strstart(devname, "vc", 0))
5927 7ba1260a bellard
                qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
5928 8d11df9e bellard
        }
5929 82c643ff bellard
    }
5930 82c643ff bellard
5931 6508fe59 bellard
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5932 c03b0f0f bellard
        const char *devname = parallel_devices[i];
5933 fd5f393a pbrook
        if (devname && strcmp(devname, "none")) {
5934 af3a9031 ths
            if (strstart(devname, "vc", 0))
5935 7ba1260a bellard
                qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
5936 6508fe59 bellard
        }
5937 6508fe59 bellard
    }
5938 6508fe59 bellard
5939 9ede2fde aliguori
    for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5940 9ede2fde aliguori
        const char *devname = virtio_consoles[i];
5941 2796dae0 aliguori
        if (virtcon_hds[i] && devname) {
5942 9ede2fde aliguori
            if (strstart(devname, "vc", 0))
5943 9ede2fde aliguori
                qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i);
5944 9ede2fde aliguori
        }
5945 9ede2fde aliguori
    }
5946 9ede2fde aliguori
5947 59030a8c aliguori
    if (gdbstub_dev && gdbserver_start(gdbstub_dev) < 0) {
5948 59030a8c aliguori
        fprintf(stderr, "qemu: could not open gdbserver on device '%s'\n",
5949 59030a8c aliguori
                gdbstub_dev);
5950 59030a8c aliguori
        exit(1);
5951 45669e00 balrog
    }
5952 45669e00 balrog
5953 3418bd25 Gerd Hoffmann
    qdev_machine_creation_done();
5954 3418bd25 Gerd Hoffmann
5955 45a50b16 Gerd Hoffmann
    rom_load_all();
5956 45a50b16 Gerd Hoffmann
5957 05f2401e Juan Quintela
    if (loadvm) {
5958 05f2401e Juan Quintela
        if (load_vmstate(cur_mon, loadvm) < 0) {
5959 05f2401e Juan Quintela
            autostart = 0;
5960 05f2401e Juan Quintela
        }
5961 05f2401e Juan Quintela
    }
5962 d63d307f bellard
5963 2bb8c10c Glauber Costa
    if (incoming) {
5964 5bb7910a aliguori
        qemu_start_incoming_migration(incoming);
5965 6b99dadc Avi Kivity
    } else if (autostart) {
5966 c0f4ce77 aliguori
        vm_start();
5967 6b99dadc Avi Kivity
    }
5968 ffd843bc ths
5969 b9e82a59 blueswir1
#ifndef _WIN32
5970 71e3ceb8 ths
    if (daemonize) {
5971 71e3ceb8 ths
        uint8_t status = 0;
5972 71e3ceb8 ths
        ssize_t len;
5973 71e3ceb8 ths
5974 71e3ceb8 ths
    again1:
5975 71e3ceb8 ths
        len = write(fds[1], &status, 1);
5976 71e3ceb8 ths
        if (len == -1 && (errno == EINTR))
5977 71e3ceb8 ths
            goto again1;
5978 71e3ceb8 ths
5979 71e3ceb8 ths
        if (len != 1)
5980 71e3ceb8 ths
            exit(1);
5981 71e3ceb8 ths
5982 bd54b863 aliguori
        chdir("/");
5983 aeb30be6 balrog
        TFR(fd = open("/dev/null", O_RDWR));
5984 71e3ceb8 ths
        if (fd == -1)
5985 71e3ceb8 ths
            exit(1);
5986 0858532e aliguori
    }
5987 71e3ceb8 ths
5988 0858532e aliguori
    if (run_as) {
5989 0858532e aliguori
        pwd = getpwnam(run_as);
5990 0858532e aliguori
        if (!pwd) {
5991 0858532e aliguori
            fprintf(stderr, "User \"%s\" doesn't exist\n", run_as);
5992 0858532e aliguori
            exit(1);
5993 0858532e aliguori
        }
5994 0858532e aliguori
    }
5995 0858532e aliguori
5996 0858532e aliguori
    if (chroot_dir) {
5997 0858532e aliguori
        if (chroot(chroot_dir) < 0) {
5998 0858532e aliguori
            fprintf(stderr, "chroot failed\n");
5999 0858532e aliguori
            exit(1);
6000 0858532e aliguori
        }
6001 0858532e aliguori
        chdir("/");
6002 0858532e aliguori
    }
6003 0858532e aliguori
6004 0858532e aliguori
    if (run_as) {
6005 0858532e aliguori
        if (setgid(pwd->pw_gid) < 0) {
6006 0858532e aliguori
            fprintf(stderr, "Failed to setgid(%d)\n", pwd->pw_gid);
6007 0858532e aliguori
            exit(1);
6008 0858532e aliguori
        }
6009 0858532e aliguori
        if (setuid(pwd->pw_uid) < 0) {
6010 0858532e aliguori
            fprintf(stderr, "Failed to setuid(%d)\n", pwd->pw_uid);
6011 0858532e aliguori
            exit(1);
6012 0858532e aliguori
        }
6013 0858532e aliguori
        if (setuid(0) != -1) {
6014 0858532e aliguori
            fprintf(stderr, "Dropping privileges failed\n");
6015 0858532e aliguori
            exit(1);
6016 0858532e aliguori
        }
6017 0858532e aliguori
    }
6018 0858532e aliguori
6019 0858532e aliguori
    if (daemonize) {
6020 0858532e aliguori
        dup2(fd, 0);
6021 0858532e aliguori
        dup2(fd, 1);
6022 0858532e aliguori
        dup2(fd, 2);
6023 71e3ceb8 ths
6024 0858532e aliguori
        close(fd);
6025 71e3ceb8 ths
    }
6026 b9e82a59 blueswir1
#endif
6027 71e3ceb8 ths
6028 8a7ddc38 bellard
    main_loop();
6029 40c3bac3 bellard
    quit_timers();
6030 63a01ef8 aliguori
    net_cleanup();
6031 b46a8906 ths
6032 0824d6fc bellard
    return 0;
6033 0824d6fc bellard
}