Statistics
| Branch: | Revision:

root / vl.c @ 7a5e5838

History | View | Annotate | Download (157.3 kB)

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