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