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