]> git.proxmox.com Git - qemu.git/blame - vl.c
Move CharDriverState code out of vl.c
[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"
39#include "block.h"
40#include "audio/audio.h"
5bb7910a 41#include "migration.h"
67b915a5 42
0824d6fc 43#include <unistd.h>
0824d6fc
FB
44#include <fcntl.h>
45#include <signal.h>
46#include <time.h>
0824d6fc 47#include <errno.h>
67b915a5 48#include <sys/time.h>
c88676f8 49#include <zlib.h>
67b915a5
FB
50
51#ifndef _WIN32
52#include <sys/times.h>
f1510b2c 53#include <sys/wait.h>
67b915a5 54#include <termios.h>
67b915a5 55#include <sys/mman.h>
f1510b2c
FB
56#include <sys/ioctl.h>
57#include <sys/socket.h>
c94c8d64 58#include <netinet/in.h>
9d728e8c 59#include <dirent.h>
7c9d8e07 60#include <netdb.h>
cb4b976b
TS
61#include <sys/select.h>
62#include <arpa/inet.h>
7d3505c5
FB
63#ifdef _BSD
64#include <sys/stat.h>
128ab2ff 65#if !defined(__APPLE__) && !defined(__OpenBSD__)
7d3505c5 66#include <libutil.h>
83fb7adf 67#endif
128ab2ff
BS
68#ifdef __OpenBSD__
69#include <net/if.h>
70#endif
5c40d2bd
TS
71#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
72#include <freebsd/stdlib.h>
7d3505c5 73#else
223f0d72 74#ifdef __linux__
f1510b2c
FB
75#include <linux/if.h>
76#include <linux/if_tun.h>
7d3505c5
FB
77#include <pty.h>
78#include <malloc.h>
fd872598 79#include <linux/rtc.h>
bd494f4c
TS
80
81/* For the benefit of older linux systems which don't supply it,
82 we use a local copy of hpet.h. */
83/* #include <linux/hpet.h> */
84#include "hpet.h"
85
e57a8c0e 86#include <linux/ppdev.h>
5867c88a 87#include <linux/parport.h>
223f0d72
BS
88#endif
89#ifdef __sun__
d5d10bc3
TS
90#include <sys/stat.h>
91#include <sys/ethernet.h>
92#include <sys/sockio.h>
d5d10bc3
TS
93#include <netinet/arp.h>
94#include <netinet/in.h>
95#include <netinet/in_systm.h>
96#include <netinet/ip.h>
97#include <netinet/ip_icmp.h> // must come after ip.h
98#include <netinet/udp.h>
99#include <netinet/tcp.h>
100#include <net/if.h>
101#include <syslog.h>
102#include <stropts.h>
67b915a5 103#endif
7d3505c5 104#endif
ec530c81 105#endif
67b915a5 106
03ff3ca3
AL
107#include "qemu_socket.h"
108
c20709aa
FB
109#if defined(CONFIG_SLIRP)
110#include "libslirp.h"
111#endif
112
9892fbfb
BS
113#if defined(__OpenBSD__)
114#include <util.h>
115#endif
116
8a16d273
TS
117#if defined(CONFIG_VDE)
118#include <libvdeplug.h>
119#endif
120
67b915a5 121#ifdef _WIN32
7d3505c5 122#include <malloc.h>
67b915a5 123#include <sys/timeb.h>
4fddf62a 124#include <mmsystem.h>
67b915a5
FB
125#define getopt_long_only getopt_long
126#define memalign(align, size) malloc(size)
127#endif
128
73332e5c 129#ifdef CONFIG_SDL
96bcd4f8 130#ifdef __APPLE__
83fb7adf 131#include <SDL/SDL.h>
96bcd4f8 132#endif
73332e5c 133#endif /* CONFIG_SDL */
0824d6fc 134
5b0753e0
FB
135#ifdef CONFIG_COCOA
136#undef main
137#define main qemu_main
138#endif /* CONFIG_COCOA */
139
0824d6fc 140#include "disas.h"
fc01f7e7 141
8a7ddc38 142#include "exec-all.h"
0824d6fc 143
5a67135a 144#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
b46a8906 145#define DEFAULT_NETWORK_DOWN_SCRIPT "/etc/qemu-ifdown"
a14d6c8c
PB
146#ifdef __sun__
147#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
148#else
149#define SMBD_COMMAND "/usr/sbin/smbd"
150#endif
f1510b2c 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
7dea1da4
FB
166/* XXX: use a two level table to limit memory usage */
167#define MAX_IOPORTS 65536
0824d6fc 168
80cabfad 169const char *bios_dir = CONFIG_QEMU_SHAREDIR;
1192dad8 170const char *bios_name = NULL;
dbed7e40
BS
171static void *ioport_opaque[MAX_IOPORTS];
172static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
173static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
e4bcb14c 174/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
faea38e7 175 to store the VM snapshots */
e4bcb14c
TS
176DriveInfo drives_table[MAX_DRIVES+1];
177int nb_drives;
faea38e7 178/* point to the block driver where the snapshots are managed */
dbed7e40
BS
179static BlockDriverState *bs_snapshots;
180static int vga_ram_size;
cb5a7aa8 181enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
0e82f34d 182DisplayState display_state;
a20dd508 183int nographic;
dbed7e40 184static int curses;
3d11d0eb 185const char* keyboard_layout = NULL;
313aa567 186int64_t ticks_per_sec;
00f82b8a 187ram_addr_t ram_size;
c4b1fcc0 188int nb_nics;
7c9d8e07 189NICInfo nd_table[MAX_NICS];
8a7ddc38 190int vm_running;
f6503059
AZ
191static int rtc_utc = 1;
192static int rtc_date_offset = -1; /* -1 means no change */
1bfe856e 193int cirrus_vga_enabled = 1;
d34cab9f 194int vmsvga_enabled = 0;
d827220b
FB
195#ifdef TARGET_SPARC
196int graphic_width = 1024;
197int graphic_height = 768;
eee0b836 198int graphic_depth = 8;
d827220b 199#else
1bfe856e
FB
200int graphic_width = 800;
201int graphic_height = 600;
e9b137c2 202int graphic_depth = 15;
eee0b836 203#endif
dbed7e40
BS
204static int full_screen = 0;
205static int no_frame = 0;
667accab 206int no_quit = 0;
8d11df9e 207CharDriverState *serial_hds[MAX_SERIAL_PORTS];
6508fe59 208CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
a09db21f
FB
209#ifdef TARGET_I386
210int win2k_install_hack = 0;
211#endif
bb36d470 212int usb_enabled = 0;
7c9d8e07 213static VLANState *first_vlan;
6a00d601 214int smp_cpus = 1;
73fc9742 215const char *vnc_display;
6515b203 216int acpi_enabled = 1;
52ca8d6a 217int fd_bootchk = 1;
d1beab82 218int no_reboot = 0;
b2f76161 219int no_shutdown = 0;
9467cd46 220int cursor_hide = 1;
a171fe39 221int graphic_rotate = 0;
71e3ceb8 222int daemonize = 0;
9ae02555
TS
223const char *option_rom[MAX_OPTION_ROMS];
224int nb_option_roms;
8e71621f 225int semihosting_enabled = 0;
2b8f2d41
AZ
226#ifdef TARGET_ARM
227int old_param = 0;
228#endif
c35734b2 229const char *qemu_name;
3780e197 230int alt_grab = 0;
66508601
BS
231#ifdef TARGET_SPARC
232unsigned int nb_prom_envs = 0;
233const char *prom_envs[MAX_PROM_ENVS];
234#endif
dbed7e40
BS
235static int nb_drives_opt;
236static struct drive_opt {
609497ab
AZ
237 const char *file;
238 char opt[1024];
239} drives_opt[MAX_DRIVES];
0824d6fc 240
ee5605e5
AZ
241static CPUState *cur_cpu;
242static CPUState *next_cpu;
76ea08f9 243static int event_pending = 1;
bf20dc07 244/* Conversion factor from emulated instructions to virtual clock ticks. */
2e70f6ef 245static int icount_time_shift;
bf20dc07 246/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
2e70f6ef
PB
247#define MAX_ICOUNT_SHIFT 10
248/* Compensate for varying guest execution speed. */
249static int64_t qemu_icount_bias;
dbed7e40
BS
250static QEMUTimer *icount_rt_timer;
251static QEMUTimer *icount_vm_timer;
ee5605e5 252
8fcb1b90
BS
253uint8_t qemu_uuid[16];
254
0824d6fc 255/***********************************************************/
26aa7d72
FB
256/* x86 ISA bus support */
257
258target_phys_addr_t isa_mem_base = 0;
3de388f6 259PicState2 *isa_pic;
0824d6fc 260
477e3edf
AL
261static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl;
262static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel;
263
264static uint32_t ioport_read(int index, uint32_t address)
265{
266 static IOPortReadFunc *default_func[3] = {
267 default_ioport_readb,
268 default_ioport_readw,
269 default_ioport_readl
270 };
271 IOPortReadFunc *func = ioport_read_table[index][address];
272 if (!func)
273 func = default_func[index];
274 return func(ioport_opaque[address], address);
275}
276
277static void ioport_write(int index, uint32_t address, uint32_t data)
278{
279 static IOPortWriteFunc *default_func[3] = {
280 default_ioport_writeb,
281 default_ioport_writew,
282 default_ioport_writel
283 };
284 IOPortWriteFunc *func = ioport_write_table[index][address];
285 if (!func)
286 func = default_func[index];
287 func(ioport_opaque[address], address, data);
288}
289
9596ebb7 290static uint32_t default_ioport_readb(void *opaque, uint32_t address)
0824d6fc
FB
291{
292#ifdef DEBUG_UNUSED_IOPORT
1196be37 293 fprintf(stderr, "unused inb: port=0x%04x\n", address);
0824d6fc 294#endif
fc01f7e7 295 return 0xff;
0824d6fc
FB
296}
297
9596ebb7 298static void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
0824d6fc
FB
299{
300#ifdef DEBUG_UNUSED_IOPORT
1196be37 301 fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
0824d6fc
FB
302#endif
303}
304
305/* default is to make two byte accesses */
9596ebb7 306static uint32_t default_ioport_readw(void *opaque, uint32_t address)
0824d6fc
FB
307{
308 uint32_t data;
477e3edf 309 data = ioport_read(0, address);
db45c29a 310 address = (address + 1) & (MAX_IOPORTS - 1);
477e3edf 311 data |= ioport_read(0, address) << 8;
0824d6fc
FB
312 return data;
313}
314
9596ebb7 315static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
0824d6fc 316{
477e3edf 317 ioport_write(0, address, data & 0xff);
db45c29a 318 address = (address + 1) & (MAX_IOPORTS - 1);
477e3edf 319 ioport_write(0, address, (data >> 8) & 0xff);
0824d6fc
FB
320}
321
9596ebb7 322static uint32_t default_ioport_readl(void *opaque, uint32_t address)
0824d6fc 323{
fc01f7e7 324#ifdef DEBUG_UNUSED_IOPORT
1196be37 325 fprintf(stderr, "unused inl: port=0x%04x\n", address);
fc01f7e7
FB
326#endif
327 return 0xffffffff;
0824d6fc
FB
328}
329
9596ebb7 330static void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
0824d6fc 331{
fc01f7e7 332#ifdef DEBUG_UNUSED_IOPORT
1196be37 333 fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
fc01f7e7 334#endif
0824d6fc
FB
335}
336
fc01f7e7 337/* size is the word size in byte */
5fafdf24 338int register_ioport_read(int start, int length, int size,
c4b1fcc0 339 IOPortReadFunc *func, void *opaque)
f1510b2c 340{
fc01f7e7 341 int i, bsize;
f1510b2c 342
c4b1fcc0 343 if (size == 1) {
fc01f7e7 344 bsize = 0;
c4b1fcc0 345 } else if (size == 2) {
fc01f7e7 346 bsize = 1;
c4b1fcc0 347 } else if (size == 4) {
fc01f7e7 348 bsize = 2;
c4b1fcc0 349 } else {
88fdf56f 350 hw_error("register_ioport_read: invalid size");
fc01f7e7 351 return -1;
c4b1fcc0
FB
352 }
353 for(i = start; i < start + length; i += size) {
fc01f7e7 354 ioport_read_table[bsize][i] = func;
c4b1fcc0 355 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
88fdf56f 356 hw_error("register_ioport_read: invalid opaque");
c4b1fcc0
FB
357 ioport_opaque[i] = opaque;
358 }
f1510b2c
FB
359 return 0;
360}
361
fc01f7e7 362/* size is the word size in byte */
5fafdf24 363int register_ioport_write(int start, int length, int size,
c4b1fcc0 364 IOPortWriteFunc *func, void *opaque)
f1510b2c 365{
fc01f7e7 366 int i, bsize;
f1510b2c 367
c4b1fcc0 368 if (size == 1) {
fc01f7e7 369 bsize = 0;
c4b1fcc0 370 } else if (size == 2) {
fc01f7e7 371 bsize = 1;
c4b1fcc0 372 } else if (size == 4) {
fc01f7e7 373 bsize = 2;
c4b1fcc0 374 } else {
88fdf56f 375 hw_error("register_ioport_write: invalid size");
fc01f7e7 376 return -1;
c4b1fcc0
FB
377 }
378 for(i = start; i < start + length; i += size) {
fc01f7e7 379 ioport_write_table[bsize][i] = func;
88fdf56f
AZ
380 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
381 hw_error("register_ioport_write: invalid opaque");
c4b1fcc0
FB
382 ioport_opaque[i] = opaque;
383 }
f1510b2c
FB
384 return 0;
385}
386
69b91039
FB
387void isa_unassign_ioport(int start, int length)
388{
389 int i;
390
391 for(i = start; i < start + length; i++) {
392 ioport_read_table[0][i] = default_ioport_readb;
393 ioport_read_table[1][i] = default_ioport_readw;
394 ioport_read_table[2][i] = default_ioport_readl;
395
396 ioport_write_table[0][i] = default_ioport_writeb;
397 ioport_write_table[1][i] = default_ioport_writew;
398 ioport_write_table[2][i] = default_ioport_writel;
399 }
400}
401
20f32282
FB
402/***********************************************************/
403
c45886db 404void cpu_outb(CPUState *env, int addr, int val)
0824d6fc 405{
fd872598
FB
406#ifdef DEBUG_IOPORT
407 if (loglevel & CPU_LOG_IOPORT)
408 fprintf(logfile, "outb: %04x %02x\n", addr, val);
3b46e624 409#endif
477e3edf 410 ioport_write(0, addr, val);
89bfc105
FB
411#ifdef USE_KQEMU
412 if (env)
413 env->last_io_time = cpu_get_time_fast();
414#endif
0824d6fc
FB
415}
416
c45886db 417void cpu_outw(CPUState *env, int addr, int val)
0824d6fc 418{
fd872598
FB
419#ifdef DEBUG_IOPORT
420 if (loglevel & CPU_LOG_IOPORT)
421 fprintf(logfile, "outw: %04x %04x\n", addr, val);
3b46e624 422#endif
477e3edf 423 ioport_write(1, addr, val);
89bfc105
FB
424#ifdef USE_KQEMU
425 if (env)
426 env->last_io_time = cpu_get_time_fast();
427#endif
0824d6fc
FB
428}
429
c45886db 430void cpu_outl(CPUState *env, int addr, int val)
0824d6fc 431{
fd872598
FB
432#ifdef DEBUG_IOPORT
433 if (loglevel & CPU_LOG_IOPORT)
434 fprintf(logfile, "outl: %04x %08x\n", addr, val);
435#endif
477e3edf 436 ioport_write(2, addr, val);
89bfc105
FB
437#ifdef USE_KQEMU
438 if (env)
439 env->last_io_time = cpu_get_time_fast();
440#endif
0824d6fc
FB
441}
442
c45886db 443int cpu_inb(CPUState *env, int addr)
0824d6fc 444{
fd872598 445 int val;
477e3edf 446 val = ioport_read(0, addr);
fd872598
FB
447#ifdef DEBUG_IOPORT
448 if (loglevel & CPU_LOG_IOPORT)
449 fprintf(logfile, "inb : %04x %02x\n", addr, val);
89bfc105
FB
450#endif
451#ifdef USE_KQEMU
452 if (env)
453 env->last_io_time = cpu_get_time_fast();
fd872598
FB
454#endif
455 return val;
0824d6fc
FB
456}
457
c45886db 458int cpu_inw(CPUState *env, int addr)
0824d6fc 459{
fd872598 460 int val;
477e3edf 461 val = ioport_read(1, addr);
fd872598
FB
462#ifdef DEBUG_IOPORT
463 if (loglevel & CPU_LOG_IOPORT)
464 fprintf(logfile, "inw : %04x %04x\n", addr, val);
89bfc105
FB
465#endif
466#ifdef USE_KQEMU
467 if (env)
468 env->last_io_time = cpu_get_time_fast();
fd872598
FB
469#endif
470 return val;
0824d6fc
FB
471}
472
c45886db 473int cpu_inl(CPUState *env, int addr)
0824d6fc 474{
fd872598 475 int val;
477e3edf 476 val = ioport_read(2, addr);
fd872598
FB
477#ifdef DEBUG_IOPORT
478 if (loglevel & CPU_LOG_IOPORT)
479 fprintf(logfile, "inl : %04x %08x\n", addr, val);
89bfc105
FB
480#endif
481#ifdef USE_KQEMU
482 if (env)
483 env->last_io_time = cpu_get_time_fast();
fd872598
FB
484#endif
485 return val;
0824d6fc
FB
486}
487
488/***********************************************************/
0824d6fc
FB
489void hw_error(const char *fmt, ...)
490{
491 va_list ap;
6a00d601 492 CPUState *env;
0824d6fc
FB
493
494 va_start(ap, fmt);
495 fprintf(stderr, "qemu: hardware error: ");
496 vfprintf(stderr, fmt, ap);
497 fprintf(stderr, "\n");
6a00d601
FB
498 for(env = first_cpu; env != NULL; env = env->next_cpu) {
499 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
0824d6fc 500#ifdef TARGET_I386
6a00d601 501 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
c45886db 502#else
6a00d601 503 cpu_dump_state(env, stderr, fprintf, 0);
0824d6fc 504#endif
6a00d601 505 }
0824d6fc
FB
506 va_end(ap);
507 abort();
508}
509
63066f4f
FB
510/***********************************************************/
511/* keyboard/mouse */
512
513static QEMUPutKBDEvent *qemu_put_kbd_event;
514static void *qemu_put_kbd_event_opaque;
455204eb
TS
515static QEMUPutMouseEntry *qemu_put_mouse_event_head;
516static QEMUPutMouseEntry *qemu_put_mouse_event_current;
63066f4f
FB
517
518void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
519{
520 qemu_put_kbd_event_opaque = opaque;
521 qemu_put_kbd_event = func;
522}
523
455204eb
TS
524QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
525 void *opaque, int absolute,
526 const char *name)
63066f4f 527{
455204eb
TS
528 QEMUPutMouseEntry *s, *cursor;
529
530 s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
531 if (!s)
532 return NULL;
533
534 s->qemu_put_mouse_event = func;
535 s->qemu_put_mouse_event_opaque = opaque;
536 s->qemu_put_mouse_event_absolute = absolute;
537 s->qemu_put_mouse_event_name = qemu_strdup(name);
538 s->next = NULL;
539
540 if (!qemu_put_mouse_event_head) {
541 qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
542 return s;
543 }
544
545 cursor = qemu_put_mouse_event_head;
546 while (cursor->next != NULL)
547 cursor = cursor->next;
548
549 cursor->next = s;
550 qemu_put_mouse_event_current = s;
551
552 return s;
553}
554
555void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
556{
557 QEMUPutMouseEntry *prev = NULL, *cursor;
558
559 if (!qemu_put_mouse_event_head || entry == NULL)
560 return;
561
562 cursor = qemu_put_mouse_event_head;
563 while (cursor != NULL && cursor != entry) {
564 prev = cursor;
565 cursor = cursor->next;
566 }
567
568 if (cursor == NULL) // does not exist or list empty
569 return;
570 else if (prev == NULL) { // entry is head
571 qemu_put_mouse_event_head = cursor->next;
572 if (qemu_put_mouse_event_current == entry)
573 qemu_put_mouse_event_current = cursor->next;
574 qemu_free(entry->qemu_put_mouse_event_name);
575 qemu_free(entry);
576 return;
577 }
578
579 prev->next = entry->next;
580
581 if (qemu_put_mouse_event_current == entry)
582 qemu_put_mouse_event_current = prev;
583
584 qemu_free(entry->qemu_put_mouse_event_name);
585 qemu_free(entry);
63066f4f
FB
586}
587
588void kbd_put_keycode(int keycode)
589{
590 if (qemu_put_kbd_event) {
591 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
592 }
593}
594
595void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
596{
455204eb
TS
597 QEMUPutMouseEvent *mouse_event;
598 void *mouse_event_opaque;
a171fe39 599 int width;
455204eb
TS
600
601 if (!qemu_put_mouse_event_current) {
602 return;
603 }
604
605 mouse_event =
606 qemu_put_mouse_event_current->qemu_put_mouse_event;
607 mouse_event_opaque =
608 qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
609
610 if (mouse_event) {
a171fe39
AZ
611 if (graphic_rotate) {
612 if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
613 width = 0x7fff;
614 else
b94ed577 615 width = graphic_width - 1;
a171fe39
AZ
616 mouse_event(mouse_event_opaque,
617 width - dy, dx, dz, buttons_state);
618 } else
619 mouse_event(mouse_event_opaque,
620 dx, dy, dz, buttons_state);
63066f4f
FB
621 }
622}
623
09b26c5e
FB
624int kbd_mouse_is_absolute(void)
625{
455204eb
TS
626 if (!qemu_put_mouse_event_current)
627 return 0;
628
629 return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
630}
631
632void do_info_mice(void)
633{
634 QEMUPutMouseEntry *cursor;
635 int index = 0;
636
637 if (!qemu_put_mouse_event_head) {
638 term_printf("No mouse devices connected\n");
639 return;
640 }
641
642 term_printf("Mouse devices available:\n");
643 cursor = qemu_put_mouse_event_head;
644 while (cursor != NULL) {
645 term_printf("%c Mouse #%d: %s\n",
646 (cursor == qemu_put_mouse_event_current ? '*' : ' '),
647 index, cursor->qemu_put_mouse_event_name);
648 index++;
649 cursor = cursor->next;
650 }
651}
652
653void do_mouse_set(int index)
654{
655 QEMUPutMouseEntry *cursor;
656 int i = 0;
657
658 if (!qemu_put_mouse_event_head) {
659 term_printf("No mouse devices connected\n");
660 return;
661 }
662
663 cursor = qemu_put_mouse_event_head;
664 while (cursor != NULL && index != i) {
665 i++;
666 cursor = cursor->next;
667 }
668
669 if (cursor != NULL)
670 qemu_put_mouse_event_current = cursor;
671 else
672 term_printf("Mouse at given index not found\n");
09b26c5e
FB
673}
674
1dce7c3c
FB
675/* compute with 96 bit intermediate result: (a*b)/c */
676uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
0824d6fc 677{
1dce7c3c
FB
678 union {
679 uint64_t ll;
680 struct {
681#ifdef WORDS_BIGENDIAN
682 uint32_t high, low;
683#else
684 uint32_t low, high;
3b46e624 685#endif
1dce7c3c
FB
686 } l;
687 } u, res;
688 uint64_t rl, rh;
0824d6fc 689
1dce7c3c
FB
690 u.ll = a;
691 rl = (uint64_t)u.l.low * (uint64_t)b;
692 rh = (uint64_t)u.l.high * (uint64_t)b;
693 rh += (rl >> 32);
694 res.l.high = rh / c;
695 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
696 return res.ll;
34865134
FB
697}
698
1dce7c3c
FB
699/***********************************************************/
700/* real time host monotonic timer */
34865134 701
1dce7c3c 702#define QEMU_TIMER_BASE 1000000000LL
34865134 703
1dce7c3c 704#ifdef WIN32
0824d6fc 705
1dce7c3c 706static int64_t clock_freq;
1115dde7 707
1dce7c3c 708static void init_get_clock(void)
1115dde7 709{
a8e5ac33
FB
710 LARGE_INTEGER freq;
711 int ret;
1dce7c3c
FB
712 ret = QueryPerformanceFrequency(&freq);
713 if (ret == 0) {
714 fprintf(stderr, "Could not calibrate ticks\n");
715 exit(1);
716 }
717 clock_freq = freq.QuadPart;
1115dde7
FB
718}
719
1dce7c3c 720static int64_t get_clock(void)
b8076a74 721{
1dce7c3c
FB
722 LARGE_INTEGER ti;
723 QueryPerformanceCounter(&ti);
724 return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
b8076a74
FB
725}
726
1dce7c3c 727#else
90cb9493 728
1dce7c3c
FB
729static int use_rt_clock;
730
731static void init_get_clock(void)
90cb9493 732{
1dce7c3c 733 use_rt_clock = 0;
60759371 734#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
1dce7c3c
FB
735 {
736 struct timespec ts;
737 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
738 use_rt_clock = 1;
739 }
740 }
741#endif
90cb9493
FB
742}
743
1dce7c3c 744static int64_t get_clock(void)
fdbb4691 745{
60759371 746#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
1dce7c3c
FB
747 if (use_rt_clock) {
748 struct timespec ts;
749 clock_gettime(CLOCK_MONOTONIC, &ts);
750 return ts.tv_sec * 1000000000LL + ts.tv_nsec;
5fafdf24 751 } else
fdbb4691 752#endif
1dce7c3c
FB
753 {
754 /* XXX: using gettimeofday leads to problems if the date
755 changes, so it should be avoided. */
756 struct timeval tv;
757 gettimeofday(&tv, NULL);
758 return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
759 }
fdbb4691 760}
34865134
FB
761#endif
762
2e70f6ef
PB
763/* Return the virtual CPU time, based on the instruction counter. */
764static int64_t cpu_get_icount(void)
765{
766 int64_t icount;
767 CPUState *env = cpu_single_env;;
768 icount = qemu_icount;
769 if (env) {
770 if (!can_do_io(env))
771 fprintf(stderr, "Bad clock read\n");
772 icount -= (env->icount_decr.u16.low + env->icount_extra);
773 }
774 return qemu_icount_bias + (icount << icount_time_shift);
775}
776
1dce7c3c
FB
777/***********************************************************/
778/* guest cycle counter */
779
eade0f19 780static int64_t cpu_ticks_prev;
34865134 781static int64_t cpu_ticks_offset;
1dce7c3c 782static int64_t cpu_clock_offset;
8a7ddc38 783static int cpu_ticks_enabled;
34865134 784
1dce7c3c
FB
785/* return the host CPU cycle counter and handle stop/restart */
786int64_t cpu_get_ticks(void)
34865134 787{
2e70f6ef
PB
788 if (use_icount) {
789 return cpu_get_icount();
790 }
8a7ddc38
FB
791 if (!cpu_ticks_enabled) {
792 return cpu_ticks_offset;
793 } else {
eade0f19
FB
794 int64_t ticks;
795 ticks = cpu_get_real_ticks();
796 if (cpu_ticks_prev > ticks) {
797 /* Note: non increasing ticks may happen if the host uses
798 software suspend */
799 cpu_ticks_offset += cpu_ticks_prev - ticks;
800 }
801 cpu_ticks_prev = ticks;
802 return ticks + cpu_ticks_offset;
8a7ddc38 803 }
34865134
FB
804}
805
1dce7c3c
FB
806/* return the host CPU monotonic timer and handle stop/restart */
807static int64_t cpu_get_clock(void)
808{
809 int64_t ti;
810 if (!cpu_ticks_enabled) {
811 return cpu_clock_offset;
812 } else {
813 ti = get_clock();
814 return ti + cpu_clock_offset;
815 }
816}
817
34865134
FB
818/* enable cpu_get_ticks() */
819void cpu_enable_ticks(void)
820{
8a7ddc38
FB
821 if (!cpu_ticks_enabled) {
822 cpu_ticks_offset -= cpu_get_real_ticks();
1dce7c3c 823 cpu_clock_offset -= get_clock();
8a7ddc38
FB
824 cpu_ticks_enabled = 1;
825 }
34865134
FB
826}
827
828/* disable cpu_get_ticks() : the clock is stopped. You must not call
829 cpu_get_ticks() after that. */
830void cpu_disable_ticks(void)
831{
8a7ddc38
FB
832 if (cpu_ticks_enabled) {
833 cpu_ticks_offset = cpu_get_ticks();
1dce7c3c 834 cpu_clock_offset = cpu_get_clock();
8a7ddc38
FB
835 cpu_ticks_enabled = 0;
836 }
34865134
FB
837}
838
1dce7c3c
FB
839/***********************************************************/
840/* timers */
5fafdf24 841
8a7ddc38
FB
842#define QEMU_TIMER_REALTIME 0
843#define QEMU_TIMER_VIRTUAL 1
844
845struct QEMUClock {
846 int type;
847 /* XXX: add frequency */
848};
849
850struct QEMUTimer {
851 QEMUClock *clock;
852 int64_t expire_time;
853 QEMUTimerCB *cb;
854 void *opaque;
855 struct QEMUTimer *next;
856};
857
c8994013
TS
858struct qemu_alarm_timer {
859 char const *name;
efe75411 860 unsigned int flags;
c8994013
TS
861
862 int (*start)(struct qemu_alarm_timer *t);
863 void (*stop)(struct qemu_alarm_timer *t);
efe75411 864 void (*rearm)(struct qemu_alarm_timer *t);
c8994013
TS
865 void *priv;
866};
867
efe75411 868#define ALARM_FLAG_DYNTICKS 0x1
d5d08334 869#define ALARM_FLAG_EXPIRED 0x2
efe75411
TS
870
871static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
872{
873 return t->flags & ALARM_FLAG_DYNTICKS;
874}
875
876static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
877{
878 if (!alarm_has_dynticks(t))
879 return;
880
881 t->rearm(t);
882}
883
884/* TODO: MIN_TIMER_REARM_US should be optimized */
885#define MIN_TIMER_REARM_US 250
886
c8994013 887static struct qemu_alarm_timer *alarm_timer;
8a7ddc38 888
40c3bac3 889#ifdef _WIN32
c8994013
TS
890
891struct qemu_alarm_win32 {
892 MMRESULT timerId;
893 HANDLE host_alarm;
894 unsigned int period;
895} alarm_win32_data = {0, NULL, -1};
896
897static int win32_start_timer(struct qemu_alarm_timer *t);
898static void win32_stop_timer(struct qemu_alarm_timer *t);
efe75411 899static void win32_rearm_timer(struct qemu_alarm_timer *t);
c8994013 900
40c3bac3 901#else
c8994013
TS
902
903static int unix_start_timer(struct qemu_alarm_timer *t);
904static void unix_stop_timer(struct qemu_alarm_timer *t);
905
231c6586
TS
906#ifdef __linux__
907
efe75411
TS
908static int dynticks_start_timer(struct qemu_alarm_timer *t);
909static void dynticks_stop_timer(struct qemu_alarm_timer *t);
910static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
911
c40ec5a9
TS
912static int hpet_start_timer(struct qemu_alarm_timer *t);
913static void hpet_stop_timer(struct qemu_alarm_timer *t);
914
c8994013
TS
915static int rtc_start_timer(struct qemu_alarm_timer *t);
916static void rtc_stop_timer(struct qemu_alarm_timer *t);
917
efe75411 918#endif /* __linux__ */
8a7ddc38 919
c8994013
TS
920#endif /* _WIN32 */
921
2e70f6ef 922/* Correlation between real and virtual time is always going to be
bf20dc07 923 fairly approximate, so ignore small variation.
2e70f6ef
PB
924 When the guest is idle real and virtual time will be aligned in
925 the IO wait loop. */
926#define ICOUNT_WOBBLE (QEMU_TIMER_BASE / 10)
927
928static void icount_adjust(void)
929{
930 int64_t cur_time;
931 int64_t cur_icount;
932 int64_t delta;
933 static int64_t last_delta;
934 /* If the VM is not running, then do nothing. */
935 if (!vm_running)
936 return;
937
938 cur_time = cpu_get_clock();
939 cur_icount = qemu_get_clock(vm_clock);
940 delta = cur_icount - cur_time;
941 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
942 if (delta > 0
943 && last_delta + ICOUNT_WOBBLE < delta * 2
944 && icount_time_shift > 0) {
945 /* The guest is getting too far ahead. Slow time down. */
946 icount_time_shift--;
947 }
948 if (delta < 0
949 && last_delta - ICOUNT_WOBBLE > delta * 2
950 && icount_time_shift < MAX_ICOUNT_SHIFT) {
951 /* The guest is getting too far behind. Speed time up. */
952 icount_time_shift++;
953 }
954 last_delta = delta;
955 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
956}
957
958static void icount_adjust_rt(void * opaque)
959{
960 qemu_mod_timer(icount_rt_timer,
961 qemu_get_clock(rt_clock) + 1000);
962 icount_adjust();
963}
964
965static void icount_adjust_vm(void * opaque)
966{
967 qemu_mod_timer(icount_vm_timer,
968 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
969 icount_adjust();
970}
971
972static void init_icount_adjust(void)
973{
974 /* Have both realtime and virtual time triggers for speed adjustment.
975 The realtime trigger catches emulated time passing too slowly,
976 the virtual time trigger catches emulated time passing too fast.
977 Realtime triggers occur even when idle, so use them less frequently
978 than VM triggers. */
979 icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
980 qemu_mod_timer(icount_rt_timer,
981 qemu_get_clock(rt_clock) + 1000);
982 icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
983 qemu_mod_timer(icount_vm_timer,
984 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
985}
986
c8994013 987static struct qemu_alarm_timer alarm_timers[] = {
efe75411 988#ifndef _WIN32
231c6586 989#ifdef __linux__
efe75411
TS
990 {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
991 dynticks_stop_timer, dynticks_rearm_timer, NULL},
c40ec5a9 992 /* HPET - if available - is preferred */
efe75411 993 {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
c40ec5a9 994 /* ...otherwise try RTC */
efe75411 995 {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
c8994013 996#endif
efe75411 997 {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
c8994013 998#else
efe75411
TS
999 {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
1000 win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
1001 {"win32", 0, win32_start_timer,
1002 win32_stop_timer, NULL, &alarm_win32_data},
c8994013
TS
1003#endif
1004 {NULL, }
1005};
1006
3f47aa8c 1007static void show_available_alarms(void)
f3dcfada
TS
1008{
1009 int i;
1010
1011 printf("Available alarm timers, in order of precedence:\n");
1012 for (i = 0; alarm_timers[i].name; i++)
1013 printf("%s\n", alarm_timers[i].name);
1014}
1015
1016static void configure_alarms(char const *opt)
1017{
1018 int i;
1019 int cur = 0;
1020 int count = (sizeof(alarm_timers) / sizeof(*alarm_timers)) - 1;
1021 char *arg;
1022 char *name;
2e70f6ef 1023 struct qemu_alarm_timer tmp;
f3dcfada 1024
3adda04c 1025 if (!strcmp(opt, "?")) {
f3dcfada
TS
1026 show_available_alarms();
1027 exit(0);
1028 }
1029
1030 arg = strdup(opt);
1031
1032 /* Reorder the array */
1033 name = strtok(arg, ",");
1034 while (name) {
e2b577e5 1035 for (i = 0; i < count && alarm_timers[i].name; i++) {
f3dcfada
TS
1036 if (!strcmp(alarm_timers[i].name, name))
1037 break;
1038 }
1039
1040 if (i == count) {
1041 fprintf(stderr, "Unknown clock %s\n", name);
1042 goto next;
1043 }
1044
1045 if (i < cur)
1046 /* Ignore */
1047 goto next;
1048
1049 /* Swap */
1050 tmp = alarm_timers[i];
1051 alarm_timers[i] = alarm_timers[cur];
1052 alarm_timers[cur] = tmp;
1053
1054 cur++;
1055next:
1056 name = strtok(NULL, ",");
1057 }
1058
1059 free(arg);
1060
1061 if (cur) {
2e70f6ef 1062 /* Disable remaining timers */
f3dcfada
TS
1063 for (i = cur; i < count; i++)
1064 alarm_timers[i].name = NULL;
3adda04c
AJ
1065 } else {
1066 show_available_alarms();
1067 exit(1);
f3dcfada 1068 }
f3dcfada
TS
1069}
1070
c8994013
TS
1071QEMUClock *rt_clock;
1072QEMUClock *vm_clock;
1073
1074static QEMUTimer *active_timers[2];
1075
9596ebb7 1076static QEMUClock *qemu_new_clock(int type)
8a7ddc38
FB
1077{
1078 QEMUClock *clock;
1079 clock = qemu_mallocz(sizeof(QEMUClock));
1080 if (!clock)
1081 return NULL;
1082 clock->type = type;
1083 return clock;
1084}
1085
1086QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
1087{
1088 QEMUTimer *ts;
1089
1090 ts = qemu_mallocz(sizeof(QEMUTimer));
1091 ts->clock = clock;
1092 ts->cb = cb;
1093 ts->opaque = opaque;
1094 return ts;
1095}
1096
1097void qemu_free_timer(QEMUTimer *ts)
1098{
1099 qemu_free(ts);
1100}
1101
1102/* stop a timer, but do not dealloc it */
1103void qemu_del_timer(QEMUTimer *ts)
1104{
1105 QEMUTimer **pt, *t;
1106
1107 /* NOTE: this code must be signal safe because
1108 qemu_timer_expired() can be called from a signal. */
1109 pt = &active_timers[ts->clock->type];
1110 for(;;) {
1111 t = *pt;
1112 if (!t)
1113 break;
1114 if (t == ts) {
1115 *pt = t->next;
1116 break;
1117 }
1118 pt = &t->next;
1119 }
1120}
1121
1122/* modify the current timer so that it will be fired when current_time
1123 >= expire_time. The corresponding callback will be called. */
1124void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
1125{
1126 QEMUTimer **pt, *t;
1127
1128 qemu_del_timer(ts);
1129
1130 /* add the timer in the sorted list */
1131 /* NOTE: this code must be signal safe because
1132 qemu_timer_expired() can be called from a signal. */
1133 pt = &active_timers[ts->clock->type];
1134 for(;;) {
1135 t = *pt;
1136 if (!t)
1137 break;
5fafdf24 1138 if (t->expire_time > expire_time)
8a7ddc38
FB
1139 break;
1140 pt = &t->next;
1141 }
1142 ts->expire_time = expire_time;
1143 ts->next = *pt;
1144 *pt = ts;
d5d08334
AZ
1145
1146 /* Rearm if necessary */
2e70f6ef
PB
1147 if (pt == &active_timers[ts->clock->type]) {
1148 if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
1149 qemu_rearm_alarm_timer(alarm_timer);
1150 }
1151 /* Interrupt execution to force deadline recalculation. */
1152 if (use_icount && cpu_single_env) {
1153 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
1154 }
1155 }
8a7ddc38
FB
1156}
1157
1158int qemu_timer_pending(QEMUTimer *ts)
1159{
1160 QEMUTimer *t;
1161 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
1162 if (t == ts)
1163 return 1;
1164 }
1165 return 0;
1166}
1167
1168static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
1169{
1170 if (!timer_head)
1171 return 0;
1172 return (timer_head->expire_time <= current_time);
1173}
1174
1175static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1176{
1177 QEMUTimer *ts;
3b46e624 1178
8a7ddc38
FB
1179 for(;;) {
1180 ts = *ptimer_head;
e95c8d51 1181 if (!ts || ts->expire_time > current_time)
8a7ddc38
FB
1182 break;
1183 /* remove timer from the list before calling the callback */
1184 *ptimer_head = ts->next;
1185 ts->next = NULL;
3b46e624 1186
8a7ddc38
FB
1187 /* run the callback (the timer list can be modified) */
1188 ts->cb(ts->opaque);
1189 }
1190}
1191
1192int64_t qemu_get_clock(QEMUClock *clock)
1193{
1194 switch(clock->type) {
1195 case QEMU_TIMER_REALTIME:
1dce7c3c 1196 return get_clock() / 1000000;
8a7ddc38
FB
1197 default:
1198 case QEMU_TIMER_VIRTUAL:
2e70f6ef
PB
1199 if (use_icount) {
1200 return cpu_get_icount();
1201 } else {
1202 return cpu_get_clock();
1203 }
8a7ddc38
FB
1204 }
1205}
1206
1dce7c3c
FB
1207static void init_timers(void)
1208{
1209 init_get_clock();
1210 ticks_per_sec = QEMU_TIMER_BASE;
1211 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
1212 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
1213}
1214
8a7ddc38
FB
1215/* save a timer */
1216void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1217{
1218 uint64_t expire_time;
1219
1220 if (qemu_timer_pending(ts)) {
1221 expire_time = ts->expire_time;
1222 } else {
1223 expire_time = -1;
1224 }
1225 qemu_put_be64(f, expire_time);
1226}
1227
1228void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1229{
1230 uint64_t expire_time;
1231
1232 expire_time = qemu_get_be64(f);
1233 if (expire_time != -1) {
1234 qemu_mod_timer(ts, expire_time);
1235 } else {
1236 qemu_del_timer(ts);
1237 }
1238}
1239
1240static void timer_save(QEMUFile *f, void *opaque)
1241{
1242 if (cpu_ticks_enabled) {
1243 hw_error("cannot save state if virtual timers are running");
1244 }
bee8d684
TS
1245 qemu_put_be64(f, cpu_ticks_offset);
1246 qemu_put_be64(f, ticks_per_sec);
1247 qemu_put_be64(f, cpu_clock_offset);
8a7ddc38
FB
1248}
1249
1250static int timer_load(QEMUFile *f, void *opaque, int version_id)
1251{
c88676f8 1252 if (version_id != 1 && version_id != 2)
8a7ddc38
FB
1253 return -EINVAL;
1254 if (cpu_ticks_enabled) {
1255 return -EINVAL;
1256 }
bee8d684
TS
1257 cpu_ticks_offset=qemu_get_be64(f);
1258 ticks_per_sec=qemu_get_be64(f);
c88676f8 1259 if (version_id == 2) {
bee8d684 1260 cpu_clock_offset=qemu_get_be64(f);
c88676f8 1261 }
8a7ddc38
FB
1262 return 0;
1263}
1264
67b915a5 1265#ifdef _WIN32
5fafdf24 1266void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
67b915a5
FB
1267 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
1268#else
8a7ddc38 1269static void host_alarm_handler(int host_signum)
67b915a5 1270#endif
8a7ddc38 1271{
02ba45c5
FB
1272#if 0
1273#define DISP_FREQ 1000
1274 {
1275 static int64_t delta_min = INT64_MAX;
1276 static int64_t delta_max, delta_cum, last_clock, delta, ti;
1277 static int count;
1278 ti = qemu_get_clock(vm_clock);
1279 if (last_clock != 0) {
1280 delta = ti - last_clock;
1281 if (delta < delta_min)
1282 delta_min = delta;
1283 if (delta > delta_max)
1284 delta_max = delta;
1285 delta_cum += delta;
1286 if (++count == DISP_FREQ) {
26a76461 1287 printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
02ba45c5
FB
1288 muldiv64(delta_min, 1000000, ticks_per_sec),
1289 muldiv64(delta_max, 1000000, ticks_per_sec),
1290 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1291 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1292 count = 0;
1293 delta_min = INT64_MAX;
1294 delta_max = 0;
1295 delta_cum = 0;
1296 }
1297 }
1298 last_clock = ti;
1299 }
1300#endif
efe75411 1301 if (alarm_has_dynticks(alarm_timer) ||
2e70f6ef
PB
1302 (!use_icount &&
1303 qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1304 qemu_get_clock(vm_clock))) ||
8a7ddc38
FB
1305 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1306 qemu_get_clock(rt_clock))) {
06d9f2f7 1307#ifdef _WIN32
c8994013
TS
1308 struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
1309 SetEvent(data->host_alarm);
06d9f2f7 1310#endif
ee5605e5
AZ
1311 CPUState *env = next_cpu;
1312
d5d08334
AZ
1313 alarm_timer->flags |= ALARM_FLAG_EXPIRED;
1314
4f8eb8da
AZ
1315 if (env) {
1316 /* stop the currently executing cpu because a timer occured */
1317 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
a332e112 1318#ifdef USE_KQEMU
4f8eb8da
AZ
1319 if (env->kqemu_enabled) {
1320 kqemu_cpu_interrupt(env);
1321 }
ee5605e5 1322#endif
4f8eb8da 1323 }
ee5605e5 1324 event_pending = 1;
8a7ddc38
FB
1325 }
1326}
1327
2e70f6ef 1328static int64_t qemu_next_deadline(void)
efe75411 1329{
2e70f6ef 1330 int64_t delta;
efe75411
TS
1331
1332 if (active_timers[QEMU_TIMER_VIRTUAL]) {
2e70f6ef
PB
1333 delta = active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
1334 qemu_get_clock(vm_clock);
1335 } else {
1336 /* To avoid problems with overflow limit this to 2^32. */
1337 delta = INT32_MAX;
efe75411
TS
1338 }
1339
2e70f6ef
PB
1340 if (delta < 0)
1341 delta = 0;
efe75411 1342
2e70f6ef
PB
1343 return delta;
1344}
1345
8632fb9a 1346#if defined(__linux__) || defined(_WIN32)
2e70f6ef
PB
1347static uint64_t qemu_next_deadline_dyntick(void)
1348{
1349 int64_t delta;
1350 int64_t rtdelta;
1351
1352 if (use_icount)
1353 delta = INT32_MAX;
1354 else
1355 delta = (qemu_next_deadline() + 999) / 1000;
1356
1357 if (active_timers[QEMU_TIMER_REALTIME]) {
1358 rtdelta = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
1359 qemu_get_clock(rt_clock))*1000;
1360 if (rtdelta < delta)
1361 delta = rtdelta;
1362 }
1363
1364 if (delta < MIN_TIMER_REARM_US)
1365 delta = MIN_TIMER_REARM_US;
1366
1367 return delta;
efe75411 1368}
8632fb9a 1369#endif
efe75411 1370
fd872598
FB
1371#ifndef _WIN32
1372
829309c7
FB
1373#if defined(__linux__)
1374
fd872598
FB
1375#define RTC_FREQ 1024
1376
c8994013
TS
1377static void enable_sigio_timer(int fd)
1378{
1379 struct sigaction act;
1380
1381 /* timer signal */
1382 sigfillset(&act.sa_mask);
1383 act.sa_flags = 0;
c8994013
TS
1384 act.sa_handler = host_alarm_handler;
1385
1386 sigaction(SIGIO, &act, NULL);
1387 fcntl(fd, F_SETFL, O_ASYNC);
1388 fcntl(fd, F_SETOWN, getpid());
1389}
829309c7 1390
c40ec5a9
TS
1391static int hpet_start_timer(struct qemu_alarm_timer *t)
1392{
1393 struct hpet_info info;
1394 int r, fd;
1395
1396 fd = open("/dev/hpet", O_RDONLY);
1397 if (fd < 0)
1398 return -1;
1399
1400 /* Set frequency */
1401 r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1402 if (r < 0) {
1403 fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1404 "error, but for better emulation accuracy type:\n"
1405 "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1406 goto fail;
1407 }
1408
1409 /* Check capabilities */
1410 r = ioctl(fd, HPET_INFO, &info);
1411 if (r < 0)
1412 goto fail;
1413
1414 /* Enable periodic mode */
1415 r = ioctl(fd, HPET_EPI, 0);
1416 if (info.hi_flags && (r < 0))
1417 goto fail;
1418
1419 /* Enable interrupt */
1420 r = ioctl(fd, HPET_IE_ON, 0);
1421 if (r < 0)
1422 goto fail;
1423
1424 enable_sigio_timer(fd);
fcdc2129 1425 t->priv = (void *)(long)fd;
c40ec5a9
TS
1426
1427 return 0;
1428fail:
1429 close(fd);
1430 return -1;
1431}
1432
1433static void hpet_stop_timer(struct qemu_alarm_timer *t)
1434{
fcdc2129 1435 int fd = (long)t->priv;
c40ec5a9
TS
1436
1437 close(fd);
1438}
1439
c8994013 1440static int rtc_start_timer(struct qemu_alarm_timer *t)
fd872598 1441{
c8994013 1442 int rtc_fd;
b5a23ad4 1443 unsigned long current_rtc_freq = 0;
c8994013 1444
aeb30be6 1445 TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
fd872598
FB
1446 if (rtc_fd < 0)
1447 return -1;
b5a23ad4
AZ
1448 ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
1449 if (current_rtc_freq != RTC_FREQ &&
1450 ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
fd872598
FB
1451 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1452 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1453 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1454 goto fail;
1455 }
1456 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1457 fail:
1458 close(rtc_fd);
1459 return -1;
1460 }
c8994013
TS
1461
1462 enable_sigio_timer(rtc_fd);
1463
fcdc2129 1464 t->priv = (void *)(long)rtc_fd;
c8994013 1465
fd872598
FB
1466 return 0;
1467}
1468
c8994013 1469static void rtc_stop_timer(struct qemu_alarm_timer *t)
829309c7 1470{
fcdc2129 1471 int rtc_fd = (long)t->priv;
c8994013
TS
1472
1473 close(rtc_fd);
829309c7
FB
1474}
1475
efe75411
TS
1476static int dynticks_start_timer(struct qemu_alarm_timer *t)
1477{
1478 struct sigevent ev;
1479 timer_t host_timer;
1480 struct sigaction act;
1481
1482 sigfillset(&act.sa_mask);
1483 act.sa_flags = 0;
efe75411
TS
1484 act.sa_handler = host_alarm_handler;
1485
1486 sigaction(SIGALRM, &act, NULL);
1487
1488 ev.sigev_value.sival_int = 0;
1489 ev.sigev_notify = SIGEV_SIGNAL;
1490 ev.sigev_signo = SIGALRM;
1491
1492 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1493 perror("timer_create");
1494
1495 /* disable dynticks */
1496 fprintf(stderr, "Dynamic Ticks disabled\n");
1497
1498 return -1;
1499 }
1500
1501 t->priv = (void *)host_timer;
1502
1503 return 0;
1504}
1505
1506static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1507{
1508 timer_t host_timer = (timer_t)t->priv;
1509
1510 timer_delete(host_timer);
1511}
1512
1513static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1514{
1515 timer_t host_timer = (timer_t)t->priv;
1516 struct itimerspec timeout;
1517 int64_t nearest_delta_us = INT64_MAX;
1518 int64_t current_us;
1519
1520 if (!active_timers[QEMU_TIMER_REALTIME] &&
1521 !active_timers[QEMU_TIMER_VIRTUAL])
d5d08334 1522 return;
efe75411 1523
2e70f6ef 1524 nearest_delta_us = qemu_next_deadline_dyntick();
efe75411
TS
1525
1526 /* check whether a timer is already running */
1527 if (timer_gettime(host_timer, &timeout)) {
1528 perror("gettime");
1529 fprintf(stderr, "Internal timer error: aborting\n");
1530 exit(1);
1531 }
1532 current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1533 if (current_us && current_us <= nearest_delta_us)
1534 return;
1535
1536 timeout.it_interval.tv_sec = 0;
1537 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1538 timeout.it_value.tv_sec = nearest_delta_us / 1000000;
1539 timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1540 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1541 perror("settime");
1542 fprintf(stderr, "Internal timer error: aborting\n");
1543 exit(1);
1544 }
1545}
1546
70744b3a 1547#endif /* defined(__linux__) */
231c6586 1548
c8994013
TS
1549static int unix_start_timer(struct qemu_alarm_timer *t)
1550{
1551 struct sigaction act;
1552 struct itimerval itv;
1553 int err;
1554
1555 /* timer signal */
1556 sigfillset(&act.sa_mask);
1557 act.sa_flags = 0;
c8994013
TS
1558 act.sa_handler = host_alarm_handler;
1559
1560 sigaction(SIGALRM, &act, NULL);
1561
1562 itv.it_interval.tv_sec = 0;
1563 /* for i386 kernel 2.6 to get 1 ms */
1564 itv.it_interval.tv_usec = 999;
1565 itv.it_value.tv_sec = 0;
1566 itv.it_value.tv_usec = 10 * 1000;
1567
1568 err = setitimer(ITIMER_REAL, &itv, NULL);
1569 if (err)
1570 return -1;
1571
1572 return 0;
1573}
1574
1575static void unix_stop_timer(struct qemu_alarm_timer *t)
1576{
1577 struct itimerval itv;
1578
1579 memset(&itv, 0, sizeof(itv));
1580 setitimer(ITIMER_REAL, &itv, NULL);
1581}
1582
829309c7 1583#endif /* !defined(_WIN32) */
fd872598 1584
c8994013
TS
1585#ifdef _WIN32
1586
1587static int win32_start_timer(struct qemu_alarm_timer *t)
1588{
1589 TIMECAPS tc;
1590 struct qemu_alarm_win32 *data = t->priv;
efe75411 1591 UINT flags;
c8994013
TS
1592
1593 data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1594 if (!data->host_alarm) {
1595 perror("Failed CreateEvent");
c396a7f0 1596 return -1;
c8994013
TS
1597 }
1598
1599 memset(&tc, 0, sizeof(tc));
1600 timeGetDevCaps(&tc, sizeof(tc));
1601
1602 if (data->period < tc.wPeriodMin)
1603 data->period = tc.wPeriodMin;
1604
1605 timeBeginPeriod(data->period);
1606
efe75411
TS
1607 flags = TIME_CALLBACK_FUNCTION;
1608 if (alarm_has_dynticks(t))
1609 flags |= TIME_ONESHOT;
1610 else
1611 flags |= TIME_PERIODIC;
1612
c8994013
TS
1613 data->timerId = timeSetEvent(1, // interval (ms)
1614 data->period, // resolution
1615 host_alarm_handler, // function
1616 (DWORD)t, // parameter
efe75411 1617 flags);
c8994013
TS
1618
1619 if (!data->timerId) {
1620 perror("Failed to initialize win32 alarm timer");
1621
1622 timeEndPeriod(data->period);
1623 CloseHandle(data->host_alarm);
1624 return -1;
1625 }
1626
1627 qemu_add_wait_object(data->host_alarm, NULL, NULL);
1628
1629 return 0;
1630}
1631
1632static void win32_stop_timer(struct qemu_alarm_timer *t)
1633{
1634 struct qemu_alarm_win32 *data = t->priv;
1635
1636 timeKillEvent(data->timerId);
1637 timeEndPeriod(data->period);
1638
1639 CloseHandle(data->host_alarm);
1640}
1641
efe75411
TS
1642static void win32_rearm_timer(struct qemu_alarm_timer *t)
1643{
1644 struct qemu_alarm_win32 *data = t->priv;
1645 uint64_t nearest_delta_us;
1646
1647 if (!active_timers[QEMU_TIMER_REALTIME] &&
1648 !active_timers[QEMU_TIMER_VIRTUAL])
d5d08334 1649 return;
efe75411 1650
2e70f6ef 1651 nearest_delta_us = qemu_next_deadline_dyntick();
efe75411
TS
1652 nearest_delta_us /= 1000;
1653
1654 timeKillEvent(data->timerId);
1655
1656 data->timerId = timeSetEvent(1,
1657 data->period,
1658 host_alarm_handler,
1659 (DWORD)t,
1660 TIME_ONESHOT | TIME_PERIODIC);
1661
1662 if (!data->timerId) {
1663 perror("Failed to re-arm win32 alarm timer");
1664
1665 timeEndPeriod(data->period);
1666 CloseHandle(data->host_alarm);
1667 exit(1);
1668 }
1669}
1670
c8994013
TS
1671#endif /* _WIN32 */
1672
1dce7c3c 1673static void init_timer_alarm(void)
8a7ddc38 1674{
223f0d72 1675 struct qemu_alarm_timer *t = NULL;
c8994013
TS
1676 int i, err = -1;
1677
1678 for (i = 0; alarm_timers[i].name; i++) {
1679 t = &alarm_timers[i];
1680
c8994013
TS
1681 err = t->start(t);
1682 if (!err)
1683 break;
67b915a5 1684 }
fd872598 1685
c8994013
TS
1686 if (err) {
1687 fprintf(stderr, "Unable to find any suitable alarm timer.\n");
1688 fprintf(stderr, "Terminating\n");
1689 exit(1);
67b915a5 1690 }
c8994013
TS
1691
1692 alarm_timer = t;
8a7ddc38
FB
1693}
1694
9596ebb7 1695static void quit_timers(void)
40c3bac3 1696{
c8994013
TS
1697 alarm_timer->stop(alarm_timer);
1698 alarm_timer = NULL;
40c3bac3
FB
1699}
1700
f6503059
AZ
1701/***********************************************************/
1702/* host time/date access */
1703void qemu_get_timedate(struct tm *tm, int offset)
1704{
1705 time_t ti;
1706 struct tm *ret;
1707
1708 time(&ti);
1709 ti += offset;
1710 if (rtc_date_offset == -1) {
1711 if (rtc_utc)
1712 ret = gmtime(&ti);
1713 else
1714 ret = localtime(&ti);
1715 } else {
1716 ti -= rtc_date_offset;
1717 ret = gmtime(&ti);
1718 }
1719
1720 memcpy(tm, ret, sizeof(struct tm));
1721}
1722
1723int qemu_timedate_diff(struct tm *tm)
1724{
1725 time_t seconds;
1726
1727 if (rtc_date_offset == -1)
1728 if (rtc_utc)
1729 seconds = mktimegm(tm);
1730 else
1731 seconds = mktime(tm);
1732 else
1733 seconds = mktimegm(tm) + rtc_date_offset;
1734
1735 return seconds - time(NULL);
1736}
1737
fd1dff4b 1738#ifdef _WIN32
fd1dff4b
FB
1739static void socket_cleanup(void)
1740{
1741 WSACleanup();
1742}
82c643ff 1743
fd1dff4b
FB
1744static int socket_init(void)
1745{
1746 WSADATA Data;
1747 int ret, err;
1748
1749 ret = WSAStartup(MAKEWORD(2,2), &Data);
1750 if (ret != 0) {
1751 err = WSAGetLastError();
1752 fprintf(stderr, "WSAStartup: %d\n", err);
1753 return -1;
1754 }
1755 atexit(socket_cleanup);
1756 return 0;
1757}
64b7b733
AJ
1758#endif
1759
6f97dba0
AL
1760/***********************************************************/
1761/* network device redirectors */
279e694b 1762
330d0414 1763
9dc63a1e 1764#if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
9596ebb7 1765static void hex_dump(FILE *f, const uint8_t *buf, int size)
c20709aa
FB
1766{
1767 int len, i, j, c;
1768
1769 for(i=0;i<size;i+=16) {
1770 len = size - i;
1771 if (len > 16)
1772 len = 16;
1773 fprintf(f, "%08x ", i);
1774 for(j=0;j<16;j++) {
1775 if (j < len)
1776 fprintf(f, " %02x", buf[i+j]);
1777 else
1778 fprintf(f, " ");
1779 }
1780 fprintf(f, " ");
1781 for(j=0;j<len;j++) {
1782 c = buf[i+j];
1783 if (c < ' ' || c > '~')
1784 c = '.';
1785 fprintf(f, "%c", c);
1786 }
1787 fprintf(f, "\n");
1788 }
1789}
9dc63a1e 1790#endif
c20709aa 1791
7c9d8e07 1792static int parse_macaddr(uint8_t *macaddr, const char *p)
c20709aa 1793{
7c9d8e07 1794 int i;
76ea08f9
AZ
1795 char *last_char;
1796 long int offset;
1797
1798 errno = 0;
1799 offset = strtol(p, &last_char, 0);
1800 if (0 == errno && '\0' == *last_char &&
1801 offset >= 0 && offset <= 0xFFFFFF) {
1802 macaddr[3] = (offset & 0xFF0000) >> 16;
1803 macaddr[4] = (offset & 0xFF00) >> 8;
1804 macaddr[5] = offset & 0xFF;
1805 return 0;
1806 } else {
1807 for(i = 0; i < 6; i++) {
1808 macaddr[i] = strtol(p, (char **)&p, 16);
1809 if (i == 5) {
1810 if (*p != '\0')
1811 return -1;
1812 } else {
1813 if (*p != ':' && *p != '-')
1814 return -1;
1815 p++;
1816 }
7c9d8e07 1817 }
76ea08f9 1818 return 0;
7c9d8e07 1819 }
76ea08f9
AZ
1820
1821 return -1;
c20709aa 1822}
67b915a5 1823
7c9d8e07 1824static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
67b915a5 1825{
7c9d8e07
FB
1826 const char *p, *p1;
1827 int len;
1828 p = *pp;
1829 p1 = strchr(p, sep);
1830 if (!p1)
1831 return -1;
1832 len = p1 - p;
1833 p1++;
1834 if (buf_size > 0) {
1835 if (len > buf_size - 1)
1836 len = buf_size - 1;
1837 memcpy(buf, p, len);
1838 buf[len] = '\0';
1839 }
1840 *pp = p1;
1841 return 0;
c20709aa
FB
1842}
1843
951f1351
FB
1844int parse_host_src_port(struct sockaddr_in *haddr,
1845 struct sockaddr_in *saddr,
1846 const char *input_str)
1847{
1848 char *str = strdup(input_str);
1849 char *host_str = str;
1850 char *src_str;
7ccfb2eb 1851 const char *src_str2;
951f1351
FB
1852 char *ptr;
1853
1854 /*
1855 * Chop off any extra arguments at the end of the string which
1856 * would start with a comma, then fill in the src port information
1857 * if it was provided else use the "any address" and "any port".
1858 */
1859 if ((ptr = strchr(str,',')))
1860 *ptr = '\0';
1861
1862 if ((src_str = strchr(input_str,'@'))) {
1863 *src_str = '\0';
1864 src_str++;
1865 }
1866
1867 if (parse_host_port(haddr, host_str) < 0)
1868 goto fail;
1869
7ccfb2eb 1870 src_str2 = src_str;
951f1351 1871 if (!src_str || *src_str == '\0')
7ccfb2eb 1872 src_str2 = ":0";
951f1351 1873
7ccfb2eb 1874 if (parse_host_port(saddr, src_str2) < 0)
951f1351
FB
1875 goto fail;
1876
1877 free(str);
1878 return(0);
1879
1880fail:
1881 free(str);
1882 return -1;
1883}
1884
7c9d8e07
FB
1885int parse_host_port(struct sockaddr_in *saddr, const char *str)
1886{
1887 char buf[512];
1888 struct hostent *he;
1889 const char *p, *r;
1890 int port;
1891
1892 p = str;
1893 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
1894 return -1;
1895 saddr->sin_family = AF_INET;
1896 if (buf[0] == '\0') {
1897 saddr->sin_addr.s_addr = 0;
1898 } else {
1899 if (isdigit(buf[0])) {
1900 if (!inet_aton(buf, &saddr->sin_addr))
1901 return -1;
1902 } else {
7c9d8e07
FB
1903 if ((he = gethostbyname(buf)) == NULL)
1904 return - 1;
1905 saddr->sin_addr = *(struct in_addr *)he->h_addr;
7c9d8e07
FB
1906 }
1907 }
1908 port = strtol(p, (char **)&r, 0);
1909 if (r == p)
1910 return -1;
1911 saddr->sin_port = htons(port);
1912 return 0;
1913}
c20709aa 1914
52f61fde 1915#ifndef _WIN32
0e82f34d 1916int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
ffd843bc
TS
1917{
1918 const char *p;
1919 int len;
1920
1921 len = MIN(108, strlen(str));
1922 p = strchr(str, ',');
1923 if (p)
1924 len = MIN(len, p - str);
1925
1926 memset(uaddr, 0, sizeof(*uaddr));
1927
1928 uaddr->sun_family = AF_UNIX;
1929 memcpy(uaddr->sun_path, str, len);
1930
1931 return 0;
1932}
52f61fde 1933#endif
ffd843bc 1934
7c9d8e07
FB
1935/* find or alloc a new VLAN */
1936VLANState *qemu_find_vlan(int id)
c20709aa 1937{
7c9d8e07
FB
1938 VLANState **pvlan, *vlan;
1939 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1940 if (vlan->id == id)
1941 return vlan;
1942 }
1943 vlan = qemu_mallocz(sizeof(VLANState));
1944 if (!vlan)
1945 return NULL;
1946 vlan->id = id;
1947 vlan->next = NULL;
1948 pvlan = &first_vlan;
1949 while (*pvlan != NULL)
1950 pvlan = &(*pvlan)->next;
1951 *pvlan = vlan;
1952 return vlan;
c20709aa
FB
1953}
1954
7c9d8e07 1955VLANClientState *qemu_new_vlan_client(VLANState *vlan,
d861b05e
PB
1956 IOReadHandler *fd_read,
1957 IOCanRWHandler *fd_can_read,
1958 void *opaque)
c20709aa 1959{
7c9d8e07
FB
1960 VLANClientState *vc, **pvc;
1961 vc = qemu_mallocz(sizeof(VLANClientState));
1962 if (!vc)
1963 return NULL;
1964 vc->fd_read = fd_read;
d861b05e 1965 vc->fd_can_read = fd_can_read;
7c9d8e07
FB
1966 vc->opaque = opaque;
1967 vc->vlan = vlan;
1968
1969 vc->next = NULL;
1970 pvc = &vlan->first_client;
1971 while (*pvc != NULL)
1972 pvc = &(*pvc)->next;
1973 *pvc = vc;
1974 return vc;
c20709aa
FB
1975}
1976
dcf414d6
AZ
1977void qemu_del_vlan_client(VLANClientState *vc)
1978{
1979 VLANClientState **pvc = &vc->vlan->first_client;
1980
1981 while (*pvc != NULL)
1982 if (*pvc == vc) {
1983 *pvc = vc->next;
1984 free(vc);
1985 break;
1986 } else
1987 pvc = &(*pvc)->next;
1988}
1989
d861b05e
PB
1990int qemu_can_send_packet(VLANClientState *vc1)
1991{
1992 VLANState *vlan = vc1->vlan;
1993 VLANClientState *vc;
1994
1995 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
1996 if (vc != vc1) {
fbd1711d
AZ
1997 if (vc->fd_can_read && vc->fd_can_read(vc->opaque))
1998 return 1;
d861b05e
PB
1999 }
2000 }
fbd1711d 2001 return 0;
d861b05e
PB
2002}
2003
7c9d8e07 2004void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
c20709aa 2005{
7c9d8e07
FB
2006 VLANState *vlan = vc1->vlan;
2007 VLANClientState *vc;
2008
9dc63a1e 2009#ifdef DEBUG_NET
7c9d8e07
FB
2010 printf("vlan %d send:\n", vlan->id);
2011 hex_dump(stdout, buf, size);
2012#endif
2013 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
2014 if (vc != vc1) {
2015 vc->fd_read(vc->opaque, buf, size);
2016 }
2017 }
67b915a5
FB
2018}
2019
c20709aa
FB
2020#if defined(CONFIG_SLIRP)
2021
2022/* slirp network adapter */
2023
c20709aa 2024static int slirp_inited;
7c9d8e07 2025static VLANClientState *slirp_vc;
c20709aa
FB
2026
2027int slirp_can_output(void)
2028{
3b7f5d47 2029 return !slirp_vc || qemu_can_send_packet(slirp_vc);
c20709aa
FB
2030}
2031
2032void slirp_output(const uint8_t *pkt, int pkt_len)
67b915a5 2033{
9dc63a1e 2034#ifdef DEBUG_SLIRP
7c9d8e07 2035 printf("slirp output:\n");
c20709aa
FB
2036 hex_dump(stdout, pkt, pkt_len);
2037#endif
3b7f5d47
PB
2038 if (!slirp_vc)
2039 return;
7c9d8e07 2040 qemu_send_packet(slirp_vc, pkt, pkt_len);
67b915a5
FB
2041}
2042
7c9d8e07 2043static void slirp_receive(void *opaque, const uint8_t *buf, int size)
c20709aa 2044{
9dc63a1e 2045#ifdef DEBUG_SLIRP
7c9d8e07 2046 printf("slirp input:\n");
c20709aa
FB
2047 hex_dump(stdout, buf, size);
2048#endif
2049 slirp_input(buf, size);
2050}
2051
7c9d8e07 2052static int net_slirp_init(VLANState *vlan)
c20709aa
FB
2053{
2054 if (!slirp_inited) {
2055 slirp_inited = 1;
2056 slirp_init();
2057 }
5fafdf24 2058 slirp_vc = qemu_new_vlan_client(vlan,
d861b05e 2059 slirp_receive, NULL, NULL);
7c9d8e07 2060 snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
9bf05444
FB
2061 return 0;
2062}
2063
2064static void net_slirp_redir(const char *redir_str)
2065{
2066 int is_udp;
2067 char buf[256], *r;
2068 const char *p;
2069 struct in_addr guest_addr;
2070 int host_port, guest_port;
3b46e624 2071
9bf05444
FB
2072 if (!slirp_inited) {
2073 slirp_inited = 1;
2074 slirp_init();
2075 }
2076
2077 p = redir_str;
2078 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2079 goto fail;
2080 if (!strcmp(buf, "tcp")) {
2081 is_udp = 0;
2082 } else if (!strcmp(buf, "udp")) {
2083 is_udp = 1;
2084 } else {
2085 goto fail;
2086 }
2087
2088 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2089 goto fail;
2090 host_port = strtol(buf, &r, 0);
2091 if (r == buf)
2092 goto fail;
2093
2094 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2095 goto fail;
2096 if (buf[0] == '\0') {
2097 pstrcpy(buf, sizeof(buf), "10.0.2.15");
2098 }
2099 if (!inet_aton(buf, &guest_addr))
2100 goto fail;
3b46e624 2101
9bf05444
FB
2102 guest_port = strtol(p, &r, 0);
2103 if (r == p)
2104 goto fail;
3b46e624 2105
9bf05444
FB
2106 if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
2107 fprintf(stderr, "qemu: could not set up redirection\n");
2108 exit(1);
2109 }
2110 return;
2111 fail:
2112 fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
2113 exit(1);
2114}
3b46e624 2115
c94c8d64
FB
2116#ifndef _WIN32
2117
dbed7e40 2118static char smb_dir[1024];
9d728e8c 2119
044fae83 2120static void erase_dir(char *dir_name)
9d728e8c
FB
2121{
2122 DIR *d;
2123 struct dirent *de;
2124 char filename[1024];
2125
2126 /* erase all the files in the directory */
044fae83
AZ
2127 if ((d = opendir(dir_name)) != 0) {
2128 for(;;) {
2129 de = readdir(d);
2130 if (!de)
2131 break;
2132 if (strcmp(de->d_name, ".") != 0 &&
2133 strcmp(de->d_name, "..") != 0) {
2134 snprintf(filename, sizeof(filename), "%s/%s",
2135 smb_dir, de->d_name);
2136 if (unlink(filename) != 0) /* is it a directory? */
2137 erase_dir(filename);
2138 }
9d728e8c 2139 }
044fae83
AZ
2140 closedir(d);
2141 rmdir(dir_name);
9d728e8c 2142 }
044fae83
AZ
2143}
2144
2145/* automatic user mode samba server configuration */
2146static void smb_exit(void)
2147{
2148 erase_dir(smb_dir);
9d728e8c
FB
2149}
2150
2151/* automatic user mode samba server configuration */
9596ebb7 2152static void net_slirp_smb(const char *exported_dir)
9d728e8c
FB
2153{
2154 char smb_conf[1024];
2155 char smb_cmdline[1024];
2156 FILE *f;
2157
2158 if (!slirp_inited) {
2159 slirp_inited = 1;
2160 slirp_init();
2161 }
2162
2163 /* XXX: better tmp dir construction */
2164 snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
2165 if (mkdir(smb_dir, 0700) < 0) {
2166 fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
2167 exit(1);
2168 }
2169 snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
3b46e624 2170
9d728e8c
FB
2171 f = fopen(smb_conf, "w");
2172 if (!f) {
2173 fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
2174 exit(1);
2175 }
5fafdf24 2176 fprintf(f,
9d728e8c 2177 "[global]\n"
157777ef
FB
2178 "private dir=%s\n"
2179 "smb ports=0\n"
2180 "socket address=127.0.0.1\n"
9d728e8c
FB
2181 "pid directory=%s\n"
2182 "lock directory=%s\n"
2183 "log file=%s/log.smbd\n"
2184 "smb passwd file=%s/smbpasswd\n"
03ffbb69 2185 "security = share\n"
9d728e8c
FB
2186 "[qemu]\n"
2187 "path=%s\n"
2188 "read only=no\n"
2189 "guest ok=yes\n",
2190 smb_dir,
157777ef 2191 smb_dir,
9d728e8c
FB
2192 smb_dir,
2193 smb_dir,
2194 smb_dir,
2195 exported_dir
2196 );
2197 fclose(f);
2198 atexit(smb_exit);
2199
a14d6c8c
PB
2200 snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
2201 SMBD_COMMAND, smb_conf);
3b46e624 2202
9d728e8c
FB
2203 slirp_add_exec(0, smb_cmdline, 4, 139);
2204}
9bf05444 2205
c94c8d64 2206#endif /* !defined(_WIN32) */
31a60e22
BS
2207void do_info_slirp(void)
2208{
2209 slirp_stats();
2210}
c94c8d64 2211
c20709aa
FB
2212#endif /* CONFIG_SLIRP */
2213
2214#if !defined(_WIN32)
7c9d8e07
FB
2215
2216typedef struct TAPState {
2217 VLANClientState *vc;
2218 int fd;
b46a8906 2219 char down_script[1024];
7c9d8e07
FB
2220} TAPState;
2221
2222static void tap_receive(void *opaque, const uint8_t *buf, int size)
2223{
2224 TAPState *s = opaque;
2225 int ret;
2226 for(;;) {
2227 ret = write(s->fd, buf, size);
2228 if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
2229 } else {
2230 break;
2231 }
2232 }
2233}
2234
2235static void tap_send(void *opaque)
2236{
2237 TAPState *s = opaque;
2238 uint8_t buf[4096];
2239 int size;
2240
d5d10bc3
TS
2241#ifdef __sun__
2242 struct strbuf sbuf;
2243 int f = 0;
2244 sbuf.maxlen = sizeof(buf);
2245 sbuf.buf = buf;
2246 size = getmsg(s->fd, NULL, &sbuf, &f) >=0 ? sbuf.len : -1;
2247#else
7c9d8e07 2248 size = read(s->fd, buf, sizeof(buf));
d5d10bc3 2249#endif
7c9d8e07
FB
2250 if (size > 0) {
2251 qemu_send_packet(s->vc, buf, size);
2252 }
2253}
2254
2255/* fd support */
2256
2257static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
2258{
2259 TAPState *s;
2260
2261 s = qemu_mallocz(sizeof(TAPState));
2262 if (!s)
2263 return NULL;
2264 s->fd = fd;
d861b05e 2265 s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
7c9d8e07
FB
2266 qemu_set_fd_handler(s->fd, tap_send, NULL, s);
2267 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
2268 return s;
2269}
2270
5c40d2bd 2271#if defined (_BSD) || defined (__FreeBSD_kernel__)
7c9d8e07 2272static int tap_open(char *ifname, int ifname_size)
7d3505c5
FB
2273{
2274 int fd;
2275 char *dev;
2276 struct stat s;
67b915a5 2277
aeb30be6 2278 TFR(fd = open("/dev/tap", O_RDWR));
7d3505c5
FB
2279 if (fd < 0) {
2280 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
2281 return -1;
2282 }
2283
2284 fstat(fd, &s);
2285 dev = devname(s.st_rdev, S_IFCHR);
2286 pstrcpy(ifname, ifname_size, dev);
2287
2288 fcntl(fd, F_SETFL, O_NONBLOCK);
2289 return fd;
2290}
ec530c81 2291#elif defined(__sun__)
d5d10bc3 2292#define TUNNEWPPA (('T'<<16) | 0x0001)
5fafdf24
TS
2293/*
2294 * Allocate TAP device, returns opened fd.
d5d10bc3 2295 * Stores dev name in the first arg(must be large enough).
3b46e624 2296 */
363a37d5 2297int tap_alloc(char *dev, size_t dev_size)
d5d10bc3
TS
2298{
2299 int tap_fd, if_fd, ppa = -1;
2300 static int ip_fd = 0;
2301 char *ptr;
2302
2303 static int arp_fd = 0;
2304 int ip_muxid, arp_muxid;
2305 struct strioctl strioc_if, strioc_ppa;
2306 int link_type = I_PLINK;;
2307 struct lifreq ifr;
2308 char actual_name[32] = "";
2309
2310 memset(&ifr, 0x0, sizeof(ifr));
2311
2312 if( *dev ){
5fafdf24
TS
2313 ptr = dev;
2314 while( *ptr && !isdigit((int)*ptr) ) ptr++;
d5d10bc3
TS
2315 ppa = atoi(ptr);
2316 }
2317
2318 /* Check if IP device was opened */
2319 if( ip_fd )
2320 close(ip_fd);
2321
aeb30be6
AZ
2322 TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
2323 if (ip_fd < 0) {
d5d10bc3
TS
2324 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
2325 return -1;
2326 }
2327
aeb30be6
AZ
2328 TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
2329 if (tap_fd < 0) {
d5d10bc3
TS
2330 syslog(LOG_ERR, "Can't open /dev/tap");
2331 return -1;
2332 }
2333
2334 /* Assign a new PPA and get its unit number. */
2335 strioc_ppa.ic_cmd = TUNNEWPPA;
2336 strioc_ppa.ic_timout = 0;
2337 strioc_ppa.ic_len = sizeof(ppa);
2338 strioc_ppa.ic_dp = (char *)&ppa;
2339 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
2340 syslog (LOG_ERR, "Can't assign new interface");
2341
aeb30be6
AZ
2342 TFR(if_fd = open("/dev/tap", O_RDWR, 0));
2343 if (if_fd < 0) {
d5d10bc3
TS
2344 syslog(LOG_ERR, "Can't open /dev/tap (2)");
2345 return -1;
2346 }
2347 if(ioctl(if_fd, I_PUSH, "ip") < 0){
2348 syslog(LOG_ERR, "Can't push IP module");
2349 return -1;
2350 }
2351
2352 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
2353 syslog(LOG_ERR, "Can't get flags\n");
2354
2355 snprintf (actual_name, 32, "tap%d", ppa);
be15b141 2356 pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
d5d10bc3
TS
2357
2358 ifr.lifr_ppa = ppa;
2359 /* Assign ppa according to the unit number returned by tun device */
2360
2361 if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
2362 syslog (LOG_ERR, "Can't set PPA %d", ppa);
2363 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
2364 syslog (LOG_ERR, "Can't get flags\n");
2365 /* Push arp module to if_fd */
2366 if (ioctl (if_fd, I_PUSH, "arp") < 0)
2367 syslog (LOG_ERR, "Can't push ARP module (2)");
2368
2369 /* Push arp module to ip_fd */
2370 if (ioctl (ip_fd, I_POP, NULL) < 0)
2371 syslog (LOG_ERR, "I_POP failed\n");
2372 if (ioctl (ip_fd, I_PUSH, "arp") < 0)
2373 syslog (LOG_ERR, "Can't push ARP module (3)\n");
2374 /* Open arp_fd */
aeb30be6
AZ
2375 TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
2376 if (arp_fd < 0)
d5d10bc3
TS
2377 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
2378
2379 /* Set ifname to arp */
2380 strioc_if.ic_cmd = SIOCSLIFNAME;
2381 strioc_if.ic_timout = 0;
2382 strioc_if.ic_len = sizeof(ifr);
2383 strioc_if.ic_dp = (char *)&ifr;
2384 if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
2385 syslog (LOG_ERR, "Can't set ifname to arp\n");
2386 }
2387
2388 if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
2389 syslog(LOG_ERR, "Can't link TAP device to IP");
2390 return -1;
2391 }
2392
2393 if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
2394 syslog (LOG_ERR, "Can't link TAP device to ARP");
2395
2396 close (if_fd);
2397
2398 memset(&ifr, 0x0, sizeof(ifr));
be15b141 2399 pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
d5d10bc3
TS
2400 ifr.lifr_ip_muxid = ip_muxid;
2401 ifr.lifr_arp_muxid = arp_muxid;
2402
2403 if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
2404 {
2405 ioctl (ip_fd, I_PUNLINK , arp_muxid);
2406 ioctl (ip_fd, I_PUNLINK, ip_muxid);
2407 syslog (LOG_ERR, "Can't set multiplexor id");
2408 }
2409
363a37d5 2410 snprintf(dev, dev_size, "tap%d", ppa);
d5d10bc3
TS
2411 return tap_fd;
2412}
2413
ec530c81
FB
2414static int tap_open(char *ifname, int ifname_size)
2415{
d5d10bc3
TS
2416 char dev[10]="";
2417 int fd;
363a37d5 2418 if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
d5d10bc3
TS
2419 fprintf(stderr, "Cannot allocate TAP device\n");
2420 return -1;
2421 }
2422 pstrcpy(ifname, ifname_size, dev);
2423 fcntl(fd, F_SETFL, O_NONBLOCK);
2424 return fd;
ec530c81 2425}
7d3505c5 2426#else
7c9d8e07 2427static int tap_open(char *ifname, int ifname_size)
330d0414 2428{
80cabfad 2429 struct ifreq ifr;
c4b1fcc0 2430 int fd, ret;
3b46e624 2431
aeb30be6 2432 TFR(fd = open("/dev/net/tun", O_RDWR));
80cabfad
FB
2433 if (fd < 0) {
2434 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
2435 return -1;
330d0414 2436 }
80cabfad
FB
2437 memset(&ifr, 0, sizeof(ifr));
2438 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
7c9d8e07
FB
2439 if (ifname[0] != '\0')
2440 pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
2441 else
2442 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
80cabfad
FB
2443 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
2444 if (ret != 0) {
2445 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
2446 close(fd);
2447 return -1;
2448 }
c4b1fcc0 2449 pstrcpy(ifname, ifname_size, ifr.ifr_name);
80cabfad 2450 fcntl(fd, F_SETFL, O_NONBLOCK);
c4b1fcc0
FB
2451 return fd;
2452}
7d3505c5 2453#endif
330d0414 2454
b46a8906 2455static int launch_script(const char *setup_script, const char *ifname, int fd)
7c9d8e07 2456{
b46a8906 2457 int pid, status;
7c9d8e07
FB
2458 char *args[3];
2459 char **parg;
7c9d8e07 2460
b46a8906 2461 /* try to launch network script */
7c9d8e07
FB
2462 pid = fork();
2463 if (pid >= 0) {
2464 if (pid == 0) {
50d3eeae
TS
2465 int open_max = sysconf (_SC_OPEN_MAX), i;
2466 for (i = 0; i < open_max; i++)
2467 if (i != STDIN_FILENO &&
2468 i != STDOUT_FILENO &&
2469 i != STDERR_FILENO &&
2470 i != fd)
2471 close(i);
2472
7c9d8e07
FB
2473 parg = args;
2474 *parg++ = (char *)setup_script;
b46a8906 2475 *parg++ = (char *)ifname;
7c9d8e07
FB
2476 *parg++ = NULL;
2477 execv(setup_script, args);
4a38940d 2478 _exit(1);
7c9d8e07
FB
2479 }
2480 while (waitpid(pid, &status, 0) != pid);
2481 if (!WIFEXITED(status) ||
2482 WEXITSTATUS(status) != 0) {
2483 fprintf(stderr, "%s: could not launch network script\n",
2484 setup_script);
2485 return -1;
2486 }
2487 }
b46a8906
TS
2488 return 0;
2489}
2490
2491static int net_tap_init(VLANState *vlan, const char *ifname1,
2492 const char *setup_script, const char *down_script)
2493{
2494 TAPState *s;
2495 int fd;
2496 char ifname[128];
2497
2498 if (ifname1 != NULL)
2499 pstrcpy(ifname, sizeof(ifname), ifname1);
2500 else
2501 ifname[0] = '\0';
2502 TFR(fd = tap_open(ifname, sizeof(ifname)));
2503 if (fd < 0)
2504 return -1;
2505
2506 if (!setup_script || !strcmp(setup_script, "no"))
2507 setup_script = "";
2508 if (setup_script[0] != '\0') {
2509 if (launch_script(setup_script, ifname, fd))
2510 return -1;
7c9d8e07
FB
2511 }
2512 s = net_tap_fd_init(vlan, fd);
2513 if (!s)
2514 return -1;
5fafdf24 2515 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
7c9d8e07 2516 "tap: ifname=%s setup_script=%s", ifname, setup_script);
b46a8906
TS
2517 if (down_script && strcmp(down_script, "no"))
2518 snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
7c9d8e07
FB
2519 return 0;
2520}
2521
fd1dff4b
FB
2522#endif /* !_WIN32 */
2523
8a16d273
TS
2524#if defined(CONFIG_VDE)
2525typedef struct VDEState {
2526 VLANClientState *vc;
2527 VDECONN *vde;
2528} VDEState;
2529
2530static void vde_to_qemu(void *opaque)
2531{
2532 VDEState *s = opaque;
2533 uint8_t buf[4096];
2534 int size;
2535
2536 size = vde_recv(s->vde, buf, sizeof(buf), 0);
2537 if (size > 0) {
2538 qemu_send_packet(s->vc, buf, size);
2539 }
2540}
2541
2542static void vde_from_qemu(void *opaque, const uint8_t *buf, int size)
2543{
2544 VDEState *s = opaque;
2545 int ret;
2546 for(;;) {
2547 ret = vde_send(s->vde, buf, size, 0);
2548 if (ret < 0 && errno == EINTR) {
2549 } else {
2550 break;
2551 }
2552 }
2553}
2554
2555static int net_vde_init(VLANState *vlan, const char *sock, int port,
2556 const char *group, int mode)
2557{
2558 VDEState *s;
2559 char *init_group = strlen(group) ? (char *)group : NULL;
2560 char *init_sock = strlen(sock) ? (char *)sock : NULL;
2561
2562 struct vde_open_args args = {
2563 .port = port,
2564 .group = init_group,
2565 .mode = mode,
2566 };
2567
2568 s = qemu_mallocz(sizeof(VDEState));
2569 if (!s)
2570 return -1;
2571 s->vde = vde_open(init_sock, "QEMU", &args);
2572 if (!s->vde){
2573 free(s);
2574 return -1;
2575 }
2576 s->vc = qemu_new_vlan_client(vlan, vde_from_qemu, NULL, s);
2577 qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
2578 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "vde: sock=%s fd=%d",
2579 sock, vde_datafd(s->vde));
2580 return 0;
2581}
2582#endif
2583
7c9d8e07
FB
2584/* network connection */
2585typedef struct NetSocketState {
2586 VLANClientState *vc;
2587 int fd;
2588 int state; /* 0 = getting length, 1 = getting data */
2589 int index;
2590 int packet_len;
2591 uint8_t buf[4096];
3d830459 2592 struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
7c9d8e07
FB
2593} NetSocketState;
2594
2595typedef struct NetSocketListenState {
2596 VLANState *vlan;
2597 int fd;
2598} NetSocketListenState;
2599
2600/* XXX: we consider we can send the whole packet without blocking */
2601static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
c20709aa 2602{
7c9d8e07
FB
2603 NetSocketState *s = opaque;
2604 uint32_t len;
2605 len = htonl(size);
2606
fd1dff4b
FB
2607 send_all(s->fd, (const uint8_t *)&len, sizeof(len));
2608 send_all(s->fd, buf, size);
c20709aa
FB
2609}
2610
3d830459
FB
2611static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
2612{
2613 NetSocketState *s = opaque;
5fafdf24 2614 sendto(s->fd, buf, size, 0,
3d830459
FB
2615 (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
2616}
2617
7c9d8e07 2618static void net_socket_send(void *opaque)
c4b1fcc0 2619{
7c9d8e07 2620 NetSocketState *s = opaque;
fd1dff4b 2621 int l, size, err;
7c9d8e07
FB
2622 uint8_t buf1[4096];
2623 const uint8_t *buf;
2624
fd1dff4b
FB
2625 size = recv(s->fd, buf1, sizeof(buf1), 0);
2626 if (size < 0) {
2627 err = socket_error();
5fafdf24 2628 if (err != EWOULDBLOCK)
fd1dff4b
FB
2629 goto eoc;
2630 } else if (size == 0) {
7c9d8e07 2631 /* end of connection */
fd1dff4b 2632 eoc:
7c9d8e07 2633 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
fd1dff4b 2634 closesocket(s->fd);
7c9d8e07
FB
2635 return;
2636 }
2637 buf = buf1;
2638 while (size > 0) {
2639 /* reassemble a packet from the network */
2640 switch(s->state) {
2641 case 0:
2642 l = 4 - s->index;
2643 if (l > size)
2644 l = size;
2645 memcpy(s->buf + s->index, buf, l);
2646 buf += l;
2647 size -= l;
2648 s->index += l;
2649 if (s->index == 4) {
2650 /* got length */
2651 s->packet_len = ntohl(*(uint32_t *)s->buf);
2652 s->index = 0;
2653 s->state = 1;
2654 }
2655 break;
2656 case 1:
2657 l = s->packet_len - s->index;
2658 if (l > size)
2659 l = size;
2660 memcpy(s->buf + s->index, buf, l);
2661 s->index += l;
2662 buf += l;
2663 size -= l;
2664 if (s->index >= s->packet_len) {
2665 qemu_send_packet(s->vc, s->buf, s->packet_len);
2666 s->index = 0;
2667 s->state = 0;
2668 }
2669 break;
2670 }
2671 }
c20709aa
FB
2672}
2673
3d830459
FB
2674static void net_socket_send_dgram(void *opaque)
2675{
2676 NetSocketState *s = opaque;
2677 int size;
2678
2679 size = recv(s->fd, s->buf, sizeof(s->buf), 0);
5fafdf24 2680 if (size < 0)
3d830459
FB
2681 return;
2682 if (size == 0) {
2683 /* end of connection */
2684 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2685 return;
2686 }
2687 qemu_send_packet(s->vc, s->buf, size);
2688}
2689
2690static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
2691{
2692 struct ip_mreq imr;
2693 int fd;
2694 int val, ret;
2695 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
2696 fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
5fafdf24 2697 inet_ntoa(mcastaddr->sin_addr),
fd1dff4b 2698 (int)ntohl(mcastaddr->sin_addr.s_addr));
3d830459
FB
2699 return -1;
2700
2701 }
2702 fd = socket(PF_INET, SOCK_DGRAM, 0);
2703 if (fd < 0) {
2704 perror("socket(PF_INET, SOCK_DGRAM)");
2705 return -1;
2706 }
2707
fd1dff4b 2708 val = 1;
5fafdf24 2709 ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
fd1dff4b
FB
2710 (const char *)&val, sizeof(val));
2711 if (ret < 0) {
2712 perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2713 goto fail;
2714 }
2715
2716 ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2717 if (ret < 0) {
2718 perror("bind");
2719 goto fail;
2720 }
3b46e624 2721
3d830459
FB
2722 /* Add host to multicast group */
2723 imr.imr_multiaddr = mcastaddr->sin_addr;
2724 imr.imr_interface.s_addr = htonl(INADDR_ANY);
2725
5fafdf24 2726 ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
fd1dff4b 2727 (const char *)&imr, sizeof(struct ip_mreq));
3d830459
FB
2728 if (ret < 0) {
2729 perror("setsockopt(IP_ADD_MEMBERSHIP)");
2730 goto fail;
2731 }
2732
2733 /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2734 val = 1;
5fafdf24 2735 ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
fd1dff4b 2736 (const char *)&val, sizeof(val));
3d830459
FB
2737 if (ret < 0) {
2738 perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2739 goto fail;
2740 }
2741
fd1dff4b 2742 socket_set_nonblock(fd);
3d830459
FB
2743 return fd;
2744fail:
5fafdf24 2745 if (fd >= 0)
0bab00f3 2746 closesocket(fd);
3d830459
FB
2747 return -1;
2748}
2749
5fafdf24 2750static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd,
3d830459
FB
2751 int is_connected)
2752{
2753 struct sockaddr_in saddr;
2754 int newfd;
2755 socklen_t saddr_len;
2756 NetSocketState *s;
2757
2758 /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
5fafdf24 2759 * Because this may be "shared" socket from a "master" process, datagrams would be recv()
3d830459
FB
2760 * by ONLY ONE process: we must "clone" this dgram socket --jjo
2761 */
2762
2763 if (is_connected) {
2764 if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2765 /* must be bound */
2766 if (saddr.sin_addr.s_addr==0) {
2767 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2768 fd);
2769 return NULL;
2770 }
2771 /* clone dgram socket */
2772 newfd = net_socket_mcast_create(&saddr);
2773 if (newfd < 0) {
2774 /* error already reported by net_socket_mcast_create() */
2775 close(fd);
2776 return NULL;
2777 }
2778 /* clone newfd to fd, close newfd */
2779 dup2(newfd, fd);
2780 close(newfd);
5fafdf24 2781
3d830459
FB
2782 } else {
2783 fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2784 fd, strerror(errno));
2785 return NULL;
2786 }
2787 }
2788
2789 s = qemu_mallocz(sizeof(NetSocketState));
2790 if (!s)
2791 return NULL;
2792 s->fd = fd;
2793
d861b05e 2794 s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
3d830459
FB
2795 qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2796
2797 /* mcast: save bound address as dst */
2798 if (is_connected) s->dgram_dst=saddr;
2799
2800 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
5fafdf24 2801 "socket: fd=%d (%s mcast=%s:%d)",
3d830459
FB
2802 fd, is_connected? "cloned" : "",
2803 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2804 return s;
2805}
2806
7c9d8e07 2807static void net_socket_connect(void *opaque)
c20709aa 2808{
7c9d8e07
FB
2809 NetSocketState *s = opaque;
2810 qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2811}
c4b1fcc0 2812
5fafdf24 2813static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd,
7c9d8e07
FB
2814 int is_connected)
2815{
2816 NetSocketState *s;
2817 s = qemu_mallocz(sizeof(NetSocketState));
2818 if (!s)
2819 return NULL;
2820 s->fd = fd;
5fafdf24 2821 s->vc = qemu_new_vlan_client(vlan,
d861b05e 2822 net_socket_receive, NULL, s);
7c9d8e07
FB
2823 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2824 "socket: fd=%d", fd);
2825 if (is_connected) {
2826 net_socket_connect(s);
2827 } else {
2828 qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2829 }
2830 return s;
2831}
c4b1fcc0 2832
5fafdf24 2833static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd,
3d830459
FB
2834 int is_connected)
2835{
2836 int so_type=-1, optlen=sizeof(so_type);
2837
69b34976
TS
2838 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2839 (socklen_t *)&optlen)< 0) {
931f03ee 2840 fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
3d830459
FB
2841 return NULL;
2842 }
2843 switch(so_type) {
2844 case SOCK_DGRAM:
2845 return net_socket_fd_init_dgram(vlan, fd, is_connected);
2846 case SOCK_STREAM:
2847 return net_socket_fd_init_stream(vlan, fd, is_connected);
2848 default:
2849 /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2850 fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2851 return net_socket_fd_init_stream(vlan, fd, is_connected);
2852 }
2853 return NULL;
2854}
2855
7c9d8e07
FB
2856static void net_socket_accept(void *opaque)
2857{
3b46e624 2858 NetSocketListenState *s = opaque;
7c9d8e07
FB
2859 NetSocketState *s1;
2860 struct sockaddr_in saddr;
2861 socklen_t len;
2862 int fd;
2863
2864 for(;;) {
2865 len = sizeof(saddr);
2866 fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2867 if (fd < 0 && errno != EINTR) {
2868 return;
2869 } else if (fd >= 0) {
2870 break;
80cabfad 2871 }
330d0414 2872 }
5fafdf24 2873 s1 = net_socket_fd_init(s->vlan, fd, 1);
7c9d8e07 2874 if (!s1) {
0bab00f3 2875 closesocket(fd);
7c9d8e07
FB
2876 } else {
2877 snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
5fafdf24 2878 "socket: connection from %s:%d",
7c9d8e07
FB
2879 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2880 }
2881}
2882
2883static int net_socket_listen_init(VLANState *vlan, const char *host_str)
2884{
2885 NetSocketListenState *s;
2886 int fd, val, ret;
2887 struct sockaddr_in saddr;
2888
2889 if (parse_host_port(&saddr, host_str) < 0)
2890 return -1;
3b46e624 2891
7c9d8e07
FB
2892 s = qemu_mallocz(sizeof(NetSocketListenState));
2893 if (!s)
2894 return -1;
2895
2896 fd = socket(PF_INET, SOCK_STREAM, 0);
2897 if (fd < 0) {
2898 perror("socket");
2899 return -1;
2900 }
fd1dff4b 2901 socket_set_nonblock(fd);
7c9d8e07
FB
2902
2903 /* allow fast reuse */
2904 val = 1;
fd1dff4b 2905 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
3b46e624 2906
7c9d8e07
FB
2907 ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2908 if (ret < 0) {
2909 perror("bind");
2910 return -1;
2911 }
2912 ret = listen(fd, 0);
2913 if (ret < 0) {
2914 perror("listen");
2915 return -1;
2916 }
2917 s->vlan = vlan;
2918 s->fd = fd;
2919 qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
80cabfad 2920 return 0;
330d0414
FB
2921}
2922
7c9d8e07 2923static int net_socket_connect_init(VLANState *vlan, const char *host_str)
330d0414 2924{
7c9d8e07 2925 NetSocketState *s;
fd1dff4b 2926 int fd, connected, ret, err;
7c9d8e07
FB
2927 struct sockaddr_in saddr;
2928
2929 if (parse_host_port(&saddr, host_str) < 0)
2930 return -1;
2931
2932 fd = socket(PF_INET, SOCK_STREAM, 0);
2933 if (fd < 0) {
2934 perror("socket");
2935 return -1;
2936 }
fd1dff4b 2937 socket_set_nonblock(fd);
7c9d8e07
FB
2938
2939 connected = 0;
2940 for(;;) {
2941 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2942 if (ret < 0) {
fd1dff4b
FB
2943 err = socket_error();
2944 if (err == EINTR || err == EWOULDBLOCK) {
2945 } else if (err == EINPROGRESS) {
7c9d8e07 2946 break;
f5b12268
TS
2947#ifdef _WIN32
2948 } else if (err == WSAEALREADY) {
2949 break;
2950#endif
7c9d8e07
FB
2951 } else {
2952 perror("connect");
fd1dff4b 2953 closesocket(fd);
7c9d8e07
FB
2954 return -1;
2955 }
2956 } else {
2957 connected = 1;
2958 break;
2959 }
2960 }
2961 s = net_socket_fd_init(vlan, fd, connected);
2962 if (!s)
2963 return -1;
2964 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
5fafdf24 2965 "socket: connect to %s:%d",
7c9d8e07 2966 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
c20709aa 2967 return 0;
80cabfad 2968}
330d0414 2969
3d830459
FB
2970static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
2971{
2972 NetSocketState *s;
2973 int fd;
2974 struct sockaddr_in saddr;
2975
2976 if (parse_host_port(&saddr, host_str) < 0)
2977 return -1;
2978
2979
2980 fd = net_socket_mcast_create(&saddr);
2981 if (fd < 0)
2982 return -1;
2983
2984 s = net_socket_fd_init(vlan, fd, 0);
2985 if (!s)
2986 return -1;
2987
2988 s->dgram_dst = saddr;
3b46e624 2989
3d830459 2990 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
5fafdf24 2991 "socket: mcast=%s:%d",
3d830459
FB
2992 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2993 return 0;
2994
2995}
2996
609497ab
AZ
2997static const char *get_opt_name(char *buf, int buf_size, const char *p)
2998{
2999 char *q;
3000
3001 q = buf;
3002 while (*p != '\0' && *p != '=') {
3003 if (q && (q - buf) < buf_size - 1)
3004 *q++ = *p;
3005 p++;
3006 }
3007 if (q)
3008 *q = '\0';
3009
3010 return p;
3011}
3012
3013static const char *get_opt_value(char *buf, int buf_size, const char *p)
e4bcb14c
TS
3014{
3015 char *q;
e4bcb14c 3016
e4bcb14c
TS
3017 q = buf;
3018 while (*p != '\0') {
609497ab
AZ
3019 if (*p == ',') {
3020 if (*(p + 1) != ',')
e4bcb14c 3021 break;
e4bcb14c 3022 p++;
609497ab 3023 }
e4bcb14c
TS
3024 if (q && (q - buf) < buf_size - 1)
3025 *q++ = *p;
3026 p++;
3027 }
3028 if (q)
3029 *q = '\0';
3030
3031 return p;
3032}
3033
7c9d8e07
FB
3034static int get_param_value(char *buf, int buf_size,
3035 const char *tag, const char *str)
3036{
3037 const char *p;
7c9d8e07
FB
3038 char option[128];
3039
3040 p = str;
3041 for(;;) {
609497ab 3042 p = get_opt_name(option, sizeof(option), p);
7c9d8e07
FB
3043 if (*p != '=')
3044 break;
3045 p++;
3046 if (!strcmp(tag, option)) {
609497ab 3047 (void)get_opt_value(buf, buf_size, p);
e4bcb14c 3048 return strlen(buf);
7c9d8e07 3049 } else {
609497ab 3050 p = get_opt_value(NULL, 0, p);
7c9d8e07
FB
3051 }
3052 if (*p != ',')
3053 break;
3054 p++;
3055 }
3056 return 0;
3057}
3058
e4bcb14c 3059static int check_params(char *buf, int buf_size,
7ccfb2eb 3060 const char * const *params, const char *str)
e4bcb14c
TS
3061{
3062 const char *p;
3063 int i;
3064
3065 p = str;
3066 for(;;) {
609497ab 3067 p = get_opt_name(buf, buf_size, p);
e4bcb14c
TS
3068 if (*p != '=')
3069 return -1;
3070 p++;
3071 for(i = 0; params[i] != NULL; i++)
3072 if (!strcmp(params[i], buf))
3073 break;
3074 if (params[i] == NULL)
3075 return -1;
609497ab 3076 p = get_opt_value(NULL, 0, p);
e4bcb14c
TS
3077 if (*p != ',')
3078 break;
3079 p++;
3080 }
3081 return 0;
3082}
3083
9ad97e65 3084static int net_client_init(const char *device, const char *p)
7c9d8e07 3085{
7c9d8e07
FB
3086 char buf[1024];
3087 int vlan_id, ret;
3088 VLANState *vlan;
3089
7c9d8e07
FB
3090 vlan_id = 0;
3091 if (get_param_value(buf, sizeof(buf), "vlan", p)) {
3092 vlan_id = strtol(buf, NULL, 0);
3093 }
3094 vlan = qemu_find_vlan(vlan_id);
3095 if (!vlan) {
3096 fprintf(stderr, "Could not create vlan %d\n", vlan_id);
3097 return -1;
3098 }
3099 if (!strcmp(device, "nic")) {
3100 NICInfo *nd;
3101 uint8_t *macaddr;
3102
3103 if (nb_nics >= MAX_NICS) {
3104 fprintf(stderr, "Too Many NICs\n");
3105 return -1;
3106 }
3107 nd = &nd_table[nb_nics];
3108 macaddr = nd->macaddr;
3109 macaddr[0] = 0x52;
3110 macaddr[1] = 0x54;
3111 macaddr[2] = 0x00;
3112 macaddr[3] = 0x12;
3113 macaddr[4] = 0x34;
3114 macaddr[5] = 0x56 + nb_nics;
3115
3116 if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
3117 if (parse_macaddr(macaddr, buf) < 0) {
3118 fprintf(stderr, "invalid syntax for ethernet address\n");
3119 return -1;
3120 }
3121 }
a41b2ff2
PB
3122 if (get_param_value(buf, sizeof(buf), "model", p)) {
3123 nd->model = strdup(buf);
3124 }
7c9d8e07
FB
3125 nd->vlan = vlan;
3126 nb_nics++;
833c7174 3127 vlan->nb_guest_devs++;
7c9d8e07
FB
3128 ret = 0;
3129 } else
3130 if (!strcmp(device, "none")) {
3131 /* does nothing. It is needed to signal that no network cards
3132 are wanted */
3133 ret = 0;
3134 } else
3135#ifdef CONFIG_SLIRP
3136 if (!strcmp(device, "user")) {
115defd1 3137 if (get_param_value(buf, sizeof(buf), "hostname", p)) {
3f423c9c 3138 pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
115defd1 3139 }
833c7174 3140 vlan->nb_host_devs++;
7c9d8e07
FB
3141 ret = net_slirp_init(vlan);
3142 } else
3143#endif
7fb843f8
FB
3144#ifdef _WIN32
3145 if (!strcmp(device, "tap")) {
3146 char ifname[64];
3147 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
3148 fprintf(stderr, "tap: no interface name\n");
3149 return -1;
3150 }
833c7174 3151 vlan->nb_host_devs++;
7fb843f8
FB
3152 ret = tap_win32_init(vlan, ifname);
3153 } else
3154#else
7c9d8e07
FB
3155 if (!strcmp(device, "tap")) {
3156 char ifname[64];
b46a8906 3157 char setup_script[1024], down_script[1024];
7c9d8e07 3158 int fd;
4f01035f 3159 vlan->nb_host_devs++;
7c9d8e07
FB
3160 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
3161 fd = strtol(buf, NULL, 0);
64538cdf 3162 fcntl(fd, F_SETFL, O_NONBLOCK);
7c9d8e07
FB
3163 ret = -1;
3164 if (net_tap_fd_init(vlan, fd))
3165 ret = 0;
3166 } else {
bf8c5342
FB
3167 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
3168 ifname[0] = '\0';
3169 }
7c9d8e07
FB
3170 if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
3171 pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
3172 }
b46a8906
TS
3173 if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
3174 pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
3175 }
3176 ret = net_tap_init(vlan, ifname, setup_script, down_script);
7c9d8e07
FB
3177 }
3178 } else
fd1dff4b 3179#endif
7c9d8e07
FB
3180 if (!strcmp(device, "socket")) {
3181 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
3182 int fd;
3183 fd = strtol(buf, NULL, 0);
3184 ret = -1;
3185 if (net_socket_fd_init(vlan, fd, 1))
3186 ret = 0;
3187 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
3188 ret = net_socket_listen_init(vlan, buf);
3189 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
3190 ret = net_socket_connect_init(vlan, buf);
3d830459
FB
3191 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
3192 ret = net_socket_mcast_init(vlan, buf);
7c9d8e07
FB
3193 } else {
3194 fprintf(stderr, "Unknown socket options: %s\n", p);
3195 return -1;
3196 }
833c7174 3197 vlan->nb_host_devs++;
7c9d8e07 3198 } else
8a16d273
TS
3199#ifdef CONFIG_VDE
3200 if (!strcmp(device, "vde")) {
3201 char vde_sock[1024], vde_group[512];
3202 int vde_port, vde_mode;
3203 vlan->nb_host_devs++;
3204 if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
3205 vde_sock[0] = '\0';
3206 }
3207 if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
3208 vde_port = strtol(buf, NULL, 10);
3209 } else {
3210 vde_port = 0;
3211 }
3212 if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
3213 vde_group[0] = '\0';
3214 }
3215 if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
3216 vde_mode = strtol(buf, NULL, 8);
3217 } else {
3218 vde_mode = 0700;
3219 }
3220 ret = net_vde_init(vlan, vde_sock, vde_port, vde_group, vde_mode);
3221 } else
3222#endif
7c9d8e07
FB
3223 {
3224 fprintf(stderr, "Unknown network device: %s\n", device);
3225 return -1;
3226 }
3227 if (ret < 0) {
3228 fprintf(stderr, "Could not initialize device '%s'\n", device);
3229 }
3b46e624 3230
7c9d8e07
FB
3231 return ret;
3232}
3233
9ad97e65
AZ
3234static int net_client_parse(const char *str)
3235{
3236 const char *p;
3237 char *q;
3238 char device[64];
3239
3240 p = str;
3241 q = device;
3242 while (*p != '\0' && *p != ',') {
3243 if ((q - device) < sizeof(device) - 1)
3244 *q++ = *p;
3245 p++;
3246 }
3247 *q = '\0';
3248 if (*p == ',')
3249 p++;
3250
3251 return net_client_init(device, p);
3252}
3253
7c9d8e07
FB
3254void do_info_network(void)
3255{
3256 VLANState *vlan;
3257 VLANClientState *vc;
3258
3259 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
3260 term_printf("VLAN %d devices:\n", vlan->id);
3261 for(vc = vlan->first_client; vc != NULL; vc = vc->next)
3262 term_printf(" %s\n", vc->info_str);
3263 }
3264}
42550fde 3265
1ae26a18
AZ
3266/***********************************************************/
3267/* Bluetooth support */
3268static int nb_hcis;
3269static int cur_hci;
3270static struct HCIInfo *hci_table[MAX_NICS];
40ea94a5 3271#if 0
1ae26a18
AZ
3272static struct bt_vlan_s {
3273 struct bt_scatternet_s net;
3274 int id;
3275 struct bt_vlan_s *next;
3276} *first_bt_vlan;
3277
3278/* find or alloc a new bluetooth "VLAN" */
674bb261 3279static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
1ae26a18
AZ
3280{
3281 struct bt_vlan_s **pvlan, *vlan;
3282 for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
3283 if (vlan->id == id)
3284 return &vlan->net;
3285 }
3286 vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
3287 vlan->id = id;
3288 pvlan = &first_bt_vlan;
3289 while (*pvlan != NULL)
3290 pvlan = &(*pvlan)->next;
3291 *pvlan = vlan;
3292 return &vlan->net;
3293}
40ea94a5 3294#endif
1ae26a18
AZ
3295
3296static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
3297{
3298}
3299
3300static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
3301{
3302 return -ENOTSUP;
3303}
3304
3305static struct HCIInfo null_hci = {
3306 .cmd_send = null_hci_send,
3307 .sco_send = null_hci_send,
3308 .acl_send = null_hci_send,
3309 .bdaddr_set = null_hci_addr_set,
3310};
3311
3312struct HCIInfo *qemu_next_hci(void)
3313{
3314 if (cur_hci == nb_hcis)
3315 return &null_hci;
3316
3317 return hci_table[cur_hci++];
3318}
3319
3320/***********************************************************/
3321/* QEMU Block devices */
3322
609497ab 3323#define HD_ALIAS "index=%d,media=disk"
e4bcb14c
TS
3324#ifdef TARGET_PPC
3325#define CDROM_ALIAS "index=1,media=cdrom"
3326#else
3327#define CDROM_ALIAS "index=2,media=cdrom"
3328#endif
3329#define FD_ALIAS "index=%d,if=floppy"
609497ab
AZ
3330#define PFLASH_ALIAS "if=pflash"
3331#define MTD_ALIAS "if=mtd"
9d413d1d 3332#define SD_ALIAS "index=0,if=sd"
e4bcb14c 3333
609497ab 3334static int drive_add(const char *file, const char *fmt, ...)
e4bcb14c
TS
3335{
3336 va_list ap;
3337
3338 if (nb_drives_opt >= MAX_DRIVES) {
3339 fprintf(stderr, "qemu: too many drives\n");
3340 exit(1);
3341 }
3342
609497ab 3343 drives_opt[nb_drives_opt].file = file;
e4bcb14c 3344 va_start(ap, fmt);
609497ab
AZ
3345 vsnprintf(drives_opt[nb_drives_opt].opt,
3346 sizeof(drives_opt[0].opt), fmt, ap);
e4bcb14c
TS
3347 va_end(ap);
3348
3349 return nb_drives_opt++;
3350}
3351
f60d39bc 3352int drive_get_index(BlockInterfaceType type, int bus, int unit)
e4bcb14c
TS
3353{
3354 int index;
3355
3356 /* seek interface, bus and unit */
3357
3358 for (index = 0; index < nb_drives; index++)
f60d39bc 3359 if (drives_table[index].type == type &&
e4bcb14c
TS
3360 drives_table[index].bus == bus &&
3361 drives_table[index].unit == unit)
3362 return index;
3363
3364 return -1;
3365}
3366
f60d39bc 3367int drive_get_max_bus(BlockInterfaceType type)
e4bcb14c
TS
3368{
3369 int max_bus;
3370 int index;
3371
3372 max_bus = -1;
3373 for (index = 0; index < nb_drives; index++) {
f60d39bc 3374 if(drives_table[index].type == type &&
e4bcb14c
TS
3375 drives_table[index].bus > max_bus)
3376 max_bus = drives_table[index].bus;
3377 }
3378 return max_bus;
3379}
3380
a1620fac
AJ
3381static void bdrv_format_print(void *opaque, const char *name)
3382{
3383 fprintf(stderr, " %s", name);
3384}
3385
609497ab
AZ
3386static int drive_init(struct drive_opt *arg, int snapshot,
3387 QEMUMachine *machine)
e4bcb14c
TS
3388{
3389 char buf[128];
3390 char file[1024];
c8522bdf
AZ
3391 char devname[128];
3392 const char *mediastr = "";
f60d39bc 3393 BlockInterfaceType type;
e4bcb14c
TS
3394 enum { MEDIA_DISK, MEDIA_CDROM } media;
3395 int bus_id, unit_id;
3396 int cyls, heads, secs, translation;
3397 BlockDriverState *bdrv;
1e72d3b7 3398 BlockDriver *drv = NULL;
e4bcb14c
TS
3399 int max_devs;
3400 int index;
33f00271
AZ
3401 int cache;
3402 int bdrv_flags;
609497ab 3403 char *str = arg->opt;
7ccfb2eb
BS
3404 static const char * const params[] = { "bus", "unit", "if", "index",
3405 "cyls", "heads", "secs", "trans",
3406 "media", "snapshot", "file",
3407 "cache", "format", NULL };
e4bcb14c
TS
3408
3409 if (check_params(buf, sizeof(buf), params, str) < 0) {
ff993638 3410 fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
e4bcb14c
TS
3411 buf, str);
3412 return -1;
3413 }
3414
3415 file[0] = 0;
3416 cyls = heads = secs = 0;
3417 bus_id = 0;
3418 unit_id = -1;
3419 translation = BIOS_ATA_TRANSLATION_AUTO;
3420 index = -1;
33f00271 3421 cache = 1;
e4bcb14c 3422
c9b1ae2c 3423 if (machine->use_scsi) {
f60d39bc 3424 type = IF_SCSI;
e4bcb14c 3425 max_devs = MAX_SCSI_DEVS;
363a37d5 3426 pstrcpy(devname, sizeof(devname), "scsi");
e4bcb14c 3427 } else {
f60d39bc 3428 type = IF_IDE;
e4bcb14c 3429 max_devs = MAX_IDE_DEVS;
363a37d5 3430 pstrcpy(devname, sizeof(devname), "ide");
e4bcb14c
TS
3431 }
3432 media = MEDIA_DISK;
3433
3434 /* extract parameters */
3435
3436 if (get_param_value(buf, sizeof(buf), "bus", str)) {
3437 bus_id = strtol(buf, NULL, 0);
3438 if (bus_id < 0) {
3439 fprintf(stderr, "qemu: '%s' invalid bus id\n", str);
3440 return -1;
3441 }
3442 }
3443
3444 if (get_param_value(buf, sizeof(buf), "unit", str)) {
3445 unit_id = strtol(buf, NULL, 0);
3446 if (unit_id < 0) {
3447 fprintf(stderr, "qemu: '%s' invalid unit id\n", str);
3448 return -1;
3449 }
3450 }
3451
3452 if (get_param_value(buf, sizeof(buf), "if", str)) {
ae45d369 3453 pstrcpy(devname, sizeof(devname), buf);
e4bcb14c 3454 if (!strcmp(buf, "ide")) {
f60d39bc 3455 type = IF_IDE;
e4bcb14c
TS
3456 max_devs = MAX_IDE_DEVS;
3457 } else if (!strcmp(buf, "scsi")) {
f60d39bc 3458 type = IF_SCSI;
e4bcb14c
TS
3459 max_devs = MAX_SCSI_DEVS;
3460 } else if (!strcmp(buf, "floppy")) {
f60d39bc 3461 type = IF_FLOPPY;
e4bcb14c
TS
3462 max_devs = 0;
3463 } else if (!strcmp(buf, "pflash")) {
f60d39bc 3464 type = IF_PFLASH;
e4bcb14c
TS
3465 max_devs = 0;
3466 } else if (!strcmp(buf, "mtd")) {
f60d39bc 3467 type = IF_MTD;
e4bcb14c
TS
3468 max_devs = 0;
3469 } else if (!strcmp(buf, "sd")) {
f60d39bc 3470 type = IF_SD;
e4bcb14c
TS
3471 max_devs = 0;
3472 } else {
3473 fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
3474 return -1;
3475 }
3476 }
3477
3478 if (get_param_value(buf, sizeof(buf), "index", str)) {
3479 index = strtol(buf, NULL, 0);
3480 if (index < 0) {
3481 fprintf(stderr, "qemu: '%s' invalid index\n", str);
3482 return -1;
3483 }
3484 }
3485
3486 if (get_param_value(buf, sizeof(buf), "cyls", str)) {
3487 cyls = strtol(buf, NULL, 0);
3488 }
3489
3490 if (get_param_value(buf, sizeof(buf), "heads", str)) {
3491 heads = strtol(buf, NULL, 0);
3492 }
3493
3494 if (get_param_value(buf, sizeof(buf), "secs", str)) {
3495 secs = strtol(buf, NULL, 0);
3496 }
3497
3498 if (cyls || heads || secs) {
3499 if (cyls < 1 || cyls > 16383) {
3500 fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str);
3501 return -1;
3502 }
3503 if (heads < 1 || heads > 16) {
3504 fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str);
3505 return -1;
3506 }
3507 if (secs < 1 || secs > 63) {
3508 fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str);
3509 return -1;
3510 }
3511 }
3512
3513 if (get_param_value(buf, sizeof(buf), "trans", str)) {
3514 if (!cyls) {
3515 fprintf(stderr,
3516 "qemu: '%s' trans must be used with cyls,heads and secs\n",
3517 str);
3518 return -1;
3519 }
3520 if (!strcmp(buf, "none"))
3521 translation = BIOS_ATA_TRANSLATION_NONE;
3522 else if (!strcmp(buf, "lba"))
3523 translation = BIOS_ATA_TRANSLATION_LBA;
3524 else if (!strcmp(buf, "auto"))
3525 translation = BIOS_ATA_TRANSLATION_AUTO;
3526 else {
3527 fprintf(stderr, "qemu: '%s' invalid translation type\n", str);
3528 return -1;
3529 }
3530 }
3531
3532 if (get_param_value(buf, sizeof(buf), "media", str)) {
3533 if (!strcmp(buf, "disk")) {
3534 media = MEDIA_DISK;
3535 } else if (!strcmp(buf, "cdrom")) {
3536 if (cyls || secs || heads) {
3537 fprintf(stderr,
3538 "qemu: '%s' invalid physical CHS format\n", str);
3539 return -1;
3540 }
3541 media = MEDIA_CDROM;
3542 } else {
3543 fprintf(stderr, "qemu: '%s' invalid media\n", str);
3544 return -1;
3545 }
3546 }
3547
3548 if (get_param_value(buf, sizeof(buf), "snapshot", str)) {
3549 if (!strcmp(buf, "on"))
3550 snapshot = 1;
3551 else if (!strcmp(buf, "off"))
3552 snapshot = 0;
3553 else {
3554 fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str);
3555 return -1;
3556 }
3557 }
3558
33f00271 3559 if (get_param_value(buf, sizeof(buf), "cache", str)) {
9f7965c7 3560 if (!strcmp(buf, "off") || !strcmp(buf, "none"))
33f00271 3561 cache = 0;
9f7965c7 3562 else if (!strcmp(buf, "writethrough"))
33f00271 3563 cache = 1;
9f7965c7
AL
3564 else if (!strcmp(buf, "writeback"))
3565 cache = 2;
33f00271
AZ
3566 else {
3567 fprintf(stderr, "qemu: invalid cache option\n");
3568 return -1;
3569 }
3570 }
3571
1e72d3b7 3572 if (get_param_value(buf, sizeof(buf), "format", str)) {
a1620fac
AJ
3573 if (strcmp(buf, "?") == 0) {
3574 fprintf(stderr, "qemu: Supported formats:");
3575 bdrv_iterate_format(bdrv_format_print, NULL);
3576 fprintf(stderr, "\n");
3577 return -1;
3578 }
1e72d3b7
AJ
3579 drv = bdrv_find_format(buf);
3580 if (!drv) {
3581 fprintf(stderr, "qemu: '%s' invalid format\n", buf);
3582 return -1;
3583 }
3584 }
3585
609497ab
AZ
3586 if (arg->file == NULL)
3587 get_param_value(file, sizeof(file), "file", str);
3588 else
3589 pstrcpy(file, sizeof(file), arg->file);
e4bcb14c
TS
3590
3591 /* compute bus and unit according index */
3592
3593 if (index != -1) {
3594 if (bus_id != 0 || unit_id != -1) {
3595 fprintf(stderr,
3596 "qemu: '%s' index cannot be used with bus and unit\n", str);
3597 return -1;
3598 }
3599 if (max_devs == 0)
3600 {
3601 unit_id = index;
3602 bus_id = 0;
3603 } else {
3604 unit_id = index % max_devs;
3605 bus_id = index / max_devs;
3606 }
3607 }
3608
3609 /* if user doesn't specify a unit_id,
3610 * try to find the first free
3611 */
3612
3613 if (unit_id == -1) {
3614 unit_id = 0;
f60d39bc 3615 while (drive_get_index(type, bus_id, unit_id) != -1) {
e4bcb14c
TS
3616 unit_id++;
3617 if (max_devs && unit_id >= max_devs) {
3618 unit_id -= max_devs;
3619 bus_id++;
3620 }
3621 }
3622 }
3623
3624 /* check unit id */
3625
3626 if (max_devs && unit_id >= max_devs) {
3627 fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n",
3628 str, unit_id, max_devs - 1);
3629 return -1;
3630 }
3631
3632 /*
3633 * ignore multiple definitions
3634 */
3635
f60d39bc 3636 if (drive_get_index(type, bus_id, unit_id) != -1)
e4bcb14c
TS
3637 return 0;
3638
3639 /* init */
3640
f60d39bc 3641 if (type == IF_IDE || type == IF_SCSI)
c8522bdf 3642 mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
e6198a70
AZ
3643 if (max_devs)
3644 snprintf(buf, sizeof(buf), "%s%i%s%i",
3645 devname, bus_id, mediastr, unit_id);
3646 else
3647 snprintf(buf, sizeof(buf), "%s%s%i",
3648 devname, mediastr, unit_id);
e4bcb14c
TS
3649 bdrv = bdrv_new(buf);
3650 drives_table[nb_drives].bdrv = bdrv;
f60d39bc 3651 drives_table[nb_drives].type = type;
e4bcb14c
TS
3652 drives_table[nb_drives].bus = bus_id;
3653 drives_table[nb_drives].unit = unit_id;
3654 nb_drives++;
3655
f60d39bc 3656 switch(type) {
e4bcb14c
TS
3657 case IF_IDE:
3658 case IF_SCSI:
3659 switch(media) {
3660 case MEDIA_DISK:
3661 if (cyls != 0) {
3662 bdrv_set_geometry_hint(bdrv, cyls, heads, secs);
3663 bdrv_set_translation_hint(bdrv, translation);
3664 }
3665 break;
3666 case MEDIA_CDROM:
3667 bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
3668 break;
3669 }
3670 break;
3671 case IF_SD:
3672 /* FIXME: This isn't really a floppy, but it's a reasonable
3673 approximation. */
3674 case IF_FLOPPY:
3675 bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY);
3676 break;
3677 case IF_PFLASH:
3678 case IF_MTD:
3679 break;
3680 }
3681 if (!file[0])
3682 return 0;
33f00271 3683 bdrv_flags = 0;
9f7965c7 3684 if (snapshot) {
33f00271 3685 bdrv_flags |= BDRV_O_SNAPSHOT;
9f7965c7
AL
3686 cache = 2; /* always use write-back with snapshot */
3687 }
3688 if (cache == 0) /* no caching */
3689 bdrv_flags |= BDRV_O_NOCACHE;
3690 else if (cache == 2) /* write-back */
3691 bdrv_flags |= BDRV_O_CACHE_WB;
83ab7950 3692 if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0 || qemu_key_check(bdrv, file)) {
e4bcb14c
TS
3693 fprintf(stderr, "qemu: could not open disk image %s\n",
3694 file);
3695 return -1;
3696 }
3697 return 0;
3698}
3699
a594cfbf
FB
3700/***********************************************************/
3701/* USB devices */
3702
0d92ed30
PB
3703static USBPort *used_usb_ports;
3704static USBPort *free_usb_ports;
3705
3706/* ??? Maybe change this to register a hub to keep track of the topology. */
3707void qemu_register_usb_port(USBPort *port, void *opaque, int index,
3708 usb_attachfn attach)
3709{
3710 port->opaque = opaque;
3711 port->index = index;
3712 port->attach = attach;
3713 port->next = free_usb_ports;
3714 free_usb_ports = port;
3715}
3716
4b096fc9
AL
3717int usb_device_add_dev(USBDevice *dev)
3718{
3719 USBPort *port;
3720
3721 /* Find a USB port to add the device to. */
3722 port = free_usb_ports;
3723 if (!port->next) {
3724 USBDevice *hub;
3725
3726 /* Create a new hub and chain it on. */
3727 free_usb_ports = NULL;
3728 port->next = used_usb_ports;
3729 used_usb_ports = port;
3730
3731 hub = usb_hub_init(VM_USB_HUB_SIZE);
3732 usb_attach(port, hub);
3733 port = free_usb_ports;
3734 }
3735
3736 free_usb_ports = port->next;
3737 port->next = used_usb_ports;
3738 used_usb_ports = port;
3739 usb_attach(port, dev);
3740 return 0;
3741}
3742
a594cfbf
FB
3743static int usb_device_add(const char *devname)
3744{
3745 const char *p;
3746 USBDevice *dev;
a594cfbf 3747
0d92ed30 3748 if (!free_usb_ports)
a594cfbf
FB
3749 return -1;
3750
3751 if (strstart(devname, "host:", &p)) {
3752 dev = usb_host_device_open(p);
a594cfbf
FB
3753 } else if (!strcmp(devname, "mouse")) {
3754 dev = usb_mouse_init();
09b26c5e 3755 } else if (!strcmp(devname, "tablet")) {
47b2d338
AZ
3756 dev = usb_tablet_init();
3757 } else if (!strcmp(devname, "keyboard")) {
3758 dev = usb_keyboard_init();
2e5d83bb
PB
3759 } else if (strstart(devname, "disk:", &p)) {
3760 dev = usb_msd_init(p);
f6d2a316
AZ
3761 } else if (!strcmp(devname, "wacom-tablet")) {
3762 dev = usb_wacom_init();
a7954218
AZ
3763 } else if (strstart(devname, "serial:", &p)) {
3764 dev = usb_serial_init(p);
2e4d9fb1
AJ
3765#ifdef CONFIG_BRLAPI
3766 } else if (!strcmp(devname, "braille")) {
3767 dev = usb_baum_init();
3768#endif
6c9f886c 3769 } else if (strstart(devname, "net:", &p)) {
9ad97e65 3770 int nic = nb_nics;
6c9f886c 3771
9ad97e65 3772 if (net_client_init("nic", p) < 0)
6c9f886c 3773 return -1;
9ad97e65
AZ
3774 nd_table[nic].model = "usb";
3775 dev = usb_net_init(&nd_table[nic]);
a594cfbf
FB
3776 } else {
3777 return -1;
3778 }
0d92ed30
PB
3779 if (!dev)
3780 return -1;
3781
4b096fc9 3782 return usb_device_add_dev(dev);
a594cfbf
FB
3783}
3784
1f3870ab 3785int usb_device_del_addr(int bus_num, int addr)
a594cfbf 3786{
0d92ed30
PB
3787 USBPort *port;
3788 USBPort **lastp;
059809e4 3789 USBDevice *dev;
a594cfbf 3790
0d92ed30 3791 if (!used_usb_ports)
a594cfbf
FB
3792 return -1;
3793
a594cfbf
FB
3794 if (bus_num != 0)
3795 return -1;
0d92ed30
PB
3796
3797 lastp = &used_usb_ports;
3798 port = used_usb_ports;
3799 while (port && port->dev->addr != addr) {
3800 lastp = &port->next;
3801 port = port->next;
a594cfbf 3802 }
0d92ed30
PB
3803
3804 if (!port)
a594cfbf 3805 return -1;
0d92ed30 3806
059809e4 3807 dev = port->dev;
0d92ed30
PB
3808 *lastp = port->next;
3809 usb_attach(port, NULL);
059809e4 3810 dev->handle_destroy(dev);
0d92ed30
PB
3811 port->next = free_usb_ports;
3812 free_usb_ports = port;
a594cfbf
FB
3813 return 0;
3814}
3815
1f3870ab
AL
3816static int usb_device_del(const char *devname)
3817{
3818 int bus_num, addr;
3819 const char *p;
3820
5d0c5750
AL
3821 if (strstart(devname, "host:", &p))
3822 return usb_host_device_close(p);
3823
1f3870ab
AL
3824 if (!used_usb_ports)
3825 return -1;
3826
3827 p = strchr(devname, '.');
3828 if (!p)
3829 return -1;
3830 bus_num = strtoul(devname, NULL, 0);
3831 addr = strtoul(p + 1, NULL, 0);
3832
3833 return usb_device_del_addr(bus_num, addr);
3834}
3835
a594cfbf
FB
3836void do_usb_add(const char *devname)
3837{
4b096fc9 3838 usb_device_add(devname);
a594cfbf
FB
3839}
3840
3841void do_usb_del(const char *devname)
3842{
4b096fc9 3843 usb_device_del(devname);
a594cfbf
FB
3844}
3845
3846void usb_info(void)
3847{
3848 USBDevice *dev;
0d92ed30 3849 USBPort *port;
a594cfbf
FB
3850 const char *speed_str;
3851
0d92ed30 3852 if (!usb_enabled) {
a594cfbf
FB
3853 term_printf("USB support not enabled\n");
3854 return;
3855 }
3856
0d92ed30
PB
3857 for (port = used_usb_ports; port; port = port->next) {
3858 dev = port->dev;
3859 if (!dev)
3860 continue;
3861 switch(dev->speed) {
5fafdf24
TS
3862 case USB_SPEED_LOW:
3863 speed_str = "1.5";
0d92ed30 3864 break;
5fafdf24
TS
3865 case USB_SPEED_FULL:
3866 speed_str = "12";
0d92ed30 3867 break;
5fafdf24
TS
3868 case USB_SPEED_HIGH:
3869 speed_str = "480";
0d92ed30
PB
3870 break;
3871 default:
5fafdf24 3872 speed_str = "?";
0d92ed30 3873 break;
a594cfbf 3874 }
5fafdf24 3875 term_printf(" Device %d.%d, Speed %s Mb/s, Product %s\n",
1f6e24e7 3876 0, dev->addr, speed_str, dev->devname);
a594cfbf
FB
3877 }
3878}
3879
201a51fc
AZ
3880/***********************************************************/
3881/* PCMCIA/Cardbus */
3882
3883static struct pcmcia_socket_entry_s {
3884 struct pcmcia_socket_s *socket;
3885 struct pcmcia_socket_entry_s *next;
3886} *pcmcia_sockets = 0;
3887
3888void pcmcia_socket_register(struct pcmcia_socket_s *socket)
3889{
3890 struct pcmcia_socket_entry_s *entry;
3891
3892 entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
3893 entry->socket = socket;
3894 entry->next = pcmcia_sockets;
3895 pcmcia_sockets = entry;
3896}
3897
3898void pcmcia_socket_unregister(struct pcmcia_socket_s *socket)
3899{
3900 struct pcmcia_socket_entry_s *entry, **ptr;
3901
3902 ptr = &pcmcia_sockets;
3903 for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
3904 if (entry->socket == socket) {
3905 *ptr = entry->next;
3906 qemu_free(entry);
3907 }
3908}
3909
3910void pcmcia_info(void)
3911{
3912 struct pcmcia_socket_entry_s *iter;
3913 if (!pcmcia_sockets)
3914 term_printf("No PCMCIA sockets\n");
3915
3916 for (iter = pcmcia_sockets; iter; iter = iter->next)
3917 term_printf("%s: %s\n", iter->socket->slot_string,
3918 iter->socket->attached ? iter->socket->card_string :
3919 "Empty");
3920}
3921
2ff89790
TS
3922/***********************************************************/
3923/* dumb display */
3924
3925static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
3926{
3927}
3928
3929static void dumb_resize(DisplayState *ds, int w, int h)
3930{
3931}
3932
3933static void dumb_refresh(DisplayState *ds)
3934{
3935#if defined(CONFIG_SDL)
3936 vga_hw_update();
3937#endif
3938}
3939
3940static void dumb_display_init(DisplayState *ds)
3941{
3942 ds->data = NULL;
3943 ds->linesize = 0;
3944 ds->depth = 0;
3945 ds->dpy_update = dumb_update;
3946 ds->dpy_resize = dumb_resize;
3947 ds->dpy_refresh = dumb_refresh;
bcfad70f
AL
3948 ds->gui_timer_interval = 500;
3949 ds->idle = 1;
2ff89790
TS
3950}
3951
8a7ddc38
FB
3952/***********************************************************/
3953/* I/O handling */
0824d6fc 3954
c4b1fcc0
FB
3955#define MAX_IO_HANDLERS 64
3956
3957typedef struct IOHandlerRecord {
3958 int fd;
7c9d8e07
FB
3959 IOCanRWHandler *fd_read_poll;
3960 IOHandler *fd_read;
3961 IOHandler *fd_write;
cafffd40 3962 int deleted;
c4b1fcc0
FB
3963 void *opaque;
3964 /* temporary data */
3965 struct pollfd *ufd;
8a7ddc38 3966 struct IOHandlerRecord *next;
c4b1fcc0
FB
3967} IOHandlerRecord;
3968
8a7ddc38 3969static IOHandlerRecord *first_io_handler;
c4b1fcc0 3970
7c9d8e07
FB
3971/* XXX: fd_read_poll should be suppressed, but an API change is
3972 necessary in the character devices to suppress fd_can_read(). */
5fafdf24
TS
3973int qemu_set_fd_handler2(int fd,
3974 IOCanRWHandler *fd_read_poll,
3975 IOHandler *fd_read,
3976 IOHandler *fd_write,
7c9d8e07 3977 void *opaque)
c4b1fcc0 3978{
7c9d8e07 3979 IOHandlerRecord **pioh, *ioh;
c4b1fcc0 3980
7c9d8e07
FB
3981 if (!fd_read && !fd_write) {
3982 pioh = &first_io_handler;
3983 for(;;) {
3984 ioh = *pioh;
3985 if (ioh == NULL)
3986 break;
3987 if (ioh->fd == fd) {
cafffd40 3988 ioh->deleted = 1;
7c9d8e07
FB
3989 break;
3990 }
3991 pioh = &ioh->next;
3992 }
3993 } else {
3994 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3995 if (ioh->fd == fd)
3996 goto found;
3997 }
3998 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
3999 if (!ioh)
4000 return -1;
4001 ioh->next = first_io_handler;
4002 first_io_handler = ioh;
4003 found:
4004 ioh->fd = fd;
4005 ioh->fd_read_poll = fd_read_poll;
4006 ioh->fd_read = fd_read;
4007 ioh->fd_write = fd_write;
4008 ioh->opaque = opaque;
cafffd40 4009 ioh->deleted = 0;
7c9d8e07 4010 }
c4b1fcc0
FB
4011 return 0;
4012}
4013
5fafdf24
TS
4014int qemu_set_fd_handler(int fd,
4015 IOHandler *fd_read,
4016 IOHandler *fd_write,
7c9d8e07 4017 void *opaque)
8a7ddc38 4018{
7c9d8e07 4019 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
8a7ddc38
FB
4020}
4021
56f3a5d0 4022#ifdef _WIN32
f331110f
FB
4023/***********************************************************/
4024/* Polling handling */
4025
4026typedef struct PollingEntry {
4027 PollingFunc *func;
4028 void *opaque;
4029 struct PollingEntry *next;
4030} PollingEntry;
4031
4032static PollingEntry *first_polling_entry;
4033
4034int qemu_add_polling_cb(PollingFunc *func, void *opaque)
4035{
4036 PollingEntry **ppe, *pe;
4037 pe = qemu_mallocz(sizeof(PollingEntry));
4038 if (!pe)
4039 return -1;
4040 pe->func = func;
4041 pe->opaque = opaque;
4042 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
4043 *ppe = pe;
4044 return 0;
4045}
4046
4047void qemu_del_polling_cb(PollingFunc *func, void *opaque)
4048{
4049 PollingEntry **ppe, *pe;
4050 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
4051 pe = *ppe;
4052 if (pe->func == func && pe->opaque == opaque) {
4053 *ppe = pe->next;
4054 qemu_free(pe);
4055 break;
4056 }
4057 }
4058}
4059
a18e524a
FB
4060/***********************************************************/
4061/* Wait objects support */
4062typedef struct WaitObjects {
4063 int num;
4064 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
4065 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
4066 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
4067} WaitObjects;
4068
4069static WaitObjects wait_objects = {0};
3b46e624 4070
a18e524a
FB
4071int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
4072{
4073 WaitObjects *w = &wait_objects;
4074
4075 if (w->num >= MAXIMUM_WAIT_OBJECTS)
4076 return -1;
4077 w->events[w->num] = handle;
4078 w->func[w->num] = func;
4079 w->opaque[w->num] = opaque;
4080 w->num++;
4081 return 0;
4082}
4083
4084void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
4085{
4086 int i, found;
4087 WaitObjects *w = &wait_objects;
4088
4089 found = 0;
4090 for (i = 0; i < w->num; i++) {
4091 if (w->events[i] == handle)
4092 found = 1;
4093 if (found) {
4094 w->events[i] = w->events[i + 1];
4095 w->func[i] = w->func[i + 1];
4096 w->opaque[i] = w->opaque[i + 1];
3b46e624 4097 }
a18e524a
FB
4098 }
4099 if (found)
4100 w->num--;
4101}
4102#endif
4103
210f41ba
AL
4104#define SELF_ANNOUNCE_ROUNDS 5
4105#define ETH_P_EXPERIMENTAL 0x01F1 /* just a number */
4106//#define ETH_P_EXPERIMENTAL 0x0012 /* make it the size of the packet */
4107#define EXPERIMENTAL_MAGIC 0xf1f23f4f
4108
4109static int announce_self_create(uint8_t *buf,
4110 uint8_t *mac_addr)
4111{
4112 uint32_t magic = EXPERIMENTAL_MAGIC;
4113 uint16_t proto = htons(ETH_P_EXPERIMENTAL);
4114
4115 /* FIXME: should we send a different packet (arp/rarp/ping)? */
4116
4117 memset(buf, 0xff, 6); /* h_dst */
4118 memcpy(buf + 6, mac_addr, 6); /* h_src */
4119 memcpy(buf + 12, &proto, 2); /* h_proto */
4120 memcpy(buf + 14, &magic, 4); /* magic */
4121
4122 return 18; /* len */
4123}
4124
4125void qemu_announce_self(void)
4126{
4127 int i, j, len;
4128 VLANState *vlan;
4129 VLANClientState *vc;
4130 uint8_t buf[256];
4131
4132 for (i = 0; i < nb_nics; i++) {
4133 len = announce_self_create(buf, nd_table[i].macaddr);
4134 vlan = nd_table[i].vlan;
4135 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
17e90973
AL
4136 for (j=0; j < SELF_ANNOUNCE_ROUNDS; j++)
4137 vc->fd_read(vc->opaque, buf, len);
210f41ba
AL
4138 }
4139 }
4140}
4141
8a7ddc38
FB
4142/***********************************************************/
4143/* savevm/loadvm support */
4144
faea38e7
FB
4145#define IO_BUF_SIZE 32768
4146
4147struct QEMUFile {
5dafc53f
AL
4148 QEMUFilePutBufferFunc *put_buffer;
4149 QEMUFileGetBufferFunc *get_buffer;
4150 QEMUFileCloseFunc *close;
4151 QEMUFileRateLimit *rate_limit;
4152 void *opaque;
871d2f07 4153 int is_write;
5dafc53f 4154
faea38e7
FB
4155 int64_t buf_offset; /* start of buffer when writing, end of buffer
4156 when reading */
4157 int buf_index;
4158 int buf_size; /* 0 when writing */
4159 uint8_t buf[IO_BUF_SIZE];
871d2f07
AL
4160
4161 int has_error;
faea38e7
FB
4162};
4163
c1d36665 4164typedef struct QEMUFileSocket
5dafc53f
AL
4165{
4166 int fd;
4167 QEMUFile *file;
c1d36665 4168} QEMUFileSocket;
5dafc53f 4169
c1d36665 4170static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
5dafc53f 4171{
c1d36665 4172 QEMUFileSocket *s = opaque;
5dafc53f
AL
4173 ssize_t len;
4174
4175 do {
c1d36665
AL
4176 len = recv(s->fd, buf, size, 0);
4177 } while (len == -1 && socket_error() == EINTR);
5dafc53f
AL
4178
4179 if (len == -1)
c1d36665 4180 len = -socket_error();
5dafc53f
AL
4181
4182 return len;
4183}
4184
c1d36665 4185static int socket_close(void *opaque)
5dafc53f 4186{
c1d36665 4187 QEMUFileSocket *s = opaque;
5dafc53f
AL
4188 qemu_free(s);
4189 return 0;
4190}
4191
c1d36665 4192QEMUFile *qemu_fopen_socket(int fd)
5dafc53f 4193{
c1d36665 4194 QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
5dafc53f
AL
4195
4196 if (s == NULL)
4197 return NULL;
4198
4199 s->fd = fd;
c1d36665 4200 s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL);
5dafc53f
AL
4201 return s->file;
4202}
4203
4204typedef struct QEMUFileStdio
4205{
4206 FILE *outfile;
4207} QEMUFileStdio;
4208
871d2f07 4209static int file_put_buffer(void *opaque, const uint8_t *buf,
5dafc53f
AL
4210 int64_t pos, int size)
4211{
4212 QEMUFileStdio *s = opaque;
4213 fseek(s->outfile, pos, SEEK_SET);
4214 fwrite(buf, 1, size, s->outfile);
871d2f07 4215 return size;
5dafc53f
AL
4216}
4217
4218static int file_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
4219{
4220 QEMUFileStdio *s = opaque;
4221 fseek(s->outfile, pos, SEEK_SET);
4222 return fread(buf, 1, size, s->outfile);
4223}
4224
4225static int file_close(void *opaque)
4226{
4227 QEMUFileStdio *s = opaque;
4228 fclose(s->outfile);
4229 qemu_free(s);
4230 return 0;
4231}
4232
faea38e7
FB
4233QEMUFile *qemu_fopen(const char *filename, const char *mode)
4234{
5dafc53f 4235 QEMUFileStdio *s;
faea38e7 4236
5dafc53f
AL
4237 s = qemu_mallocz(sizeof(QEMUFileStdio));
4238 if (!s)
faea38e7 4239 return NULL;
5dafc53f
AL
4240
4241 s->outfile = fopen(filename, mode);
4242 if (!s->outfile)
faea38e7 4243 goto fail;
5dafc53f
AL
4244
4245 if (!strcmp(mode, "wb"))
4246 return qemu_fopen_ops(s, file_put_buffer, NULL, file_close, NULL);
4247 else if (!strcmp(mode, "rb"))
4248 return qemu_fopen_ops(s, NULL, file_get_buffer, file_close, NULL);
4249
4250fail:
4251 if (s->outfile)
4252 fclose(s->outfile);
4253 qemu_free(s);
faea38e7
FB
4254 return NULL;
4255}
4256
5dafc53f
AL
4257typedef struct QEMUFileBdrv
4258{
4259 BlockDriverState *bs;
4260 int64_t base_offset;
4261} QEMUFileBdrv;
4262
871d2f07
AL
4263static int bdrv_put_buffer(void *opaque, const uint8_t *buf,
4264 int64_t pos, int size)
5dafc53f
AL
4265{
4266 QEMUFileBdrv *s = opaque;
4267 bdrv_pwrite(s->bs, s->base_offset + pos, buf, size);
871d2f07 4268 return size;
5dafc53f
AL
4269}
4270
4271static int bdrv_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
4272{
4273 QEMUFileBdrv *s = opaque;
4274 return bdrv_pread(s->bs, s->base_offset + pos, buf, size);
4275}
4276
4277static int bdrv_fclose(void *opaque)
4278{
4279 QEMUFileBdrv *s = opaque;
4280 qemu_free(s);
4281 return 0;
4282}
4283
674bb261 4284static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable)
5dafc53f
AL
4285{
4286 QEMUFileBdrv *s;
4287
4288 s = qemu_mallocz(sizeof(QEMUFileBdrv));
4289 if (!s)
4290 return NULL;
4291
4292 s->bs = bs;
4293 s->base_offset = offset;
4294
4295 if (is_writable)
4296 return qemu_fopen_ops(s, bdrv_put_buffer, NULL, bdrv_fclose, NULL);
4297
4298 return qemu_fopen_ops(s, NULL, bdrv_get_buffer, bdrv_fclose, NULL);
4299}
4300
4301QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
4302 QEMUFileGetBufferFunc *get_buffer,
4303 QEMUFileCloseFunc *close,
4304 QEMUFileRateLimit *rate_limit)
faea38e7
FB
4305{
4306 QEMUFile *f;
4307
4308 f = qemu_mallocz(sizeof(QEMUFile));
4309 if (!f)
4310 return NULL;
5dafc53f
AL
4311
4312 f->opaque = opaque;
4313 f->put_buffer = put_buffer;
4314 f->get_buffer = get_buffer;
4315 f->close = close;
4316 f->rate_limit = rate_limit;
871d2f07 4317 f->is_write = 0;
5dafc53f 4318
faea38e7
FB
4319 return f;
4320}
4321
871d2f07
AL
4322int qemu_file_has_error(QEMUFile *f)
4323{
4324 return f->has_error;
4325}
4326
faea38e7
FB
4327void qemu_fflush(QEMUFile *f)
4328{
5dafc53f 4329 if (!f->put_buffer)
faea38e7 4330 return;
5dafc53f 4331
871d2f07
AL
4332 if (f->is_write && f->buf_index > 0) {
4333 int len;
4334
4335 len = f->put_buffer(f->opaque, f->buf, f->buf_offset, f->buf_index);
4336 if (len > 0)
4337 f->buf_offset += f->buf_index;
4338 else
4339 f->has_error = 1;
faea38e7
FB
4340 f->buf_index = 0;
4341 }
4342}
4343
4344static void qemu_fill_buffer(QEMUFile *f)
4345{
4346 int len;
4347
5dafc53f 4348 if (!f->get_buffer)
faea38e7 4349 return;
5dafc53f 4350
871d2f07
AL
4351 if (f->is_write)
4352 abort();
5dafc53f 4353
871d2f07
AL
4354 len = f->get_buffer(f->opaque, f->buf, f->buf_offset, IO_BUF_SIZE);
4355 if (len > 0) {
4356 f->buf_index = 0;
4357 f->buf_size = len;
4358 f->buf_offset += len;
4359 } else if (len != -EAGAIN)
4360 f->has_error = 1;
faea38e7
FB
4361}
4362
5dafc53f 4363int qemu_fclose(QEMUFile *f)
faea38e7 4364{
5dafc53f
AL
4365 int ret = 0;
4366 qemu_fflush(f);
4367 if (f->close)
4368 ret = f->close(f->opaque);
faea38e7 4369 qemu_free(f);
5dafc53f
AL
4370 return ret;
4371}
4372
4373void qemu_file_put_notify(QEMUFile *f)
4374{
4375 f->put_buffer(f->opaque, NULL, 0, 0);
faea38e7
FB
4376}
4377
2ca83a8d 4378void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
b4608c04 4379{
2ca83a8d 4380 int l;
871d2f07
AL
4381
4382 if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
4383 fprintf(stderr,
4384 "Attempted to write to buffer while read buffer is not empty\n");
4385 abort();
4386 }
4387
4388 while (!f->has_error && size > 0) {
faea38e7
FB
4389 l = IO_BUF_SIZE - f->buf_index;
4390 if (l > size)
4391 l = size;
4392 memcpy(f->buf + f->buf_index, buf, l);
871d2f07 4393 f->is_write = 1;
faea38e7
FB
4394 f->buf_index += l;
4395 buf += l;
4396 size -= l;
4397 if (f->buf_index >= IO_BUF_SIZE)
4398 qemu_fflush(f);
4399 }
b4608c04
FB
4400}
4401
2ca83a8d 4402void qemu_put_byte(QEMUFile *f, int v)
b4608c04 4403{
871d2f07
AL
4404 if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
4405 fprintf(stderr,
4406 "Attempted to write to buffer while read buffer is not empty\n");
4407 abort();
4408 }
4409
faea38e7 4410 f->buf[f->buf_index++] = v;
871d2f07 4411 f->is_write = 1;
faea38e7
FB
4412 if (f->buf_index >= IO_BUF_SIZE)
4413 qemu_fflush(f);
4414}
4415
2ca83a8d 4416int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
faea38e7 4417{
2ca83a8d 4418 int size, l;
faea38e7 4419
871d2f07
AL
4420 if (f->is_write)
4421 abort();
4422
faea38e7
FB
4423 size = size1;
4424 while (size > 0) {
4425 l = f->buf_size - f->buf_index;
4426 if (l == 0) {
4427 qemu_fill_buffer(f);
4428 l = f->buf_size - f->buf_index;
4429 if (l == 0)
4430 break;
4431 }
4432 if (l > size)
4433 l = size;
4434 memcpy(buf, f->buf + f->buf_index, l);
4435 f->buf_index += l;
4436 buf += l;
4437 size -= l;
4438 }
4439 return size1 - size;
4440}
4441
2ca83a8d 4442int qemu_get_byte(QEMUFile *f)
faea38e7 4443{
871d2f07
AL
4444 if (f->is_write)
4445 abort();
4446
faea38e7
FB
4447 if (f->buf_index >= f->buf_size) {
4448 qemu_fill_buffer(f);
4449 if (f->buf_index >= f->buf_size)
4450 return 0;
4451 }
4452 return f->buf[f->buf_index++];
4453}
4454
4455int64_t qemu_ftell(QEMUFile *f)
4456{
4457 return f->buf_offset - f->buf_size + f->buf_index;
4458}
4459
4460int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
4461{
4462 if (whence == SEEK_SET) {
4463 /* nothing to do */
4464 } else if (whence == SEEK_CUR) {
4465 pos += qemu_ftell(f);
4466 } else {
4467 /* SEEK_END not supported */
4468 return -1;
4469 }
5dafc53f 4470 if (f->put_buffer) {
faea38e7
FB
4471 qemu_fflush(f);
4472 f->buf_offset = pos;
4473 } else {
4474 f->buf_offset = pos;
4475 f->buf_index = 0;
4476 f->buf_size = 0;
4477 }
4478 return pos;
8a7ddc38
FB
4479}
4480
5dafc53f
AL
4481int qemu_file_rate_limit(QEMUFile *f)
4482{
4483 if (f->rate_limit)
4484 return f->rate_limit(f->opaque);
4485
4486 return 0;
4487}
4488
2ca83a8d 4489void qemu_put_be16(QEMUFile *f, unsigned int v)
8a7ddc38
FB
4490{
4491 qemu_put_byte(f, v >> 8);
4492 qemu_put_byte(f, v);
4493}
4494
2ca83a8d 4495void qemu_put_be32(QEMUFile *f, unsigned int v)
8a7ddc38
FB
4496{
4497 qemu_put_byte(f, v >> 24);
4498 qemu_put_byte(f, v >> 16);
4499 qemu_put_byte(f, v >> 8);
4500 qemu_put_byte(f, v);
4501}
4502
4503void qemu_put_be64(QEMUFile *f, uint64_t v)
4504{
4505 qemu_put_be32(f, v >> 32);
4506 qemu_put_be32(f, v);
4507}
4508
2ca83a8d 4509unsigned int qemu_get_be16(QEMUFile *f)
8a7ddc38 4510{
2ca83a8d 4511 unsigned int v;
8a7ddc38
FB
4512 v = qemu_get_byte(f) << 8;
4513 v |= qemu_get_byte(f);
4514 return v;
4515}
4516
2ca83a8d 4517unsigned int qemu_get_be32(QEMUFile *f)
8a7ddc38 4518{
2ca83a8d 4519 unsigned int v;
8a7ddc38
FB
4520 v = qemu_get_byte(f) << 24;
4521 v |= qemu_get_byte(f) << 16;
4522 v |= qemu_get_byte(f) << 8;
4523 v |= qemu_get_byte(f);
4524 return v;
4525}
4526
4527uint64_t qemu_get_be64(QEMUFile *f)
4528{
4529 uint64_t v;
4530 v = (uint64_t)qemu_get_be32(f) << 32;
4531 v |= qemu_get_be32(f);
4532 return v;
4533}
4534
8a7ddc38
FB
4535typedef struct SaveStateEntry {
4536 char idstr[256];
4537 int instance_id;
4538 int version_id;
9366f418
AL
4539 int section_id;
4540 SaveLiveStateHandler *save_live_state;
8a7ddc38
FB
4541 SaveStateHandler *save_state;
4542 LoadStateHandler *load_state;
4543 void *opaque;
4544 struct SaveStateEntry *next;
4545} SaveStateEntry;
b4608c04 4546
8a7ddc38
FB
4547static SaveStateEntry *first_se;
4548
18be5187 4549/* TODO: Individual devices generally have very little idea about the rest
18fdb1c5
TS
4550 of the system, so instance_id should be removed/replaced.
4551 Meanwhile pass -1 as instance_id if you do not already have a clearly
4552 distinguishing id for all instances of your device class. */
9366f418
AL
4553int register_savevm_live(const char *idstr,
4554 int instance_id,
4555 int version_id,
4556 SaveLiveStateHandler *save_live_state,
4557 SaveStateHandler *save_state,
4558 LoadStateHandler *load_state,
4559 void *opaque)
8a7ddc38
FB
4560{
4561 SaveStateEntry *se, **pse;
9366f418 4562 static int global_section_id;
8a7ddc38
FB
4563
4564 se = qemu_malloc(sizeof(SaveStateEntry));
4565 if (!se)
4566 return -1;
4567 pstrcpy(se->idstr, sizeof(se->idstr), idstr);
18be5187 4568 se->instance_id = (instance_id == -1) ? 0 : instance_id;
8a7ddc38 4569 se->version_id = version_id;
9366f418
AL
4570 se->section_id = global_section_id++;
4571 se->save_live_state = save_live_state;
8a7ddc38
FB
4572 se->save_state = save_state;
4573 se->load_state = load_state;
4574 se->opaque = opaque;
4575 se->next = NULL;
4576
4577 /* add at the end of list */
4578 pse = &first_se;
18be5187
PB
4579 while (*pse != NULL) {
4580 if (instance_id == -1
4581 && strcmp(se->idstr, (*pse)->idstr) == 0
4582 && se->instance_id <= (*pse)->instance_id)
4583 se->instance_id = (*pse)->instance_id + 1;
8a7ddc38 4584 pse = &(*pse)->next;
18be5187 4585 }
8a7ddc38
FB
4586 *pse = se;
4587 return 0;
4588}
4589
9366f418
AL
4590int register_savevm(const char *idstr,
4591 int instance_id,
4592 int version_id,
4593 SaveStateHandler *save_state,
4594 LoadStateHandler *load_state,
4595 void *opaque)
4596{
4597 return register_savevm_live(idstr, instance_id, version_id,
4598 NULL, save_state, load_state, opaque);
4599}
4600
4601#define QEMU_VM_FILE_MAGIC 0x5145564d
4602#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002
4603#define QEMU_VM_FILE_VERSION 0x00000003
4604
4605#define QEMU_VM_EOF 0x00
4606#define QEMU_VM_SECTION_START 0x01
4607#define QEMU_VM_SECTION_PART 0x02
4608#define QEMU_VM_SECTION_END 0x03
4609#define QEMU_VM_SECTION_FULL 0x04
8a7ddc38 4610
9366f418 4611int qemu_savevm_state_begin(QEMUFile *f)
8a7ddc38
FB
4612{
4613 SaveStateEntry *se;
313aa567 4614
8a7ddc38
FB
4615 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
4616 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
9366f418
AL
4617
4618 for (se = first_se; se != NULL; se = se->next) {
4619 int len;
4620
4621 if (se->save_live_state == NULL)
4622 continue;
4623
4624 /* Section type */
4625 qemu_put_byte(f, QEMU_VM_SECTION_START);
4626 qemu_put_be32(f, se->section_id);
4627
4628 /* ID string */
4629 len = strlen(se->idstr);
4630 qemu_put_byte(f, len);
4631 qemu_put_buffer(f, (uint8_t *)se->idstr, len);
4632
4633 qemu_put_be32(f, se->instance_id);
4634 qemu_put_be32(f, se->version_id);
4635
4636 se->save_live_state(f, QEMU_VM_SECTION_START, se->opaque);
4637 }
4638
871d2f07
AL
4639 if (qemu_file_has_error(f))
4640 return -EIO;
4641
9366f418
AL
4642 return 0;
4643}
4644
4645int qemu_savevm_state_iterate(QEMUFile *f)
4646{
4647 SaveStateEntry *se;
475e4277 4648 int ret = 1;
9366f418
AL
4649
4650 for (se = first_se; se != NULL; se = se->next) {
4651 if (se->save_live_state == NULL)
4652 continue;
4653
4654 /* Section type */
4655 qemu_put_byte(f, QEMU_VM_SECTION_PART);
4656 qemu_put_be32(f, se->section_id);
4657
475e4277 4658 ret &= !!se->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque);
9366f418
AL
4659 }
4660
4661 if (ret)
4662 return 1;
4663
871d2f07
AL
4664 if (qemu_file_has_error(f))
4665 return -EIO;
4666
9366f418
AL
4667 return 0;
4668}
4669
4670int qemu_savevm_state_complete(QEMUFile *f)
4671{
4672 SaveStateEntry *se;
4673
4674 for (se = first_se; se != NULL; se = se->next) {
4675 if (se->save_live_state == NULL)
4676 continue;
4677
4678 /* Section type */
4679 qemu_put_byte(f, QEMU_VM_SECTION_END);
4680 qemu_put_be32(f, se->section_id);
4681
4682 se->save_live_state(f, QEMU_VM_SECTION_END, se->opaque);
4683 }
8a7ddc38
FB
4684
4685 for(se = first_se; se != NULL; se = se->next) {
9366f418
AL
4686 int len;
4687
d978c02c 4688 if (se->save_state == NULL)
d978c02c
AJ
4689 continue;
4690
9366f418
AL
4691 /* Section type */
4692 qemu_put_byte(f, QEMU_VM_SECTION_FULL);
4693 qemu_put_be32(f, se->section_id);
4694
8a7ddc38
FB
4695 /* ID string */
4696 len = strlen(se->idstr);
4697 qemu_put_byte(f, len);
ffe8ab83 4698 qemu_put_buffer(f, (uint8_t *)se->idstr, len);
8a7ddc38
FB
4699
4700 qemu_put_be32(f, se->instance_id);
4701 qemu_put_be32(f, se->version_id);
4702
8a7ddc38 4703 se->save_state(f, se->opaque);
8a7ddc38
FB
4704 }
4705
9366f418
AL
4706 qemu_put_byte(f, QEMU_VM_EOF);
4707
871d2f07
AL
4708 if (qemu_file_has_error(f))
4709 return -EIO;
4710
9366f418
AL
4711 return 0;
4712}
4713
4714int qemu_savevm_state(QEMUFile *f)
4715{
4716 int saved_vm_running;
4717 int ret;
4718
4719 saved_vm_running = vm_running;
4720 vm_stop(0);
4721
5bb7910a
AL
4722 bdrv_flush_all();
4723
9366f418
AL
4724 ret = qemu_savevm_state_begin(f);
4725 if (ret < 0)
4726 goto out;
4727
4728 do {
4729 ret = qemu_savevm_state_iterate(f);
4730 if (ret < 0)
4731 goto out;
475e4277 4732 } while (ret == 0);
9366f418
AL
4733
4734 ret = qemu_savevm_state_complete(f);
4735
4736out:
871d2f07
AL
4737 if (qemu_file_has_error(f))
4738 ret = -EIO;
4739
4740 if (!ret && saved_vm_running)
9366f418 4741 vm_start();
871d2f07 4742
8a7ddc38
FB
4743 return ret;
4744}
4745
4746static SaveStateEntry *find_se(const char *idstr, int instance_id)
4747{
4748 SaveStateEntry *se;
4749
4750 for(se = first_se; se != NULL; se = se->next) {
5fafdf24 4751 if (!strcmp(se->idstr, idstr) &&
8a7ddc38
FB
4752 instance_id == se->instance_id)
4753 return se;
4754 }
4755 return NULL;
4756}
4757
9366f418
AL
4758typedef struct LoadStateEntry {
4759 SaveStateEntry *se;
4760 int section_id;
4761 int version_id;
4762 struct LoadStateEntry *next;
4763} LoadStateEntry;
4764
4765static int qemu_loadvm_state_v2(QEMUFile *f)
8a7ddc38
FB
4766{
4767 SaveStateEntry *se;
faea38e7
FB
4768 int len, ret, instance_id, record_len, version_id;
4769 int64_t total_len, end_pos, cur_pos;
8a7ddc38 4770 char idstr[256];
3b46e624 4771
faea38e7
FB
4772 total_len = qemu_get_be64(f);
4773 end_pos = total_len + qemu_ftell(f);
b4608c04 4774 for(;;) {
faea38e7 4775 if (qemu_ftell(f) >= end_pos)
cd4c3e88 4776 break;
faea38e7 4777 len = qemu_get_byte(f);
ffe8ab83 4778 qemu_get_buffer(f, (uint8_t *)idstr, len);
8a7ddc38
FB
4779 idstr[len] = '\0';
4780 instance_id = qemu_get_be32(f);
4781 version_id = qemu_get_be32(f);
4782 record_len = qemu_get_be32(f);
faea38e7 4783 cur_pos = qemu_ftell(f);
8a7ddc38
FB
4784 se = find_se(idstr, instance_id);
4785 if (!se) {
5fafdf24 4786 fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
8a7ddc38
FB
4787 instance_id, idstr);
4788 } else {
4789 ret = se->load_state(f, se->opaque, version_id);
4790 if (ret < 0) {
5fafdf24 4791 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
8a7ddc38
FB
4792 instance_id, idstr);
4793 }
34865134 4794 }
8a7ddc38
FB
4795 /* always seek to exact end of record */
4796 qemu_fseek(f, cur_pos + record_len, SEEK_SET);
4797 }
871d2f07
AL
4798
4799 if (qemu_file_has_error(f))
4800 return -EIO;
4801
9366f418
AL
4802 return 0;
4803}
4804
4805int qemu_loadvm_state(QEMUFile *f)
4806{
4807 LoadStateEntry *first_le = NULL;
4808 uint8_t section_type;
4809 unsigned int v;
4810 int ret;
4811
4812 v = qemu_get_be32(f);
4813 if (v != QEMU_VM_FILE_MAGIC)
4814 return -EINVAL;
4815
4816 v = qemu_get_be32(f);
4817 if (v == QEMU_VM_FILE_VERSION_COMPAT)
4818 return qemu_loadvm_state_v2(f);
4819 if (v != QEMU_VM_FILE_VERSION)
4820 return -ENOTSUP;
4821
4822 while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
4823 uint32_t instance_id, version_id, section_id;
4824 LoadStateEntry *le;
4825 SaveStateEntry *se;
4826 char idstr[257];
4827 int len;
4828
4829 switch (section_type) {
4830 case QEMU_VM_SECTION_START:
4831 case QEMU_VM_SECTION_FULL:
4832 /* Read section start */
4833 section_id = qemu_get_be32(f);
4834 len = qemu_get_byte(f);
4835 qemu_get_buffer(f, (uint8_t *)idstr, len);
4836 idstr[len] = 0;
4837 instance_id = qemu_get_be32(f);
4838 version_id = qemu_get_be32(f);
4839
4840 /* Find savevm section */
4841 se = find_se(idstr, instance_id);
4842 if (se == NULL) {
4843 fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
4844 ret = -EINVAL;
4845 goto out;
4846 }
4847
4848 /* Validate version */
4849 if (version_id > se->version_id) {
4850 fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
4851 version_id, idstr, se->version_id);
4852 ret = -EINVAL;
4853 goto out;
4854 }
4855
4856 /* Add entry */
4857 le = qemu_mallocz(sizeof(*le));
4858 if (le == NULL) {
4859 ret = -ENOMEM;
4860 goto out;
4861 }
4862
4863 le->se = se;
4864 le->section_id = section_id;
4865 le->version_id = version_id;
4866 le->next = first_le;
4867 first_le = le;
4868
4869 le->se->load_state(f, le->se->opaque, le->version_id);
4870 break;
4871 case QEMU_VM_SECTION_PART:
4872 case QEMU_VM_SECTION_END:
4873 section_id = qemu_get_be32(f);
4874
4875 for (le = first_le; le && le->section_id != section_id; le = le->next);
4876 if (le == NULL) {
4877 fprintf(stderr, "Unknown savevm section %d\n", section_id);
4878 ret = -EINVAL;
4879 goto out;
4880 }
4881
4882 le->se->load_state(f, le->se->opaque, le->version_id);
4883 break;
4884 default:
4885 fprintf(stderr, "Unknown savevm section type %d\n", section_type);
4886 ret = -EINVAL;
4887 goto out;
4888 }
4889 }
4890
8a7ddc38 4891 ret = 0;
9366f418
AL
4892
4893out:
4894 while (first_le) {
4895 LoadStateEntry *le = first_le;
4896 first_le = first_le->next;
4897 qemu_free(le);
4898 }
4899
871d2f07
AL
4900 if (qemu_file_has_error(f))
4901 ret = -EIO;
4902
faea38e7
FB
4903 return ret;
4904}
4905
4906/* device can contain snapshots */
4907static int bdrv_can_snapshot(BlockDriverState *bs)
4908{
4909 return (bs &&
4910 !bdrv_is_removable(bs) &&
4911 !bdrv_is_read_only(bs));
4912}
4913
4914/* device must be snapshots in order to have a reliable snapshot */
4915static int bdrv_has_snapshot(BlockDriverState *bs)
4916{
4917 return (bs &&
4918 !bdrv_is_removable(bs) &&
4919 !bdrv_is_read_only(bs));
4920}
4921
4922static BlockDriverState *get_bs_snapshots(void)
4923{
4924 BlockDriverState *bs;
4925 int i;
4926
4927 if (bs_snapshots)
4928 return bs_snapshots;
e4bcb14c
TS
4929 for(i = 0; i <= nb_drives; i++) {
4930 bs = drives_table[i].bdrv;
faea38e7
FB
4931 if (bdrv_can_snapshot(bs))
4932 goto ok;
4933 }
4934 return NULL;
4935 ok:
4936 bs_snapshots = bs;
4937 return bs;
4938}
4939
4940static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
4941 const char *name)
4942{
4943 QEMUSnapshotInfo *sn_tab, *sn;
4944 int nb_sns, i, ret;
3b46e624 4945
faea38e7
FB
4946 ret = -ENOENT;
4947 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
4948 if (nb_sns < 0)
4949 return ret;
4950 for(i = 0; i < nb_sns; i++) {
4951 sn = &sn_tab[i];
4952 if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
4953 *sn_info = *sn;
4954 ret = 0;
4955 break;
4956 }
4957 }
4958 qemu_free(sn_tab);
4959 return ret;
4960}
4961
4962void do_savevm(const char *name)
4963{
4964 BlockDriverState *bs, *bs1;
4965 QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
4966 int must_delete, ret, i;
4967 BlockDriverInfo bdi1, *bdi = &bdi1;
4968 QEMUFile *f;
4969 int saved_vm_running;
4c279bdf
FB
4970#ifdef _WIN32
4971 struct _timeb tb;
4972#else
faea38e7 4973 struct timeval tv;
4c279bdf 4974#endif
faea38e7
FB
4975
4976 bs = get_bs_snapshots();
4977 if (!bs) {
4978 term_printf("No block device can accept snapshots\n");
4979 return;
4980 }
4981
6192bc37
PB
4982 /* ??? Should this occur after vm_stop? */
4983 qemu_aio_flush();
4984
faea38e7
FB
4985 saved_vm_running = vm_running;
4986 vm_stop(0);
3b46e624 4987
faea38e7
FB
4988 must_delete = 0;
4989 if (name) {
4990 ret = bdrv_snapshot_find(bs, old_sn, name);
4991 if (ret >= 0) {
4992 must_delete = 1;
4993 }
4994 }
4995 memset(sn, 0, sizeof(*sn));
4996 if (must_delete) {
4997 pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
4998 pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
4999 } else {
5000 if (name)
5001 pstrcpy(sn->name, sizeof(sn->name), name);
5002 }
5003
5004 /* fill auxiliary fields */
4c279bdf
FB
5005#ifdef _WIN32
5006 _ftime(&tb);
5007 sn->date_sec = tb.time;
5008 sn->date_nsec = tb.millitm * 1000000;
5009#else
faea38e7
FB
5010 gettimeofday(&tv, NULL);
5011 sn->date_sec = tv.tv_sec;
5012 sn->date_nsec = tv.tv_usec * 1000;
4c279bdf 5013#endif
faea38e7 5014 sn->vm_clock_nsec = qemu_get_clock(vm_clock);
3b46e624 5015
faea38e7
FB
5016 if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5017 term_printf("Device %s does not support VM state snapshots\n",
5018 bdrv_get_device_name(bs));
5019 goto the_end;
5020 }
3b46e624 5021
faea38e7
FB
5022 /* save the VM state */
5023 f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1);
5024 if (!f) {
5025 term_printf("Could not open VM state file\n");
5026 goto the_end;
5027 }
5028 ret = qemu_savevm_state(f);
5029 sn->vm_state_size = qemu_ftell(f);
5030 qemu_fclose(f);
5031 if (ret < 0) {
5032 term_printf("Error %d while writing VM\n", ret);
5033 goto the_end;
5034 }
3b46e624 5035
faea38e7
FB
5036 /* create the snapshots */
5037
e4bcb14c
TS
5038 for(i = 0; i < nb_drives; i++) {
5039 bs1 = drives_table[i].bdrv;
faea38e7
FB
5040 if (bdrv_has_snapshot(bs1)) {
5041 if (must_delete) {
5042 ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
5043 if (ret < 0) {
5044 term_printf("Error while deleting snapshot on '%s'\n",
5045 bdrv_get_device_name(bs1));
5046 }
5047 }
5048 ret = bdrv_snapshot_create(bs1, sn);
5049 if (ret < 0) {
5050 term_printf("Error while creating snapshot on '%s'\n",
5051 bdrv_get_device_name(bs1));
5052 }
5053 }
5054 }
5055
8a7ddc38
FB
5056 the_end:
5057 if (saved_vm_running)
5058 vm_start();
faea38e7
FB
5059}
5060
5061void do_loadvm(const char *name)
5062{
5063 BlockDriverState *bs, *bs1;
5064 BlockDriverInfo bdi1, *bdi = &bdi1;
5065 QEMUFile *f;
5066 int i, ret;
5067 int saved_vm_running;
5068
5069 bs = get_bs_snapshots();
5070 if (!bs) {
5071 term_printf("No block device supports snapshots\n");
5072 return;
5073 }
3b46e624 5074
6192bc37
PB
5075 /* Flush all IO requests so they don't interfere with the new state. */
5076 qemu_aio_flush();
5077
faea38e7
FB
5078 saved_vm_running = vm_running;
5079 vm_stop(0);
5080
e4bcb14c
TS
5081 for(i = 0; i <= nb_drives; i++) {
5082 bs1 = drives_table[i].bdrv;
faea38e7
FB
5083 if (bdrv_has_snapshot(bs1)) {
5084 ret = bdrv_snapshot_goto(bs1, name);
5085 if (ret < 0) {
5086 if (bs != bs1)
5087 term_printf("Warning: ");
5088 switch(ret) {
5089 case -ENOTSUP:
5090 term_printf("Snapshots not supported on device '%s'\n",
5091 bdrv_get_device_name(bs1));
5092 break;
5093 case -ENOENT:
5094 term_printf("Could not find snapshot '%s' on device '%s'\n",
5095 name, bdrv_get_device_name(bs1));
5096 break;
5097 default:
5098 term_printf("Error %d while activating snapshot on '%s'\n",
5099 ret, bdrv_get_device_name(bs1));
5100 break;
5101 }
5102 /* fatal on snapshot block device */
5103 if (bs == bs1)
5104 goto the_end;
5105 }
5106 }
5107 }
5108
5109 if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5110 term_printf("Device %s does not support VM state snapshots\n",
5111 bdrv_get_device_name(bs));
5112 return;
5113 }
3b46e624 5114
faea38e7
FB
5115 /* restore the VM state */
5116 f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0);
5117 if (!f) {
5118 term_printf("Could not open VM state file\n");
5119 goto the_end;
5120 }
5121 ret = qemu_loadvm_state(f);
5122 qemu_fclose(f);
5123 if (ret < 0) {
5124 term_printf("Error %d while loading VM state\n", ret);
5125 }
5126 the_end:
5127 if (saved_vm_running)
5128 vm_start();
5129}
5130
5131void do_delvm(const char *name)
5132{
5133 BlockDriverState *bs, *bs1;
5134 int i, ret;
5135
5136 bs = get_bs_snapshots();
5137 if (!bs) {
5138 term_printf("No block device supports snapshots\n");
5139 return;
5140 }
3b46e624 5141
e4bcb14c
TS
5142 for(i = 0; i <= nb_drives; i++) {
5143 bs1 = drives_table[i].bdrv;
faea38e7
FB
5144 if (bdrv_has_snapshot(bs1)) {
5145 ret = bdrv_snapshot_delete(bs1, name);
5146 if (ret < 0) {
5147 if (ret == -ENOTSUP)
5148 term_printf("Snapshots not supported on device '%s'\n",
5149 bdrv_get_device_name(bs1));
5150 else
5151 term_printf("Error %d while deleting snapshot on '%s'\n",
5152 ret, bdrv_get_device_name(bs1));
5153 }
5154 }
5155 }
5156}
5157
5158void do_info_snapshots(void)
5159{
5160 BlockDriverState *bs, *bs1;
5161 QEMUSnapshotInfo *sn_tab, *sn;
5162 int nb_sns, i;
5163 char buf[256];
5164
5165 bs = get_bs_snapshots();
5166 if (!bs) {
5167 term_printf("No available block device supports snapshots\n");
5168 return;
5169 }
5170 term_printf("Snapshot devices:");
e4bcb14c
TS
5171 for(i = 0; i <= nb_drives; i++) {
5172 bs1 = drives_table[i].bdrv;
faea38e7
FB
5173 if (bdrv_has_snapshot(bs1)) {
5174 if (bs == bs1)
5175 term_printf(" %s", bdrv_get_device_name(bs1));
5176 }
5177 }
5178 term_printf("\n");
5179
5180 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5181 if (nb_sns < 0) {
5182 term_printf("bdrv_snapshot_list: error %d\n", nb_sns);
5183 return;
5184 }
5185 term_printf("Snapshot list (from %s):\n", bdrv_get_device_name(bs));
5186 term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
5187 for(i = 0; i < nb_sns; i++) {
5188 sn = &sn_tab[i];
5189 term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
5190 }
5191 qemu_free(sn_tab);
8a7ddc38
FB
5192}
5193
8a7ddc38
FB
5194/***********************************************************/
5195/* ram save/restore */
5196
8a7ddc38
FB
5197static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
5198{
5199 int v;
5200
5201 v = qemu_get_byte(f);
5202 switch(v) {
5203 case 0:
5204 if (qemu_get_buffer(f, buf, len) != len)
5205 return -EIO;
5206 break;
5207 case 1:
5208 v = qemu_get_byte(f);
5209 memset(buf, v, len);
5210 break;
5211 default:
5212 return -EINVAL;
5213 }
871d2f07
AL
5214
5215 if (qemu_file_has_error(f))
5216 return -EIO;
5217
8a7ddc38
FB
5218 return 0;
5219}
5220
c88676f8
FB
5221static int ram_load_v1(QEMUFile *f, void *opaque)
5222{
00f82b8a
AJ
5223 int ret;
5224 ram_addr_t i;
c88676f8
FB
5225
5226 if (qemu_get_be32(f) != phys_ram_size)
5227 return -EINVAL;
5228 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
5229 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
5230 if (ret)
5231 return ret;
5232 }
5233 return 0;
5234}
5235
5236#define BDRV_HASH_BLOCK_SIZE 1024
5237#define IOBUF_SIZE 4096
5238#define RAM_CBLOCK_MAGIC 0xfabe
5239
c88676f8
FB
5240typedef struct RamDecompressState {
5241 z_stream zstream;
5242 QEMUFile *f;
5243 uint8_t buf[IOBUF_SIZE];
5244} RamDecompressState;
5245
5246static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
5247{
5248 int ret;
5249 memset(s, 0, sizeof(*s));
5250 s->f = f;
5251 ret = inflateInit(&s->zstream);
5252 if (ret != Z_OK)
5253 return -1;
5254 return 0;
5255}
5256
5257static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
5258{
5259 int ret, clen;
5260
5261 s->zstream.avail_out = len;
5262 s->zstream.next_out = buf;
5263 while (s->zstream.avail_out > 0) {
5264 if (s->zstream.avail_in == 0) {
5265 if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
5266 return -1;
5267 clen = qemu_get_be16(s->f);
5268 if (clen > IOBUF_SIZE)
5269 return -1;
5270 qemu_get_buffer(s->f, s->buf, clen);
5271 s->zstream.avail_in = clen;
5272 s->zstream.next_in = s->buf;
5273 }
5274 ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
5275 if (ret != Z_OK && ret != Z_STREAM_END) {
5276 return -1;
5277 }
5278 }
5279 return 0;
5280}
5281
5282static void ram_decompress_close(RamDecompressState *s)
5283{
5284 inflateEnd(&s->zstream);
5285}
5286
475e4277
AL
5287#define RAM_SAVE_FLAG_FULL 0x01
5288#define RAM_SAVE_FLAG_COMPRESS 0x02
5289#define RAM_SAVE_FLAG_MEM_SIZE 0x04
5290#define RAM_SAVE_FLAG_PAGE 0x08
5291#define RAM_SAVE_FLAG_EOS 0x10
5292
5293static int is_dup_page(uint8_t *page, uint8_t ch)
8a7ddc38 5294{
475e4277
AL
5295 uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
5296 uint32_t *array = (uint32_t *)page;
5297 int i;
3b46e624 5298
475e4277
AL
5299 for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
5300 if (array[i] != val)
5301 return 0;
5302 }
5303
5304 return 1;
5305}
5306
5307static int ram_save_block(QEMUFile *f)
5308{
5309 static ram_addr_t current_addr = 0;
5310 ram_addr_t saved_addr = current_addr;
5311 ram_addr_t addr = 0;
5312 int found = 0;
5313
5314 while (addr < phys_ram_size) {
5315 if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
5316 uint8_t ch;
5317
5318 cpu_physical_memory_reset_dirty(current_addr,
5319 current_addr + TARGET_PAGE_SIZE,
5320 MIGRATION_DIRTY_FLAG);
5321
5322 ch = *(phys_ram_base + current_addr);
5323
5324 if (is_dup_page(phys_ram_base + current_addr, ch)) {
5325 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
5326 qemu_put_byte(f, ch);
5327 } else {
5328 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
5329 qemu_put_buffer(f, phys_ram_base + current_addr, TARGET_PAGE_SIZE);
c88676f8 5330 }
475e4277
AL
5331
5332 found = 1;
5333 break;
c88676f8 5334 }
475e4277
AL
5335 addr += TARGET_PAGE_SIZE;
5336 current_addr = (saved_addr + addr) % phys_ram_size;
8a7ddc38 5337 }
475e4277
AL
5338
5339 return found;
8a7ddc38
FB
5340}
5341
475e4277
AL
5342static ram_addr_t ram_save_threshold = 10;
5343
5344static ram_addr_t ram_save_remaining(void)
5345{
5346 ram_addr_t addr;
5347 ram_addr_t count = 0;
5348
5349 for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
5350 if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
5351 count++;
5352 }
5353
5354 return count;
5355}
5356
5357static int ram_save_live(QEMUFile *f, int stage, void *opaque)
5358{
5359 ram_addr_t addr;
5360
5361 if (stage == 1) {
5362 /* Make sure all dirty bits are set */
5363 for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
5364 if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
5365 cpu_physical_memory_set_dirty(addr);
5366 }
5367
5368 /* Enable dirty memory tracking */
5369 cpu_physical_memory_set_dirty_tracking(1);
5370
5371 qemu_put_be64(f, phys_ram_size | RAM_SAVE_FLAG_MEM_SIZE);
5372 }
5373
5374 while (!qemu_file_rate_limit(f)) {
5375 int ret;
5376
5377 ret = ram_save_block(f);
5378 if (ret == 0) /* no more blocks */
5379 break;
5380 }
5381
5382 /* try transferring iterative blocks of memory */
5383
5384 if (stage == 3) {
5385 cpu_physical_memory_set_dirty_tracking(0);
5386
5387 /* flush all remaining blocks regardless of rate limiting */
5388 while (ram_save_block(f) != 0);
5389 }
5390
5391 qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
5392
5393 return (stage == 2) && (ram_save_remaining() < ram_save_threshold);
5394}
5395
5396static int ram_load_dead(QEMUFile *f, void *opaque)
8a7ddc38 5397{
c88676f8
FB
5398 RamDecompressState s1, *s = &s1;
5399 uint8_t buf[10];
00f82b8a 5400 ram_addr_t i;
8a7ddc38 5401
c88676f8
FB
5402 if (ram_decompress_open(s, f) < 0)
5403 return -EINVAL;
5404 for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
5405 if (ram_decompress_buf(s, buf, 1) < 0) {
5406 fprintf(stderr, "Error while reading ram block header\n");
5407 goto error;
5408 }
5409 if (buf[0] == 0) {
5410 if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
00f82b8a 5411 fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
c88676f8
FB
5412 goto error;
5413 }
475e4277 5414 } else {
c88676f8
FB
5415 error:
5416 printf("Error block header\n");
5417 return -EINVAL;
5418 }
8a7ddc38 5419 }
c88676f8 5420 ram_decompress_close(s);
475e4277
AL
5421
5422 return 0;
5423}
5424
5425static int ram_load(QEMUFile *f, void *opaque, int version_id)
5426{
5427 ram_addr_t addr;
5428 int flags;
5429
5430 if (version_id == 1)
5431 return ram_load_v1(f, opaque);
5432
5433 if (version_id == 2) {
5434 if (qemu_get_be32(f) != phys_ram_size)
5435 return -EINVAL;
5436 return ram_load_dead(f, opaque);
5437 }
5438
5439 if (version_id != 3)
5440 return -EINVAL;
5441
5442 do {
5443 addr = qemu_get_be64(f);
5444
5445 flags = addr & ~TARGET_PAGE_MASK;
5446 addr &= TARGET_PAGE_MASK;
5447
5448 if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
5449 if (addr != phys_ram_size)
5450 return -EINVAL;
5451 }
5452
5453 if (flags & RAM_SAVE_FLAG_FULL) {
5454 if (ram_load_dead(f, opaque) < 0)
5455 return -EINVAL;
5456 }
5457
5458 if (flags & RAM_SAVE_FLAG_COMPRESS) {
5459 uint8_t ch = qemu_get_byte(f);
5460 memset(phys_ram_base + addr, ch, TARGET_PAGE_SIZE);
5461 } else if (flags & RAM_SAVE_FLAG_PAGE)
5462 qemu_get_buffer(f, phys_ram_base + addr, TARGET_PAGE_SIZE);
5463 } while (!(flags & RAM_SAVE_FLAG_EOS));
5464
8a7ddc38
FB
5465 return 0;
5466}
5467
9e472e10
AL
5468void qemu_service_io(void)
5469{
5470 CPUState *env = cpu_single_env;
5471 if (env) {
5472 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
5473#ifdef USE_KQEMU
5474 if (env->kqemu_enabled) {
5475 kqemu_cpu_interrupt(env);
5476 }
5477#endif
5478 }
5479}
5480
83f64091
FB
5481/***********************************************************/
5482/* bottom halves (can be seen as timers which expire ASAP) */
5483
5484struct QEMUBH {
5485 QEMUBHFunc *cb;
5486 void *opaque;
5487 int scheduled;
1b435b10
AL
5488 int idle;
5489 int deleted;
83f64091
FB
5490 QEMUBH *next;
5491};
5492
5493static QEMUBH *first_bh = NULL;
5494
5495QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
5496{
5497 QEMUBH *bh;
5498 bh = qemu_mallocz(sizeof(QEMUBH));
5499 if (!bh)
5500 return NULL;
5501 bh->cb = cb;
5502 bh->opaque = opaque;
1b435b10
AL
5503 bh->next = first_bh;
5504 first_bh = bh;
83f64091
FB
5505 return bh;
5506}
5507
6eb5733a 5508int qemu_bh_poll(void)
83f64091 5509{
1b435b10 5510 QEMUBH *bh, **bhp;
6eb5733a 5511 int ret;
83f64091 5512
6eb5733a 5513 ret = 0;
1b435b10
AL
5514 for (bh = first_bh; bh; bh = bh->next) {
5515 if (!bh->deleted && bh->scheduled) {
5516 bh->scheduled = 0;
5517 if (!bh->idle)
5518 ret = 1;
5519 bh->idle = 0;
5520 bh->cb(bh->opaque);
5521 }
83f64091 5522 }
1b435b10
AL
5523
5524 /* remove deleted bhs */
5525 bhp = &first_bh;
5526 while (*bhp) {
5527 bh = *bhp;
5528 if (bh->deleted) {
5529 *bhp = bh->next;
5530 qemu_free(bh);
5531 } else
5532 bhp = &bh->next;
5533 }
5534
6eb5733a 5535 return ret;
83f64091
FB
5536}
5537
1b435b10
AL
5538void qemu_bh_schedule_idle(QEMUBH *bh)
5539{
5540 if (bh->scheduled)
5541 return;
5542 bh->scheduled = 1;
5543 bh->idle = 1;
5544}
5545
83f64091
FB
5546void qemu_bh_schedule(QEMUBH *bh)
5547{
5548 CPUState *env = cpu_single_env;
5549 if (bh->scheduled)
5550 return;
5551 bh->scheduled = 1;
1b435b10 5552 bh->idle = 0;
83f64091
FB
5553 /* stop the currently executing CPU to execute the BH ASAP */
5554 if (env) {
5555 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
5556 }
5557}
5558
5559void qemu_bh_cancel(QEMUBH *bh)
5560{
1b435b10 5561 bh->scheduled = 0;
83f64091
FB
5562}
5563
5564void qemu_bh_delete(QEMUBH *bh)
5565{
1b435b10
AL
5566 bh->scheduled = 0;
5567 bh->deleted = 1;
83f64091
FB
5568}
5569
56f3a5d0
AL
5570static void qemu_bh_update_timeout(int *timeout)
5571{
5572 QEMUBH *bh;
5573
5574 for (bh = first_bh; bh; bh = bh->next) {
5575 if (!bh->deleted && bh->scheduled) {
5576 if (bh->idle) {
5577 /* idle bottom halves will be polled at least
5578 * every 10ms */
5579 *timeout = MIN(10, *timeout);
5580 } else {
5581 /* non-idle bottom halves will be executed
5582 * immediately */
5583 *timeout = 0;
5584 break;
5585 }
5586 }
5587 }
5588}
5589
cc1daa40
FB
5590/***********************************************************/
5591/* machine registration */
5592
bdaf78e0 5593static QEMUMachine *first_machine = NULL;
cc1daa40
FB
5594
5595int qemu_register_machine(QEMUMachine *m)
5596{
5597 QEMUMachine **pm;
5598 pm = &first_machine;
5599 while (*pm != NULL)
5600 pm = &(*pm)->next;
5601 m->next = NULL;
5602 *pm = m;
5603 return 0;
5604}
5605
9596ebb7 5606static QEMUMachine *find_machine(const char *name)
cc1daa40
FB
5607{
5608 QEMUMachine *m;
5609
5610 for(m = first_machine; m != NULL; m = m->next) {
5611 if (!strcmp(m->name, name))
5612 return m;
5613 }
5614 return NULL;
5615}
5616
8a7ddc38
FB
5617/***********************************************************/
5618/* main execution loop */
5619
9596ebb7 5620static void gui_update(void *opaque)
8a7ddc38 5621{
740733bb
TS
5622 DisplayState *ds = opaque;
5623 ds->dpy_refresh(ds);
f442e08b
AJ
5624 qemu_mod_timer(ds->gui_timer,
5625 (ds->gui_timer_interval ?
5626 ds->gui_timer_interval :
5627 GUI_REFRESH_INTERVAL)
5628 + qemu_get_clock(rt_clock));
8a7ddc38
FB
5629}
5630
0bd48850
FB
5631struct vm_change_state_entry {
5632 VMChangeStateHandler *cb;
5633 void *opaque;
5634 LIST_ENTRY (vm_change_state_entry) entries;
5635};
5636
5637static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
5638
5639VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
5640 void *opaque)
5641{
5642 VMChangeStateEntry *e;
5643
5644 e = qemu_mallocz(sizeof (*e));
5645 if (!e)
5646 return NULL;
5647
5648 e->cb = cb;
5649 e->opaque = opaque;
5650 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
5651 return e;
5652}
5653
5654void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
5655{
5656 LIST_REMOVE (e, entries);
5657 qemu_free (e);
5658}
5659
5660static void vm_state_notify(int running)
5661{
5662 VMChangeStateEntry *e;
5663
5664 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
5665 e->cb(e->opaque, running);
5666 }
5667}
5668
8a7ddc38 5669/* XXX: support several handlers */
0bd48850
FB
5670static VMStopHandler *vm_stop_cb;
5671static void *vm_stop_opaque;
8a7ddc38
FB
5672
5673int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
5674{
5675 vm_stop_cb = cb;
5676 vm_stop_opaque = opaque;
5677 return 0;
5678}
5679
5680void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
5681{
5682 vm_stop_cb = NULL;
5683}
5684
5685void vm_start(void)
5686{
5687 if (!vm_running) {
5688 cpu_enable_ticks();
5689 vm_running = 1;
0bd48850 5690 vm_state_notify(1);
efe75411 5691 qemu_rearm_alarm_timer(alarm_timer);
8a7ddc38
FB
5692 }
5693}
5694
5fafdf24 5695void vm_stop(int reason)
8a7ddc38
FB
5696{
5697 if (vm_running) {
5698 cpu_disable_ticks();
5699 vm_running = 0;
5700 if (reason != 0) {
5701 if (vm_stop_cb) {
5702 vm_stop_cb(vm_stop_opaque, reason);
5703 }
34865134 5704 }
0bd48850 5705 vm_state_notify(0);
8a7ddc38
FB
5706 }
5707}
5708
bb0c6722
FB
5709/* reset/shutdown handler */
5710
5711typedef struct QEMUResetEntry {
5712 QEMUResetHandler *func;
5713 void *opaque;
5714 struct QEMUResetEntry *next;
5715} QEMUResetEntry;
5716
5717static QEMUResetEntry *first_reset_entry;
5718static int reset_requested;
5719static int shutdown_requested;
3475187d 5720static int powerdown_requested;
bb0c6722 5721
cf7a2fe2
AJ
5722int qemu_shutdown_requested(void)
5723{
5724 int r = shutdown_requested;
5725 shutdown_requested = 0;
5726 return r;
5727}
5728
5729int qemu_reset_requested(void)
5730{
5731 int r = reset_requested;
5732 reset_requested = 0;
5733 return r;
5734}
5735
5736int qemu_powerdown_requested(void)
5737{
5738 int r = powerdown_requested;
5739 powerdown_requested = 0;
5740 return r;
5741}
5742
bb0c6722
FB
5743void qemu_register_reset(QEMUResetHandler *func, void *opaque)
5744{
5745 QEMUResetEntry **pre, *re;
5746
5747 pre = &first_reset_entry;
5748 while (*pre != NULL)
5749 pre = &(*pre)->next;
5750 re = qemu_mallocz(sizeof(QEMUResetEntry));
5751 re->func = func;
5752 re->opaque = opaque;
5753 re->next = NULL;
5754 *pre = re;
5755}
5756
cf7a2fe2 5757void qemu_system_reset(void)
bb0c6722
FB
5758{
5759 QEMUResetEntry *re;
5760
5761 /* reset all devices */
5762 for(re = first_reset_entry; re != NULL; re = re->next) {
5763 re->func(re->opaque);
5764 }
5765}
5766
5767void qemu_system_reset_request(void)
5768{
d1beab82
FB
5769 if (no_reboot) {
5770 shutdown_requested = 1;
5771 } else {
5772 reset_requested = 1;
5773 }
6a00d601
FB
5774 if (cpu_single_env)
5775 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bb0c6722
FB
5776}
5777
5778void qemu_system_shutdown_request(void)
5779{
5780 shutdown_requested = 1;
6a00d601
FB
5781 if (cpu_single_env)
5782 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bb0c6722
FB
5783}
5784
3475187d
FB
5785void qemu_system_powerdown_request(void)
5786{
5787 powerdown_requested = 1;
6a00d601
FB
5788 if (cpu_single_env)
5789 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bb0c6722
FB
5790}
5791
877cf882 5792#ifdef _WIN32
56f3a5d0
AL
5793void host_main_loop_wait(int *timeout)
5794{
5795 int ret, ret2, i;
f331110f
FB
5796 PollingEntry *pe;
5797
c4b1fcc0 5798
f331110f
FB
5799 /* XXX: need to suppress polling by better using win32 events */
5800 ret = 0;
5801 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
5802 ret |= pe->func(pe->opaque);
5803 }
e6b1e558 5804 if (ret == 0) {
a18e524a
FB
5805 int err;
5806 WaitObjects *w = &wait_objects;
3b46e624 5807
56f3a5d0 5808 ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
a18e524a
FB
5809 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
5810 if (w->func[ret - WAIT_OBJECT_0])
5811 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
3b46e624 5812
5fafdf24 5813 /* Check for additional signaled events */
e6b1e558 5814 for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
3b46e624 5815
e6b1e558
TS
5816 /* Check if event is signaled */
5817 ret2 = WaitForSingleObject(w->events[i], 0);
5818 if(ret2 == WAIT_OBJECT_0) {
5819 if (w->func[i])
5820 w->func[i](w->opaque[i]);
5821 } else if (ret2 == WAIT_TIMEOUT) {
5822 } else {
5823 err = GetLastError();
5824 fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
3b46e624
TS
5825 }
5826 }
a18e524a
FB
5827 } else if (ret == WAIT_TIMEOUT) {
5828 } else {
5829 err = GetLastError();
e6b1e558 5830 fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
a18e524a 5831 }
f331110f 5832 }
56f3a5d0
AL
5833
5834 *timeout = 0;
5835}
5836#else
5837void host_main_loop_wait(int *timeout)
5838{
5839}
fd1dff4b 5840#endif
56f3a5d0
AL
5841
5842void main_loop_wait(int timeout)
5843{
5844 IOHandlerRecord *ioh;
5845 fd_set rfds, wfds, xfds;
5846 int ret, nfds;
5847 struct timeval tv;
5848
5849 qemu_bh_update_timeout(&timeout);
5850
5851 host_main_loop_wait(&timeout);
5852
fd1dff4b
FB
5853 /* poll any events */
5854 /* XXX: separate device handlers from system ones */
5855 nfds = -1;
5856 FD_ZERO(&rfds);
5857 FD_ZERO(&wfds);
e035649e 5858 FD_ZERO(&xfds);
fd1dff4b 5859 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
cafffd40
TS
5860 if (ioh->deleted)
5861 continue;
fd1dff4b
FB
5862 if (ioh->fd_read &&
5863 (!ioh->fd_read_poll ||
5864 ioh->fd_read_poll(ioh->opaque) != 0)) {
5865 FD_SET(ioh->fd, &rfds);
5866 if (ioh->fd > nfds)
5867 nfds = ioh->fd;
5868 }
5869 if (ioh->fd_write) {
5870 FD_SET(ioh->fd, &wfds);
5871 if (ioh->fd > nfds)
5872 nfds = ioh->fd;
5873 }
5874 }
3b46e624 5875
56f3a5d0
AL
5876 tv.tv_sec = timeout / 1000;
5877 tv.tv_usec = (timeout % 1000) * 1000;
5878
e035649e
FB
5879#if defined(CONFIG_SLIRP)
5880 if (slirp_inited) {
5881 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
5882 }
5883#endif
5884 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
fd1dff4b 5885 if (ret > 0) {
cafffd40
TS
5886 IOHandlerRecord **pioh;
5887
5888 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6ab43fdc 5889 if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
fd1dff4b 5890 ioh->fd_read(ioh->opaque);
7c9d8e07 5891 }
6ab43fdc 5892 if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
fd1dff4b 5893 ioh->fd_write(ioh->opaque);
c4b1fcc0 5894 }
b4608c04 5895 }
cafffd40
TS
5896
5897 /* remove deleted IO handlers */
5898 pioh = &first_io_handler;
5899 while (*pioh) {
5900 ioh = *pioh;
5901 if (ioh->deleted) {
5902 *pioh = ioh->next;
5903 qemu_free(ioh);
5fafdf24 5904 } else
cafffd40
TS
5905 pioh = &ioh->next;
5906 }
fd1dff4b 5907 }
c20709aa 5908#if defined(CONFIG_SLIRP)
fd1dff4b 5909 if (slirp_inited) {
e035649e
FB
5910 if (ret < 0) {
5911 FD_ZERO(&rfds);
5912 FD_ZERO(&wfds);
5913 FD_ZERO(&xfds);
c20709aa 5914 }
e035649e 5915 slirp_select_poll(&rfds, &wfds, &xfds);
fd1dff4b 5916 }
e035649e 5917#endif
b4608c04 5918
fd1dff4b 5919 if (vm_running) {
21b20814 5920 if (likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
5fafdf24 5921 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
fd1dff4b 5922 qemu_get_clock(vm_clock));
fd1dff4b 5923 }
423f0742 5924
fd1dff4b 5925 /* real time timers */
5fafdf24 5926 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
fd1dff4b 5927 qemu_get_clock(rt_clock));
423f0742 5928
d5d08334
AZ
5929 if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
5930 alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED);
5931 qemu_rearm_alarm_timer(alarm_timer);
5932 }
b99dc0d1 5933
423f0742
PB
5934 /* Check bottom-halves last in case any of the earlier events triggered
5935 them. */
5936 qemu_bh_poll();
3b46e624 5937
5905b2e5
FB
5938}
5939
9596ebb7 5940static int main_loop(void)
5905b2e5
FB
5941{
5942 int ret, timeout;
89bfc105
FB
5943#ifdef CONFIG_PROFILER
5944 int64_t ti;
5945#endif
6a00d601 5946 CPUState *env;
5905b2e5 5947
6a00d601 5948 cur_cpu = first_cpu;
ee5605e5 5949 next_cpu = cur_cpu->next_cpu ?: first_cpu;
5905b2e5
FB
5950 for(;;) {
5951 if (vm_running) {
15a76449 5952
15a76449
FB
5953 for(;;) {
5954 /* get next cpu */
ee5605e5 5955 env = next_cpu;
89bfc105
FB
5956#ifdef CONFIG_PROFILER
5957 ti = profile_getclock();
5958#endif
2e70f6ef
PB
5959 if (use_icount) {
5960 int64_t count;
5961 int decr;
5962 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
5963 env->icount_decr.u16.low = 0;
5964 env->icount_extra = 0;
5965 count = qemu_next_deadline();
5966 count = (count + (1 << icount_time_shift) - 1)
5967 >> icount_time_shift;
5968 qemu_icount += count;
5969 decr = (count > 0xffff) ? 0xffff : count;
5970 count -= decr;
5971 env->icount_decr.u16.low = decr;
5972 env->icount_extra = count;
5973 }
6a00d601 5974 ret = cpu_exec(env);
89bfc105
FB
5975#ifdef CONFIG_PROFILER
5976 qemu_time += profile_getclock() - ti;
5977#endif
2e70f6ef
PB
5978 if (use_icount) {
5979 /* Fold pending instructions back into the
5980 instruction counter, and clear the interrupt flag. */
5981 qemu_icount -= (env->icount_decr.u16.low
5982 + env->icount_extra);
5983 env->icount_decr.u32 = 0;
5984 env->icount_extra = 0;
5985 }
ee5605e5 5986 next_cpu = env->next_cpu ?: first_cpu;
95b01009 5987 if (event_pending && likely(ret != EXCP_DEBUG)) {
ee5605e5
AZ
5988 ret = EXCP_INTERRUPT;
5989 event_pending = 0;
5990 break;
5991 }
bd967e05
PB
5992 if (ret == EXCP_HLT) {
5993 /* Give the next CPU a chance to run. */
5994 cur_cpu = env;
5995 continue;
5996 }
15a76449
FB
5997 if (ret != EXCP_HALTED)
5998 break;
5999 /* all CPUs are halted ? */
bd967e05 6000 if (env == cur_cpu)
15a76449 6001 break;
15a76449
FB
6002 }
6003 cur_cpu = env;
6004
5905b2e5 6005 if (shutdown_requested) {
3475187d 6006 ret = EXCP_INTERRUPT;
b2f76161
AJ
6007 if (no_shutdown) {
6008 vm_stop(0);
6009 no_shutdown = 0;
6010 }
6011 else
6012 break;
5905b2e5
FB
6013 }
6014 if (reset_requested) {
6015 reset_requested = 0;
6016 qemu_system_reset();
3475187d
FB
6017 ret = EXCP_INTERRUPT;
6018 }
6019 if (powerdown_requested) {
6020 powerdown_requested = 0;
6021 qemu_system_powerdown();
6022 ret = EXCP_INTERRUPT;
5905b2e5 6023 }
95b01009 6024 if (unlikely(ret == EXCP_DEBUG)) {
5905b2e5
FB
6025 vm_stop(EXCP_DEBUG);
6026 }
bd967e05 6027 /* If all cpus are halted then wait until the next IRQ */
5905b2e5 6028 /* XXX: use timeout computed from timers */
2e70f6ef
PB
6029 if (ret == EXCP_HALTED) {
6030 if (use_icount) {
6031 int64_t add;
6032 int64_t delta;
6033 /* Advance virtual time to the next event. */
6034 if (use_icount == 1) {
6035 /* When not using an adaptive execution frequency
6036 we tend to get badly out of sync with real time,
bf20dc07 6037 so just delay for a reasonable amount of time. */
2e70f6ef
PB
6038 delta = 0;
6039 } else {
6040 delta = cpu_get_icount() - cpu_get_clock();
6041 }
6042 if (delta > 0) {
6043 /* If virtual time is ahead of real time then just
6044 wait for IO. */
6045 timeout = (delta / 1000000) + 1;
6046 } else {
6047 /* Wait for either IO to occur or the next
6048 timer event. */
6049 add = qemu_next_deadline();
6050 /* We advance the timer before checking for IO.
6051 Limit the amount we advance so that early IO
6052 activity won't get the guest too far ahead. */
6053 if (add > 10000000)
6054 add = 10000000;
6055 delta += add;
6056 add = (add + (1 << icount_time_shift) - 1)
6057 >> icount_time_shift;
6058 qemu_icount += add;
6059 timeout = delta / 1000000;
6060 if (timeout < 0)
6061 timeout = 0;
6062 }
6063 } else {
0a1af395 6064 timeout = 5000;
2e70f6ef
PB
6065 }
6066 } else {
5905b2e5 6067 timeout = 0;
2e70f6ef 6068 }
5905b2e5 6069 } else {
98448f58
BS
6070 if (shutdown_requested) {
6071 ret = EXCP_INTERRUPT;
5b08fc10 6072 break;
98448f58 6073 }
0a1af395 6074 timeout = 5000;
5905b2e5 6075 }
89bfc105
FB
6076#ifdef CONFIG_PROFILER
6077 ti = profile_getclock();
6078#endif
5905b2e5 6079 main_loop_wait(timeout);
89bfc105
FB
6080#ifdef CONFIG_PROFILER
6081 dev_time += profile_getclock() - ti;
6082#endif
b4608c04 6083 }
34865134
FB
6084 cpu_disable_ticks();
6085 return ret;
b4608c04
FB
6086}
6087
15f82208 6088static void help(int exitcode)
0824d6fc 6089{
68d0f70e 6090 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
0db63474 6091 "usage: %s [options] [disk_image]\n"
0824d6fc 6092 "\n"
a20dd508 6093 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
fc01f7e7 6094 "\n"
a20dd508 6095 "Standard options:\n"
cc1daa40 6096 "-M machine select emulated machine (-M ? for list)\n"
5adb4839 6097 "-cpu cpu select CPU (-cpu ? for list)\n"
c45886db 6098 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
36b486bb
FB
6099 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
6100 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
c4b1fcc0 6101 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
a1620fac
AJ
6102 "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
6103 " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
9f7965c7 6104 " [,cache=writethrough|writeback|none][,format=f]\n"
e4bcb14c 6105 " use 'file' as a drive image\n"
3e3d5815 6106 "-mtdblock file use 'file' as on-board Flash memory image\n"
a1bb27b1 6107 "-sd file use 'file' as SecureDigital card image\n"
86f55663 6108 "-pflash file use 'file' as a parallel flash image\n"
eec85c2a 6109 "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
667accab
TS
6110 "-snapshot write to temporary files instead of disk image files\n"
6111#ifdef CONFIG_SDL
43523e93 6112 "-no-frame open SDL window without a frame and window decorations\n"
3780e197 6113 "-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n"
667accab
TS
6114 "-no-quit disable SDL window close capability\n"
6115#endif
52ca8d6a
FB
6116#ifdef TARGET_I386
6117 "-no-fd-bootchk disable boot signature checking for floppy disks\n"
6118#endif
a00bad7e 6119 "-m megs set virtual RAM size to megs MB [default=%d]\n"
91fc2119 6120 "-smp n set the number of CPUs to 'n' [default=1]\n"
c4b1fcc0 6121 "-nographic disable graphical output and redirect serial I/Os to console\n"
a171fe39 6122 "-portrait rotate graphical output 90 deg left (only PXA LCD)\n"
4ca0074c 6123#ifndef _WIN32
667accab 6124 "-k language use keyboard layout (for example \"fr\" for French)\n"
4ca0074c 6125#endif
1d14ffa9 6126#ifdef HAS_AUDIO
1d14ffa9 6127 "-audio-help print list of audio drivers and their options\n"
c0fe3827
FB
6128 "-soundhw c1,... enable audio support\n"
6129 " and only specified sound cards (comma separated list)\n"
6130 " use -soundhw ? to get the list of supported cards\n"
6a36d84e 6131 " use -soundhw all to enable all of them\n"
1d14ffa9 6132#endif
3893c124 6133 "-vga [std|cirrus|vmware]\n"
6134 " select video card type\n"
89980284 6135 "-localtime set the real time clock to local time [default=utc]\n"
d63d307f 6136 "-full-screen start in full screen\n"
a09db21f
FB
6137#ifdef TARGET_I386
6138 "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n"
6139#endif
b389dbfb
FB
6140 "-usb enable the USB driver (will be the default soon)\n"
6141 "-usbdevice name add the host or guest USB device 'name'\n"
6f7e9aec
FB
6142#if defined(TARGET_PPC) || defined(TARGET_SPARC)
6143 "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n"
bb0c6722 6144#endif
c35734b2 6145 "-name string set the name of the guest\n"
8fcb1b90 6146 "-uuid %%08x-%%04x-%%04x-%%04x-%%012x specify machine UUID\n"
c4b1fcc0
FB
6147 "\n"
6148 "Network options:\n"
a41b2ff2 6149 "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
7c9d8e07 6150 " create a new Network Interface Card and connect it to VLAN 'n'\n"
c20709aa 6151#ifdef CONFIG_SLIRP
115defd1
PB
6152 "-net user[,vlan=n][,hostname=host]\n"
6153 " connect the user mode network stack to VLAN 'n' and send\n"
6154 " hostname 'host' to DHCP clients\n"
7c9d8e07 6155#endif
7fb843f8
FB
6156#ifdef _WIN32
6157 "-net tap[,vlan=n],ifname=name\n"
6158 " connect the host TAP network interface to VLAN 'n'\n"
6159#else
b46a8906
TS
6160 "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file][,downscript=dfile]\n"
6161 " connect the host TAP network interface to VLAN 'n' and use the\n"
6162 " network scripts 'file' (default=%s)\n"
6163 " and 'dfile' (default=%s);\n"
6164 " use '[down]script=no' to disable script execution;\n"
7c9d8e07 6165 " use 'fd=h' to connect to an already opened TAP interface\n"
7fb843f8 6166#endif
6a00d601 6167 "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
7c9d8e07 6168 " connect the vlan 'n' to another VLAN using a socket connection\n"
3d830459
FB
6169 "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
6170 " connect the vlan 'n' to multicast maddr and port\n"
8a16d273
TS
6171#ifdef CONFIG_VDE
6172 "-net vde[,vlan=n][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
6173 " connect the vlan 'n' to port 'n' of a vde switch running\n"
6174 " on host and listening for incoming connections on 'socketpath'.\n"
6175 " Use group 'groupname' and mode 'octalmode' to change default\n"
6176 " ownership and permissions for communication port.\n"
6177#endif
7c9d8e07
FB
6178 "-net none use it alone to have zero network devices; if no -net option\n"
6179 " is provided, the default is '-net nic -net user'\n"
6180 "\n"
6181#ifdef CONFIG_SLIRP
0db1137d 6182 "-tftp dir allow tftp access to files in dir [-net user]\n"
47d5d01a 6183 "-bootp file advertise file in BOOTP replies\n"
7c9d8e07
FB
6184#ifndef _WIN32
6185 "-smb dir allow SMB access to files in 'dir' [-net user]\n"
c94c8d64 6186#endif
9bf05444 6187 "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
7c9d8e07 6188 " redirect TCP or UDP connections from host to guest [-net user]\n"
c20709aa 6189#endif
a20dd508 6190 "\n"
c4b1fcc0 6191 "Linux boot specific:\n"
a20dd508
FB
6192 "-kernel bzImage use 'bzImage' as kernel image\n"
6193 "-append cmdline use 'cmdline' as kernel command line\n"
6194 "-initrd file use 'file' as initial ram disk\n"
fc01f7e7 6195 "\n"
330d0414 6196 "Debug/Expert options:\n"
82c643ff
FB
6197 "-monitor dev redirect the monitor to char device 'dev'\n"
6198 "-serial dev redirect the serial port to char device 'dev'\n"
6508fe59 6199 "-parallel dev redirect the parallel port to char device 'dev'\n"
f7cce898 6200 "-pidfile file Write PID to 'file'\n"
cd6f1169 6201 "-S freeze CPU at startup (use 'c' to start execution)\n"
cfc3475a
PB
6202 "-s wait gdb connection to port\n"
6203 "-p port set gdb connection port [default=%s]\n"
f193c797 6204 "-d item1,... output log to %s (use -d ? for a list of log items)\n"
46d4767d
FB
6205 "-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n"
6206 " translation (t=none or lba) (usually qemu can guess them)\n"
87b47350 6207 "-L path set the directory for the BIOS, VGA BIOS and keymaps\n"
d993e026 6208#ifdef USE_KQEMU
6515b203 6209 "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n"
d993e026
FB
6210 "-no-kqemu disable KQEMU kernel module usage\n"
6211#endif
bb0c6722 6212#ifdef TARGET_I386
6515b203 6213 "-no-acpi disable ACPI\n"
4d3b6f6e
AZ
6214#endif
6215#ifdef CONFIG_CURSES
6216 "-curses use a curses/ncurses interface instead of SDL\n"
bb0c6722 6217#endif
d1beab82 6218 "-no-reboot exit instead of rebooting\n"
b2f76161 6219 "-no-shutdown stop before shutdown\n"
a8080006 6220 "-loadvm [tag|id] start right away with a saved state (loadvm in monitor)\n"
24236869 6221 "-vnc display start a VNC server on display\n"
71e3ceb8
TS
6222#ifndef _WIN32
6223 "-daemonize daemonize QEMU after initializing\n"
6224#endif
9ae02555 6225 "-option-rom rom load a file, rom, into the option ROM space\n"
66508601
BS
6226#ifdef TARGET_SPARC
6227 "-prom-env variable=value set OpenBIOS nvram variables\n"
6228#endif
f3dcfada 6229 "-clock force the use of the given methods for timer alarm.\n"
3adda04c 6230 " To see what timers are available use -clock ?\n"
bce61846 6231 "-startdate select initial date of the clock\n"
2e70f6ef 6232 "-icount [N|auto]\n"
dd5d6fe9 6233 " Enable virtual instruction counter with 2^N clock ticks per instruction\n"
0824d6fc 6234 "\n"
82c643ff 6235 "During emulation, the following keys are useful:\n"
032a8c9e
FB
6236 "ctrl-alt-f toggle full screen\n"
6237 "ctrl-alt-n switch to virtual console 'n'\n"
6238 "ctrl-alt toggle mouse and keyboard grab\n"
82c643ff
FB
6239 "\n"
6240 "When using -nographic, press 'ctrl-a h' to get some help.\n"
6241 ,
0db63474 6242 "qemu",
a00bad7e 6243 DEFAULT_RAM_SIZE,
7c9d8e07 6244#ifndef _WIN32
a00bad7e 6245 DEFAULT_NETWORK_SCRIPT,
b46a8906 6246 DEFAULT_NETWORK_DOWN_SCRIPT,
7c9d8e07 6247#endif
6e44ba7f 6248 DEFAULT_GDBSTUB_PORT,
bce61846 6249 "/tmp/qemu.log");
15f82208 6250 exit(exitcode);
0824d6fc
FB
6251}
6252
cd6f1169
FB
6253#define HAS_ARG 0x0001
6254
6255enum {
6256 QEMU_OPTION_h,
6257
cc1daa40 6258 QEMU_OPTION_M,
94fc95cd 6259 QEMU_OPTION_cpu,
cd6f1169
FB
6260 QEMU_OPTION_fda,
6261 QEMU_OPTION_fdb,
6262 QEMU_OPTION_hda,
6263 QEMU_OPTION_hdb,
6264 QEMU_OPTION_hdc,
6265 QEMU_OPTION_hdd,
e4bcb14c 6266 QEMU_OPTION_drive,
cd6f1169 6267 QEMU_OPTION_cdrom,
3e3d5815 6268 QEMU_OPTION_mtdblock,
a1bb27b1 6269 QEMU_OPTION_sd,
86f55663 6270 QEMU_OPTION_pflash,
cd6f1169
FB
6271 QEMU_OPTION_boot,
6272 QEMU_OPTION_snapshot,
52ca8d6a
FB
6273#ifdef TARGET_I386
6274 QEMU_OPTION_no_fd_bootchk,
6275#endif
cd6f1169
FB
6276 QEMU_OPTION_m,
6277 QEMU_OPTION_nographic,
a171fe39 6278 QEMU_OPTION_portrait,
1d14ffa9 6279#ifdef HAS_AUDIO
1d14ffa9
FB
6280 QEMU_OPTION_audio_help,
6281 QEMU_OPTION_soundhw,
6282#endif
cd6f1169 6283
7c9d8e07 6284 QEMU_OPTION_net,
c7f74643 6285 QEMU_OPTION_tftp,
47d5d01a 6286 QEMU_OPTION_bootp,
9d728e8c 6287 QEMU_OPTION_smb,
9bf05444 6288 QEMU_OPTION_redir,
cd6f1169
FB
6289
6290 QEMU_OPTION_kernel,
6291 QEMU_OPTION_append,
6292 QEMU_OPTION_initrd,
6293
6294 QEMU_OPTION_S,
6295 QEMU_OPTION_s,
6296 QEMU_OPTION_p,
6297 QEMU_OPTION_d,
6298 QEMU_OPTION_hdachs,
6299 QEMU_OPTION_L,
1192dad8 6300 QEMU_OPTION_bios,
3d11d0eb 6301 QEMU_OPTION_k,
ee22c2f7 6302 QEMU_OPTION_localtime,
e9b137c2 6303 QEMU_OPTION_g,
3893c124 6304 QEMU_OPTION_vga,
20d8a3ed 6305 QEMU_OPTION_echr,
82c643ff
FB
6306 QEMU_OPTION_monitor,
6307 QEMU_OPTION_serial,
6508fe59 6308 QEMU_OPTION_parallel,
d63d307f
FB
6309 QEMU_OPTION_loadvm,
6310 QEMU_OPTION_full_screen,
43523e93 6311 QEMU_OPTION_no_frame,
3780e197 6312 QEMU_OPTION_alt_grab,
667accab 6313 QEMU_OPTION_no_quit,
f7cce898 6314 QEMU_OPTION_pidfile,
d993e026 6315 QEMU_OPTION_no_kqemu,
89bfc105 6316 QEMU_OPTION_kernel_kqemu,
a09db21f 6317 QEMU_OPTION_win2k_hack,
bb36d470 6318 QEMU_OPTION_usb,
a594cfbf 6319 QEMU_OPTION_usbdevice,
6a00d601 6320 QEMU_OPTION_smp,
24236869 6321 QEMU_OPTION_vnc,
6515b203 6322 QEMU_OPTION_no_acpi,
4d3b6f6e 6323 QEMU_OPTION_curses,
d1beab82 6324 QEMU_OPTION_no_reboot,
b2f76161 6325 QEMU_OPTION_no_shutdown,
9467cd46 6326 QEMU_OPTION_show_cursor,
71e3ceb8 6327 QEMU_OPTION_daemonize,
9ae02555 6328 QEMU_OPTION_option_rom,
c35734b2
TS
6329 QEMU_OPTION_semihosting,
6330 QEMU_OPTION_name,
66508601 6331 QEMU_OPTION_prom_env,
2b8f2d41 6332 QEMU_OPTION_old_param,
f3dcfada 6333 QEMU_OPTION_clock,
7e0af5d0 6334 QEMU_OPTION_startdate,
26a5f13b 6335 QEMU_OPTION_tb_size,
2e70f6ef 6336 QEMU_OPTION_icount,
8fcb1b90 6337 QEMU_OPTION_uuid,
5bb7910a 6338 QEMU_OPTION_incoming,
cd6f1169
FB
6339};
6340
6341typedef struct QEMUOption {
6342 const char *name;
6343 int flags;
6344 int index;
6345} QEMUOption;
6346
dbed7e40 6347static const QEMUOption qemu_options[] = {
cd6f1169 6348 { "h", 0, QEMU_OPTION_h },
64423fb2 6349 { "help", 0, QEMU_OPTION_h },
cd6f1169 6350
cc1daa40 6351 { "M", HAS_ARG, QEMU_OPTION_M },
94fc95cd 6352 { "cpu", HAS_ARG, QEMU_OPTION_cpu },
cd6f1169
FB
6353 { "fda", HAS_ARG, QEMU_OPTION_fda },
6354 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
6355 { "hda", HAS_ARG, QEMU_OPTION_hda },
6356 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
6357 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
6358 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
e4bcb14c 6359 { "drive", HAS_ARG, QEMU_OPTION_drive },
cd6f1169 6360 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
3e3d5815 6361 { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock },
a1bb27b1 6362 { "sd", HAS_ARG, QEMU_OPTION_sd },
86f55663 6363 { "pflash", HAS_ARG, QEMU_OPTION_pflash },
cd6f1169
FB
6364 { "boot", HAS_ARG, QEMU_OPTION_boot },
6365 { "snapshot", 0, QEMU_OPTION_snapshot },
52ca8d6a
FB
6366#ifdef TARGET_I386
6367 { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
6368#endif
cd6f1169
FB
6369 { "m", HAS_ARG, QEMU_OPTION_m },
6370 { "nographic", 0, QEMU_OPTION_nographic },
a171fe39 6371 { "portrait", 0, QEMU_OPTION_portrait },
3d11d0eb 6372 { "k", HAS_ARG, QEMU_OPTION_k },
1d14ffa9 6373#ifdef HAS_AUDIO
1d14ffa9
FB
6374 { "audio-help", 0, QEMU_OPTION_audio_help },
6375 { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
6376#endif
cd6f1169 6377
7c9d8e07 6378 { "net", HAS_ARG, QEMU_OPTION_net},
158156d1 6379#ifdef CONFIG_SLIRP
c7f74643 6380 { "tftp", HAS_ARG, QEMU_OPTION_tftp },
47d5d01a 6381 { "bootp", HAS_ARG, QEMU_OPTION_bootp },
c94c8d64 6382#ifndef _WIN32
9d728e8c 6383 { "smb", HAS_ARG, QEMU_OPTION_smb },
c94c8d64 6384#endif
9bf05444 6385 { "redir", HAS_ARG, QEMU_OPTION_redir },
158156d1 6386#endif
cd6f1169
FB
6387
6388 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
6389 { "append", HAS_ARG, QEMU_OPTION_append },
6390 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
6391
6392 { "S", 0, QEMU_OPTION_S },
6393 { "s", 0, QEMU_OPTION_s },
6394 { "p", HAS_ARG, QEMU_OPTION_p },
6395 { "d", HAS_ARG, QEMU_OPTION_d },
6396 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
6397 { "L", HAS_ARG, QEMU_OPTION_L },
1192dad8 6398 { "bios", HAS_ARG, QEMU_OPTION_bios },
d993e026
FB
6399#ifdef USE_KQEMU
6400 { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
89bfc105 6401 { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
d993e026 6402#endif
6f7e9aec 6403#if defined(TARGET_PPC) || defined(TARGET_SPARC)
e9b137c2 6404 { "g", 1, QEMU_OPTION_g },
77d4bc34 6405#endif
ee22c2f7 6406 { "localtime", 0, QEMU_OPTION_localtime },
3893c124 6407 { "vga", HAS_ARG, QEMU_OPTION_vga },
8b6e0729
AZ
6408 { "echr", HAS_ARG, QEMU_OPTION_echr },
6409 { "monitor", HAS_ARG, QEMU_OPTION_monitor },
6410 { "serial", HAS_ARG, QEMU_OPTION_serial },
6411 { "parallel", HAS_ARG, QEMU_OPTION_parallel },
d63d307f
FB
6412 { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
6413 { "full-screen", 0, QEMU_OPTION_full_screen },
667accab 6414#ifdef CONFIG_SDL
43523e93 6415 { "no-frame", 0, QEMU_OPTION_no_frame },
3780e197 6416 { "alt-grab", 0, QEMU_OPTION_alt_grab },
667accab
TS
6417 { "no-quit", 0, QEMU_OPTION_no_quit },
6418#endif
f7cce898 6419 { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
a09db21f 6420 { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
a594cfbf 6421 { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
6a00d601 6422 { "smp", HAS_ARG, QEMU_OPTION_smp },
24236869 6423 { "vnc", HAS_ARG, QEMU_OPTION_vnc },
4d3b6f6e
AZ
6424#ifdef CONFIG_CURSES
6425 { "curses", 0, QEMU_OPTION_curses },
6426#endif
8fcb1b90 6427 { "uuid", HAS_ARG, QEMU_OPTION_uuid },
96d30e48 6428
1f04275e 6429 /* temporary options */
a594cfbf 6430 { "usb", 0, QEMU_OPTION_usb },
6515b203 6431 { "no-acpi", 0, QEMU_OPTION_no_acpi },
d1beab82 6432 { "no-reboot", 0, QEMU_OPTION_no_reboot },
b2f76161 6433 { "no-shutdown", 0, QEMU_OPTION_no_shutdown },
9467cd46 6434 { "show-cursor", 0, QEMU_OPTION_show_cursor },
71e3ceb8 6435 { "daemonize", 0, QEMU_OPTION_daemonize },
9ae02555 6436 { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
a87295e8 6437#if defined(TARGET_ARM) || defined(TARGET_M68K)
8e71621f
PB
6438 { "semihosting", 0, QEMU_OPTION_semihosting },
6439#endif
c35734b2 6440 { "name", HAS_ARG, QEMU_OPTION_name },
66508601
BS
6441#if defined(TARGET_SPARC)
6442 { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
2b8f2d41
AZ
6443#endif
6444#if defined(TARGET_ARM)
6445 { "old-param", 0, QEMU_OPTION_old_param },
66508601 6446#endif
f3dcfada 6447 { "clock", HAS_ARG, QEMU_OPTION_clock },
7e0af5d0 6448 { "startdate", HAS_ARG, QEMU_OPTION_startdate },
26a5f13b 6449 { "tb-size", HAS_ARG, QEMU_OPTION_tb_size },
2e70f6ef 6450 { "icount", HAS_ARG, QEMU_OPTION_icount },
5bb7910a 6451 { "incoming", HAS_ARG, QEMU_OPTION_incoming },
cd6f1169 6452 { NULL },
fc01f7e7
FB
6453};
6454
5905b2e5
FB
6455/* password input */
6456
2bac6019
AZ
6457int qemu_key_check(BlockDriverState *bs, const char *name)
6458{
6459 char password[256];
6460 int i;
6461
6462 if (!bdrv_is_encrypted(bs))
6463 return 0;
6464
6465 term_printf("%s is encrypted.\n", name);
6466 for(i = 0; i < 3; i++) {
6467 monitor_readline("Password: ", 1, password, sizeof(password));
6468 if (bdrv_set_key(bs, password) == 0)
6469 return 0;
6470 term_printf("invalid password\n");
6471 }
6472 return -EPERM;
6473}
6474
83ab7950
AL
6475static BlockDriverState *get_bdrv(int index)
6476{
6477 if (index > nb_drives)
6478 return NULL;
6479 return drives_table[index].bdrv;
6480}
6481
5905b2e5
FB
6482static void read_passwords(void)
6483{
6484 BlockDriverState *bs;
2bac6019 6485 int i;
5905b2e5 6486
83ab7950
AL
6487 for(i = 0; i < 6; i++) {
6488 bs = get_bdrv(i);
6489 if (bs)
6490 qemu_key_check(bs, bdrv_get_device_name(bs));
5905b2e5
FB
6491 }
6492}
6493
1d14ffa9 6494#ifdef HAS_AUDIO
6a36d84e 6495struct soundhw soundhw[] = {
b00052e4 6496#ifdef HAS_AUDIO_CHOICE
4ce7ff6e 6497#if defined(TARGET_I386) || defined(TARGET_MIPS)
fd06c375
FB
6498 {
6499 "pcspk",
6500 "PC speaker",
6501 0,
6502 1,
6503 { .init_isa = pcspk_audio_init }
6504 },
6505#endif
6a36d84e
FB
6506 {
6507 "sb16",
6508 "Creative Sound Blaster 16",
6509 0,
6510 1,
6511 { .init_isa = SB16_init }
6512 },
6513
cc53d26d 6514#ifdef CONFIG_CS4231A
6515 {
6516 "cs4231a",
6517 "CS4231A",
6518 0,
6519 1,
6520 { .init_isa = cs4231a_init }
6521 },
6522#endif
6523
1d14ffa9 6524#ifdef CONFIG_ADLIB
6a36d84e
FB
6525 {
6526 "adlib",
1d14ffa9 6527#ifdef HAS_YMF262
6a36d84e 6528 "Yamaha YMF262 (OPL3)",
1d14ffa9 6529#else
6a36d84e 6530 "Yamaha YM3812 (OPL2)",
1d14ffa9 6531#endif
6a36d84e
FB
6532 0,
6533 1,
6534 { .init_isa = Adlib_init }
6535 },
1d14ffa9 6536#endif
6a36d84e 6537
1d14ffa9 6538#ifdef CONFIG_GUS
6a36d84e
FB
6539 {
6540 "gus",
6541 "Gravis Ultrasound GF1",
6542 0,
6543 1,
6544 { .init_isa = GUS_init }
6545 },
1d14ffa9 6546#endif
6a36d84e 6547
e5c9a13e
AZ
6548#ifdef CONFIG_AC97
6549 {
6550 "ac97",
6551 "Intel 82801AA AC97 Audio",
6552 0,
6553 0,
6554 { .init_pci = ac97_init }
6555 },
6556#endif
6557
6a36d84e
FB
6558 {
6559 "es1370",
6560 "ENSONIQ AudioPCI ES1370",
6561 0,
6562 0,
6563 { .init_pci = es1370_init }
6564 },
b00052e4 6565#endif
6a36d84e
FB
6566
6567 { NULL, NULL, 0, 0, { NULL } }
6568};
6569
6570static void select_soundhw (const char *optarg)
6571{
6572 struct soundhw *c;
6573
6574 if (*optarg == '?') {
6575 show_valid_cards:
6576
6577 printf ("Valid sound card names (comma separated):\n");
6578 for (c = soundhw; c->name; ++c) {
6579 printf ("%-11s %s\n", c->name, c->descr);
6580 }
6581 printf ("\n-soundhw all will enable all of the above\n");
1d14ffa9
FB
6582 exit (*optarg != '?');
6583 }
6584 else {
6a36d84e 6585 size_t l;
1d14ffa9
FB
6586 const char *p;
6587 char *e;
6588 int bad_card = 0;
6589
6a36d84e
FB
6590 if (!strcmp (optarg, "all")) {
6591 for (c = soundhw; c->name; ++c) {
6592 c->enabled = 1;
6593 }
6594 return;
6595 }
1d14ffa9 6596
6a36d84e 6597 p = optarg;
1d14ffa9
FB
6598 while (*p) {
6599 e = strchr (p, ',');
6600 l = !e ? strlen (p) : (size_t) (e - p);
6a36d84e
FB
6601
6602 for (c = soundhw; c->name; ++c) {
6603 if (!strncmp (c->name, p, l)) {
6604 c->enabled = 1;
1d14ffa9
FB
6605 break;
6606 }
6607 }
6a36d84e
FB
6608
6609 if (!c->name) {
1d14ffa9
FB
6610 if (l > 80) {
6611 fprintf (stderr,
6612 "Unknown sound card name (too big to show)\n");
6613 }
6614 else {
6615 fprintf (stderr, "Unknown sound card name `%.*s'\n",
6616 (int) l, p);
6617 }
6618 bad_card = 1;
6619 }
6620 p += l + (e != NULL);
6621 }
6622
6623 if (bad_card)
6624 goto show_valid_cards;
6625 }
6626}
6627#endif
6628
3893c124 6629static void select_vgahw (const char *p)
6630{
6631 const char *opts;
6632
6633 if (strstart(p, "std", &opts)) {
6634 cirrus_vga_enabled = 0;
6635 vmsvga_enabled = 0;
6636 } else if (strstart(p, "cirrus", &opts)) {
6637 cirrus_vga_enabled = 1;
6638 vmsvga_enabled = 0;
6639 } else if (strstart(p, "vmware", &opts)) {
6640 cirrus_vga_enabled = 0;
6641 vmsvga_enabled = 1;
6642 } else {
6643 invalid_vga:
6644 fprintf(stderr, "Unknown vga type: %s\n", p);
6645 exit(1);
6646 }
cb5a7aa8 6647 while (*opts) {
6648 const char *nextopt;
6649
6650 if (strstart(opts, ",retrace=", &nextopt)) {
6651 opts = nextopt;
6652 if (strstart(opts, "dumb", &nextopt))
6653 vga_retrace_method = VGA_RETRACE_DUMB;
6654 else if (strstart(opts, "precise", &nextopt))
6655 vga_retrace_method = VGA_RETRACE_PRECISE;
6656 else goto invalid_vga;
6657 } else goto invalid_vga;
6658 opts = nextopt;
6659 }
3893c124 6660}
6661
3587d7e6
FB
6662#ifdef _WIN32
6663static BOOL WINAPI qemu_ctrl_handler(DWORD type)
6664{
6665 exit(STATUS_CONTROL_C_EXIT);
6666 return TRUE;
6667}
6668#endif
6669
8fcb1b90
BS
6670static int qemu_uuid_parse(const char *str, uint8_t *uuid)
6671{
6672 int ret;
6673
6674 if(strlen(str) != 36)
6675 return -1;
6676
6677 ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
6678 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
6679 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
6680
6681 if(ret != 16)
6682 return -1;
6683
6684 return 0;
6685}
6686
7c9d8e07 6687#define MAX_NET_CLIENTS 32
c20709aa 6688
5b08fc10
AL
6689#ifndef _WIN32
6690
6691static void termsig_handler(int signal)
6692{
6693 qemu_system_shutdown_request();
6694}
6695
6f9e3801 6696static void termsig_setup(void)
5b08fc10
AL
6697{
6698 struct sigaction act;
6699
6700 memset(&act, 0, sizeof(act));
6701 act.sa_handler = termsig_handler;
6702 sigaction(SIGINT, &act, NULL);
6703 sigaction(SIGHUP, &act, NULL);
6704 sigaction(SIGTERM, &act, NULL);
6705}
6706
6707#endif
6708
0824d6fc
FB
6709int main(int argc, char **argv)
6710{
67b915a5 6711#ifdef CONFIG_GDBSTUB
cfc3475a
PB
6712 int use_gdbstub;
6713 const char *gdbstub_port;
67b915a5 6714#endif
28c5af54 6715 uint32_t boot_devices_bitmap = 0;
e4bcb14c 6716 int i;
28c5af54 6717 int snapshot, linux_boot, net_boot;
7f7f9873 6718 const char *initrd_filename;
a20dd508 6719 const char *kernel_filename, *kernel_cmdline;
28c5af54 6720 const char *boot_devices = "";
313aa567 6721 DisplayState *ds = &display_state;
46d4767d 6722 int cyls, heads, secs, translation;
fd5f393a 6723 const char *net_clients[MAX_NET_CLIENTS];
7c9d8e07 6724 int nb_net_clients;
e4bcb14c 6725 int hda_index;
cd6f1169
FB
6726 int optind;
6727 const char *r, *optarg;
82c643ff 6728 CharDriverState *monitor_hd;
fd5f393a
PB
6729 const char *monitor_device;
6730 const char *serial_devices[MAX_SERIAL_PORTS];
8d11df9e 6731 int serial_device_index;
fd5f393a 6732 const char *parallel_devices[MAX_PARALLEL_PORTS];
6508fe59 6733 int parallel_device_index;
d63d307f 6734 const char *loadvm = NULL;
cc1daa40 6735 QEMUMachine *machine;
94fc95cd 6736 const char *cpu_model;
fd5f393a 6737 const char *usb_devices[MAX_USB_CMDLINE];
a594cfbf 6738 int usb_devices_index;
71e3ceb8 6739 int fds[2];
26a5f13b 6740 int tb_size;
93815bc2 6741 const char *pid_file = NULL;
833c7174 6742 VLANState *vlan;
41bd639b 6743 int autostart;
5bb7910a 6744 const char *incoming = NULL;
0bd48850
FB
6745
6746 LIST_INIT (&vm_change_state_head);
be995c27
FB
6747#ifndef _WIN32
6748 {
6749 struct sigaction act;
6750 sigfillset(&act.sa_mask);
6751 act.sa_flags = 0;
6752 act.sa_handler = SIG_IGN;
6753 sigaction(SIGPIPE, &act, NULL);
6754 }
3587d7e6
FB
6755#else
6756 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
a8e5ac33
FB
6757 /* Note: cpu_interrupt() is currently not SMP safe, so we force
6758 QEMU to run on a single CPU */
6759 {
6760 HANDLE h;
6761 DWORD mask, smask;
6762 int i;
6763 h = GetCurrentProcess();
6764 if (GetProcessAffinityMask(h, &mask, &smask)) {
6765 for(i = 0; i < 32; i++) {
6766 if (mask & (1 << i))
6767 break;
6768 }
6769 if (i != 32) {
6770 mask = 1 << i;
6771 SetProcessAffinityMask(h, mask);
6772 }
6773 }
6774 }
67b915a5 6775#endif
be995c27 6776
cc1daa40
FB
6777 register_machines();
6778 machine = first_machine;
94fc95cd 6779 cpu_model = NULL;
fc01f7e7 6780 initrd_filename = NULL;
4fc5d071 6781 ram_size = 0;
313aa567 6782 vga_ram_size = VGA_RAM_SIZE;
67b915a5 6783#ifdef CONFIG_GDBSTUB
b4608c04 6784 use_gdbstub = 0;
c636bb66 6785 gdbstub_port = DEFAULT_GDBSTUB_PORT;
67b915a5 6786#endif
33e3963e 6787 snapshot = 0;
a20dd508 6788 nographic = 0;
4d3b6f6e 6789 curses = 0;
a20dd508
FB
6790 kernel_filename = NULL;
6791 kernel_cmdline = "";
c4b1fcc0 6792 cyls = heads = secs = 0;
46d4767d 6793 translation = BIOS_ATA_TRANSLATION_AUTO;
c60e08d9 6794 monitor_device = "vc";
c4b1fcc0 6795
c75a823c 6796 serial_devices[0] = "vc:80Cx24C";
8d11df9e 6797 for(i = 1; i < MAX_SERIAL_PORTS; i++)
fd5f393a 6798 serial_devices[i] = NULL;
8d11df9e 6799 serial_device_index = 0;
3b46e624 6800
c75a823c 6801 parallel_devices[0] = "vc:640x480";
6508fe59 6802 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
fd5f393a 6803 parallel_devices[i] = NULL;
6508fe59 6804 parallel_device_index = 0;
3b46e624 6805
a594cfbf 6806 usb_devices_index = 0;
3b46e624 6807
7c9d8e07 6808 nb_net_clients = 0;
e4bcb14c
TS
6809 nb_drives = 0;
6810 nb_drives_opt = 0;
6811 hda_index = -1;
7c9d8e07
FB
6812
6813 nb_nics = 0;
3b46e624 6814
26a5f13b 6815 tb_size = 0;
41bd639b
BS
6816 autostart= 1;
6817
cd6f1169 6818 optind = 1;
0824d6fc 6819 for(;;) {
cd6f1169 6820 if (optind >= argc)
0824d6fc 6821 break;
cd6f1169
FB
6822 r = argv[optind];
6823 if (r[0] != '-') {
609497ab 6824 hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
cd6f1169
FB
6825 } else {
6826 const QEMUOption *popt;
6827
6828 optind++;
dff5efc8
PB
6829 /* Treat --foo the same as -foo. */
6830 if (r[1] == '-')
6831 r++;
cd6f1169
FB
6832 popt = qemu_options;
6833 for(;;) {
6834 if (!popt->name) {
5fafdf24 6835 fprintf(stderr, "%s: invalid option -- '%s'\n",
cd6f1169
FB
6836 argv[0], r);
6837 exit(1);
6838 }
6839 if (!strcmp(popt->name, r + 1))
6840 break;
6841 popt++;
6842 }
6843 if (popt->flags & HAS_ARG) {
6844 if (optind >= argc) {
6845 fprintf(stderr, "%s: option '%s' requires an argument\n",
6846 argv[0], r);
6847 exit(1);
6848 }
6849 optarg = argv[optind++];
6850 } else {
6851 optarg = NULL;
6852 }
6853
6854 switch(popt->index) {
cc1daa40
FB
6855 case QEMU_OPTION_M:
6856 machine = find_machine(optarg);
6857 if (!machine) {
6858 QEMUMachine *m;
6859 printf("Supported machines are:\n");
6860 for(m = first_machine; m != NULL; m = m->next) {
6861 printf("%-10s %s%s\n",
5fafdf24 6862 m->name, m->desc,
cc1daa40
FB
6863 m == first_machine ? " (default)" : "");
6864 }
15f82208 6865 exit(*optarg != '?');
cc1daa40
FB
6866 }
6867 break;
94fc95cd
JM
6868 case QEMU_OPTION_cpu:
6869 /* hw initialization will check this */
15f82208 6870 if (*optarg == '?') {
c732abe2
JM
6871/* XXX: implement xxx_cpu_list for targets that still miss it */
6872#if defined(cpu_list)
6873 cpu_list(stdout, &fprintf);
94fc95cd 6874#endif
15f82208 6875 exit(0);
94fc95cd
JM
6876 } else {
6877 cpu_model = optarg;
6878 }
6879 break;
cd6f1169 6880 case QEMU_OPTION_initrd:
fc01f7e7
FB
6881 initrd_filename = optarg;
6882 break;
cd6f1169 6883 case QEMU_OPTION_hda:
e4bcb14c 6884 if (cyls == 0)
609497ab 6885 hda_index = drive_add(optarg, HD_ALIAS, 0);
e4bcb14c 6886 else
609497ab 6887 hda_index = drive_add(optarg, HD_ALIAS
e4bcb14c 6888 ",cyls=%d,heads=%d,secs=%d%s",
609497ab 6889 0, cyls, heads, secs,
e4bcb14c
TS
6890 translation == BIOS_ATA_TRANSLATION_LBA ?
6891 ",trans=lba" :
6892 translation == BIOS_ATA_TRANSLATION_NONE ?
6893 ",trans=none" : "");
6894 break;
cd6f1169 6895 case QEMU_OPTION_hdb:
cc1daa40
FB
6896 case QEMU_OPTION_hdc:
6897 case QEMU_OPTION_hdd:
609497ab 6898 drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
fc01f7e7 6899 break;
e4bcb14c 6900 case QEMU_OPTION_drive:
609497ab 6901 drive_add(NULL, "%s", optarg);
e4bcb14c 6902 break;
3e3d5815 6903 case QEMU_OPTION_mtdblock:
609497ab 6904 drive_add(optarg, MTD_ALIAS);
3e3d5815 6905 break;
a1bb27b1 6906 case QEMU_OPTION_sd:
609497ab 6907 drive_add(optarg, SD_ALIAS);
a1bb27b1 6908 break;
86f55663 6909 case QEMU_OPTION_pflash:
609497ab 6910 drive_add(optarg, PFLASH_ALIAS);
86f55663 6911 break;
cd6f1169 6912 case QEMU_OPTION_snapshot:
33e3963e
FB
6913 snapshot = 1;
6914 break;
cd6f1169 6915 case QEMU_OPTION_hdachs:
330d0414 6916 {
330d0414
FB
6917 const char *p;
6918 p = optarg;
6919 cyls = strtol(p, (char **)&p, 0);
46d4767d
FB
6920 if (cyls < 1 || cyls > 16383)
6921 goto chs_fail;
330d0414
FB
6922 if (*p != ',')
6923 goto chs_fail;
6924 p++;
6925 heads = strtol(p, (char **)&p, 0);
46d4767d
FB
6926 if (heads < 1 || heads > 16)
6927 goto chs_fail;
330d0414
FB
6928 if (*p != ',')
6929 goto chs_fail;
6930 p++;
6931 secs = strtol(p, (char **)&p, 0);
46d4767d
FB
6932 if (secs < 1 || secs > 63)
6933 goto chs_fail;
6934 if (*p == ',') {
6935 p++;
6936 if (!strcmp(p, "none"))
6937 translation = BIOS_ATA_TRANSLATION_NONE;
6938 else if (!strcmp(p, "lba"))
6939 translation = BIOS_ATA_TRANSLATION_LBA;
6940 else if (!strcmp(p, "auto"))
6941 translation = BIOS_ATA_TRANSLATION_AUTO;
6942 else
6943 goto chs_fail;
6944 } else if (*p != '\0') {
c4b1fcc0 6945 chs_fail:
46d4767d
FB
6946 fprintf(stderr, "qemu: invalid physical CHS format\n");
6947 exit(1);
c4b1fcc0 6948 }
e4bcb14c 6949 if (hda_index != -1)
609497ab
AZ
6950 snprintf(drives_opt[hda_index].opt,
6951 sizeof(drives_opt[hda_index].opt),
6952 HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s",
6953 0, cyls, heads, secs,
e4bcb14c
TS
6954 translation == BIOS_ATA_TRANSLATION_LBA ?
6955 ",trans=lba" :
6956 translation == BIOS_ATA_TRANSLATION_NONE ?
6957 ",trans=none" : "");
330d0414
FB
6958 }
6959 break;
cd6f1169 6960 case QEMU_OPTION_nographic:
a20dd508
FB
6961 nographic = 1;
6962 break;
4d3b6f6e
AZ
6963#ifdef CONFIG_CURSES
6964 case QEMU_OPTION_curses:
6965 curses = 1;
6966 break;
6967#endif
a171fe39
AZ
6968 case QEMU_OPTION_portrait:
6969 graphic_rotate = 1;
6970 break;
cd6f1169 6971 case QEMU_OPTION_kernel:
a20dd508
FB
6972 kernel_filename = optarg;
6973 break;
cd6f1169 6974 case QEMU_OPTION_append:
a20dd508 6975 kernel_cmdline = optarg;
313aa567 6976 break;
cd6f1169 6977 case QEMU_OPTION_cdrom:
609497ab 6978 drive_add(optarg, CDROM_ALIAS);
36b486bb 6979 break;
cd6f1169 6980 case QEMU_OPTION_boot:
28c5af54
JM
6981 boot_devices = optarg;
6982 /* We just do some generic consistency checks */
6983 {
6984 /* Could easily be extended to 64 devices if needed */
60fe76f3 6985 const char *p;
28c5af54
JM
6986
6987 boot_devices_bitmap = 0;
6988 for (p = boot_devices; *p != '\0'; p++) {
6989 /* Allowed boot devices are:
6990 * a b : floppy disk drives
6991 * c ... f : IDE disk drives
6992 * g ... m : machine implementation dependant drives
6993 * n ... p : network devices
6994 * It's up to each machine implementation to check
6995 * if the given boot devices match the actual hardware
6996 * implementation and firmware features.
6997 */
6998 if (*p < 'a' || *p > 'q') {
6999 fprintf(stderr, "Invalid boot device '%c'\n", *p);
7000 exit(1);
7001 }
7002 if (boot_devices_bitmap & (1 << (*p - 'a'))) {
7003 fprintf(stderr,
7004 "Boot device '%c' was given twice\n",*p);
7005 exit(1);
7006 }
7007 boot_devices_bitmap |= 1 << (*p - 'a');
7008 }
36b486bb
FB
7009 }
7010 break;
cd6f1169 7011 case QEMU_OPTION_fda:
cd6f1169 7012 case QEMU_OPTION_fdb:
609497ab 7013 drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
c45886db 7014 break;
52ca8d6a
FB
7015#ifdef TARGET_I386
7016 case QEMU_OPTION_no_fd_bootchk:
7017 fd_bootchk = 0;
7018 break;
7019#endif
7c9d8e07
FB
7020 case QEMU_OPTION_net:
7021 if (nb_net_clients >= MAX_NET_CLIENTS) {
7022 fprintf(stderr, "qemu: too many network clients\n");
c4b1fcc0
FB
7023 exit(1);
7024 }
fd5f393a 7025 net_clients[nb_net_clients] = optarg;
7c9d8e07 7026 nb_net_clients++;
702c651c 7027 break;
c7f74643
FB
7028#ifdef CONFIG_SLIRP
7029 case QEMU_OPTION_tftp:
c7f74643 7030 tftp_prefix = optarg;
9bf05444 7031 break;
47d5d01a
TS
7032 case QEMU_OPTION_bootp:
7033 bootp_filename = optarg;
7034 break;
c94c8d64 7035#ifndef _WIN32
9d728e8c
FB
7036 case QEMU_OPTION_smb:
7037 net_slirp_smb(optarg);
7038 break;
c94c8d64 7039#endif
9bf05444 7040 case QEMU_OPTION_redir:
3b46e624 7041 net_slirp_redir(optarg);
9bf05444 7042 break;
c7f74643 7043#endif
1d14ffa9 7044#ifdef HAS_AUDIO
1d14ffa9
FB
7045 case QEMU_OPTION_audio_help:
7046 AUD_help ();
7047 exit (0);
7048 break;
7049 case QEMU_OPTION_soundhw:
7050 select_soundhw (optarg);
7051 break;
7052#endif
cd6f1169 7053 case QEMU_OPTION_h:
15f82208 7054 help(0);
cd6f1169 7055 break;
00f82b8a
AJ
7056 case QEMU_OPTION_m: {
7057 uint64_t value;
7058 char *ptr;
7059
7060 value = strtoul(optarg, &ptr, 10);
7061 switch (*ptr) {
7062 case 0: case 'M': case 'm':
7063 value <<= 20;
7064 break;
7065 case 'G': case 'g':
7066 value <<= 30;
7067 break;
7068 default:
7069 fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
cd6f1169
FB
7070 exit(1);
7071 }
00f82b8a
AJ
7072
7073 /* On 32-bit hosts, QEMU is limited by virtual address space */
7074 if (value > (2047 << 20)
7075#ifndef USE_KQEMU
7076 && HOST_LONG_BITS == 32
7077#endif
7078 ) {
7079 fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
7080 exit(1);
7081 }
7082 if (value != (uint64_t)(ram_addr_t)value) {
7083 fprintf(stderr, "qemu: ram size too large\n");
7084 exit(1);
7085 }
7086 ram_size = value;
cd6f1169 7087 break;
00f82b8a 7088 }
cd6f1169
FB
7089 case QEMU_OPTION_d:
7090 {
7091 int mask;
c7cd6a37 7092 const CPULogItem *item;
3b46e624 7093
cd6f1169
FB
7094 mask = cpu_str_to_log_mask(optarg);
7095 if (!mask) {
7096 printf("Log items (comma separated):\n");
f193c797
FB
7097 for(item = cpu_log_items; item->mask != 0; item++) {
7098 printf("%-10s %s\n", item->name, item->help);
7099 }
7100 exit(1);
cd6f1169
FB
7101 }
7102 cpu_set_log(mask);
f193c797 7103 }
cd6f1169 7104 break;
67b915a5 7105#ifdef CONFIG_GDBSTUB
cd6f1169
FB
7106 case QEMU_OPTION_s:
7107 use_gdbstub = 1;
7108 break;
7109 case QEMU_OPTION_p:
cfc3475a 7110 gdbstub_port = optarg;
cd6f1169 7111 break;
67b915a5 7112#endif
cd6f1169
FB
7113 case QEMU_OPTION_L:
7114 bios_dir = optarg;
7115 break;
1192dad8
JM
7116 case QEMU_OPTION_bios:
7117 bios_name = optarg;
7118 break;
cd6f1169 7119 case QEMU_OPTION_S:
3c07f8e8 7120 autostart = 0;
cd6f1169 7121 break;
3d11d0eb
FB
7122 case QEMU_OPTION_k:
7123 keyboard_layout = optarg;
7124 break;
ee22c2f7
FB
7125 case QEMU_OPTION_localtime:
7126 rtc_utc = 0;
7127 break;
3893c124 7128 case QEMU_OPTION_vga:
7129 select_vgahw (optarg);
1bfe856e 7130 break;
e9b137c2
FB
7131 case QEMU_OPTION_g:
7132 {
7133 const char *p;
7134 int w, h, depth;
7135 p = optarg;
7136 w = strtol(p, (char **)&p, 10);
7137 if (w <= 0) {
7138 graphic_error:
7139 fprintf(stderr, "qemu: invalid resolution or depth\n");
7140 exit(1);
7141 }
7142 if (*p != 'x')
7143 goto graphic_error;
7144 p++;
7145 h = strtol(p, (char **)&p, 10);
7146 if (h <= 0)
7147 goto graphic_error;
7148 if (*p == 'x') {
7149 p++;
7150 depth = strtol(p, (char **)&p, 10);
5fafdf24 7151 if (depth != 8 && depth != 15 && depth != 16 &&
e9b137c2
FB
7152 depth != 24 && depth != 32)
7153 goto graphic_error;
7154 } else if (*p == '\0') {
7155 depth = graphic_depth;
7156 } else {
7157 goto graphic_error;
7158 }
3b46e624 7159
e9b137c2
FB
7160 graphic_width = w;
7161 graphic_height = h;
7162 graphic_depth = depth;
7163 }
7164 break;
20d8a3ed
TS
7165 case QEMU_OPTION_echr:
7166 {
7167 char *r;
7168 term_escape_char = strtol(optarg, &r, 0);
7169 if (r == optarg)
7170 printf("Bad argument to echr\n");
7171 break;
7172 }
82c643ff 7173 case QEMU_OPTION_monitor:
fd5f393a 7174 monitor_device = optarg;
82c643ff
FB
7175 break;
7176 case QEMU_OPTION_serial:
8d11df9e
FB
7177 if (serial_device_index >= MAX_SERIAL_PORTS) {
7178 fprintf(stderr, "qemu: too many serial ports\n");
7179 exit(1);
7180 }
fd5f393a 7181 serial_devices[serial_device_index] = optarg;
8d11df9e 7182 serial_device_index++;
82c643ff 7183 break;
6508fe59
FB
7184 case QEMU_OPTION_parallel:
7185 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
7186 fprintf(stderr, "qemu: too many parallel ports\n");
7187 exit(1);
7188 }
fd5f393a 7189 parallel_devices[parallel_device_index] = optarg;
6508fe59
FB
7190 parallel_device_index++;
7191 break;
d63d307f
FB
7192 case QEMU_OPTION_loadvm:
7193 loadvm = optarg;
7194 break;
7195 case QEMU_OPTION_full_screen:
7196 full_screen = 1;
7197 break;
667accab 7198#ifdef CONFIG_SDL
43523e93
TS
7199 case QEMU_OPTION_no_frame:
7200 no_frame = 1;
7201 break;
3780e197
TS
7202 case QEMU_OPTION_alt_grab:
7203 alt_grab = 1;
7204 break;
667accab
TS
7205 case QEMU_OPTION_no_quit:
7206 no_quit = 1;
7207 break;
7208#endif
f7cce898 7209 case QEMU_OPTION_pidfile:
93815bc2 7210 pid_file = optarg;
f7cce898 7211 break;
a09db21f
FB
7212#ifdef TARGET_I386
7213 case QEMU_OPTION_win2k_hack:
7214 win2k_install_hack = 1;
7215 break;
7216#endif
d993e026
FB
7217#ifdef USE_KQEMU
7218 case QEMU_OPTION_no_kqemu:
7219 kqemu_allowed = 0;
7220 break;
89bfc105
FB
7221 case QEMU_OPTION_kernel_kqemu:
7222 kqemu_allowed = 2;
7223 break;
d993e026 7224#endif
bb36d470
FB
7225 case QEMU_OPTION_usb:
7226 usb_enabled = 1;
7227 break;
a594cfbf
FB
7228 case QEMU_OPTION_usbdevice:
7229 usb_enabled = 1;
0d92ed30 7230 if (usb_devices_index >= MAX_USB_CMDLINE) {
a594cfbf
FB
7231 fprintf(stderr, "Too many USB devices\n");
7232 exit(1);
7233 }
fd5f393a 7234 usb_devices[usb_devices_index] = optarg;
a594cfbf
FB
7235 usb_devices_index++;
7236 break;
6a00d601
FB
7237 case QEMU_OPTION_smp:
7238 smp_cpus = atoi(optarg);
b2097003 7239 if (smp_cpus < 1) {
6a00d601
FB
7240 fprintf(stderr, "Invalid number of CPUs\n");
7241 exit(1);
7242 }
7243 break;
24236869 7244 case QEMU_OPTION_vnc:
73fc9742 7245 vnc_display = optarg;
24236869 7246 break;
6515b203
FB
7247 case QEMU_OPTION_no_acpi:
7248 acpi_enabled = 0;
7249 break;
d1beab82
FB
7250 case QEMU_OPTION_no_reboot:
7251 no_reboot = 1;
7252 break;
b2f76161
AJ
7253 case QEMU_OPTION_no_shutdown:
7254 no_shutdown = 1;
7255 break;
9467cd46
AZ
7256 case QEMU_OPTION_show_cursor:
7257 cursor_hide = 0;
7258 break;
8fcb1b90
BS
7259 case QEMU_OPTION_uuid:
7260 if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
7261 fprintf(stderr, "Fail to parse UUID string."
7262 " Wrong format.\n");
7263 exit(1);
7264 }
7265 break;
71e3ceb8
TS
7266 case QEMU_OPTION_daemonize:
7267 daemonize = 1;
7268 break;
9ae02555
TS
7269 case QEMU_OPTION_option_rom:
7270 if (nb_option_roms >= MAX_OPTION_ROMS) {
7271 fprintf(stderr, "Too many option ROMs\n");
7272 exit(1);
7273 }
7274 option_rom[nb_option_roms] = optarg;
7275 nb_option_roms++;
7276 break;
8e71621f
PB
7277 case QEMU_OPTION_semihosting:
7278 semihosting_enabled = 1;
7279 break;
c35734b2
TS
7280 case QEMU_OPTION_name:
7281 qemu_name = optarg;
7282 break;
66508601
BS
7283#ifdef TARGET_SPARC
7284 case QEMU_OPTION_prom_env:
7285 if (nb_prom_envs >= MAX_PROM_ENVS) {
7286 fprintf(stderr, "Too many prom variables\n");
7287 exit(1);
7288 }
7289 prom_envs[nb_prom_envs] = optarg;
7290 nb_prom_envs++;
7291 break;
2b8f2d41
AZ
7292#endif
7293#ifdef TARGET_ARM
7294 case QEMU_OPTION_old_param:
7295 old_param = 1;
05ebd537 7296 break;
66508601 7297#endif
f3dcfada
TS
7298 case QEMU_OPTION_clock:
7299 configure_alarms(optarg);
7300 break;
7e0af5d0
FB
7301 case QEMU_OPTION_startdate:
7302 {
7303 struct tm tm;
f6503059 7304 time_t rtc_start_date;
7e0af5d0 7305 if (!strcmp(optarg, "now")) {
f6503059 7306 rtc_date_offset = -1;
7e0af5d0
FB
7307 } else {
7308 if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
7309 &tm.tm_year,
7310 &tm.tm_mon,
7311 &tm.tm_mday,
7312 &tm.tm_hour,
7313 &tm.tm_min,
7314 &tm.tm_sec) == 6) {
7315 /* OK */
7316 } else if (sscanf(optarg, "%d-%d-%d",
7317 &tm.tm_year,
7318 &tm.tm_mon,
7319 &tm.tm_mday) == 3) {
7320 tm.tm_hour = 0;
7321 tm.tm_min = 0;
7322 tm.tm_sec = 0;
7323 } else {
7324 goto date_fail;
7325 }
7326 tm.tm_year -= 1900;
7327 tm.tm_mon--;
3c6b2088 7328 rtc_start_date = mktimegm(&tm);
7e0af5d0
FB
7329 if (rtc_start_date == -1) {
7330 date_fail:
7331 fprintf(stderr, "Invalid date format. Valid format are:\n"
7332 "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
7333 exit(1);
7334 }
f6503059 7335 rtc_date_offset = time(NULL) - rtc_start_date;
7e0af5d0
FB
7336 }
7337 }
7338 break;
26a5f13b
FB
7339 case QEMU_OPTION_tb_size:
7340 tb_size = strtol(optarg, NULL, 0);
7341 if (tb_size < 0)
7342 tb_size = 0;
7343 break;
2e70f6ef
PB
7344 case QEMU_OPTION_icount:
7345 use_icount = 1;
7346 if (strcmp(optarg, "auto") == 0) {
7347 icount_time_shift = -1;
7348 } else {
7349 icount_time_shift = strtol(optarg, NULL, 0);
7350 }
7351 break;
5bb7910a
AL
7352 case QEMU_OPTION_incoming:
7353 incoming = optarg;
7354 break;
cd6f1169 7355 }
0824d6fc
FB
7356 }
7357 }
330d0414 7358
3d878caa 7359 machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
b2097003
AL
7360 if (smp_cpus > machine->max_cpus) {
7361 fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
7362 "supported by machine `%s' (%d)\n", smp_cpus, machine->name,
7363 machine->max_cpus);
7364 exit(1);
7365 }
7366
bc0129d9
AL
7367 if (nographic) {
7368 if (serial_device_index == 0)
7369 serial_devices[0] = "stdio";
7370 if (parallel_device_index == 0)
7371 parallel_devices[0] = "null";
7372 if (strncmp(monitor_device, "vc", 2) == 0)
7373 monitor_device = "stdio";
7374 }
7375
71e3ceb8 7376#ifndef _WIN32
71e3ceb8
TS
7377 if (daemonize) {
7378 pid_t pid;
7379
7380 if (pipe(fds) == -1)
7381 exit(1);
7382
7383 pid = fork();
7384 if (pid > 0) {
7385 uint8_t status;
7386 ssize_t len;
7387
7388 close(fds[1]);
7389
7390 again:
93815bc2
TS
7391 len = read(fds[0], &status, 1);
7392 if (len == -1 && (errno == EINTR))
7393 goto again;
7394
7395 if (len != 1)
7396 exit(1);
7397 else if (status == 1) {
7398 fprintf(stderr, "Could not acquire pidfile\n");
7399 exit(1);
7400 } else
7401 exit(0);
71e3ceb8 7402 } else if (pid < 0)
93815bc2 7403 exit(1);
71e3ceb8
TS
7404
7405 setsid();
7406
7407 pid = fork();
7408 if (pid > 0)
7409 exit(0);
7410 else if (pid < 0)
7411 exit(1);
7412
7413 umask(027);
71e3ceb8
TS
7414
7415 signal(SIGTSTP, SIG_IGN);
7416 signal(SIGTTOU, SIG_IGN);
7417 signal(SIGTTIN, SIG_IGN);
7418 }
7419#endif
7420
aa26bb2d 7421 if (pid_file && qemu_create_pidfile(pid_file) != 0) {
93815bc2
TS
7422 if (daemonize) {
7423 uint8_t status = 1;
7424 write(fds[1], &status, 1);
7425 } else
7426 fprintf(stderr, "Could not acquire pid file\n");
7427 exit(1);
7428 }
7429
ff3fbb30
FB
7430#ifdef USE_KQEMU
7431 if (smp_cpus > 1)
7432 kqemu_allowed = 0;
7433#endif
a20dd508 7434 linux_boot = (kernel_filename != NULL);
7317b8ca 7435 net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
6c41b272 7436
28c5af54 7437 if (!linux_boot && net_boot == 0 &&
f88e4b91 7438 !machine->nodisk_ok && nb_drives_opt == 0)
15f82208 7439 help(1);
0824d6fc 7440
f8d39c01
TS
7441 if (!linux_boot && *kernel_cmdline != '\0') {
7442 fprintf(stderr, "-append only allowed with -kernel option\n");
7443 exit(1);
7444 }
7445
7446 if (!linux_boot && initrd_filename != NULL) {
7447 fprintf(stderr, "-initrd only allowed with -kernel option\n");
7448 exit(1);
7449 }
7450
96d30e48 7451 /* boot to floppy or the default cd if no hard disk defined yet */
28c5af54 7452 if (!boot_devices[0]) {
e4bcb14c 7453 boot_devices = "cad";
96d30e48 7454 }
b118d61e 7455 setvbuf(stdout, NULL, _IOLBF, 0);
3b46e624 7456
634fce96
PB
7457 init_timers();
7458 init_timer_alarm();
2e70f6ef
PB
7459 if (use_icount && icount_time_shift < 0) {
7460 use_icount = 2;
7461 /* 125MIPS seems a reasonable initial guess at the guest speed.
7462 It will be corrected fairly quickly anyway. */
7463 icount_time_shift = 3;
7464 init_icount_adjust();
7465 }
634fce96 7466
fd1dff4b
FB
7467#ifdef _WIN32
7468 socket_init();
7469#endif
7470
7c9d8e07
FB
7471 /* init network clients */
7472 if (nb_net_clients == 0) {
7473 /* if no clients, we use a default config */
f441b28b
AL
7474 net_clients[nb_net_clients++] = "nic";
7475#ifdef CONFIG_SLIRP
7476 net_clients[nb_net_clients++] = "user";
7477#endif
c20709aa
FB
7478 }
7479
7c9d8e07 7480 for(i = 0;i < nb_net_clients; i++) {
9ad97e65 7481 if (net_client_parse(net_clients[i]) < 0)
7c9d8e07 7482 exit(1);
702c651c 7483 }
833c7174
BS
7484 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
7485 if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
7486 continue;
9ad97e65
AZ
7487 if (vlan->nb_guest_devs == 0)
7488 fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
833c7174
BS
7489 if (vlan->nb_host_devs == 0)
7490 fprintf(stderr,
7491 "Warning: vlan %d is not connected to host network\n",
7492 vlan->id);
7493 }
f1510b2c 7494
eec85c2a 7495#ifdef TARGET_I386
ed494d87 7496 /* XXX: this should be moved in the PC machine instantiation code */
28c5af54
JM
7497 if (net_boot != 0) {
7498 int netroms = 0;
7499 for (i = 0; i < nb_nics && i < 4; i++) {
eec85c2a
TS
7500 const char *model = nd_table[i].model;
7501 char buf[1024];
28c5af54
JM
7502 if (net_boot & (1 << i)) {
7503 if (model == NULL)
7504 model = "ne2k_pci";
7505 snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
7506 if (get_image_size(buf) > 0) {
7507 if (nb_option_roms >= MAX_OPTION_ROMS) {
7508 fprintf(stderr, "Too many option ROMs\n");
7509 exit(1);
7510 }
7511 option_rom[nb_option_roms] = strdup(buf);
7512 nb_option_roms++;
7513 netroms++;
7514 }
7515 }
eec85c2a 7516 }
28c5af54 7517 if (netroms == 0) {
eec85c2a
TS
7518 fprintf(stderr, "No valid PXE rom found for network device\n");
7519 exit(1);
7520 }
eec85c2a
TS
7521 }
7522#endif
7523
0824d6fc 7524 /* init the memory */
7fb4fdcf
AZ
7525 phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;
7526
7527 if (machine->ram_require & RAMSIZE_FIXED) {
7528 if (ram_size > 0) {
7529 if (ram_size < phys_ram_size) {
cd940061
AJ
7530 fprintf(stderr, "Machine `%s' requires %llu bytes of memory\n",
7531 machine->name, (unsigned long long) phys_ram_size);
7fb4fdcf
AZ
7532 exit(-1);
7533 }
7534
7535 phys_ram_size = ram_size;
7536 } else
7537 ram_size = phys_ram_size;
7538 } else {
4fc5d071 7539 if (ram_size == 0)
7fb4fdcf
AZ
7540 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
7541
7542 phys_ram_size += ram_size;
7543 }
9ae02555 7544
d993e026 7545 phys_ram_base = qemu_vmalloc(phys_ram_size);
7f7f9873
FB
7546 if (!phys_ram_base) {
7547 fprintf(stderr, "Could not allocate physical memory\n");
0824d6fc
FB
7548 exit(1);
7549 }
7550
26a5f13b
FB
7551 /* init the dynamic translator */
7552 cpu_exec_init_all(tb_size * 1024 * 1024);
7553
5905b2e5 7554 bdrv_init();
c4b1fcc0 7555
e4bcb14c 7556 /* we always create the cdrom drive, even if no disk is there */
c4b1fcc0 7557
e4bcb14c 7558 if (nb_drives_opt < MAX_DRIVES)
609497ab 7559 drive_add(NULL, CDROM_ALIAS);
c4b1fcc0 7560
9d413d1d 7561 /* we always create at least one floppy */
33e3963e 7562
e4bcb14c 7563 if (nb_drives_opt < MAX_DRIVES)
609497ab 7564 drive_add(NULL, FD_ALIAS, 0);
86f55663 7565
9d413d1d
AZ
7566 /* we always create one sd slot, even if no card is in it */
7567
7568 if (nb_drives_opt < MAX_DRIVES)
609497ab 7569 drive_add(NULL, SD_ALIAS);
9d413d1d 7570
e4bcb14c
TS
7571 /* open the virtual block devices */
7572
7573 for(i = 0; i < nb_drives_opt; i++)
609497ab 7574 if (drive_init(&drives_opt[i], snapshot, machine) == -1)
e4bcb14c 7575 exit(1);
3e3d5815 7576
c88676f8 7577 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
475e4277 7578 register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
8a7ddc38 7579
313aa567 7580 /* terminal init */
740733bb 7581 memset(&display_state, 0, sizeof(display_state));
a20dd508 7582 if (nographic) {
4d3b6f6e
AZ
7583 if (curses) {
7584 fprintf(stderr, "fatal: -nographic can't be used with -curses\n");
7585 exit(1);
7586 }
2ff89790
TS
7587 /* nearly nothing to do */
7588 dumb_display_init(ds);
73fc9742 7589 } else if (vnc_display != NULL) {
71cab5ca
TS
7590 vnc_display_init(ds);
7591 if (vnc_display_open(ds, vnc_display) < 0)
7592 exit(1);
4d3b6f6e
AZ
7593 } else
7594#if defined(CONFIG_CURSES)
7595 if (curses) {
7596 curses_display_init(ds, full_screen);
7597 } else
7598#endif
7599 {
5b0753e0 7600#if defined(CONFIG_SDL)
43523e93 7601 sdl_display_init(ds, full_screen, no_frame);
5b0753e0
FB
7602#elif defined(CONFIG_COCOA)
7603 cocoa_display_init(ds, full_screen);
67276f53
PB
7604#else
7605 dumb_display_init(ds);
313aa567
FB
7606#endif
7607 }
0824d6fc 7608
5b08fc10
AL
7609#ifndef _WIN32
7610 /* must be after terminal init, SDL library changes signal handlers */
7611 termsig_setup();
7612#endif
7613
20d8a3ed
TS
7614 /* Maintain compatibility with multiple stdio monitors */
7615 if (!strcmp(monitor_device,"stdio")) {
7616 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
fd5f393a
PB
7617 const char *devname = serial_devices[i];
7618 if (devname && !strcmp(devname,"mon:stdio")) {
7619 monitor_device = NULL;
20d8a3ed 7620 break;
fd5f393a
PB
7621 } else if (devname && !strcmp(devname,"stdio")) {
7622 monitor_device = NULL;
7623 serial_devices[i] = "mon:stdio";
20d8a3ed
TS
7624 break;
7625 }
7626 }
7627 }
fd5f393a 7628 if (monitor_device) {
5ccfae10 7629 monitor_hd = qemu_chr_open("monitor", monitor_device);
20d8a3ed
TS
7630 if (!monitor_hd) {
7631 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
7632 exit(1);
7633 }
7634 monitor_init(monitor_hd, !nographic);
82c643ff 7635 }
82c643ff 7636
8d11df9e 7637 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
c03b0f0f 7638 const char *devname = serial_devices[i];
fd5f393a 7639 if (devname && strcmp(devname, "none")) {
5ccfae10
AL
7640 char label[32];
7641 snprintf(label, sizeof(label), "serial%d", i);
7642 serial_hds[i] = qemu_chr_open(label, devname);
8d11df9e 7643 if (!serial_hds[i]) {
5fafdf24 7644 fprintf(stderr, "qemu: could not open serial device '%s'\n",
c03b0f0f 7645 devname);
8d11df9e
FB
7646 exit(1);
7647 }
af3a9031 7648 if (strstart(devname, "vc", 0))
7ba1260a 7649 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
8d11df9e 7650 }
82c643ff 7651 }
82c643ff 7652
6508fe59 7653 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
c03b0f0f 7654 const char *devname = parallel_devices[i];
fd5f393a 7655 if (devname && strcmp(devname, "none")) {
5ccfae10
AL
7656 char label[32];
7657 snprintf(label, sizeof(label), "parallel%d", i);
7658 parallel_hds[i] = qemu_chr_open(label, devname);
6508fe59 7659 if (!parallel_hds[i]) {
5fafdf24 7660 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
c03b0f0f 7661 devname);
6508fe59
FB
7662 exit(1);
7663 }
af3a9031 7664 if (strstart(devname, "vc", 0))
7ba1260a 7665 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
6508fe59
FB
7666 }
7667 }
7668
b881c2c6 7669 machine->init(ram_size, vga_ram_size, boot_devices, ds,
94fc95cd 7670 kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
73332e5c 7671
0d92ed30
PB
7672 /* init USB devices */
7673 if (usb_enabled) {
7674 for(i = 0; i < usb_devices_index; i++) {
7675 if (usb_device_add(usb_devices[i]) < 0) {
7676 fprintf(stderr, "Warning: could not add USB device %s\n",
7677 usb_devices[i]);
7678 }
7679 }
7680 }
7681
740733bb
TS
7682 if (display_state.dpy_refresh) {
7683 display_state.gui_timer = qemu_new_timer(rt_clock, gui_update, &display_state);
7684 qemu_mod_timer(display_state.gui_timer, qemu_get_clock(rt_clock));
7685 }
7f7f9873 7686
67b915a5 7687#ifdef CONFIG_GDBSTUB
b4608c04 7688 if (use_gdbstub) {
c636bb66
FB
7689 /* XXX: use standard host:port notation and modify options
7690 accordingly. */
cfc3475a
PB
7691 if (gdbserver_start(gdbstub_port) < 0) {
7692 fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
c636bb66 7693 gdbstub_port);
8a7ddc38 7694 exit(1);
8a7ddc38 7695 }
45669e00 7696 }
67b915a5 7697#endif
45669e00 7698
d63d307f 7699 if (loadvm)
faea38e7 7700 do_loadvm(loadvm);
d63d307f 7701
5bb7910a
AL
7702 if (incoming) {
7703 autostart = 0; /* fixme how to deal with -daemonize */
7704 qemu_start_incoming_migration(incoming);
7705 }
7706
67b915a5 7707 {
5905b2e5 7708 /* XXX: simplify init */
83ab7950 7709 read_passwords();
3c07f8e8 7710 if (autostart) {
5905b2e5
FB
7711 vm_start();
7712 }
0824d6fc 7713 }
ffd843bc 7714
71e3ceb8
TS
7715 if (daemonize) {
7716 uint8_t status = 0;
7717 ssize_t len;
7718 int fd;
7719
7720 again1:
7721 len = write(fds[1], &status, 1);
7722 if (len == -1 && (errno == EINTR))
7723 goto again1;
7724
7725 if (len != 1)
7726 exit(1);
7727
bd54b863 7728 chdir("/");
aeb30be6 7729 TFR(fd = open("/dev/null", O_RDWR));
71e3ceb8
TS
7730 if (fd == -1)
7731 exit(1);
7732
7733 dup2(fd, 0);
7734 dup2(fd, 1);
7735 dup2(fd, 2);
7736
7737 close(fd);
7738 }
7739
8a7ddc38 7740 main_loop();
40c3bac3 7741 quit_timers();
b46a8906 7742
7d294b61 7743#if !defined(_WIN32)
b46a8906
TS
7744 /* close network clients */
7745 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
7746 VLANClientState *vc;
7747
7d294b61 7748 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
b46a8906
TS
7749 if (vc->fd_read == tap_receive) {
7750 char ifname[64];
7751 TAPState *s = vc->opaque;
7752
7753 if (sscanf(vc->info_str, "tap: ifname=%63s ", ifname) == 1 &&
7754 s->down_script[0])
7755 launch_script(s->down_script, ifname, s->fd);
7756 }
8a16d273
TS
7757#if defined(CONFIG_VDE)
7758 if (vc->fd_read == vde_from_qemu) {
7759 VDEState *s = vc->opaque;
7760 vde_close(s->vde);
7761 }
7762#endif
4fddf62a 7763 }
7d294b61
TS
7764 }
7765#endif
0824d6fc
FB
7766 return 0;
7767}