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