blob: a89428573bc0fcaf33f54def45e45373855faea6 [file] [log] [blame]
bellard0824d6f2003-06-24 13:42:40 +00001/*
bellard80cabfa2004-03-14 12:20:30 +00002 * QEMU System Emulator
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard68d0f702008-01-06 17:21:48 +00004 * Copyright (c) 2003-2008 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellard1df912c2003-06-25 16:20:35 +00006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
bellard0824d6f2003-06-24 13:42:40 +000023 */
bellard0824d6f2003-06-24 13:42:40 +000024#include <unistd.h>
bellard0824d6f2003-06-24 13:42:40 +000025#include <fcntl.h>
26#include <signal.h>
27#include <time.h>
bellard0824d6f2003-06-24 13:42:40 +000028#include <errno.h>
bellard67b915a2004-03-31 23:37:16 +000029#include <sys/time.h>
bellardc88676f2006-08-06 13:36:11 +000030#include <zlib.h>
bellard67b915a2004-03-31 23:37:16 +000031
Juan Quintela71e72a12009-07-27 16:12:56 +020032/* Needed early for CONFIG_BSD etc. */
blueswir1d40cdb12009-03-07 16:52:02 +000033#include "config-host.h"
Blue Swirl96555a92009-07-17 11:01:45 +000034/* Needed early to override system queue definitions on BSD */
35#include "sys-queue.h"
blueswir1d40cdb12009-03-07 16:52:02 +000036
bellard67b915a2004-03-31 23:37:16 +000037#ifndef _WIN32
Paul Brook5cea8592009-05-30 00:52:44 +010038#include <libgen.h>
aliguori08585322009-02-27 22:09:45 +000039#include <pwd.h>
bellard67b915a2004-03-31 23:37:16 +000040#include <sys/times.h>
bellardf1510b22003-06-25 00:07:40 +000041#include <sys/wait.h>
bellard67b915a2004-03-31 23:37:16 +000042#include <termios.h>
bellard67b915a2004-03-31 23:37:16 +000043#include <sys/mman.h>
bellardf1510b22003-06-25 00:07:40 +000044#include <sys/ioctl.h>
blueswir124646c72008-11-07 16:55:48 +000045#include <sys/resource.h>
bellardf1510b22003-06-25 00:07:40 +000046#include <sys/socket.h>
bellardc94c8d62004-09-13 21:37:34 +000047#include <netinet/in.h>
blueswir124646c72008-11-07 16:55:48 +000048#include <net/if.h>
49#if defined(__NetBSD__)
50#include <net/if_tap.h>
51#endif
52#ifdef __linux__
53#include <linux/if_tun.h>
54#endif
55#include <arpa/inet.h>
bellard9d728e82004-09-05 23:09:03 +000056#include <dirent.h>
bellard7c9d8e02005-11-15 22:16:05 +000057#include <netdb.h>
thscb4b9762007-09-13 12:39:35 +000058#include <sys/select.h>
Juan Quintela71e72a12009-07-27 16:12:56 +020059#ifdef CONFIG_BSD
bellard7d3505c2004-05-12 19:32:15 +000060#include <sys/stat.h>
blueswir1c5e97232009-03-07 20:06:23 +000061#if defined(__FreeBSD__) || defined(__DragonFly__)
bellard7d3505c2004-05-12 19:32:15 +000062#include <libutil.h>
blueswir124646c72008-11-07 16:55:48 +000063#else
64#include <util.h>
blueswir1128ab2f2008-08-15 18:33:42 +000065#endif
ths5c40d2b2007-06-23 16:03:36 +000066#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
67#include <freebsd/stdlib.h>
bellard7d3505c2004-05-12 19:32:15 +000068#else
blueswir1223f0d72008-09-30 18:12:18 +000069#ifdef __linux__
bellard7d3505c2004-05-12 19:32:15 +000070#include <pty.h>
71#include <malloc.h>
bellardfd872592004-05-12 19:11:15 +000072#include <linux/rtc.h>
Andi Kleen18894652009-07-02 09:34:17 +020073#include <sys/prctl.h>
thsbd494f42007-09-16 20:03:23 +000074
75/* For the benefit of older linux systems which don't supply it,
76 we use a local copy of hpet.h. */
77/* #include <linux/hpet.h> */
78#include "hpet.h"
79
bellarde57a8c02005-11-10 23:58:52 +000080#include <linux/ppdev.h>
ths5867c882007-02-17 23:44:43 +000081#include <linux/parport.h>
blueswir1223f0d72008-09-30 18:12:18 +000082#endif
83#ifdef __sun__
thsd5d10bc2007-02-17 22:54:49 +000084#include <sys/stat.h>
85#include <sys/ethernet.h>
86#include <sys/sockio.h>
thsd5d10bc2007-02-17 22:54:49 +000087#include <netinet/arp.h>
88#include <netinet/in.h>
89#include <netinet/in_systm.h>
90#include <netinet/ip.h>
91#include <netinet/ip_icmp.h> // must come after ip.h
92#include <netinet/udp.h>
93#include <netinet/tcp.h>
94#include <net/if.h>
95#include <syslog.h>
96#include <stropts.h>
bellard67b915a2004-03-31 23:37:16 +000097#endif
bellard7d3505c2004-05-12 19:32:15 +000098#endif
bellardec530c82006-04-25 22:36:06 +000099#endif
bellard67b915a2004-03-31 23:37:16 +0000100
blueswir19892fbf2008-08-24 10:34:20 +0000101#if defined(__OpenBSD__)
102#include <util.h>
103#endif
104
ths8a16d272008-07-19 09:56:24 +0000105#if defined(CONFIG_VDE)
106#include <libvdeplug.h>
107#endif
108
bellard67b915a2004-03-31 23:37:16 +0000109#ifdef _WIN32
aliguori49dc7682009-03-08 16:26:59 +0000110#include <windows.h>
ths4fddf622007-12-17 04:42:29 +0000111#include <mmsystem.h>
bellard67b915a2004-03-31 23:37:16 +0000112#endif
113
bellard73332e52004-04-04 20:22:28 +0000114#ifdef CONFIG_SDL
Stefan Weil59a36a22009-06-18 20:11:03 +0200115#if defined(__APPLE__) || defined(main)
Stefan Weil66936652009-06-13 13:19:11 +0200116#include <SDL.h>
malc880fec52009-02-15 20:18:41 +0000117int qemu_main(int argc, char **argv, char **envp);
118int main(int argc, char **argv)
119{
Stefan Weil59a36a22009-06-18 20:11:03 +0200120 return qemu_main(argc, argv, NULL);
malc880fec52009-02-15 20:18:41 +0000121}
122#undef main
123#define main qemu_main
bellard96bcd4f2004-07-10 16:26:15 +0000124#endif
bellard73332e52004-04-04 20:22:28 +0000125#endif /* CONFIG_SDL */
bellard0824d6f2003-06-24 13:42:40 +0000126
bellard5b0753e2005-03-01 21:37:28 +0000127#ifdef CONFIG_COCOA
128#undef main
129#define main qemu_main
130#endif /* CONFIG_COCOA */
131
blueswir1511d2b12009-03-07 15:32:56 +0000132#include "hw/hw.h"
133#include "hw/boards.h"
134#include "hw/usb.h"
135#include "hw/pcmcia.h"
136#include "hw/pc.h"
137#include "hw/audiodev.h"
138#include "hw/isa.h"
139#include "hw/baum.h"
140#include "hw/bt.h"
Richard W.M. Jones9dd986c2009-04-25 13:56:19 +0100141#include "hw/watchdog.h"
aliguorib6f6e3d2009-04-17 18:59:56 +0000142#include "hw/smbios.h"
aliguorie37630c2009-04-22 15:19:10 +0000143#include "hw/xen.h"
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +0200144#include "hw/qdev.h"
aurel325ef4efa2009-03-10 21:43:35 +0000145#include "bt-host.h"
blueswir1511d2b12009-03-07 15:32:56 +0000146#include "net.h"
147#include "monitor.h"
148#include "console.h"
149#include "sysemu.h"
150#include "gdbstub.h"
151#include "qemu-timer.h"
152#include "qemu-char.h"
153#include "cache-utils.h"
154#include "block.h"
blueswir1a718ace2009-03-28 08:24:44 +0000155#include "dma.h"
blueswir1511d2b12009-03-07 15:32:56 +0000156#include "audio/audio.h"
157#include "migration.h"
158#include "kvm.h"
159#include "balloon.h"
Kevin Wolfd3f24362009-05-18 16:42:09 +0200160#include "qemu-option.h"
Gerd Hoffmann7282a032009-07-31 12:25:35 +0200161#include "qemu-config.h"
blueswir1511d2b12009-03-07 15:32:56 +0000162
bellard0824d6f2003-06-24 13:42:40 +0000163#include "disas.h"
bellardfc01f7e2003-06-30 10:03:06 +0000164
bellard8a7ddc32004-03-31 19:00:16 +0000165#include "exec-all.h"
bellard0824d6f2003-06-24 13:42:40 +0000166
blueswir1511d2b12009-03-07 15:32:56 +0000167#include "qemu_socket.h"
168
Jan Kiszkad918f232009-06-24 14:42:30 +0200169#include "slirp/libslirp.h"
blueswir1511d2b12009-03-07 15:32:56 +0000170
blueswir19dc63a12008-10-04 07:25:46 +0000171//#define DEBUG_NET
172//#define DEBUG_SLIRP
bellard330d0412003-07-26 18:11:40 +0000173
bellard1bfe8562004-07-08 21:17:50 +0000174#define DEFAULT_RAM_SIZE 128
bellard313aa562003-08-10 21:52:11 +0000175
Paul Brook5cea8592009-05-30 00:52:44 +0100176static const char *data_dir;
j_mayer1192dad2007-10-05 13:08:35 +0000177const char *bios_name = NULL;
thse4bcb142007-12-02 04:51:10 +0000178/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
bellardfaea38e2006-08-05 21:31:00 +0000179 to store the VM snapshots */
Gerd Hoffmann751c6a12009-07-22 16:42:57 +0200180struct drivelist drives = TAILQ_HEAD_INITIALIZER(drives);
Gerd Hoffmann3b0ba922009-07-22 16:42:59 +0200181struct driveoptlist driveopts = TAILQ_HEAD_INITIALIZER(driveopts);
malccb5a7aa2008-09-28 00:42:12 +0000182enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
aliguori3023f3322009-01-16 19:04:14 +0000183static DisplayState *display_state;
Anthony Liguori993fbfd2009-05-21 16:54:00 -0500184DisplayType display_type = DT_DEFAULT;
bellard3d11d0e2004-12-12 16:56:30 +0000185const char* keyboard_layout = NULL;
bellard313aa562003-08-10 21:52:11 +0000186int64_t ticks_per_sec;
aurel3200f82b82008-04-27 21:12:55 +0000187ram_addr_t ram_size;
bellardc4b1fcc2004-03-14 21:44:30 +0000188int nb_nics;
bellard7c9d8e02005-11-15 22:16:05 +0000189NICInfo nd_table[MAX_NICS];
bellard8a7ddc32004-03-31 19:00:16 +0000190int vm_running;
Paolo Bonzinid399f672009-07-27 23:17:51 +0200191int autostart;
balrogf6503052008-02-17 11:42:19 +0000192static int rtc_utc = 1;
193static int rtc_date_offset = -1; /* -1 means no change */
Zachary Amsden86176752009-07-30 00:15:02 -1000194int vga_interface_type = VGA_CIRRUS;
bellardd8272202005-04-06 20:32:23 +0000195#ifdef TARGET_SPARC
196int graphic_width = 1024;
197int graphic_height = 768;
blueswir1eee0b832007-04-21 19:45:49 +0000198int graphic_depth = 8;
bellardd8272202005-04-06 20:32:23 +0000199#else
bellard1bfe8562004-07-08 21:17:50 +0000200int graphic_width = 800;
201int graphic_height = 600;
bellarde9b137c2004-06-21 16:46:10 +0000202int graphic_depth = 15;
blueswir1eee0b832007-04-21 19:45:49 +0000203#endif
blueswir1dbed7e42008-10-01 19:38:09 +0000204static int full_screen = 0;
blueswir1634a21f2008-11-16 11:34:07 +0000205#ifdef CONFIG_SDL
blueswir1dbed7e42008-10-01 19:38:09 +0000206static int no_frame = 0;
blueswir1634a21f2008-11-16 11:34:07 +0000207#endif
ths667acca2006-12-11 02:08:05 +0000208int no_quit = 0;
bellard8d11df92004-08-24 21:13:40 +0000209CharDriverState *serial_hds[MAX_SERIAL_PORTS];
bellard6508fe52005-01-15 12:02:56 +0000210CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
aliguori9ede2fd2009-01-15 20:05:25 +0000211CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
bellarda09db212005-04-30 16:10:35 +0000212#ifdef TARGET_I386
213int win2k_install_hack = 0;
aliguori73822ec2009-01-15 20:11:34 +0000214int rtc_td_hack = 0;
bellarda09db212005-04-30 16:10:35 +0000215#endif
bellardbb36d472005-11-05 14:22:28 +0000216int usb_enabled = 0;
aurel321b530a62009-04-05 20:08:59 +0000217int singlestep = 0;
bellard6a00d602005-11-21 23:25:50 +0000218int smp_cpus = 1;
Jes Sorensen6be68d72009-07-23 17:03:42 +0200219int max_cpus = 0;
Andre Przywaradc6b1c02009-08-19 15:42:40 +0200220int smp_cores = 1;
221int smp_threads = 1;
ths73fc9742006-12-22 02:09:07 +0000222const char *vnc_display;
bellard6515b202006-05-03 22:02:44 +0000223int acpi_enabled = 1;
aliguori16b29ae2008-12-17 23:28:44 +0000224int no_hpet = 0;
bellard52ca8d62006-06-14 16:03:05 +0000225int fd_bootchk = 1;
bellardd1beab82006-10-02 19:44:22 +0000226int no_reboot = 0;
aurel32b2f76162008-04-11 21:35:52 +0000227int no_shutdown = 0;
balrog9467cd42007-05-01 01:34:14 +0000228int cursor_hide = 1;
balroga171fe32007-04-30 01:48:07 +0000229int graphic_rotate = 0;
Jes Sorensen6b35e7b2009-08-06 16:25:50 +0200230uint8_t irq0override = 1;
blueswir1b9e82a52009-04-05 18:03:31 +0000231#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +0000232int daemonize = 0;
blueswir1b9e82a52009-04-05 18:03:31 +0000233#endif
Markus Armbruster09aaa162009-08-21 10:31:34 +0200234const char *watchdog;
ths9ae02552007-01-05 17:39:04 +0000235const char *option_rom[MAX_OPTION_ROMS];
236int nb_option_roms;
pbrook8e716212007-01-20 17:12:09 +0000237int semihosting_enabled = 0;
balrog2b8f2d42007-07-27 22:08:46 +0000238#ifdef TARGET_ARM
239int old_param = 0;
240#endif
thsc35734b2007-03-19 15:17:08 +0000241const char *qemu_name;
ths3780e192007-06-21 21:08:02 +0000242int alt_grab = 0;
blueswir195efd112008-12-24 20:26:14 +0000243#if defined(TARGET_SPARC) || defined(TARGET_PPC)
blueswir166508602007-05-01 14:16:52 +0000244unsigned int nb_prom_envs = 0;
245const char *prom_envs[MAX_PROM_ENVS];
246#endif
Jan Kiszka95387492009-07-02 00:19:02 +0200247int boot_menu;
bellard0824d6f2003-06-24 13:42:40 +0000248
aliguori268a3622009-04-21 22:30:27 +0000249int nb_numa_nodes;
250uint64_t node_mem[MAX_NODES];
251uint64_t node_cpumask[MAX_NODES];
252
balrogee5605e2007-12-03 03:01:40 +0000253static CPUState *cur_cpu;
254static CPUState *next_cpu;
aliguori43b96852009-04-24 18:03:33 +0000255static int timer_alarm_pending = 1;
thsbf20dc02008-06-30 17:22:19 +0000256/* Conversion factor from emulated instructions to virtual clock ticks. */
pbrook2e70f6e2008-06-29 01:03:05 +0000257static int icount_time_shift;
thsbf20dc02008-06-30 17:22:19 +0000258/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
pbrook2e70f6e2008-06-29 01:03:05 +0000259#define MAX_ICOUNT_SHIFT 10
260/* Compensate for varying guest execution speed. */
261static int64_t qemu_icount_bias;
blueswir1dbed7e42008-10-01 19:38:09 +0000262static QEMUTimer *icount_rt_timer;
263static QEMUTimer *icount_vm_timer;
blueswir19043b622009-01-21 19:28:13 +0000264static QEMUTimer *nographic_timer;
balrogee5605e2007-12-03 03:01:40 +0000265
blueswir18fcb1b92008-09-18 18:29:08 +0000266uint8_t qemu_uuid[16];
267
Jan Kiszka76e30d02009-07-02 00:19:02 +0200268static QEMUBootSetHandler *boot_set_handler;
269static void *boot_set_opaque;
270
bellard0824d6f2003-06-24 13:42:40 +0000271/***********************************************************/
bellard26aa7d72004-04-28 22:26:05 +0000272/* x86 ISA bus support */
273
274target_phys_addr_t isa_mem_base = 0;
bellard3de388f2005-07-02 18:11:44 +0000275PicState2 *isa_pic;
bellard0824d6f2003-06-24 13:42:40 +0000276
bellard0824d6f2003-06-24 13:42:40 +0000277/***********************************************************/
bellard0824d6f2003-06-24 13:42:40 +0000278void hw_error(const char *fmt, ...)
279{
280 va_list ap;
bellard6a00d602005-11-21 23:25:50 +0000281 CPUState *env;
bellard0824d6f2003-06-24 13:42:40 +0000282
283 va_start(ap, fmt);
284 fprintf(stderr, "qemu: hardware error: ");
285 vfprintf(stderr, fmt, ap);
286 fprintf(stderr, "\n");
bellard6a00d602005-11-21 23:25:50 +0000287 for(env = first_cpu; env != NULL; env = env->next_cpu) {
288 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
bellard0824d6f2003-06-24 13:42:40 +0000289#ifdef TARGET_I386
bellard6a00d602005-11-21 23:25:50 +0000290 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
bellardc45886d2004-01-05 00:02:06 +0000291#else
bellard6a00d602005-11-21 23:25:50 +0000292 cpu_dump_state(env, stderr, fprintf, 0);
bellard0824d6f2003-06-24 13:42:40 +0000293#endif
bellard6a00d602005-11-21 23:25:50 +0000294 }
bellard0824d6f2003-06-24 13:42:40 +0000295 va_end(ap);
296 abort();
297}
Andi Kleen18894652009-07-02 09:34:17 +0200298
299static void set_proc_name(const char *s)
300{
Nathan Froyd6ca8d0f2009-08-03 07:32:12 -0700301#if defined(__linux__) && defined(PR_SET_NAME)
Andi Kleen18894652009-07-02 09:34:17 +0200302 char name[16];
303 if (!s)
304 return;
305 name[sizeof(name) - 1] = 0;
306 strncpy(name, s, sizeof(name));
307 /* Could rewrite argv[0] too, but that's a bit more complicated.
308 This simple way is enough for `top'. */
309 prctl(PR_SET_NAME, name);
310#endif
311}
aliguoridf751fa2008-12-04 20:19:35 +0000312
313/***************/
314/* ballooning */
315
316static QEMUBalloonEvent *qemu_balloon_event;
317void *qemu_balloon_event_opaque;
318
319void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque)
320{
321 qemu_balloon_event = func;
322 qemu_balloon_event_opaque = opaque;
323}
324
325void qemu_balloon(ram_addr_t target)
326{
327 if (qemu_balloon_event)
328 qemu_balloon_event(qemu_balloon_event_opaque, target);
329}
330
331ram_addr_t qemu_balloon_status(void)
332{
333 if (qemu_balloon_event)
334 return qemu_balloon_event(qemu_balloon_event_opaque, 0);
335 return 0;
336}
bellard0824d6f2003-06-24 13:42:40 +0000337
bellard8a7ddc32004-03-31 19:00:16 +0000338/***********************************************************/
bellard63066f42004-06-03 18:45:02 +0000339/* keyboard/mouse */
340
341static QEMUPutKBDEvent *qemu_put_kbd_event;
342static void *qemu_put_kbd_event_opaque;
ths455204e2007-01-05 16:42:13 +0000343static QEMUPutMouseEntry *qemu_put_mouse_event_head;
344static QEMUPutMouseEntry *qemu_put_mouse_event_current;
bellard63066f42004-06-03 18:45:02 +0000345
346void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
347{
348 qemu_put_kbd_event_opaque = opaque;
349 qemu_put_kbd_event = func;
350}
351
ths455204e2007-01-05 16:42:13 +0000352QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
353 void *opaque, int absolute,
354 const char *name)
bellard63066f42004-06-03 18:45:02 +0000355{
ths455204e2007-01-05 16:42:13 +0000356 QEMUPutMouseEntry *s, *cursor;
357
358 s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
ths455204e2007-01-05 16:42:13 +0000359
360 s->qemu_put_mouse_event = func;
361 s->qemu_put_mouse_event_opaque = opaque;
362 s->qemu_put_mouse_event_absolute = absolute;
363 s->qemu_put_mouse_event_name = qemu_strdup(name);
364 s->next = NULL;
365
366 if (!qemu_put_mouse_event_head) {
367 qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
368 return s;
369 }
370
371 cursor = qemu_put_mouse_event_head;
372 while (cursor->next != NULL)
373 cursor = cursor->next;
374
375 cursor->next = s;
376 qemu_put_mouse_event_current = s;
377
378 return s;
379}
380
381void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
382{
383 QEMUPutMouseEntry *prev = NULL, *cursor;
384
385 if (!qemu_put_mouse_event_head || entry == NULL)
386 return;
387
388 cursor = qemu_put_mouse_event_head;
389 while (cursor != NULL && cursor != entry) {
390 prev = cursor;
391 cursor = cursor->next;
392 }
393
394 if (cursor == NULL) // does not exist or list empty
395 return;
396 else if (prev == NULL) { // entry is head
397 qemu_put_mouse_event_head = cursor->next;
398 if (qemu_put_mouse_event_current == entry)
399 qemu_put_mouse_event_current = cursor->next;
400 qemu_free(entry->qemu_put_mouse_event_name);
401 qemu_free(entry);
402 return;
403 }
404
405 prev->next = entry->next;
406
407 if (qemu_put_mouse_event_current == entry)
408 qemu_put_mouse_event_current = prev;
409
410 qemu_free(entry->qemu_put_mouse_event_name);
411 qemu_free(entry);
bellard63066f42004-06-03 18:45:02 +0000412}
413
414void kbd_put_keycode(int keycode)
415{
416 if (qemu_put_kbd_event) {
417 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
418 }
419}
420
421void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
422{
ths455204e2007-01-05 16:42:13 +0000423 QEMUPutMouseEvent *mouse_event;
424 void *mouse_event_opaque;
balroga171fe32007-04-30 01:48:07 +0000425 int width;
ths455204e2007-01-05 16:42:13 +0000426
427 if (!qemu_put_mouse_event_current) {
428 return;
429 }
430
431 mouse_event =
432 qemu_put_mouse_event_current->qemu_put_mouse_event;
433 mouse_event_opaque =
434 qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
435
436 if (mouse_event) {
balroga171fe32007-04-30 01:48:07 +0000437 if (graphic_rotate) {
438 if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
439 width = 0x7fff;
440 else
aurel32b94ed572008-03-10 19:34:27 +0000441 width = graphic_width - 1;
balroga171fe32007-04-30 01:48:07 +0000442 mouse_event(mouse_event_opaque,
443 width - dy, dx, dz, buttons_state);
444 } else
445 mouse_event(mouse_event_opaque,
446 dx, dy, dz, buttons_state);
bellard63066f42004-06-03 18:45:02 +0000447 }
448}
449
bellard09b26c52006-04-12 21:09:08 +0000450int kbd_mouse_is_absolute(void)
451{
ths455204e2007-01-05 16:42:13 +0000452 if (!qemu_put_mouse_event_current)
453 return 0;
454
455 return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
456}
457
aliguori376253e2009-03-05 23:01:23 +0000458void do_info_mice(Monitor *mon)
ths455204e2007-01-05 16:42:13 +0000459{
460 QEMUPutMouseEntry *cursor;
461 int index = 0;
462
463 if (!qemu_put_mouse_event_head) {
aliguori376253e2009-03-05 23:01:23 +0000464 monitor_printf(mon, "No mouse devices connected\n");
ths455204e2007-01-05 16:42:13 +0000465 return;
466 }
467
aliguori376253e2009-03-05 23:01:23 +0000468 monitor_printf(mon, "Mouse devices available:\n");
ths455204e2007-01-05 16:42:13 +0000469 cursor = qemu_put_mouse_event_head;
470 while (cursor != NULL) {
aliguori376253e2009-03-05 23:01:23 +0000471 monitor_printf(mon, "%c Mouse #%d: %s\n",
472 (cursor == qemu_put_mouse_event_current ? '*' : ' '),
473 index, cursor->qemu_put_mouse_event_name);
ths455204e2007-01-05 16:42:13 +0000474 index++;
475 cursor = cursor->next;
476 }
477}
478
aliguori376253e2009-03-05 23:01:23 +0000479void do_mouse_set(Monitor *mon, int index)
ths455204e2007-01-05 16:42:13 +0000480{
481 QEMUPutMouseEntry *cursor;
482 int i = 0;
483
484 if (!qemu_put_mouse_event_head) {
aliguori376253e2009-03-05 23:01:23 +0000485 monitor_printf(mon, "No mouse devices connected\n");
ths455204e2007-01-05 16:42:13 +0000486 return;
487 }
488
489 cursor = qemu_put_mouse_event_head;
490 while (cursor != NULL && index != i) {
491 i++;
492 cursor = cursor->next;
493 }
494
495 if (cursor != NULL)
496 qemu_put_mouse_event_current = cursor;
497 else
aliguori376253e2009-03-05 23:01:23 +0000498 monitor_printf(mon, "Mouse at given index not found\n");
bellard09b26c52006-04-12 21:09:08 +0000499}
500
bellard87858c82003-06-27 12:01:39 +0000501/* compute with 96 bit intermediate result: (a*b)/c */
bellard80cabfa2004-03-14 12:20:30 +0000502uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
bellard87858c82003-06-27 12:01:39 +0000503{
504 union {
505 uint64_t ll;
506 struct {
Juan Quintelae2542fe2009-07-27 16:13:06 +0200507#ifdef HOST_WORDS_BIGENDIAN
bellard87858c82003-06-27 12:01:39 +0000508 uint32_t high, low;
509#else
510 uint32_t low, high;
ths3b46e622007-09-17 08:09:54 +0000511#endif
bellard87858c82003-06-27 12:01:39 +0000512 } l;
513 } u, res;
514 uint64_t rl, rh;
515
516 u.ll = a;
517 rl = (uint64_t)u.l.low * (uint64_t)b;
518 rh = (uint64_t)u.l.high * (uint64_t)b;
519 rh += (rl >> 32);
520 res.l.high = rh / c;
521 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
522 return res.ll;
523}
524
bellard1dce7c32006-07-13 23:20:22 +0000525/***********************************************************/
526/* real time host monotonic timer */
527
528#define QEMU_TIMER_BASE 1000000000LL
529
530#ifdef WIN32
531
532static int64_t clock_freq;
533
534static void init_get_clock(void)
535{
bellarda8e5ac32006-07-14 09:36:13 +0000536 LARGE_INTEGER freq;
537 int ret;
bellard1dce7c32006-07-13 23:20:22 +0000538 ret = QueryPerformanceFrequency(&freq);
539 if (ret == 0) {
540 fprintf(stderr, "Could not calibrate ticks\n");
541 exit(1);
542 }
543 clock_freq = freq.QuadPart;
544}
545
546static int64_t get_clock(void)
547{
548 LARGE_INTEGER ti;
549 QueryPerformanceCounter(&ti);
550 return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
551}
552
553#else
554
555static int use_rt_clock;
556
557static void init_get_clock(void)
558{
559 use_rt_clock = 0;
blueswir1c5e97232009-03-07 20:06:23 +0000560#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
561 || defined(__DragonFly__)
bellard1dce7c32006-07-13 23:20:22 +0000562 {
563 struct timespec ts;
564 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
565 use_rt_clock = 1;
566 }
567 }
568#endif
569}
570
571static int64_t get_clock(void)
572{
blueswir1c5e97232009-03-07 20:06:23 +0000573#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
574 || defined(__DragonFly__)
bellard1dce7c32006-07-13 23:20:22 +0000575 if (use_rt_clock) {
576 struct timespec ts;
577 clock_gettime(CLOCK_MONOTONIC, &ts);
578 return ts.tv_sec * 1000000000LL + ts.tv_nsec;
ths5fafdf22007-09-16 21:08:06 +0000579 } else
bellard1dce7c32006-07-13 23:20:22 +0000580#endif
581 {
582 /* XXX: using gettimeofday leads to problems if the date
583 changes, so it should be avoided. */
584 struct timeval tv;
585 gettimeofday(&tv, NULL);
586 return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
587 }
588}
bellard1dce7c32006-07-13 23:20:22 +0000589#endif
590
pbrook2e70f6e2008-06-29 01:03:05 +0000591/* Return the virtual CPU time, based on the instruction counter. */
592static int64_t cpu_get_icount(void)
593{
594 int64_t icount;
595 CPUState *env = cpu_single_env;;
596 icount = qemu_icount;
597 if (env) {
598 if (!can_do_io(env))
599 fprintf(stderr, "Bad clock read\n");
600 icount -= (env->icount_decr.u16.low + env->icount_extra);
601 }
602 return qemu_icount_bias + (icount << icount_time_shift);
603}
604
bellard1dce7c32006-07-13 23:20:22 +0000605/***********************************************************/
606/* guest cycle counter */
607
608static int64_t cpu_ticks_prev;
609static int64_t cpu_ticks_offset;
610static int64_t cpu_clock_offset;
611static int cpu_ticks_enabled;
612
613/* return the host CPU cycle counter and handle stop/restart */
614int64_t cpu_get_ticks(void)
615{
pbrook2e70f6e2008-06-29 01:03:05 +0000616 if (use_icount) {
617 return cpu_get_icount();
618 }
bellard1dce7c32006-07-13 23:20:22 +0000619 if (!cpu_ticks_enabled) {
620 return cpu_ticks_offset;
621 } else {
622 int64_t ticks;
623 ticks = cpu_get_real_ticks();
624 if (cpu_ticks_prev > ticks) {
625 /* Note: non increasing ticks may happen if the host uses
626 software suspend */
627 cpu_ticks_offset += cpu_ticks_prev - ticks;
628 }
629 cpu_ticks_prev = ticks;
630 return ticks + cpu_ticks_offset;
631 }
632}
633
634/* return the host CPU monotonic timer and handle stop/restart */
635static int64_t cpu_get_clock(void)
636{
637 int64_t ti;
638 if (!cpu_ticks_enabled) {
639 return cpu_clock_offset;
640 } else {
641 ti = get_clock();
642 return ti + cpu_clock_offset;
643 }
644}
645
646/* enable cpu_get_ticks() */
647void cpu_enable_ticks(void)
648{
649 if (!cpu_ticks_enabled) {
650 cpu_ticks_offset -= cpu_get_real_ticks();
651 cpu_clock_offset -= get_clock();
652 cpu_ticks_enabled = 1;
653 }
654}
655
656/* disable cpu_get_ticks() : the clock is stopped. You must not call
657 cpu_get_ticks() after that. */
658void cpu_disable_ticks(void)
659{
660 if (cpu_ticks_enabled) {
661 cpu_ticks_offset = cpu_get_ticks();
662 cpu_clock_offset = cpu_get_clock();
663 cpu_ticks_enabled = 0;
664 }
665}
666
667/***********************************************************/
668/* timers */
ths5fafdf22007-09-16 21:08:06 +0000669
bellard8a7ddc32004-03-31 19:00:16 +0000670#define QEMU_TIMER_REALTIME 0
671#define QEMU_TIMER_VIRTUAL 1
672
673struct QEMUClock {
674 int type;
675 /* XXX: add frequency */
676};
677
678struct QEMUTimer {
679 QEMUClock *clock;
680 int64_t expire_time;
681 QEMUTimerCB *cb;
682 void *opaque;
683 struct QEMUTimer *next;
684};
685
thsc8994012007-08-19 21:56:03 +0000686struct qemu_alarm_timer {
687 char const *name;
thsefe75412007-08-24 01:36:32 +0000688 unsigned int flags;
thsc8994012007-08-19 21:56:03 +0000689
690 int (*start)(struct qemu_alarm_timer *t);
691 void (*stop)(struct qemu_alarm_timer *t);
thsefe75412007-08-24 01:36:32 +0000692 void (*rearm)(struct qemu_alarm_timer *t);
thsc8994012007-08-19 21:56:03 +0000693 void *priv;
694};
695
thsefe75412007-08-24 01:36:32 +0000696#define ALARM_FLAG_DYNTICKS 0x1
balrogd5d08332008-01-05 19:41:47 +0000697#define ALARM_FLAG_EXPIRED 0x2
thsefe75412007-08-24 01:36:32 +0000698
699static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
700{
Jean-Christophe Duboise3323402009-05-17 18:38:39 +0200701 return t && (t->flags & ALARM_FLAG_DYNTICKS);
thsefe75412007-08-24 01:36:32 +0000702}
703
704static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
705{
706 if (!alarm_has_dynticks(t))
707 return;
708
709 t->rearm(t);
710}
711
712/* TODO: MIN_TIMER_REARM_US should be optimized */
713#define MIN_TIMER_REARM_US 250
714
thsc8994012007-08-19 21:56:03 +0000715static struct qemu_alarm_timer *alarm_timer;
716
717#ifdef _WIN32
718
719struct qemu_alarm_win32 {
720 MMRESULT timerId;
thsc8994012007-08-19 21:56:03 +0000721 unsigned int period;
Blue Swirlef28c4b2009-04-25 12:56:37 +0000722} alarm_win32_data = {0, -1};
thsc8994012007-08-19 21:56:03 +0000723
724static int win32_start_timer(struct qemu_alarm_timer *t);
725static void win32_stop_timer(struct qemu_alarm_timer *t);
thsefe75412007-08-24 01:36:32 +0000726static void win32_rearm_timer(struct qemu_alarm_timer *t);
thsc8994012007-08-19 21:56:03 +0000727
728#else
729
730static int unix_start_timer(struct qemu_alarm_timer *t);
731static void unix_stop_timer(struct qemu_alarm_timer *t);
732
ths231c6582007-08-26 17:29:15 +0000733#ifdef __linux__
734
thsefe75412007-08-24 01:36:32 +0000735static int dynticks_start_timer(struct qemu_alarm_timer *t);
736static void dynticks_stop_timer(struct qemu_alarm_timer *t);
737static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
738
thsc40ec5a2007-08-19 22:09:40 +0000739static int hpet_start_timer(struct qemu_alarm_timer *t);
740static void hpet_stop_timer(struct qemu_alarm_timer *t);
741
thsc8994012007-08-19 21:56:03 +0000742static int rtc_start_timer(struct qemu_alarm_timer *t);
743static void rtc_stop_timer(struct qemu_alarm_timer *t);
744
thsefe75412007-08-24 01:36:32 +0000745#endif /* __linux__ */
thsc8994012007-08-19 21:56:03 +0000746
747#endif /* _WIN32 */
748
pbrook2e70f6e2008-06-29 01:03:05 +0000749/* Correlation between real and virtual time is always going to be
thsbf20dc02008-06-30 17:22:19 +0000750 fairly approximate, so ignore small variation.
pbrook2e70f6e2008-06-29 01:03:05 +0000751 When the guest is idle real and virtual time will be aligned in
752 the IO wait loop. */
753#define ICOUNT_WOBBLE (QEMU_TIMER_BASE / 10)
754
755static void icount_adjust(void)
756{
757 int64_t cur_time;
758 int64_t cur_icount;
759 int64_t delta;
760 static int64_t last_delta;
761 /* If the VM is not running, then do nothing. */
762 if (!vm_running)
763 return;
764
765 cur_time = cpu_get_clock();
766 cur_icount = qemu_get_clock(vm_clock);
767 delta = cur_icount - cur_time;
768 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
769 if (delta > 0
770 && last_delta + ICOUNT_WOBBLE < delta * 2
771 && icount_time_shift > 0) {
772 /* The guest is getting too far ahead. Slow time down. */
773 icount_time_shift--;
774 }
775 if (delta < 0
776 && last_delta - ICOUNT_WOBBLE > delta * 2
777 && icount_time_shift < MAX_ICOUNT_SHIFT) {
778 /* The guest is getting too far behind. Speed time up. */
779 icount_time_shift++;
780 }
781 last_delta = delta;
782 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
783}
784
785static void icount_adjust_rt(void * opaque)
786{
787 qemu_mod_timer(icount_rt_timer,
788 qemu_get_clock(rt_clock) + 1000);
789 icount_adjust();
790}
791
792static void icount_adjust_vm(void * opaque)
793{
794 qemu_mod_timer(icount_vm_timer,
795 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
796 icount_adjust();
797}
798
799static void init_icount_adjust(void)
800{
801 /* Have both realtime and virtual time triggers for speed adjustment.
802 The realtime trigger catches emulated time passing too slowly,
803 the virtual time trigger catches emulated time passing too fast.
804 Realtime triggers occur even when idle, so use them less frequently
805 than VM triggers. */
806 icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
807 qemu_mod_timer(icount_rt_timer,
808 qemu_get_clock(rt_clock) + 1000);
809 icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
810 qemu_mod_timer(icount_vm_timer,
811 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
812}
813
thsc8994012007-08-19 21:56:03 +0000814static struct qemu_alarm_timer alarm_timers[] = {
thsefe75412007-08-24 01:36:32 +0000815#ifndef _WIN32
ths231c6582007-08-26 17:29:15 +0000816#ifdef __linux__
thsefe75412007-08-24 01:36:32 +0000817 {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
818 dynticks_stop_timer, dynticks_rearm_timer, NULL},
thsc40ec5a2007-08-19 22:09:40 +0000819 /* HPET - if available - is preferred */
thsefe75412007-08-24 01:36:32 +0000820 {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
thsc40ec5a2007-08-19 22:09:40 +0000821 /* ...otherwise try RTC */
thsefe75412007-08-24 01:36:32 +0000822 {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
thsc8994012007-08-19 21:56:03 +0000823#endif
thsefe75412007-08-24 01:36:32 +0000824 {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
thsc8994012007-08-19 21:56:03 +0000825#else
thsefe75412007-08-24 01:36:32 +0000826 {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
827 win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
828 {"win32", 0, win32_start_timer,
829 win32_stop_timer, NULL, &alarm_win32_data},
thsc8994012007-08-19 21:56:03 +0000830#endif
831 {NULL, }
832};
833
blueswir13f47aa82008-03-09 06:59:01 +0000834static void show_available_alarms(void)
thsf3dcfad2007-08-24 01:26:02 +0000835{
836 int i;
837
838 printf("Available alarm timers, in order of precedence:\n");
839 for (i = 0; alarm_timers[i].name; i++)
840 printf("%s\n", alarm_timers[i].name);
841}
842
843static void configure_alarms(char const *opt)
844{
845 int i;
846 int cur = 0;
malcb1503cd2008-12-22 20:33:55 +0000847 int count = ARRAY_SIZE(alarm_timers) - 1;
thsf3dcfad2007-08-24 01:26:02 +0000848 char *arg;
849 char *name;
pbrook2e70f6e2008-06-29 01:03:05 +0000850 struct qemu_alarm_timer tmp;
thsf3dcfad2007-08-24 01:26:02 +0000851
aurel323adda042008-03-09 23:43:49 +0000852 if (!strcmp(opt, "?")) {
thsf3dcfad2007-08-24 01:26:02 +0000853 show_available_alarms();
854 exit(0);
855 }
856
857 arg = strdup(opt);
858
859 /* Reorder the array */
860 name = strtok(arg, ",");
861 while (name) {
balroge2b577e2007-09-17 21:25:20 +0000862 for (i = 0; i < count && alarm_timers[i].name; i++) {
thsf3dcfad2007-08-24 01:26:02 +0000863 if (!strcmp(alarm_timers[i].name, name))
864 break;
865 }
866
867 if (i == count) {
868 fprintf(stderr, "Unknown clock %s\n", name);
869 goto next;
870 }
871
872 if (i < cur)
873 /* Ignore */
874 goto next;
875
876 /* Swap */
877 tmp = alarm_timers[i];
878 alarm_timers[i] = alarm_timers[cur];
879 alarm_timers[cur] = tmp;
880
881 cur++;
882next:
883 name = strtok(NULL, ",");
884 }
885
886 free(arg);
887
888 if (cur) {
pbrook2e70f6e2008-06-29 01:03:05 +0000889 /* Disable remaining timers */
thsf3dcfad2007-08-24 01:26:02 +0000890 for (i = cur; i < count; i++)
891 alarm_timers[i].name = NULL;
aurel323adda042008-03-09 23:43:49 +0000892 } else {
893 show_available_alarms();
894 exit(1);
thsf3dcfad2007-08-24 01:26:02 +0000895 }
thsf3dcfad2007-08-24 01:26:02 +0000896}
897
bellard8a7ddc32004-03-31 19:00:16 +0000898QEMUClock *rt_clock;
899QEMUClock *vm_clock;
900
901static QEMUTimer *active_timers[2];
bellard8a7ddc32004-03-31 19:00:16 +0000902
pbrook9596ebb2007-11-18 01:44:38 +0000903static QEMUClock *qemu_new_clock(int type)
bellard8a7ddc32004-03-31 19:00:16 +0000904{
905 QEMUClock *clock;
906 clock = qemu_mallocz(sizeof(QEMUClock));
bellard8a7ddc32004-03-31 19:00:16 +0000907 clock->type = type;
908 return clock;
909}
910
911QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
912{
913 QEMUTimer *ts;
914
915 ts = qemu_mallocz(sizeof(QEMUTimer));
916 ts->clock = clock;
917 ts->cb = cb;
918 ts->opaque = opaque;
919 return ts;
920}
921
922void qemu_free_timer(QEMUTimer *ts)
923{
924 qemu_free(ts);
925}
926
927/* stop a timer, but do not dealloc it */
928void qemu_del_timer(QEMUTimer *ts)
929{
930 QEMUTimer **pt, *t;
931
932 /* NOTE: this code must be signal safe because
933 qemu_timer_expired() can be called from a signal. */
934 pt = &active_timers[ts->clock->type];
935 for(;;) {
936 t = *pt;
937 if (!t)
938 break;
939 if (t == ts) {
940 *pt = t->next;
941 break;
942 }
943 pt = &t->next;
944 }
945}
946
947/* modify the current timer so that it will be fired when current_time
948 >= expire_time. The corresponding callback will be called. */
949void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
950{
951 QEMUTimer **pt, *t;
952
953 qemu_del_timer(ts);
954
955 /* add the timer in the sorted list */
956 /* NOTE: this code must be signal safe because
957 qemu_timer_expired() can be called from a signal. */
958 pt = &active_timers[ts->clock->type];
959 for(;;) {
960 t = *pt;
961 if (!t)
962 break;
ths5fafdf22007-09-16 21:08:06 +0000963 if (t->expire_time > expire_time)
bellard8a7ddc32004-03-31 19:00:16 +0000964 break;
965 pt = &t->next;
966 }
967 ts->expire_time = expire_time;
968 ts->next = *pt;
969 *pt = ts;
balrogd5d08332008-01-05 19:41:47 +0000970
971 /* Rearm if necessary */
pbrook2e70f6e2008-06-29 01:03:05 +0000972 if (pt == &active_timers[ts->clock->type]) {
973 if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
974 qemu_rearm_alarm_timer(alarm_timer);
975 }
976 /* Interrupt execution to force deadline recalculation. */
aliguorid9f75a42009-04-24 18:03:11 +0000977 if (use_icount)
978 qemu_notify_event();
pbrook2e70f6e2008-06-29 01:03:05 +0000979 }
bellard8a7ddc32004-03-31 19:00:16 +0000980}
981
982int qemu_timer_pending(QEMUTimer *ts)
983{
984 QEMUTimer *t;
985 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
986 if (t == ts)
987 return 1;
988 }
989 return 0;
990}
991
Stefano Stabellini2430ffe2009-08-03 10:56:01 +0100992int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
bellard8a7ddc32004-03-31 19:00:16 +0000993{
994 if (!timer_head)
995 return 0;
996 return (timer_head->expire_time <= current_time);
997}
998
999static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1000{
1001 QEMUTimer *ts;
ths3b46e622007-09-17 08:09:54 +00001002
bellard8a7ddc32004-03-31 19:00:16 +00001003 for(;;) {
1004 ts = *ptimer_head;
bellarde95c8d52004-09-30 22:22:08 +00001005 if (!ts || ts->expire_time > current_time)
bellard8a7ddc32004-03-31 19:00:16 +00001006 break;
1007 /* remove timer from the list before calling the callback */
1008 *ptimer_head = ts->next;
1009 ts->next = NULL;
ths3b46e622007-09-17 08:09:54 +00001010
bellard8a7ddc32004-03-31 19:00:16 +00001011 /* run the callback (the timer list can be modified) */
1012 ts->cb(ts->opaque);
1013 }
1014}
1015
1016int64_t qemu_get_clock(QEMUClock *clock)
1017{
1018 switch(clock->type) {
1019 case QEMU_TIMER_REALTIME:
bellard1dce7c32006-07-13 23:20:22 +00001020 return get_clock() / 1000000;
bellard8a7ddc32004-03-31 19:00:16 +00001021 default:
1022 case QEMU_TIMER_VIRTUAL:
pbrook2e70f6e2008-06-29 01:03:05 +00001023 if (use_icount) {
1024 return cpu_get_icount();
1025 } else {
1026 return cpu_get_clock();
1027 }
bellard8a7ddc32004-03-31 19:00:16 +00001028 }
1029}
1030
bellard1dce7c32006-07-13 23:20:22 +00001031static void init_timers(void)
1032{
1033 init_get_clock();
1034 ticks_per_sec = QEMU_TIMER_BASE;
1035 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
1036 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
1037}
1038
bellard8a7ddc32004-03-31 19:00:16 +00001039/* save a timer */
1040void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1041{
1042 uint64_t expire_time;
1043
1044 if (qemu_timer_pending(ts)) {
1045 expire_time = ts->expire_time;
1046 } else {
1047 expire_time = -1;
1048 }
1049 qemu_put_be64(f, expire_time);
1050}
1051
1052void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1053{
1054 uint64_t expire_time;
1055
1056 expire_time = qemu_get_be64(f);
1057 if (expire_time != -1) {
1058 qemu_mod_timer(ts, expire_time);
1059 } else {
1060 qemu_del_timer(ts);
1061 }
1062}
1063
1064static void timer_save(QEMUFile *f, void *opaque)
1065{
1066 if (cpu_ticks_enabled) {
1067 hw_error("cannot save state if virtual timers are running");
1068 }
thsbee8d682007-12-16 23:41:11 +00001069 qemu_put_be64(f, cpu_ticks_offset);
1070 qemu_put_be64(f, ticks_per_sec);
1071 qemu_put_be64(f, cpu_clock_offset);
bellard8a7ddc32004-03-31 19:00:16 +00001072}
1073
1074static int timer_load(QEMUFile *f, void *opaque, int version_id)
1075{
bellardc88676f2006-08-06 13:36:11 +00001076 if (version_id != 1 && version_id != 2)
bellard8a7ddc32004-03-31 19:00:16 +00001077 return -EINVAL;
1078 if (cpu_ticks_enabled) {
1079 return -EINVAL;
1080 }
thsbee8d682007-12-16 23:41:11 +00001081 cpu_ticks_offset=qemu_get_be64(f);
1082 ticks_per_sec=qemu_get_be64(f);
bellardc88676f2006-08-06 13:36:11 +00001083 if (version_id == 2) {
thsbee8d682007-12-16 23:41:11 +00001084 cpu_clock_offset=qemu_get_be64(f);
bellardc88676f2006-08-06 13:36:11 +00001085 }
bellard8a7ddc32004-03-31 19:00:16 +00001086 return 0;
1087}
1088
aliguori50317c72009-04-24 18:03:29 +00001089static void qemu_event_increment(void);
1090
bellard67b915a2004-03-31 23:37:16 +00001091#ifdef _WIN32
blueswir1b9e82a52009-04-05 18:03:31 +00001092static void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
1093 DWORD_PTR dwUser, DWORD_PTR dw1,
1094 DWORD_PTR dw2)
bellard67b915a2004-03-31 23:37:16 +00001095#else
bellard8a7ddc32004-03-31 19:00:16 +00001096static void host_alarm_handler(int host_signum)
bellard67b915a2004-03-31 23:37:16 +00001097#endif
bellard8a7ddc32004-03-31 19:00:16 +00001098{
bellard02ba45c2004-06-25 14:46:23 +00001099#if 0
1100#define DISP_FREQ 1000
1101 {
1102 static int64_t delta_min = INT64_MAX;
1103 static int64_t delta_max, delta_cum, last_clock, delta, ti;
1104 static int count;
1105 ti = qemu_get_clock(vm_clock);
1106 if (last_clock != 0) {
1107 delta = ti - last_clock;
1108 if (delta < delta_min)
1109 delta_min = delta;
1110 if (delta > delta_max)
1111 delta_max = delta;
1112 delta_cum += delta;
1113 if (++count == DISP_FREQ) {
bellard26a76462006-06-25 18:15:32 +00001114 printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
bellard02ba45c2004-06-25 14:46:23 +00001115 muldiv64(delta_min, 1000000, ticks_per_sec),
1116 muldiv64(delta_max, 1000000, ticks_per_sec),
1117 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1118 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1119 count = 0;
1120 delta_min = INT64_MAX;
1121 delta_max = 0;
1122 delta_cum = 0;
1123 }
1124 }
1125 last_clock = ti;
1126 }
1127#endif
thsefe75412007-08-24 01:36:32 +00001128 if (alarm_has_dynticks(alarm_timer) ||
pbrook2e70f6e2008-06-29 01:03:05 +00001129 (!use_icount &&
1130 qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1131 qemu_get_clock(vm_clock))) ||
bellard8a7ddc32004-03-31 19:00:16 +00001132 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1133 qemu_get_clock(rt_clock))) {
aliguori50317c72009-04-24 18:03:29 +00001134 qemu_event_increment();
Jean-Christophe Duboise3323402009-05-17 18:38:39 +02001135 if (alarm_timer) alarm_timer->flags |= ALARM_FLAG_EXPIRED;
balrogd5d08332008-01-05 19:41:47 +00001136
aliguorid6dc3d42009-04-24 18:04:07 +00001137#ifndef CONFIG_IOTHREAD
1138 if (next_cpu) {
balrog4f8eb8d2007-12-16 12:39:38 +00001139 /* stop the currently executing cpu because a timer occured */
aliguorid6dc3d42009-04-24 18:04:07 +00001140 cpu_exit(next_cpu);
balrog4f8eb8d2007-12-16 12:39:38 +00001141 }
aliguorid6dc3d42009-04-24 18:04:07 +00001142#endif
aliguori43b96852009-04-24 18:03:33 +00001143 timer_alarm_pending = 1;
aliguorid9f75a42009-04-24 18:03:11 +00001144 qemu_notify_event();
bellard8a7ddc32004-03-31 19:00:16 +00001145 }
1146}
1147
pbrook2e70f6e2008-06-29 01:03:05 +00001148static int64_t qemu_next_deadline(void)
thsefe75412007-08-24 01:36:32 +00001149{
pbrook2e70f6e2008-06-29 01:03:05 +00001150 int64_t delta;
thsefe75412007-08-24 01:36:32 +00001151
1152 if (active_timers[QEMU_TIMER_VIRTUAL]) {
pbrook2e70f6e2008-06-29 01:03:05 +00001153 delta = active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
1154 qemu_get_clock(vm_clock);
1155 } else {
1156 /* To avoid problems with overflow limit this to 2^32. */
1157 delta = INT32_MAX;
thsefe75412007-08-24 01:36:32 +00001158 }
1159
pbrook2e70f6e2008-06-29 01:03:05 +00001160 if (delta < 0)
1161 delta = 0;
thsefe75412007-08-24 01:36:32 +00001162
pbrook2e70f6e2008-06-29 01:03:05 +00001163 return delta;
1164}
1165
blueswir18632fb92008-09-14 13:59:34 +00001166#if defined(__linux__) || defined(_WIN32)
pbrook2e70f6e2008-06-29 01:03:05 +00001167static uint64_t qemu_next_deadline_dyntick(void)
1168{
1169 int64_t delta;
1170 int64_t rtdelta;
1171
1172 if (use_icount)
1173 delta = INT32_MAX;
1174 else
1175 delta = (qemu_next_deadline() + 999) / 1000;
1176
1177 if (active_timers[QEMU_TIMER_REALTIME]) {
1178 rtdelta = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
1179 qemu_get_clock(rt_clock))*1000;
1180 if (rtdelta < delta)
1181 delta = rtdelta;
1182 }
1183
1184 if (delta < MIN_TIMER_REARM_US)
1185 delta = MIN_TIMER_REARM_US;
1186
1187 return delta;
thsefe75412007-08-24 01:36:32 +00001188}
blueswir18632fb92008-09-14 13:59:34 +00001189#endif
thsefe75412007-08-24 01:36:32 +00001190
bellardfd872592004-05-12 19:11:15 +00001191#ifndef _WIN32
1192
aliguori7183b4b2008-11-05 20:40:18 +00001193/* Sets a specific flag */
1194static int fcntl_setfl(int fd, int flag)
1195{
1196 int flags;
1197
1198 flags = fcntl(fd, F_GETFL);
1199 if (flags == -1)
1200 return -errno;
1201
1202 if (fcntl(fd, F_SETFL, flags | flag) == -1)
1203 return -errno;
1204
1205 return 0;
1206}
1207
bellard829309c2004-05-20 13:20:12 +00001208#if defined(__linux__)
1209
bellardfd872592004-05-12 19:11:15 +00001210#define RTC_FREQ 1024
1211
aurel32de9a95f2008-11-11 13:41:01 +00001212static void enable_sigio_timer(int fd)
bellardfd872592004-05-12 19:11:15 +00001213{
thsc8994012007-08-19 21:56:03 +00001214 struct sigaction act;
1215
1216 /* timer signal */
1217 sigfillset(&act.sa_mask);
1218 act.sa_flags = 0;
thsc8994012007-08-19 21:56:03 +00001219 act.sa_handler = host_alarm_handler;
1220
1221 sigaction(SIGIO, &act, NULL);
aliguori7183b4b2008-11-05 20:40:18 +00001222 fcntl_setfl(fd, O_ASYNC);
thsc8994012007-08-19 21:56:03 +00001223 fcntl(fd, F_SETOWN, getpid());
1224}
1225
thsc40ec5a2007-08-19 22:09:40 +00001226static int hpet_start_timer(struct qemu_alarm_timer *t)
1227{
1228 struct hpet_info info;
1229 int r, fd;
1230
1231 fd = open("/dev/hpet", O_RDONLY);
1232 if (fd < 0)
1233 return -1;
1234
1235 /* Set frequency */
1236 r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1237 if (r < 0) {
1238 fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1239 "error, but for better emulation accuracy type:\n"
1240 "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1241 goto fail;
1242 }
1243
1244 /* Check capabilities */
1245 r = ioctl(fd, HPET_INFO, &info);
1246 if (r < 0)
1247 goto fail;
1248
1249 /* Enable periodic mode */
1250 r = ioctl(fd, HPET_EPI, 0);
1251 if (info.hi_flags && (r < 0))
1252 goto fail;
1253
1254 /* Enable interrupt */
1255 r = ioctl(fd, HPET_IE_ON, 0);
1256 if (r < 0)
1257 goto fail;
1258
1259 enable_sigio_timer(fd);
pbrookfcdc2122007-08-23 20:22:22 +00001260 t->priv = (void *)(long)fd;
thsc40ec5a2007-08-19 22:09:40 +00001261
1262 return 0;
1263fail:
1264 close(fd);
1265 return -1;
1266}
1267
1268static void hpet_stop_timer(struct qemu_alarm_timer *t)
1269{
pbrookfcdc2122007-08-23 20:22:22 +00001270 int fd = (long)t->priv;
thsc40ec5a2007-08-19 22:09:40 +00001271
1272 close(fd);
1273}
1274
thsc8994012007-08-19 21:56:03 +00001275static int rtc_start_timer(struct qemu_alarm_timer *t)
1276{
1277 int rtc_fd;
balrogb5a23ad2008-02-03 03:45:47 +00001278 unsigned long current_rtc_freq = 0;
thsc8994012007-08-19 21:56:03 +00001279
balrogaeb30be2007-07-02 15:03:13 +00001280 TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
bellardfd872592004-05-12 19:11:15 +00001281 if (rtc_fd < 0)
1282 return -1;
balrogb5a23ad2008-02-03 03:45:47 +00001283 ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
1284 if (current_rtc_freq != RTC_FREQ &&
1285 ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
bellardfd872592004-05-12 19:11:15 +00001286 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1287 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1288 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1289 goto fail;
1290 }
1291 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1292 fail:
1293 close(rtc_fd);
1294 return -1;
1295 }
thsc8994012007-08-19 21:56:03 +00001296
1297 enable_sigio_timer(rtc_fd);
1298
pbrookfcdc2122007-08-23 20:22:22 +00001299 t->priv = (void *)(long)rtc_fd;
thsc8994012007-08-19 21:56:03 +00001300
bellardfd872592004-05-12 19:11:15 +00001301 return 0;
1302}
1303
thsc8994012007-08-19 21:56:03 +00001304static void rtc_stop_timer(struct qemu_alarm_timer *t)
bellard829309c2004-05-20 13:20:12 +00001305{
pbrookfcdc2122007-08-23 20:22:22 +00001306 int rtc_fd = (long)t->priv;
thsc8994012007-08-19 21:56:03 +00001307
1308 close(rtc_fd);
bellard829309c2004-05-20 13:20:12 +00001309}
1310
thsefe75412007-08-24 01:36:32 +00001311static int dynticks_start_timer(struct qemu_alarm_timer *t)
1312{
1313 struct sigevent ev;
1314 timer_t host_timer;
1315 struct sigaction act;
1316
1317 sigfillset(&act.sa_mask);
1318 act.sa_flags = 0;
thsefe75412007-08-24 01:36:32 +00001319 act.sa_handler = host_alarm_handler;
1320
1321 sigaction(SIGALRM, &act, NULL);
1322
Jean-Christophe Dubois9ed415b2009-05-17 18:41:16 +02001323 /*
1324 * Initialize ev struct to 0 to avoid valgrind complaining
1325 * about uninitialized data in timer_create call
1326 */
1327 memset(&ev, 0, sizeof(ev));
thsefe75412007-08-24 01:36:32 +00001328 ev.sigev_value.sival_int = 0;
1329 ev.sigev_notify = SIGEV_SIGNAL;
1330 ev.sigev_signo = SIGALRM;
1331
1332 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1333 perror("timer_create");
1334
1335 /* disable dynticks */
1336 fprintf(stderr, "Dynamic Ticks disabled\n");
1337
1338 return -1;
1339 }
1340
blueswir10399bfe2008-11-16 11:37:18 +00001341 t->priv = (void *)(long)host_timer;
thsefe75412007-08-24 01:36:32 +00001342
1343 return 0;
1344}
1345
1346static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1347{
blueswir10399bfe2008-11-16 11:37:18 +00001348 timer_t host_timer = (timer_t)(long)t->priv;
thsefe75412007-08-24 01:36:32 +00001349
1350 timer_delete(host_timer);
1351}
1352
1353static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1354{
blueswir10399bfe2008-11-16 11:37:18 +00001355 timer_t host_timer = (timer_t)(long)t->priv;
thsefe75412007-08-24 01:36:32 +00001356 struct itimerspec timeout;
1357 int64_t nearest_delta_us = INT64_MAX;
1358 int64_t current_us;
1359
1360 if (!active_timers[QEMU_TIMER_REALTIME] &&
1361 !active_timers[QEMU_TIMER_VIRTUAL])
balrogd5d08332008-01-05 19:41:47 +00001362 return;
thsefe75412007-08-24 01:36:32 +00001363
pbrook2e70f6e2008-06-29 01:03:05 +00001364 nearest_delta_us = qemu_next_deadline_dyntick();
thsefe75412007-08-24 01:36:32 +00001365
1366 /* check whether a timer is already running */
1367 if (timer_gettime(host_timer, &timeout)) {
1368 perror("gettime");
1369 fprintf(stderr, "Internal timer error: aborting\n");
1370 exit(1);
1371 }
1372 current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1373 if (current_us && current_us <= nearest_delta_us)
1374 return;
1375
1376 timeout.it_interval.tv_sec = 0;
1377 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1378 timeout.it_value.tv_sec = nearest_delta_us / 1000000;
1379 timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1380 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1381 perror("settime");
1382 fprintf(stderr, "Internal timer error: aborting\n");
1383 exit(1);
1384 }
1385}
1386
ths70744b32007-08-26 17:31:30 +00001387#endif /* defined(__linux__) */
ths231c6582007-08-26 17:29:15 +00001388
thsc8994012007-08-19 21:56:03 +00001389static int unix_start_timer(struct qemu_alarm_timer *t)
1390{
1391 struct sigaction act;
1392 struct itimerval itv;
1393 int err;
1394
1395 /* timer signal */
1396 sigfillset(&act.sa_mask);
1397 act.sa_flags = 0;
thsc8994012007-08-19 21:56:03 +00001398 act.sa_handler = host_alarm_handler;
1399
1400 sigaction(SIGALRM, &act, NULL);
1401
1402 itv.it_interval.tv_sec = 0;
1403 /* for i386 kernel 2.6 to get 1 ms */
1404 itv.it_interval.tv_usec = 999;
1405 itv.it_value.tv_sec = 0;
1406 itv.it_value.tv_usec = 10 * 1000;
1407
1408 err = setitimer(ITIMER_REAL, &itv, NULL);
1409 if (err)
1410 return -1;
1411
1412 return 0;
1413}
1414
1415static void unix_stop_timer(struct qemu_alarm_timer *t)
1416{
1417 struct itimerval itv;
1418
1419 memset(&itv, 0, sizeof(itv));
1420 setitimer(ITIMER_REAL, &itv, NULL);
1421}
1422
bellard829309c2004-05-20 13:20:12 +00001423#endif /* !defined(_WIN32) */
bellardfd872592004-05-12 19:11:15 +00001424
aliguorif49e58d2008-11-05 21:22:34 +00001425
thsc8994012007-08-19 21:56:03 +00001426#ifdef _WIN32
1427
1428static int win32_start_timer(struct qemu_alarm_timer *t)
1429{
1430 TIMECAPS tc;
1431 struct qemu_alarm_win32 *data = t->priv;
thsefe75412007-08-24 01:36:32 +00001432 UINT flags;
thsc8994012007-08-19 21:56:03 +00001433
thsc8994012007-08-19 21:56:03 +00001434 memset(&tc, 0, sizeof(tc));
1435 timeGetDevCaps(&tc, sizeof(tc));
1436
1437 if (data->period < tc.wPeriodMin)
1438 data->period = tc.wPeriodMin;
1439
1440 timeBeginPeriod(data->period);
1441
thsefe75412007-08-24 01:36:32 +00001442 flags = TIME_CALLBACK_FUNCTION;
1443 if (alarm_has_dynticks(t))
1444 flags |= TIME_ONESHOT;
1445 else
1446 flags |= TIME_PERIODIC;
1447
thsc8994012007-08-19 21:56:03 +00001448 data->timerId = timeSetEvent(1, // interval (ms)
1449 data->period, // resolution
1450 host_alarm_handler, // function
1451 (DWORD)t, // parameter
thsefe75412007-08-24 01:36:32 +00001452 flags);
thsc8994012007-08-19 21:56:03 +00001453
1454 if (!data->timerId) {
1455 perror("Failed to initialize win32 alarm timer");
thsc8994012007-08-19 21:56:03 +00001456 timeEndPeriod(data->period);
thsc8994012007-08-19 21:56:03 +00001457 return -1;
1458 }
1459
thsc8994012007-08-19 21:56:03 +00001460 return 0;
1461}
1462
1463static void win32_stop_timer(struct qemu_alarm_timer *t)
1464{
1465 struct qemu_alarm_win32 *data = t->priv;
1466
1467 timeKillEvent(data->timerId);
1468 timeEndPeriod(data->period);
thsc8994012007-08-19 21:56:03 +00001469}
1470
thsefe75412007-08-24 01:36:32 +00001471static void win32_rearm_timer(struct qemu_alarm_timer *t)
1472{
1473 struct qemu_alarm_win32 *data = t->priv;
1474 uint64_t nearest_delta_us;
1475
1476 if (!active_timers[QEMU_TIMER_REALTIME] &&
1477 !active_timers[QEMU_TIMER_VIRTUAL])
balrogd5d08332008-01-05 19:41:47 +00001478 return;
thsefe75412007-08-24 01:36:32 +00001479
pbrook2e70f6e2008-06-29 01:03:05 +00001480 nearest_delta_us = qemu_next_deadline_dyntick();
thsefe75412007-08-24 01:36:32 +00001481 nearest_delta_us /= 1000;
1482
1483 timeKillEvent(data->timerId);
1484
1485 data->timerId = timeSetEvent(1,
1486 data->period,
1487 host_alarm_handler,
1488 (DWORD)t,
1489 TIME_ONESHOT | TIME_PERIODIC);
1490
1491 if (!data->timerId) {
1492 perror("Failed to re-arm win32 alarm timer");
1493
1494 timeEndPeriod(data->period);
thsefe75412007-08-24 01:36:32 +00001495 exit(1);
1496 }
1497}
1498
thsc8994012007-08-19 21:56:03 +00001499#endif /* _WIN32 */
1500
aliguori7183b4b2008-11-05 20:40:18 +00001501static int init_timer_alarm(void)
bellard8a7ddc32004-03-31 19:00:16 +00001502{
blueswir1223f0d72008-09-30 18:12:18 +00001503 struct qemu_alarm_timer *t = NULL;
thsc8994012007-08-19 21:56:03 +00001504 int i, err = -1;
aliguorif49e58d2008-11-05 21:22:34 +00001505
thsc8994012007-08-19 21:56:03 +00001506 for (i = 0; alarm_timers[i].name; i++) {
1507 t = &alarm_timers[i];
1508
thsc8994012007-08-19 21:56:03 +00001509 err = t->start(t);
1510 if (!err)
1511 break;
bellard67b915a2004-03-31 23:37:16 +00001512 }
bellardfd872592004-05-12 19:11:15 +00001513
thsc8994012007-08-19 21:56:03 +00001514 if (err) {
aliguori7183b4b2008-11-05 20:40:18 +00001515 err = -ENOENT;
1516 goto fail;
bellard67b915a2004-03-31 23:37:16 +00001517 }
thsc8994012007-08-19 21:56:03 +00001518
1519 alarm_timer = t;
aliguori7183b4b2008-11-05 20:40:18 +00001520
aliguori6abfbd72008-11-05 20:49:37 +00001521 return 0;
aliguori7183b4b2008-11-05 20:40:18 +00001522
1523fail:
aliguori7183b4b2008-11-05 20:40:18 +00001524 return err;
bellard8a7ddc32004-03-31 19:00:16 +00001525}
1526
pbrook9596ebb2007-11-18 01:44:38 +00001527static void quit_timers(void)
bellard40c3bac2004-04-04 12:56:28 +00001528{
thsc8994012007-08-19 21:56:03 +00001529 alarm_timer->stop(alarm_timer);
1530 alarm_timer = NULL;
bellard40c3bac2004-04-04 12:56:28 +00001531}
1532
bellardc4b1fcc2004-03-14 21:44:30 +00001533/***********************************************************/
balrogf6503052008-02-17 11:42:19 +00001534/* host time/date access */
1535void qemu_get_timedate(struct tm *tm, int offset)
1536{
1537 time_t ti;
1538 struct tm *ret;
1539
1540 time(&ti);
1541 ti += offset;
1542 if (rtc_date_offset == -1) {
1543 if (rtc_utc)
1544 ret = gmtime(&ti);
1545 else
1546 ret = localtime(&ti);
1547 } else {
1548 ti -= rtc_date_offset;
1549 ret = gmtime(&ti);
1550 }
1551
1552 memcpy(tm, ret, sizeof(struct tm));
1553}
1554
1555int qemu_timedate_diff(struct tm *tm)
1556{
1557 time_t seconds;
1558
1559 if (rtc_date_offset == -1)
1560 if (rtc_utc)
1561 seconds = mktimegm(tm);
1562 else
1563 seconds = mktime(tm);
1564 else
1565 seconds = mktimegm(tm) + rtc_date_offset;
1566
1567 return seconds - time(NULL);
1568}
1569
bellardfd1dff42006-02-01 21:29:26 +00001570#ifdef _WIN32
bellardfd1dff42006-02-01 21:29:26 +00001571static void socket_cleanup(void)
1572{
1573 WSACleanup();
1574}
bellard82c643f2004-07-14 17:28:13 +00001575
bellardfd1dff42006-02-01 21:29:26 +00001576static int socket_init(void)
1577{
1578 WSADATA Data;
1579 int ret, err;
1580
1581 ret = WSAStartup(MAKEWORD(2,2), &Data);
1582 if (ret != 0) {
1583 err = WSAGetLastError();
1584 fprintf(stderr, "WSAStartup: %d\n", err);
1585 return -1;
1586 }
1587 atexit(socket_cleanup);
1588 return 0;
1589}
aurel3264b7b732008-05-05 10:05:31 +00001590#endif
1591
balrog1ae26a12008-09-28 23:19:47 +00001592/***********************************************************/
1593/* Bluetooth support */
1594static int nb_hcis;
1595static int cur_hci;
1596static struct HCIInfo *hci_table[MAX_NICS];
balrogdc72ac12008-11-09 00:04:26 +00001597
balrog1ae26a12008-09-28 23:19:47 +00001598static struct bt_vlan_s {
1599 struct bt_scatternet_s net;
1600 int id;
1601 struct bt_vlan_s *next;
1602} *first_bt_vlan;
1603
1604/* find or alloc a new bluetooth "VLAN" */
blueswir1674bb262008-09-30 18:18:27 +00001605static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
balrog1ae26a12008-09-28 23:19:47 +00001606{
1607 struct bt_vlan_s **pvlan, *vlan;
1608 for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
1609 if (vlan->id == id)
1610 return &vlan->net;
1611 }
1612 vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
1613 vlan->id = id;
1614 pvlan = &first_bt_vlan;
1615 while (*pvlan != NULL)
1616 pvlan = &(*pvlan)->next;
1617 *pvlan = vlan;
1618 return &vlan->net;
1619}
1620
1621static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
1622{
1623}
1624
1625static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
1626{
1627 return -ENOTSUP;
1628}
1629
1630static struct HCIInfo null_hci = {
1631 .cmd_send = null_hci_send,
1632 .sco_send = null_hci_send,
1633 .acl_send = null_hci_send,
1634 .bdaddr_set = null_hci_addr_set,
1635};
1636
1637struct HCIInfo *qemu_next_hci(void)
1638{
1639 if (cur_hci == nb_hcis)
1640 return &null_hci;
1641
1642 return hci_table[cur_hci++];
1643}
1644
balrogdc72ac12008-11-09 00:04:26 +00001645static struct HCIInfo *hci_init(const char *str)
1646{
1647 char *endp;
1648 struct bt_scatternet_s *vlan = 0;
1649
1650 if (!strcmp(str, "null"))
1651 /* null */
1652 return &null_hci;
1653 else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
1654 /* host[:hciN] */
1655 return bt_host_hci(str[4] ? str + 5 : "hci0");
1656 else if (!strncmp(str, "hci", 3)) {
1657 /* hci[,vlan=n] */
1658 if (str[3]) {
1659 if (!strncmp(str + 3, ",vlan=", 6)) {
1660 vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
1661 if (*endp)
1662 vlan = 0;
1663 }
1664 } else
1665 vlan = qemu_find_bt_vlan(0);
1666 if (vlan)
1667 return bt_new_hci(vlan);
1668 }
1669
1670 fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
1671
1672 return 0;
1673}
1674
1675static int bt_hci_parse(const char *str)
1676{
1677 struct HCIInfo *hci;
1678 bdaddr_t bdaddr;
1679
1680 if (nb_hcis >= MAX_NICS) {
1681 fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n", MAX_NICS);
1682 return -1;
1683 }
1684
1685 hci = hci_init(str);
1686 if (!hci)
1687 return -1;
1688
1689 bdaddr.b[0] = 0x52;
1690 bdaddr.b[1] = 0x54;
1691 bdaddr.b[2] = 0x00;
1692 bdaddr.b[3] = 0x12;
1693 bdaddr.b[4] = 0x34;
1694 bdaddr.b[5] = 0x56 + nb_hcis;
1695 hci->bdaddr_set(hci, bdaddr.b);
1696
1697 hci_table[nb_hcis++] = hci;
1698
1699 return 0;
1700}
1701
1702static void bt_vhci_add(int vlan_id)
1703{
1704 struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);
1705
1706 if (!vlan->slave)
1707 fprintf(stderr, "qemu: warning: adding a VHCI to "
1708 "an empty scatternet %i\n", vlan_id);
1709
1710 bt_vhci_init(bt_new_hci(vlan));
1711}
1712
1713static struct bt_device_s *bt_device_add(const char *opt)
1714{
1715 struct bt_scatternet_s *vlan;
1716 int vlan_id = 0;
1717 char *endp = strstr(opt, ",vlan=");
1718 int len = (endp ? endp - opt : strlen(opt)) + 1;
1719 char devname[10];
1720
1721 pstrcpy(devname, MIN(sizeof(devname), len), opt);
1722
1723 if (endp) {
1724 vlan_id = strtol(endp + 6, &endp, 0);
1725 if (*endp) {
1726 fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
1727 return 0;
1728 }
1729 }
1730
1731 vlan = qemu_find_bt_vlan(vlan_id);
1732
1733 if (!vlan->slave)
1734 fprintf(stderr, "qemu: warning: adding a slave device to "
1735 "an empty scatternet %i\n", vlan_id);
1736
1737 if (!strcmp(devname, "keyboard"))
1738 return bt_keyboard_init(vlan);
1739
1740 fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
1741 return 0;
1742}
1743
1744static int bt_parse(const char *opt)
1745{
1746 const char *endp, *p;
1747 int vlan;
1748
1749 if (strstart(opt, "hci", &endp)) {
1750 if (!*endp || *endp == ',') {
1751 if (*endp)
1752 if (!strstart(endp, ",vlan=", 0))
1753 opt = endp + 1;
1754
1755 return bt_hci_parse(opt);
1756 }
1757 } else if (strstart(opt, "vhci", &endp)) {
1758 if (!*endp || *endp == ',') {
1759 if (*endp) {
1760 if (strstart(endp, ",vlan=", &p)) {
1761 vlan = strtol(p, (char **) &endp, 0);
1762 if (*endp) {
1763 fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
1764 return 1;
1765 }
1766 } else {
1767 fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
1768 return 1;
1769 }
1770 } else
1771 vlan = 0;
1772
1773 bt_vhci_add(vlan);
1774 return 0;
1775 }
1776 } else if (strstart(opt, "device:", &endp))
1777 return !bt_device_add(endp);
1778
1779 fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
1780 return 1;
1781}
1782
balrog1ae26a12008-09-28 23:19:47 +00001783/***********************************************************/
1784/* QEMU Block devices */
1785
balrog609497a2008-01-14 02:56:53 +00001786#define HD_ALIAS "index=%d,media=disk"
thse4bcb142007-12-02 04:51:10 +00001787#define CDROM_ALIAS "index=2,media=cdrom"
thse4bcb142007-12-02 04:51:10 +00001788#define FD_ALIAS "index=%d,if=floppy"
balrog609497a2008-01-14 02:56:53 +00001789#define PFLASH_ALIAS "if=pflash"
1790#define MTD_ALIAS "if=mtd"
balrog9d413d12007-12-04 00:10:34 +00001791#define SD_ALIAS "index=0,if=sd"
thse4bcb142007-12-02 04:51:10 +00001792
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001793QemuOpts *drive_add(const char *file, const char *fmt, ...)
thse4bcb142007-12-02 04:51:10 +00001794{
1795 va_list ap;
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001796 char optstr[1024];
1797 QemuOpts *opts;
thse4bcb142007-12-02 04:51:10 +00001798
thse4bcb142007-12-02 04:51:10 +00001799 va_start(ap, fmt);
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001800 vsnprintf(optstr, sizeof(optstr), fmt, ap);
thse4bcb142007-12-02 04:51:10 +00001801 va_end(ap);
1802
Gerd Hoffmann7282a032009-07-31 12:25:35 +02001803 opts = qemu_opts_parse(&qemu_drive_opts, optstr, NULL);
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001804 if (!opts) {
1805 fprintf(stderr, "%s: huh? duplicate? (%s)\n",
1806 __FUNCTION__, optstr);
1807 return NULL;
1808 }
1809 if (file)
1810 qemu_opt_set(opts, "file", file);
1811 return opts;
aliguorib01b1112009-02-11 15:20:20 +00001812}
1813
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001814DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
thse4bcb142007-12-02 04:51:10 +00001815{
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001816 DriveInfo *dinfo;
thse4bcb142007-12-02 04:51:10 +00001817
1818 /* seek interface, bus and unit */
1819
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001820 TAILQ_FOREACH(dinfo, &drives, next) {
1821 if (dinfo->type == type &&
1822 dinfo->bus == bus &&
1823 dinfo->unit == unit)
1824 return dinfo;
1825 }
thse4bcb142007-12-02 04:51:10 +00001826
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001827 return NULL;
thse4bcb142007-12-02 04:51:10 +00001828}
1829
Gerd Hoffmann2e810b32009-07-31 12:25:38 +02001830DriveInfo *drive_get_by_id(const char *id)
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02001831{
1832 DriveInfo *dinfo;
1833
1834 TAILQ_FOREACH(dinfo, &drives, next) {
1835 if (strcmp(id, dinfo->id))
1836 continue;
1837 return dinfo;
1838 }
1839 return NULL;
1840}
1841
thsf60d39b2007-12-17 03:55:57 +00001842int drive_get_max_bus(BlockInterfaceType type)
thse4bcb142007-12-02 04:51:10 +00001843{
1844 int max_bus;
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001845 DriveInfo *dinfo;
thse4bcb142007-12-02 04:51:10 +00001846
1847 max_bus = -1;
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001848 TAILQ_FOREACH(dinfo, &drives, next) {
1849 if(dinfo->type == type &&
1850 dinfo->bus > max_bus)
1851 max_bus = dinfo->bus;
thse4bcb142007-12-02 04:51:10 +00001852 }
1853 return max_bus;
1854}
1855
aliguorifa879c62009-01-07 17:32:33 +00001856const char *drive_get_serial(BlockDriverState *bdrv)
1857{
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001858 DriveInfo *dinfo;
aliguorifa879c62009-01-07 17:32:33 +00001859
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001860 TAILQ_FOREACH(dinfo, &drives, next) {
1861 if (dinfo->bdrv == bdrv)
1862 return dinfo->serial;
1863 }
aliguorifa879c62009-01-07 17:32:33 +00001864
1865 return "\0";
1866}
1867
aliguori428c5702009-01-21 18:59:04 +00001868BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv)
1869{
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001870 DriveInfo *dinfo;
aliguori428c5702009-01-21 18:59:04 +00001871
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001872 TAILQ_FOREACH(dinfo, &drives, next) {
1873 if (dinfo->bdrv == bdrv)
1874 return dinfo->onerror;
1875 }
aliguori428c5702009-01-21 18:59:04 +00001876
aliguoricdad4bd2009-02-28 16:51:01 +00001877 return BLOCK_ERR_STOP_ENOSPC;
aliguori428c5702009-01-21 18:59:04 +00001878}
1879
aurel32a1620fa2008-04-29 05:58:01 +00001880static void bdrv_format_print(void *opaque, const char *name)
1881{
1882 fprintf(stderr, " %s", name);
1883}
1884
aliguorib01b1112009-02-11 15:20:20 +00001885void drive_uninit(BlockDriverState *bdrv)
1886{
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001887 DriveInfo *dinfo;
aliguorib01b1112009-02-11 15:20:20 +00001888
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001889 TAILQ_FOREACH(dinfo, &drives, next) {
1890 if (dinfo->bdrv != bdrv)
1891 continue;
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001892 qemu_opts_del(dinfo->opts);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001893 TAILQ_REMOVE(&drives, dinfo, next);
1894 qemu_free(dinfo);
1895 break;
1896 }
aliguorib01b1112009-02-11 15:20:20 +00001897}
1898
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001899DriveInfo *drive_init(QemuOpts *opts, void *opaque,
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001900 int *fatal_error)
thse4bcb142007-12-02 04:51:10 +00001901{
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001902 const char *buf;
1903 const char *file = NULL;
balrogc8522bd2007-12-06 22:11:20 +00001904 char devname[128];
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001905 const char *serial;
balrogc8522bd2007-12-06 22:11:20 +00001906 const char *mediastr = "";
thsf60d39b2007-12-17 03:55:57 +00001907 BlockInterfaceType type;
thse4bcb142007-12-02 04:51:10 +00001908 enum { MEDIA_DISK, MEDIA_CDROM } media;
1909 int bus_id, unit_id;
1910 int cyls, heads, secs, translation;
aurel321e72d3b2008-04-28 20:26:45 +00001911 BlockDriver *drv = NULL;
aliguori4d73cd32009-02-11 15:20:46 +00001912 QEMUMachine *machine = opaque;
thse4bcb142007-12-02 04:51:10 +00001913 int max_devs;
1914 int index;
balrog33f00272007-12-24 14:33:24 +00001915 int cache;
Christoph Hellwig5c6c3a62009-08-20 16:58:35 +02001916 int aio = 0;
aliguori428c5702009-01-21 18:59:04 +00001917 int bdrv_flags, onerror;
Markus Armbrusterc2cc47a2009-06-18 15:14:10 +02001918 const char *devaddr;
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001919 DriveInfo *dinfo;
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001920 int snapshot = 0;
1921
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001922 *fatal_error = 1;
thse4bcb142007-12-02 04:51:10 +00001923
thse4bcb142007-12-02 04:51:10 +00001924 translation = BIOS_ATA_TRANSLATION_AUTO;
Kevin Wolf0aa217e2009-06-30 13:06:04 +02001925 cache = 1;
thse4bcb142007-12-02 04:51:10 +00001926
blueswir1c9b1ae22008-09-28 18:55:17 +00001927 if (machine->use_scsi) {
thsf60d39b2007-12-17 03:55:57 +00001928 type = IF_SCSI;
thse4bcb142007-12-02 04:51:10 +00001929 max_devs = MAX_SCSI_DEVS;
blueswir1363a37d2008-08-21 17:58:08 +00001930 pstrcpy(devname, sizeof(devname), "scsi");
thse4bcb142007-12-02 04:51:10 +00001931 } else {
thsf60d39b2007-12-17 03:55:57 +00001932 type = IF_IDE;
thse4bcb142007-12-02 04:51:10 +00001933 max_devs = MAX_IDE_DEVS;
blueswir1363a37d2008-08-21 17:58:08 +00001934 pstrcpy(devname, sizeof(devname), "ide");
thse4bcb142007-12-02 04:51:10 +00001935 }
1936 media = MEDIA_DISK;
1937
1938 /* extract parameters */
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001939 bus_id = qemu_opt_get_number(opts, "bus", 0);
1940 unit_id = qemu_opt_get_number(opts, "unit", -1);
1941 index = qemu_opt_get_number(opts, "index", -1);
thse4bcb142007-12-02 04:51:10 +00001942
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001943 cyls = qemu_opt_get_number(opts, "cyls", 0);
1944 heads = qemu_opt_get_number(opts, "heads", 0);
1945 secs = qemu_opt_get_number(opts, "secs", 0);
thse4bcb142007-12-02 04:51:10 +00001946
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001947 snapshot = qemu_opt_get_bool(opts, "snapshot", 0);
thse4bcb142007-12-02 04:51:10 +00001948
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001949 file = qemu_opt_get(opts, "file");
1950 serial = qemu_opt_get(opts, "serial");
1951
1952 if ((buf = qemu_opt_get(opts, "if")) != NULL) {
bellardae45d362008-06-11 09:44:44 +00001953 pstrcpy(devname, sizeof(devname), buf);
thse4bcb142007-12-02 04:51:10 +00001954 if (!strcmp(buf, "ide")) {
thsf60d39b2007-12-17 03:55:57 +00001955 type = IF_IDE;
thse4bcb142007-12-02 04:51:10 +00001956 max_devs = MAX_IDE_DEVS;
1957 } else if (!strcmp(buf, "scsi")) {
thsf60d39b2007-12-17 03:55:57 +00001958 type = IF_SCSI;
thse4bcb142007-12-02 04:51:10 +00001959 max_devs = MAX_SCSI_DEVS;
1960 } else if (!strcmp(buf, "floppy")) {
thsf60d39b2007-12-17 03:55:57 +00001961 type = IF_FLOPPY;
thse4bcb142007-12-02 04:51:10 +00001962 max_devs = 0;
1963 } else if (!strcmp(buf, "pflash")) {
thsf60d39b2007-12-17 03:55:57 +00001964 type = IF_PFLASH;
thse4bcb142007-12-02 04:51:10 +00001965 max_devs = 0;
1966 } else if (!strcmp(buf, "mtd")) {
thsf60d39b2007-12-17 03:55:57 +00001967 type = IF_MTD;
thse4bcb142007-12-02 04:51:10 +00001968 max_devs = 0;
1969 } else if (!strcmp(buf, "sd")) {
thsf60d39b2007-12-17 03:55:57 +00001970 type = IF_SD;
thse4bcb142007-12-02 04:51:10 +00001971 max_devs = 0;
aliguori6e02c382008-12-04 19:52:44 +00001972 } else if (!strcmp(buf, "virtio")) {
1973 type = IF_VIRTIO;
1974 max_devs = 0;
aliguori62d23ef2009-04-22 15:19:30 +00001975 } else if (!strcmp(buf, "xen")) {
1976 type = IF_XEN;
1977 max_devs = 0;
Gerd Hoffmanna8659e92009-07-31 12:25:39 +02001978 } else if (!strcmp(buf, "none")) {
1979 type = IF_NONE;
1980 max_devs = 0;
aliguori62d23ef2009-04-22 15:19:30 +00001981 } else {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001982 fprintf(stderr, "qemu: unsupported bus type '%s'\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001983 return NULL;
thse4bcb142007-12-02 04:51:10 +00001984 }
1985 }
1986
thse4bcb142007-12-02 04:51:10 +00001987 if (cyls || heads || secs) {
1988 if (cyls < 1 || cyls > 16383) {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001989 fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001990 return NULL;
thse4bcb142007-12-02 04:51:10 +00001991 }
1992 if (heads < 1 || heads > 16) {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001993 fprintf(stderr, "qemu: '%s' invalid physical heads number\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001994 return NULL;
thse4bcb142007-12-02 04:51:10 +00001995 }
1996 if (secs < 1 || secs > 63) {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02001997 fprintf(stderr, "qemu: '%s' invalid physical secs number\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02001998 return NULL;
thse4bcb142007-12-02 04:51:10 +00001999 }
2000 }
2001
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002002 if ((buf = qemu_opt_get(opts, "trans")) != NULL) {
thse4bcb142007-12-02 04:51:10 +00002003 if (!cyls) {
2004 fprintf(stderr,
2005 "qemu: '%s' trans must be used with cyls,heads and secs\n",
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002006 buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002007 return NULL;
thse4bcb142007-12-02 04:51:10 +00002008 }
2009 if (!strcmp(buf, "none"))
2010 translation = BIOS_ATA_TRANSLATION_NONE;
2011 else if (!strcmp(buf, "lba"))
2012 translation = BIOS_ATA_TRANSLATION_LBA;
2013 else if (!strcmp(buf, "auto"))
2014 translation = BIOS_ATA_TRANSLATION_AUTO;
2015 else {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002016 fprintf(stderr, "qemu: '%s' invalid translation type\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002017 return NULL;
thse4bcb142007-12-02 04:51:10 +00002018 }
2019 }
2020
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002021 if ((buf = qemu_opt_get(opts, "media")) != NULL) {
thse4bcb142007-12-02 04:51:10 +00002022 if (!strcmp(buf, "disk")) {
2023 media = MEDIA_DISK;
2024 } else if (!strcmp(buf, "cdrom")) {
2025 if (cyls || secs || heads) {
2026 fprintf(stderr,
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002027 "qemu: '%s' invalid physical CHS format\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002028 return NULL;
thse4bcb142007-12-02 04:51:10 +00002029 }
2030 media = MEDIA_CDROM;
2031 } else {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002032 fprintf(stderr, "qemu: '%s' invalid media\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002033 return NULL;
thse4bcb142007-12-02 04:51:10 +00002034 }
2035 }
2036
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002037 if ((buf = qemu_opt_get(opts, "cache")) != NULL) {
aliguori9f7965c2008-10-14 14:42:54 +00002038 if (!strcmp(buf, "off") || !strcmp(buf, "none"))
balrog33f00272007-12-24 14:33:24 +00002039 cache = 0;
aliguori9f7965c2008-10-14 14:42:54 +00002040 else if (!strcmp(buf, "writethrough"))
balrog33f00272007-12-24 14:33:24 +00002041 cache = 1;
aliguori9f7965c2008-10-14 14:42:54 +00002042 else if (!strcmp(buf, "writeback"))
2043 cache = 2;
balrog33f00272007-12-24 14:33:24 +00002044 else {
2045 fprintf(stderr, "qemu: invalid cache option\n");
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002046 return NULL;
balrog33f00272007-12-24 14:33:24 +00002047 }
2048 }
2049
Christoph Hellwig5c6c3a62009-08-20 16:58:35 +02002050#ifdef CONFIG_LINUX_AIO
2051 if ((buf = qemu_opt_get(opts, "aio")) != NULL) {
2052 if (!strcmp(buf, "threads"))
2053 aio = 0;
2054 else if (!strcmp(buf, "native"))
2055 aio = 1;
2056 else {
2057 fprintf(stderr, "qemu: invalid aio option\n");
2058 return NULL;
2059 }
2060 }
2061#endif
2062
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002063 if ((buf = qemu_opt_get(opts, "format")) != NULL) {
aurel32a1620fa2008-04-29 05:58:01 +00002064 if (strcmp(buf, "?") == 0) {
2065 fprintf(stderr, "qemu: Supported formats:");
2066 bdrv_iterate_format(bdrv_format_print, NULL);
2067 fprintf(stderr, "\n");
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002068 return NULL;
aurel32a1620fa2008-04-29 05:58:01 +00002069 }
aurel321e72d3b2008-04-28 20:26:45 +00002070 drv = bdrv_find_format(buf);
2071 if (!drv) {
2072 fprintf(stderr, "qemu: '%s' invalid format\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002073 return NULL;
aurel321e72d3b2008-04-28 20:26:45 +00002074 }
2075 }
2076
aliguoricdad4bd2009-02-28 16:51:01 +00002077 onerror = BLOCK_ERR_STOP_ENOSPC;
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002078 if ((buf = qemu_opt_get(opts, "werror")) != NULL) {
aliguori869a5c62009-01-22 19:52:25 +00002079 if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) {
aliguoriea8a5d72009-01-22 19:52:21 +00002080 fprintf(stderr, "werror is no supported by this format\n");
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002081 return NULL;
aliguori428c5702009-01-21 18:59:04 +00002082 }
2083 if (!strcmp(buf, "ignore"))
2084 onerror = BLOCK_ERR_IGNORE;
2085 else if (!strcmp(buf, "enospc"))
2086 onerror = BLOCK_ERR_STOP_ENOSPC;
2087 else if (!strcmp(buf, "stop"))
2088 onerror = BLOCK_ERR_STOP_ANY;
2089 else if (!strcmp(buf, "report"))
2090 onerror = BLOCK_ERR_REPORT;
2091 else {
2092 fprintf(stderr, "qemu: '%s' invalid write error action\n", buf);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002093 return NULL;
aliguori428c5702009-01-21 18:59:04 +00002094 }
2095 }
2096
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002097 if ((devaddr = qemu_opt_get(opts, "addr")) != NULL) {
Markus Armbrusterc2cc47a2009-06-18 15:14:10 +02002098 if (type != IF_VIRTIO) {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002099 fprintf(stderr, "addr is not supported\n");
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002100 return NULL;
Markus Armbrusterc2cc47a2009-06-18 15:14:10 +02002101 }
Markus Armbrusterc2cc47a2009-06-18 15:14:10 +02002102 }
2103
thse4bcb142007-12-02 04:51:10 +00002104 /* compute bus and unit according index */
2105
2106 if (index != -1) {
2107 if (bus_id != 0 || unit_id != -1) {
2108 fprintf(stderr,
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002109 "qemu: index cannot be used with bus and unit\n");
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002110 return NULL;
thse4bcb142007-12-02 04:51:10 +00002111 }
2112 if (max_devs == 0)
2113 {
2114 unit_id = index;
2115 bus_id = 0;
2116 } else {
2117 unit_id = index % max_devs;
2118 bus_id = index / max_devs;
2119 }
2120 }
2121
2122 /* if user doesn't specify a unit_id,
2123 * try to find the first free
2124 */
2125
2126 if (unit_id == -1) {
2127 unit_id = 0;
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002128 while (drive_get(type, bus_id, unit_id) != NULL) {
thse4bcb142007-12-02 04:51:10 +00002129 unit_id++;
2130 if (max_devs && unit_id >= max_devs) {
2131 unit_id -= max_devs;
2132 bus_id++;
2133 }
2134 }
2135 }
2136
2137 /* check unit id */
2138
2139 if (max_devs && unit_id >= max_devs) {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002140 fprintf(stderr, "qemu: unit %d too big (max is %d)\n",
2141 unit_id, max_devs - 1);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002142 return NULL;
thse4bcb142007-12-02 04:51:10 +00002143 }
2144
2145 /*
2146 * ignore multiple definitions
2147 */
2148
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002149 if (drive_get(type, bus_id, unit_id) != NULL) {
2150 *fatal_error = 0;
2151 return NULL;
2152 }
thse4bcb142007-12-02 04:51:10 +00002153
2154 /* init */
2155
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002156 dinfo = qemu_mallocz(sizeof(*dinfo));
Gerd Hoffmanne23d9c42009-07-31 12:25:34 +02002157 if ((buf = qemu_opts_id(opts)) != NULL) {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002158 dinfo->id = qemu_strdup(buf);
2159 } else {
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002160 /* no id supplied -> create one */
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002161 dinfo->id = qemu_mallocz(32);
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002162 if (type == IF_IDE || type == IF_SCSI)
2163 mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
2164 if (max_devs)
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002165 snprintf(dinfo->id, 32, "%s%i%s%i",
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002166 devname, bus_id, mediastr, unit_id);
2167 else
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002168 snprintf(dinfo->id, 32, "%s%s%i",
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002169 devname, mediastr, unit_id);
2170 }
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002171 dinfo->bdrv = bdrv_new(dinfo->id);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002172 dinfo->devaddr = devaddr;
2173 dinfo->type = type;
2174 dinfo->bus = bus_id;
2175 dinfo->unit = unit_id;
2176 dinfo->onerror = onerror;
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002177 dinfo->opts = opts;
2178 if (serial)
2179 strncpy(dinfo->serial, serial, sizeof(serial));
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002180 TAILQ_INSERT_TAIL(&drives, dinfo, next);
thse4bcb142007-12-02 04:51:10 +00002181
thsf60d39b2007-12-17 03:55:57 +00002182 switch(type) {
thse4bcb142007-12-02 04:51:10 +00002183 case IF_IDE:
2184 case IF_SCSI:
aliguori62d23ef2009-04-22 15:19:30 +00002185 case IF_XEN:
thse4bcb142007-12-02 04:51:10 +00002186 switch(media) {
2187 case MEDIA_DISK:
2188 if (cyls != 0) {
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002189 bdrv_set_geometry_hint(dinfo->bdrv, cyls, heads, secs);
2190 bdrv_set_translation_hint(dinfo->bdrv, translation);
thse4bcb142007-12-02 04:51:10 +00002191 }
2192 break;
2193 case MEDIA_CDROM:
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002194 bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_CDROM);
thse4bcb142007-12-02 04:51:10 +00002195 break;
2196 }
2197 break;
2198 case IF_SD:
2199 /* FIXME: This isn't really a floppy, but it's a reasonable
2200 approximation. */
2201 case IF_FLOPPY:
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002202 bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_FLOPPY);
thse4bcb142007-12-02 04:51:10 +00002203 break;
2204 case IF_PFLASH:
2205 case IF_MTD:
Gerd Hoffmanna8659e92009-07-31 12:25:39 +02002206 case IF_NONE:
thse4bcb142007-12-02 04:51:10 +00002207 break;
Gerd Hoffmannd176c492009-07-31 12:25:41 +02002208 case IF_VIRTIO:
2209 /* add virtio block device */
2210 opts = qemu_opts_create(&qemu_device_opts, NULL, 0);
2211 qemu_opt_set(opts, "driver", "virtio-blk-pci");
2212 qemu_opt_set(opts, "drive", dinfo->id);
2213 if (devaddr)
2214 qemu_opt_set(opts, "addr", devaddr);
2215 break;
Paul Brookaae94602009-05-14 22:35:06 +01002216 case IF_COUNT:
2217 abort();
thse4bcb142007-12-02 04:51:10 +00002218 }
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002219 if (!file) {
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002220 *fatal_error = 0;
2221 return NULL;
2222 }
balrog33f00272007-12-24 14:33:24 +00002223 bdrv_flags = 0;
aliguori9f7965c2008-10-14 14:42:54 +00002224 if (snapshot) {
balrog33f00272007-12-24 14:33:24 +00002225 bdrv_flags |= BDRV_O_SNAPSHOT;
aliguori9f7965c2008-10-14 14:42:54 +00002226 cache = 2; /* always use write-back with snapshot */
2227 }
2228 if (cache == 0) /* no caching */
2229 bdrv_flags |= BDRV_O_NOCACHE;
2230 else if (cache == 2) /* write-back */
2231 bdrv_flags |= BDRV_O_CACHE_WB;
Christoph Hellwig5c6c3a62009-08-20 16:58:35 +02002232
2233 if (aio == 1) {
2234 bdrv_flags |= BDRV_O_NATIVE_AIO;
2235 } else {
2236 bdrv_flags &= ~BDRV_O_NATIVE_AIO;
2237 }
2238
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002239 if (bdrv_open2(dinfo->bdrv, file, bdrv_flags, drv) < 0) {
thse4bcb142007-12-02 04:51:10 +00002240 fprintf(stderr, "qemu: could not open disk image %s\n",
2241 file);
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002242 return NULL;
thse4bcb142007-12-02 04:51:10 +00002243 }
Christoph Hellwig5c6c3a62009-08-20 16:58:35 +02002244
Gerd Hoffmann1dae12e2009-07-22 16:42:58 +02002245 if (bdrv_key_required(dinfo->bdrv))
aliguoric0f4ce72009-03-05 23:01:01 +00002246 autostart = 0;
Gerd Hoffmann751c6a12009-07-22 16:42:57 +02002247 *fatal_error = 0;
2248 return dinfo;
thse4bcb142007-12-02 04:51:10 +00002249}
2250
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02002251static int drive_init_func(QemuOpts *opts, void *opaque)
2252{
2253 QEMUMachine *machine = opaque;
2254 int fatal_error = 0;
2255
2256 if (drive_init(opts, machine, &fatal_error) == NULL) {
2257 if (fatal_error)
2258 return 1;
2259 }
2260 return 0;
2261}
2262
2263static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
2264{
2265 if (NULL == qemu_opt_get(opts, "snapshot")) {
2266 qemu_opt_set(opts, "snapshot", "on");
2267 }
2268 return 0;
2269}
2270
Jan Kiszka76e30d02009-07-02 00:19:02 +02002271void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
2272{
2273 boot_set_handler = func;
2274 boot_set_opaque = opaque;
2275}
2276
2277int qemu_boot_set(const char *boot_devices)
2278{
2279 if (!boot_set_handler) {
2280 return -EINVAL;
2281 }
2282 return boot_set_handler(boot_set_opaque, boot_devices);
2283}
2284
Jan Kiszkaef3adf62009-07-02 00:19:02 +02002285static int parse_bootdevices(char *devices)
2286{
2287 /* We just do some generic consistency checks */
2288 const char *p;
2289 int bitmap = 0;
2290
2291 for (p = devices; *p != '\0'; p++) {
2292 /* Allowed boot devices are:
2293 * a-b: floppy disk drives
2294 * c-f: IDE disk drives
2295 * g-m: machine implementation dependant drives
2296 * n-p: network devices
2297 * It's up to each machine implementation to check if the given boot
2298 * devices match the actual hardware implementation and firmware
2299 * features.
2300 */
2301 if (*p < 'a' || *p > 'p') {
2302 fprintf(stderr, "Invalid boot device '%c'\n", *p);
2303 exit(1);
2304 }
2305 if (bitmap & (1 << (*p - 'a'))) {
2306 fprintf(stderr, "Boot device '%c' was given twice\n", *p);
2307 exit(1);
2308 }
2309 bitmap |= 1 << (*p - 'a');
2310 }
2311 return bitmap;
2312}
2313
Jan Kiszkae0f084b2009-07-02 00:19:02 +02002314static void restore_boot_devices(void *opaque)
2315{
2316 char *standard_boot_devices = opaque;
2317
2318 qemu_boot_set(standard_boot_devices);
2319
2320 qemu_unregister_reset(restore_boot_devices, standard_boot_devices);
2321 qemu_free(standard_boot_devices);
2322}
2323
aliguori268a3622009-04-21 22:30:27 +00002324static void numa_add(const char *optarg)
2325{
2326 char option[128];
2327 char *endptr;
2328 unsigned long long value, endvalue;
2329 int nodenr;
2330
2331 optarg = get_opt_name(option, 128, optarg, ',') + 1;
2332 if (!strcmp(option, "node")) {
2333 if (get_param_value(option, 128, "nodeid", optarg) == 0) {
2334 nodenr = nb_numa_nodes;
2335 } else {
2336 nodenr = strtoull(option, NULL, 10);
2337 }
2338
2339 if (get_param_value(option, 128, "mem", optarg) == 0) {
2340 node_mem[nodenr] = 0;
2341 } else {
2342 value = strtoull(option, &endptr, 0);
2343 switch (*endptr) {
2344 case 0: case 'M': case 'm':
2345 value <<= 20;
2346 break;
2347 case 'G': case 'g':
2348 value <<= 30;
2349 break;
2350 }
2351 node_mem[nodenr] = value;
2352 }
2353 if (get_param_value(option, 128, "cpus", optarg) == 0) {
2354 node_cpumask[nodenr] = 0;
2355 } else {
2356 value = strtoull(option, &endptr, 10);
2357 if (value >= 64) {
2358 value = 63;
2359 fprintf(stderr, "only 64 CPUs in NUMA mode supported.\n");
2360 } else {
2361 if (*endptr == '-') {
2362 endvalue = strtoull(endptr+1, &endptr, 10);
2363 if (endvalue >= 63) {
2364 endvalue = 62;
2365 fprintf(stderr,
2366 "only 63 CPUs in NUMA mode supported.\n");
2367 }
2368 value = (1 << (endvalue + 1)) - (1 << value);
2369 } else {
2370 value = 1 << value;
2371 }
2372 }
2373 node_cpumask[nodenr] = value;
2374 }
2375 nb_numa_nodes++;
2376 }
2377 return;
2378}
2379
Andre Przywaradc6b1c02009-08-19 15:42:40 +02002380static void smp_parse(const char *optarg)
2381{
2382 int smp, sockets = 0, threads = 0, cores = 0;
2383 char *endptr;
2384 char option[128];
2385
2386 smp = strtoul(optarg, &endptr, 10);
2387 if (endptr != optarg) {
2388 if (*endptr == ',') {
2389 endptr++;
2390 }
2391 }
2392 if (get_param_value(option, 128, "sockets", endptr) != 0)
2393 sockets = strtoull(option, NULL, 10);
2394 if (get_param_value(option, 128, "cores", endptr) != 0)
2395 cores = strtoull(option, NULL, 10);
2396 if (get_param_value(option, 128, "threads", endptr) != 0)
2397 threads = strtoull(option, NULL, 10);
2398 if (get_param_value(option, 128, "maxcpus", endptr) != 0)
2399 max_cpus = strtoull(option, NULL, 10);
2400
2401 /* compute missing values, prefer sockets over cores over threads */
2402 if (smp == 0 || sockets == 0) {
2403 sockets = sockets > 0 ? sockets : 1;
2404 cores = cores > 0 ? cores : 1;
2405 threads = threads > 0 ? threads : 1;
2406 if (smp == 0) {
2407 smp = cores * threads * sockets;
2408 } else {
2409 sockets = smp / (cores * threads);
2410 }
2411 } else {
2412 if (cores == 0) {
2413 threads = threads > 0 ? threads : 1;
2414 cores = smp / (sockets * threads);
2415 } else {
2416 if (sockets == 0) {
2417 sockets = smp / (cores * threads);
2418 } else {
2419 threads = smp / (cores * sockets);
2420 }
2421 }
2422 }
2423 smp_cpus = smp;
2424 smp_cores = cores > 0 ? cores : 1;
2425 smp_threads = threads > 0 ? threads : 1;
2426 if (max_cpus == 0)
2427 max_cpus = smp_cpus;
2428}
2429
bellard330d0412003-07-26 18:11:40 +00002430/***********************************************************/
bellarda594cfb2005-11-06 16:13:29 +00002431/* USB devices */
2432
pbrook0d92ed32006-05-21 16:30:15 +00002433static USBPort *used_usb_ports;
2434static USBPort *free_usb_ports;
2435
2436/* ??? Maybe change this to register a hub to keep track of the topology. */
2437void qemu_register_usb_port(USBPort *port, void *opaque, int index,
2438 usb_attachfn attach)
2439{
2440 port->opaque = opaque;
2441 port->index = index;
2442 port->attach = attach;
2443 port->next = free_usb_ports;
2444 free_usb_ports = port;
2445}
2446
aliguori4b096fc2008-08-21 19:28:55 +00002447int usb_device_add_dev(USBDevice *dev)
2448{
2449 USBPort *port;
2450
2451 /* Find a USB port to add the device to. */
2452 port = free_usb_ports;
2453 if (!port->next) {
2454 USBDevice *hub;
2455
2456 /* Create a new hub and chain it on. */
2457 free_usb_ports = NULL;
2458 port->next = used_usb_ports;
2459 used_usb_ports = port;
2460
2461 hub = usb_hub_init(VM_USB_HUB_SIZE);
2462 usb_attach(port, hub);
2463 port = free_usb_ports;
2464 }
2465
2466 free_usb_ports = port->next;
2467 port->next = used_usb_ports;
2468 used_usb_ports = port;
2469 usb_attach(port, dev);
2470 return 0;
2471}
2472
aliguoribb5fc202009-03-05 23:01:15 +00002473static void usb_msd_password_cb(void *opaque, int err)
2474{
2475 USBDevice *dev = opaque;
2476
2477 if (!err)
2478 usb_device_add_dev(dev);
2479 else
2480 dev->handle_destroy(dev);
2481}
2482
aliguoric0f4ce72009-03-05 23:01:01 +00002483static int usb_device_add(const char *devname, int is_hotplug)
bellarda594cfb2005-11-06 16:13:29 +00002484{
2485 const char *p;
2486 USBDevice *dev;
bellarda594cfb2005-11-06 16:13:29 +00002487
pbrook0d92ed32006-05-21 16:30:15 +00002488 if (!free_usb_ports)
bellarda594cfb2005-11-06 16:13:29 +00002489 return -1;
2490
2491 if (strstart(devname, "host:", &p)) {
2492 dev = usb_host_device_open(p);
bellarda594cfb2005-11-06 16:13:29 +00002493 } else if (!strcmp(devname, "mouse")) {
2494 dev = usb_mouse_init();
bellard09b26c52006-04-12 21:09:08 +00002495 } else if (!strcmp(devname, "tablet")) {
balrog47b2d332007-06-22 08:16:00 +00002496 dev = usb_tablet_init();
2497 } else if (!strcmp(devname, "keyboard")) {
2498 dev = usb_keyboard_init();
pbrook2e5d83b2006-05-25 23:58:51 +00002499 } else if (strstart(devname, "disk:", &p)) {
aliguoric0f4ce72009-03-05 23:01:01 +00002500 BlockDriverState *bs;
2501
aliguoribb5fc202009-03-05 23:01:15 +00002502 dev = usb_msd_init(p);
aliguoric0f4ce72009-03-05 23:01:01 +00002503 if (!dev)
2504 return -1;
aliguoribb5fc202009-03-05 23:01:15 +00002505 bs = usb_msd_get_bdrv(dev);
aliguoric0f4ce72009-03-05 23:01:01 +00002506 if (bdrv_key_required(bs)) {
2507 autostart = 0;
aliguoribb5fc202009-03-05 23:01:15 +00002508 if (is_hotplug) {
aliguori376253e2009-03-05 23:01:23 +00002509 monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb,
2510 dev);
aliguoribb5fc202009-03-05 23:01:15 +00002511 return 0;
aliguoric0f4ce72009-03-05 23:01:01 +00002512 }
2513 }
balrogf6d2a312007-06-10 19:21:04 +00002514 } else if (!strcmp(devname, "wacom-tablet")) {
2515 dev = usb_wacom_init();
balroga7954212008-01-14 03:41:02 +00002516 } else if (strstart(devname, "serial:", &p)) {
2517 dev = usb_serial_init(p);
aurel322e4d9fb2008-04-08 06:01:02 +00002518#ifdef CONFIG_BRLAPI
2519 } else if (!strcmp(devname, "braille")) {
2520 dev = usb_baum_init();
2521#endif
balrog6c9f8862008-07-17 20:47:13 +00002522 } else if (strstart(devname, "net:", &p)) {
balrog9ad97e62008-07-29 13:16:31 +00002523 int nic = nb_nics;
balrog6c9f8862008-07-17 20:47:13 +00002524
Jan Kiszka10ae5a72009-05-08 12:34:18 +02002525 if (net_client_init(NULL, "nic", p) < 0)
balrog6c9f8862008-07-17 20:47:13 +00002526 return -1;
balrog9ad97e62008-07-29 13:16:31 +00002527 nd_table[nic].model = "usb";
2528 dev = usb_net_init(&nd_table[nic]);
balrogdc72ac12008-11-09 00:04:26 +00002529 } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
2530 dev = usb_bt_init(devname[2] ? hci_init(p) :
2531 bt_new_hci(qemu_find_bt_vlan(0)));
bellarda594cfb2005-11-06 16:13:29 +00002532 } else {
2533 return -1;
2534 }
pbrook0d92ed32006-05-21 16:30:15 +00002535 if (!dev)
2536 return -1;
2537
aliguori4b096fc2008-08-21 19:28:55 +00002538 return usb_device_add_dev(dev);
bellarda594cfb2005-11-06 16:13:29 +00002539}
2540
aliguori1f3870a2008-08-21 19:27:48 +00002541int usb_device_del_addr(int bus_num, int addr)
bellarda594cfb2005-11-06 16:13:29 +00002542{
pbrook0d92ed32006-05-21 16:30:15 +00002543 USBPort *port;
2544 USBPort **lastp;
bellard059809e2006-07-19 18:06:15 +00002545 USBDevice *dev;
bellarda594cfb2005-11-06 16:13:29 +00002546
pbrook0d92ed32006-05-21 16:30:15 +00002547 if (!used_usb_ports)
bellarda594cfb2005-11-06 16:13:29 +00002548 return -1;
2549
bellarda594cfb2005-11-06 16:13:29 +00002550 if (bus_num != 0)
2551 return -1;
pbrook0d92ed32006-05-21 16:30:15 +00002552
2553 lastp = &used_usb_ports;
2554 port = used_usb_ports;
2555 while (port && port->dev->addr != addr) {
2556 lastp = &port->next;
2557 port = port->next;
bellarda594cfb2005-11-06 16:13:29 +00002558 }
pbrook0d92ed32006-05-21 16:30:15 +00002559
2560 if (!port)
bellarda594cfb2005-11-06 16:13:29 +00002561 return -1;
pbrook0d92ed32006-05-21 16:30:15 +00002562
bellard059809e2006-07-19 18:06:15 +00002563 dev = port->dev;
pbrook0d92ed32006-05-21 16:30:15 +00002564 *lastp = port->next;
2565 usb_attach(port, NULL);
bellard059809e2006-07-19 18:06:15 +00002566 dev->handle_destroy(dev);
pbrook0d92ed32006-05-21 16:30:15 +00002567 port->next = free_usb_ports;
2568 free_usb_ports = port;
bellarda594cfb2005-11-06 16:13:29 +00002569 return 0;
2570}
2571
aliguori1f3870a2008-08-21 19:27:48 +00002572static int usb_device_del(const char *devname)
2573{
2574 int bus_num, addr;
2575 const char *p;
2576
aliguori5d0c5752008-09-14 01:07:41 +00002577 if (strstart(devname, "host:", &p))
2578 return usb_host_device_close(p);
2579
aliguori1f3870a2008-08-21 19:27:48 +00002580 if (!used_usb_ports)
2581 return -1;
2582
2583 p = strchr(devname, '.');
2584 if (!p)
2585 return -1;
2586 bus_num = strtoul(devname, NULL, 0);
2587 addr = strtoul(p + 1, NULL, 0);
2588
2589 return usb_device_del_addr(bus_num, addr);
2590}
2591
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02002592static int usb_parse(const char *cmdline)
2593{
2594 return usb_device_add(cmdline, 0);
2595}
2596
aliguori376253e2009-03-05 23:01:23 +00002597void do_usb_add(Monitor *mon, const char *devname)
bellarda594cfb2005-11-06 16:13:29 +00002598{
aliguoric0f4ce72009-03-05 23:01:01 +00002599 usb_device_add(devname, 1);
bellarda594cfb2005-11-06 16:13:29 +00002600}
2601
aliguori376253e2009-03-05 23:01:23 +00002602void do_usb_del(Monitor *mon, const char *devname)
bellarda594cfb2005-11-06 16:13:29 +00002603{
aliguori4b096fc2008-08-21 19:28:55 +00002604 usb_device_del(devname);
bellarda594cfb2005-11-06 16:13:29 +00002605}
2606
aliguori376253e2009-03-05 23:01:23 +00002607void usb_info(Monitor *mon)
bellarda594cfb2005-11-06 16:13:29 +00002608{
2609 USBDevice *dev;
pbrook0d92ed32006-05-21 16:30:15 +00002610 USBPort *port;
bellarda594cfb2005-11-06 16:13:29 +00002611 const char *speed_str;
2612
pbrook0d92ed32006-05-21 16:30:15 +00002613 if (!usb_enabled) {
aliguori376253e2009-03-05 23:01:23 +00002614 monitor_printf(mon, "USB support not enabled\n");
bellarda594cfb2005-11-06 16:13:29 +00002615 return;
2616 }
2617
pbrook0d92ed32006-05-21 16:30:15 +00002618 for (port = used_usb_ports; port; port = port->next) {
2619 dev = port->dev;
2620 if (!dev)
2621 continue;
2622 switch(dev->speed) {
ths5fafdf22007-09-16 21:08:06 +00002623 case USB_SPEED_LOW:
2624 speed_str = "1.5";
pbrook0d92ed32006-05-21 16:30:15 +00002625 break;
ths5fafdf22007-09-16 21:08:06 +00002626 case USB_SPEED_FULL:
2627 speed_str = "12";
pbrook0d92ed32006-05-21 16:30:15 +00002628 break;
ths5fafdf22007-09-16 21:08:06 +00002629 case USB_SPEED_HIGH:
2630 speed_str = "480";
pbrook0d92ed32006-05-21 16:30:15 +00002631 break;
2632 default:
ths5fafdf22007-09-16 21:08:06 +00002633 speed_str = "?";
pbrook0d92ed32006-05-21 16:30:15 +00002634 break;
bellarda594cfb2005-11-06 16:13:29 +00002635 }
aliguori376253e2009-03-05 23:01:23 +00002636 monitor_printf(mon, " Device %d.%d, Speed %s Mb/s, Product %s\n",
2637 0, dev->addr, speed_str, dev->devname);
bellarda594cfb2005-11-06 16:13:29 +00002638 }
2639}
2640
bellardf7cce892004-12-08 22:21:25 +00002641/***********************************************************/
balrog201a51f2007-04-30 00:51:09 +00002642/* PCMCIA/Cardbus */
2643
2644static struct pcmcia_socket_entry_s {
Paul Brookbc24a222009-05-10 01:44:56 +01002645 PCMCIASocket *socket;
balrog201a51f2007-04-30 00:51:09 +00002646 struct pcmcia_socket_entry_s *next;
2647} *pcmcia_sockets = 0;
2648
Paul Brookbc24a222009-05-10 01:44:56 +01002649void pcmcia_socket_register(PCMCIASocket *socket)
balrog201a51f2007-04-30 00:51:09 +00002650{
2651 struct pcmcia_socket_entry_s *entry;
2652
2653 entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
2654 entry->socket = socket;
2655 entry->next = pcmcia_sockets;
2656 pcmcia_sockets = entry;
2657}
2658
Paul Brookbc24a222009-05-10 01:44:56 +01002659void pcmcia_socket_unregister(PCMCIASocket *socket)
balrog201a51f2007-04-30 00:51:09 +00002660{
2661 struct pcmcia_socket_entry_s *entry, **ptr;
2662
2663 ptr = &pcmcia_sockets;
2664 for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
2665 if (entry->socket == socket) {
2666 *ptr = entry->next;
2667 qemu_free(entry);
2668 }
2669}
2670
aliguori376253e2009-03-05 23:01:23 +00002671void pcmcia_info(Monitor *mon)
balrog201a51f2007-04-30 00:51:09 +00002672{
2673 struct pcmcia_socket_entry_s *iter;
aliguori376253e2009-03-05 23:01:23 +00002674
balrog201a51f2007-04-30 00:51:09 +00002675 if (!pcmcia_sockets)
aliguori376253e2009-03-05 23:01:23 +00002676 monitor_printf(mon, "No PCMCIA sockets\n");
balrog201a51f2007-04-30 00:51:09 +00002677
2678 for (iter = pcmcia_sockets; iter; iter = iter->next)
aliguori376253e2009-03-05 23:01:23 +00002679 monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
2680 iter->socket->attached ? iter->socket->card_string :
2681 "Empty");
balrog201a51f2007-04-30 00:51:09 +00002682}
2683
2684/***********************************************************/
aliguori3023f3322009-01-16 19:04:14 +00002685/* register display */
2686
aliguori7b5d76d2009-03-13 15:02:13 +00002687struct DisplayAllocator default_allocator = {
2688 defaultallocator_create_displaysurface,
2689 defaultallocator_resize_displaysurface,
2690 defaultallocator_free_displaysurface
2691};
2692
aliguori3023f3322009-01-16 19:04:14 +00002693void register_displaystate(DisplayState *ds)
2694{
2695 DisplayState **s;
2696 s = &display_state;
2697 while (*s != NULL)
2698 s = &(*s)->next;
2699 ds->next = NULL;
2700 *s = ds;
2701}
2702
2703DisplayState *get_displaystate(void)
2704{
2705 return display_state;
2706}
2707
aliguori7b5d76d2009-03-13 15:02:13 +00002708DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da)
2709{
2710 if(ds->allocator == &default_allocator) ds->allocator = da;
2711 return ds->allocator;
2712}
2713
ths2ff89792007-06-21 23:34:19 +00002714/* dumb display */
2715
aliguori8f391ab2009-01-19 16:34:10 +00002716static void dumb_display_init(void)
ths2ff89792007-06-21 23:34:19 +00002717{
aliguori8f391ab2009-01-19 16:34:10 +00002718 DisplayState *ds = qemu_mallocz(sizeof(DisplayState));
aliguori7b5d76d2009-03-13 15:02:13 +00002719 ds->allocator = &default_allocator;
2720 ds->surface = qemu_create_displaysurface(ds, 640, 480);
aliguori8f391ab2009-01-19 16:34:10 +00002721 register_displaystate(ds);
ths2ff89792007-06-21 23:34:19 +00002722}
2723
2724/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00002725/* I/O handling */
bellard0824d6f2003-06-24 13:42:40 +00002726
bellardc4b1fcc2004-03-14 21:44:30 +00002727typedef struct IOHandlerRecord {
2728 int fd;
bellard7c9d8e02005-11-15 22:16:05 +00002729 IOCanRWHandler *fd_read_poll;
2730 IOHandler *fd_read;
2731 IOHandler *fd_write;
thscafffd42007-02-28 21:59:44 +00002732 int deleted;
bellardc4b1fcc2004-03-14 21:44:30 +00002733 void *opaque;
2734 /* temporary data */
2735 struct pollfd *ufd;
bellard8a7ddc32004-03-31 19:00:16 +00002736 struct IOHandlerRecord *next;
bellardc4b1fcc2004-03-14 21:44:30 +00002737} IOHandlerRecord;
2738
bellard8a7ddc32004-03-31 19:00:16 +00002739static IOHandlerRecord *first_io_handler;
bellardc4b1fcc2004-03-14 21:44:30 +00002740
bellard7c9d8e02005-11-15 22:16:05 +00002741/* XXX: fd_read_poll should be suppressed, but an API change is
2742 necessary in the character devices to suppress fd_can_read(). */
ths5fafdf22007-09-16 21:08:06 +00002743int qemu_set_fd_handler2(int fd,
2744 IOCanRWHandler *fd_read_poll,
2745 IOHandler *fd_read,
2746 IOHandler *fd_write,
bellard7c9d8e02005-11-15 22:16:05 +00002747 void *opaque)
bellardb4608c02003-06-27 17:34:32 +00002748{
bellard8a7ddc32004-03-31 19:00:16 +00002749 IOHandlerRecord **pioh, *ioh;
2750
bellard7c9d8e02005-11-15 22:16:05 +00002751 if (!fd_read && !fd_write) {
2752 pioh = &first_io_handler;
2753 for(;;) {
2754 ioh = *pioh;
2755 if (ioh == NULL)
2756 break;
2757 if (ioh->fd == fd) {
thscafffd42007-02-28 21:59:44 +00002758 ioh->deleted = 1;
bellard7c9d8e02005-11-15 22:16:05 +00002759 break;
2760 }
2761 pioh = &ioh->next;
bellard8a7ddc32004-03-31 19:00:16 +00002762 }
bellard7c9d8e02005-11-15 22:16:05 +00002763 } else {
2764 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
2765 if (ioh->fd == fd)
2766 goto found;
2767 }
2768 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
bellard7c9d8e02005-11-15 22:16:05 +00002769 ioh->next = first_io_handler;
2770 first_io_handler = ioh;
2771 found:
2772 ioh->fd = fd;
2773 ioh->fd_read_poll = fd_read_poll;
2774 ioh->fd_read = fd_read;
2775 ioh->fd_write = fd_write;
2776 ioh->opaque = opaque;
thscafffd42007-02-28 21:59:44 +00002777 ioh->deleted = 0;
bellard8a7ddc32004-03-31 19:00:16 +00002778 }
bellard7c9d8e02005-11-15 22:16:05 +00002779 return 0;
2780}
2781
ths5fafdf22007-09-16 21:08:06 +00002782int qemu_set_fd_handler(int fd,
2783 IOHandler *fd_read,
2784 IOHandler *fd_write,
bellard7c9d8e02005-11-15 22:16:05 +00002785 void *opaque)
2786{
2787 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
bellardb4608c02003-06-27 17:34:32 +00002788}
2789
aliguori56f3a5d2008-10-31 18:07:17 +00002790#ifdef _WIN32
bellard8a7ddc32004-03-31 19:00:16 +00002791/***********************************************************/
bellardf3311102006-04-12 20:21:17 +00002792/* Polling handling */
2793
2794typedef struct PollingEntry {
2795 PollingFunc *func;
2796 void *opaque;
2797 struct PollingEntry *next;
2798} PollingEntry;
2799
2800static PollingEntry *first_polling_entry;
2801
2802int qemu_add_polling_cb(PollingFunc *func, void *opaque)
2803{
2804 PollingEntry **ppe, *pe;
2805 pe = qemu_mallocz(sizeof(PollingEntry));
bellardf3311102006-04-12 20:21:17 +00002806 pe->func = func;
2807 pe->opaque = opaque;
2808 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
2809 *ppe = pe;
2810 return 0;
2811}
2812
2813void qemu_del_polling_cb(PollingFunc *func, void *opaque)
2814{
2815 PollingEntry **ppe, *pe;
2816 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
2817 pe = *ppe;
2818 if (pe->func == func && pe->opaque == opaque) {
2819 *ppe = pe->next;
2820 qemu_free(pe);
2821 break;
2822 }
2823 }
2824}
2825
bellarda18e5242006-06-25 17:18:27 +00002826/***********************************************************/
2827/* Wait objects support */
2828typedef struct WaitObjects {
2829 int num;
2830 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
2831 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
2832 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
2833} WaitObjects;
2834
2835static WaitObjects wait_objects = {0};
ths3b46e622007-09-17 08:09:54 +00002836
bellarda18e5242006-06-25 17:18:27 +00002837int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
2838{
2839 WaitObjects *w = &wait_objects;
2840
2841 if (w->num >= MAXIMUM_WAIT_OBJECTS)
2842 return -1;
2843 w->events[w->num] = handle;
2844 w->func[w->num] = func;
2845 w->opaque[w->num] = opaque;
2846 w->num++;
2847 return 0;
2848}
2849
2850void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
2851{
2852 int i, found;
2853 WaitObjects *w = &wait_objects;
2854
2855 found = 0;
2856 for (i = 0; i < w->num; i++) {
2857 if (w->events[i] == handle)
2858 found = 1;
2859 if (found) {
2860 w->events[i] = w->events[i + 1];
2861 w->func[i] = w->func[i + 1];
2862 w->opaque[i] = w->opaque[i + 1];
ths3b46e622007-09-17 08:09:54 +00002863 }
bellarda18e5242006-06-25 17:18:27 +00002864 }
2865 if (found)
2866 w->num--;
2867}
2868#endif
2869
bellard8a7ddc32004-03-31 19:00:16 +00002870/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00002871/* ram save/restore */
2872
bellard8a7ddc32004-03-31 19:00:16 +00002873static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
2874{
2875 int v;
2876
2877 v = qemu_get_byte(f);
2878 switch(v) {
2879 case 0:
2880 if (qemu_get_buffer(f, buf, len) != len)
2881 return -EIO;
2882 break;
2883 case 1:
2884 v = qemu_get_byte(f);
2885 memset(buf, v, len);
2886 break;
2887 default:
2888 return -EINVAL;
2889 }
aliguori871d2f02008-10-13 03:07:56 +00002890
2891 if (qemu_file_has_error(f))
2892 return -EIO;
2893
bellard8a7ddc32004-03-31 19:00:16 +00002894 return 0;
2895}
2896
bellardc88676f2006-08-06 13:36:11 +00002897static int ram_load_v1(QEMUFile *f, void *opaque)
bellard8a7ddc32004-03-31 19:00:16 +00002898{
aurel3200f82b82008-04-27 21:12:55 +00002899 int ret;
2900 ram_addr_t i;
bellard8a7ddc32004-03-31 19:00:16 +00002901
pbrook94a6b542009-04-11 17:15:54 +00002902 if (qemu_get_be32(f) != last_ram_offset)
bellard8a7ddc32004-03-31 19:00:16 +00002903 return -EINVAL;
pbrook94a6b542009-04-11 17:15:54 +00002904 for(i = 0; i < last_ram_offset; i+= TARGET_PAGE_SIZE) {
pbrook5579c7f2009-04-11 14:47:08 +00002905 ret = ram_get_page(f, qemu_get_ram_ptr(i), TARGET_PAGE_SIZE);
bellard8a7ddc32004-03-31 19:00:16 +00002906 if (ret)
2907 return ret;
2908 }
2909 return 0;
2910}
2911
bellardc88676f2006-08-06 13:36:11 +00002912#define BDRV_HASH_BLOCK_SIZE 1024
2913#define IOBUF_SIZE 4096
2914#define RAM_CBLOCK_MAGIC 0xfabe
2915
bellardc88676f2006-08-06 13:36:11 +00002916typedef struct RamDecompressState {
2917 z_stream zstream;
2918 QEMUFile *f;
2919 uint8_t buf[IOBUF_SIZE];
2920} RamDecompressState;
2921
2922static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
2923{
2924 int ret;
2925 memset(s, 0, sizeof(*s));
2926 s->f = f;
2927 ret = inflateInit(&s->zstream);
2928 if (ret != Z_OK)
2929 return -1;
2930 return 0;
2931}
2932
2933static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
2934{
2935 int ret, clen;
2936
2937 s->zstream.avail_out = len;
2938 s->zstream.next_out = buf;
2939 while (s->zstream.avail_out > 0) {
2940 if (s->zstream.avail_in == 0) {
2941 if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
2942 return -1;
2943 clen = qemu_get_be16(s->f);
2944 if (clen > IOBUF_SIZE)
2945 return -1;
2946 qemu_get_buffer(s->f, s->buf, clen);
2947 s->zstream.avail_in = clen;
2948 s->zstream.next_in = s->buf;
2949 }
2950 ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
2951 if (ret != Z_OK && ret != Z_STREAM_END) {
2952 return -1;
2953 }
2954 }
2955 return 0;
2956}
2957
2958static void ram_decompress_close(RamDecompressState *s)
2959{
2960 inflateEnd(&s->zstream);
2961}
2962
aliguori475e4272008-10-06 20:21:51 +00002963#define RAM_SAVE_FLAG_FULL 0x01
2964#define RAM_SAVE_FLAG_COMPRESS 0x02
2965#define RAM_SAVE_FLAG_MEM_SIZE 0x04
2966#define RAM_SAVE_FLAG_PAGE 0x08
2967#define RAM_SAVE_FLAG_EOS 0x10
2968
2969static int is_dup_page(uint8_t *page, uint8_t ch)
bellardc88676f2006-08-06 13:36:11 +00002970{
aliguori475e4272008-10-06 20:21:51 +00002971 uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
2972 uint32_t *array = (uint32_t *)page;
2973 int i;
ths3b46e622007-09-17 08:09:54 +00002974
aliguori475e4272008-10-06 20:21:51 +00002975 for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
2976 if (array[i] != val)
2977 return 0;
bellardc88676f2006-08-06 13:36:11 +00002978 }
aliguori475e4272008-10-06 20:21:51 +00002979
2980 return 1;
bellardc88676f2006-08-06 13:36:11 +00002981}
2982
aliguori475e4272008-10-06 20:21:51 +00002983static int ram_save_block(QEMUFile *f)
2984{
2985 static ram_addr_t current_addr = 0;
2986 ram_addr_t saved_addr = current_addr;
2987 ram_addr_t addr = 0;
2988 int found = 0;
2989
pbrook94a6b542009-04-11 17:15:54 +00002990 while (addr < last_ram_offset) {
aliguori475e4272008-10-06 20:21:51 +00002991 if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
pbrook5579c7f2009-04-11 14:47:08 +00002992 uint8_t *p;
aliguori475e4272008-10-06 20:21:51 +00002993
2994 cpu_physical_memory_reset_dirty(current_addr,
2995 current_addr + TARGET_PAGE_SIZE,
2996 MIGRATION_DIRTY_FLAG);
2997
pbrook5579c7f2009-04-11 14:47:08 +00002998 p = qemu_get_ram_ptr(current_addr);
aliguori475e4272008-10-06 20:21:51 +00002999
pbrook5579c7f2009-04-11 14:47:08 +00003000 if (is_dup_page(p, *p)) {
aliguori475e4272008-10-06 20:21:51 +00003001 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
pbrook5579c7f2009-04-11 14:47:08 +00003002 qemu_put_byte(f, *p);
aliguori475e4272008-10-06 20:21:51 +00003003 } else {
3004 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
pbrook5579c7f2009-04-11 14:47:08 +00003005 qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003006 }
3007
3008 found = 1;
3009 break;
3010 }
3011 addr += TARGET_PAGE_SIZE;
pbrook94a6b542009-04-11 17:15:54 +00003012 current_addr = (saved_addr + addr) % last_ram_offset;
aliguori475e4272008-10-06 20:21:51 +00003013 }
3014
3015 return found;
3016}
3017
Glauber Costa9f9e28c2009-05-21 17:38:01 -04003018static uint64_t bytes_transferred = 0;
aliguori475e4272008-10-06 20:21:51 +00003019
3020static ram_addr_t ram_save_remaining(void)
3021{
3022 ram_addr_t addr;
3023 ram_addr_t count = 0;
3024
pbrook94a6b542009-04-11 17:15:54 +00003025 for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
aliguori475e4272008-10-06 20:21:51 +00003026 if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
3027 count++;
3028 }
3029
3030 return count;
3031}
3032
Glauber Costa9f9e28c2009-05-21 17:38:01 -04003033uint64_t ram_bytes_remaining(void)
3034{
3035 return ram_save_remaining() * TARGET_PAGE_SIZE;
3036}
3037
3038uint64_t ram_bytes_transferred(void)
3039{
3040 return bytes_transferred;
3041}
3042
3043uint64_t ram_bytes_total(void)
3044{
3045 return last_ram_offset;
3046}
3047
aliguori475e4272008-10-06 20:21:51 +00003048static int ram_save_live(QEMUFile *f, int stage, void *opaque)
3049{
3050 ram_addr_t addr;
Glauber Costaa0a3fd62009-05-28 15:22:57 -04003051 uint64_t bytes_transferred_last;
3052 double bwidth = 0;
3053 uint64_t expected_time = 0;
aliguori475e4272008-10-06 20:21:51 +00003054
Jan Kiszka9fa06382009-05-22 23:51:45 +02003055 if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
Jan Kiszkab0a46a32009-05-02 00:22:51 +02003056 qemu_file_set_error(f);
3057 return 0;
3058 }
3059
aliguori475e4272008-10-06 20:21:51 +00003060 if (stage == 1) {
3061 /* Make sure all dirty bits are set */
pbrook94a6b542009-04-11 17:15:54 +00003062 for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
aliguori475e4272008-10-06 20:21:51 +00003063 if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
3064 cpu_physical_memory_set_dirty(addr);
3065 }
Jan Kiszkab0a46a32009-05-02 00:22:51 +02003066
aliguori475e4272008-10-06 20:21:51 +00003067 /* Enable dirty memory tracking */
3068 cpu_physical_memory_set_dirty_tracking(1);
3069
pbrook94a6b542009-04-11 17:15:54 +00003070 qemu_put_be64(f, last_ram_offset | RAM_SAVE_FLAG_MEM_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003071 }
3072
Glauber Costaa0a3fd62009-05-28 15:22:57 -04003073 bytes_transferred_last = bytes_transferred;
3074 bwidth = get_clock();
3075
aliguori475e4272008-10-06 20:21:51 +00003076 while (!qemu_file_rate_limit(f)) {
3077 int ret;
3078
3079 ret = ram_save_block(f);
Glauber Costa9f9e28c2009-05-21 17:38:01 -04003080 bytes_transferred += ret * TARGET_PAGE_SIZE;
aliguori475e4272008-10-06 20:21:51 +00003081 if (ret == 0) /* no more blocks */
3082 break;
3083 }
3084
Glauber Costaa0a3fd62009-05-28 15:22:57 -04003085 bwidth = get_clock() - bwidth;
3086 bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
3087
3088 /* if we haven't transferred anything this round, force expected_time to a
3089 * a very high value, but without crashing */
3090 if (bwidth == 0)
3091 bwidth = 0.000001;
3092
aliguori475e4272008-10-06 20:21:51 +00003093 /* try transferring iterative blocks of memory */
3094
3095 if (stage == 3) {
aliguori475e4272008-10-06 20:21:51 +00003096
3097 /* flush all remaining blocks regardless of rate limiting */
Glauber Costa9f9e28c2009-05-21 17:38:01 -04003098 while (ram_save_block(f) != 0) {
3099 bytes_transferred += TARGET_PAGE_SIZE;
3100 }
aliguori8215e912009-04-05 19:30:55 +00003101 cpu_physical_memory_set_dirty_tracking(0);
aliguori475e4272008-10-06 20:21:51 +00003102 }
3103
3104 qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
3105
Glauber Costaa0a3fd62009-05-28 15:22:57 -04003106 expected_time = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
3107
3108 return (stage == 2) && (expected_time <= migrate_max_downtime());
aliguori475e4272008-10-06 20:21:51 +00003109}
3110
3111static int ram_load_dead(QEMUFile *f, void *opaque)
bellardc88676f2006-08-06 13:36:11 +00003112{
3113 RamDecompressState s1, *s = &s1;
3114 uint8_t buf[10];
aurel3200f82b82008-04-27 21:12:55 +00003115 ram_addr_t i;
bellardc88676f2006-08-06 13:36:11 +00003116
bellardc88676f2006-08-06 13:36:11 +00003117 if (ram_decompress_open(s, f) < 0)
3118 return -EINVAL;
pbrook94a6b542009-04-11 17:15:54 +00003119 for(i = 0; i < last_ram_offset; i+= BDRV_HASH_BLOCK_SIZE) {
bellardc88676f2006-08-06 13:36:11 +00003120 if (ram_decompress_buf(s, buf, 1) < 0) {
3121 fprintf(stderr, "Error while reading ram block header\n");
3122 goto error;
3123 }
3124 if (buf[0] == 0) {
pbrook5579c7f2009-04-11 14:47:08 +00003125 if (ram_decompress_buf(s, qemu_get_ram_ptr(i),
3126 BDRV_HASH_BLOCK_SIZE) < 0) {
aurel3200f82b82008-04-27 21:12:55 +00003127 fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
bellardc88676f2006-08-06 13:36:11 +00003128 goto error;
3129 }
aliguori475e4272008-10-06 20:21:51 +00003130 } else {
bellardc88676f2006-08-06 13:36:11 +00003131 error:
3132 printf("Error block header\n");
3133 return -EINVAL;
3134 }
3135 }
3136 ram_decompress_close(s);
aliguori475e4272008-10-06 20:21:51 +00003137
3138 return 0;
3139}
3140
3141static int ram_load(QEMUFile *f, void *opaque, int version_id)
3142{
3143 ram_addr_t addr;
3144 int flags;
3145
3146 if (version_id == 1)
3147 return ram_load_v1(f, opaque);
3148
3149 if (version_id == 2) {
pbrook94a6b542009-04-11 17:15:54 +00003150 if (qemu_get_be32(f) != last_ram_offset)
aliguori475e4272008-10-06 20:21:51 +00003151 return -EINVAL;
3152 return ram_load_dead(f, opaque);
3153 }
3154
3155 if (version_id != 3)
3156 return -EINVAL;
3157
3158 do {
3159 addr = qemu_get_be64(f);
3160
3161 flags = addr & ~TARGET_PAGE_MASK;
3162 addr &= TARGET_PAGE_MASK;
3163
3164 if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
pbrook94a6b542009-04-11 17:15:54 +00003165 if (addr != last_ram_offset)
aliguori475e4272008-10-06 20:21:51 +00003166 return -EINVAL;
3167 }
3168
3169 if (flags & RAM_SAVE_FLAG_FULL) {
3170 if (ram_load_dead(f, opaque) < 0)
3171 return -EINVAL;
3172 }
3173
3174 if (flags & RAM_SAVE_FLAG_COMPRESS) {
3175 uint8_t ch = qemu_get_byte(f);
Anthony Liguori779c6be2009-06-22 12:39:00 -05003176 memset(qemu_get_ram_ptr(addr), ch, TARGET_PAGE_SIZE);
3177#ifndef _WIN32
Anthony Liguori30868442009-06-17 16:46:12 -05003178 if (ch == 0 &&
3179 (!kvm_enabled() || kvm_has_sync_mmu())) {
3180 madvise(qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE, MADV_DONTNEED);
Anthony Liguori779c6be2009-06-22 12:39:00 -05003181 }
Anthony Liguori30868442009-06-17 16:46:12 -05003182#endif
aliguori475e4272008-10-06 20:21:51 +00003183 } else if (flags & RAM_SAVE_FLAG_PAGE)
pbrook5579c7f2009-04-11 14:47:08 +00003184 qemu_get_buffer(f, qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003185 } while (!(flags & RAM_SAVE_FLAG_EOS));
3186
bellardc88676f2006-08-06 13:36:11 +00003187 return 0;
3188}
3189
aliguori9e472e12008-10-08 19:50:24 +00003190void qemu_service_io(void)
3191{
aliguorid9f75a42009-04-24 18:03:11 +00003192 qemu_notify_event();
aliguori9e472e12008-10-08 19:50:24 +00003193}
3194
bellard8a7ddc32004-03-31 19:00:16 +00003195/***********************************************************/
bellard83f64092006-08-01 16:21:11 +00003196/* bottom halves (can be seen as timers which expire ASAP) */
3197
3198struct QEMUBH {
3199 QEMUBHFunc *cb;
3200 void *opaque;
3201 int scheduled;
aliguori1b435b12008-10-31 17:24:21 +00003202 int idle;
3203 int deleted;
bellard83f64092006-08-01 16:21:11 +00003204 QEMUBH *next;
3205};
3206
3207static QEMUBH *first_bh = NULL;
3208
3209QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
3210{
3211 QEMUBH *bh;
3212 bh = qemu_mallocz(sizeof(QEMUBH));
bellard83f64092006-08-01 16:21:11 +00003213 bh->cb = cb;
3214 bh->opaque = opaque;
aliguori1b435b12008-10-31 17:24:21 +00003215 bh->next = first_bh;
3216 first_bh = bh;
bellard83f64092006-08-01 16:21:11 +00003217 return bh;
3218}
3219
bellard6eb57332006-08-06 09:51:25 +00003220int qemu_bh_poll(void)
bellard83f64092006-08-01 16:21:11 +00003221{
aliguori1b435b12008-10-31 17:24:21 +00003222 QEMUBH *bh, **bhp;
bellard6eb57332006-08-06 09:51:25 +00003223 int ret;
bellard83f64092006-08-01 16:21:11 +00003224
bellard6eb57332006-08-06 09:51:25 +00003225 ret = 0;
aliguori1b435b12008-10-31 17:24:21 +00003226 for (bh = first_bh; bh; bh = bh->next) {
3227 if (!bh->deleted && bh->scheduled) {
3228 bh->scheduled = 0;
3229 if (!bh->idle)
3230 ret = 1;
3231 bh->idle = 0;
3232 bh->cb(bh->opaque);
3233 }
bellard83f64092006-08-01 16:21:11 +00003234 }
aliguori1b435b12008-10-31 17:24:21 +00003235
3236 /* remove deleted bhs */
3237 bhp = &first_bh;
3238 while (*bhp) {
3239 bh = *bhp;
3240 if (bh->deleted) {
3241 *bhp = bh->next;
3242 qemu_free(bh);
3243 } else
3244 bhp = &bh->next;
3245 }
3246
bellard6eb57332006-08-06 09:51:25 +00003247 return ret;
bellard83f64092006-08-01 16:21:11 +00003248}
3249
aliguori1b435b12008-10-31 17:24:21 +00003250void qemu_bh_schedule_idle(QEMUBH *bh)
3251{
3252 if (bh->scheduled)
3253 return;
3254 bh->scheduled = 1;
3255 bh->idle = 1;
3256}
3257
bellard83f64092006-08-01 16:21:11 +00003258void qemu_bh_schedule(QEMUBH *bh)
3259{
bellard83f64092006-08-01 16:21:11 +00003260 if (bh->scheduled)
3261 return;
3262 bh->scheduled = 1;
aliguori1b435b12008-10-31 17:24:21 +00003263 bh->idle = 0;
bellard83f64092006-08-01 16:21:11 +00003264 /* stop the currently executing CPU to execute the BH ASAP */
aliguorid9f75a42009-04-24 18:03:11 +00003265 qemu_notify_event();
bellard83f64092006-08-01 16:21:11 +00003266}
3267
3268void qemu_bh_cancel(QEMUBH *bh)
3269{
aliguori1b435b12008-10-31 17:24:21 +00003270 bh->scheduled = 0;
bellard83f64092006-08-01 16:21:11 +00003271}
3272
3273void qemu_bh_delete(QEMUBH *bh)
3274{
aliguori1b435b12008-10-31 17:24:21 +00003275 bh->scheduled = 0;
3276 bh->deleted = 1;
bellard83f64092006-08-01 16:21:11 +00003277}
3278
aliguori56f3a5d2008-10-31 18:07:17 +00003279static void qemu_bh_update_timeout(int *timeout)
3280{
3281 QEMUBH *bh;
3282
3283 for (bh = first_bh; bh; bh = bh->next) {
3284 if (!bh->deleted && bh->scheduled) {
3285 if (bh->idle) {
3286 /* idle bottom halves will be polled at least
3287 * every 10ms */
3288 *timeout = MIN(10, *timeout);
3289 } else {
3290 /* non-idle bottom halves will be executed
3291 * immediately */
3292 *timeout = 0;
3293 break;
3294 }
3295 }
3296 }
3297}
3298
bellard83f64092006-08-01 16:21:11 +00003299/***********************************************************/
bellardcc1daa42005-06-05 14:49:17 +00003300/* machine registration */
3301
blueswir1bdaf78e2008-10-04 07:24:27 +00003302static QEMUMachine *first_machine = NULL;
aliguori6f338c32009-02-11 15:21:54 +00003303QEMUMachine *current_machine = NULL;
bellardcc1daa42005-06-05 14:49:17 +00003304
3305int qemu_register_machine(QEMUMachine *m)
3306{
3307 QEMUMachine **pm;
3308 pm = &first_machine;
3309 while (*pm != NULL)
3310 pm = &(*pm)->next;
3311 m->next = NULL;
3312 *pm = m;
3313 return 0;
3314}
3315
pbrook9596ebb2007-11-18 01:44:38 +00003316static QEMUMachine *find_machine(const char *name)
bellardcc1daa42005-06-05 14:49:17 +00003317{
3318 QEMUMachine *m;
3319
3320 for(m = first_machine; m != NULL; m = m->next) {
3321 if (!strcmp(m->name, name))
3322 return m;
Mark McLoughlin3f6599e2009-07-22 10:02:50 +01003323 if (m->alias && !strcmp(m->alias, name))
3324 return m;
bellardcc1daa42005-06-05 14:49:17 +00003325 }
3326 return NULL;
3327}
3328
Anthony Liguori0c257432009-05-21 20:41:01 -05003329static QEMUMachine *find_default_machine(void)
3330{
3331 QEMUMachine *m;
3332
3333 for(m = first_machine; m != NULL; m = m->next) {
3334 if (m->is_default) {
3335 return m;
3336 }
3337 }
3338 return NULL;
3339}
3340
bellardcc1daa42005-06-05 14:49:17 +00003341/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00003342/* main execution loop */
3343
pbrook9596ebb2007-11-18 01:44:38 +00003344static void gui_update(void *opaque)
bellard8a7ddc32004-03-31 19:00:16 +00003345{
aliguori7d957bd2009-01-15 22:14:11 +00003346 uint64_t interval = GUI_REFRESH_INTERVAL;
ths740733b2007-06-08 01:57:56 +00003347 DisplayState *ds = opaque;
aliguori7d957bd2009-01-15 22:14:11 +00003348 DisplayChangeListener *dcl = ds->listeners;
3349
3350 dpy_refresh(ds);
3351
3352 while (dcl != NULL) {
3353 if (dcl->gui_timer_interval &&
3354 dcl->gui_timer_interval < interval)
3355 interval = dcl->gui_timer_interval;
3356 dcl = dcl->next;
3357 }
3358 qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock(rt_clock));
bellard8a7ddc32004-03-31 19:00:16 +00003359}
3360
blueswir19043b622009-01-21 19:28:13 +00003361static void nographic_update(void *opaque)
3362{
3363 uint64_t interval = GUI_REFRESH_INTERVAL;
3364
3365 qemu_mod_timer(nographic_timer, interval + qemu_get_clock(rt_clock));
3366}
3367
bellard0bd48852005-11-11 00:00:47 +00003368struct vm_change_state_entry {
3369 VMChangeStateHandler *cb;
3370 void *opaque;
3371 LIST_ENTRY (vm_change_state_entry) entries;
3372};
3373
3374static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
3375
3376VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
3377 void *opaque)
3378{
3379 VMChangeStateEntry *e;
3380
3381 e = qemu_mallocz(sizeof (*e));
bellard0bd48852005-11-11 00:00:47 +00003382
3383 e->cb = cb;
3384 e->opaque = opaque;
3385 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
3386 return e;
3387}
3388
3389void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
3390{
3391 LIST_REMOVE (e, entries);
3392 qemu_free (e);
3393}
3394
aliguori9781e042009-01-22 17:15:29 +00003395static void vm_state_notify(int running, int reason)
bellard0bd48852005-11-11 00:00:47 +00003396{
3397 VMChangeStateEntry *e;
3398
3399 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
aliguori9781e042009-01-22 17:15:29 +00003400 e->cb(e->opaque, running, reason);
bellard0bd48852005-11-11 00:00:47 +00003401 }
3402}
3403
aliguorid6dc3d42009-04-24 18:04:07 +00003404static void resume_all_vcpus(void);
3405static void pause_all_vcpus(void);
3406
bellard8a7ddc32004-03-31 19:00:16 +00003407void vm_start(void)
3408{
3409 if (!vm_running) {
3410 cpu_enable_ticks();
3411 vm_running = 1;
aliguori9781e042009-01-22 17:15:29 +00003412 vm_state_notify(1, 0);
thsefe75412007-08-24 01:36:32 +00003413 qemu_rearm_alarm_timer(alarm_timer);
aliguorid6dc3d42009-04-24 18:04:07 +00003414 resume_all_vcpus();
bellard8a7ddc32004-03-31 19:00:16 +00003415 }
3416}
3417
bellardbb0c6722004-06-20 12:37:32 +00003418/* reset/shutdown handler */
3419
3420typedef struct QEMUResetEntry {
Jan Kiszka55ddfe82009-07-02 00:19:02 +02003421 TAILQ_ENTRY(QEMUResetEntry) entry;
bellardbb0c6722004-06-20 12:37:32 +00003422 QEMUResetHandler *func;
3423 void *opaque;
bellardbb0c6722004-06-20 12:37:32 +00003424} QEMUResetEntry;
3425
Jan Kiszka55ddfe82009-07-02 00:19:02 +02003426static TAILQ_HEAD(reset_handlers, QEMUResetEntry) reset_handlers =
3427 TAILQ_HEAD_INITIALIZER(reset_handlers);
bellardbb0c6722004-06-20 12:37:32 +00003428static int reset_requested;
3429static int shutdown_requested;
bellard34751872005-07-02 14:31:34 +00003430static int powerdown_requested;
aliguorie5689022009-04-24 18:03:54 +00003431static int debug_requested;
aliguori6e29f5d2009-04-24 18:04:02 +00003432static int vmstop_requested;
bellardbb0c6722004-06-20 12:37:32 +00003433
aurel32cf7a2fe2008-03-18 06:53:05 +00003434int qemu_shutdown_requested(void)
3435{
3436 int r = shutdown_requested;
3437 shutdown_requested = 0;
3438 return r;
3439}
3440
3441int qemu_reset_requested(void)
3442{
3443 int r = reset_requested;
3444 reset_requested = 0;
3445 return r;
3446}
3447
3448int qemu_powerdown_requested(void)
3449{
3450 int r = powerdown_requested;
3451 powerdown_requested = 0;
3452 return r;
3453}
3454
aliguorie5689022009-04-24 18:03:54 +00003455static int qemu_debug_requested(void)
3456{
3457 int r = debug_requested;
3458 debug_requested = 0;
3459 return r;
3460}
3461
aliguori6e29f5d2009-04-24 18:04:02 +00003462static int qemu_vmstop_requested(void)
3463{
3464 int r = vmstop_requested;
3465 vmstop_requested = 0;
3466 return r;
3467}
3468
3469static void do_vm_stop(int reason)
3470{
3471 if (vm_running) {
3472 cpu_disable_ticks();
3473 vm_running = 0;
aliguorid6dc3d42009-04-24 18:04:07 +00003474 pause_all_vcpus();
aliguori6e29f5d2009-04-24 18:04:02 +00003475 vm_state_notify(0, reason);
3476 }
3477}
3478
Jan Kiszkaa08d4362009-06-27 09:25:07 +02003479void qemu_register_reset(QEMUResetHandler *func, void *opaque)
bellardbb0c6722004-06-20 12:37:32 +00003480{
Jan Kiszka55ddfe82009-07-02 00:19:02 +02003481 QEMUResetEntry *re = qemu_mallocz(sizeof(QEMUResetEntry));
bellardbb0c6722004-06-20 12:37:32 +00003482
bellardbb0c6722004-06-20 12:37:32 +00003483 re->func = func;
3484 re->opaque = opaque;
Jan Kiszka55ddfe82009-07-02 00:19:02 +02003485 TAILQ_INSERT_TAIL(&reset_handlers, re, entry);
bellardbb0c6722004-06-20 12:37:32 +00003486}
3487
Jan Kiszkadda9b292009-07-02 00:19:02 +02003488void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
bellardbb0c6722004-06-20 12:37:32 +00003489{
3490 QEMUResetEntry *re;
3491
Jan Kiszka55ddfe82009-07-02 00:19:02 +02003492 TAILQ_FOREACH(re, &reset_handlers, entry) {
Jan Kiszkadda9b292009-07-02 00:19:02 +02003493 if (re->func == func && re->opaque == opaque) {
3494 TAILQ_REMOVE(&reset_handlers, re, entry);
3495 qemu_free(re);
3496 return;
3497 }
3498 }
3499}
3500
3501void qemu_system_reset(void)
3502{
3503 QEMUResetEntry *re, *nre;
3504
3505 /* reset all devices */
3506 TAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
bellardbb0c6722004-06-20 12:37:32 +00003507 re->func(re->opaque);
3508 }
3509}
3510
3511void qemu_system_reset_request(void)
3512{
bellardd1beab82006-10-02 19:44:22 +00003513 if (no_reboot) {
3514 shutdown_requested = 1;
3515 } else {
3516 reset_requested = 1;
3517 }
aliguorid9f75a42009-04-24 18:03:11 +00003518 qemu_notify_event();
bellardbb0c6722004-06-20 12:37:32 +00003519}
3520
3521void qemu_system_shutdown_request(void)
3522{
3523 shutdown_requested = 1;
aliguorid9f75a42009-04-24 18:03:11 +00003524 qemu_notify_event();
bellardbb0c6722004-06-20 12:37:32 +00003525}
3526
bellard34751872005-07-02 14:31:34 +00003527void qemu_system_powerdown_request(void)
3528{
3529 powerdown_requested = 1;
aliguorid9f75a42009-04-24 18:03:11 +00003530 qemu_notify_event();
3531}
3532
aliguorid6dc3d42009-04-24 18:04:07 +00003533#ifdef CONFIG_IOTHREAD
3534static void qemu_system_vmstop_request(int reason)
aliguorid9f75a42009-04-24 18:03:11 +00003535{
aliguorid6dc3d42009-04-24 18:04:07 +00003536 vmstop_requested = reason;
3537 qemu_notify_event();
bellardbb0c6722004-06-20 12:37:32 +00003538}
aliguorid6dc3d42009-04-24 18:04:07 +00003539#endif
bellardbb0c6722004-06-20 12:37:32 +00003540
aliguori50317c72009-04-24 18:03:29 +00003541#ifndef _WIN32
3542static int io_thread_fd = -1;
3543
3544static void qemu_event_increment(void)
3545{
3546 static const char byte = 0;
3547
3548 if (io_thread_fd == -1)
3549 return;
3550
3551 write(io_thread_fd, &byte, sizeof(byte));
3552}
3553
3554static void qemu_event_read(void *opaque)
3555{
3556 int fd = (unsigned long)opaque;
3557 ssize_t len;
3558
3559 /* Drain the notify pipe */
3560 do {
3561 char buffer[512];
3562 len = read(fd, buffer, sizeof(buffer));
3563 } while ((len == -1 && errno == EINTR) || len > 0);
3564}
3565
3566static int qemu_event_init(void)
3567{
3568 int err;
3569 int fds[2];
3570
3571 err = pipe(fds);
3572 if (err == -1)
3573 return -errno;
3574
3575 err = fcntl_setfl(fds[0], O_NONBLOCK);
3576 if (err < 0)
3577 goto fail;
3578
3579 err = fcntl_setfl(fds[1], O_NONBLOCK);
3580 if (err < 0)
3581 goto fail;
3582
3583 qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL,
3584 (void *)(unsigned long)fds[0]);
3585
3586 io_thread_fd = fds[1];
Jan Kiszkaa7e21212009-04-29 18:38:28 +00003587 return 0;
3588
aliguori50317c72009-04-24 18:03:29 +00003589fail:
3590 close(fds[0]);
3591 close(fds[1]);
3592 return err;
3593}
3594#else
3595HANDLE qemu_event_handle;
3596
3597static void dummy_event_handler(void *opaque)
3598{
3599}
3600
3601static int qemu_event_init(void)
3602{
3603 qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
3604 if (!qemu_event_handle) {
3605 perror("Failed CreateEvent");
3606 return -1;
3607 }
3608 qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL);
3609 return 0;
3610}
3611
3612static void qemu_event_increment(void)
3613{
3614 SetEvent(qemu_event_handle);
3615}
3616#endif
3617
aliguorid6dc3d42009-04-24 18:04:07 +00003618static int cpu_can_run(CPUState *env)
3619{
3620 if (env->stop)
3621 return 0;
3622 if (env->stopped)
3623 return 0;
3624 return 1;
3625}
3626
3627#ifndef CONFIG_IOTHREAD
aliguori3fcf7b62009-04-24 18:03:25 +00003628static int qemu_init_main_loop(void)
3629{
aliguori50317c72009-04-24 18:03:29 +00003630 return qemu_event_init();
aliguori3fcf7b62009-04-24 18:03:25 +00003631}
3632
aliguori0bf46a42009-04-24 18:03:41 +00003633void qemu_init_vcpu(void *_env)
3634{
3635 CPUState *env = _env;
3636
3637 if (kvm_enabled())
3638 kvm_init_vcpu(env);
Andre Przywaradc6b1c02009-08-19 15:42:40 +02003639 env->nr_cores = smp_cores;
3640 env->nr_threads = smp_threads;
aliguori0bf46a42009-04-24 18:03:41 +00003641 return;
3642}
3643
aliguori8edac962009-04-24 18:03:45 +00003644int qemu_cpu_self(void *env)
3645{
3646 return 1;
3647}
3648
aliguorid6dc3d42009-04-24 18:04:07 +00003649static void resume_all_vcpus(void)
3650{
3651}
3652
3653static void pause_all_vcpus(void)
3654{
3655}
3656
aliguori8edac962009-04-24 18:03:45 +00003657void qemu_cpu_kick(void *env)
3658{
3659 return;
3660}
3661
aliguorid6dc3d42009-04-24 18:04:07 +00003662void qemu_notify_event(void)
3663{
3664 CPUState *env = cpu_single_env;
3665
3666 if (env) {
3667 cpu_exit(env);
Anthony Liguori4a1418e2009-08-10 17:07:24 -05003668 }
aliguorid6dc3d42009-04-24 18:04:07 +00003669}
3670
aliguori48708522009-04-24 18:03:49 +00003671#define qemu_mutex_lock_iothread() do { } while (0)
3672#define qemu_mutex_unlock_iothread() do { } while (0)
3673
aliguori6e29f5d2009-04-24 18:04:02 +00003674void vm_stop(int reason)
3675{
3676 do_vm_stop(reason);
3677}
3678
aliguorid6dc3d42009-04-24 18:04:07 +00003679#else /* CONFIG_IOTHREAD */
3680
3681#include "qemu-thread.h"
3682
3683QemuMutex qemu_global_mutex;
3684static QemuMutex qemu_fair_mutex;
3685
3686static QemuThread io_thread;
3687
3688static QemuThread *tcg_cpu_thread;
3689static QemuCond *tcg_halt_cond;
3690
3691static int qemu_system_ready;
3692/* cpu creation */
3693static QemuCond qemu_cpu_cond;
3694/* system init */
3695static QemuCond qemu_system_cond;
3696static QemuCond qemu_pause_cond;
3697
3698static void block_io_signals(void);
3699static void unblock_io_signals(void);
3700static int tcg_has_work(void);
3701
3702static int qemu_init_main_loop(void)
3703{
3704 int ret;
3705
3706 ret = qemu_event_init();
3707 if (ret)
3708 return ret;
3709
3710 qemu_cond_init(&qemu_pause_cond);
3711 qemu_mutex_init(&qemu_fair_mutex);
3712 qemu_mutex_init(&qemu_global_mutex);
3713 qemu_mutex_lock(&qemu_global_mutex);
3714
3715 unblock_io_signals();
3716 qemu_thread_self(&io_thread);
3717
3718 return 0;
3719}
3720
3721static void qemu_wait_io_event(CPUState *env)
3722{
3723 while (!tcg_has_work())
3724 qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000);
3725
3726 qemu_mutex_unlock(&qemu_global_mutex);
3727
3728 /*
3729 * Users of qemu_global_mutex can be starved, having no chance
3730 * to acquire it since this path will get to it first.
3731 * So use another lock to provide fairness.
3732 */
3733 qemu_mutex_lock(&qemu_fair_mutex);
3734 qemu_mutex_unlock(&qemu_fair_mutex);
3735
3736 qemu_mutex_lock(&qemu_global_mutex);
3737 if (env->stop) {
3738 env->stop = 0;
3739 env->stopped = 1;
3740 qemu_cond_signal(&qemu_pause_cond);
3741 }
3742}
3743
3744static int qemu_cpu_exec(CPUState *env);
3745
3746static void *kvm_cpu_thread_fn(void *arg)
3747{
3748 CPUState *env = arg;
3749
3750 block_io_signals();
3751 qemu_thread_self(env->thread);
3752
3753 /* signal CPU creation */
3754 qemu_mutex_lock(&qemu_global_mutex);
3755 env->created = 1;
3756 qemu_cond_signal(&qemu_cpu_cond);
3757
3758 /* and wait for machine initialization */
3759 while (!qemu_system_ready)
3760 qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100);
3761
3762 while (1) {
3763 if (cpu_can_run(env))
3764 qemu_cpu_exec(env);
3765 qemu_wait_io_event(env);
3766 }
3767
3768 return NULL;
3769}
3770
3771static void tcg_cpu_exec(void);
3772
3773static void *tcg_cpu_thread_fn(void *arg)
3774{
3775 CPUState *env = arg;
3776
3777 block_io_signals();
3778 qemu_thread_self(env->thread);
3779
3780 /* signal CPU creation */
3781 qemu_mutex_lock(&qemu_global_mutex);
3782 for (env = first_cpu; env != NULL; env = env->next_cpu)
3783 env->created = 1;
3784 qemu_cond_signal(&qemu_cpu_cond);
3785
3786 /* and wait for machine initialization */
3787 while (!qemu_system_ready)
3788 qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100);
3789
3790 while (1) {
3791 tcg_cpu_exec();
3792 qemu_wait_io_event(cur_cpu);
3793 }
3794
3795 return NULL;
3796}
3797
3798void qemu_cpu_kick(void *_env)
3799{
3800 CPUState *env = _env;
3801 qemu_cond_broadcast(env->halt_cond);
3802 if (kvm_enabled())
3803 qemu_thread_signal(env->thread, SIGUSR1);
3804}
3805
3806int qemu_cpu_self(void *env)
3807{
3808 return (cpu_single_env != NULL);
3809}
3810
3811static void cpu_signal(int sig)
3812{
3813 if (cpu_single_env)
3814 cpu_exit(cpu_single_env);
3815}
3816
3817static void block_io_signals(void)
3818{
3819 sigset_t set;
3820 struct sigaction sigact;
3821
3822 sigemptyset(&set);
3823 sigaddset(&set, SIGUSR2);
3824 sigaddset(&set, SIGIO);
3825 sigaddset(&set, SIGALRM);
3826 pthread_sigmask(SIG_BLOCK, &set, NULL);
3827
3828 sigemptyset(&set);
3829 sigaddset(&set, SIGUSR1);
3830 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
3831
3832 memset(&sigact, 0, sizeof(sigact));
3833 sigact.sa_handler = cpu_signal;
3834 sigaction(SIGUSR1, &sigact, NULL);
3835}
3836
3837static void unblock_io_signals(void)
3838{
3839 sigset_t set;
3840
3841 sigemptyset(&set);
3842 sigaddset(&set, SIGUSR2);
3843 sigaddset(&set, SIGIO);
3844 sigaddset(&set, SIGALRM);
3845 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
3846
3847 sigemptyset(&set);
3848 sigaddset(&set, SIGUSR1);
3849 pthread_sigmask(SIG_BLOCK, &set, NULL);
3850}
3851
3852static void qemu_signal_lock(unsigned int msecs)
3853{
3854 qemu_mutex_lock(&qemu_fair_mutex);
3855
3856 while (qemu_mutex_trylock(&qemu_global_mutex)) {
3857 qemu_thread_signal(tcg_cpu_thread, SIGUSR1);
3858 if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
3859 break;
3860 }
3861 qemu_mutex_unlock(&qemu_fair_mutex);
3862}
3863
3864static void qemu_mutex_lock_iothread(void)
3865{
3866 if (kvm_enabled()) {
3867 qemu_mutex_lock(&qemu_fair_mutex);
3868 qemu_mutex_lock(&qemu_global_mutex);
3869 qemu_mutex_unlock(&qemu_fair_mutex);
3870 } else
3871 qemu_signal_lock(100);
3872}
3873
3874static void qemu_mutex_unlock_iothread(void)
3875{
3876 qemu_mutex_unlock(&qemu_global_mutex);
3877}
3878
3879static int all_vcpus_paused(void)
3880{
3881 CPUState *penv = first_cpu;
3882
3883 while (penv) {
3884 if (!penv->stopped)
3885 return 0;
3886 penv = (CPUState *)penv->next_cpu;
3887 }
3888
3889 return 1;
3890}
3891
3892static void pause_all_vcpus(void)
3893{
3894 CPUState *penv = first_cpu;
3895
3896 while (penv) {
3897 penv->stop = 1;
3898 qemu_thread_signal(penv->thread, SIGUSR1);
3899 qemu_cpu_kick(penv);
3900 penv = (CPUState *)penv->next_cpu;
3901 }
3902
3903 while (!all_vcpus_paused()) {
3904 qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100);
3905 penv = first_cpu;
3906 while (penv) {
3907 qemu_thread_signal(penv->thread, SIGUSR1);
3908 penv = (CPUState *)penv->next_cpu;
3909 }
3910 }
3911}
3912
3913static void resume_all_vcpus(void)
3914{
3915 CPUState *penv = first_cpu;
3916
3917 while (penv) {
3918 penv->stop = 0;
3919 penv->stopped = 0;
3920 qemu_thread_signal(penv->thread, SIGUSR1);
3921 qemu_cpu_kick(penv);
3922 penv = (CPUState *)penv->next_cpu;
3923 }
3924}
3925
3926static void tcg_init_vcpu(void *_env)
3927{
3928 CPUState *env = _env;
3929 /* share a single thread for all cpus with TCG */
3930 if (!tcg_cpu_thread) {
3931 env->thread = qemu_mallocz(sizeof(QemuThread));
3932 env->halt_cond = qemu_mallocz(sizeof(QemuCond));
3933 qemu_cond_init(env->halt_cond);
3934 qemu_thread_create(env->thread, tcg_cpu_thread_fn, env);
3935 while (env->created == 0)
3936 qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100);
3937 tcg_cpu_thread = env->thread;
3938 tcg_halt_cond = env->halt_cond;
3939 } else {
3940 env->thread = tcg_cpu_thread;
3941 env->halt_cond = tcg_halt_cond;
3942 }
3943}
3944
3945static void kvm_start_vcpu(CPUState *env)
3946{
3947 kvm_init_vcpu(env);
3948 env->thread = qemu_mallocz(sizeof(QemuThread));
3949 env->halt_cond = qemu_mallocz(sizeof(QemuCond));
3950 qemu_cond_init(env->halt_cond);
3951 qemu_thread_create(env->thread, kvm_cpu_thread_fn, env);
3952 while (env->created == 0)
3953 qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100);
3954}
3955
3956void qemu_init_vcpu(void *_env)
3957{
3958 CPUState *env = _env;
3959
3960 if (kvm_enabled())
3961 kvm_start_vcpu(env);
3962 else
3963 tcg_init_vcpu(env);
Andre Przywaradc6b1c02009-08-19 15:42:40 +02003964 env->nr_cores = smp_cores;
3965 env->nr_threads = smp_threads;
aliguorid6dc3d42009-04-24 18:04:07 +00003966}
3967
3968void qemu_notify_event(void)
3969{
3970 qemu_event_increment();
3971}
3972
3973void vm_stop(int reason)
3974{
3975 QemuThread me;
3976 qemu_thread_self(&me);
3977
3978 if (!qemu_thread_equal(&me, &io_thread)) {
3979 qemu_system_vmstop_request(reason);
3980 /*
3981 * FIXME: should not return to device code in case
3982 * vm_stop() has been requested.
3983 */
3984 if (cpu_single_env) {
3985 cpu_exit(cpu_single_env);
3986 cpu_single_env->stop = 1;
3987 }
3988 return;
3989 }
3990 do_vm_stop(reason);
3991}
3992
3993#endif
3994
3995
ths877cf882007-04-18 18:11:47 +00003996#ifdef _WIN32
blueswir169d64512008-12-07 19:30:18 +00003997static void host_main_loop_wait(int *timeout)
aliguori56f3a5d2008-10-31 18:07:17 +00003998{
3999 int ret, ret2, i;
bellardf3311102006-04-12 20:21:17 +00004000 PollingEntry *pe;
bellardc4b1fcc2004-03-14 21:44:30 +00004001
bellardf3311102006-04-12 20:21:17 +00004002
4003 /* XXX: need to suppress polling by better using win32 events */
4004 ret = 0;
4005 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
4006 ret |= pe->func(pe->opaque);
4007 }
thse6b1e552007-04-18 17:56:02 +00004008 if (ret == 0) {
bellarda18e5242006-06-25 17:18:27 +00004009 int err;
4010 WaitObjects *w = &wait_objects;
ths3b46e622007-09-17 08:09:54 +00004011
aliguori56f3a5d2008-10-31 18:07:17 +00004012 ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
bellarda18e5242006-06-25 17:18:27 +00004013 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
4014 if (w->func[ret - WAIT_OBJECT_0])
4015 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
ths3b46e622007-09-17 08:09:54 +00004016
ths5fafdf22007-09-16 21:08:06 +00004017 /* Check for additional signaled events */
thse6b1e552007-04-18 17:56:02 +00004018 for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
ths3b46e622007-09-17 08:09:54 +00004019
thse6b1e552007-04-18 17:56:02 +00004020 /* Check if event is signaled */
4021 ret2 = WaitForSingleObject(w->events[i], 0);
4022 if(ret2 == WAIT_OBJECT_0) {
4023 if (w->func[i])
4024 w->func[i](w->opaque[i]);
4025 } else if (ret2 == WAIT_TIMEOUT) {
4026 } else {
4027 err = GetLastError();
4028 fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
ths3b46e622007-09-17 08:09:54 +00004029 }
4030 }
bellarda18e5242006-06-25 17:18:27 +00004031 } else if (ret == WAIT_TIMEOUT) {
4032 } else {
4033 err = GetLastError();
thse6b1e552007-04-18 17:56:02 +00004034 fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
bellarda18e5242006-06-25 17:18:27 +00004035 }
bellardf3311102006-04-12 20:21:17 +00004036 }
aliguori56f3a5d2008-10-31 18:07:17 +00004037
4038 *timeout = 0;
4039}
4040#else
blueswir169d64512008-12-07 19:30:18 +00004041static void host_main_loop_wait(int *timeout)
aliguori56f3a5d2008-10-31 18:07:17 +00004042{
4043}
bellardfd1dff42006-02-01 21:29:26 +00004044#endif
aliguori56f3a5d2008-10-31 18:07:17 +00004045
4046void main_loop_wait(int timeout)
4047{
4048 IOHandlerRecord *ioh;
4049 fd_set rfds, wfds, xfds;
4050 int ret, nfds;
4051 struct timeval tv;
4052
4053 qemu_bh_update_timeout(&timeout);
4054
4055 host_main_loop_wait(&timeout);
4056
bellardfd1dff42006-02-01 21:29:26 +00004057 /* poll any events */
4058 /* XXX: separate device handlers from system ones */
aliguori6abfbd72008-11-05 20:49:37 +00004059 nfds = -1;
bellardfd1dff42006-02-01 21:29:26 +00004060 FD_ZERO(&rfds);
4061 FD_ZERO(&wfds);
bellarde0356492006-05-01 13:33:02 +00004062 FD_ZERO(&xfds);
bellardfd1dff42006-02-01 21:29:26 +00004063 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
thscafffd42007-02-28 21:59:44 +00004064 if (ioh->deleted)
4065 continue;
bellardfd1dff42006-02-01 21:29:26 +00004066 if (ioh->fd_read &&
4067 (!ioh->fd_read_poll ||
4068 ioh->fd_read_poll(ioh->opaque) != 0)) {
4069 FD_SET(ioh->fd, &rfds);
4070 if (ioh->fd > nfds)
4071 nfds = ioh->fd;
4072 }
4073 if (ioh->fd_write) {
4074 FD_SET(ioh->fd, &wfds);
4075 if (ioh->fd > nfds)
4076 nfds = ioh->fd;
4077 }
4078 }
ths3b46e622007-09-17 08:09:54 +00004079
aliguori56f3a5d2008-10-31 18:07:17 +00004080 tv.tv_sec = timeout / 1000;
4081 tv.tv_usec = (timeout % 1000) * 1000;
4082
Jan Kiszkad918f232009-06-24 14:42:30 +02004083 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
4084
aliguori48708522009-04-24 18:03:49 +00004085 qemu_mutex_unlock_iothread();
bellarde0356492006-05-01 13:33:02 +00004086 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
aliguori48708522009-04-24 18:03:49 +00004087 qemu_mutex_lock_iothread();
bellardfd1dff42006-02-01 21:29:26 +00004088 if (ret > 0) {
thscafffd42007-02-28 21:59:44 +00004089 IOHandlerRecord **pioh;
4090
4091 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
ths6ab43fd2007-08-25 01:34:19 +00004092 if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
bellardfd1dff42006-02-01 21:29:26 +00004093 ioh->fd_read(ioh->opaque);
bellardc4b1fcc2004-03-14 21:44:30 +00004094 }
ths6ab43fd2007-08-25 01:34:19 +00004095 if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
bellardfd1dff42006-02-01 21:29:26 +00004096 ioh->fd_write(ioh->opaque);
bellardb4608c02003-06-27 17:34:32 +00004097 }
4098 }
thscafffd42007-02-28 21:59:44 +00004099
4100 /* remove deleted IO handlers */
4101 pioh = &first_io_handler;
4102 while (*pioh) {
4103 ioh = *pioh;
4104 if (ioh->deleted) {
4105 *pioh = ioh->next;
4106 qemu_free(ioh);
ths5fafdf22007-09-16 21:08:06 +00004107 } else
thscafffd42007-02-28 21:59:44 +00004108 pioh = &ioh->next;
4109 }
bellardfd1dff42006-02-01 21:29:26 +00004110 }
Jan Kiszkad918f232009-06-24 14:42:30 +02004111
4112 slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
bellardc20709a2004-04-21 23:27:19 +00004113
aliguori50317c72009-04-24 18:03:29 +00004114 /* rearm timer, if not periodic */
4115 if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
4116 alarm_timer->flags &= ~ALARM_FLAG_EXPIRED;
4117 qemu_rearm_alarm_timer(alarm_timer);
4118 }
4119
aliguori357c6922008-11-25 17:26:09 +00004120 /* vm time timers */
aliguorid6dc3d42009-04-24 18:04:07 +00004121 if (vm_running) {
4122 if (!cur_cpu || likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
4123 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
4124 qemu_get_clock(vm_clock));
4125 }
aliguori357c6922008-11-25 17:26:09 +00004126
4127 /* real time timers */
4128 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
4129 qemu_get_clock(rt_clock));
4130
pbrook423f0742007-05-23 00:06:54 +00004131 /* Check bottom-halves last in case any of the earlier events triggered
4132 them. */
4133 qemu_bh_poll();
ths3b46e622007-09-17 08:09:54 +00004134
bellard5905b2e2004-08-01 21:53:26 +00004135}
4136
aliguori43b96852009-04-24 18:03:33 +00004137static int qemu_cpu_exec(CPUState *env)
bellard5905b2e2004-08-01 21:53:26 +00004138{
aliguori43b96852009-04-24 18:03:33 +00004139 int ret;
bellard89bfc102006-02-08 22:46:31 +00004140#ifdef CONFIG_PROFILER
4141 int64_t ti;
4142#endif
aliguori43b96852009-04-24 18:03:33 +00004143
4144#ifdef CONFIG_PROFILER
4145 ti = profile_getclock();
4146#endif
4147 if (use_icount) {
4148 int64_t count;
4149 int decr;
4150 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
4151 env->icount_decr.u16.low = 0;
4152 env->icount_extra = 0;
4153 count = qemu_next_deadline();
4154 count = (count + (1 << icount_time_shift) - 1)
4155 >> icount_time_shift;
4156 qemu_icount += count;
4157 decr = (count > 0xffff) ? 0xffff : count;
4158 count -= decr;
4159 env->icount_decr.u16.low = decr;
4160 env->icount_extra = count;
4161 }
4162 ret = cpu_exec(env);
4163#ifdef CONFIG_PROFILER
4164 qemu_time += profile_getclock() - ti;
4165#endif
4166 if (use_icount) {
4167 /* Fold pending instructions back into the
4168 instruction counter, and clear the interrupt flag. */
4169 qemu_icount -= (env->icount_decr.u16.low
4170 + env->icount_extra);
4171 env->icount_decr.u32 = 0;
4172 env->icount_extra = 0;
4173 }
4174 return ret;
4175}
4176
aliguorie6e35b12009-04-24 18:03:57 +00004177static void tcg_cpu_exec(void)
4178{
aliguorid6dc3d42009-04-24 18:04:07 +00004179 int ret = 0;
aliguorie6e35b12009-04-24 18:03:57 +00004180
4181 if (next_cpu == NULL)
4182 next_cpu = first_cpu;
4183 for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) {
4184 CPUState *env = cur_cpu = next_cpu;
4185
4186 if (!vm_running)
4187 break;
4188 if (timer_alarm_pending) {
4189 timer_alarm_pending = 0;
4190 break;
4191 }
aliguorid6dc3d42009-04-24 18:04:07 +00004192 if (cpu_can_run(env))
4193 ret = qemu_cpu_exec(env);
aliguorie6e35b12009-04-24 18:03:57 +00004194 if (ret == EXCP_DEBUG) {
4195 gdb_set_stop_cpu(env);
4196 debug_requested = 1;
4197 break;
4198 }
4199 }
4200}
4201
aliguori43b96852009-04-24 18:03:33 +00004202static int cpu_has_work(CPUState *env)
4203{
aliguorid6dc3d42009-04-24 18:04:07 +00004204 if (env->stop)
4205 return 1;
4206 if (env->stopped)
4207 return 0;
aliguori43b96852009-04-24 18:03:33 +00004208 if (!env->halted)
4209 return 1;
4210 if (qemu_cpu_has_work(env))
4211 return 1;
4212 return 0;
4213}
4214
4215static int tcg_has_work(void)
4216{
bellard6a00d602005-11-21 23:25:50 +00004217 CPUState *env;
bellard5905b2e2004-08-01 21:53:26 +00004218
aliguori43b96852009-04-24 18:03:33 +00004219 for (env = first_cpu; env != NULL; env = env->next_cpu)
4220 if (cpu_has_work(env))
4221 return 1;
4222 return 0;
4223}
bellard15a76442005-11-23 21:01:03 +00004224
aliguori43b96852009-04-24 18:03:33 +00004225static int qemu_calculate_timeout(void)
4226{
Luiz Capitulinob3198202009-06-09 18:24:57 -03004227#ifndef CONFIG_IOTHREAD
aliguori43b96852009-04-24 18:03:33 +00004228 int timeout;
bellard15a76442005-11-23 21:01:03 +00004229
aliguori43b96852009-04-24 18:03:33 +00004230 if (!vm_running)
4231 timeout = 5000;
4232 else if (tcg_has_work())
4233 timeout = 0;
4234 else if (!use_icount)
4235 timeout = 5000;
4236 else {
4237 /* XXX: use timeout computed from timers */
4238 int64_t add;
4239 int64_t delta;
4240 /* Advance virtual time to the next event. */
4241 if (use_icount == 1) {
4242 /* When not using an adaptive execution frequency
4243 we tend to get badly out of sync with real time,
4244 so just delay for a reasonable amount of time. */
4245 delta = 0;
bellard5905b2e2004-08-01 21:53:26 +00004246 } else {
aliguori43b96852009-04-24 18:03:33 +00004247 delta = cpu_get_icount() - cpu_get_clock();
bellard5905b2e2004-08-01 21:53:26 +00004248 }
aliguori43b96852009-04-24 18:03:33 +00004249 if (delta > 0) {
4250 /* If virtual time is ahead of real time then just
4251 wait for IO. */
4252 timeout = (delta / 1000000) + 1;
4253 } else {
4254 /* Wait for either IO to occur or the next
4255 timer event. */
4256 add = qemu_next_deadline();
4257 /* We advance the timer before checking for IO.
4258 Limit the amount we advance so that early IO
4259 activity won't get the guest too far ahead. */
4260 if (add > 10000000)
4261 add = 10000000;
4262 delta += add;
4263 add = (add + (1 << icount_time_shift) - 1)
4264 >> icount_time_shift;
4265 qemu_icount += add;
4266 timeout = delta / 1000000;
4267 if (timeout < 0)
4268 timeout = 0;
4269 }
bellardb4608c02003-06-27 17:34:32 +00004270 }
aliguori43b96852009-04-24 18:03:33 +00004271
4272 return timeout;
Luiz Capitulinob3198202009-06-09 18:24:57 -03004273#else /* CONFIG_IOTHREAD */
4274 return 1000;
4275#endif
aliguori43b96852009-04-24 18:03:33 +00004276}
4277
4278static int vm_can_run(void)
4279{
4280 if (powerdown_requested)
4281 return 0;
4282 if (reset_requested)
4283 return 0;
4284 if (shutdown_requested)
4285 return 0;
aliguorie5689022009-04-24 18:03:54 +00004286 if (debug_requested)
4287 return 0;
aliguori43b96852009-04-24 18:03:33 +00004288 return 1;
4289}
4290
Blue Swirld9c32312009-08-09 08:42:19 +00004291qemu_irq qemu_system_powerdown;
4292
aliguori43b96852009-04-24 18:03:33 +00004293static void main_loop(void)
4294{
aliguori6e29f5d2009-04-24 18:04:02 +00004295 int r;
aliguori43b96852009-04-24 18:03:33 +00004296
aliguorid6dc3d42009-04-24 18:04:07 +00004297#ifdef CONFIG_IOTHREAD
4298 qemu_system_ready = 1;
4299 qemu_cond_broadcast(&qemu_system_cond);
4300#endif
4301
aliguori6e29f5d2009-04-24 18:04:02 +00004302 for (;;) {
aliguorie6e35b12009-04-24 18:03:57 +00004303 do {
4304#ifdef CONFIG_PROFILER
4305 int64_t ti;
4306#endif
aliguorid6dc3d42009-04-24 18:04:07 +00004307#ifndef CONFIG_IOTHREAD
aliguorie6e35b12009-04-24 18:03:57 +00004308 tcg_cpu_exec();
aliguorid6dc3d42009-04-24 18:04:07 +00004309#endif
aliguori43b96852009-04-24 18:03:33 +00004310#ifdef CONFIG_PROFILER
4311 ti = profile_getclock();
4312#endif
4313 main_loop_wait(qemu_calculate_timeout());
4314#ifdef CONFIG_PROFILER
4315 dev_time += profile_getclock() - ti;
4316#endif
aliguorie5689022009-04-24 18:03:54 +00004317 } while (vm_can_run());
aliguori43b96852009-04-24 18:03:33 +00004318
aliguorie5689022009-04-24 18:03:54 +00004319 if (qemu_debug_requested())
aliguori43b96852009-04-24 18:03:33 +00004320 vm_stop(EXCP_DEBUG);
aliguori43b96852009-04-24 18:03:33 +00004321 if (qemu_shutdown_requested()) {
4322 if (no_shutdown) {
4323 vm_stop(0);
4324 no_shutdown = 0;
4325 } else
4326 break;
4327 }
aliguorid6dc3d42009-04-24 18:04:07 +00004328 if (qemu_reset_requested()) {
4329 pause_all_vcpus();
aliguori43b96852009-04-24 18:03:33 +00004330 qemu_system_reset();
aliguorid6dc3d42009-04-24 18:04:07 +00004331 resume_all_vcpus();
4332 }
Blue Swirld9c32312009-08-09 08:42:19 +00004333 if (qemu_powerdown_requested()) {
4334 qemu_irq_raise(qemu_system_powerdown);
4335 }
aliguori6e29f5d2009-04-24 18:04:02 +00004336 if ((r = qemu_vmstop_requested()))
4337 vm_stop(r);
aliguori43b96852009-04-24 18:03:33 +00004338 }
aliguorid6dc3d42009-04-24 18:04:07 +00004339 pause_all_vcpus();
bellardb4608c02003-06-27 17:34:32 +00004340}
4341
pbrook9bd7e6d2009-04-07 22:58:45 +00004342static void version(void)
4343{
pbrook4a19f1e2009-04-07 23:17:49 +00004344 printf("QEMU PC emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n");
pbrook9bd7e6d2009-04-07 22:58:45 +00004345}
4346
ths15f82202007-06-29 23:26:08 +00004347static void help(int exitcode)
bellard0824d6f2003-06-24 13:42:40 +00004348{
pbrook9bd7e6d2009-04-07 22:58:45 +00004349 version();
4350 printf("usage: %s [options] [disk_image]\n"
bellard0824d6f2003-06-24 13:42:40 +00004351 "\n"
bellarda20dd502003-09-30 21:07:02 +00004352 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
bellardfc01f7e2003-06-30 10:03:06 +00004353 "\n"
blueswir15824d652009-03-28 06:44:27 +00004354#define DEF(option, opt_arg, opt_enum, opt_help) \
4355 opt_help
4356#define DEFHEADING(text) stringify(text) "\n"
4357#include "qemu-options.h"
4358#undef DEF
4359#undef DEFHEADING
4360#undef GEN_DOCS
bellard0824d6f2003-06-24 13:42:40 +00004361 "\n"
bellard82c643f2004-07-14 17:28:13 +00004362 "During emulation, the following keys are useful:\n"
bellard032a8c92004-10-09 22:56:44 +00004363 "ctrl-alt-f toggle full screen\n"
4364 "ctrl-alt-n switch to virtual console 'n'\n"
4365 "ctrl-alt toggle mouse and keyboard grab\n"
bellard82c643f2004-07-14 17:28:13 +00004366 "\n"
4367 "When using -nographic, press 'ctrl-a h' to get some help.\n"
4368 ,
bellard0db63472003-10-27 21:37:46 +00004369 "qemu",
bellarda00bad72004-05-22 21:39:06 +00004370 DEFAULT_RAM_SIZE,
bellard7c9d8e02005-11-15 22:16:05 +00004371#ifndef _WIN32
bellarda00bad72004-05-22 21:39:06 +00004372 DEFAULT_NETWORK_SCRIPT,
thsb46a8902007-10-21 23:20:45 +00004373 DEFAULT_NETWORK_DOWN_SCRIPT,
bellard7c9d8e02005-11-15 22:16:05 +00004374#endif
bellard6e44ba72004-01-18 21:56:49 +00004375 DEFAULT_GDBSTUB_PORT,
bellardbce61842008-02-01 22:18:51 +00004376 "/tmp/qemu.log");
ths15f82202007-06-29 23:26:08 +00004377 exit(exitcode);
bellard0824d6f2003-06-24 13:42:40 +00004378}
4379
bellardcd6f1162004-05-13 22:02:20 +00004380#define HAS_ARG 0x0001
4381
4382enum {
blueswir15824d652009-03-28 06:44:27 +00004383#define DEF(option, opt_arg, opt_enum, opt_help) \
4384 opt_enum,
4385#define DEFHEADING(text)
4386#include "qemu-options.h"
4387#undef DEF
4388#undef DEFHEADING
4389#undef GEN_DOCS
bellardcd6f1162004-05-13 22:02:20 +00004390};
4391
4392typedef struct QEMUOption {
4393 const char *name;
4394 int flags;
4395 int index;
4396} QEMUOption;
4397
blueswir1dbed7e42008-10-01 19:38:09 +00004398static const QEMUOption qemu_options[] = {
bellardcd6f1162004-05-13 22:02:20 +00004399 { "h", 0, QEMU_OPTION_h },
blueswir15824d652009-03-28 06:44:27 +00004400#define DEF(option, opt_arg, opt_enum, opt_help) \
4401 { option, opt_arg, opt_enum },
4402#define DEFHEADING(text)
4403#include "qemu-options.h"
4404#undef DEF
4405#undef DEFHEADING
4406#undef GEN_DOCS
bellardcd6f1162004-05-13 22:02:20 +00004407 { NULL },
bellardfc01f7e2003-06-30 10:03:06 +00004408};
4409
bellard1d14ffa2005-10-30 18:58:22 +00004410#ifdef HAS_AUDIO
bellard6a36d842005-12-18 20:34:32 +00004411struct soundhw soundhw[] = {
balrogb00052e2007-04-30 02:22:06 +00004412#ifdef HAS_AUDIO_CHOICE
aurel324ce7ff62008-04-07 19:47:14 +00004413#if defined(TARGET_I386) || defined(TARGET_MIPS)
bellardfd06c372006-04-24 21:58:30 +00004414 {
4415 "pcspk",
4416 "PC speaker",
4417 0,
4418 1,
4419 { .init_isa = pcspk_audio_init }
4420 },
4421#endif
malc4c9b53e2009-01-09 10:46:34 +00004422
4423#ifdef CONFIG_SB16
bellard6a36d842005-12-18 20:34:32 +00004424 {
4425 "sb16",
4426 "Creative Sound Blaster 16",
4427 0,
4428 1,
4429 { .init_isa = SB16_init }
4430 },
malc4c9b53e2009-01-09 10:46:34 +00004431#endif
bellard6a36d842005-12-18 20:34:32 +00004432
malccc53d262008-06-13 10:48:22 +00004433#ifdef CONFIG_CS4231A
4434 {
4435 "cs4231a",
4436 "CS4231A",
4437 0,
4438 1,
4439 { .init_isa = cs4231a_init }
4440 },
4441#endif
4442
bellard6a36d842005-12-18 20:34:32 +00004443#ifdef CONFIG_ADLIB
4444 {
4445 "adlib",
4446#ifdef HAS_YMF262
4447 "Yamaha YMF262 (OPL3)",
4448#else
4449 "Yamaha YM3812 (OPL2)",
4450#endif
4451 0,
4452 1,
4453 { .init_isa = Adlib_init }
4454 },
4455#endif
4456
4457#ifdef CONFIG_GUS
4458 {
4459 "gus",
4460 "Gravis Ultrasound GF1",
4461 0,
4462 1,
4463 { .init_isa = GUS_init }
4464 },
4465#endif
4466
malc4c9b53e2009-01-09 10:46:34 +00004467#ifdef CONFIG_AC97
balroge5c9a132008-01-14 04:27:55 +00004468 {
4469 "ac97",
4470 "Intel 82801AA AC97 Audio",
4471 0,
4472 0,
4473 { .init_pci = ac97_init }
4474 },
malc4c9b53e2009-01-09 10:46:34 +00004475#endif
balroge5c9a132008-01-14 04:27:55 +00004476
malc4c9b53e2009-01-09 10:46:34 +00004477#ifdef CONFIG_ES1370
bellard6a36d842005-12-18 20:34:32 +00004478 {
4479 "es1370",
4480 "ENSONIQ AudioPCI ES1370",
4481 0,
4482 0,
4483 { .init_pci = es1370_init }
4484 },
balrogb00052e2007-04-30 02:22:06 +00004485#endif
bellard6a36d842005-12-18 20:34:32 +00004486
malc4c9b53e2009-01-09 10:46:34 +00004487#endif /* HAS_AUDIO_CHOICE */
4488
bellard6a36d842005-12-18 20:34:32 +00004489 { NULL, NULL, 0, 0, { NULL } }
4490};
4491
bellard1d14ffa2005-10-30 18:58:22 +00004492static void select_soundhw (const char *optarg)
4493{
bellard6a36d842005-12-18 20:34:32 +00004494 struct soundhw *c;
4495
bellard1d14ffa2005-10-30 18:58:22 +00004496 if (*optarg == '?') {
4497 show_valid_cards:
bellard6a36d842005-12-18 20:34:32 +00004498
bellard1d14ffa2005-10-30 18:58:22 +00004499 printf ("Valid sound card names (comma separated):\n");
bellard6a36d842005-12-18 20:34:32 +00004500 for (c = soundhw; c->name; ++c) {
4501 printf ("%-11s %s\n", c->name, c->descr);
4502 }
4503 printf ("\n-soundhw all will enable all of the above\n");
bellard1d14ffa2005-10-30 18:58:22 +00004504 exit (*optarg != '?');
4505 }
4506 else {
bellard6a36d842005-12-18 20:34:32 +00004507 size_t l;
bellard1d14ffa2005-10-30 18:58:22 +00004508 const char *p;
4509 char *e;
4510 int bad_card = 0;
4511
bellard6a36d842005-12-18 20:34:32 +00004512 if (!strcmp (optarg, "all")) {
4513 for (c = soundhw; c->name; ++c) {
4514 c->enabled = 1;
4515 }
4516 return;
4517 }
bellard1d14ffa2005-10-30 18:58:22 +00004518
bellard6a36d842005-12-18 20:34:32 +00004519 p = optarg;
bellard1d14ffa2005-10-30 18:58:22 +00004520 while (*p) {
4521 e = strchr (p, ',');
4522 l = !e ? strlen (p) : (size_t) (e - p);
bellard6a36d842005-12-18 20:34:32 +00004523
4524 for (c = soundhw; c->name; ++c) {
4525 if (!strncmp (c->name, p, l)) {
4526 c->enabled = 1;
bellard1d14ffa2005-10-30 18:58:22 +00004527 break;
4528 }
4529 }
bellard6a36d842005-12-18 20:34:32 +00004530
4531 if (!c->name) {
bellard1d14ffa2005-10-30 18:58:22 +00004532 if (l > 80) {
4533 fprintf (stderr,
4534 "Unknown sound card name (too big to show)\n");
4535 }
4536 else {
4537 fprintf (stderr, "Unknown sound card name `%.*s'\n",
4538 (int) l, p);
4539 }
4540 bad_card = 1;
4541 }
4542 p += l + (e != NULL);
4543 }
4544
4545 if (bad_card)
4546 goto show_valid_cards;
4547 }
4548}
4549#endif
4550
malc3893c122008-09-28 00:42:05 +00004551static void select_vgahw (const char *p)
4552{
4553 const char *opts;
4554
Zachary Amsden86176752009-07-30 00:15:02 -10004555 vga_interface_type = VGA_NONE;
malc3893c122008-09-28 00:42:05 +00004556 if (strstart(p, "std", &opts)) {
Zachary Amsden86176752009-07-30 00:15:02 -10004557 vga_interface_type = VGA_STD;
malc3893c122008-09-28 00:42:05 +00004558 } else if (strstart(p, "cirrus", &opts)) {
Zachary Amsden86176752009-07-30 00:15:02 -10004559 vga_interface_type = VGA_CIRRUS;
malc3893c122008-09-28 00:42:05 +00004560 } else if (strstart(p, "vmware", &opts)) {
Zachary Amsden86176752009-07-30 00:15:02 -10004561 vga_interface_type = VGA_VMWARE;
aliguori94909d92009-04-22 15:19:53 +00004562 } else if (strstart(p, "xenfb", &opts)) {
Zachary Amsden86176752009-07-30 00:15:02 -10004563 vga_interface_type = VGA_XENFB;
aliguori28b85ed2009-04-22 15:19:48 +00004564 } else if (!strstart(p, "none", &opts)) {
malc3893c122008-09-28 00:42:05 +00004565 invalid_vga:
4566 fprintf(stderr, "Unknown vga type: %s\n", p);
4567 exit(1);
4568 }
malccb5a7aa2008-09-28 00:42:12 +00004569 while (*opts) {
4570 const char *nextopt;
4571
4572 if (strstart(opts, ",retrace=", &nextopt)) {
4573 opts = nextopt;
4574 if (strstart(opts, "dumb", &nextopt))
4575 vga_retrace_method = VGA_RETRACE_DUMB;
4576 else if (strstart(opts, "precise", &nextopt))
4577 vga_retrace_method = VGA_RETRACE_PRECISE;
4578 else goto invalid_vga;
4579 } else goto invalid_vga;
4580 opts = nextopt;
4581 }
malc3893c122008-09-28 00:42:05 +00004582}
4583
Markus Armbruster7d4c3d52009-06-26 19:15:14 +02004584#ifdef TARGET_I386
4585static int balloon_parse(const char *arg)
4586{
Gerd Hoffmann382f0742009-08-14 10:34:22 +02004587 QemuOpts *opts;
Markus Armbruster7d4c3d52009-06-26 19:15:14 +02004588
Gerd Hoffmann382f0742009-08-14 10:34:22 +02004589 if (strcmp(arg, "none") == 0) {
4590 return 0;
Markus Armbruster7d4c3d52009-06-26 19:15:14 +02004591 }
Gerd Hoffmann382f0742009-08-14 10:34:22 +02004592
4593 if (!strncmp(arg, "virtio", 6)) {
4594 if (arg[6] == ',') {
4595 /* have params -> parse them */
4596 opts = qemu_opts_parse(&qemu_device_opts, arg+7, NULL);
4597 if (!opts)
4598 return -1;
4599 } else {
4600 /* create empty opts */
4601 opts = qemu_opts_create(&qemu_device_opts, NULL, 0);
4602 }
4603 qemu_opt_set(opts, "driver", "virtio-balloon-pci");
4604 return 0;
4605 }
4606
4607 return -1;
Markus Armbruster7d4c3d52009-06-26 19:15:14 +02004608}
4609#endif
4610
bellard3587d7e2006-06-26 20:03:44 +00004611#ifdef _WIN32
4612static BOOL WINAPI qemu_ctrl_handler(DWORD type)
4613{
4614 exit(STATUS_CONTROL_C_EXIT);
4615 return TRUE;
4616}
4617#endif
4618
aliguoric4be29f2009-04-17 18:58:14 +00004619int qemu_uuid_parse(const char *str, uint8_t *uuid)
blueswir18fcb1b92008-09-18 18:29:08 +00004620{
4621 int ret;
4622
4623 if(strlen(str) != 36)
4624 return -1;
4625
4626 ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
4627 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
4628 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
4629
4630 if(ret != 16)
4631 return -1;
4632
aliguorib6f6e3d2009-04-17 18:59:56 +00004633#ifdef TARGET_I386
4634 smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
4635#endif
4636
blueswir18fcb1b92008-09-18 18:29:08 +00004637 return 0;
4638}
4639
bellard7c9d8e02005-11-15 22:16:05 +00004640#define MAX_NET_CLIENTS 32
bellardc20709a2004-04-21 23:27:19 +00004641
aliguori5b08fc12008-08-21 20:08:03 +00004642#ifndef _WIN32
4643
4644static void termsig_handler(int signal)
4645{
4646 qemu_system_shutdown_request();
4647}
4648
Jan Kiszka7c3370d2009-05-08 12:34:17 +02004649static void sigchld_handler(int signal)
4650{
4651 waitpid(-1, NULL, WNOHANG);
4652}
4653
4654static void sighandler_setup(void)
aliguori5b08fc12008-08-21 20:08:03 +00004655{
4656 struct sigaction act;
4657
4658 memset(&act, 0, sizeof(act));
4659 act.sa_handler = termsig_handler;
4660 sigaction(SIGINT, &act, NULL);
4661 sigaction(SIGHUP, &act, NULL);
4662 sigaction(SIGTERM, &act, NULL);
Jan Kiszka7c3370d2009-05-08 12:34:17 +02004663
4664 act.sa_handler = sigchld_handler;
4665 act.sa_flags = SA_NOCLDSTOP;
4666 sigaction(SIGCHLD, &act, NULL);
aliguori5b08fc12008-08-21 20:08:03 +00004667}
4668
4669#endif
4670
Paul Brook5cea8592009-05-30 00:52:44 +01004671#ifdef _WIN32
4672/* Look for support files in the same directory as the executable. */
4673static char *find_datadir(const char *argv0)
4674{
4675 char *p;
4676 char buf[MAX_PATH];
4677 DWORD len;
4678
4679 len = GetModuleFileName(NULL, buf, sizeof(buf) - 1);
4680 if (len == 0) {
Blue Swirlc5947802009-06-09 20:51:21 +03004681 return NULL;
Paul Brook5cea8592009-05-30 00:52:44 +01004682 }
4683
4684 buf[len] = 0;
4685 p = buf + len - 1;
4686 while (p != buf && *p != '\\')
4687 p--;
4688 *p = 0;
4689 if (access(buf, R_OK) == 0) {
4690 return qemu_strdup(buf);
4691 }
4692 return NULL;
4693}
4694#else /* !_WIN32 */
4695
4696/* Find a likely location for support files using the location of the binary.
4697 For installed binaries this will be "$bindir/../share/qemu". When
4698 running from the build tree this will be "$bindir/../pc-bios". */
4699#define SHARE_SUFFIX "/share/qemu"
4700#define BUILD_SUFFIX "/pc-bios"
4701static char *find_datadir(const char *argv0)
4702{
4703 char *dir;
4704 char *p = NULL;
4705 char *res;
4706#ifdef PATH_MAX
4707 char buf[PATH_MAX];
4708#endif
Blue Swirl3a417592009-06-09 19:12:21 +00004709 size_t max_len;
Paul Brook5cea8592009-05-30 00:52:44 +01004710
4711#if defined(__linux__)
4712 {
4713 int len;
4714 len = readlink("/proc/self/exe", buf, sizeof(buf) - 1);
4715 if (len > 0) {
4716 buf[len] = 0;
4717 p = buf;
4718 }
4719 }
4720#elif defined(__FreeBSD__)
4721 {
4722 int len;
4723 len = readlink("/proc/curproc/file", buf, sizeof(buf) - 1);
4724 if (len > 0) {
4725 buf[len] = 0;
4726 p = buf;
4727 }
4728 }
4729#endif
4730 /* If we don't have any way of figuring out the actual executable
4731 location then try argv[0]. */
4732 if (!p) {
4733#ifdef PATH_MAX
4734 p = buf;
4735#endif
4736 p = realpath(argv0, p);
4737 if (!p) {
4738 return NULL;
4739 }
4740 }
4741 dir = dirname(p);
4742 dir = dirname(dir);
4743
Blue Swirl3a417592009-06-09 19:12:21 +00004744 max_len = strlen(dir) +
4745 MAX(strlen(SHARE_SUFFIX), strlen(BUILD_SUFFIX)) + 1;
4746 res = qemu_mallocz(max_len);
4747 snprintf(res, max_len, "%s%s", dir, SHARE_SUFFIX);
Paul Brook5cea8592009-05-30 00:52:44 +01004748 if (access(res, R_OK)) {
Blue Swirl3a417592009-06-09 19:12:21 +00004749 snprintf(res, max_len, "%s%s", dir, BUILD_SUFFIX);
Paul Brook5cea8592009-05-30 00:52:44 +01004750 if (access(res, R_OK)) {
4751 qemu_free(res);
4752 res = NULL;
4753 }
4754 }
4755#ifndef PATH_MAX
4756 free(p);
4757#endif
4758 return res;
4759}
4760#undef SHARE_SUFFIX
4761#undef BUILD_SUFFIX
4762#endif
4763
4764char *qemu_find_file(int type, const char *name)
4765{
4766 int len;
4767 const char *subdir;
4768 char *buf;
4769
4770 /* If name contains path separators then try it as a straight path. */
4771 if ((strchr(name, '/') || strchr(name, '\\'))
4772 && access(name, R_OK) == 0) {
4773 return strdup(name);
4774 }
4775 switch (type) {
4776 case QEMU_FILE_TYPE_BIOS:
4777 subdir = "";
4778 break;
4779 case QEMU_FILE_TYPE_KEYMAP:
4780 subdir = "keymaps/";
4781 break;
4782 default:
4783 abort();
4784 }
4785 len = strlen(data_dir) + strlen(name) + strlen(subdir) + 2;
4786 buf = qemu_mallocz(len);
Blue Swirl3a417592009-06-09 19:12:21 +00004787 snprintf(buf, len, "%s/%s%s", data_dir, subdir, name);
Paul Brook5cea8592009-05-30 00:52:44 +01004788 if (access(buf, R_OK)) {
4789 qemu_free(buf);
4790 return NULL;
4791 }
4792 return buf;
4793}
4794
Gerd Hoffmannf31d07d2009-07-31 12:25:37 +02004795static int device_init_func(QemuOpts *opts, void *opaque)
4796{
4797 DeviceState *dev;
4798
4799 dev = qdev_device_add(opts);
4800 if (!dev)
4801 return -1;
4802 return 0;
4803}
4804
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02004805struct device_config {
4806 enum {
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02004807 DEV_USB, /* -usbdevice */
4808 DEV_BT, /* -bt */
4809 } type;
4810 const char *cmdline;
4811 TAILQ_ENTRY(device_config) next;
4812};
4813TAILQ_HEAD(, device_config) device_configs = TAILQ_HEAD_INITIALIZER(device_configs);
4814
4815static void add_device_config(int type, const char *cmdline)
4816{
4817 struct device_config *conf;
4818
4819 conf = qemu_mallocz(sizeof(*conf));
4820 conf->type = type;
4821 conf->cmdline = cmdline;
4822 TAILQ_INSERT_TAIL(&device_configs, conf, next);
4823}
4824
4825static int foreach_device_config(int type, int (*func)(const char *cmdline))
4826{
4827 struct device_config *conf;
4828 int rc;
4829
4830 TAILQ_FOREACH(conf, &device_configs, next) {
4831 if (conf->type != type)
4832 continue;
4833 rc = func(conf->cmdline);
4834 if (0 != rc)
4835 return rc;
4836 }
4837 return 0;
4838}
4839
malc902b3d52008-12-10 19:18:40 +00004840int main(int argc, char **argv, char **envp)
bellard0824d6f2003-06-24 13:42:40 +00004841{
aliguori59030a82009-04-05 18:43:41 +00004842 const char *gdbstub_dev = NULL;
j_mayer28c5af52007-11-11 01:50:45 +00004843 uint32_t boot_devices_bitmap = 0;
thse4bcb142007-12-02 04:51:10 +00004844 int i;
j_mayer28c5af52007-11-11 01:50:45 +00004845 int snapshot, linux_boot, net_boot;
bellard7f7f9872003-10-30 01:11:23 +00004846 const char *initrd_filename;
bellarda20dd502003-09-30 21:07:02 +00004847 const char *kernel_filename, *kernel_cmdline;
Jan Kiszkaef3adf62009-07-02 00:19:02 +02004848 char boot_devices[33] = "cad"; /* default to HD->floppy->CD-ROM */
aliguori3023f3322009-01-16 19:04:14 +00004849 DisplayState *ds;
aliguori7d957bd2009-01-15 22:14:11 +00004850 DisplayChangeListener *dcl;
bellard46d47672004-11-16 01:45:27 +00004851 int cyls, heads, secs, translation;
pbrookfd5f3932008-03-26 20:55:43 +00004852 const char *net_clients[MAX_NET_CLIENTS];
bellard7c9d8e02005-11-15 22:16:05 +00004853 int nb_net_clients;
Gerd Hoffmannf31d07d2009-07-31 12:25:37 +02004854 QemuOpts *hda_opts = NULL, *opts;
bellardcd6f1162004-05-13 22:02:20 +00004855 int optind;
4856 const char *r, *optarg;
aliguori4c621802009-01-16 21:48:20 +00004857 CharDriverState *monitor_hd = NULL;
pbrookfd5f3932008-03-26 20:55:43 +00004858 const char *monitor_device;
4859 const char *serial_devices[MAX_SERIAL_PORTS];
bellard8d11df92004-08-24 21:13:40 +00004860 int serial_device_index;
pbrookfd5f3932008-03-26 20:55:43 +00004861 const char *parallel_devices[MAX_PARALLEL_PORTS];
bellard6508fe52005-01-15 12:02:56 +00004862 int parallel_device_index;
aliguori9ede2fd2009-01-15 20:05:25 +00004863 const char *virtio_consoles[MAX_VIRTIO_CONSOLES];
4864 int virtio_console_index;
bellardd63d3072004-10-03 13:29:03 +00004865 const char *loadvm = NULL;
bellardcc1daa42005-06-05 14:49:17 +00004866 QEMUMachine *machine;
j_mayer94fc95c2007-03-05 19:44:02 +00004867 const char *cpu_model;
blueswir1b9e82a52009-04-05 18:03:31 +00004868#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00004869 int fds[2];
blueswir1b9e82a52009-04-05 18:03:31 +00004870#endif
bellard26a5f132008-05-28 12:30:31 +00004871 int tb_size;
ths93815bc2007-03-19 15:58:31 +00004872 const char *pid_file = NULL;
aliguori5bb79102008-10-13 03:12:02 +00004873 const char *incoming = NULL;
blueswir1b9e82a52009-04-05 18:03:31 +00004874#ifndef _WIN32
aliguori54042bc2009-02-27 22:16:47 +00004875 int fd = 0;
4876 struct passwd *pwd = NULL;
aliguori08585322009-02-27 22:09:45 +00004877 const char *chroot_dir = NULL;
4878 const char *run_as = NULL;
blueswir1b9e82a52009-04-05 18:03:31 +00004879#endif
aliguori268a3622009-04-21 22:30:27 +00004880 CPUState *env;
Anthony Liguori993fbfd2009-05-21 16:54:00 -05004881 int show_vnc_port = 0;
bellard0bd48852005-11-11 00:00:47 +00004882
Gerd Hoffmannac7531e2009-08-14 10:36:06 +02004883 qemu_errors_to_file(stderr);
malc902b3d52008-12-10 19:18:40 +00004884 qemu_cache_utils_init(envp);
4885
bellard0bd48852005-11-11 00:00:47 +00004886 LIST_INIT (&vm_change_state_head);
bellardbe995c22006-06-25 16:25:21 +00004887#ifndef _WIN32
4888 {
4889 struct sigaction act;
4890 sigfillset(&act.sa_mask);
4891 act.sa_flags = 0;
4892 act.sa_handler = SIG_IGN;
4893 sigaction(SIGPIPE, &act, NULL);
4894 }
bellard3587d7e2006-06-26 20:03:44 +00004895#else
4896 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
bellarda8e5ac32006-07-14 09:36:13 +00004897 /* Note: cpu_interrupt() is currently not SMP safe, so we force
4898 QEMU to run on a single CPU */
4899 {
4900 HANDLE h;
4901 DWORD mask, smask;
4902 int i;
4903 h = GetCurrentProcess();
4904 if (GetProcessAffinityMask(h, &mask, &smask)) {
4905 for(i = 0; i < 32; i++) {
4906 if (mask & (1 << i))
4907 break;
4908 }
4909 if (i != 32) {
4910 mask = 1 << i;
4911 SetProcessAffinityMask(h, mask);
4912 }
4913 }
4914 }
bellard67b915a2004-03-31 23:37:16 +00004915#endif
bellardbe995c22006-06-25 16:25:21 +00004916
Anthony Liguorif80f9ec2009-05-20 18:38:09 -05004917 module_call_init(MODULE_INIT_MACHINE);
Anthony Liguori0c257432009-05-21 20:41:01 -05004918 machine = find_default_machine();
j_mayer94fc95c2007-03-05 19:44:02 +00004919 cpu_model = NULL;
bellardfc01f7e2003-06-30 10:03:06 +00004920 initrd_filename = NULL;
aurel324fc5d072008-04-27 21:39:40 +00004921 ram_size = 0;
bellard33e39632003-07-06 17:15:21 +00004922 snapshot = 0;
bellarda20dd502003-09-30 21:07:02 +00004923 kernel_filename = NULL;
4924 kernel_cmdline = "";
bellardc4b1fcc2004-03-14 21:44:30 +00004925 cyls = heads = secs = 0;
bellard46d47672004-11-16 01:45:27 +00004926 translation = BIOS_ATA_TRANSLATION_AUTO;
aliguorid47d13b2009-03-05 23:00:53 +00004927 monitor_device = "vc:80Cx24C";
bellardc4b1fcc2004-03-14 21:44:30 +00004928
aurel32c75a8232008-05-04 00:50:34 +00004929 serial_devices[0] = "vc:80Cx24C";
bellard8d11df92004-08-24 21:13:40 +00004930 for(i = 1; i < MAX_SERIAL_PORTS; i++)
pbrookfd5f3932008-03-26 20:55:43 +00004931 serial_devices[i] = NULL;
bellard8d11df92004-08-24 21:13:40 +00004932 serial_device_index = 0;
ths3b46e622007-09-17 08:09:54 +00004933
aliguori8290edd2009-02-27 20:14:29 +00004934 parallel_devices[0] = "vc:80Cx24C";
bellard6508fe52005-01-15 12:02:56 +00004935 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
pbrookfd5f3932008-03-26 20:55:43 +00004936 parallel_devices[i] = NULL;
bellard6508fe52005-01-15 12:02:56 +00004937 parallel_device_index = 0;
ths3b46e622007-09-17 08:09:54 +00004938
aliguori1b8fc812009-02-27 20:01:39 +00004939 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++)
aliguori9ede2fd2009-01-15 20:05:25 +00004940 virtio_consoles[i] = NULL;
4941 virtio_console_index = 0;
4942
aliguori268a3622009-04-21 22:30:27 +00004943 for (i = 0; i < MAX_NODES; i++) {
4944 node_mem[i] = 0;
4945 node_cpumask[i] = 0;
4946 }
4947
bellard7c9d8e02005-11-15 22:16:05 +00004948 nb_net_clients = 0;
aliguori268a3622009-04-21 22:30:27 +00004949 nb_numa_nodes = 0;
bellard7c9d8e02005-11-15 22:16:05 +00004950 nb_nics = 0;
ths3b46e622007-09-17 08:09:54 +00004951
bellard26a5f132008-05-28 12:30:31 +00004952 tb_size = 0;
blueswir141bd6392008-10-05 09:56:21 +00004953 autostart= 1;
4954
bellardcd6f1162004-05-13 22:02:20 +00004955 optind = 1;
bellard0824d6f2003-06-24 13:42:40 +00004956 for(;;) {
bellardcd6f1162004-05-13 22:02:20 +00004957 if (optind >= argc)
bellard0824d6f2003-06-24 13:42:40 +00004958 break;
bellardcd6f1162004-05-13 22:02:20 +00004959 r = argv[optind];
4960 if (r[0] != '-') {
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02004961 hda_opts = drive_add(argv[optind++], HD_ALIAS, 0);
bellardcd6f1162004-05-13 22:02:20 +00004962 } else {
4963 const QEMUOption *popt;
4964
4965 optind++;
pbrookdff5efc2007-01-27 17:19:39 +00004966 /* Treat --foo the same as -foo. */
4967 if (r[1] == '-')
4968 r++;
bellardcd6f1162004-05-13 22:02:20 +00004969 popt = qemu_options;
4970 for(;;) {
4971 if (!popt->name) {
ths5fafdf22007-09-16 21:08:06 +00004972 fprintf(stderr, "%s: invalid option -- '%s'\n",
bellardcd6f1162004-05-13 22:02:20 +00004973 argv[0], r);
4974 exit(1);
4975 }
4976 if (!strcmp(popt->name, r + 1))
4977 break;
4978 popt++;
4979 }
4980 if (popt->flags & HAS_ARG) {
4981 if (optind >= argc) {
4982 fprintf(stderr, "%s: option '%s' requires an argument\n",
4983 argv[0], r);
4984 exit(1);
4985 }
4986 optarg = argv[optind++];
4987 } else {
4988 optarg = NULL;
4989 }
4990
4991 switch(popt->index) {
bellardcc1daa42005-06-05 14:49:17 +00004992 case QEMU_OPTION_M:
4993 machine = find_machine(optarg);
4994 if (!machine) {
4995 QEMUMachine *m;
4996 printf("Supported machines are:\n");
4997 for(m = first_machine; m != NULL; m = m->next) {
Mark McLoughlin3f6599e2009-07-22 10:02:50 +01004998 if (m->alias)
4999 printf("%-10s %s (alias of %s)\n",
5000 m->alias, m->desc, m->name);
bellardcc1daa42005-06-05 14:49:17 +00005001 printf("%-10s %s%s\n",
ths5fafdf22007-09-16 21:08:06 +00005002 m->name, m->desc,
Anthony Liguori0c257432009-05-21 20:41:01 -05005003 m->is_default ? " (default)" : "");
bellardcc1daa42005-06-05 14:49:17 +00005004 }
ths15f82202007-06-29 23:26:08 +00005005 exit(*optarg != '?');
bellardcc1daa42005-06-05 14:49:17 +00005006 }
5007 break;
j_mayer94fc95c2007-03-05 19:44:02 +00005008 case QEMU_OPTION_cpu:
5009 /* hw initialization will check this */
ths15f82202007-06-29 23:26:08 +00005010 if (*optarg == '?') {
j_mayerc732abe2007-10-12 06:47:46 +00005011/* XXX: implement xxx_cpu_list for targets that still miss it */
5012#if defined(cpu_list)
5013 cpu_list(stdout, &fprintf);
j_mayer94fc95c2007-03-05 19:44:02 +00005014#endif
ths15f82202007-06-29 23:26:08 +00005015 exit(0);
j_mayer94fc95c2007-03-05 19:44:02 +00005016 } else {
5017 cpu_model = optarg;
5018 }
5019 break;
bellardcd6f1162004-05-13 22:02:20 +00005020 case QEMU_OPTION_initrd:
bellardfc01f7e2003-06-30 10:03:06 +00005021 initrd_filename = optarg;
5022 break;
bellardcd6f1162004-05-13 22:02:20 +00005023 case QEMU_OPTION_hda:
thse4bcb142007-12-02 04:51:10 +00005024 if (cyls == 0)
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02005025 hda_opts = drive_add(optarg, HD_ALIAS, 0);
thse4bcb142007-12-02 04:51:10 +00005026 else
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02005027 hda_opts = drive_add(optarg, HD_ALIAS
thse4bcb142007-12-02 04:51:10 +00005028 ",cyls=%d,heads=%d,secs=%d%s",
balrog609497a2008-01-14 02:56:53 +00005029 0, cyls, heads, secs,
thse4bcb142007-12-02 04:51:10 +00005030 translation == BIOS_ATA_TRANSLATION_LBA ?
5031 ",trans=lba" :
5032 translation == BIOS_ATA_TRANSLATION_NONE ?
5033 ",trans=none" : "");
5034 break;
bellardcd6f1162004-05-13 22:02:20 +00005035 case QEMU_OPTION_hdb:
bellardcc1daa42005-06-05 14:49:17 +00005036 case QEMU_OPTION_hdc:
5037 case QEMU_OPTION_hdd:
balrog609497a2008-01-14 02:56:53 +00005038 drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
bellardfc01f7e2003-06-30 10:03:06 +00005039 break;
thse4bcb142007-12-02 04:51:10 +00005040 case QEMU_OPTION_drive:
balrog609497a2008-01-14 02:56:53 +00005041 drive_add(NULL, "%s", optarg);
thse4bcb142007-12-02 04:51:10 +00005042 break;
Gerd Hoffmannd058fe02009-07-31 12:25:36 +02005043 case QEMU_OPTION_set:
5044 if (qemu_set_option(optarg) != 0)
5045 exit(1);
5046 break;
balrog3e3d5812007-04-30 02:09:25 +00005047 case QEMU_OPTION_mtdblock:
balrog609497a2008-01-14 02:56:53 +00005048 drive_add(optarg, MTD_ALIAS);
balrog3e3d5812007-04-30 02:09:25 +00005049 break;
pbrooka1bb27b2007-04-06 16:49:48 +00005050 case QEMU_OPTION_sd:
balrog609497a2008-01-14 02:56:53 +00005051 drive_add(optarg, SD_ALIAS);
pbrooka1bb27b2007-04-06 16:49:48 +00005052 break;
j_mayer86f55662007-04-24 06:52:59 +00005053 case QEMU_OPTION_pflash:
balrog609497a2008-01-14 02:56:53 +00005054 drive_add(optarg, PFLASH_ALIAS);
j_mayer86f55662007-04-24 06:52:59 +00005055 break;
bellardcd6f1162004-05-13 22:02:20 +00005056 case QEMU_OPTION_snapshot:
bellard33e39632003-07-06 17:15:21 +00005057 snapshot = 1;
5058 break;
bellardcd6f1162004-05-13 22:02:20 +00005059 case QEMU_OPTION_hdachs:
bellard330d0412003-07-26 18:11:40 +00005060 {
bellard330d0412003-07-26 18:11:40 +00005061 const char *p;
5062 p = optarg;
5063 cyls = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00005064 if (cyls < 1 || cyls > 16383)
5065 goto chs_fail;
bellard330d0412003-07-26 18:11:40 +00005066 if (*p != ',')
5067 goto chs_fail;
5068 p++;
5069 heads = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00005070 if (heads < 1 || heads > 16)
5071 goto chs_fail;
bellard330d0412003-07-26 18:11:40 +00005072 if (*p != ',')
5073 goto chs_fail;
5074 p++;
5075 secs = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00005076 if (secs < 1 || secs > 63)
5077 goto chs_fail;
5078 if (*p == ',') {
5079 p++;
5080 if (!strcmp(p, "none"))
5081 translation = BIOS_ATA_TRANSLATION_NONE;
5082 else if (!strcmp(p, "lba"))
5083 translation = BIOS_ATA_TRANSLATION_LBA;
5084 else if (!strcmp(p, "auto"))
5085 translation = BIOS_ATA_TRANSLATION_AUTO;
5086 else
5087 goto chs_fail;
5088 } else if (*p != '\0') {
bellardc4b1fcc2004-03-14 21:44:30 +00005089 chs_fail:
bellard46d47672004-11-16 01:45:27 +00005090 fprintf(stderr, "qemu: invalid physical CHS format\n");
5091 exit(1);
bellardc4b1fcc2004-03-14 21:44:30 +00005092 }
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02005093 if (hda_opts != NULL) {
5094 char num[16];
5095 snprintf(num, sizeof(num), "%d", cyls);
5096 qemu_opt_set(hda_opts, "cyls", num);
5097 snprintf(num, sizeof(num), "%d", heads);
5098 qemu_opt_set(hda_opts, "heads", num);
5099 snprintf(num, sizeof(num), "%d", secs);
5100 qemu_opt_set(hda_opts, "secs", num);
5101 if (translation == BIOS_ATA_TRANSLATION_LBA)
5102 qemu_opt_set(hda_opts, "trans", "lba");
5103 if (translation == BIOS_ATA_TRANSLATION_NONE)
5104 qemu_opt_set(hda_opts, "trans", "none");
5105 }
bellard330d0412003-07-26 18:11:40 +00005106 }
5107 break;
aliguori268a3622009-04-21 22:30:27 +00005108 case QEMU_OPTION_numa:
5109 if (nb_numa_nodes >= MAX_NODES) {
5110 fprintf(stderr, "qemu: too many NUMA nodes\n");
5111 exit(1);
5112 }
5113 numa_add(optarg);
5114 break;
bellardcd6f1162004-05-13 22:02:20 +00005115 case QEMU_OPTION_nographic:
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005116 display_type = DT_NOGRAPHIC;
bellarda20dd502003-09-30 21:07:02 +00005117 break;
balrog4d3b6f62008-02-10 16:33:14 +00005118#ifdef CONFIG_CURSES
5119 case QEMU_OPTION_curses:
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005120 display_type = DT_CURSES;
balrog4d3b6f62008-02-10 16:33:14 +00005121 break;
5122#endif
balroga171fe32007-04-30 01:48:07 +00005123 case QEMU_OPTION_portrait:
5124 graphic_rotate = 1;
5125 break;
bellardcd6f1162004-05-13 22:02:20 +00005126 case QEMU_OPTION_kernel:
bellarda20dd502003-09-30 21:07:02 +00005127 kernel_filename = optarg;
5128 break;
bellardcd6f1162004-05-13 22:02:20 +00005129 case QEMU_OPTION_append:
bellarda20dd502003-09-30 21:07:02 +00005130 kernel_cmdline = optarg;
bellard313aa562003-08-10 21:52:11 +00005131 break;
bellardcd6f1162004-05-13 22:02:20 +00005132 case QEMU_OPTION_cdrom:
balrog609497a2008-01-14 02:56:53 +00005133 drive_add(optarg, CDROM_ALIAS);
bellard36b486b2003-11-11 13:36:08 +00005134 break;
bellardcd6f1162004-05-13 22:02:20 +00005135 case QEMU_OPTION_boot:
j_mayer28c5af52007-11-11 01:50:45 +00005136 {
Jan Kiszkaef3adf62009-07-02 00:19:02 +02005137 static const char * const params[] = {
Jan Kiszka95387492009-07-02 00:19:02 +02005138 "order", "once", "menu", NULL
Jan Kiszkaef3adf62009-07-02 00:19:02 +02005139 };
5140 char buf[sizeof(boot_devices)];
Jan Kiszkae0f084b2009-07-02 00:19:02 +02005141 char *standard_boot_devices;
Jan Kiszkaef3adf62009-07-02 00:19:02 +02005142 int legacy = 0;
5143
5144 if (!strchr(optarg, '=')) {
5145 legacy = 1;
5146 pstrcpy(buf, sizeof(buf), optarg);
5147 } else if (check_params(buf, sizeof(buf), params, optarg) < 0) {
5148 fprintf(stderr,
5149 "qemu: unknown boot parameter '%s' in '%s'\n",
5150 buf, optarg);
5151 exit(1);
5152 }
5153
5154 if (legacy ||
5155 get_param_value(buf, sizeof(buf), "order", optarg)) {
5156 boot_devices_bitmap = parse_bootdevices(buf);
5157 pstrcpy(boot_devices, sizeof(boot_devices), buf);
j_mayer28c5af52007-11-11 01:50:45 +00005158 }
Jan Kiszkae0f084b2009-07-02 00:19:02 +02005159 if (!legacy) {
5160 if (get_param_value(buf, sizeof(buf),
5161 "once", optarg)) {
5162 boot_devices_bitmap |= parse_bootdevices(buf);
5163 standard_boot_devices = qemu_strdup(boot_devices);
5164 pstrcpy(boot_devices, sizeof(boot_devices), buf);
5165 qemu_register_reset(restore_boot_devices,
5166 standard_boot_devices);
5167 }
Jan Kiszka95387492009-07-02 00:19:02 +02005168 if (get_param_value(buf, sizeof(buf),
5169 "menu", optarg)) {
5170 if (!strcmp(buf, "on")) {
5171 boot_menu = 1;
5172 } else if (!strcmp(buf, "off")) {
5173 boot_menu = 0;
5174 } else {
5175 fprintf(stderr,
5176 "qemu: invalid option value '%s'\n",
5177 buf);
5178 exit(1);
5179 }
5180 }
Jan Kiszkae0f084b2009-07-02 00:19:02 +02005181 }
bellard36b486b2003-11-11 13:36:08 +00005182 }
5183 break;
bellardcd6f1162004-05-13 22:02:20 +00005184 case QEMU_OPTION_fda:
bellardcd6f1162004-05-13 22:02:20 +00005185 case QEMU_OPTION_fdb:
balrog609497a2008-01-14 02:56:53 +00005186 drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
bellardc45886d2004-01-05 00:02:06 +00005187 break;
bellard52ca8d62006-06-14 16:03:05 +00005188#ifdef TARGET_I386
5189 case QEMU_OPTION_no_fd_bootchk:
5190 fd_bootchk = 0;
5191 break;
5192#endif
bellard7c9d8e02005-11-15 22:16:05 +00005193 case QEMU_OPTION_net:
5194 if (nb_net_clients >= MAX_NET_CLIENTS) {
5195 fprintf(stderr, "qemu: too many network clients\n");
bellardc4b1fcc2004-03-14 21:44:30 +00005196 exit(1);
5197 }
pbrookfd5f3932008-03-26 20:55:43 +00005198 net_clients[nb_net_clients] = optarg;
bellard7c9d8e02005-11-15 22:16:05 +00005199 nb_net_clients++;
bellard702c6512004-04-02 21:21:32 +00005200 break;
bellardc7f74642004-08-24 21:57:12 +00005201#ifdef CONFIG_SLIRP
5202 case QEMU_OPTION_tftp:
Jan Kiszkaad196a92009-06-24 14:42:28 +02005203 legacy_tftp_prefix = optarg;
bellard9bf05442004-08-25 22:12:49 +00005204 break;
ths47d5d012007-02-20 00:05:08 +00005205 case QEMU_OPTION_bootp:
Jan Kiszkaad196a92009-06-24 14:42:28 +02005206 legacy_bootp_filename = optarg;
ths47d5d012007-02-20 00:05:08 +00005207 break;
bellardc94c8d62004-09-13 21:37:34 +00005208#ifndef _WIN32
bellard9d728e82004-09-05 23:09:03 +00005209 case QEMU_OPTION_smb:
Jan Kiszkaad196a92009-06-24 14:42:28 +02005210 net_slirp_smb(optarg);
bellard9d728e82004-09-05 23:09:03 +00005211 break;
bellardc94c8d62004-09-13 21:37:34 +00005212#endif
bellard9bf05442004-08-25 22:12:49 +00005213 case QEMU_OPTION_redir:
Jan Kiszkaf3546de2009-06-24 14:42:28 +02005214 net_slirp_redir(optarg);
bellard9bf05442004-08-25 22:12:49 +00005215 break;
bellardc7f74642004-08-24 21:57:12 +00005216#endif
balrogdc72ac12008-11-09 00:04:26 +00005217 case QEMU_OPTION_bt:
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02005218 add_device_config(DEV_BT, optarg);
balrogdc72ac12008-11-09 00:04:26 +00005219 break;
bellard1d14ffa2005-10-30 18:58:22 +00005220#ifdef HAS_AUDIO
bellard1d14ffa2005-10-30 18:58:22 +00005221 case QEMU_OPTION_audio_help:
5222 AUD_help ();
5223 exit (0);
5224 break;
5225 case QEMU_OPTION_soundhw:
5226 select_soundhw (optarg);
5227 break;
5228#endif
bellardcd6f1162004-05-13 22:02:20 +00005229 case QEMU_OPTION_h:
ths15f82202007-06-29 23:26:08 +00005230 help(0);
bellardcd6f1162004-05-13 22:02:20 +00005231 break;
pbrook9bd7e6d2009-04-07 22:58:45 +00005232 case QEMU_OPTION_version:
5233 version();
5234 exit(0);
5235 break;
aurel3200f82b82008-04-27 21:12:55 +00005236 case QEMU_OPTION_m: {
5237 uint64_t value;
5238 char *ptr;
5239
5240 value = strtoul(optarg, &ptr, 10);
5241 switch (*ptr) {
5242 case 0: case 'M': case 'm':
5243 value <<= 20;
5244 break;
5245 case 'G': case 'g':
5246 value <<= 30;
5247 break;
5248 default:
5249 fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
bellardcd6f1162004-05-13 22:02:20 +00005250 exit(1);
5251 }
aurel3200f82b82008-04-27 21:12:55 +00005252
5253 /* On 32-bit hosts, QEMU is limited by virtual address space */
Anthony Liguori4a1418e2009-08-10 17:07:24 -05005254 if (value > (2047 << 20) && HOST_LONG_BITS == 32) {
aurel3200f82b82008-04-27 21:12:55 +00005255 fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
5256 exit(1);
5257 }
5258 if (value != (uint64_t)(ram_addr_t)value) {
5259 fprintf(stderr, "qemu: ram size too large\n");
5260 exit(1);
5261 }
5262 ram_size = value;
bellardcd6f1162004-05-13 22:02:20 +00005263 break;
aurel3200f82b82008-04-27 21:12:55 +00005264 }
bellardcd6f1162004-05-13 22:02:20 +00005265 case QEMU_OPTION_d:
5266 {
5267 int mask;
blueswir1c7cd6a32008-10-02 18:27:46 +00005268 const CPULogItem *item;
ths3b46e622007-09-17 08:09:54 +00005269
bellardcd6f1162004-05-13 22:02:20 +00005270 mask = cpu_str_to_log_mask(optarg);
5271 if (!mask) {
5272 printf("Log items (comma separated):\n");
bellardf193c792004-03-21 17:06:25 +00005273 for(item = cpu_log_items; item->mask != 0; item++) {
5274 printf("%-10s %s\n", item->name, item->help);
5275 }
5276 exit(1);
bellardcd6f1162004-05-13 22:02:20 +00005277 }
5278 cpu_set_log(mask);
bellardf193c792004-03-21 17:06:25 +00005279 }
bellardcd6f1162004-05-13 22:02:20 +00005280 break;
bellardcd6f1162004-05-13 22:02:20 +00005281 case QEMU_OPTION_s:
aliguori59030a82009-04-05 18:43:41 +00005282 gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
bellardcd6f1162004-05-13 22:02:20 +00005283 break;
aliguori59030a82009-04-05 18:43:41 +00005284 case QEMU_OPTION_gdb:
5285 gdbstub_dev = optarg;
bellardcd6f1162004-05-13 22:02:20 +00005286 break;
bellardcd6f1162004-05-13 22:02:20 +00005287 case QEMU_OPTION_L:
Paul Brook5cea8592009-05-30 00:52:44 +01005288 data_dir = optarg;
bellardcd6f1162004-05-13 22:02:20 +00005289 break;
j_mayer1192dad2007-10-05 13:08:35 +00005290 case QEMU_OPTION_bios:
5291 bios_name = optarg;
5292 break;
aurel321b530a62009-04-05 20:08:59 +00005293 case QEMU_OPTION_singlestep:
5294 singlestep = 1;
5295 break;
bellardcd6f1162004-05-13 22:02:20 +00005296 case QEMU_OPTION_S:
pbrook3c07f8e2007-01-21 16:47:01 +00005297 autostart = 0;
bellardcd6f1162004-05-13 22:02:20 +00005298 break;
blueswir15824d652009-03-28 06:44:27 +00005299#ifndef _WIN32
bellard3d11d0e2004-12-12 16:56:30 +00005300 case QEMU_OPTION_k:
5301 keyboard_layout = optarg;
5302 break;
blueswir15824d652009-03-28 06:44:27 +00005303#endif
bellardee22c2f2004-06-03 12:49:50 +00005304 case QEMU_OPTION_localtime:
5305 rtc_utc = 0;
5306 break;
malc3893c122008-09-28 00:42:05 +00005307 case QEMU_OPTION_vga:
5308 select_vgahw (optarg);
bellard1bfe8562004-07-08 21:17:50 +00005309 break;
blueswir15824d652009-03-28 06:44:27 +00005310#if defined(TARGET_PPC) || defined(TARGET_SPARC)
bellarde9b137c2004-06-21 16:46:10 +00005311 case QEMU_OPTION_g:
5312 {
5313 const char *p;
5314 int w, h, depth;
5315 p = optarg;
5316 w = strtol(p, (char **)&p, 10);
5317 if (w <= 0) {
5318 graphic_error:
5319 fprintf(stderr, "qemu: invalid resolution or depth\n");
5320 exit(1);
5321 }
5322 if (*p != 'x')
5323 goto graphic_error;
5324 p++;
5325 h = strtol(p, (char **)&p, 10);
5326 if (h <= 0)
5327 goto graphic_error;
5328 if (*p == 'x') {
5329 p++;
5330 depth = strtol(p, (char **)&p, 10);
ths5fafdf22007-09-16 21:08:06 +00005331 if (depth != 8 && depth != 15 && depth != 16 &&
bellarde9b137c2004-06-21 16:46:10 +00005332 depth != 24 && depth != 32)
5333 goto graphic_error;
5334 } else if (*p == '\0') {
5335 depth = graphic_depth;
5336 } else {
5337 goto graphic_error;
5338 }
ths3b46e622007-09-17 08:09:54 +00005339
bellarde9b137c2004-06-21 16:46:10 +00005340 graphic_width = w;
5341 graphic_height = h;
5342 graphic_depth = depth;
5343 }
5344 break;
blueswir15824d652009-03-28 06:44:27 +00005345#endif
ths20d8a3e2007-02-18 17:04:49 +00005346 case QEMU_OPTION_echr:
5347 {
5348 char *r;
5349 term_escape_char = strtol(optarg, &r, 0);
5350 if (r == optarg)
5351 printf("Bad argument to echr\n");
5352 break;
5353 }
bellard82c643f2004-07-14 17:28:13 +00005354 case QEMU_OPTION_monitor:
pbrookfd5f3932008-03-26 20:55:43 +00005355 monitor_device = optarg;
bellard82c643f2004-07-14 17:28:13 +00005356 break;
5357 case QEMU_OPTION_serial:
bellard8d11df92004-08-24 21:13:40 +00005358 if (serial_device_index >= MAX_SERIAL_PORTS) {
5359 fprintf(stderr, "qemu: too many serial ports\n");
5360 exit(1);
5361 }
pbrookfd5f3932008-03-26 20:55:43 +00005362 serial_devices[serial_device_index] = optarg;
bellard8d11df92004-08-24 21:13:40 +00005363 serial_device_index++;
bellard82c643f2004-07-14 17:28:13 +00005364 break;
Richard W.M. Jones9dd986c2009-04-25 13:56:19 +01005365 case QEMU_OPTION_watchdog:
Markus Armbruster09aaa162009-08-21 10:31:34 +02005366 if (watchdog) {
5367 fprintf(stderr,
5368 "qemu: only one watchdog option may be given\n");
5369 return 1;
5370 }
5371 watchdog = optarg;
Richard W.M. Jones9dd986c2009-04-25 13:56:19 +01005372 break;
5373 case QEMU_OPTION_watchdog_action:
5374 if (select_watchdog_action(optarg) == -1) {
5375 fprintf(stderr, "Unknown -watchdog-action parameter\n");
5376 exit(1);
5377 }
5378 break;
aliguori51ecf132009-01-15 20:06:40 +00005379 case QEMU_OPTION_virtiocon:
5380 if (virtio_console_index >= MAX_VIRTIO_CONSOLES) {
5381 fprintf(stderr, "qemu: too many virtio consoles\n");
5382 exit(1);
5383 }
5384 virtio_consoles[virtio_console_index] = optarg;
5385 virtio_console_index++;
5386 break;
bellard6508fe52005-01-15 12:02:56 +00005387 case QEMU_OPTION_parallel:
5388 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
5389 fprintf(stderr, "qemu: too many parallel ports\n");
5390 exit(1);
5391 }
pbrookfd5f3932008-03-26 20:55:43 +00005392 parallel_devices[parallel_device_index] = optarg;
bellard6508fe52005-01-15 12:02:56 +00005393 parallel_device_index++;
5394 break;
bellardd63d3072004-10-03 13:29:03 +00005395 case QEMU_OPTION_loadvm:
5396 loadvm = optarg;
5397 break;
5398 case QEMU_OPTION_full_screen:
5399 full_screen = 1;
5400 break;
ths667acca2006-12-11 02:08:05 +00005401#ifdef CONFIG_SDL
ths43523e92007-02-18 18:19:32 +00005402 case QEMU_OPTION_no_frame:
5403 no_frame = 1;
5404 break;
ths3780e192007-06-21 21:08:02 +00005405 case QEMU_OPTION_alt_grab:
5406 alt_grab = 1;
5407 break;
ths667acca2006-12-11 02:08:05 +00005408 case QEMU_OPTION_no_quit:
5409 no_quit = 1;
5410 break;
aliguori7d957bd2009-01-15 22:14:11 +00005411 case QEMU_OPTION_sdl:
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005412 display_type = DT_SDL;
aliguori7d957bd2009-01-15 22:14:11 +00005413 break;
ths667acca2006-12-11 02:08:05 +00005414#endif
bellardf7cce892004-12-08 22:21:25 +00005415 case QEMU_OPTION_pidfile:
ths93815bc2007-03-19 15:58:31 +00005416 pid_file = optarg;
bellardf7cce892004-12-08 22:21:25 +00005417 break;
bellarda09db212005-04-30 16:10:35 +00005418#ifdef TARGET_I386
5419 case QEMU_OPTION_win2k_hack:
5420 win2k_install_hack = 1;
5421 break;
aliguori73822ec2009-01-15 20:11:34 +00005422 case QEMU_OPTION_rtc_td_hack:
5423 rtc_td_hack = 1;
5424 break;
aliguori8a92ea22009-02-27 20:12:36 +00005425 case QEMU_OPTION_acpitable:
5426 if(acpi_table_add(optarg) < 0) {
5427 fprintf(stderr, "Wrong acpi table provided\n");
5428 exit(1);
5429 }
5430 break;
aliguorib6f6e3d2009-04-17 18:59:56 +00005431 case QEMU_OPTION_smbios:
5432 if(smbios_entry_add(optarg) < 0) {
5433 fprintf(stderr, "Wrong smbios provided\n");
5434 exit(1);
5435 }
5436 break;
bellarda09db212005-04-30 16:10:35 +00005437#endif
aliguori7ba1e612008-11-05 16:04:33 +00005438#ifdef CONFIG_KVM
5439 case QEMU_OPTION_enable_kvm:
5440 kvm_allowed = 1;
aliguori7ba1e612008-11-05 16:04:33 +00005441 break;
5442#endif
bellardbb36d472005-11-05 14:22:28 +00005443 case QEMU_OPTION_usb:
5444 usb_enabled = 1;
5445 break;
bellarda594cfb2005-11-06 16:13:29 +00005446 case QEMU_OPTION_usbdevice:
5447 usb_enabled = 1;
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02005448 add_device_config(DEV_USB, optarg);
5449 break;
5450 case QEMU_OPTION_device:
Gerd Hoffmannf31d07d2009-07-31 12:25:37 +02005451 opts = qemu_opts_parse(&qemu_device_opts, optarg, "driver");
5452 if (!opts) {
5453 fprintf(stderr, "parse error: %s\n", optarg);
5454 exit(1);
5455 }
bellarda594cfb2005-11-06 16:13:29 +00005456 break;
bellard6a00d602005-11-21 23:25:50 +00005457 case QEMU_OPTION_smp:
Andre Przywaradc6b1c02009-08-19 15:42:40 +02005458 smp_parse(optarg);
aliguorib2097002008-10-07 20:39:39 +00005459 if (smp_cpus < 1) {
bellard6a00d602005-11-21 23:25:50 +00005460 fprintf(stderr, "Invalid number of CPUs\n");
5461 exit(1);
5462 }
Jes Sorensen6be68d72009-07-23 17:03:42 +02005463 if (max_cpus < smp_cpus) {
5464 fprintf(stderr, "maxcpus must be equal to or greater than "
5465 "smp\n");
5466 exit(1);
5467 }
5468 if (max_cpus > 255) {
5469 fprintf(stderr, "Unsupported number of maxcpus\n");
5470 exit(1);
5471 }
bellard6a00d602005-11-21 23:25:50 +00005472 break;
bellard24236862006-04-30 21:28:36 +00005473 case QEMU_OPTION_vnc:
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005474 display_type = DT_VNC;
ths73fc9742006-12-22 02:09:07 +00005475 vnc_display = optarg;
bellard24236862006-04-30 21:28:36 +00005476 break;
blueswir15824d652009-03-28 06:44:27 +00005477#ifdef TARGET_I386
bellard6515b202006-05-03 22:02:44 +00005478 case QEMU_OPTION_no_acpi:
5479 acpi_enabled = 0;
5480 break;
aliguori16b29ae2008-12-17 23:28:44 +00005481 case QEMU_OPTION_no_hpet:
5482 no_hpet = 1;
5483 break;
Markus Armbruster7d4c3d52009-06-26 19:15:14 +02005484 case QEMU_OPTION_balloon:
5485 if (balloon_parse(optarg) < 0) {
5486 fprintf(stderr, "Unknown -balloon argument %s\n", optarg);
5487 exit(1);
5488 }
Eduardo Habkostdf97b922009-06-10 16:34:08 -03005489 break;
blueswir15824d652009-03-28 06:44:27 +00005490#endif
bellardd1beab82006-10-02 19:44:22 +00005491 case QEMU_OPTION_no_reboot:
5492 no_reboot = 1;
5493 break;
aurel32b2f76162008-04-11 21:35:52 +00005494 case QEMU_OPTION_no_shutdown:
5495 no_shutdown = 1;
5496 break;
balrog9467cd42007-05-01 01:34:14 +00005497 case QEMU_OPTION_show_cursor:
5498 cursor_hide = 0;
5499 break;
blueswir18fcb1b92008-09-18 18:29:08 +00005500 case QEMU_OPTION_uuid:
5501 if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
5502 fprintf(stderr, "Fail to parse UUID string."
5503 " Wrong format.\n");
5504 exit(1);
5505 }
5506 break;
blueswir15824d652009-03-28 06:44:27 +00005507#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00005508 case QEMU_OPTION_daemonize:
5509 daemonize = 1;
5510 break;
blueswir15824d652009-03-28 06:44:27 +00005511#endif
ths9ae02552007-01-05 17:39:04 +00005512 case QEMU_OPTION_option_rom:
5513 if (nb_option_roms >= MAX_OPTION_ROMS) {
5514 fprintf(stderr, "Too many option ROMs\n");
5515 exit(1);
5516 }
5517 option_rom[nb_option_roms] = optarg;
5518 nb_option_roms++;
5519 break;
blueswir15824d652009-03-28 06:44:27 +00005520#if defined(TARGET_ARM) || defined(TARGET_M68K)
pbrook8e716212007-01-20 17:12:09 +00005521 case QEMU_OPTION_semihosting:
5522 semihosting_enabled = 1;
5523 break;
blueswir15824d652009-03-28 06:44:27 +00005524#endif
thsc35734b2007-03-19 15:17:08 +00005525 case QEMU_OPTION_name:
Andi Kleen18894652009-07-02 09:34:17 +02005526 qemu_name = qemu_strdup(optarg);
5527 {
5528 char *p = strchr(qemu_name, ',');
5529 if (p != NULL) {
5530 *p++ = 0;
5531 if (strncmp(p, "process=", 8)) {
5532 fprintf(stderr, "Unknown subargument %s to -name", p);
5533 exit(1);
5534 }
5535 p += 8;
5536 set_proc_name(p);
5537 }
5538 }
thsc35734b2007-03-19 15:17:08 +00005539 break;
blueswir195efd112008-12-24 20:26:14 +00005540#if defined(TARGET_SPARC) || defined(TARGET_PPC)
blueswir166508602007-05-01 14:16:52 +00005541 case QEMU_OPTION_prom_env:
5542 if (nb_prom_envs >= MAX_PROM_ENVS) {
5543 fprintf(stderr, "Too many prom variables\n");
5544 exit(1);
5545 }
5546 prom_envs[nb_prom_envs] = optarg;
5547 nb_prom_envs++;
5548 break;
5549#endif
balrog2b8f2d42007-07-27 22:08:46 +00005550#ifdef TARGET_ARM
5551 case QEMU_OPTION_old_param:
5552 old_param = 1;
ths05ebd532008-01-08 19:32:16 +00005553 break;
balrog2b8f2d42007-07-27 22:08:46 +00005554#endif
thsf3dcfad2007-08-24 01:26:02 +00005555 case QEMU_OPTION_clock:
5556 configure_alarms(optarg);
5557 break;
bellard7e0af5d02007-11-07 16:24:33 +00005558 case QEMU_OPTION_startdate:
5559 {
5560 struct tm tm;
balrogf6503052008-02-17 11:42:19 +00005561 time_t rtc_start_date;
bellard7e0af5d02007-11-07 16:24:33 +00005562 if (!strcmp(optarg, "now")) {
balrogf6503052008-02-17 11:42:19 +00005563 rtc_date_offset = -1;
bellard7e0af5d02007-11-07 16:24:33 +00005564 } else {
5565 if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
5566 &tm.tm_year,
5567 &tm.tm_mon,
5568 &tm.tm_mday,
5569 &tm.tm_hour,
5570 &tm.tm_min,
5571 &tm.tm_sec) == 6) {
5572 /* OK */
5573 } else if (sscanf(optarg, "%d-%d-%d",
5574 &tm.tm_year,
5575 &tm.tm_mon,
5576 &tm.tm_mday) == 3) {
5577 tm.tm_hour = 0;
5578 tm.tm_min = 0;
5579 tm.tm_sec = 0;
5580 } else {
5581 goto date_fail;
5582 }
5583 tm.tm_year -= 1900;
5584 tm.tm_mon--;
bellard3c6b2082007-11-10 19:36:39 +00005585 rtc_start_date = mktimegm(&tm);
bellard7e0af5d02007-11-07 16:24:33 +00005586 if (rtc_start_date == -1) {
5587 date_fail:
5588 fprintf(stderr, "Invalid date format. Valid format are:\n"
5589 "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
5590 exit(1);
5591 }
balrogf6503052008-02-17 11:42:19 +00005592 rtc_date_offset = time(NULL) - rtc_start_date;
bellard7e0af5d02007-11-07 16:24:33 +00005593 }
5594 }
5595 break;
bellard26a5f132008-05-28 12:30:31 +00005596 case QEMU_OPTION_tb_size:
5597 tb_size = strtol(optarg, NULL, 0);
5598 if (tb_size < 0)
5599 tb_size = 0;
5600 break;
pbrook2e70f6e2008-06-29 01:03:05 +00005601 case QEMU_OPTION_icount:
5602 use_icount = 1;
5603 if (strcmp(optarg, "auto") == 0) {
5604 icount_time_shift = -1;
5605 } else {
5606 icount_time_shift = strtol(optarg, NULL, 0);
5607 }
5608 break;
aliguori5bb79102008-10-13 03:12:02 +00005609 case QEMU_OPTION_incoming:
5610 incoming = optarg;
5611 break;
blueswir15824d652009-03-28 06:44:27 +00005612#ifndef _WIN32
aliguori08585322009-02-27 22:09:45 +00005613 case QEMU_OPTION_chroot:
5614 chroot_dir = optarg;
5615 break;
5616 case QEMU_OPTION_runas:
5617 run_as = optarg;
5618 break;
blueswir15824d652009-03-28 06:44:27 +00005619#endif
aliguorie37630c2009-04-22 15:19:10 +00005620#ifdef CONFIG_XEN
5621 case QEMU_OPTION_xen_domid:
5622 xen_domid = atoi(optarg);
5623 break;
5624 case QEMU_OPTION_xen_create:
5625 xen_mode = XEN_CREATE;
5626 break;
5627 case QEMU_OPTION_xen_attach:
5628 xen_mode = XEN_ATTACH;
5629 break;
5630#endif
bellardcd6f1162004-05-13 22:02:20 +00005631 }
bellard0824d6f2003-06-24 13:42:40 +00005632 }
5633 }
bellard330d0412003-07-26 18:11:40 +00005634
Paul Brook5cea8592009-05-30 00:52:44 +01005635 /* If no data_dir is specified then try to find it relative to the
5636 executable path. */
5637 if (!data_dir) {
5638 data_dir = find_datadir(argv[0]);
5639 }
5640 /* If all else fails use the install patch specified when building. */
5641 if (!data_dir) {
5642 data_dir = CONFIG_QEMU_SHAREDIR;
5643 }
5644
Jes Sorensen6be68d72009-07-23 17:03:42 +02005645 /*
5646 * Default to max_cpus = smp_cpus, in case the user doesn't
5647 * specify a max_cpus value.
5648 */
5649 if (!max_cpus)
5650 max_cpus = smp_cpus;
5651
balrog3d878ca2008-10-28 10:59:59 +00005652 machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
aliguorib2097002008-10-07 20:39:39 +00005653 if (smp_cpus > machine->max_cpus) {
5654 fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
5655 "supported by machine `%s' (%d)\n", smp_cpus, machine->name,
5656 machine->max_cpus);
5657 exit(1);
5658 }
5659
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005660 if (display_type == DT_NOGRAPHIC) {
aliguoribc0129d2008-08-01 15:12:34 +00005661 if (serial_device_index == 0)
5662 serial_devices[0] = "stdio";
5663 if (parallel_device_index == 0)
5664 parallel_devices[0] = "null";
5665 if (strncmp(monitor_device, "vc", 2) == 0)
5666 monitor_device = "stdio";
5667 }
5668
ths71e3ceb2006-12-22 02:11:31 +00005669#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00005670 if (daemonize) {
5671 pid_t pid;
5672
5673 if (pipe(fds) == -1)
5674 exit(1);
5675
5676 pid = fork();
5677 if (pid > 0) {
5678 uint8_t status;
5679 ssize_t len;
5680
5681 close(fds[1]);
5682
5683 again:
ths93815bc2007-03-19 15:58:31 +00005684 len = read(fds[0], &status, 1);
5685 if (len == -1 && (errno == EINTR))
5686 goto again;
5687
5688 if (len != 1)
5689 exit(1);
5690 else if (status == 1) {
5691 fprintf(stderr, "Could not acquire pidfile\n");
5692 exit(1);
5693 } else
5694 exit(0);
ths71e3ceb2006-12-22 02:11:31 +00005695 } else if (pid < 0)
ths93815bc2007-03-19 15:58:31 +00005696 exit(1);
ths71e3ceb2006-12-22 02:11:31 +00005697
5698 setsid();
5699
5700 pid = fork();
5701 if (pid > 0)
5702 exit(0);
5703 else if (pid < 0)
5704 exit(1);
5705
5706 umask(027);
ths71e3ceb2006-12-22 02:11:31 +00005707
5708 signal(SIGTSTP, SIG_IGN);
5709 signal(SIGTTOU, SIG_IGN);
5710 signal(SIGTTIN, SIG_IGN);
5711 }
ths71e3ceb2006-12-22 02:11:31 +00005712
thsaa26bb22007-03-25 21:33:06 +00005713 if (pid_file && qemu_create_pidfile(pid_file) != 0) {
ths93815bc2007-03-19 15:58:31 +00005714 if (daemonize) {
5715 uint8_t status = 1;
5716 write(fds[1], &status, 1);
5717 } else
5718 fprintf(stderr, "Could not acquire pid file\n");
5719 exit(1);
5720 }
blueswir1b9e82a52009-04-05 18:03:31 +00005721#endif
ths93815bc2007-03-19 15:58:31 +00005722
aliguori3fcf7b62009-04-24 18:03:25 +00005723 if (qemu_init_main_loop()) {
5724 fprintf(stderr, "qemu_init_main_loop failed\n");
5725 exit(1);
5726 }
bellarda20dd502003-09-30 21:07:02 +00005727 linux_boot = (kernel_filename != NULL);
balrog6c41b272007-11-17 12:12:29 +00005728
thsf8d39c02008-07-03 10:01:15 +00005729 if (!linux_boot && *kernel_cmdline != '\0') {
5730 fprintf(stderr, "-append only allowed with -kernel option\n");
5731 exit(1);
5732 }
5733
5734 if (!linux_boot && initrd_filename != NULL) {
5735 fprintf(stderr, "-initrd only allowed with -kernel option\n");
5736 exit(1);
5737 }
5738
Filip Navarabf65f532009-07-27 10:02:04 -05005739#ifndef _WIN32
5740 /* Win32 doesn't support line-buffering and requires size >= 2 */
bellardb118d612003-06-30 23:36:21 +00005741 setvbuf(stdout, NULL, _IOLBF, 0);
Filip Navarabf65f532009-07-27 10:02:04 -05005742#endif
ths3b46e622007-09-17 08:09:54 +00005743
pbrook634fce92006-07-15 17:40:09 +00005744 init_timers();
aliguori7183b4b2008-11-05 20:40:18 +00005745 if (init_timer_alarm() < 0) {
5746 fprintf(stderr, "could not initialize alarm timer\n");
5747 exit(1);
5748 }
pbrook2e70f6e2008-06-29 01:03:05 +00005749 if (use_icount && icount_time_shift < 0) {
5750 use_icount = 2;
5751 /* 125MIPS seems a reasonable initial guess at the guest speed.
5752 It will be corrected fairly quickly anyway. */
5753 icount_time_shift = 3;
5754 init_icount_adjust();
5755 }
pbrook634fce92006-07-15 17:40:09 +00005756
bellardfd1dff42006-02-01 21:29:26 +00005757#ifdef _WIN32
5758 socket_init();
5759#endif
5760
bellard7c9d8e02005-11-15 22:16:05 +00005761 /* init network clients */
5762 if (nb_net_clients == 0) {
5763 /* if no clients, we use a default config */
aliguorif441b282008-08-28 20:05:14 +00005764 net_clients[nb_net_clients++] = "nic";
5765#ifdef CONFIG_SLIRP
5766 net_clients[nb_net_clients++] = "user";
5767#endif
bellardc20709a2004-04-21 23:27:19 +00005768 }
5769
bellard7c9d8e02005-11-15 22:16:05 +00005770 for(i = 0;i < nb_net_clients; i++) {
balrog9ad97e62008-07-29 13:16:31 +00005771 if (net_client_parse(net_clients[i]) < 0)
bellard7c9d8e02005-11-15 22:16:05 +00005772 exit(1);
bellard702c6512004-04-02 21:21:32 +00005773 }
bellardf1510b22003-06-25 00:07:40 +00005774
Glauber Costa406c8df2009-06-17 09:05:30 -04005775 net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
5776 net_set_boot_mask(net_boot);
5777
5778 net_client_check();
thseec85c22007-01-05 17:41:07 +00005779
balrogdc72ac12008-11-09 00:04:26 +00005780 /* init the bluetooth world */
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02005781 if (foreach_device_config(DEV_BT, bt_parse))
5782 exit(1);
balrogdc72ac12008-11-09 00:04:26 +00005783
bellard0824d6f2003-06-24 13:42:40 +00005784 /* init the memory */
pbrook94a6b542009-04-11 17:15:54 +00005785 if (ram_size == 0)
5786 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
balrog7fb4fdc2008-04-24 17:59:27 +00005787
bellard26a5f132008-05-28 12:30:31 +00005788 /* init the dynamic translator */
5789 cpu_exec_init_all(tb_size * 1024 * 1024);
5790
bellard5905b2e2004-08-01 21:53:26 +00005791 bdrv_init();
thse4bcb142007-12-02 04:51:10 +00005792
5793 /* we always create the cdrom drive, even if no disk is there */
Gerd Hoffmann3b0ba922009-07-22 16:42:59 +02005794 drive_add(NULL, CDROM_ALIAS);
thse4bcb142007-12-02 04:51:10 +00005795
balrog9d413d12007-12-04 00:10:34 +00005796 /* we always create at least one floppy */
Gerd Hoffmann3b0ba922009-07-22 16:42:59 +02005797 drive_add(NULL, FD_ALIAS, 0);
bellardc4b1fcc2004-03-14 21:44:30 +00005798
balrog9d413d12007-12-04 00:10:34 +00005799 /* we always create one sd slot, even if no card is in it */
Gerd Hoffmann3b0ba922009-07-22 16:42:59 +02005800 drive_add(NULL, SD_ALIAS);
balrog9d413d12007-12-04 00:10:34 +00005801
ths96d30e42007-01-07 20:42:14 +00005802 /* open the virtual block devices */
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02005803 if (snapshot)
Gerd Hoffmann7282a032009-07-31 12:25:35 +02005804 qemu_opts_foreach(&qemu_drive_opts, drive_enable_snapshot, NULL, 0);
5805 if (qemu_opts_foreach(&qemu_drive_opts, drive_init_func, machine, 1) != 0)
Gerd Hoffmann9dfd7c72009-07-22 16:43:04 +02005806 exit(1);
balrog3e3d5812007-04-30 02:09:25 +00005807
bellardc88676f2006-08-06 13:36:11 +00005808 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
aliguori475e4272008-10-06 20:21:51 +00005809 register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
bellard8a7ddc32004-03-31 19:00:16 +00005810
aliguori3023f3322009-01-16 19:04:14 +00005811#ifndef _WIN32
5812 /* must be after terminal init, SDL library changes signal handlers */
Jan Kiszka7c3370d2009-05-08 12:34:17 +02005813 sighandler_setup();
aliguori3023f3322009-01-16 19:04:14 +00005814#endif
5815
5816 /* Maintain compatibility with multiple stdio monitors */
5817 if (!strcmp(monitor_device,"stdio")) {
5818 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
5819 const char *devname = serial_devices[i];
5820 if (devname && !strcmp(devname,"mon:stdio")) {
5821 monitor_device = NULL;
5822 break;
5823 } else if (devname && !strcmp(devname,"stdio")) {
5824 monitor_device = NULL;
5825 serial_devices[i] = "mon:stdio";
5826 break;
5827 }
5828 }
5829 }
5830
aliguori268a3622009-04-21 22:30:27 +00005831 if (nb_numa_nodes > 0) {
5832 int i;
5833
5834 if (nb_numa_nodes > smp_cpus) {
5835 nb_numa_nodes = smp_cpus;
5836 }
5837
5838 /* If no memory size if given for any node, assume the default case
5839 * and distribute the available memory equally across all nodes
5840 */
5841 for (i = 0; i < nb_numa_nodes; i++) {
5842 if (node_mem[i] != 0)
5843 break;
5844 }
5845 if (i == nb_numa_nodes) {
5846 uint64_t usedmem = 0;
5847
5848 /* On Linux, the each node's border has to be 8MB aligned,
5849 * the final node gets the rest.
5850 */
5851 for (i = 0; i < nb_numa_nodes - 1; i++) {
5852 node_mem[i] = (ram_size / nb_numa_nodes) & ~((1 << 23UL) - 1);
5853 usedmem += node_mem[i];
5854 }
5855 node_mem[i] = ram_size - usedmem;
5856 }
5857
5858 for (i = 0; i < nb_numa_nodes; i++) {
5859 if (node_cpumask[i] != 0)
5860 break;
5861 }
5862 /* assigning the VCPUs round-robin is easier to implement, guest OSes
5863 * must cope with this anyway, because there are BIOSes out there in
5864 * real machines which also use this scheme.
5865 */
5866 if (i == nb_numa_nodes) {
5867 for (i = 0; i < smp_cpus; i++) {
5868 node_cpumask[i % nb_numa_nodes] |= 1 << i;
5869 }
5870 }
5871 }
5872
aliguori3023f3322009-01-16 19:04:14 +00005873 if (kvm_enabled()) {
5874 int ret;
5875
5876 ret = kvm_init(smp_cpus);
5877 if (ret < 0) {
5878 fprintf(stderr, "failed to initialize KVM\n");
5879 exit(1);
5880 }
5881 }
5882
aliguori4c621802009-01-16 21:48:20 +00005883 if (monitor_device) {
aurel32ceecf1d2009-01-18 14:08:04 +00005884 monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
aliguori4c621802009-01-16 21:48:20 +00005885 if (!monitor_hd) {
5886 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
5887 exit(1);
5888 }
5889 }
5890
aliguori2796dae2009-01-16 20:23:27 +00005891 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5892 const char *devname = serial_devices[i];
5893 if (devname && strcmp(devname, "none")) {
5894 char label[32];
5895 snprintf(label, sizeof(label), "serial%d", i);
aurel32ceecf1d2009-01-18 14:08:04 +00005896 serial_hds[i] = qemu_chr_open(label, devname, NULL);
aliguori2796dae2009-01-16 20:23:27 +00005897 if (!serial_hds[i]) {
5898 fprintf(stderr, "qemu: could not open serial device '%s'\n",
5899 devname);
5900 exit(1);
5901 }
5902 }
5903 }
5904
5905 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5906 const char *devname = parallel_devices[i];
5907 if (devname && strcmp(devname, "none")) {
5908 char label[32];
5909 snprintf(label, sizeof(label), "parallel%d", i);
aurel32ceecf1d2009-01-18 14:08:04 +00005910 parallel_hds[i] = qemu_chr_open(label, devname, NULL);
aliguori2796dae2009-01-16 20:23:27 +00005911 if (!parallel_hds[i]) {
5912 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
5913 devname);
5914 exit(1);
5915 }
5916 }
5917 }
5918
5919 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5920 const char *devname = virtio_consoles[i];
5921 if (devname && strcmp(devname, "none")) {
5922 char label[32];
5923 snprintf(label, sizeof(label), "virtcon%d", i);
aurel32ceecf1d2009-01-18 14:08:04 +00005924 virtcon_hds[i] = qemu_chr_open(label, devname, NULL);
aliguori2796dae2009-01-16 20:23:27 +00005925 if (!virtcon_hds[i]) {
5926 fprintf(stderr, "qemu: could not open virtio console '%s'\n",
5927 devname);
5928 exit(1);
5929 }
5930 }
5931 }
5932
Paul Brookaae94602009-05-14 22:35:06 +01005933 module_call_init(MODULE_INIT_DEVICE);
5934
Markus Armbruster09aaa162009-08-21 10:31:34 +02005935 if (watchdog) {
5936 i = select_watchdog(watchdog);
5937 if (i > 0)
5938 exit (i == 1 ? 1 : 0);
5939 }
5940
Gerd Hoffmannb6b61142009-07-15 13:48:21 +02005941 if (machine->compat_props) {
5942 qdev_prop_register_compat(machine->compat_props);
5943 }
Paul Brookfbe1b592009-05-13 17:56:25 +01005944 machine->init(ram_size, boot_devices,
aliguori3023f3322009-01-16 19:04:14 +00005945 kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
5946
aliguori268a3622009-04-21 22:30:27 +00005947
5948 for (env = first_cpu; env != NULL; env = env->next_cpu) {
5949 for (i = 0; i < nb_numa_nodes; i++) {
5950 if (node_cpumask[i] & (1 << env->cpu_index)) {
5951 env->numa_node = i;
5952 }
5953 }
5954 }
5955
aliguori6f338c32009-02-11 15:21:54 +00005956 current_machine = machine;
5957
aliguori3023f3322009-01-16 19:04:14 +00005958 /* init USB devices */
5959 if (usb_enabled) {
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02005960 foreach_device_config(DEV_USB, usb_parse);
aliguori3023f3322009-01-16 19:04:14 +00005961 }
5962
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02005963 /* init generic devices */
Gerd Hoffmannf31d07d2009-07-31 12:25:37 +02005964 if (qemu_opts_foreach(&qemu_device_opts, device_init_func, NULL, 1) != 0)
Gerd Hoffmannbd3c9482009-07-15 13:59:26 +02005965 exit(1);
5966
aliguori8f391ab2009-01-19 16:34:10 +00005967 if (!display_state)
5968 dumb_display_init();
aliguori3023f3322009-01-16 19:04:14 +00005969 /* just use the first displaystate for the moment */
5970 ds = display_state;
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005971
5972 if (display_type == DT_DEFAULT) {
Anthony Liguorif92f8af2009-05-20 13:01:02 -05005973#if defined(CONFIG_SDL) || defined(CONFIG_COCOA)
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005974 display_type = DT_SDL;
5975#else
5976 display_type = DT_VNC;
5977 vnc_display = "localhost:0,to=99";
5978 show_vnc_port = 1;
5979#endif
5980 }
5981
5982
5983 switch (display_type) {
5984 case DT_NOGRAPHIC:
5985 break;
5986#if defined(CONFIG_CURSES)
5987 case DT_CURSES:
5988 curses_display_init(ds, full_screen);
5989 break;
5990#endif
bellard5b0753e2005-03-01 21:37:28 +00005991#if defined(CONFIG_SDL)
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005992 case DT_SDL:
5993 sdl_display_init(ds, full_screen, no_frame);
5994 break;
bellard5b0753e2005-03-01 21:37:28 +00005995#elif defined(CONFIG_COCOA)
Anthony Liguori993fbfd2009-05-21 16:54:00 -05005996 case DT_SDL:
5997 cocoa_display_init(ds, full_screen);
5998 break;
bellard313aa562003-08-10 21:52:11 +00005999#endif
Anthony Liguori993fbfd2009-05-21 16:54:00 -05006000 case DT_VNC:
6001 vnc_display_init(ds);
6002 if (vnc_display_open(ds, vnc_display) < 0)
6003 exit(1);
Anthony Liguorif92f8af2009-05-20 13:01:02 -05006004
Anthony Liguori993fbfd2009-05-21 16:54:00 -05006005 if (show_vnc_port) {
6006 printf("VNC server running on `%s'\n", vnc_display_local_addr(ds));
Anthony Liguorif92f8af2009-05-20 13:01:02 -05006007 }
Anthony Liguori993fbfd2009-05-21 16:54:00 -05006008 break;
6009 default:
6010 break;
bellard313aa562003-08-10 21:52:11 +00006011 }
aliguori7d957bd2009-01-15 22:14:11 +00006012 dpy_resize(ds);
aliguori5b08fc12008-08-21 20:08:03 +00006013
aliguori3023f3322009-01-16 19:04:14 +00006014 dcl = ds->listeners;
6015 while (dcl != NULL) {
6016 if (dcl->dpy_refresh != NULL) {
6017 ds->gui_timer = qemu_new_timer(rt_clock, gui_update, ds);
6018 qemu_mod_timer(ds->gui_timer, qemu_get_clock(rt_clock));
ths20d8a3e2007-02-18 17:04:49 +00006019 }
aliguori3023f3322009-01-16 19:04:14 +00006020 dcl = dcl->next;
bellard82c643f2004-07-14 17:28:13 +00006021 }
aliguori3023f3322009-01-16 19:04:14 +00006022
Anthony Liguori993fbfd2009-05-21 16:54:00 -05006023 if (display_type == DT_NOGRAPHIC || display_type == DT_VNC) {
blueswir19043b622009-01-21 19:28:13 +00006024 nographic_timer = qemu_new_timer(rt_clock, nographic_update, NULL);
6025 qemu_mod_timer(nographic_timer, qemu_get_clock(rt_clock));
6026 }
6027
aliguori2796dae2009-01-16 20:23:27 +00006028 text_consoles_set_display(display_state);
aliguori2970a6c2009-03-05 22:59:58 +00006029 qemu_chr_initial_reset();
aliguori2796dae2009-01-16 20:23:27 +00006030
aliguori4c621802009-01-16 21:48:20 +00006031 if (monitor_device && monitor_hd)
aliguoricde76ee2009-03-05 23:01:51 +00006032 monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT);
bellard82c643f2004-07-14 17:28:13 +00006033
bellard8d11df92004-08-24 21:13:40 +00006034 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
bellardc03b0f02006-09-03 14:10:53 +00006035 const char *devname = serial_devices[i];
pbrookfd5f3932008-03-26 20:55:43 +00006036 if (devname && strcmp(devname, "none")) {
thsaf3a9032007-07-11 23:14:59 +00006037 if (strstart(devname, "vc", 0))
bellard7ba12602006-07-14 20:26:42 +00006038 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
bellard8d11df92004-08-24 21:13:40 +00006039 }
bellard82c643f2004-07-14 17:28:13 +00006040 }
bellard82c643f2004-07-14 17:28:13 +00006041
bellard6508fe52005-01-15 12:02:56 +00006042 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
bellardc03b0f02006-09-03 14:10:53 +00006043 const char *devname = parallel_devices[i];
pbrookfd5f3932008-03-26 20:55:43 +00006044 if (devname && strcmp(devname, "none")) {
thsaf3a9032007-07-11 23:14:59 +00006045 if (strstart(devname, "vc", 0))
bellard7ba12602006-07-14 20:26:42 +00006046 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
bellard6508fe52005-01-15 12:02:56 +00006047 }
6048 }
6049
aliguori9ede2fd2009-01-15 20:05:25 +00006050 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
6051 const char *devname = virtio_consoles[i];
aliguori2796dae2009-01-16 20:23:27 +00006052 if (virtcon_hds[i] && devname) {
aliguori9ede2fd2009-01-15 20:05:25 +00006053 if (strstart(devname, "vc", 0))
6054 qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i);
6055 }
6056 }
6057
aliguori59030a82009-04-05 18:43:41 +00006058 if (gdbstub_dev && gdbserver_start(gdbstub_dev) < 0) {
6059 fprintf(stderr, "qemu: could not open gdbserver on device '%s'\n",
6060 gdbstub_dev);
6061 exit(1);
balrog45669e02007-07-02 13:20:17 +00006062 }
balrog45669e02007-07-02 13:20:17 +00006063
Juan Quintela05f24012009-08-20 19:42:22 +02006064 if (loadvm) {
6065 if (load_vmstate(cur_mon, loadvm) < 0) {
6066 autostart = 0;
6067 }
6068 }
bellardd63d3072004-10-03 13:29:03 +00006069
Glauber Costa2bb8c102009-07-24 16:20:23 -04006070 if (incoming) {
aliguori5bb79102008-10-13 03:12:02 +00006071 qemu_start_incoming_migration(incoming);
Avi Kivity6b99dad2009-08-09 14:39:20 +03006072 } else if (autostart) {
aliguoric0f4ce72009-03-05 23:01:01 +00006073 vm_start();
Avi Kivity6b99dad2009-08-09 14:39:20 +03006074 }
thsffd843b2006-12-21 19:46:43 +00006075
blueswir1b9e82a52009-04-05 18:03:31 +00006076#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00006077 if (daemonize) {
6078 uint8_t status = 0;
6079 ssize_t len;
ths71e3ceb2006-12-22 02:11:31 +00006080
6081 again1:
6082 len = write(fds[1], &status, 1);
6083 if (len == -1 && (errno == EINTR))
6084 goto again1;
6085
6086 if (len != 1)
6087 exit(1);
6088
aliguoribd54b862008-07-23 00:58:33 +00006089 chdir("/");
balrogaeb30be2007-07-02 15:03:13 +00006090 TFR(fd = open("/dev/null", O_RDWR));
ths71e3ceb2006-12-22 02:11:31 +00006091 if (fd == -1)
6092 exit(1);
aliguori08585322009-02-27 22:09:45 +00006093 }
ths71e3ceb2006-12-22 02:11:31 +00006094
aliguori08585322009-02-27 22:09:45 +00006095 if (run_as) {
6096 pwd = getpwnam(run_as);
6097 if (!pwd) {
6098 fprintf(stderr, "User \"%s\" doesn't exist\n", run_as);
6099 exit(1);
6100 }
6101 }
ths71e3ceb2006-12-22 02:11:31 +00006102
aliguori08585322009-02-27 22:09:45 +00006103 if (chroot_dir) {
6104 if (chroot(chroot_dir) < 0) {
6105 fprintf(stderr, "chroot failed\n");
6106 exit(1);
6107 }
6108 chdir("/");
6109 }
6110
6111 if (run_as) {
6112 if (setgid(pwd->pw_gid) < 0) {
6113 fprintf(stderr, "Failed to setgid(%d)\n", pwd->pw_gid);
6114 exit(1);
6115 }
6116 if (setuid(pwd->pw_uid) < 0) {
6117 fprintf(stderr, "Failed to setuid(%d)\n", pwd->pw_uid);
6118 exit(1);
6119 }
6120 if (setuid(0) != -1) {
6121 fprintf(stderr, "Dropping privileges failed\n");
6122 exit(1);
6123 }
6124 }
aliguori08585322009-02-27 22:09:45 +00006125
6126 if (daemonize) {
6127 dup2(fd, 0);
6128 dup2(fd, 1);
6129 dup2(fd, 2);
6130
6131 close(fd);
ths71e3ceb2006-12-22 02:11:31 +00006132 }
blueswir1b9e82a52009-04-05 18:03:31 +00006133#endif
ths71e3ceb2006-12-22 02:11:31 +00006134
bellard8a7ddc32004-03-31 19:00:16 +00006135 main_loop();
bellard40c3bac2004-04-04 12:56:28 +00006136 quit_timers();
aliguori63a01ef2008-10-31 19:10:00 +00006137 net_cleanup();
thsb46a8902007-10-21 23:20:45 +00006138
bellard0824d6f2003-06-24 13:42:40 +00006139 return 0;
6140}