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