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