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