Statistics
| Branch: | Revision:

root / vl.c @ 33d68b5f

History | View | Annotate | Download (194.3 kB)

1
/*
2
 * QEMU System Emulator
3
 * 
4
 * Copyright (c) 2003-2007 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
#include <zlib.h>
33

    
34
#ifndef _WIN32
35
#include <sys/times.h>
36
#include <sys/wait.h>
37
#include <termios.h>
38
#include <sys/poll.h>
39
#include <sys/mman.h>
40
#include <sys/ioctl.h>
41
#include <sys/socket.h>
42
#include <netinet/in.h>
43
#include <dirent.h>
44
#include <netdb.h>
45
#ifdef _BSD
46
#include <sys/stat.h>
47
#ifndef __APPLE__
48
#include <libutil.h>
49
#endif
50
#else
51
#ifndef __sun__
52
#include <linux/if.h>
53
#include <linux/if_tun.h>
54
#include <pty.h>
55
#include <malloc.h>
56
#include <linux/rtc.h>
57
#include <linux/ppdev.h>
58
#include <linux/parport.h>
59
#else
60
#include <sys/stat.h>
61
#include <sys/ethernet.h>
62
#include <sys/sockio.h>
63
#include <arpa/inet.h>
64
#include <netinet/arp.h>
65
#include <netinet/in.h>
66
#include <netinet/in_systm.h>
67
#include <netinet/ip.h>
68
#include <netinet/ip_icmp.h> // must come after ip.h
69
#include <netinet/udp.h>
70
#include <netinet/tcp.h>
71
#include <net/if.h>
72
#include <syslog.h>
73
#include <stropts.h>
74
#endif
75
#endif
76
#endif
77

    
78
#if defined(CONFIG_SLIRP)
79
#include "libslirp.h"
80
#endif
81

    
82
#ifdef _WIN32
83
#include <malloc.h>
84
#include <sys/timeb.h>
85
#include <windows.h>
86
#define getopt_long_only getopt_long
87
#define memalign(align, size) malloc(size)
88
#endif
89

    
90
#include "qemu_socket.h"
91

    
92
#ifdef CONFIG_SDL
93
#ifdef __APPLE__
94
#include <SDL/SDL.h>
95
#endif
96
#endif /* CONFIG_SDL */
97

    
98
#ifdef CONFIG_COCOA
99
#undef main
100
#define main qemu_main
101
#endif /* CONFIG_COCOA */
102

    
103
#include "disas.h"
104

    
105
#include "exec-all.h"
106

    
107
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
108
#ifdef __sun__
109
#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
110
#else
111
#define SMBD_COMMAND "/usr/sbin/smbd"
112
#endif
113

    
114
//#define DEBUG_UNUSED_IOPORT
115
//#define DEBUG_IOPORT
116

    
117
#define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
118

    
119
#ifdef TARGET_PPC
120
#define DEFAULT_RAM_SIZE 144
121
#else
122
#define DEFAULT_RAM_SIZE 128
123
#endif
124
/* in ms */
125
#define GUI_REFRESH_INTERVAL 30
126

    
127
/* Max number of USB devices that can be specified on the commandline.  */
128
#define MAX_USB_CMDLINE 8
129

    
130
/* XXX: use a two level table to limit memory usage */
131
#define MAX_IOPORTS 65536
132

    
133
const char *bios_dir = CONFIG_QEMU_SHAREDIR;
134
char phys_ram_file[1024];
135
void *ioport_opaque[MAX_IOPORTS];
136
IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
137
IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
138
/* Note: bs_table[MAX_DISKS] is a dummy block driver if none available
139
   to store the VM snapshots */
140
BlockDriverState *bs_table[MAX_DISKS + 1], *fd_table[MAX_FD];
141
/* point to the block driver where the snapshots are managed */
142
BlockDriverState *bs_snapshots;
143
int vga_ram_size;
144
static DisplayState display_state;
145
int nographic;
146
const char* keyboard_layout = NULL;
147
int64_t ticks_per_sec;
148
int boot_device = 'c';
149
int ram_size;
150
int pit_min_timer_count = 0;
151
int nb_nics;
152
NICInfo nd_table[MAX_NICS];
153
QEMUTimer *gui_timer;
154
int vm_running;
155
int rtc_utc = 1;
156
int cirrus_vga_enabled = 1;
157
#ifdef TARGET_SPARC
158
int graphic_width = 1024;
159
int graphic_height = 768;
160
#else
161
int graphic_width = 800;
162
int graphic_height = 600;
163
#endif
164
int graphic_depth = 15;
165
int full_screen = 0;
166
int no_frame = 0;
167
int no_quit = 0;
168
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
169
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
170
#ifdef TARGET_I386
171
int win2k_install_hack = 0;
172
#endif
173
int usb_enabled = 0;
174
static VLANState *first_vlan;
175
int smp_cpus = 1;
176
const char *vnc_display;
177
#if defined(TARGET_SPARC)
178
#define MAX_CPUS 16
179
#elif defined(TARGET_I386)
180
#define MAX_CPUS 255
181
#else
182
#define MAX_CPUS 1
183
#endif
184
int acpi_enabled = 1;
185
int fd_bootchk = 1;
186
int no_reboot = 0;
187
int daemonize = 0;
188
const char *option_rom[MAX_OPTION_ROMS];
189
int nb_option_roms;
190
int semihosting_enabled = 0;
191
int autostart = 1;
192

    
193
/***********************************************************/
194
/* x86 ISA bus support */
195

    
196
target_phys_addr_t isa_mem_base = 0;
197
PicState2 *isa_pic;
198

    
199
uint32_t default_ioport_readb(void *opaque, uint32_t address)
200
{
201
#ifdef DEBUG_UNUSED_IOPORT
202
    fprintf(stderr, "unused inb: port=0x%04x\n", address);
203
#endif
204
    return 0xff;
205
}
206

    
207
void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
208
{
209
#ifdef DEBUG_UNUSED_IOPORT
210
    fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
211
#endif
212
}
213

    
214
/* default is to make two byte accesses */
215
uint32_t default_ioport_readw(void *opaque, uint32_t address)
216
{
217
    uint32_t data;
218
    data = ioport_read_table[0][address](ioport_opaque[address], address);
219
    address = (address + 1) & (MAX_IOPORTS - 1);
220
    data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
221
    return data;
222
}
223

    
224
void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
225
{
226
    ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
227
    address = (address + 1) & (MAX_IOPORTS - 1);
228
    ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
229
}
230

    
231
uint32_t default_ioport_readl(void *opaque, uint32_t address)
232
{
233
#ifdef DEBUG_UNUSED_IOPORT
234
    fprintf(stderr, "unused inl: port=0x%04x\n", address);
235
#endif
236
    return 0xffffffff;
237
}
238

    
239
void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
240
{
241
#ifdef DEBUG_UNUSED_IOPORT
242
    fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
243
#endif
244
}
245

    
246
void init_ioports(void)
247
{
248
    int i;
249

    
250
    for(i = 0; i < MAX_IOPORTS; i++) {
251
        ioport_read_table[0][i] = default_ioport_readb;
252
        ioport_write_table[0][i] = default_ioport_writeb;
253
        ioport_read_table[1][i] = default_ioport_readw;
254
        ioport_write_table[1][i] = default_ioport_writew;
255
        ioport_read_table[2][i] = default_ioport_readl;
256
        ioport_write_table[2][i] = default_ioport_writel;
257
    }
258
}
259

    
260
/* size is the word size in byte */
261
int register_ioport_read(int start, int length, int size, 
262
                         IOPortReadFunc *func, void *opaque)
263
{
264
    int i, bsize;
265

    
266
    if (size == 1) {
267
        bsize = 0;
268
    } else if (size == 2) {
269
        bsize = 1;
270
    } else if (size == 4) {
271
        bsize = 2;
272
    } else {
273
        hw_error("register_ioport_read: invalid size");
274
        return -1;
275
    }
276
    for(i = start; i < start + length; i += size) {
277
        ioport_read_table[bsize][i] = func;
278
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
279
            hw_error("register_ioport_read: invalid opaque");
280
        ioport_opaque[i] = opaque;
281
    }
282
    return 0;
283
}
284

    
285
/* size is the word size in byte */
286
int register_ioport_write(int start, int length, int size, 
287
                          IOPortWriteFunc *func, void *opaque)
288
{
289
    int i, bsize;
290

    
291
    if (size == 1) {
292
        bsize = 0;
293
    } else if (size == 2) {
294
        bsize = 1;
295
    } else if (size == 4) {
296
        bsize = 2;
297
    } else {
298
        hw_error("register_ioport_write: invalid size");
299
        return -1;
300
    }
301
    for(i = start; i < start + length; i += size) {
302
        ioport_write_table[bsize][i] = func;
303
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
304
            hw_error("register_ioport_write: invalid opaque");
305
        ioport_opaque[i] = opaque;
306
    }
307
    return 0;
308
}
309

    
310
void isa_unassign_ioport(int start, int length)
311
{
312
    int i;
313

    
314
    for(i = start; i < start + length; i++) {
315
        ioport_read_table[0][i] = default_ioport_readb;
316
        ioport_read_table[1][i] = default_ioport_readw;
317
        ioport_read_table[2][i] = default_ioport_readl;
318

    
319
        ioport_write_table[0][i] = default_ioport_writeb;
320
        ioport_write_table[1][i] = default_ioport_writew;
321
        ioport_write_table[2][i] = default_ioport_writel;
322
    }
323
}
324

    
325
/***********************************************************/
326

    
327
void cpu_outb(CPUState *env, int addr, int val)
328
{
329
#ifdef DEBUG_IOPORT
330
    if (loglevel & CPU_LOG_IOPORT)
331
        fprintf(logfile, "outb: %04x %02x\n", addr, val);
332
#endif    
333
    ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
334
#ifdef USE_KQEMU
335
    if (env)
336
        env->last_io_time = cpu_get_time_fast();
337
#endif
338
}
339

    
340
void cpu_outw(CPUState *env, int addr, int val)
341
{
342
#ifdef DEBUG_IOPORT
343
    if (loglevel & CPU_LOG_IOPORT)
344
        fprintf(logfile, "outw: %04x %04x\n", addr, val);
345
#endif    
346
    ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
347
#ifdef USE_KQEMU
348
    if (env)
349
        env->last_io_time = cpu_get_time_fast();
350
#endif
351
}
352

    
353
void cpu_outl(CPUState *env, int addr, int val)
354
{
355
#ifdef DEBUG_IOPORT
356
    if (loglevel & CPU_LOG_IOPORT)
357
        fprintf(logfile, "outl: %04x %08x\n", addr, val);
358
#endif
359
    ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
360
#ifdef USE_KQEMU
361
    if (env)
362
        env->last_io_time = cpu_get_time_fast();
363
#endif
364
}
365

    
366
int cpu_inb(CPUState *env, int addr)
367
{
368
    int val;
369
    val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
370
#ifdef DEBUG_IOPORT
371
    if (loglevel & CPU_LOG_IOPORT)
372
        fprintf(logfile, "inb : %04x %02x\n", addr, val);
373
#endif
374
#ifdef USE_KQEMU
375
    if (env)
376
        env->last_io_time = cpu_get_time_fast();
377
#endif
378
    return val;
379
}
380

    
381
int cpu_inw(CPUState *env, int addr)
382
{
383
    int val;
384
    val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
385
#ifdef DEBUG_IOPORT
386
    if (loglevel & CPU_LOG_IOPORT)
387
        fprintf(logfile, "inw : %04x %04x\n", addr, val);
388
#endif
389
#ifdef USE_KQEMU
390
    if (env)
391
        env->last_io_time = cpu_get_time_fast();
392
#endif
393
    return val;
394
}
395

    
396
int cpu_inl(CPUState *env, int addr)
397
{
398
    int val;
399
    val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
400
#ifdef DEBUG_IOPORT
401
    if (loglevel & CPU_LOG_IOPORT)
402
        fprintf(logfile, "inl : %04x %08x\n", addr, val);
403
#endif
404
#ifdef USE_KQEMU
405
    if (env)
406
        env->last_io_time = cpu_get_time_fast();
407
#endif
408
    return val;
409
}
410

    
411
/***********************************************************/
412
void hw_error(const char *fmt, ...)
413
{
414
    va_list ap;
415
    CPUState *env;
416

    
417
    va_start(ap, fmt);
418
    fprintf(stderr, "qemu: hardware error: ");
419
    vfprintf(stderr, fmt, ap);
420
    fprintf(stderr, "\n");
421
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
422
        fprintf(stderr, "CPU #%d:\n", env->cpu_index);
423
#ifdef TARGET_I386
424
        cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
425
#else
426
        cpu_dump_state(env, stderr, fprintf, 0);
427
#endif
428
    }
429
    va_end(ap);
430
    abort();
431
}
432

    
433
/***********************************************************/
434
/* keyboard/mouse */
435

    
436
static QEMUPutKBDEvent *qemu_put_kbd_event;
437
static void *qemu_put_kbd_event_opaque;
438
static QEMUPutMouseEntry *qemu_put_mouse_event_head;
439
static QEMUPutMouseEntry *qemu_put_mouse_event_current;
440

    
441
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
442
{
443
    qemu_put_kbd_event_opaque = opaque;
444
    qemu_put_kbd_event = func;
445
}
446

    
447
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
448
                                                void *opaque, int absolute,
449
                                                const char *name)
450
{
451
    QEMUPutMouseEntry *s, *cursor;
452

    
453
    s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
454
    if (!s)
455
        return NULL;
456

    
457
    s->qemu_put_mouse_event = func;
458
    s->qemu_put_mouse_event_opaque = opaque;
459
    s->qemu_put_mouse_event_absolute = absolute;
460
    s->qemu_put_mouse_event_name = qemu_strdup(name);
461
    s->next = NULL;
462

    
463
    if (!qemu_put_mouse_event_head) {
464
        qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
465
        return s;
466
    }
467

    
468
    cursor = qemu_put_mouse_event_head;
469
    while (cursor->next != NULL)
470
        cursor = cursor->next;
471

    
472
    cursor->next = s;
473
    qemu_put_mouse_event_current = s;
474

    
475
    return s;
476
}
477

    
478
void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
479
{
480
    QEMUPutMouseEntry *prev = NULL, *cursor;
481

    
482
    if (!qemu_put_mouse_event_head || entry == NULL)
483
        return;
484

    
485
    cursor = qemu_put_mouse_event_head;
486
    while (cursor != NULL && cursor != entry) {
487
        prev = cursor;
488
        cursor = cursor->next;
489
    }
490

    
491
    if (cursor == NULL) // does not exist or list empty
492
        return;
493
    else if (prev == NULL) { // entry is head
494
        qemu_put_mouse_event_head = cursor->next;
495
        if (qemu_put_mouse_event_current == entry)
496
            qemu_put_mouse_event_current = cursor->next;
497
        qemu_free(entry->qemu_put_mouse_event_name);
498
        qemu_free(entry);
499
        return;
500
    }
501

    
502
    prev->next = entry->next;
503

    
504
    if (qemu_put_mouse_event_current == entry)
505
        qemu_put_mouse_event_current = prev;
506

    
507
    qemu_free(entry->qemu_put_mouse_event_name);
508
    qemu_free(entry);
509
}
510

    
511
void kbd_put_keycode(int keycode)
512
{
513
    if (qemu_put_kbd_event) {
514
        qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
515
    }
516
}
517

    
518
void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
519
{
520
    QEMUPutMouseEvent *mouse_event;
521
    void *mouse_event_opaque;
522

    
523
    if (!qemu_put_mouse_event_current) {
524
        return;
525
    }
526

    
527
    mouse_event =
528
        qemu_put_mouse_event_current->qemu_put_mouse_event;
529
    mouse_event_opaque =
530
        qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
531

    
532
    if (mouse_event) {
533
        mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
534
    }
535
}
536

    
537
int kbd_mouse_is_absolute(void)
538
{
539
    if (!qemu_put_mouse_event_current)
540
        return 0;
541

    
542
    return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
543
}
544

    
545
void do_info_mice(void)
546
{
547
    QEMUPutMouseEntry *cursor;
548
    int index = 0;
549

    
550
    if (!qemu_put_mouse_event_head) {
551
        term_printf("No mouse devices connected\n");
552
        return;
553
    }
554

    
555
    term_printf("Mouse devices available:\n");
556
    cursor = qemu_put_mouse_event_head;
557
    while (cursor != NULL) {
558
        term_printf("%c Mouse #%d: %s\n",
559
                    (cursor == qemu_put_mouse_event_current ? '*' : ' '),
560
                    index, cursor->qemu_put_mouse_event_name);
561
        index++;
562
        cursor = cursor->next;
563
    }
564
}
565

    
566
void do_mouse_set(int index)
567
{
568
    QEMUPutMouseEntry *cursor;
569
    int i = 0;
570

    
571
    if (!qemu_put_mouse_event_head) {
572
        term_printf("No mouse devices connected\n");
573
        return;
574
    }
575

    
576
    cursor = qemu_put_mouse_event_head;
577
    while (cursor != NULL && index != i) {
578
        i++;
579
        cursor = cursor->next;
580
    }
581

    
582
    if (cursor != NULL)
583
        qemu_put_mouse_event_current = cursor;
584
    else
585
        term_printf("Mouse at given index not found\n");
586
}
587

    
588
/* compute with 96 bit intermediate result: (a*b)/c */
589
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
590
{
591
    union {
592
        uint64_t ll;
593
        struct {
594
#ifdef WORDS_BIGENDIAN
595
            uint32_t high, low;
596
#else
597
            uint32_t low, high;
598
#endif            
599
        } l;
600
    } u, res;
601
    uint64_t rl, rh;
602

    
603
    u.ll = a;
604
    rl = (uint64_t)u.l.low * (uint64_t)b;
605
    rh = (uint64_t)u.l.high * (uint64_t)b;
606
    rh += (rl >> 32);
607
    res.l.high = rh / c;
608
    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
609
    return res.ll;
610
}
611

    
612
/***********************************************************/
613
/* real time host monotonic timer */
614

    
615
#define QEMU_TIMER_BASE 1000000000LL
616

    
617
#ifdef WIN32
618

    
619
static int64_t clock_freq;
620

    
621
static void init_get_clock(void)
622
{
623
    LARGE_INTEGER freq;
624
    int ret;
625
    ret = QueryPerformanceFrequency(&freq);
626
    if (ret == 0) {
627
        fprintf(stderr, "Could not calibrate ticks\n");
628
        exit(1);
629
    }
630
    clock_freq = freq.QuadPart;
631
}
632

    
633
static int64_t get_clock(void)
634
{
635
    LARGE_INTEGER ti;
636
    QueryPerformanceCounter(&ti);
637
    return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
638
}
639

    
640
#else
641

    
642
static int use_rt_clock;
643

    
644
static void init_get_clock(void)
645
{
646
    use_rt_clock = 0;
647
#if defined(__linux__)
648
    {
649
        struct timespec ts;
650
        if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
651
            use_rt_clock = 1;
652
        }
653
    }
654
#endif
655
}
656

    
657
static int64_t get_clock(void)
658
{
659
#if defined(__linux__)
660
    if (use_rt_clock) {
661
        struct timespec ts;
662
        clock_gettime(CLOCK_MONOTONIC, &ts);
663
        return ts.tv_sec * 1000000000LL + ts.tv_nsec;
664
    } else 
665
#endif
666
    {
667
        /* XXX: using gettimeofday leads to problems if the date
668
           changes, so it should be avoided. */
669
        struct timeval tv;
670
        gettimeofday(&tv, NULL);
671
        return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
672
    }
673
}
674

    
675
#endif
676

    
677
/***********************************************************/
678
/* guest cycle counter */
679

    
680
static int64_t cpu_ticks_prev;
681
static int64_t cpu_ticks_offset;
682
static int64_t cpu_clock_offset;
683
static int cpu_ticks_enabled;
684

    
685
/* return the host CPU cycle counter and handle stop/restart */
686
int64_t cpu_get_ticks(void)
687
{
688
    if (!cpu_ticks_enabled) {
689
        return cpu_ticks_offset;
690
    } else {
691
        int64_t ticks;
692
        ticks = cpu_get_real_ticks();
693
        if (cpu_ticks_prev > ticks) {
694
            /* Note: non increasing ticks may happen if the host uses
695
               software suspend */
696
            cpu_ticks_offset += cpu_ticks_prev - ticks;
697
        }
698
        cpu_ticks_prev = ticks;
699
        return ticks + cpu_ticks_offset;
700
    }
701
}
702

    
703
/* return the host CPU monotonic timer and handle stop/restart */
704
static int64_t cpu_get_clock(void)
705
{
706
    int64_t ti;
707
    if (!cpu_ticks_enabled) {
708
        return cpu_clock_offset;
709
    } else {
710
        ti = get_clock();
711
        return ti + cpu_clock_offset;
712
    }
713
}
714

    
715
/* enable cpu_get_ticks() */
716
void cpu_enable_ticks(void)
717
{
718
    if (!cpu_ticks_enabled) {
719
        cpu_ticks_offset -= cpu_get_real_ticks();
720
        cpu_clock_offset -= get_clock();
721
        cpu_ticks_enabled = 1;
722
    }
723
}
724

    
725
/* disable cpu_get_ticks() : the clock is stopped. You must not call
726
   cpu_get_ticks() after that.  */
727
void cpu_disable_ticks(void)
728
{
729
    if (cpu_ticks_enabled) {
730
        cpu_ticks_offset = cpu_get_ticks();
731
        cpu_clock_offset = cpu_get_clock();
732
        cpu_ticks_enabled = 0;
733
    }
734
}
735

    
736
/***********************************************************/
737
/* timers */
738
 
739
#define QEMU_TIMER_REALTIME 0
740
#define QEMU_TIMER_VIRTUAL  1
741

    
742
struct QEMUClock {
743
    int type;
744
    /* XXX: add frequency */
745
};
746

    
747
struct QEMUTimer {
748
    QEMUClock *clock;
749
    int64_t expire_time;
750
    QEMUTimerCB *cb;
751
    void *opaque;
752
    struct QEMUTimer *next;
753
};
754

    
755
QEMUClock *rt_clock;
756
QEMUClock *vm_clock;
757

    
758
static QEMUTimer *active_timers[2];
759
#ifdef _WIN32
760
static MMRESULT timerID;
761
static HANDLE host_alarm = NULL;
762
static unsigned int period = 1;
763
#else
764
/* frequency of the times() clock tick */
765
static int timer_freq;
766
#endif
767

    
768
QEMUClock *qemu_new_clock(int type)
769
{
770
    QEMUClock *clock;
771
    clock = qemu_mallocz(sizeof(QEMUClock));
772
    if (!clock)
773
        return NULL;
774
    clock->type = type;
775
    return clock;
776
}
777

    
778
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
779
{
780
    QEMUTimer *ts;
781

    
782
    ts = qemu_mallocz(sizeof(QEMUTimer));
783
    ts->clock = clock;
784
    ts->cb = cb;
785
    ts->opaque = opaque;
786
    return ts;
787
}
788

    
789
void qemu_free_timer(QEMUTimer *ts)
790
{
791
    qemu_free(ts);
792
}
793

    
794
/* stop a timer, but do not dealloc it */
795
void qemu_del_timer(QEMUTimer *ts)
796
{
797
    QEMUTimer **pt, *t;
798

    
799
    /* NOTE: this code must be signal safe because
800
       qemu_timer_expired() can be called from a signal. */
801
    pt = &active_timers[ts->clock->type];
802
    for(;;) {
803
        t = *pt;
804
        if (!t)
805
            break;
806
        if (t == ts) {
807
            *pt = t->next;
808
            break;
809
        }
810
        pt = &t->next;
811
    }
812
}
813

    
814
/* modify the current timer so that it will be fired when current_time
815
   >= expire_time. The corresponding callback will be called. */
816
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
817
{
818
    QEMUTimer **pt, *t;
819

    
820
    qemu_del_timer(ts);
821

    
822
    /* add the timer in the sorted list */
823
    /* NOTE: this code must be signal safe because
824
       qemu_timer_expired() can be called from a signal. */
825
    pt = &active_timers[ts->clock->type];
826
    for(;;) {
827
        t = *pt;
828
        if (!t)
829
            break;
830
        if (t->expire_time > expire_time) 
831
            break;
832
        pt = &t->next;
833
    }
834
    ts->expire_time = expire_time;
835
    ts->next = *pt;
836
    *pt = ts;
837
}
838

    
839
int qemu_timer_pending(QEMUTimer *ts)
840
{
841
    QEMUTimer *t;
842
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
843
        if (t == ts)
844
            return 1;
845
    }
846
    return 0;
847
}
848

    
849
static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
850
{
851
    if (!timer_head)
852
        return 0;
853
    return (timer_head->expire_time <= current_time);
854
}
855

    
856
static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
857
{
858
    QEMUTimer *ts;
859
    
860
    for(;;) {
861
        ts = *ptimer_head;
862
        if (!ts || ts->expire_time > current_time)
863
            break;
864
        /* remove timer from the list before calling the callback */
865
        *ptimer_head = ts->next;
866
        ts->next = NULL;
867
        
868
        /* run the callback (the timer list can be modified) */
869
        ts->cb(ts->opaque);
870
    }
871
}
872

    
873
int64_t qemu_get_clock(QEMUClock *clock)
874
{
875
    switch(clock->type) {
876
    case QEMU_TIMER_REALTIME:
877
        return get_clock() / 1000000;
878
    default:
879
    case QEMU_TIMER_VIRTUAL:
880
        return cpu_get_clock();
881
    }
882
}
883

    
884
static void init_timers(void)
885
{
886
    init_get_clock();
887
    ticks_per_sec = QEMU_TIMER_BASE;
888
    rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
889
    vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
890
}
891

    
892
/* save a timer */
893
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
894
{
895
    uint64_t expire_time;
896

    
897
    if (qemu_timer_pending(ts)) {
898
        expire_time = ts->expire_time;
899
    } else {
900
        expire_time = -1;
901
    }
902
    qemu_put_be64(f, expire_time);
903
}
904

    
905
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
906
{
907
    uint64_t expire_time;
908

    
909
    expire_time = qemu_get_be64(f);
910
    if (expire_time != -1) {
911
        qemu_mod_timer(ts, expire_time);
912
    } else {
913
        qemu_del_timer(ts);
914
    }
915
}
916

    
917
static void timer_save(QEMUFile *f, void *opaque)
918
{
919
    if (cpu_ticks_enabled) {
920
        hw_error("cannot save state if virtual timers are running");
921
    }
922
    qemu_put_be64s(f, &cpu_ticks_offset);
923
    qemu_put_be64s(f, &ticks_per_sec);
924
    qemu_put_be64s(f, &cpu_clock_offset);
925
}
926

    
927
static int timer_load(QEMUFile *f, void *opaque, int version_id)
928
{
929
    if (version_id != 1 && version_id != 2)
930
        return -EINVAL;
931
    if (cpu_ticks_enabled) {
932
        return -EINVAL;
933
    }
934
    qemu_get_be64s(f, &cpu_ticks_offset);
935
    qemu_get_be64s(f, &ticks_per_sec);
936
    if (version_id == 2) {
937
        qemu_get_be64s(f, &cpu_clock_offset);
938
    }
939
    return 0;
940
}
941

    
942
#ifdef _WIN32
943
void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg, 
944
                                 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
945
#else
946
static void host_alarm_handler(int host_signum)
947
#endif
948
{
949
#if 0
950
#define DISP_FREQ 1000
951
    {
952
        static int64_t delta_min = INT64_MAX;
953
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
954
        static int count;
955
        ti = qemu_get_clock(vm_clock);
956
        if (last_clock != 0) {
957
            delta = ti - last_clock;
958
            if (delta < delta_min)
959
                delta_min = delta;
960
            if (delta > delta_max)
961
                delta_max = delta;
962
            delta_cum += delta;
963
            if (++count == DISP_FREQ) {
964
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
965
                       muldiv64(delta_min, 1000000, ticks_per_sec),
966
                       muldiv64(delta_max, 1000000, ticks_per_sec),
967
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
968
                       (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
969
                count = 0;
970
                delta_min = INT64_MAX;
971
                delta_max = 0;
972
                delta_cum = 0;
973
            }
974
        }
975
        last_clock = ti;
976
    }
977
#endif
978
    if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
979
                           qemu_get_clock(vm_clock)) ||
980
        qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
981
                           qemu_get_clock(rt_clock))) {
982
#ifdef _WIN32
983
        SetEvent(host_alarm);
984
#endif
985
        CPUState *env = cpu_single_env;
986
        if (env) {
987
            /* stop the currently executing cpu because a timer occured */
988
            cpu_interrupt(env, CPU_INTERRUPT_EXIT);
989
#ifdef USE_KQEMU
990
            if (env->kqemu_enabled) {
991
                kqemu_cpu_interrupt(env);
992
            }
993
#endif
994
        }
995
    }
996
}
997

    
998
#ifndef _WIN32
999

    
1000
#if defined(__linux__)
1001

    
1002
#define RTC_FREQ 1024
1003

    
1004
static int rtc_fd;
1005

    
1006
static int start_rtc_timer(void)
1007
{
1008
    rtc_fd = open("/dev/rtc", O_RDONLY);
1009
    if (rtc_fd < 0)
1010
        return -1;
1011
    if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
1012
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1013
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1014
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1015
        goto fail;
1016
    }
1017
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1018
    fail:
1019
        close(rtc_fd);
1020
        return -1;
1021
    }
1022
    pit_min_timer_count = PIT_FREQ / RTC_FREQ;
1023
    return 0;
1024
}
1025

    
1026
#else
1027

    
1028
static int start_rtc_timer(void)
1029
{
1030
    return -1;
1031
}
1032

    
1033
#endif /* !defined(__linux__) */
1034

    
1035
#endif /* !defined(_WIN32) */
1036

    
1037
static void init_timer_alarm(void)
1038
{
1039
#ifdef _WIN32
1040
    {
1041
        int count=0;
1042
        TIMECAPS tc;
1043

    
1044
        ZeroMemory(&tc, sizeof(TIMECAPS));
1045
        timeGetDevCaps(&tc, sizeof(TIMECAPS));
1046
        if (period < tc.wPeriodMin)
1047
            period = tc.wPeriodMin;
1048
        timeBeginPeriod(period);
1049
        timerID = timeSetEvent(1,     // interval (ms)
1050
                               period,     // resolution
1051
                               host_alarm_handler, // function
1052
                               (DWORD)&count,  // user parameter
1053
                               TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
1054
         if( !timerID ) {
1055
            perror("failed timer alarm");
1056
            exit(1);
1057
         }
1058
        host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1059
        if (!host_alarm) {
1060
            perror("failed CreateEvent");
1061
            exit(1);
1062
        }
1063
        qemu_add_wait_object(host_alarm, NULL, NULL);
1064
    }
1065
    pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
1066
#else
1067
    {
1068
        struct sigaction act;
1069
        struct itimerval itv;
1070
        
1071
        /* get times() syscall frequency */
1072
        timer_freq = sysconf(_SC_CLK_TCK);
1073
        
1074
        /* timer signal */
1075
        sigfillset(&act.sa_mask);
1076
       act.sa_flags = 0;
1077
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
1078
        act.sa_flags |= SA_ONSTACK;
1079
#endif
1080
        act.sa_handler = host_alarm_handler;
1081
        sigaction(SIGALRM, &act, NULL);
1082

    
1083
        itv.it_interval.tv_sec = 0;
1084
        itv.it_interval.tv_usec = 999; /* for i386 kernel 2.6 to get 1 ms */
1085
        itv.it_value.tv_sec = 0;
1086
        itv.it_value.tv_usec = 10 * 1000;
1087
        setitimer(ITIMER_REAL, &itv, NULL);
1088
        /* we probe the tick duration of the kernel to inform the user if
1089
           the emulated kernel requested a too high timer frequency */
1090
        getitimer(ITIMER_REAL, &itv);
1091

    
1092
#if defined(__linux__)
1093
        /* XXX: force /dev/rtc usage because even 2.6 kernels may not
1094
           have timers with 1 ms resolution. The correct solution will
1095
           be to use the POSIX real time timers available in recent
1096
           2.6 kernels */
1097
        if (itv.it_interval.tv_usec > 1000 || 1) {
1098
            /* try to use /dev/rtc to have a faster timer */
1099
            if (start_rtc_timer() < 0)
1100
                goto use_itimer;
1101
            /* disable itimer */
1102
            itv.it_interval.tv_sec = 0;
1103
            itv.it_interval.tv_usec = 0;
1104
            itv.it_value.tv_sec = 0;
1105
            itv.it_value.tv_usec = 0;
1106
            setitimer(ITIMER_REAL, &itv, NULL);
1107

    
1108
            /* use the RTC */
1109
            sigaction(SIGIO, &act, NULL);
1110
            fcntl(rtc_fd, F_SETFL, O_ASYNC);
1111
            fcntl(rtc_fd, F_SETOWN, getpid());
1112
        } else 
1113
#endif /* defined(__linux__) */
1114
        {
1115
        use_itimer:
1116
            pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * 
1117
                                   PIT_FREQ) / 1000000;
1118
        }
1119
    }
1120
#endif
1121
}
1122

    
1123
void quit_timers(void)
1124
{
1125
#ifdef _WIN32
1126
    timeKillEvent(timerID);
1127
    timeEndPeriod(period);
1128
    if (host_alarm) {
1129
        CloseHandle(host_alarm);
1130
        host_alarm = NULL;
1131
    }
1132
#endif
1133
}
1134

    
1135
/***********************************************************/
1136
/* character device */
1137

    
1138
static void qemu_chr_event(CharDriverState *s, int event)
1139
{
1140
    if (!s->chr_event)
1141
        return;
1142
    s->chr_event(s->handler_opaque, event);
1143
}
1144

    
1145
static void qemu_chr_reset_bh(void *opaque)
1146
{
1147
    CharDriverState *s = opaque;
1148
    qemu_chr_event(s, CHR_EVENT_RESET);
1149
    qemu_bh_delete(s->bh);
1150
    s->bh = NULL;
1151
}
1152

    
1153
void qemu_chr_reset(CharDriverState *s)
1154
{
1155
    if (s->bh == NULL) {
1156
        s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
1157
        qemu_bh_schedule(s->bh);
1158
    }
1159
}
1160

    
1161
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
1162
{
1163
    return s->chr_write(s, buf, len);
1164
}
1165

    
1166
int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg)
1167
{
1168
    if (!s->chr_ioctl)
1169
        return -ENOTSUP;
1170
    return s->chr_ioctl(s, cmd, arg);
1171
}
1172

    
1173
int qemu_chr_can_read(CharDriverState *s)
1174
{
1175
    if (!s->chr_can_read)
1176
        return 0;
1177
    return s->chr_can_read(s->handler_opaque);
1178
}
1179

    
1180
void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len)
1181
{
1182
    s->chr_read(s->handler_opaque, buf, len);
1183
}
1184

    
1185

    
1186
void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
1187
{
1188
    char buf[4096];
1189
    va_list ap;
1190
    va_start(ap, fmt);
1191
    vsnprintf(buf, sizeof(buf), fmt, ap);
1192
    qemu_chr_write(s, buf, strlen(buf));
1193
    va_end(ap);
1194
}
1195

    
1196
void qemu_chr_send_event(CharDriverState *s, int event)
1197
{
1198
    if (s->chr_send_event)
1199
        s->chr_send_event(s, event);
1200
}
1201

    
1202
void qemu_chr_add_handlers(CharDriverState *s, 
1203
                           IOCanRWHandler *fd_can_read, 
1204
                           IOReadHandler *fd_read,
1205
                           IOEventHandler *fd_event,
1206
                           void *opaque)
1207
{
1208
    s->chr_can_read = fd_can_read;
1209
    s->chr_read = fd_read;
1210
    s->chr_event = fd_event;
1211
    s->handler_opaque = opaque;
1212
    if (s->chr_update_read_handler)
1213
        s->chr_update_read_handler(s);
1214
}
1215
             
1216
static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1217
{
1218
    return len;
1219
}
1220

    
1221
static CharDriverState *qemu_chr_open_null(void)
1222
{
1223
    CharDriverState *chr;
1224

    
1225
    chr = qemu_mallocz(sizeof(CharDriverState));
1226
    if (!chr)
1227
        return NULL;
1228
    chr->chr_write = null_chr_write;
1229
    return chr;
1230
}
1231

    
1232
/* MUX driver for serial I/O splitting */
1233
static int term_timestamps;
1234
static int64_t term_timestamps_start;
1235
#define MAX_MUX 4
1236
typedef struct {
1237
    IOCanRWHandler *chr_can_read[MAX_MUX];
1238
    IOReadHandler *chr_read[MAX_MUX];
1239
    IOEventHandler *chr_event[MAX_MUX];
1240
    void *ext_opaque[MAX_MUX];
1241
    CharDriverState *drv;
1242
    int mux_cnt;
1243
    int term_got_escape;
1244
    int max_size;
1245
} MuxDriver;
1246

    
1247

    
1248
static int mux_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1249
{
1250
    MuxDriver *d = chr->opaque;
1251
    int ret;
1252
    if (!term_timestamps) {
1253
        ret = d->drv->chr_write(d->drv, buf, len);
1254
    } else {
1255
        int i;
1256

    
1257
        ret = 0;
1258
        for(i = 0; i < len; i++) {
1259
            ret += d->drv->chr_write(d->drv, buf+i, 1);
1260
            if (buf[i] == '\n') {
1261
                char buf1[64];
1262
                int64_t ti;
1263
                int secs;
1264

    
1265
                ti = get_clock();
1266
                if (term_timestamps_start == -1)
1267
                    term_timestamps_start = ti;
1268
                ti -= term_timestamps_start;
1269
                secs = ti / 1000000000;
1270
                snprintf(buf1, sizeof(buf1),
1271
                         "[%02d:%02d:%02d.%03d] ",
1272
                         secs / 3600,
1273
                         (secs / 60) % 60,
1274
                         secs % 60,
1275
                         (int)((ti / 1000000) % 1000));
1276
                d->drv->chr_write(d->drv, buf1, strlen(buf1));
1277
            }
1278
        }
1279
    }
1280
    return ret;
1281
}
1282

    
1283
static char *mux_help[] = {
1284
    "% h    print this help\n\r",
1285
    "% x    exit emulator\n\r",
1286
    "% s    save disk data back to file (if -snapshot)\n\r",
1287
    "% t    toggle console timestamps\n\r"
1288
    "% b    send break (magic sysrq)\n\r",
1289
    "% c    switch between console and monitor\n\r",
1290
    "% %  sends %\n\r",
1291
    NULL
1292
};
1293

    
1294
static int term_escape_char = 0x01; /* ctrl-a is used for escape */
1295
static void mux_print_help(CharDriverState *chr)
1296
{
1297
    int i, j;
1298
    char ebuf[15] = "Escape-Char";
1299
    char cbuf[50] = "\n\r";
1300

    
1301
    if (term_escape_char > 0 && term_escape_char < 26) {
1302
        sprintf(cbuf,"\n\r");
1303
        sprintf(ebuf,"C-%c", term_escape_char - 1 + 'a');
1304
    } else {
1305
        sprintf(cbuf,"\n\rEscape-Char set to Ascii: 0x%02x\n\r\n\r", term_escape_char);
1306
    }
1307
    chr->chr_write(chr, cbuf, strlen(cbuf));
1308
    for (i = 0; mux_help[i] != NULL; i++) {
1309
        for (j=0; mux_help[i][j] != '\0'; j++) {
1310
            if (mux_help[i][j] == '%')
1311
                chr->chr_write(chr, ebuf, strlen(ebuf));
1312
            else
1313
                chr->chr_write(chr, &mux_help[i][j], 1);
1314
        }
1315
    }
1316
}
1317

    
1318
static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
1319
{
1320
    if (d->term_got_escape) {
1321
        d->term_got_escape = 0;
1322
        if (ch == term_escape_char)
1323
            goto send_char;
1324
        switch(ch) {
1325
        case '?':
1326
        case 'h':
1327
            mux_print_help(chr);
1328
            break;
1329
        case 'x':
1330
            {
1331
                 char *term =  "QEMU: Terminated\n\r";
1332
                 chr->chr_write(chr,term,strlen(term));
1333
                 exit(0);
1334
                 break;
1335
            }
1336
        case 's':
1337
            {
1338
                int i;
1339
                for (i = 0; i < MAX_DISKS; i++) {
1340
                    if (bs_table[i])
1341
                        bdrv_commit(bs_table[i]);
1342
                }
1343
            }
1344
            break;
1345
        case 'b':
1346
            if (chr->chr_event)
1347
                chr->chr_event(chr->opaque, CHR_EVENT_BREAK);
1348
            break;
1349
        case 'c':
1350
            /* Switch to the next registered device */
1351
            chr->focus++;
1352
            if (chr->focus >= d->mux_cnt)
1353
                chr->focus = 0;
1354
            break;
1355
       case 't':
1356
           term_timestamps = !term_timestamps;
1357
           term_timestamps_start = -1;
1358
           break;
1359
        }
1360
    } else if (ch == term_escape_char) {
1361
        d->term_got_escape = 1;
1362
    } else {
1363
    send_char:
1364
        return 1;
1365
    }
1366
    return 0;
1367
}
1368

    
1369
static int mux_chr_can_read(void *opaque)
1370
{
1371
    CharDriverState *chr = opaque;
1372
    MuxDriver *d = chr->opaque;
1373
    if (d->chr_can_read[chr->focus])
1374
       return d->chr_can_read[chr->focus](d->ext_opaque[chr->focus]);
1375
    return 0;
1376
}
1377

    
1378
static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
1379
{
1380
    CharDriverState *chr = opaque;
1381
    MuxDriver *d = chr->opaque;
1382
    int i;
1383
    for(i = 0; i < size; i++)
1384
        if (mux_proc_byte(chr, d, buf[i]))
1385
            d->chr_read[chr->focus](d->ext_opaque[chr->focus], &buf[i], 1);
1386
}
1387

    
1388
static void mux_chr_event(void *opaque, int event)
1389
{
1390
    CharDriverState *chr = opaque;
1391
    MuxDriver *d = chr->opaque;
1392
    int i;
1393

    
1394
    /* Send the event to all registered listeners */
1395
    for (i = 0; i < d->mux_cnt; i++)
1396
        if (d->chr_event[i])
1397
            d->chr_event[i](d->ext_opaque[i], event);
1398
}
1399

    
1400
static void mux_chr_update_read_handler(CharDriverState *chr)
1401
{
1402
    MuxDriver *d = chr->opaque;
1403

    
1404
    if (d->mux_cnt >= MAX_MUX) {
1405
        fprintf(stderr, "Cannot add I/O handlers, MUX array is full\n");
1406
        return;
1407
    }
1408
    d->ext_opaque[d->mux_cnt] = chr->handler_opaque;
1409
    d->chr_can_read[d->mux_cnt] = chr->chr_can_read;
1410
    d->chr_read[d->mux_cnt] = chr->chr_read;
1411
    d->chr_event[d->mux_cnt] = chr->chr_event;
1412
    /* Fix up the real driver with mux routines */
1413
    if (d->mux_cnt == 0) {
1414
        qemu_chr_add_handlers(d->drv, mux_chr_can_read, mux_chr_read,
1415
                              mux_chr_event, chr);
1416
    }
1417
    chr->focus = d->mux_cnt;
1418
    d->mux_cnt++;
1419
}
1420

    
1421
CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
1422
{
1423
    CharDriverState *chr;
1424
    MuxDriver *d;
1425

    
1426
    chr = qemu_mallocz(sizeof(CharDriverState));
1427
    if (!chr)
1428
        return NULL;
1429
    d = qemu_mallocz(sizeof(MuxDriver));
1430
    if (!d) {
1431
        free(chr);
1432
        return NULL;
1433
    }
1434

    
1435
    chr->opaque = d;
1436
    d->drv = drv;
1437
    chr->focus = -1;
1438
    chr->chr_write = mux_chr_write;
1439
    chr->chr_update_read_handler = mux_chr_update_read_handler;
1440
    return chr;
1441
}
1442

    
1443

    
1444
#ifdef _WIN32
1445

    
1446
static void socket_cleanup(void)
1447
{
1448
    WSACleanup();
1449
}
1450

    
1451
static int socket_init(void)
1452
{
1453
    WSADATA Data;
1454
    int ret, err;
1455

    
1456
    ret = WSAStartup(MAKEWORD(2,2), &Data);
1457
    if (ret != 0) {
1458
        err = WSAGetLastError();
1459
        fprintf(stderr, "WSAStartup: %d\n", err);
1460
        return -1;
1461
    }
1462
    atexit(socket_cleanup);
1463
    return 0;
1464
}
1465

    
1466
static int send_all(int fd, const uint8_t *buf, int len1)
1467
{
1468
    int ret, len;
1469
    
1470
    len = len1;
1471
    while (len > 0) {
1472
        ret = send(fd, buf, len, 0);
1473
        if (ret < 0) {
1474
            int errno;
1475
            errno = WSAGetLastError();
1476
            if (errno != WSAEWOULDBLOCK) {
1477
                return -1;
1478
            }
1479
        } else if (ret == 0) {
1480
            break;
1481
        } else {
1482
            buf += ret;
1483
            len -= ret;
1484
        }
1485
    }
1486
    return len1 - len;
1487
}
1488

    
1489
void socket_set_nonblock(int fd)
1490
{
1491
    unsigned long opt = 1;
1492
    ioctlsocket(fd, FIONBIO, &opt);
1493
}
1494

    
1495
#else
1496

    
1497
static int unix_write(int fd, const uint8_t *buf, int len1)
1498
{
1499
    int ret, len;
1500

    
1501
    len = len1;
1502
    while (len > 0) {
1503
        ret = write(fd, buf, len);
1504
        if (ret < 0) {
1505
            if (errno != EINTR && errno != EAGAIN)
1506
                return -1;
1507
        } else if (ret == 0) {
1508
            break;
1509
        } else {
1510
            buf += ret;
1511
            len -= ret;
1512
        }
1513
    }
1514
    return len1 - len;
1515
}
1516

    
1517
static inline int send_all(int fd, const uint8_t *buf, int len1)
1518
{
1519
    return unix_write(fd, buf, len1);
1520
}
1521

    
1522
void socket_set_nonblock(int fd)
1523
{
1524
    fcntl(fd, F_SETFL, O_NONBLOCK);
1525
}
1526
#endif /* !_WIN32 */
1527

    
1528
#ifndef _WIN32
1529

    
1530
typedef struct {
1531
    int fd_in, fd_out;
1532
    int max_size;
1533
} FDCharDriver;
1534

    
1535
#define STDIO_MAX_CLIENTS 1
1536
static int stdio_nb_clients = 0;
1537

    
1538
static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1539
{
1540
    FDCharDriver *s = chr->opaque;
1541
    return unix_write(s->fd_out, buf, len);
1542
}
1543

    
1544
static int fd_chr_read_poll(void *opaque)
1545
{
1546
    CharDriverState *chr = opaque;
1547
    FDCharDriver *s = chr->opaque;
1548

    
1549
    s->max_size = qemu_chr_can_read(chr);
1550
    return s->max_size;
1551
}
1552

    
1553
static void fd_chr_read(void *opaque)
1554
{
1555
    CharDriverState *chr = opaque;
1556
    FDCharDriver *s = chr->opaque;
1557
    int size, len;
1558
    uint8_t buf[1024];
1559
    
1560
    len = sizeof(buf);
1561
    if (len > s->max_size)
1562
        len = s->max_size;
1563
    if (len == 0)
1564
        return;
1565
    size = read(s->fd_in, buf, len);
1566
    if (size == 0) {
1567
        /* FD has been closed. Remove it from the active list.  */
1568
        qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
1569
        return;
1570
    }
1571
    if (size > 0) {
1572
        qemu_chr_read(chr, buf, size);
1573
    }
1574
}
1575

    
1576
static void fd_chr_update_read_handler(CharDriverState *chr)
1577
{
1578
    FDCharDriver *s = chr->opaque;
1579

    
1580
    if (s->fd_in >= 0) {
1581
        if (nographic && s->fd_in == 0) {
1582
        } else {
1583
            qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll, 
1584
                                 fd_chr_read, NULL, chr);
1585
        }
1586
    }
1587
}
1588

    
1589
/* open a character device to a unix fd */
1590
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1591
{
1592
    CharDriverState *chr;
1593
    FDCharDriver *s;
1594

    
1595
    chr = qemu_mallocz(sizeof(CharDriverState));
1596
    if (!chr)
1597
        return NULL;
1598
    s = qemu_mallocz(sizeof(FDCharDriver));
1599
    if (!s) {
1600
        free(chr);
1601
        return NULL;
1602
    }
1603
    s->fd_in = fd_in;
1604
    s->fd_out = fd_out;
1605
    chr->opaque = s;
1606
    chr->chr_write = fd_chr_write;
1607
    chr->chr_update_read_handler = fd_chr_update_read_handler;
1608

    
1609
    qemu_chr_reset(chr);
1610

    
1611
    return chr;
1612
}
1613

    
1614
static CharDriverState *qemu_chr_open_file_out(const char *file_out)
1615
{
1616
    int fd_out;
1617

    
1618
    fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666);
1619
    if (fd_out < 0)
1620
        return NULL;
1621
    return qemu_chr_open_fd(-1, fd_out);
1622
}
1623

    
1624
static CharDriverState *qemu_chr_open_pipe(const char *filename)
1625
{
1626
    int fd_in, fd_out;
1627
    char filename_in[256], filename_out[256];
1628

    
1629
    snprintf(filename_in, 256, "%s.in", filename);
1630
    snprintf(filename_out, 256, "%s.out", filename);
1631
    fd_in = open(filename_in, O_RDWR | O_BINARY);
1632
    fd_out = open(filename_out, O_RDWR | O_BINARY);
1633
    if (fd_in < 0 || fd_out < 0) {
1634
        if (fd_in >= 0)
1635
            close(fd_in);
1636
        if (fd_out >= 0)
1637
            close(fd_out);
1638
        fd_in = fd_out = open(filename, O_RDWR | O_BINARY);
1639
        if (fd_in < 0)
1640
            return NULL;
1641
    }
1642
    return qemu_chr_open_fd(fd_in, fd_out);
1643
}
1644

    
1645

    
1646
/* for STDIO, we handle the case where several clients use it
1647
   (nographic mode) */
1648

    
1649
#define TERM_FIFO_MAX_SIZE 1
1650

    
1651
static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
1652
static int term_fifo_size;
1653

    
1654
static int stdio_read_poll(void *opaque)
1655
{
1656
    CharDriverState *chr = opaque;
1657

    
1658
    /* try to flush the queue if needed */
1659
    if (term_fifo_size != 0 && qemu_chr_can_read(chr) > 0) {
1660
        qemu_chr_read(chr, term_fifo, 1);
1661
        term_fifo_size = 0;
1662
    }
1663
    /* see if we can absorb more chars */
1664
    if (term_fifo_size == 0)
1665
        return 1;
1666
    else
1667
        return 0;
1668
}
1669

    
1670
static void stdio_read(void *opaque)
1671
{
1672
    int size;
1673
    uint8_t buf[1];
1674
    CharDriverState *chr = opaque;
1675

    
1676
    size = read(0, buf, 1);
1677
    if (size == 0) {
1678
        /* stdin has been closed. Remove it from the active list.  */
1679
        qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
1680
        return;
1681
    }
1682
    if (size > 0) {
1683
        if (qemu_chr_can_read(chr) > 0) {
1684
            qemu_chr_read(chr, buf, 1);
1685
        } else if (term_fifo_size == 0) {
1686
            term_fifo[term_fifo_size++] = buf[0];
1687
        }
1688
    }
1689
}
1690

    
1691
/* init terminal so that we can grab keys */
1692
static struct termios oldtty;
1693
static int old_fd0_flags;
1694

    
1695
static void term_exit(void)
1696
{
1697
    tcsetattr (0, TCSANOW, &oldtty);
1698
    fcntl(0, F_SETFL, old_fd0_flags);
1699
}
1700

    
1701
static void term_init(void)
1702
{
1703
    struct termios tty;
1704

    
1705
    tcgetattr (0, &tty);
1706
    oldtty = tty;
1707
    old_fd0_flags = fcntl(0, F_GETFL);
1708

    
1709
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1710
                          |INLCR|IGNCR|ICRNL|IXON);
1711
    tty.c_oflag |= OPOST;
1712
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1713
    /* if graphical mode, we allow Ctrl-C handling */
1714
    if (nographic)
1715
        tty.c_lflag &= ~ISIG;
1716
    tty.c_cflag &= ~(CSIZE|PARENB);
1717
    tty.c_cflag |= CS8;
1718
    tty.c_cc[VMIN] = 1;
1719
    tty.c_cc[VTIME] = 0;
1720
    
1721
    tcsetattr (0, TCSANOW, &tty);
1722

    
1723
    atexit(term_exit);
1724

    
1725
    fcntl(0, F_SETFL, O_NONBLOCK);
1726
}
1727

    
1728
static CharDriverState *qemu_chr_open_stdio(void)
1729
{
1730
    CharDriverState *chr;
1731

    
1732
    if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1733
        return NULL;
1734
    chr = qemu_chr_open_fd(0, 1);
1735
    qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
1736
    stdio_nb_clients++;
1737
    term_init();
1738

    
1739
    return chr;
1740
}
1741

    
1742
#if defined(__linux__)
1743
static CharDriverState *qemu_chr_open_pty(void)
1744
{
1745
    struct termios tty;
1746
    char slave_name[1024];
1747
    int master_fd, slave_fd;
1748
    
1749
    /* Not satisfying */
1750
    if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
1751
        return NULL;
1752
    }
1753
    
1754
    /* Disabling local echo and line-buffered output */
1755
    tcgetattr (master_fd, &tty);
1756
    tty.c_lflag &= ~(ECHO|ICANON|ISIG);
1757
    tty.c_cc[VMIN] = 1;
1758
    tty.c_cc[VTIME] = 0;
1759
    tcsetattr (master_fd, TCSAFLUSH, &tty);
1760

    
1761
    fprintf(stderr, "char device redirected to %s\n", slave_name);
1762
    return qemu_chr_open_fd(master_fd, master_fd);
1763
}
1764

    
1765
static void tty_serial_init(int fd, int speed, 
1766
                            int parity, int data_bits, int stop_bits)
1767
{
1768
    struct termios tty;
1769
    speed_t spd;
1770

    
1771
#if 0
1772
    printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n", 
1773
           speed, parity, data_bits, stop_bits);
1774
#endif
1775
    tcgetattr (fd, &tty);
1776

    
1777
    switch(speed) {
1778
    case 50:
1779
        spd = B50;
1780
        break;
1781
    case 75:
1782
        spd = B75;
1783
        break;
1784
    case 300:
1785
        spd = B300;
1786
        break;
1787
    case 600:
1788
        spd = B600;
1789
        break;
1790
    case 1200:
1791
        spd = B1200;
1792
        break;
1793
    case 2400:
1794
        spd = B2400;
1795
        break;
1796
    case 4800:
1797
        spd = B4800;
1798
        break;
1799
    case 9600:
1800
        spd = B9600;
1801
        break;
1802
    case 19200:
1803
        spd = B19200;
1804
        break;
1805
    case 38400:
1806
        spd = B38400;
1807
        break;
1808
    case 57600:
1809
        spd = B57600;
1810
        break;
1811
    default:
1812
    case 115200:
1813
        spd = B115200;
1814
        break;
1815
    }
1816

    
1817
    cfsetispeed(&tty, spd);
1818
    cfsetospeed(&tty, spd);
1819

    
1820
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1821
                          |INLCR|IGNCR|ICRNL|IXON);
1822
    tty.c_oflag |= OPOST;
1823
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
1824
    tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
1825
    switch(data_bits) {
1826
    default:
1827
    case 8:
1828
        tty.c_cflag |= CS8;
1829
        break;
1830
    case 7:
1831
        tty.c_cflag |= CS7;
1832
        break;
1833
    case 6:
1834
        tty.c_cflag |= CS6;
1835
        break;
1836
    case 5:
1837
        tty.c_cflag |= CS5;
1838
        break;
1839
    }
1840
    switch(parity) {
1841
    default:
1842
    case 'N':
1843
        break;
1844
    case 'E':
1845
        tty.c_cflag |= PARENB;
1846
        break;
1847
    case 'O':
1848
        tty.c_cflag |= PARENB | PARODD;
1849
        break;
1850
    }
1851
    if (stop_bits == 2)
1852
        tty.c_cflag |= CSTOPB;
1853
    
1854
    tcsetattr (fd, TCSANOW, &tty);
1855
}
1856

    
1857
static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
1858
{
1859
    FDCharDriver *s = chr->opaque;
1860
    
1861
    switch(cmd) {
1862
    case CHR_IOCTL_SERIAL_SET_PARAMS:
1863
        {
1864
            QEMUSerialSetParams *ssp = arg;
1865
            tty_serial_init(s->fd_in, ssp->speed, ssp->parity, 
1866
                            ssp->data_bits, ssp->stop_bits);
1867
        }
1868
        break;
1869
    case CHR_IOCTL_SERIAL_SET_BREAK:
1870
        {
1871
            int enable = *(int *)arg;
1872
            if (enable)
1873
                tcsendbreak(s->fd_in, 1);
1874
        }
1875
        break;
1876
    default:
1877
        return -ENOTSUP;
1878
    }
1879
    return 0;
1880
}
1881

    
1882
static CharDriverState *qemu_chr_open_tty(const char *filename)
1883
{
1884
    CharDriverState *chr;
1885
    int fd;
1886

    
1887
    fd = open(filename, O_RDWR | O_NONBLOCK);
1888
    if (fd < 0)
1889
        return NULL;
1890
    fcntl(fd, F_SETFL, O_NONBLOCK);
1891
    tty_serial_init(fd, 115200, 'N', 8, 1);
1892
    chr = qemu_chr_open_fd(fd, fd);
1893
    if (!chr)
1894
        return NULL;
1895
    chr->chr_ioctl = tty_serial_ioctl;
1896
    qemu_chr_reset(chr);
1897
    return chr;
1898
}
1899

    
1900
typedef struct {
1901
    int fd;
1902
    int mode;
1903
} ParallelCharDriver;
1904

    
1905
static int pp_hw_mode(ParallelCharDriver *s, uint16_t mode)
1906
{
1907
    if (s->mode != mode) {
1908
        int m = mode;
1909
        if (ioctl(s->fd, PPSETMODE, &m) < 0)
1910
            return 0;
1911
        s->mode = mode;
1912
    }
1913
    return 1;
1914
}
1915

    
1916
static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
1917
{
1918
    ParallelCharDriver *drv = chr->opaque;
1919
    int fd = drv->fd;
1920
    uint8_t b;
1921

    
1922
    switch(cmd) {
1923
    case CHR_IOCTL_PP_READ_DATA:
1924
        if (ioctl(fd, PPRDATA, &b) < 0)
1925
            return -ENOTSUP;
1926
        *(uint8_t *)arg = b;
1927
        break;
1928
    case CHR_IOCTL_PP_WRITE_DATA:
1929
        b = *(uint8_t *)arg;
1930
        if (ioctl(fd, PPWDATA, &b) < 0)
1931
            return -ENOTSUP;
1932
        break;
1933
    case CHR_IOCTL_PP_READ_CONTROL:
1934
        if (ioctl(fd, PPRCONTROL, &b) < 0)
1935
            return -ENOTSUP;
1936
        /* Linux gives only the lowest bits, and no way to know data
1937
           direction! For better compatibility set the fixed upper
1938
           bits. */
1939
        *(uint8_t *)arg = b | 0xc0;
1940
        break;
1941
    case CHR_IOCTL_PP_WRITE_CONTROL:
1942
        b = *(uint8_t *)arg;
1943
        if (ioctl(fd, PPWCONTROL, &b) < 0)
1944
            return -ENOTSUP;
1945
        break;
1946
    case CHR_IOCTL_PP_READ_STATUS:
1947
        if (ioctl(fd, PPRSTATUS, &b) < 0)
1948
            return -ENOTSUP;
1949
        *(uint8_t *)arg = b;
1950
        break;
1951
    case CHR_IOCTL_PP_EPP_READ_ADDR:
1952
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
1953
            struct ParallelIOArg *parg = arg;
1954
            int n = read(fd, parg->buffer, parg->count);
1955
            if (n != parg->count) {
1956
                return -EIO;
1957
            }
1958
        }
1959
        break;
1960
    case CHR_IOCTL_PP_EPP_READ:
1961
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
1962
            struct ParallelIOArg *parg = arg;
1963
            int n = read(fd, parg->buffer, parg->count);
1964
            if (n != parg->count) {
1965
                return -EIO;
1966
            }
1967
        }
1968
        break;
1969
    case CHR_IOCTL_PP_EPP_WRITE_ADDR:
1970
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
1971
            struct ParallelIOArg *parg = arg;
1972
            int n = write(fd, parg->buffer, parg->count);
1973
            if (n != parg->count) {
1974
                return -EIO;
1975
            }
1976
        }
1977
        break;
1978
    case CHR_IOCTL_PP_EPP_WRITE:
1979
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
1980
            struct ParallelIOArg *parg = arg;
1981
            int n = write(fd, parg->buffer, parg->count);
1982
            if (n != parg->count) {
1983
                return -EIO;
1984
            }
1985
        }
1986
        break;
1987
    default:
1988
        return -ENOTSUP;
1989
    }
1990
    return 0;
1991
}
1992

    
1993
static void pp_close(CharDriverState *chr)
1994
{
1995
    ParallelCharDriver *drv = chr->opaque;
1996
    int fd = drv->fd;
1997

    
1998
    pp_hw_mode(drv, IEEE1284_MODE_COMPAT);
1999
    ioctl(fd, PPRELEASE);
2000
    close(fd);
2001
    qemu_free(drv);
2002
}
2003

    
2004
static CharDriverState *qemu_chr_open_pp(const char *filename)
2005
{
2006
    CharDriverState *chr;
2007
    ParallelCharDriver *drv;
2008
    int fd;
2009

    
2010
    fd = open(filename, O_RDWR);
2011
    if (fd < 0)
2012
        return NULL;
2013

    
2014
    if (ioctl(fd, PPCLAIM) < 0) {
2015
        close(fd);
2016
        return NULL;
2017
    }
2018

    
2019
    drv = qemu_mallocz(sizeof(ParallelCharDriver));
2020
    if (!drv) {
2021
        close(fd);
2022
        return NULL;
2023
    }
2024
    drv->fd = fd;
2025
    drv->mode = IEEE1284_MODE_COMPAT;
2026

    
2027
    chr = qemu_mallocz(sizeof(CharDriverState));
2028
    if (!chr) {
2029
        qemu_free(drv);
2030
        close(fd);
2031
        return NULL;
2032
    }
2033
    chr->chr_write = null_chr_write;
2034
    chr->chr_ioctl = pp_ioctl;
2035
    chr->chr_close = pp_close;
2036
    chr->opaque = drv;
2037

    
2038
    qemu_chr_reset(chr);
2039

    
2040
    return chr;
2041
}
2042

    
2043
#else
2044
static CharDriverState *qemu_chr_open_pty(void)
2045
{
2046
    return NULL;
2047
}
2048
#endif
2049

    
2050
#endif /* !defined(_WIN32) */
2051

    
2052
#ifdef _WIN32
2053
typedef struct {
2054
    int max_size;
2055
    HANDLE hcom, hrecv, hsend;
2056
    OVERLAPPED orecv, osend;
2057
    BOOL fpipe;
2058
    DWORD len;
2059
} WinCharState;
2060

    
2061
#define NSENDBUF 2048
2062
#define NRECVBUF 2048
2063
#define MAXCONNECT 1
2064
#define NTIMEOUT 5000
2065

    
2066
static int win_chr_poll(void *opaque);
2067
static int win_chr_pipe_poll(void *opaque);
2068

    
2069
static void win_chr_close(CharDriverState *chr)
2070
{
2071
    WinCharState *s = chr->opaque;
2072

    
2073
    if (s->hsend) {
2074
        CloseHandle(s->hsend);
2075
        s->hsend = NULL;
2076
    }
2077
    if (s->hrecv) {
2078
        CloseHandle(s->hrecv);
2079
        s->hrecv = NULL;
2080
    }
2081
    if (s->hcom) {
2082
        CloseHandle(s->hcom);
2083
        s->hcom = NULL;
2084
    }
2085
    if (s->fpipe)
2086
        qemu_del_polling_cb(win_chr_pipe_poll, chr);
2087
    else
2088
        qemu_del_polling_cb(win_chr_poll, chr);
2089
}
2090

    
2091
static int win_chr_init(CharDriverState *chr, const char *filename)
2092
{
2093
    WinCharState *s = chr->opaque;
2094
    COMMCONFIG comcfg;
2095
    COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
2096
    COMSTAT comstat;
2097
    DWORD size;
2098
    DWORD err;
2099
    
2100
    s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2101
    if (!s->hsend) {
2102
        fprintf(stderr, "Failed CreateEvent\n");
2103
        goto fail;
2104
    }
2105
    s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2106
    if (!s->hrecv) {
2107
        fprintf(stderr, "Failed CreateEvent\n");
2108
        goto fail;
2109
    }
2110

    
2111
    s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
2112
                      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
2113
    if (s->hcom == INVALID_HANDLE_VALUE) {
2114
        fprintf(stderr, "Failed CreateFile (%lu)\n", GetLastError());
2115
        s->hcom = NULL;
2116
        goto fail;
2117
    }
2118
    
2119
    if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
2120
        fprintf(stderr, "Failed SetupComm\n");
2121
        goto fail;
2122
    }
2123
    
2124
    ZeroMemory(&comcfg, sizeof(COMMCONFIG));
2125
    size = sizeof(COMMCONFIG);
2126
    GetDefaultCommConfig(filename, &comcfg, &size);
2127
    comcfg.dcb.DCBlength = sizeof(DCB);
2128
    CommConfigDialog(filename, NULL, &comcfg);
2129

    
2130
    if (!SetCommState(s->hcom, &comcfg.dcb)) {
2131
        fprintf(stderr, "Failed SetCommState\n");
2132
        goto fail;
2133
    }
2134

    
2135
    if (!SetCommMask(s->hcom, EV_ERR)) {
2136
        fprintf(stderr, "Failed SetCommMask\n");
2137
        goto fail;
2138
    }
2139

    
2140
    cto.ReadIntervalTimeout = MAXDWORD;
2141
    if (!SetCommTimeouts(s->hcom, &cto)) {
2142
        fprintf(stderr, "Failed SetCommTimeouts\n");
2143
        goto fail;
2144
    }
2145
    
2146
    if (!ClearCommError(s->hcom, &err, &comstat)) {
2147
        fprintf(stderr, "Failed ClearCommError\n");
2148
        goto fail;
2149
    }
2150
    qemu_add_polling_cb(win_chr_poll, chr);
2151
    return 0;
2152

    
2153
 fail:
2154
    win_chr_close(chr);
2155
    return -1;
2156
}
2157

    
2158
static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
2159
{
2160
    WinCharState *s = chr->opaque;
2161
    DWORD len, ret, size, err;
2162

    
2163
    len = len1;
2164
    ZeroMemory(&s->osend, sizeof(s->osend));
2165
    s->osend.hEvent = s->hsend;
2166
    while (len > 0) {
2167
        if (s->hsend)
2168
            ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
2169
        else
2170
            ret = WriteFile(s->hcom, buf, len, &size, NULL);
2171
        if (!ret) {
2172
            err = GetLastError();
2173
            if (err == ERROR_IO_PENDING) {
2174
                ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
2175
                if (ret) {
2176
                    buf += size;
2177
                    len -= size;
2178
                } else {
2179
                    break;
2180
                }
2181
            } else {
2182
                break;
2183
            }
2184
        } else {
2185
            buf += size;
2186
            len -= size;
2187
        }
2188
    }
2189
    return len1 - len;
2190
}
2191

    
2192
static int win_chr_read_poll(CharDriverState *chr)
2193
{
2194
    WinCharState *s = chr->opaque;
2195

    
2196
    s->max_size = qemu_chr_can_read(chr);
2197
    return s->max_size;
2198
}
2199

    
2200
static void win_chr_readfile(CharDriverState *chr)
2201
{
2202
    WinCharState *s = chr->opaque;
2203
    int ret, err;
2204
    uint8_t buf[1024];
2205
    DWORD size;
2206
    
2207
    ZeroMemory(&s->orecv, sizeof(s->orecv));
2208
    s->orecv.hEvent = s->hrecv;
2209
    ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
2210
    if (!ret) {
2211
        err = GetLastError();
2212
        if (err == ERROR_IO_PENDING) {
2213
            ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
2214
        }
2215
    }
2216

    
2217
    if (size > 0) {
2218
        qemu_chr_read(chr, buf, size);
2219
    }
2220
}
2221

    
2222
static void win_chr_read(CharDriverState *chr)
2223
{
2224
    WinCharState *s = chr->opaque;
2225

    
2226
    if (s->len > s->max_size)
2227
        s->len = s->max_size;
2228
    if (s->len == 0)
2229
        return;
2230
    
2231
    win_chr_readfile(chr);
2232
}
2233

    
2234
static int win_chr_poll(void *opaque)
2235
{
2236
    CharDriverState *chr = opaque;
2237
    WinCharState *s = chr->opaque;
2238
    COMSTAT status;
2239
    DWORD comerr;
2240
    
2241
    ClearCommError(s->hcom, &comerr, &status);
2242
    if (status.cbInQue > 0) {
2243
        s->len = status.cbInQue;
2244
        win_chr_read_poll(chr);
2245
        win_chr_read(chr);
2246
        return 1;
2247
    }
2248
    return 0;
2249
}
2250

    
2251
static CharDriverState *qemu_chr_open_win(const char *filename)
2252
{
2253
    CharDriverState *chr;
2254
    WinCharState *s;
2255
    
2256
    chr = qemu_mallocz(sizeof(CharDriverState));
2257
    if (!chr)
2258
        return NULL;
2259
    s = qemu_mallocz(sizeof(WinCharState));
2260
    if (!s) {
2261
        free(chr);
2262
        return NULL;
2263
    }
2264
    chr->opaque = s;
2265
    chr->chr_write = win_chr_write;
2266
    chr->chr_close = win_chr_close;
2267

    
2268
    if (win_chr_init(chr, filename) < 0) {
2269
        free(s);
2270
        free(chr);
2271
        return NULL;
2272
    }
2273
    qemu_chr_reset(chr);
2274
    return chr;
2275
}
2276

    
2277
static int win_chr_pipe_poll(void *opaque)
2278
{
2279
    CharDriverState *chr = opaque;
2280
    WinCharState *s = chr->opaque;
2281
    DWORD size;
2282

    
2283
    PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
2284
    if (size > 0) {
2285
        s->len = size;
2286
        win_chr_read_poll(chr);
2287
        win_chr_read(chr);
2288
        return 1;
2289
    }
2290
    return 0;
2291
}
2292

    
2293
static int win_chr_pipe_init(CharDriverState *chr, const char *filename)
2294
{
2295
    WinCharState *s = chr->opaque;
2296
    OVERLAPPED ov;
2297
    int ret;
2298
    DWORD size;
2299
    char openname[256];
2300
    
2301
    s->fpipe = TRUE;
2302

    
2303
    s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2304
    if (!s->hsend) {
2305
        fprintf(stderr, "Failed CreateEvent\n");
2306
        goto fail;
2307
    }
2308
    s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2309
    if (!s->hrecv) {
2310
        fprintf(stderr, "Failed CreateEvent\n");
2311
        goto fail;
2312
    }
2313
    
2314
    snprintf(openname, sizeof(openname), "\\\\.\\pipe\\%s", filename);
2315
    s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
2316
                              PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
2317
                              PIPE_WAIT,
2318
                              MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
2319
    if (s->hcom == INVALID_HANDLE_VALUE) {
2320
        fprintf(stderr, "Failed CreateNamedPipe (%lu)\n", GetLastError());
2321
        s->hcom = NULL;
2322
        goto fail;
2323
    }
2324

    
2325
    ZeroMemory(&ov, sizeof(ov));
2326
    ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
2327
    ret = ConnectNamedPipe(s->hcom, &ov);
2328
    if (ret) {
2329
        fprintf(stderr, "Failed ConnectNamedPipe\n");
2330
        goto fail;
2331
    }
2332

    
2333
    ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
2334
    if (!ret) {
2335
        fprintf(stderr, "Failed GetOverlappedResult\n");
2336
        if (ov.hEvent) {
2337
            CloseHandle(ov.hEvent);
2338
            ov.hEvent = NULL;
2339
        }
2340
        goto fail;
2341
    }
2342

    
2343
    if (ov.hEvent) {
2344
        CloseHandle(ov.hEvent);
2345
        ov.hEvent = NULL;
2346
    }
2347
    qemu_add_polling_cb(win_chr_pipe_poll, chr);
2348
    return 0;
2349

    
2350
 fail:
2351
    win_chr_close(chr);
2352
    return -1;
2353
}
2354

    
2355

    
2356
static CharDriverState *qemu_chr_open_win_pipe(const char *filename)
2357
{
2358
    CharDriverState *chr;
2359
    WinCharState *s;
2360

    
2361
    chr = qemu_mallocz(sizeof(CharDriverState));
2362
    if (!chr)
2363
        return NULL;
2364
    s = qemu_mallocz(sizeof(WinCharState));
2365
    if (!s) {
2366
        free(chr);
2367
        return NULL;
2368
    }
2369
    chr->opaque = s;
2370
    chr->chr_write = win_chr_write;
2371
    chr->chr_close = win_chr_close;
2372
    
2373
    if (win_chr_pipe_init(chr, filename) < 0) {
2374
        free(s);
2375
        free(chr);
2376
        return NULL;
2377
    }
2378
    qemu_chr_reset(chr);
2379
    return chr;
2380
}
2381

    
2382
static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out)
2383
{
2384
    CharDriverState *chr;
2385
    WinCharState *s;
2386

    
2387
    chr = qemu_mallocz(sizeof(CharDriverState));
2388
    if (!chr)
2389
        return NULL;
2390
    s = qemu_mallocz(sizeof(WinCharState));
2391
    if (!s) {
2392
        free(chr);
2393
        return NULL;
2394
    }
2395
    s->hcom = fd_out;
2396
    chr->opaque = s;
2397
    chr->chr_write = win_chr_write;
2398
    qemu_chr_reset(chr);
2399
    return chr;
2400
}
2401
    
2402
static CharDriverState *qemu_chr_open_win_file_out(const char *file_out)
2403
{
2404
    HANDLE fd_out;
2405
    
2406
    fd_out = CreateFile(file_out, GENERIC_WRITE, FILE_SHARE_READ, NULL,
2407
                        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2408
    if (fd_out == INVALID_HANDLE_VALUE)
2409
        return NULL;
2410

    
2411
    return qemu_chr_open_win_file(fd_out);
2412
}
2413
#endif
2414

    
2415
/***********************************************************/
2416
/* UDP Net console */
2417

    
2418
typedef struct {
2419
    int fd;
2420
    struct sockaddr_in daddr;
2421
    char buf[1024];
2422
    int bufcnt;
2423
    int bufptr;
2424
    int max_size;
2425
} NetCharDriver;
2426

    
2427
static int udp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2428
{
2429
    NetCharDriver *s = chr->opaque;
2430

    
2431
    return sendto(s->fd, buf, len, 0,
2432
                  (struct sockaddr *)&s->daddr, sizeof(struct sockaddr_in));
2433
}
2434

    
2435
static int udp_chr_read_poll(void *opaque)
2436
{
2437
    CharDriverState *chr = opaque;
2438
    NetCharDriver *s = chr->opaque;
2439

    
2440
    s->max_size = qemu_chr_can_read(chr);
2441

    
2442
    /* If there were any stray characters in the queue process them
2443
     * first
2444
     */
2445
    while (s->max_size > 0 && s->bufptr < s->bufcnt) {
2446
        qemu_chr_read(chr, &s->buf[s->bufptr], 1);
2447
        s->bufptr++;
2448
        s->max_size = qemu_chr_can_read(chr);
2449
    }
2450
    return s->max_size;
2451
}
2452

    
2453
static void udp_chr_read(void *opaque)
2454
{
2455
    CharDriverState *chr = opaque;
2456
    NetCharDriver *s = chr->opaque;
2457

    
2458
    if (s->max_size == 0)
2459
        return;
2460
    s->bufcnt = recv(s->fd, s->buf, sizeof(s->buf), 0);
2461
    s->bufptr = s->bufcnt;
2462
    if (s->bufcnt <= 0)
2463
        return;
2464

    
2465
    s->bufptr = 0;
2466
    while (s->max_size > 0 && s->bufptr < s->bufcnt) {
2467
        qemu_chr_read(chr, &s->buf[s->bufptr], 1);
2468
        s->bufptr++;
2469
        s->max_size = qemu_chr_can_read(chr);
2470
    }
2471
}
2472

    
2473
static void udp_chr_update_read_handler(CharDriverState *chr)
2474
{
2475
    NetCharDriver *s = chr->opaque;
2476

    
2477
    if (s->fd >= 0) {
2478
        qemu_set_fd_handler2(s->fd, udp_chr_read_poll,
2479
                             udp_chr_read, NULL, chr);
2480
    }
2481
}
2482

    
2483
int parse_host_port(struct sockaddr_in *saddr, const char *str);
2484
#ifndef _WIN32
2485
static int parse_unix_path(struct sockaddr_un *uaddr, const char *str);
2486
#endif
2487
int parse_host_src_port(struct sockaddr_in *haddr,
2488
                        struct sockaddr_in *saddr,
2489
                        const char *str);
2490

    
2491
static CharDriverState *qemu_chr_open_udp(const char *def)
2492
{
2493
    CharDriverState *chr = NULL;
2494
    NetCharDriver *s = NULL;
2495
    int fd = -1;
2496
    struct sockaddr_in saddr;
2497

    
2498
    chr = qemu_mallocz(sizeof(CharDriverState));
2499
    if (!chr)
2500
        goto return_err;
2501
    s = qemu_mallocz(sizeof(NetCharDriver));
2502
    if (!s)
2503
        goto return_err;
2504

    
2505
    fd = socket(PF_INET, SOCK_DGRAM, 0);
2506
    if (fd < 0) {
2507
        perror("socket(PF_INET, SOCK_DGRAM)");
2508
        goto return_err;
2509
    }
2510

    
2511
    if (parse_host_src_port(&s->daddr, &saddr, def) < 0) {
2512
        printf("Could not parse: %s\n", def);
2513
        goto return_err;
2514
    }
2515

    
2516
    if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
2517
    {
2518
        perror("bind");
2519
        goto return_err;
2520
    }
2521

    
2522
    s->fd = fd;
2523
    s->bufcnt = 0;
2524
    s->bufptr = 0;
2525
    chr->opaque = s;
2526
    chr->chr_write = udp_chr_write;
2527
    chr->chr_update_read_handler = udp_chr_update_read_handler;
2528
    return chr;
2529

    
2530
return_err:
2531
    if (chr)
2532
        free(chr);
2533
    if (s)
2534
        free(s);
2535
    if (fd >= 0)
2536
        closesocket(fd);
2537
    return NULL;
2538
}
2539

    
2540
/***********************************************************/
2541
/* TCP Net console */
2542

    
2543
typedef struct {
2544
    int fd, listen_fd;
2545
    int connected;
2546
    int max_size;
2547
    int do_telnetopt;
2548
    int do_nodelay;
2549
    int is_unix;
2550
} TCPCharDriver;
2551

    
2552
static void tcp_chr_accept(void *opaque);
2553

    
2554
static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2555
{
2556
    TCPCharDriver *s = chr->opaque;
2557
    if (s->connected) {
2558
        return send_all(s->fd, buf, len);
2559
    } else {
2560
        /* XXX: indicate an error ? */
2561
        return len;
2562
    }
2563
}
2564

    
2565
static int tcp_chr_read_poll(void *opaque)
2566
{
2567
    CharDriverState *chr = opaque;
2568
    TCPCharDriver *s = chr->opaque;
2569
    if (!s->connected)
2570
        return 0;
2571
    s->max_size = qemu_chr_can_read(chr);
2572
    return s->max_size;
2573
}
2574

    
2575
#define IAC 255
2576
#define IAC_BREAK 243
2577
static void tcp_chr_process_IAC_bytes(CharDriverState *chr,
2578
                                      TCPCharDriver *s,
2579
                                      char *buf, int *size)
2580
{
2581
    /* Handle any telnet client's basic IAC options to satisfy char by
2582
     * char mode with no echo.  All IAC options will be removed from
2583
     * the buf and the do_telnetopt variable will be used to track the
2584
     * state of the width of the IAC information.
2585
     *
2586
     * IAC commands come in sets of 3 bytes with the exception of the
2587
     * "IAC BREAK" command and the double IAC.
2588
     */
2589

    
2590
    int i;
2591
    int j = 0;
2592

    
2593
    for (i = 0; i < *size; i++) {
2594
        if (s->do_telnetopt > 1) {
2595
            if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
2596
                /* Double IAC means send an IAC */
2597
                if (j != i)
2598
                    buf[j] = buf[i];
2599
                j++;
2600
                s->do_telnetopt = 1;
2601
            } else {
2602
                if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) {
2603
                    /* Handle IAC break commands by sending a serial break */
2604
                    qemu_chr_event(chr, CHR_EVENT_BREAK);
2605
                    s->do_telnetopt++;
2606
                }
2607
                s->do_telnetopt++;
2608
            }
2609
            if (s->do_telnetopt >= 4) {
2610
                s->do_telnetopt = 1;
2611
            }
2612
        } else {
2613
            if ((unsigned char)buf[i] == IAC) {
2614
                s->do_telnetopt = 2;
2615
            } else {
2616
                if (j != i)
2617
                    buf[j] = buf[i];
2618
                j++;
2619
            }
2620
        }
2621
    }
2622
    *size = j;
2623
}
2624

    
2625
static void tcp_chr_read(void *opaque)
2626
{
2627
    CharDriverState *chr = opaque;
2628
    TCPCharDriver *s = chr->opaque;
2629
    uint8_t buf[1024];
2630
    int len, size;
2631

    
2632
    if (!s->connected || s->max_size <= 0)
2633
        return;
2634
    len = sizeof(buf);
2635
    if (len > s->max_size)
2636
        len = s->max_size;
2637
    size = recv(s->fd, buf, len, 0);
2638
    if (size == 0) {
2639
        /* connection closed */
2640
        s->connected = 0;
2641
        if (s->listen_fd >= 0) {
2642
            qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
2643
        }
2644
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2645
        closesocket(s->fd);
2646
        s->fd = -1;
2647
    } else if (size > 0) {
2648
        if (s->do_telnetopt)
2649
            tcp_chr_process_IAC_bytes(chr, s, buf, &size);
2650
        if (size > 0)
2651
            qemu_chr_read(chr, buf, size);
2652
    }
2653
}
2654

    
2655
static void tcp_chr_connect(void *opaque)
2656
{
2657
    CharDriverState *chr = opaque;
2658
    TCPCharDriver *s = chr->opaque;
2659

    
2660
    s->connected = 1;
2661
    qemu_set_fd_handler2(s->fd, tcp_chr_read_poll,
2662
                         tcp_chr_read, NULL, chr);
2663
    qemu_chr_reset(chr);
2664
}
2665

    
2666
#define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c;
2667
static void tcp_chr_telnet_init(int fd)
2668
{
2669
    char buf[3];
2670
    /* Send the telnet negotion to put telnet in binary, no echo, single char mode */
2671
    IACSET(buf, 0xff, 0xfb, 0x01);  /* IAC WILL ECHO */
2672
    send(fd, (char *)buf, 3, 0);
2673
    IACSET(buf, 0xff, 0xfb, 0x03);  /* IAC WILL Suppress go ahead */
2674
    send(fd, (char *)buf, 3, 0);
2675
    IACSET(buf, 0xff, 0xfb, 0x00);  /* IAC WILL Binary */
2676
    send(fd, (char *)buf, 3, 0);
2677
    IACSET(buf, 0xff, 0xfd, 0x00);  /* IAC DO Binary */
2678
    send(fd, (char *)buf, 3, 0);
2679
}
2680

    
2681
static void socket_set_nodelay(int fd)
2682
{
2683
    int val = 1;
2684
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
2685
}
2686

    
2687
static void tcp_chr_accept(void *opaque)
2688
{
2689
    CharDriverState *chr = opaque;
2690
    TCPCharDriver *s = chr->opaque;
2691
    struct sockaddr_in saddr;
2692
#ifndef _WIN32
2693
    struct sockaddr_un uaddr;
2694
#endif
2695
    struct sockaddr *addr;
2696
    socklen_t len;
2697
    int fd;
2698

    
2699
    for(;;) {
2700
#ifndef _WIN32
2701
        if (s->is_unix) {
2702
            len = sizeof(uaddr);
2703
            addr = (struct sockaddr *)&uaddr;
2704
        } else
2705
#endif
2706
        {
2707
            len = sizeof(saddr);
2708
            addr = (struct sockaddr *)&saddr;
2709
        }
2710
        fd = accept(s->listen_fd, addr, &len);
2711
        if (fd < 0 && errno != EINTR) {
2712
            return;
2713
        } else if (fd >= 0) {
2714
            if (s->do_telnetopt)
2715
                tcp_chr_telnet_init(fd);
2716
            break;
2717
        }
2718
    }
2719
    socket_set_nonblock(fd);
2720
    if (s->do_nodelay)
2721
        socket_set_nodelay(fd);
2722
    s->fd = fd;
2723
    qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
2724
    tcp_chr_connect(chr);
2725
}
2726

    
2727
static void tcp_chr_close(CharDriverState *chr)
2728
{
2729
    TCPCharDriver *s = chr->opaque;
2730
    if (s->fd >= 0)
2731
        closesocket(s->fd);
2732
    if (s->listen_fd >= 0)
2733
        closesocket(s->listen_fd);
2734
    qemu_free(s);
2735
}
2736

    
2737
static CharDriverState *qemu_chr_open_tcp(const char *host_str, 
2738
                                          int is_telnet,
2739
                                          int is_unix)
2740
{
2741
    CharDriverState *chr = NULL;
2742
    TCPCharDriver *s = NULL;
2743
    int fd = -1, ret, err, val;
2744
    int is_listen = 0;
2745
    int is_waitconnect = 1;
2746
    int do_nodelay = 0;
2747
    const char *ptr;
2748
    struct sockaddr_in saddr;
2749
#ifndef _WIN32
2750
    struct sockaddr_un uaddr;
2751
#endif
2752
    struct sockaddr *addr;
2753
    socklen_t addrlen;
2754

    
2755
#ifndef _WIN32
2756
    if (is_unix) {
2757
        addr = (struct sockaddr *)&uaddr;
2758
        addrlen = sizeof(uaddr);
2759
        if (parse_unix_path(&uaddr, host_str) < 0)
2760
            goto fail;
2761
    } else
2762
#endif
2763
    {
2764
        addr = (struct sockaddr *)&saddr;
2765
        addrlen = sizeof(saddr);
2766
        if (parse_host_port(&saddr, host_str) < 0)
2767
            goto fail;
2768
    }
2769

    
2770
    ptr = host_str;
2771
    while((ptr = strchr(ptr,','))) {
2772
        ptr++;
2773
        if (!strncmp(ptr,"server",6)) {
2774
            is_listen = 1;
2775
        } else if (!strncmp(ptr,"nowait",6)) {
2776
            is_waitconnect = 0;
2777
        } else if (!strncmp(ptr,"nodelay",6)) {
2778
            do_nodelay = 1;
2779
        } else {
2780
            printf("Unknown option: %s\n", ptr);
2781
            goto fail;
2782
        }
2783
    }
2784
    if (!is_listen)
2785
        is_waitconnect = 0;
2786

    
2787
    chr = qemu_mallocz(sizeof(CharDriverState));
2788
    if (!chr)
2789
        goto fail;
2790
    s = qemu_mallocz(sizeof(TCPCharDriver));
2791
    if (!s)
2792
        goto fail;
2793

    
2794
#ifndef _WIN32
2795
    if (is_unix)
2796
        fd = socket(PF_UNIX, SOCK_STREAM, 0);
2797
    else
2798
#endif
2799
        fd = socket(PF_INET, SOCK_STREAM, 0);
2800
        
2801
    if (fd < 0) 
2802
        goto fail;
2803

    
2804
    if (!is_waitconnect)
2805
        socket_set_nonblock(fd);
2806

    
2807
    s->connected = 0;
2808
    s->fd = -1;
2809
    s->listen_fd = -1;
2810
    s->is_unix = is_unix;
2811
    s->do_nodelay = do_nodelay && !is_unix;
2812

    
2813
    chr->opaque = s;
2814
    chr->chr_write = tcp_chr_write;
2815
    chr->chr_close = tcp_chr_close;
2816

    
2817
    if (is_listen) {
2818
        /* allow fast reuse */
2819
#ifndef _WIN32
2820
        if (is_unix) {
2821
            char path[109];
2822
            strncpy(path, uaddr.sun_path, 108);
2823
            path[108] = 0;
2824
            unlink(path);
2825
        } else
2826
#endif
2827
        {
2828
            val = 1;
2829
            setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2830
        }
2831
        
2832
        ret = bind(fd, addr, addrlen);
2833
        if (ret < 0)
2834
            goto fail;
2835

    
2836
        ret = listen(fd, 0);
2837
        if (ret < 0)
2838
            goto fail;
2839

    
2840
        s->listen_fd = fd;
2841
        qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
2842
        if (is_telnet)
2843
            s->do_telnetopt = 1;
2844
    } else {
2845
        for(;;) {
2846
            ret = connect(fd, addr, addrlen);
2847
            if (ret < 0) {
2848
                err = socket_error();
2849
                if (err == EINTR || err == EWOULDBLOCK) {
2850
                } else if (err == EINPROGRESS) {
2851
                    break;
2852
                } else {
2853
                    goto fail;
2854
                }
2855
            } else {
2856
                s->connected = 1;
2857
                break;
2858
            }
2859
        }
2860
        s->fd = fd;
2861
        socket_set_nodelay(fd);
2862
        if (s->connected)
2863
            tcp_chr_connect(chr);
2864
        else
2865
            qemu_set_fd_handler(s->fd, NULL, tcp_chr_connect, chr);
2866
    }
2867
    
2868
    if (is_listen && is_waitconnect) {
2869
        printf("QEMU waiting for connection on: %s\n", host_str);
2870
        tcp_chr_accept(chr);
2871
        socket_set_nonblock(s->listen_fd);
2872
    }
2873

    
2874
    return chr;
2875
 fail:
2876
    if (fd >= 0)
2877
        closesocket(fd);
2878
    qemu_free(s);
2879
    qemu_free(chr);
2880
    return NULL;
2881
}
2882

    
2883
CharDriverState *qemu_chr_open(const char *filename)
2884
{
2885
    const char *p;
2886

    
2887
    if (!strcmp(filename, "vc")) {
2888
        return text_console_init(&display_state);
2889
    } else if (!strcmp(filename, "null")) {
2890
        return qemu_chr_open_null();
2891
    } else 
2892
    if (strstart(filename, "tcp:", &p)) {
2893
        return qemu_chr_open_tcp(p, 0, 0);
2894
    } else
2895
    if (strstart(filename, "telnet:", &p)) {
2896
        return qemu_chr_open_tcp(p, 1, 0);
2897
    } else
2898
    if (strstart(filename, "udp:", &p)) {
2899
        return qemu_chr_open_udp(p);
2900
    } else
2901
    if (strstart(filename, "mon:", &p)) {
2902
        CharDriverState *drv = qemu_chr_open(p);
2903
        if (drv) {
2904
            drv = qemu_chr_open_mux(drv);
2905
            monitor_init(drv, !nographic);
2906
            return drv;
2907
        }
2908
        printf("Unable to open driver: %s\n", p);
2909
        return 0;
2910
    } else
2911
#ifndef _WIN32
2912
    if (strstart(filename, "unix:", &p)) {
2913
        return qemu_chr_open_tcp(p, 0, 1);
2914
    } else if (strstart(filename, "file:", &p)) {
2915
        return qemu_chr_open_file_out(p);
2916
    } else if (strstart(filename, "pipe:", &p)) {
2917
        return qemu_chr_open_pipe(p);
2918
    } else if (!strcmp(filename, "pty")) {
2919
        return qemu_chr_open_pty();
2920
    } else if (!strcmp(filename, "stdio")) {
2921
        return qemu_chr_open_stdio();
2922
    } else 
2923
#endif
2924
#if defined(__linux__)
2925
    if (strstart(filename, "/dev/parport", NULL)) {
2926
        return qemu_chr_open_pp(filename);
2927
    } else 
2928
    if (strstart(filename, "/dev/", NULL)) {
2929
        return qemu_chr_open_tty(filename);
2930
    } else 
2931
#endif
2932
#ifdef _WIN32
2933
    if (strstart(filename, "COM", NULL)) {
2934
        return qemu_chr_open_win(filename);
2935
    } else
2936
    if (strstart(filename, "pipe:", &p)) {
2937
        return qemu_chr_open_win_pipe(p);
2938
    } else
2939
    if (strstart(filename, "file:", &p)) {
2940
        return qemu_chr_open_win_file_out(p);
2941
    }
2942
#endif
2943
    {
2944
        return NULL;
2945
    }
2946
}
2947

    
2948
void qemu_chr_close(CharDriverState *chr)
2949
{
2950
    if (chr->chr_close)
2951
        chr->chr_close(chr);
2952
}
2953

    
2954
/***********************************************************/
2955
/* network device redirectors */
2956

    
2957
void hex_dump(FILE *f, const uint8_t *buf, int size)
2958
{
2959
    int len, i, j, c;
2960

    
2961
    for(i=0;i<size;i+=16) {
2962
        len = size - i;
2963
        if (len > 16)
2964
            len = 16;
2965
        fprintf(f, "%08x ", i);
2966
        for(j=0;j<16;j++) {
2967
            if (j < len)
2968
                fprintf(f, " %02x", buf[i+j]);
2969
            else
2970
                fprintf(f, "   ");
2971
        }
2972
        fprintf(f, " ");
2973
        for(j=0;j<len;j++) {
2974
            c = buf[i+j];
2975
            if (c < ' ' || c > '~')
2976
                c = '.';
2977
            fprintf(f, "%c", c);
2978
        }
2979
        fprintf(f, "\n");
2980
    }
2981
}
2982

    
2983
static int parse_macaddr(uint8_t *macaddr, const char *p)
2984
{
2985
    int i;
2986
    for(i = 0; i < 6; i++) {
2987
        macaddr[i] = strtol(p, (char **)&p, 16);
2988
        if (i == 5) {
2989
            if (*p != '\0') 
2990
                return -1;
2991
        } else {
2992
            if (*p != ':') 
2993
                return -1;
2994
            p++;
2995
        }
2996
    }
2997
    return 0;
2998
}
2999

    
3000
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
3001
{
3002
    const char *p, *p1;
3003
    int len;
3004
    p = *pp;
3005
    p1 = strchr(p, sep);
3006
    if (!p1)
3007
        return -1;
3008
    len = p1 - p;
3009
    p1++;
3010
    if (buf_size > 0) {
3011
        if (len > buf_size - 1)
3012
            len = buf_size - 1;
3013
        memcpy(buf, p, len);
3014
        buf[len] = '\0';
3015
    }
3016
    *pp = p1;
3017
    return 0;
3018
}
3019

    
3020
int parse_host_src_port(struct sockaddr_in *haddr,
3021
                        struct sockaddr_in *saddr,
3022
                        const char *input_str)
3023
{
3024
    char *str = strdup(input_str);
3025
    char *host_str = str;
3026
    char *src_str;
3027
    char *ptr;
3028

    
3029
    /*
3030
     * Chop off any extra arguments at the end of the string which
3031
     * would start with a comma, then fill in the src port information
3032
     * if it was provided else use the "any address" and "any port".
3033
     */
3034
    if ((ptr = strchr(str,',')))
3035
        *ptr = '\0';
3036

    
3037
    if ((src_str = strchr(input_str,'@'))) {
3038
        *src_str = '\0';
3039
        src_str++;
3040
    }
3041

    
3042
    if (parse_host_port(haddr, host_str) < 0)
3043
        goto fail;
3044

    
3045
    if (!src_str || *src_str == '\0')
3046
        src_str = ":0";
3047

    
3048
    if (parse_host_port(saddr, src_str) < 0)
3049
        goto fail;
3050

    
3051
    free(str);
3052
    return(0);
3053

    
3054
fail:
3055
    free(str);
3056
    return -1;
3057
}
3058

    
3059
int parse_host_port(struct sockaddr_in *saddr, const char *str)
3060
{
3061
    char buf[512];
3062
    struct hostent *he;
3063
    const char *p, *r;
3064
    int port;
3065

    
3066
    p = str;
3067
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3068
        return -1;
3069
    saddr->sin_family = AF_INET;
3070
    if (buf[0] == '\0') {
3071
        saddr->sin_addr.s_addr = 0;
3072
    } else {
3073
        if (isdigit(buf[0])) {
3074
            if (!inet_aton(buf, &saddr->sin_addr))
3075
                return -1;
3076
        } else {
3077
            if ((he = gethostbyname(buf)) == NULL)
3078
                return - 1;
3079
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
3080
        }
3081
    }
3082
    port = strtol(p, (char **)&r, 0);
3083
    if (r == p)
3084
        return -1;
3085
    saddr->sin_port = htons(port);
3086
    return 0;
3087
}
3088

    
3089
#ifndef _WIN32
3090
static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
3091
{
3092
    const char *p;
3093
    int len;
3094

    
3095
    len = MIN(108, strlen(str));
3096
    p = strchr(str, ',');
3097
    if (p)
3098
        len = MIN(len, p - str);
3099

    
3100
    memset(uaddr, 0, sizeof(*uaddr));
3101

    
3102
    uaddr->sun_family = AF_UNIX;
3103
    memcpy(uaddr->sun_path, str, len);
3104

    
3105
    return 0;
3106
}
3107
#endif
3108

    
3109
/* find or alloc a new VLAN */
3110
VLANState *qemu_find_vlan(int id)
3111
{
3112
    VLANState **pvlan, *vlan;
3113
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
3114
        if (vlan->id == id)
3115
            return vlan;
3116
    }
3117
    vlan = qemu_mallocz(sizeof(VLANState));
3118
    if (!vlan)
3119
        return NULL;
3120
    vlan->id = id;
3121
    vlan->next = NULL;
3122
    pvlan = &first_vlan;
3123
    while (*pvlan != NULL)
3124
        pvlan = &(*pvlan)->next;
3125
    *pvlan = vlan;
3126
    return vlan;
3127
}
3128

    
3129
VLANClientState *qemu_new_vlan_client(VLANState *vlan,
3130
                                      IOReadHandler *fd_read,
3131
                                      IOCanRWHandler *fd_can_read,
3132
                                      void *opaque)
3133
{
3134
    VLANClientState *vc, **pvc;
3135
    vc = qemu_mallocz(sizeof(VLANClientState));
3136
    if (!vc)
3137
        return NULL;
3138
    vc->fd_read = fd_read;
3139
    vc->fd_can_read = fd_can_read;
3140
    vc->opaque = opaque;
3141
    vc->vlan = vlan;
3142

    
3143
    vc->next = NULL;
3144
    pvc = &vlan->first_client;
3145
    while (*pvc != NULL)
3146
        pvc = &(*pvc)->next;
3147
    *pvc = vc;
3148
    return vc;
3149
}
3150

    
3151
int qemu_can_send_packet(VLANClientState *vc1)
3152
{
3153
    VLANState *vlan = vc1->vlan;
3154
    VLANClientState *vc;
3155

    
3156
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
3157
        if (vc != vc1) {
3158
            if (vc->fd_can_read && !vc->fd_can_read(vc->opaque))
3159
                return 0;
3160
        }
3161
    }
3162
    return 1;
3163
}
3164

    
3165
void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
3166
{
3167
    VLANState *vlan = vc1->vlan;
3168
    VLANClientState *vc;
3169

    
3170
#if 0
3171
    printf("vlan %d send:\n", vlan->id);
3172
    hex_dump(stdout, buf, size);
3173
#endif
3174
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
3175
        if (vc != vc1) {
3176
            vc->fd_read(vc->opaque, buf, size);
3177
        }
3178
    }
3179
}
3180

    
3181
#if defined(CONFIG_SLIRP)
3182

    
3183
/* slirp network adapter */
3184

    
3185
static int slirp_inited;
3186
static VLANClientState *slirp_vc;
3187

    
3188
int slirp_can_output(void)
3189
{
3190
    return !slirp_vc || qemu_can_send_packet(slirp_vc);
3191
}
3192

    
3193
void slirp_output(const uint8_t *pkt, int pkt_len)
3194
{
3195
#if 0
3196
    printf("slirp output:\n");
3197
    hex_dump(stdout, pkt, pkt_len);
3198
#endif
3199
    if (!slirp_vc)
3200
        return;
3201
    qemu_send_packet(slirp_vc, pkt, pkt_len);
3202
}
3203

    
3204
static void slirp_receive(void *opaque, const uint8_t *buf, int size)
3205
{
3206
#if 0
3207
    printf("slirp input:\n");
3208
    hex_dump(stdout, buf, size);
3209
#endif
3210
    slirp_input(buf, size);
3211
}
3212

    
3213
static int net_slirp_init(VLANState *vlan)
3214
{
3215
    if (!slirp_inited) {
3216
        slirp_inited = 1;
3217
        slirp_init();
3218
    }
3219
    slirp_vc = qemu_new_vlan_client(vlan, 
3220
                                    slirp_receive, NULL, NULL);
3221
    snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
3222
    return 0;
3223
}
3224

    
3225
static void net_slirp_redir(const char *redir_str)
3226
{
3227
    int is_udp;
3228
    char buf[256], *r;
3229
    const char *p;
3230
    struct in_addr guest_addr;
3231
    int host_port, guest_port;
3232
    
3233
    if (!slirp_inited) {
3234
        slirp_inited = 1;
3235
        slirp_init();
3236
    }
3237

    
3238
    p = redir_str;
3239
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3240
        goto fail;
3241
    if (!strcmp(buf, "tcp")) {
3242
        is_udp = 0;
3243
    } else if (!strcmp(buf, "udp")) {
3244
        is_udp = 1;
3245
    } else {
3246
        goto fail;
3247
    }
3248

    
3249
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3250
        goto fail;
3251
    host_port = strtol(buf, &r, 0);
3252
    if (r == buf)
3253
        goto fail;
3254

    
3255
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3256
        goto fail;
3257
    if (buf[0] == '\0') {
3258
        pstrcpy(buf, sizeof(buf), "10.0.2.15");
3259
    }
3260
    if (!inet_aton(buf, &guest_addr))
3261
        goto fail;
3262
    
3263
    guest_port = strtol(p, &r, 0);
3264
    if (r == p)
3265
        goto fail;
3266
    
3267
    if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
3268
        fprintf(stderr, "qemu: could not set up redirection\n");
3269
        exit(1);
3270
    }
3271
    return;
3272
 fail:
3273
    fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
3274
    exit(1);
3275
}
3276
    
3277
#ifndef _WIN32
3278

    
3279
char smb_dir[1024];
3280

    
3281
static void smb_exit(void)
3282
{
3283
    DIR *d;
3284
    struct dirent *de;
3285
    char filename[1024];
3286

    
3287
    /* erase all the files in the directory */
3288
    d = opendir(smb_dir);
3289
    for(;;) {
3290
        de = readdir(d);
3291
        if (!de)
3292
            break;
3293
        if (strcmp(de->d_name, ".") != 0 &&
3294
            strcmp(de->d_name, "..") != 0) {
3295
            snprintf(filename, sizeof(filename), "%s/%s", 
3296
                     smb_dir, de->d_name);
3297
            unlink(filename);
3298
        }
3299
    }
3300
    closedir(d);
3301
    rmdir(smb_dir);
3302
}
3303

    
3304
/* automatic user mode samba server configuration */
3305
void net_slirp_smb(const char *exported_dir)
3306
{
3307
    char smb_conf[1024];
3308
    char smb_cmdline[1024];
3309
    FILE *f;
3310

    
3311
    if (!slirp_inited) {
3312
        slirp_inited = 1;
3313
        slirp_init();
3314
    }
3315

    
3316
    /* XXX: better tmp dir construction */
3317
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
3318
    if (mkdir(smb_dir, 0700) < 0) {
3319
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
3320
        exit(1);
3321
    }
3322
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
3323
    
3324
    f = fopen(smb_conf, "w");
3325
    if (!f) {
3326
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
3327
        exit(1);
3328
    }
3329
    fprintf(f, 
3330
            "[global]\n"
3331
            "private dir=%s\n"
3332
            "smb ports=0\n"
3333
            "socket address=127.0.0.1\n"
3334
            "pid directory=%s\n"
3335
            "lock directory=%s\n"
3336
            "log file=%s/log.smbd\n"
3337
            "smb passwd file=%s/smbpasswd\n"
3338
            "security = share\n"
3339
            "[qemu]\n"
3340
            "path=%s\n"
3341
            "read only=no\n"
3342
            "guest ok=yes\n",
3343
            smb_dir,
3344
            smb_dir,
3345
            smb_dir,
3346
            smb_dir,
3347
            smb_dir,
3348
            exported_dir
3349
            );
3350
    fclose(f);
3351
    atexit(smb_exit);
3352

    
3353
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
3354
             SMBD_COMMAND, smb_conf);
3355
    
3356
    slirp_add_exec(0, smb_cmdline, 4, 139);
3357
}
3358

    
3359
#endif /* !defined(_WIN32) */
3360

    
3361
#endif /* CONFIG_SLIRP */
3362

    
3363
#if !defined(_WIN32)
3364

    
3365
typedef struct TAPState {
3366
    VLANClientState *vc;
3367
    int fd;
3368
} TAPState;
3369

    
3370
static void tap_receive(void *opaque, const uint8_t *buf, int size)
3371
{
3372
    TAPState *s = opaque;
3373
    int ret;
3374
    for(;;) {
3375
        ret = write(s->fd, buf, size);
3376
        if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
3377
        } else {
3378
            break;
3379
        }
3380
    }
3381
}
3382

    
3383
static void tap_send(void *opaque)
3384
{
3385
    TAPState *s = opaque;
3386
    uint8_t buf[4096];
3387
    int size;
3388

    
3389
#ifdef __sun__
3390
    struct strbuf sbuf;
3391
    int f = 0;
3392
    sbuf.maxlen = sizeof(buf);
3393
    sbuf.buf = buf;
3394
    size = getmsg(s->fd, NULL, &sbuf, &f) >=0 ? sbuf.len : -1;
3395
#else
3396
    size = read(s->fd, buf, sizeof(buf));
3397
#endif
3398
    if (size > 0) {
3399
        qemu_send_packet(s->vc, buf, size);
3400
    }
3401
}
3402

    
3403
/* fd support */
3404

    
3405
static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
3406
{
3407
    TAPState *s;
3408

    
3409
    s = qemu_mallocz(sizeof(TAPState));
3410
    if (!s)
3411
        return NULL;
3412
    s->fd = fd;
3413
    s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
3414
    qemu_set_fd_handler(s->fd, tap_send, NULL, s);
3415
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
3416
    return s;
3417
}
3418

    
3419
#ifdef _BSD
3420
static int tap_open(char *ifname, int ifname_size)
3421
{
3422
    int fd;
3423
    char *dev;
3424
    struct stat s;
3425

    
3426
    fd = open("/dev/tap", O_RDWR);
3427
    if (fd < 0) {
3428
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
3429
        return -1;
3430
    }
3431

    
3432
    fstat(fd, &s);
3433
    dev = devname(s.st_rdev, S_IFCHR);
3434
    pstrcpy(ifname, ifname_size, dev);
3435

    
3436
    fcntl(fd, F_SETFL, O_NONBLOCK);
3437
    return fd;
3438
}
3439
#elif defined(__sun__)
3440
#define TUNNEWPPA       (('T'<<16) | 0x0001)
3441
/* 
3442
 * Allocate TAP device, returns opened fd. 
3443
 * Stores dev name in the first arg(must be large enough).
3444
 */  
3445
int tap_alloc(char *dev)
3446
{
3447
    int tap_fd, if_fd, ppa = -1;
3448
    static int ip_fd = 0;
3449
    char *ptr;
3450

    
3451
    static int arp_fd = 0;
3452
    int ip_muxid, arp_muxid;
3453
    struct strioctl  strioc_if, strioc_ppa;
3454
    int link_type = I_PLINK;;
3455
    struct lifreq ifr;
3456
    char actual_name[32] = "";
3457

    
3458
    memset(&ifr, 0x0, sizeof(ifr));
3459

    
3460
    if( *dev ){
3461
       ptr = dev;        
3462
       while( *ptr && !isdigit((int)*ptr) ) ptr++; 
3463
       ppa = atoi(ptr);
3464
    }
3465

    
3466
    /* Check if IP device was opened */
3467
    if( ip_fd )
3468
       close(ip_fd);
3469

    
3470
    if( (ip_fd = open("/dev/udp", O_RDWR, 0)) < 0){
3471
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
3472
       return -1;
3473
    }
3474

    
3475
    if( (tap_fd = open("/dev/tap", O_RDWR, 0)) < 0){
3476
       syslog(LOG_ERR, "Can't open /dev/tap");
3477
       return -1;
3478
    }
3479

    
3480
    /* Assign a new PPA and get its unit number. */
3481
    strioc_ppa.ic_cmd = TUNNEWPPA;
3482
    strioc_ppa.ic_timout = 0;
3483
    strioc_ppa.ic_len = sizeof(ppa);
3484
    strioc_ppa.ic_dp = (char *)&ppa;
3485
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
3486
       syslog (LOG_ERR, "Can't assign new interface");
3487

    
3488
    if( (if_fd = open("/dev/tap", O_RDWR, 0)) < 0){
3489
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
3490
       return -1;
3491
    }
3492
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
3493
       syslog(LOG_ERR, "Can't push IP module");
3494
       return -1;
3495
    }
3496

    
3497
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
3498
        syslog(LOG_ERR, "Can't get flags\n");
3499

    
3500
    snprintf (actual_name, 32, "tap%d", ppa);
3501
    strncpy (ifr.lifr_name, actual_name, sizeof (ifr.lifr_name));
3502

    
3503
    ifr.lifr_ppa = ppa;
3504
    /* Assign ppa according to the unit number returned by tun device */
3505

    
3506
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
3507
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
3508
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
3509
        syslog (LOG_ERR, "Can't get flags\n");
3510
    /* Push arp module to if_fd */
3511
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
3512
        syslog (LOG_ERR, "Can't push ARP module (2)");
3513

    
3514
    /* Push arp module to ip_fd */
3515
    if (ioctl (ip_fd, I_POP, NULL) < 0)
3516
        syslog (LOG_ERR, "I_POP failed\n");
3517
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
3518
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
3519
    /* Open arp_fd */
3520
    if ((arp_fd = open ("/dev/tap", O_RDWR, 0)) < 0)
3521
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
3522

    
3523
    /* Set ifname to arp */
3524
    strioc_if.ic_cmd = SIOCSLIFNAME;
3525
    strioc_if.ic_timout = 0;
3526
    strioc_if.ic_len = sizeof(ifr);
3527
    strioc_if.ic_dp = (char *)&ifr;
3528
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
3529
        syslog (LOG_ERR, "Can't set ifname to arp\n");
3530
    }
3531

    
3532
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
3533
       syslog(LOG_ERR, "Can't link TAP device to IP");
3534
       return -1;
3535
    }
3536

    
3537
    if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
3538
        syslog (LOG_ERR, "Can't link TAP device to ARP");
3539

    
3540
    close (if_fd);
3541

    
3542
    memset(&ifr, 0x0, sizeof(ifr));
3543
    strncpy (ifr.lifr_name, actual_name, sizeof (ifr.lifr_name));
3544
    ifr.lifr_ip_muxid  = ip_muxid;
3545
    ifr.lifr_arp_muxid = arp_muxid;
3546

    
3547
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
3548
    {
3549
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
3550
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
3551
      syslog (LOG_ERR, "Can't set multiplexor id");
3552
    }
3553

    
3554
    sprintf(dev, "tap%d", ppa);
3555
    return tap_fd;
3556
}
3557

    
3558
static int tap_open(char *ifname, int ifname_size)
3559
{
3560
    char  dev[10]="";
3561
    int fd;
3562
    if( (fd = tap_alloc(dev)) < 0 ){
3563
       fprintf(stderr, "Cannot allocate TAP device\n");
3564
       return -1;
3565
    }
3566
    pstrcpy(ifname, ifname_size, dev);
3567
    fcntl(fd, F_SETFL, O_NONBLOCK);
3568
    return fd;
3569
}
3570
#else
3571
static int tap_open(char *ifname, int ifname_size)
3572
{
3573
    struct ifreq ifr;
3574
    int fd, ret;
3575
    
3576
    fd = open("/dev/net/tun", O_RDWR);
3577
    if (fd < 0) {
3578
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
3579
        return -1;
3580
    }
3581
    memset(&ifr, 0, sizeof(ifr));
3582
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
3583
    if (ifname[0] != '\0')
3584
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
3585
    else
3586
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
3587
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
3588
    if (ret != 0) {
3589
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
3590
        close(fd);
3591
        return -1;
3592
    }
3593
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
3594
    fcntl(fd, F_SETFL, O_NONBLOCK);
3595
    return fd;
3596
}
3597
#endif
3598

    
3599
static int net_tap_init(VLANState *vlan, const char *ifname1,
3600
                        const char *setup_script)
3601
{
3602
    TAPState *s;
3603
    int pid, status, fd;
3604
    char *args[3];
3605
    char **parg;
3606
    char ifname[128];
3607

    
3608
    if (ifname1 != NULL)
3609
        pstrcpy(ifname, sizeof(ifname), ifname1);
3610
    else
3611
        ifname[0] = '\0';
3612
    fd = tap_open(ifname, sizeof(ifname));
3613
    if (fd < 0)
3614
        return -1;
3615

    
3616
    if (!setup_script || !strcmp(setup_script, "no"))
3617
        setup_script = "";
3618
    if (setup_script[0] != '\0') {
3619
        /* try to launch network init script */
3620
        pid = fork();
3621
        if (pid >= 0) {
3622
            if (pid == 0) {
3623
                parg = args;
3624
                *parg++ = (char *)setup_script;
3625
                *parg++ = ifname;
3626
                *parg++ = NULL;
3627
                execv(setup_script, args);
3628
                _exit(1);
3629
            }
3630
            while (waitpid(pid, &status, 0) != pid);
3631
            if (!WIFEXITED(status) ||
3632
                WEXITSTATUS(status) != 0) {
3633
                fprintf(stderr, "%s: could not launch network script\n",
3634
                        setup_script);
3635
                return -1;
3636
            }
3637
        }
3638
    }
3639
    s = net_tap_fd_init(vlan, fd);
3640
    if (!s)
3641
        return -1;
3642
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), 
3643
             "tap: ifname=%s setup_script=%s", ifname, setup_script);
3644
    return 0;
3645
}
3646

    
3647
#endif /* !_WIN32 */
3648

    
3649
/* network connection */
3650
typedef struct NetSocketState {
3651
    VLANClientState *vc;
3652
    int fd;
3653
    int state; /* 0 = getting length, 1 = getting data */
3654
    int index;
3655
    int packet_len;
3656
    uint8_t buf[4096];
3657
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
3658
} NetSocketState;
3659

    
3660
typedef struct NetSocketListenState {
3661
    VLANState *vlan;
3662
    int fd;
3663
} NetSocketListenState;
3664

    
3665
/* XXX: we consider we can send the whole packet without blocking */
3666
static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
3667
{
3668
    NetSocketState *s = opaque;
3669
    uint32_t len;
3670
    len = htonl(size);
3671

    
3672
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
3673
    send_all(s->fd, buf, size);
3674
}
3675

    
3676
static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
3677
{
3678
    NetSocketState *s = opaque;
3679
    sendto(s->fd, buf, size, 0, 
3680
           (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
3681
}
3682

    
3683
static void net_socket_send(void *opaque)
3684
{
3685
    NetSocketState *s = opaque;
3686
    int l, size, err;
3687
    uint8_t buf1[4096];
3688
    const uint8_t *buf;
3689

    
3690
    size = recv(s->fd, buf1, sizeof(buf1), 0);
3691
    if (size < 0) {
3692
        err = socket_error();
3693
        if (err != EWOULDBLOCK) 
3694
            goto eoc;
3695
    } else if (size == 0) {
3696
        /* end of connection */
3697
    eoc:
3698
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
3699
        closesocket(s->fd);
3700
        return;
3701
    }
3702
    buf = buf1;
3703
    while (size > 0) {
3704
        /* reassemble a packet from the network */
3705
        switch(s->state) {
3706
        case 0:
3707
            l = 4 - s->index;
3708
            if (l > size)
3709
                l = size;
3710
            memcpy(s->buf + s->index, buf, l);
3711
            buf += l;
3712
            size -= l;
3713
            s->index += l;
3714
            if (s->index == 4) {
3715
                /* got length */
3716
                s->packet_len = ntohl(*(uint32_t *)s->buf);
3717
                s->index = 0;
3718
                s->state = 1;
3719
            }
3720
            break;
3721
        case 1:
3722
            l = s->packet_len - s->index;
3723
            if (l > size)
3724
                l = size;
3725
            memcpy(s->buf + s->index, buf, l);
3726
            s->index += l;
3727
            buf += l;
3728
            size -= l;
3729
            if (s->index >= s->packet_len) {
3730
                qemu_send_packet(s->vc, s->buf, s->packet_len);
3731
                s->index = 0;
3732
                s->state = 0;
3733
            }
3734
            break;
3735
        }
3736
    }
3737
}
3738

    
3739
static void net_socket_send_dgram(void *opaque)
3740
{
3741
    NetSocketState *s = opaque;
3742
    int size;
3743

    
3744
    size = recv(s->fd, s->buf, sizeof(s->buf), 0);
3745
    if (size < 0) 
3746
        return;
3747
    if (size == 0) {
3748
        /* end of connection */
3749
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
3750
        return;
3751
    }
3752
    qemu_send_packet(s->vc, s->buf, size);
3753
}
3754

    
3755
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
3756
{
3757
    struct ip_mreq imr;
3758
    int fd;
3759
    int val, ret;
3760
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
3761
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
3762
                inet_ntoa(mcastaddr->sin_addr), 
3763
                (int)ntohl(mcastaddr->sin_addr.s_addr));
3764
        return -1;
3765

    
3766
    }
3767
    fd = socket(PF_INET, SOCK_DGRAM, 0);
3768
    if (fd < 0) {
3769
        perror("socket(PF_INET, SOCK_DGRAM)");
3770
        return -1;
3771
    }
3772

    
3773
    val = 1;
3774
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, 
3775
                   (const char *)&val, sizeof(val));
3776
    if (ret < 0) {
3777
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
3778
        goto fail;
3779
    }
3780

    
3781
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
3782
    if (ret < 0) {
3783
        perror("bind");
3784
        goto fail;
3785
    }
3786
    
3787
    /* Add host to multicast group */
3788
    imr.imr_multiaddr = mcastaddr->sin_addr;
3789
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
3790

    
3791
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
3792
                     (const char *)&imr, sizeof(struct ip_mreq));
3793
    if (ret < 0) {
3794
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
3795
        goto fail;
3796
    }
3797

    
3798
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
3799
    val = 1;
3800
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, 
3801
                   (const char *)&val, sizeof(val));
3802
    if (ret < 0) {
3803
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
3804
        goto fail;
3805
    }
3806

    
3807
    socket_set_nonblock(fd);
3808
    return fd;
3809
fail:
3810
    if (fd >= 0) 
3811
        closesocket(fd);
3812
    return -1;
3813
}
3814

    
3815
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd, 
3816
                                          int is_connected)
3817
{
3818
    struct sockaddr_in saddr;
3819
    int newfd;
3820
    socklen_t saddr_len;
3821
    NetSocketState *s;
3822

    
3823
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
3824
     * Because this may be "shared" socket from a "master" process, datagrams would be recv() 
3825
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
3826
     */
3827

    
3828
    if (is_connected) {
3829
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
3830
            /* must be bound */
3831
            if (saddr.sin_addr.s_addr==0) {
3832
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
3833
                        fd);
3834
                return NULL;
3835
            }
3836
            /* clone dgram socket */
3837
            newfd = net_socket_mcast_create(&saddr);
3838
            if (newfd < 0) {
3839
                /* error already reported by net_socket_mcast_create() */
3840
                close(fd);
3841
                return NULL;
3842
            }
3843
            /* clone newfd to fd, close newfd */
3844
            dup2(newfd, fd);
3845
            close(newfd);
3846
        
3847
        } else {
3848
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
3849
                    fd, strerror(errno));
3850
            return NULL;
3851
        }
3852
    }
3853

    
3854
    s = qemu_mallocz(sizeof(NetSocketState));
3855
    if (!s)
3856
        return NULL;
3857
    s->fd = fd;
3858

    
3859
    s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
3860
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
3861

    
3862
    /* mcast: save bound address as dst */
3863
    if (is_connected) s->dgram_dst=saddr;
3864

    
3865
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3866
            "socket: fd=%d (%s mcast=%s:%d)", 
3867
            fd, is_connected? "cloned" : "",
3868
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
3869
    return s;
3870
}
3871

    
3872
static void net_socket_connect(void *opaque)
3873
{
3874
    NetSocketState *s = opaque;
3875
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
3876
}
3877

    
3878
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd, 
3879
                                          int is_connected)
3880
{
3881
    NetSocketState *s;
3882
    s = qemu_mallocz(sizeof(NetSocketState));
3883
    if (!s)
3884
        return NULL;
3885
    s->fd = fd;
3886
    s->vc = qemu_new_vlan_client(vlan, 
3887
                                 net_socket_receive, NULL, s);
3888
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3889
             "socket: fd=%d", fd);
3890
    if (is_connected) {
3891
        net_socket_connect(s);
3892
    } else {
3893
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
3894
    }
3895
    return s;
3896
}
3897

    
3898
static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd, 
3899
                                          int is_connected)
3900
{
3901
    int so_type=-1, optlen=sizeof(so_type);
3902

    
3903
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type, &optlen)< 0) {
3904
        fprintf(stderr, "qemu: error: setsockopt(SO_TYPE) for fd=%d failed\n", fd);
3905
        return NULL;
3906
    }
3907
    switch(so_type) {
3908
    case SOCK_DGRAM:
3909
        return net_socket_fd_init_dgram(vlan, fd, is_connected);
3910
    case SOCK_STREAM:
3911
        return net_socket_fd_init_stream(vlan, fd, is_connected);
3912
    default:
3913
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
3914
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
3915
        return net_socket_fd_init_stream(vlan, fd, is_connected);
3916
    }
3917
    return NULL;
3918
}
3919

    
3920
static void net_socket_accept(void *opaque)
3921
{
3922
    NetSocketListenState *s = opaque;    
3923
    NetSocketState *s1;
3924
    struct sockaddr_in saddr;
3925
    socklen_t len;
3926
    int fd;
3927

    
3928
    for(;;) {
3929
        len = sizeof(saddr);
3930
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
3931
        if (fd < 0 && errno != EINTR) {
3932
            return;
3933
        } else if (fd >= 0) {
3934
            break;
3935
        }
3936
    }
3937
    s1 = net_socket_fd_init(s->vlan, fd, 1); 
3938
    if (!s1) {
3939
        closesocket(fd);
3940
    } else {
3941
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
3942
                 "socket: connection from %s:%d", 
3943
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
3944
    }
3945
}
3946

    
3947
static int net_socket_listen_init(VLANState *vlan, const char *host_str)
3948
{
3949
    NetSocketListenState *s;
3950
    int fd, val, ret;
3951
    struct sockaddr_in saddr;
3952

    
3953
    if (parse_host_port(&saddr, host_str) < 0)
3954
        return -1;
3955
    
3956
    s = qemu_mallocz(sizeof(NetSocketListenState));
3957
    if (!s)
3958
        return -1;
3959

    
3960
    fd = socket(PF_INET, SOCK_STREAM, 0);
3961
    if (fd < 0) {
3962
        perror("socket");
3963
        return -1;
3964
    }
3965
    socket_set_nonblock(fd);
3966

    
3967
    /* allow fast reuse */
3968
    val = 1;
3969
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
3970
    
3971
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
3972
    if (ret < 0) {
3973
        perror("bind");
3974
        return -1;
3975
    }
3976
    ret = listen(fd, 0);
3977
    if (ret < 0) {
3978
        perror("listen");
3979
        return -1;
3980
    }
3981
    s->vlan = vlan;
3982
    s->fd = fd;
3983
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
3984
    return 0;
3985
}
3986

    
3987
static int net_socket_connect_init(VLANState *vlan, const char *host_str)
3988
{
3989
    NetSocketState *s;
3990
    int fd, connected, ret, err;
3991
    struct sockaddr_in saddr;
3992

    
3993
    if (parse_host_port(&saddr, host_str) < 0)
3994
        return -1;
3995

    
3996
    fd = socket(PF_INET, SOCK_STREAM, 0);
3997
    if (fd < 0) {
3998
        perror("socket");
3999
        return -1;
4000
    }
4001
    socket_set_nonblock(fd);
4002

    
4003
    connected = 0;
4004
    for(;;) {
4005
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
4006
        if (ret < 0) {
4007
            err = socket_error();
4008
            if (err == EINTR || err == EWOULDBLOCK) {
4009
            } else if (err == EINPROGRESS) {
4010
                break;
4011
            } else {
4012
                perror("connect");
4013
                closesocket(fd);
4014
                return -1;
4015
            }
4016
        } else {
4017
            connected = 1;
4018
            break;
4019
        }
4020
    }
4021
    s = net_socket_fd_init(vlan, fd, connected);
4022
    if (!s)
4023
        return -1;
4024
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4025
             "socket: connect to %s:%d", 
4026
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4027
    return 0;
4028
}
4029

    
4030
static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
4031
{
4032
    NetSocketState *s;
4033
    int fd;
4034
    struct sockaddr_in saddr;
4035

    
4036
    if (parse_host_port(&saddr, host_str) < 0)
4037
        return -1;
4038

    
4039

    
4040
    fd = net_socket_mcast_create(&saddr);
4041
    if (fd < 0)
4042
        return -1;
4043

    
4044
    s = net_socket_fd_init(vlan, fd, 0);
4045
    if (!s)
4046
        return -1;
4047

    
4048
    s->dgram_dst = saddr;
4049
    
4050
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4051
             "socket: mcast=%s:%d", 
4052
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4053
    return 0;
4054

    
4055
}
4056

    
4057
static int get_param_value(char *buf, int buf_size,
4058
                           const char *tag, const char *str)
4059
{
4060
    const char *p;
4061
    char *q;
4062
    char option[128];
4063

    
4064
    p = str;
4065
    for(;;) {
4066
        q = option;
4067
        while (*p != '\0' && *p != '=') {
4068
            if ((q - option) < sizeof(option) - 1)
4069
                *q++ = *p;
4070
            p++;
4071
        }
4072
        *q = '\0';
4073
        if (*p != '=')
4074
            break;
4075
        p++;
4076
        if (!strcmp(tag, option)) {
4077
            q = buf;
4078
            while (*p != '\0' && *p != ',') {
4079
                if ((q - buf) < buf_size - 1)
4080
                    *q++ = *p;
4081
                p++;
4082
            }
4083
            *q = '\0';
4084
            return q - buf;
4085
        } else {
4086
            while (*p != '\0' && *p != ',') {
4087
                p++;
4088
            }
4089
        }
4090
        if (*p != ',')
4091
            break;
4092
        p++;
4093
    }
4094
    return 0;
4095
}
4096

    
4097
static int net_client_init(const char *str)
4098
{
4099
    const char *p;
4100
    char *q;
4101
    char device[64];
4102
    char buf[1024];
4103
    int vlan_id, ret;
4104
    VLANState *vlan;
4105

    
4106
    p = str;
4107
    q = device;
4108
    while (*p != '\0' && *p != ',') {
4109
        if ((q - device) < sizeof(device) - 1)
4110
            *q++ = *p;
4111
        p++;
4112
    }
4113
    *q = '\0';
4114
    if (*p == ',')
4115
        p++;
4116
    vlan_id = 0;
4117
    if (get_param_value(buf, sizeof(buf), "vlan", p)) {
4118
        vlan_id = strtol(buf, NULL, 0);
4119
    }
4120
    vlan = qemu_find_vlan(vlan_id);
4121
    if (!vlan) {
4122
        fprintf(stderr, "Could not create vlan %d\n", vlan_id);
4123
        return -1;
4124
    }
4125
    if (!strcmp(device, "nic")) {
4126
        NICInfo *nd;
4127
        uint8_t *macaddr;
4128

    
4129
        if (nb_nics >= MAX_NICS) {
4130
            fprintf(stderr, "Too Many NICs\n");
4131
            return -1;
4132
        }
4133
        nd = &nd_table[nb_nics];
4134
        macaddr = nd->macaddr;
4135
        macaddr[0] = 0x52;
4136
        macaddr[1] = 0x54;
4137
        macaddr[2] = 0x00;
4138
        macaddr[3] = 0x12;
4139
        macaddr[4] = 0x34;
4140
        macaddr[5] = 0x56 + nb_nics;
4141

    
4142
        if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
4143
            if (parse_macaddr(macaddr, buf) < 0) {
4144
                fprintf(stderr, "invalid syntax for ethernet address\n");
4145
                return -1;
4146
            }
4147
        }
4148
        if (get_param_value(buf, sizeof(buf), "model", p)) {
4149
            nd->model = strdup(buf);
4150
        }
4151
        nd->vlan = vlan;
4152
        nb_nics++;
4153
        ret = 0;
4154
    } else
4155
    if (!strcmp(device, "none")) {
4156
        /* does nothing. It is needed to signal that no network cards
4157
           are wanted */
4158
        ret = 0;
4159
    } else
4160
#ifdef CONFIG_SLIRP
4161
    if (!strcmp(device, "user")) {
4162
        if (get_param_value(buf, sizeof(buf), "hostname", p)) {
4163
            pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
4164
        }
4165
        ret = net_slirp_init(vlan);
4166
    } else
4167
#endif
4168
#ifdef _WIN32
4169
    if (!strcmp(device, "tap")) {
4170
        char ifname[64];
4171
        if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
4172
            fprintf(stderr, "tap: no interface name\n");
4173
            return -1;
4174
        }
4175
        ret = tap_win32_init(vlan, ifname);
4176
    } else
4177
#else
4178
    if (!strcmp(device, "tap")) {
4179
        char ifname[64];
4180
        char setup_script[1024];
4181
        int fd;
4182
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
4183
            fd = strtol(buf, NULL, 0);
4184
            ret = -1;
4185
            if (net_tap_fd_init(vlan, fd))
4186
                ret = 0;
4187
        } else {
4188
            if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
4189
                ifname[0] = '\0';
4190
            }
4191
            if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
4192
                pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
4193
            }
4194
            ret = net_tap_init(vlan, ifname, setup_script);
4195
        }
4196
    } else
4197
#endif
4198
    if (!strcmp(device, "socket")) {
4199
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
4200
            int fd;
4201
            fd = strtol(buf, NULL, 0);
4202
            ret = -1;
4203
            if (net_socket_fd_init(vlan, fd, 1))
4204
                ret = 0;
4205
        } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
4206
            ret = net_socket_listen_init(vlan, buf);
4207
        } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
4208
            ret = net_socket_connect_init(vlan, buf);
4209
        } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
4210
            ret = net_socket_mcast_init(vlan, buf);
4211
        } else {
4212
            fprintf(stderr, "Unknown socket options: %s\n", p);
4213
            return -1;
4214
        }
4215
    } else
4216
    {
4217
        fprintf(stderr, "Unknown network device: %s\n", device);
4218
        return -1;
4219
    }
4220
    if (ret < 0) {
4221
        fprintf(stderr, "Could not initialize device '%s'\n", device);
4222
    }
4223
    
4224
    return ret;
4225
}
4226

    
4227
void do_info_network(void)
4228
{
4229
    VLANState *vlan;
4230
    VLANClientState *vc;
4231

    
4232
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
4233
        term_printf("VLAN %d devices:\n", vlan->id);
4234
        for(vc = vlan->first_client; vc != NULL; vc = vc->next)
4235
            term_printf("  %s\n", vc->info_str);
4236
    }
4237
}
4238

    
4239
/***********************************************************/
4240
/* USB devices */
4241

    
4242
static USBPort *used_usb_ports;
4243
static USBPort *free_usb_ports;
4244

    
4245
/* ??? Maybe change this to register a hub to keep track of the topology.  */
4246
void qemu_register_usb_port(USBPort *port, void *opaque, int index,
4247
                            usb_attachfn attach)
4248
{
4249
    port->opaque = opaque;
4250
    port->index = index;
4251
    port->attach = attach;
4252
    port->next = free_usb_ports;
4253
    free_usb_ports = port;
4254
}
4255

    
4256
static int usb_device_add(const char *devname)
4257
{
4258
    const char *p;
4259
    USBDevice *dev;
4260
    USBPort *port;
4261

    
4262
    if (!free_usb_ports)
4263
        return -1;
4264

    
4265
    if (strstart(devname, "host:", &p)) {
4266
        dev = usb_host_device_open(p);
4267
    } else if (!strcmp(devname, "mouse")) {
4268
        dev = usb_mouse_init();
4269
    } else if (!strcmp(devname, "tablet")) {
4270
        dev = usb_tablet_init();
4271
    } else if (strstart(devname, "disk:", &p)) {
4272
        dev = usb_msd_init(p);
4273
    } else {
4274
        return -1;
4275
    }
4276
    if (!dev)
4277
        return -1;
4278

    
4279
    /* Find a USB port to add the device to.  */
4280
    port = free_usb_ports;
4281
    if (!port->next) {
4282
        USBDevice *hub;
4283

    
4284
        /* Create a new hub and chain it on.  */
4285
        free_usb_ports = NULL;
4286
        port->next = used_usb_ports;
4287
        used_usb_ports = port;
4288

    
4289
        hub = usb_hub_init(VM_USB_HUB_SIZE);
4290
        usb_attach(port, hub);
4291
        port = free_usb_ports;
4292
    }
4293

    
4294
    free_usb_ports = port->next;
4295
    port->next = used_usb_ports;
4296
    used_usb_ports = port;
4297
    usb_attach(port, dev);
4298
    return 0;
4299
}
4300

    
4301
static int usb_device_del(const char *devname)
4302
{
4303
    USBPort *port;
4304
    USBPort **lastp;
4305
    USBDevice *dev;
4306
    int bus_num, addr;
4307
    const char *p;
4308

    
4309
    if (!used_usb_ports)
4310
        return -1;
4311

    
4312
    p = strchr(devname, '.');
4313
    if (!p) 
4314
        return -1;
4315
    bus_num = strtoul(devname, NULL, 0);
4316
    addr = strtoul(p + 1, NULL, 0);
4317
    if (bus_num != 0)
4318
        return -1;
4319

    
4320
    lastp = &used_usb_ports;
4321
    port = used_usb_ports;
4322
    while (port && port->dev->addr != addr) {
4323
        lastp = &port->next;
4324
        port = port->next;
4325
    }
4326

    
4327
    if (!port)
4328
        return -1;
4329

    
4330
    dev = port->dev;
4331
    *lastp = port->next;
4332
    usb_attach(port, NULL);
4333
    dev->handle_destroy(dev);
4334
    port->next = free_usb_ports;
4335
    free_usb_ports = port;
4336
    return 0;
4337
}
4338

    
4339
void do_usb_add(const char *devname)
4340
{
4341
    int ret;
4342
    ret = usb_device_add(devname);
4343
    if (ret < 0) 
4344
        term_printf("Could not add USB device '%s'\n", devname);
4345
}
4346

    
4347
void do_usb_del(const char *devname)
4348
{
4349
    int ret;
4350
    ret = usb_device_del(devname);
4351
    if (ret < 0) 
4352
        term_printf("Could not remove USB device '%s'\n", devname);
4353
}
4354

    
4355
void usb_info(void)
4356
{
4357
    USBDevice *dev;
4358
    USBPort *port;
4359
    const char *speed_str;
4360

    
4361
    if (!usb_enabled) {
4362
        term_printf("USB support not enabled\n");
4363
        return;
4364
    }
4365

    
4366
    for (port = used_usb_ports; port; port = port->next) {
4367
        dev = port->dev;
4368
        if (!dev)
4369
            continue;
4370
        switch(dev->speed) {
4371
        case USB_SPEED_LOW: 
4372
            speed_str = "1.5"; 
4373
            break;
4374
        case USB_SPEED_FULL: 
4375
            speed_str = "12"; 
4376
            break;
4377
        case USB_SPEED_HIGH: 
4378
            speed_str = "480"; 
4379
            break;
4380
        default:
4381
            speed_str = "?"; 
4382
            break;
4383
        }
4384
        term_printf("  Device %d.%d, Speed %s Mb/s, Product %s\n", 
4385
                    0, dev->addr, speed_str, dev->devname);
4386
    }
4387
}
4388

    
4389
/***********************************************************/
4390
/* pid file */
4391

    
4392
static char *pid_filename;
4393

    
4394
/* Remove PID file. Called on normal exit */
4395

    
4396
static void remove_pidfile(void) 
4397
{
4398
    unlink (pid_filename);
4399
}
4400

    
4401
static void create_pidfile(const char *filename)
4402
{
4403
    struct stat pidstat;
4404
    FILE *f;
4405

    
4406
    /* Try to write our PID to the named file */
4407
    if (stat(filename, &pidstat) < 0) {
4408
        if (errno == ENOENT) {
4409
            if ((f = fopen (filename, "w")) == NULL) {
4410
                perror("Opening pidfile");
4411
                exit(1);
4412
            }
4413
            fprintf(f, "%d\n", getpid());
4414
            fclose(f);
4415
            pid_filename = qemu_strdup(filename);
4416
            if (!pid_filename) {
4417
                fprintf(stderr, "Could not save PID filename");
4418
                exit(1);
4419
            }
4420
            atexit(remove_pidfile);
4421
        }
4422
    } else {
4423
        fprintf(stderr, "%s already exists. Remove it and try again.\n", 
4424
                filename);
4425
        exit(1);
4426
    }
4427
}
4428

    
4429
/***********************************************************/
4430
/* dumb display */
4431

    
4432
static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
4433
{
4434
}
4435

    
4436
static void dumb_resize(DisplayState *ds, int w, int h)
4437
{
4438
}
4439

    
4440
static void dumb_refresh(DisplayState *ds)
4441
{
4442
    vga_hw_update();
4443
}
4444

    
4445
void dumb_display_init(DisplayState *ds)
4446
{
4447
    ds->data = NULL;
4448
    ds->linesize = 0;
4449
    ds->depth = 0;
4450
    ds->dpy_update = dumb_update;
4451
    ds->dpy_resize = dumb_resize;
4452
    ds->dpy_refresh = dumb_refresh;
4453
}
4454

    
4455
/***********************************************************/
4456
/* I/O handling */
4457

    
4458
#define MAX_IO_HANDLERS 64
4459

    
4460
typedef struct IOHandlerRecord {
4461
    int fd;
4462
    IOCanRWHandler *fd_read_poll;
4463
    IOHandler *fd_read;
4464
    IOHandler *fd_write;
4465
    int deleted;
4466
    void *opaque;
4467
    /* temporary data */
4468
    struct pollfd *ufd;
4469
    struct IOHandlerRecord *next;
4470
} IOHandlerRecord;
4471

    
4472
static IOHandlerRecord *first_io_handler;
4473

    
4474
/* XXX: fd_read_poll should be suppressed, but an API change is
4475
   necessary in the character devices to suppress fd_can_read(). */
4476
int qemu_set_fd_handler2(int fd, 
4477
                         IOCanRWHandler *fd_read_poll, 
4478
                         IOHandler *fd_read, 
4479
                         IOHandler *fd_write, 
4480
                         void *opaque)
4481
{
4482
    IOHandlerRecord **pioh, *ioh;
4483

    
4484
    if (!fd_read && !fd_write) {
4485
        pioh = &first_io_handler;
4486
        for(;;) {
4487
            ioh = *pioh;
4488
            if (ioh == NULL)
4489
                break;
4490
            if (ioh->fd == fd) {
4491
                ioh->deleted = 1;
4492
                break;
4493
            }
4494
            pioh = &ioh->next;
4495
        }
4496
    } else {
4497
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
4498
            if (ioh->fd == fd)
4499
                goto found;
4500
        }
4501
        ioh = qemu_mallocz(sizeof(IOHandlerRecord));
4502
        if (!ioh)
4503
            return -1;
4504
        ioh->next = first_io_handler;
4505
        first_io_handler = ioh;
4506
    found:
4507
        ioh->fd = fd;
4508
        ioh->fd_read_poll = fd_read_poll;
4509
        ioh->fd_read = fd_read;
4510
        ioh->fd_write = fd_write;
4511
        ioh->opaque = opaque;
4512
        ioh->deleted = 0;
4513
    }
4514
    return 0;
4515
}
4516

    
4517
int qemu_set_fd_handler(int fd, 
4518
                        IOHandler *fd_read, 
4519
                        IOHandler *fd_write, 
4520
                        void *opaque)
4521
{
4522
    return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
4523
}
4524

    
4525
/***********************************************************/
4526
/* Polling handling */
4527

    
4528
typedef struct PollingEntry {
4529
    PollingFunc *func;
4530
    void *opaque;
4531
    struct PollingEntry *next;
4532
} PollingEntry;
4533

    
4534
static PollingEntry *first_polling_entry;
4535

    
4536
int qemu_add_polling_cb(PollingFunc *func, void *opaque)
4537
{
4538
    PollingEntry **ppe, *pe;
4539
    pe = qemu_mallocz(sizeof(PollingEntry));
4540
    if (!pe)
4541
        return -1;
4542
    pe->func = func;
4543
    pe->opaque = opaque;
4544
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
4545
    *ppe = pe;
4546
    return 0;
4547
}
4548

    
4549
void qemu_del_polling_cb(PollingFunc *func, void *opaque)
4550
{
4551
    PollingEntry **ppe, *pe;
4552
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
4553
        pe = *ppe;
4554
        if (pe->func == func && pe->opaque == opaque) {
4555
            *ppe = pe->next;
4556
            qemu_free(pe);
4557
            break;
4558
        }
4559
    }
4560
}
4561

    
4562
#ifdef _WIN32
4563
/***********************************************************/
4564
/* Wait objects support */
4565
typedef struct WaitObjects {
4566
    int num;
4567
    HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
4568
    WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
4569
    void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
4570
} WaitObjects;
4571

    
4572
static WaitObjects wait_objects = {0};
4573
    
4574
int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
4575
{
4576
    WaitObjects *w = &wait_objects;
4577

    
4578
    if (w->num >= MAXIMUM_WAIT_OBJECTS)
4579
        return -1;
4580
    w->events[w->num] = handle;
4581
    w->func[w->num] = func;
4582
    w->opaque[w->num] = opaque;
4583
    w->num++;
4584
    return 0;
4585
}
4586

    
4587
void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
4588
{
4589
    int i, found;
4590
    WaitObjects *w = &wait_objects;
4591

    
4592
    found = 0;
4593
    for (i = 0; i < w->num; i++) {
4594
        if (w->events[i] == handle)
4595
            found = 1;
4596
        if (found) {
4597
            w->events[i] = w->events[i + 1];
4598
            w->func[i] = w->func[i + 1];
4599
            w->opaque[i] = w->opaque[i + 1];
4600
        }            
4601
    }
4602
    if (found)
4603
        w->num--;
4604
}
4605
#endif
4606

    
4607
/***********************************************************/
4608
/* savevm/loadvm support */
4609

    
4610
#define IO_BUF_SIZE 32768
4611

    
4612
struct QEMUFile {
4613
    FILE *outfile;
4614
    BlockDriverState *bs;
4615
    int is_file;
4616
    int is_writable;
4617
    int64_t base_offset;
4618
    int64_t buf_offset; /* start of buffer when writing, end of buffer
4619
                           when reading */
4620
    int buf_index;
4621
    int buf_size; /* 0 when writing */
4622
    uint8_t buf[IO_BUF_SIZE];
4623
};
4624

    
4625
QEMUFile *qemu_fopen(const char *filename, const char *mode)
4626
{
4627
    QEMUFile *f;
4628

    
4629
    f = qemu_mallocz(sizeof(QEMUFile));
4630
    if (!f)
4631
        return NULL;
4632
    if (!strcmp(mode, "wb")) {
4633
        f->is_writable = 1;
4634
    } else if (!strcmp(mode, "rb")) {
4635
        f->is_writable = 0;
4636
    } else {
4637
        goto fail;
4638
    }
4639
    f->outfile = fopen(filename, mode);
4640
    if (!f->outfile)
4641
        goto fail;
4642
    f->is_file = 1;
4643
    return f;
4644
 fail:
4645
    if (f->outfile)
4646
        fclose(f->outfile);
4647
    qemu_free(f);
4648
    return NULL;
4649
}
4650

    
4651
QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable)
4652
{
4653
    QEMUFile *f;
4654

    
4655
    f = qemu_mallocz(sizeof(QEMUFile));
4656
    if (!f)
4657
        return NULL;
4658
    f->is_file = 0;
4659
    f->bs = bs;
4660
    f->is_writable = is_writable;
4661
    f->base_offset = offset;
4662
    return f;
4663
}
4664

    
4665
void qemu_fflush(QEMUFile *f)
4666
{
4667
    if (!f->is_writable)
4668
        return;
4669
    if (f->buf_index > 0) {
4670
        if (f->is_file) {
4671
            fseek(f->outfile, f->buf_offset, SEEK_SET);
4672
            fwrite(f->buf, 1, f->buf_index, f->outfile);
4673
        } else {
4674
            bdrv_pwrite(f->bs, f->base_offset + f->buf_offset, 
4675
                        f->buf, f->buf_index);
4676
        }
4677
        f->buf_offset += f->buf_index;
4678
        f->buf_index = 0;
4679
    }
4680
}
4681

    
4682
static void qemu_fill_buffer(QEMUFile *f)
4683
{
4684
    int len;
4685

    
4686
    if (f->is_writable)
4687
        return;
4688
    if (f->is_file) {
4689
        fseek(f->outfile, f->buf_offset, SEEK_SET);
4690
        len = fread(f->buf, 1, IO_BUF_SIZE, f->outfile);
4691
        if (len < 0)
4692
            len = 0;
4693
    } else {
4694
        len = bdrv_pread(f->bs, f->base_offset + f->buf_offset, 
4695
                         f->buf, IO_BUF_SIZE);
4696
        if (len < 0)
4697
            len = 0;
4698
    }
4699
    f->buf_index = 0;
4700
    f->buf_size = len;
4701
    f->buf_offset += len;
4702
}
4703

    
4704
void qemu_fclose(QEMUFile *f)
4705
{
4706
    if (f->is_writable)
4707
        qemu_fflush(f);
4708
    if (f->is_file) {
4709
        fclose(f->outfile);
4710
    }
4711
    qemu_free(f);
4712
}
4713

    
4714
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
4715
{
4716
    int l;
4717
    while (size > 0) {
4718
        l = IO_BUF_SIZE - f->buf_index;
4719
        if (l > size)
4720
            l = size;
4721
        memcpy(f->buf + f->buf_index, buf, l);
4722
        f->buf_index += l;
4723
        buf += l;
4724
        size -= l;
4725
        if (f->buf_index >= IO_BUF_SIZE)
4726
            qemu_fflush(f);
4727
    }
4728
}
4729

    
4730
void qemu_put_byte(QEMUFile *f, int v)
4731
{
4732
    f->buf[f->buf_index++] = v;
4733
    if (f->buf_index >= IO_BUF_SIZE)
4734
        qemu_fflush(f);
4735
}
4736

    
4737
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
4738
{
4739
    int size, l;
4740

    
4741
    size = size1;
4742
    while (size > 0) {
4743
        l = f->buf_size - f->buf_index;
4744
        if (l == 0) {
4745
            qemu_fill_buffer(f);
4746
            l = f->buf_size - f->buf_index;
4747
            if (l == 0)
4748
                break;
4749
        }
4750
        if (l > size)
4751
            l = size;
4752
        memcpy(buf, f->buf + f->buf_index, l);
4753
        f->buf_index += l;
4754
        buf += l;
4755
        size -= l;
4756
    }
4757
    return size1 - size;
4758
}
4759

    
4760
int qemu_get_byte(QEMUFile *f)
4761
{
4762
    if (f->buf_index >= f->buf_size) {
4763
        qemu_fill_buffer(f);
4764
        if (f->buf_index >= f->buf_size)
4765
            return 0;
4766
    }
4767
    return f->buf[f->buf_index++];
4768
}
4769

    
4770
int64_t qemu_ftell(QEMUFile *f)
4771
{
4772
    return f->buf_offset - f->buf_size + f->buf_index;
4773
}
4774

    
4775
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
4776
{
4777
    if (whence == SEEK_SET) {
4778
        /* nothing to do */
4779
    } else if (whence == SEEK_CUR) {
4780
        pos += qemu_ftell(f);
4781
    } else {
4782
        /* SEEK_END not supported */
4783
        return -1;
4784
    }
4785
    if (f->is_writable) {
4786
        qemu_fflush(f);
4787
        f->buf_offset = pos;
4788
    } else {
4789
        f->buf_offset = pos;
4790
        f->buf_index = 0;
4791
        f->buf_size = 0;
4792
    }
4793
    return pos;
4794
}
4795

    
4796
void qemu_put_be16(QEMUFile *f, unsigned int v)
4797
{
4798
    qemu_put_byte(f, v >> 8);
4799
    qemu_put_byte(f, v);
4800
}
4801

    
4802
void qemu_put_be32(QEMUFile *f, unsigned int v)
4803
{
4804
    qemu_put_byte(f, v >> 24);
4805
    qemu_put_byte(f, v >> 16);
4806
    qemu_put_byte(f, v >> 8);
4807
    qemu_put_byte(f, v);
4808
}
4809

    
4810
void qemu_put_be64(QEMUFile *f, uint64_t v)
4811
{
4812
    qemu_put_be32(f, v >> 32);
4813
    qemu_put_be32(f, v);
4814
}
4815

    
4816
unsigned int qemu_get_be16(QEMUFile *f)
4817
{
4818
    unsigned int v;
4819
    v = qemu_get_byte(f) << 8;
4820
    v |= qemu_get_byte(f);
4821
    return v;
4822
}
4823

    
4824
unsigned int qemu_get_be32(QEMUFile *f)
4825
{
4826
    unsigned int v;
4827
    v = qemu_get_byte(f) << 24;
4828
    v |= qemu_get_byte(f) << 16;
4829
    v |= qemu_get_byte(f) << 8;
4830
    v |= qemu_get_byte(f);
4831
    return v;
4832
}
4833

    
4834
uint64_t qemu_get_be64(QEMUFile *f)
4835
{
4836
    uint64_t v;
4837
    v = (uint64_t)qemu_get_be32(f) << 32;
4838
    v |= qemu_get_be32(f);
4839
    return v;
4840
}
4841

    
4842
typedef struct SaveStateEntry {
4843
    char idstr[256];
4844
    int instance_id;
4845
    int version_id;
4846
    SaveStateHandler *save_state;
4847
    LoadStateHandler *load_state;
4848
    void *opaque;
4849
    struct SaveStateEntry *next;
4850
} SaveStateEntry;
4851

    
4852
static SaveStateEntry *first_se;
4853

    
4854
int register_savevm(const char *idstr, 
4855
                    int instance_id, 
4856
                    int version_id,
4857
                    SaveStateHandler *save_state,
4858
                    LoadStateHandler *load_state,
4859
                    void *opaque)
4860
{
4861
    SaveStateEntry *se, **pse;
4862

    
4863
    se = qemu_malloc(sizeof(SaveStateEntry));
4864
    if (!se)
4865
        return -1;
4866
    pstrcpy(se->idstr, sizeof(se->idstr), idstr);
4867
    se->instance_id = instance_id;
4868
    se->version_id = version_id;
4869
    se->save_state = save_state;
4870
    se->load_state = load_state;
4871
    se->opaque = opaque;
4872
    se->next = NULL;
4873

    
4874
    /* add at the end of list */
4875
    pse = &first_se;
4876
    while (*pse != NULL)
4877
        pse = &(*pse)->next;
4878
    *pse = se;
4879
    return 0;
4880
}
4881

    
4882
#define QEMU_VM_FILE_MAGIC   0x5145564d
4883
#define QEMU_VM_FILE_VERSION 0x00000002
4884

    
4885
int qemu_savevm_state(QEMUFile *f)
4886
{
4887
    SaveStateEntry *se;
4888
    int len, ret;
4889
    int64_t cur_pos, len_pos, total_len_pos;
4890

    
4891
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
4892
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
4893
    total_len_pos = qemu_ftell(f);
4894
    qemu_put_be64(f, 0); /* total size */
4895

    
4896
    for(se = first_se; se != NULL; se = se->next) {
4897
        /* ID string */
4898
        len = strlen(se->idstr);
4899
        qemu_put_byte(f, len);
4900
        qemu_put_buffer(f, se->idstr, len);
4901

    
4902
        qemu_put_be32(f, se->instance_id);
4903
        qemu_put_be32(f, se->version_id);
4904

    
4905
        /* record size: filled later */
4906
        len_pos = qemu_ftell(f);
4907
        qemu_put_be32(f, 0);
4908
        
4909
        se->save_state(f, se->opaque);
4910

    
4911
        /* fill record size */
4912
        cur_pos = qemu_ftell(f);
4913
        len = cur_pos - len_pos - 4;
4914
        qemu_fseek(f, len_pos, SEEK_SET);
4915
        qemu_put_be32(f, len);
4916
        qemu_fseek(f, cur_pos, SEEK_SET);
4917
    }
4918
    cur_pos = qemu_ftell(f);
4919
    qemu_fseek(f, total_len_pos, SEEK_SET);
4920
    qemu_put_be64(f, cur_pos - total_len_pos - 8);
4921
    qemu_fseek(f, cur_pos, SEEK_SET);
4922

    
4923
    ret = 0;
4924
    return ret;
4925
}
4926

    
4927
static SaveStateEntry *find_se(const char *idstr, int instance_id)
4928
{
4929
    SaveStateEntry *se;
4930

    
4931
    for(se = first_se; se != NULL; se = se->next) {
4932
        if (!strcmp(se->idstr, idstr) && 
4933
            instance_id == se->instance_id)
4934
            return se;
4935
    }
4936
    return NULL;
4937
}
4938

    
4939
int qemu_loadvm_state(QEMUFile *f)
4940
{
4941
    SaveStateEntry *se;
4942
    int len, ret, instance_id, record_len, version_id;
4943
    int64_t total_len, end_pos, cur_pos;
4944
    unsigned int v;
4945
    char idstr[256];
4946
    
4947
    v = qemu_get_be32(f);
4948
    if (v != QEMU_VM_FILE_MAGIC)
4949
        goto fail;
4950
    v = qemu_get_be32(f);
4951
    if (v != QEMU_VM_FILE_VERSION) {
4952
    fail:
4953
        ret = -1;
4954
        goto the_end;
4955
    }
4956
    total_len = qemu_get_be64(f);
4957
    end_pos = total_len + qemu_ftell(f);
4958
    for(;;) {
4959
        if (qemu_ftell(f) >= end_pos)
4960
            break;
4961
        len = qemu_get_byte(f);
4962
        qemu_get_buffer(f, idstr, len);
4963
        idstr[len] = '\0';
4964
        instance_id = qemu_get_be32(f);
4965
        version_id = qemu_get_be32(f);
4966
        record_len = qemu_get_be32(f);
4967
#if 0
4968
        printf("idstr=%s instance=0x%x version=%d len=%d\n", 
4969
               idstr, instance_id, version_id, record_len);
4970
#endif
4971
        cur_pos = qemu_ftell(f);
4972
        se = find_se(idstr, instance_id);
4973
        if (!se) {
4974
            fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n", 
4975
                    instance_id, idstr);
4976
        } else {
4977
            ret = se->load_state(f, se->opaque, version_id);
4978
            if (ret < 0) {
4979
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n", 
4980
                        instance_id, idstr);
4981
            }
4982
        }
4983
        /* always seek to exact end of record */
4984
        qemu_fseek(f, cur_pos + record_len, SEEK_SET);
4985
    }
4986
    ret = 0;
4987
 the_end:
4988
    return ret;
4989
}
4990

    
4991
/* device can contain snapshots */
4992
static int bdrv_can_snapshot(BlockDriverState *bs)
4993
{
4994
    return (bs &&
4995
            !bdrv_is_removable(bs) &&
4996
            !bdrv_is_read_only(bs));
4997
}
4998

    
4999
/* device must be snapshots in order to have a reliable snapshot */
5000
static int bdrv_has_snapshot(BlockDriverState *bs)
5001
{
5002
    return (bs &&
5003
            !bdrv_is_removable(bs) &&
5004
            !bdrv_is_read_only(bs));
5005
}
5006

    
5007
static BlockDriverState *get_bs_snapshots(void)
5008
{
5009
    BlockDriverState *bs;
5010
    int i;
5011

    
5012
    if (bs_snapshots)
5013
        return bs_snapshots;
5014
    for(i = 0; i <= MAX_DISKS; i++) {
5015
        bs = bs_table[i];
5016
        if (bdrv_can_snapshot(bs))
5017
            goto ok;
5018
    }
5019
    return NULL;
5020
 ok:
5021
    bs_snapshots = bs;
5022
    return bs;
5023
}
5024

    
5025
static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
5026
                              const char *name)
5027
{
5028
    QEMUSnapshotInfo *sn_tab, *sn;
5029
    int nb_sns, i, ret;
5030
    
5031
    ret = -ENOENT;
5032
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5033
    if (nb_sns < 0)
5034
        return ret;
5035
    for(i = 0; i < nb_sns; i++) {
5036
        sn = &sn_tab[i];
5037
        if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
5038
            *sn_info = *sn;
5039
            ret = 0;
5040
            break;
5041
        }
5042
    }
5043
    qemu_free(sn_tab);
5044
    return ret;
5045
}
5046

    
5047
void do_savevm(const char *name)
5048
{
5049
    BlockDriverState *bs, *bs1;
5050
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
5051
    int must_delete, ret, i;
5052
    BlockDriverInfo bdi1, *bdi = &bdi1;
5053
    QEMUFile *f;
5054
    int saved_vm_running;
5055
#ifdef _WIN32
5056
    struct _timeb tb;
5057
#else
5058
    struct timeval tv;
5059
#endif
5060

    
5061
    bs = get_bs_snapshots();
5062
    if (!bs) {
5063
        term_printf("No block device can accept snapshots\n");
5064
        return;
5065
    }
5066

    
5067
    /* ??? Should this occur after vm_stop?  */
5068
    qemu_aio_flush();
5069

    
5070
    saved_vm_running = vm_running;
5071
    vm_stop(0);
5072
    
5073
    must_delete = 0;
5074
    if (name) {
5075
        ret = bdrv_snapshot_find(bs, old_sn, name);
5076
        if (ret >= 0) {
5077
            must_delete = 1;
5078
        }
5079
    }
5080
    memset(sn, 0, sizeof(*sn));
5081
    if (must_delete) {
5082
        pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
5083
        pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
5084
    } else {
5085
        if (name)
5086
            pstrcpy(sn->name, sizeof(sn->name), name);
5087
    }
5088

    
5089
    /* fill auxiliary fields */
5090
#ifdef _WIN32
5091
    _ftime(&tb);
5092
    sn->date_sec = tb.time;
5093
    sn->date_nsec = tb.millitm * 1000000;
5094
#else
5095
    gettimeofday(&tv, NULL);
5096
    sn->date_sec = tv.tv_sec;
5097
    sn->date_nsec = tv.tv_usec * 1000;
5098
#endif
5099
    sn->vm_clock_nsec = qemu_get_clock(vm_clock);
5100
    
5101
    if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5102
        term_printf("Device %s does not support VM state snapshots\n",
5103
                    bdrv_get_device_name(bs));
5104
        goto the_end;
5105
    }
5106
    
5107
    /* save the VM state */
5108
    f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1);
5109
    if (!f) {
5110
        term_printf("Could not open VM state file\n");
5111
        goto the_end;
5112
    }
5113
    ret = qemu_savevm_state(f);
5114
    sn->vm_state_size = qemu_ftell(f);
5115
    qemu_fclose(f);
5116
    if (ret < 0) {
5117
        term_printf("Error %d while writing VM\n", ret);
5118
        goto the_end;
5119
    }
5120
    
5121
    /* create the snapshots */
5122

    
5123
    for(i = 0; i < MAX_DISKS; i++) {
5124
        bs1 = bs_table[i];
5125
        if (bdrv_has_snapshot(bs1)) {
5126
            if (must_delete) {
5127
                ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
5128
                if (ret < 0) {
5129
                    term_printf("Error while deleting snapshot on '%s'\n",
5130
                                bdrv_get_device_name(bs1));
5131
                }
5132
            }
5133
            ret = bdrv_snapshot_create(bs1, sn);
5134
            if (ret < 0) {
5135
                term_printf("Error while creating snapshot on '%s'\n",
5136
                            bdrv_get_device_name(bs1));
5137
            }
5138
        }
5139
    }
5140

    
5141
 the_end:
5142
    if (saved_vm_running)
5143
        vm_start();
5144
}
5145

    
5146
void do_loadvm(const char *name)
5147
{
5148
    BlockDriverState *bs, *bs1;
5149
    BlockDriverInfo bdi1, *bdi = &bdi1;
5150
    QEMUFile *f;
5151
    int i, ret;
5152
    int saved_vm_running;
5153

    
5154
    bs = get_bs_snapshots();
5155
    if (!bs) {
5156
        term_printf("No block device supports snapshots\n");
5157
        return;
5158
    }
5159
    
5160
    /* Flush all IO requests so they don't interfere with the new state.  */
5161
    qemu_aio_flush();
5162

    
5163
    saved_vm_running = vm_running;
5164
    vm_stop(0);
5165

    
5166
    for(i = 0; i <= MAX_DISKS; i++) {
5167
        bs1 = bs_table[i];
5168
        if (bdrv_has_snapshot(bs1)) {
5169
            ret = bdrv_snapshot_goto(bs1, name);
5170
            if (ret < 0) {
5171
                if (bs != bs1)
5172
                    term_printf("Warning: ");
5173
                switch(ret) {
5174
                case -ENOTSUP:
5175
                    term_printf("Snapshots not supported on device '%s'\n",
5176
                                bdrv_get_device_name(bs1));
5177
                    break;
5178
                case -ENOENT:
5179
                    term_printf("Could not find snapshot '%s' on device '%s'\n",
5180
                                name, bdrv_get_device_name(bs1));
5181
                    break;
5182
                default:
5183
                    term_printf("Error %d while activating snapshot on '%s'\n",
5184
                                ret, bdrv_get_device_name(bs1));
5185
                    break;
5186
                }
5187
                /* fatal on snapshot block device */
5188
                if (bs == bs1)
5189
                    goto the_end;
5190
            }
5191
        }
5192
    }
5193

    
5194
    if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5195
        term_printf("Device %s does not support VM state snapshots\n",
5196
                    bdrv_get_device_name(bs));
5197
        return;
5198
    }
5199
    
5200
    /* restore the VM state */
5201
    f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0);
5202
    if (!f) {
5203
        term_printf("Could not open VM state file\n");
5204
        goto the_end;
5205
    }
5206
    ret = qemu_loadvm_state(f);
5207
    qemu_fclose(f);
5208
    if (ret < 0) {
5209
        term_printf("Error %d while loading VM state\n", ret);
5210
    }
5211
 the_end:
5212
    if (saved_vm_running)
5213
        vm_start();
5214
}
5215

    
5216
void do_delvm(const char *name)
5217
{
5218
    BlockDriverState *bs, *bs1;
5219
    int i, ret;
5220

    
5221
    bs = get_bs_snapshots();
5222
    if (!bs) {
5223
        term_printf("No block device supports snapshots\n");
5224
        return;
5225
    }
5226
    
5227
    for(i = 0; i <= MAX_DISKS; i++) {
5228
        bs1 = bs_table[i];
5229
        if (bdrv_has_snapshot(bs1)) {
5230
            ret = bdrv_snapshot_delete(bs1, name);
5231
            if (ret < 0) {
5232
                if (ret == -ENOTSUP)
5233
                    term_printf("Snapshots not supported on device '%s'\n",
5234
                                bdrv_get_device_name(bs1));
5235
                else
5236
                    term_printf("Error %d while deleting snapshot on '%s'\n",
5237
                                ret, bdrv_get_device_name(bs1));
5238
            }
5239
        }
5240
    }
5241
}
5242

    
5243
void do_info_snapshots(void)
5244
{
5245
    BlockDriverState *bs, *bs1;
5246
    QEMUSnapshotInfo *sn_tab, *sn;
5247
    int nb_sns, i;
5248
    char buf[256];
5249

    
5250
    bs = get_bs_snapshots();
5251
    if (!bs) {
5252
        term_printf("No available block device supports snapshots\n");
5253
        return;
5254
    }
5255
    term_printf("Snapshot devices:");
5256
    for(i = 0; i <= MAX_DISKS; i++) {
5257
        bs1 = bs_table[i];
5258
        if (bdrv_has_snapshot(bs1)) {
5259
            if (bs == bs1)
5260
                term_printf(" %s", bdrv_get_device_name(bs1));
5261
        }
5262
    }
5263
    term_printf("\n");
5264

    
5265
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5266
    if (nb_sns < 0) {
5267
        term_printf("bdrv_snapshot_list: error %d\n", nb_sns);
5268
        return;
5269
    }
5270
    term_printf("Snapshot list (from %s):\n", bdrv_get_device_name(bs));
5271
    term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
5272
    for(i = 0; i < nb_sns; i++) {
5273
        sn = &sn_tab[i];
5274
        term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
5275
    }
5276
    qemu_free(sn_tab);
5277
}
5278

    
5279
/***********************************************************/
5280
/* cpu save/restore */
5281

    
5282
#if defined(TARGET_I386)
5283

    
5284
static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
5285
{
5286
    qemu_put_be32(f, dt->selector);
5287
    qemu_put_betl(f, dt->base);
5288
    qemu_put_be32(f, dt->limit);
5289
    qemu_put_be32(f, dt->flags);
5290
}
5291

    
5292
static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
5293
{
5294
    dt->selector = qemu_get_be32(f);
5295
    dt->base = qemu_get_betl(f);
5296
    dt->limit = qemu_get_be32(f);
5297
    dt->flags = qemu_get_be32(f);
5298
}
5299

    
5300
void cpu_save(QEMUFile *f, void *opaque)
5301
{
5302
    CPUState *env = opaque;
5303
    uint16_t fptag, fpus, fpuc, fpregs_format;
5304
    uint32_t hflags;
5305
    int i;
5306
    
5307
    for(i = 0; i < CPU_NB_REGS; i++)
5308
        qemu_put_betls(f, &env->regs[i]);
5309
    qemu_put_betls(f, &env->eip);
5310
    qemu_put_betls(f, &env->eflags);
5311
    hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
5312
    qemu_put_be32s(f, &hflags);
5313
    
5314
    /* FPU */
5315
    fpuc = env->fpuc;
5316
    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
5317
    fptag = 0;
5318
    for(i = 0; i < 8; i++) {
5319
        fptag |= ((!env->fptags[i]) << i);
5320
    }
5321
    
5322
    qemu_put_be16s(f, &fpuc);
5323
    qemu_put_be16s(f, &fpus);
5324
    qemu_put_be16s(f, &fptag);
5325

    
5326
#ifdef USE_X86LDOUBLE
5327
    fpregs_format = 0;
5328
#else
5329
    fpregs_format = 1;
5330
#endif
5331
    qemu_put_be16s(f, &fpregs_format);
5332
    
5333
    for(i = 0; i < 8; i++) {
5334
#ifdef USE_X86LDOUBLE
5335
        {
5336
            uint64_t mant;
5337
            uint16_t exp;
5338
            /* we save the real CPU data (in case of MMX usage only 'mant'
5339
               contains the MMX register */
5340
            cpu_get_fp80(&mant, &exp, env->fpregs[i].d);
5341
            qemu_put_be64(f, mant);
5342
            qemu_put_be16(f, exp);
5343
        }
5344
#else
5345
        /* if we use doubles for float emulation, we save the doubles to
5346
           avoid losing information in case of MMX usage. It can give
5347
           problems if the image is restored on a CPU where long
5348
           doubles are used instead. */
5349
        qemu_put_be64(f, env->fpregs[i].mmx.MMX_Q(0));
5350
#endif
5351
    }
5352

    
5353
    for(i = 0; i < 6; i++)
5354
        cpu_put_seg(f, &env->segs[i]);
5355
    cpu_put_seg(f, &env->ldt);
5356
    cpu_put_seg(f, &env->tr);
5357
    cpu_put_seg(f, &env->gdt);
5358
    cpu_put_seg(f, &env->idt);
5359
    
5360
    qemu_put_be32s(f, &env->sysenter_cs);
5361
    qemu_put_be32s(f, &env->sysenter_esp);
5362
    qemu_put_be32s(f, &env->sysenter_eip);
5363
    
5364
    qemu_put_betls(f, &env->cr[0]);
5365
    qemu_put_betls(f, &env->cr[2]);
5366
    qemu_put_betls(f, &env->cr[3]);
5367
    qemu_put_betls(f, &env->cr[4]);
5368
    
5369
    for(i = 0; i < 8; i++)
5370
        qemu_put_betls(f, &env->dr[i]);
5371

    
5372
    /* MMU */
5373
    qemu_put_be32s(f, &env->a20_mask);
5374

    
5375
    /* XMM */
5376
    qemu_put_be32s(f, &env->mxcsr);
5377
    for(i = 0; i < CPU_NB_REGS; i++) {
5378
        qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(0));
5379
        qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(1));
5380
    }
5381

    
5382
#ifdef TARGET_X86_64
5383
    qemu_put_be64s(f, &env->efer);
5384
    qemu_put_be64s(f, &env->star);
5385
    qemu_put_be64s(f, &env->lstar);
5386
    qemu_put_be64s(f, &env->cstar);
5387
    qemu_put_be64s(f, &env->fmask);
5388
    qemu_put_be64s(f, &env->kernelgsbase);
5389
#endif
5390
    qemu_put_be32s(f, &env->smbase);
5391
}
5392

    
5393
#ifdef USE_X86LDOUBLE
5394
/* XXX: add that in a FPU generic layer */
5395
union x86_longdouble {
5396
    uint64_t mant;
5397
    uint16_t exp;
5398
};
5399

    
5400
#define MANTD1(fp)        (fp & ((1LL << 52) - 1))
5401
#define EXPBIAS1 1023
5402
#define EXPD1(fp)        ((fp >> 52) & 0x7FF)
5403
#define SIGND1(fp)        ((fp >> 32) & 0x80000000)
5404

    
5405
static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp)
5406
{
5407
    int e;
5408
    /* mantissa */
5409
    p->mant = (MANTD1(temp) << 11) | (1LL << 63);
5410
    /* exponent + sign */
5411
    e = EXPD1(temp) - EXPBIAS1 + 16383;
5412
    e |= SIGND1(temp) >> 16;
5413
    p->exp = e;
5414
}
5415
#endif
5416

    
5417
int cpu_load(QEMUFile *f, void *opaque, int version_id)
5418
{
5419
    CPUState *env = opaque;
5420
    int i, guess_mmx;
5421
    uint32_t hflags;
5422
    uint16_t fpus, fpuc, fptag, fpregs_format;
5423

    
5424
    if (version_id != 3 && version_id != 4)
5425
        return -EINVAL;
5426
    for(i = 0; i < CPU_NB_REGS; i++)
5427
        qemu_get_betls(f, &env->regs[i]);
5428
    qemu_get_betls(f, &env->eip);
5429
    qemu_get_betls(f, &env->eflags);
5430
    qemu_get_be32s(f, &hflags);
5431

    
5432
    qemu_get_be16s(f, &fpuc);
5433
    qemu_get_be16s(f, &fpus);
5434
    qemu_get_be16s(f, &fptag);
5435
    qemu_get_be16s(f, &fpregs_format);
5436
    
5437
    /* NOTE: we cannot always restore the FPU state if the image come
5438
       from a host with a different 'USE_X86LDOUBLE' define. We guess
5439
       if we are in an MMX state to restore correctly in that case. */
5440
    guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0);
5441
    for(i = 0; i < 8; i++) {
5442
        uint64_t mant;
5443
        uint16_t exp;
5444
        
5445
        switch(fpregs_format) {
5446
        case 0:
5447
            mant = qemu_get_be64(f);
5448
            exp = qemu_get_be16(f);
5449
#ifdef USE_X86LDOUBLE
5450
            env->fpregs[i].d = cpu_set_fp80(mant, exp);
5451
#else
5452
            /* difficult case */
5453
            if (guess_mmx)
5454
                env->fpregs[i].mmx.MMX_Q(0) = mant;
5455
            else
5456
                env->fpregs[i].d = cpu_set_fp80(mant, exp);
5457
#endif
5458
            break;
5459
        case 1:
5460
            mant = qemu_get_be64(f);
5461
#ifdef USE_X86LDOUBLE
5462
            {
5463
                union x86_longdouble *p;
5464
                /* difficult case */
5465
                p = (void *)&env->fpregs[i];
5466
                if (guess_mmx) {
5467
                    p->mant = mant;
5468
                    p->exp = 0xffff;
5469
                } else {
5470
                    fp64_to_fp80(p, mant);
5471
                }
5472
            }
5473
#else
5474
            env->fpregs[i].mmx.MMX_Q(0) = mant;
5475
#endif            
5476
            break;
5477
        default:
5478
            return -EINVAL;
5479
        }
5480
    }
5481

    
5482
    env->fpuc = fpuc;
5483
    /* XXX: restore FPU round state */
5484
    env->fpstt = (fpus >> 11) & 7;
5485
    env->fpus = fpus & ~0x3800;
5486
    fptag ^= 0xff;
5487
    for(i = 0; i < 8; i++) {
5488
        env->fptags[i] = (fptag >> i) & 1;
5489
    }
5490
    
5491
    for(i = 0; i < 6; i++)
5492
        cpu_get_seg(f, &env->segs[i]);
5493
    cpu_get_seg(f, &env->ldt);
5494
    cpu_get_seg(f, &env->tr);
5495
    cpu_get_seg(f, &env->gdt);
5496
    cpu_get_seg(f, &env->idt);
5497
    
5498
    qemu_get_be32s(f, &env->sysenter_cs);
5499
    qemu_get_be32s(f, &env->sysenter_esp);
5500
    qemu_get_be32s(f, &env->sysenter_eip);
5501
    
5502
    qemu_get_betls(f, &env->cr[0]);
5503
    qemu_get_betls(f, &env->cr[2]);
5504
    qemu_get_betls(f, &env->cr[3]);
5505
    qemu_get_betls(f, &env->cr[4]);
5506
    
5507
    for(i = 0; i < 8; i++)
5508
        qemu_get_betls(f, &env->dr[i]);
5509

    
5510
    /* MMU */
5511
    qemu_get_be32s(f, &env->a20_mask);
5512

    
5513
    qemu_get_be32s(f, &env->mxcsr);
5514
    for(i = 0; i < CPU_NB_REGS; i++) {
5515
        qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(0));
5516
        qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(1));
5517
    }
5518

    
5519
#ifdef TARGET_X86_64
5520
    qemu_get_be64s(f, &env->efer);
5521
    qemu_get_be64s(f, &env->star);
5522
    qemu_get_be64s(f, &env->lstar);
5523
    qemu_get_be64s(f, &env->cstar);
5524
    qemu_get_be64s(f, &env->fmask);
5525
    qemu_get_be64s(f, &env->kernelgsbase);
5526
#endif
5527
    if (version_id >= 4) 
5528
        qemu_get_be32s(f, &env->smbase);
5529

    
5530
    /* XXX: compute hflags from scratch, except for CPL and IIF */
5531
    env->hflags = hflags;
5532
    tlb_flush(env, 1);
5533
    return 0;
5534
}
5535

    
5536
#elif defined(TARGET_PPC)
5537
void cpu_save(QEMUFile *f, void *opaque)
5538
{
5539
}
5540

    
5541
int cpu_load(QEMUFile *f, void *opaque, int version_id)
5542
{
5543
    return 0;
5544
}
5545

    
5546
#elif defined(TARGET_MIPS)
5547
void cpu_save(QEMUFile *f, void *opaque)
5548
{
5549
}
5550

    
5551
int cpu_load(QEMUFile *f, void *opaque, int version_id)
5552
{
5553
    return 0;
5554
}
5555

    
5556
#elif defined(TARGET_SPARC)
5557
void cpu_save(QEMUFile *f, void *opaque)
5558
{
5559
    CPUState *env = opaque;
5560
    int i;
5561
    uint32_t tmp;
5562

    
5563
    for(i = 0; i < 8; i++)
5564
        qemu_put_betls(f, &env->gregs[i]);
5565
    for(i = 0; i < NWINDOWS * 16; i++)
5566
        qemu_put_betls(f, &env->regbase[i]);
5567

    
5568
    /* FPU */
5569
    for(i = 0; i < TARGET_FPREGS; i++) {
5570
        union {
5571
            float32 f;
5572
            uint32_t i;
5573
        } u;
5574
        u.f = env->fpr[i];
5575
        qemu_put_be32(f, u.i);
5576
    }
5577

    
5578
    qemu_put_betls(f, &env->pc);
5579
    qemu_put_betls(f, &env->npc);
5580
    qemu_put_betls(f, &env->y);
5581
    tmp = GET_PSR(env);
5582
    qemu_put_be32(f, tmp);
5583
    qemu_put_betls(f, &env->fsr);
5584
    qemu_put_betls(f, &env->tbr);
5585
#ifndef TARGET_SPARC64
5586
    qemu_put_be32s(f, &env->wim);
5587
    /* MMU */
5588
    for(i = 0; i < 16; i++)
5589
        qemu_put_be32s(f, &env->mmuregs[i]);
5590
#endif
5591
}
5592

    
5593
int cpu_load(QEMUFile *f, void *opaque, int version_id)
5594
{
5595
    CPUState *env = opaque;
5596
    int i;
5597
    uint32_t tmp;
5598

    
5599
    for(i = 0; i < 8; i++)
5600
        qemu_get_betls(f, &env->gregs[i]);
5601
    for(i = 0; i < NWINDOWS * 16; i++)
5602
        qemu_get_betls(f, &env->regbase[i]);
5603

    
5604
    /* FPU */
5605
    for(i = 0; i < TARGET_FPREGS; i++) {
5606
        union {
5607
            float32 f;
5608
            uint32_t i;
5609
        } u;
5610
        u.i = qemu_get_be32(f);
5611
        env->fpr[i] = u.f;
5612
    }
5613

    
5614
    qemu_get_betls(f, &env->pc);
5615
    qemu_get_betls(f, &env->npc);
5616
    qemu_get_betls(f, &env->y);
5617
    tmp = qemu_get_be32(f);
5618
    env->cwp = 0; /* needed to ensure that the wrapping registers are
5619
                     correctly updated */
5620
    PUT_PSR(env, tmp);
5621
    qemu_get_betls(f, &env->fsr);
5622
    qemu_get_betls(f, &env->tbr);
5623
#ifndef TARGET_SPARC64
5624
    qemu_get_be32s(f, &env->wim);
5625
    /* MMU */
5626
    for(i = 0; i < 16; i++)
5627
        qemu_get_be32s(f, &env->mmuregs[i]);
5628
#endif
5629
    tlb_flush(env, 1);
5630
    return 0;
5631
}
5632

    
5633
#elif defined(TARGET_ARM)
5634

    
5635
/* ??? Need to implement these.  */
5636
void cpu_save(QEMUFile *f, void *opaque)
5637
{
5638
}
5639

    
5640
int cpu_load(QEMUFile *f, void *opaque, int version_id)
5641
{
5642
    return 0;
5643
}
5644

    
5645
#else
5646

    
5647
#warning No CPU save/restore functions
5648

    
5649
#endif
5650

    
5651
/***********************************************************/
5652
/* ram save/restore */
5653

    
5654
static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
5655
{
5656
    int v;
5657

    
5658
    v = qemu_get_byte(f);
5659
    switch(v) {
5660
    case 0:
5661
        if (qemu_get_buffer(f, buf, len) != len)
5662
            return -EIO;
5663
        break;
5664
    case 1:
5665
        v = qemu_get_byte(f);
5666
        memset(buf, v, len);
5667
        break;
5668
    default:
5669
        return -EINVAL;
5670
    }
5671
    return 0;
5672
}
5673

    
5674
static int ram_load_v1(QEMUFile *f, void *opaque)
5675
{
5676
    int i, ret;
5677

    
5678
    if (qemu_get_be32(f) != phys_ram_size)
5679
        return -EINVAL;
5680
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
5681
        ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
5682
        if (ret)
5683
            return ret;
5684
    }
5685
    return 0;
5686
}
5687

    
5688
#define BDRV_HASH_BLOCK_SIZE 1024
5689
#define IOBUF_SIZE 4096
5690
#define RAM_CBLOCK_MAGIC 0xfabe
5691

    
5692
typedef struct RamCompressState {
5693
    z_stream zstream;
5694
    QEMUFile *f;
5695
    uint8_t buf[IOBUF_SIZE];
5696
} RamCompressState;
5697

    
5698
static int ram_compress_open(RamCompressState *s, QEMUFile *f)
5699
{
5700
    int ret;
5701
    memset(s, 0, sizeof(*s));
5702
    s->f = f;
5703
    ret = deflateInit2(&s->zstream, 1,
5704
                       Z_DEFLATED, 15, 
5705
                       9, Z_DEFAULT_STRATEGY);
5706
    if (ret != Z_OK)
5707
        return -1;
5708
    s->zstream.avail_out = IOBUF_SIZE;
5709
    s->zstream.next_out = s->buf;
5710
    return 0;
5711
}
5712

    
5713
static void ram_put_cblock(RamCompressState *s, const uint8_t *buf, int len)
5714
{
5715
    qemu_put_be16(s->f, RAM_CBLOCK_MAGIC);
5716
    qemu_put_be16(s->f, len);
5717
    qemu_put_buffer(s->f, buf, len);
5718
}
5719

    
5720
static int ram_compress_buf(RamCompressState *s, const uint8_t *buf, int len)
5721
{
5722
    int ret;
5723

    
5724
    s->zstream.avail_in = len;
5725
    s->zstream.next_in = (uint8_t *)buf;
5726
    while (s->zstream.avail_in > 0) {
5727
        ret = deflate(&s->zstream, Z_NO_FLUSH);
5728
        if (ret != Z_OK)
5729
            return -1;
5730
        if (s->zstream.avail_out == 0) {
5731
            ram_put_cblock(s, s->buf, IOBUF_SIZE);
5732
            s->zstream.avail_out = IOBUF_SIZE;
5733
            s->zstream.next_out = s->buf;
5734
        }
5735
    }
5736
    return 0;
5737
}
5738

    
5739
static void ram_compress_close(RamCompressState *s)
5740
{
5741
    int len, ret;
5742

    
5743
    /* compress last bytes */
5744
    for(;;) {
5745
        ret = deflate(&s->zstream, Z_FINISH);
5746
        if (ret == Z_OK || ret == Z_STREAM_END) {
5747
            len = IOBUF_SIZE - s->zstream.avail_out;
5748
            if (len > 0) {
5749
                ram_put_cblock(s, s->buf, len);
5750
            }
5751
            s->zstream.avail_out = IOBUF_SIZE;
5752
            s->zstream.next_out = s->buf;
5753
            if (ret == Z_STREAM_END)
5754
                break;
5755
        } else {
5756
            goto fail;
5757
        }
5758
    }
5759
fail:
5760
    deflateEnd(&s->zstream);
5761
}
5762

    
5763
typedef struct RamDecompressState {
5764
    z_stream zstream;
5765
    QEMUFile *f;
5766
    uint8_t buf[IOBUF_SIZE];
5767
} RamDecompressState;
5768

    
5769
static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
5770
{
5771
    int ret;
5772
    memset(s, 0, sizeof(*s));
5773
    s->f = f;
5774
    ret = inflateInit(&s->zstream);
5775
    if (ret != Z_OK)
5776
        return -1;
5777
    return 0;
5778
}
5779

    
5780
static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
5781
{
5782
    int ret, clen;
5783

    
5784
    s->zstream.avail_out = len;
5785
    s->zstream.next_out = buf;
5786
    while (s->zstream.avail_out > 0) {
5787
        if (s->zstream.avail_in == 0) {
5788
            if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
5789
                return -1;
5790
            clen = qemu_get_be16(s->f);
5791
            if (clen > IOBUF_SIZE)
5792
                return -1;
5793
            qemu_get_buffer(s->f, s->buf, clen);
5794
            s->zstream.avail_in = clen;
5795
            s->zstream.next_in = s->buf;
5796
        }
5797
        ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
5798
        if (ret != Z_OK && ret != Z_STREAM_END) {
5799
            return -1;
5800
        }
5801
    }
5802
    return 0;
5803
}
5804

    
5805
static void ram_decompress_close(RamDecompressState *s)
5806
{
5807
    inflateEnd(&s->zstream);
5808
}
5809

    
5810
static void ram_save(QEMUFile *f, void *opaque)
5811
{
5812
    int i;
5813
    RamCompressState s1, *s = &s1;
5814
    uint8_t buf[10];
5815
    
5816
    qemu_put_be32(f, phys_ram_size);
5817
    if (ram_compress_open(s, f) < 0)
5818
        return;
5819
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
5820
#if 0
5821
        if (tight_savevm_enabled) {
5822
            int64_t sector_num;
5823
            int j;
5824

5825
            /* find if the memory block is available on a virtual
5826
               block device */
5827
            sector_num = -1;
5828
            for(j = 0; j < MAX_DISKS; j++) {
5829
                if (bs_table[j]) {
5830
                    sector_num = bdrv_hash_find(bs_table[j], 
5831
                                                phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
5832
                    if (sector_num >= 0)
5833
                        break;
5834
                }
5835
            }
5836
            if (j == MAX_DISKS)
5837
                goto normal_compress;
5838
            buf[0] = 1;
5839
            buf[1] = j;
5840
            cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
5841
            ram_compress_buf(s, buf, 10);
5842
        } else 
5843
#endif
5844
        {
5845
            //        normal_compress:
5846
            buf[0] = 0;
5847
            ram_compress_buf(s, buf, 1);
5848
            ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
5849
        }
5850
    }
5851
    ram_compress_close(s);
5852
}
5853

    
5854
static int ram_load(QEMUFile *f, void *opaque, int version_id)
5855
{
5856
    RamDecompressState s1, *s = &s1;
5857
    uint8_t buf[10];
5858
    int i;
5859

    
5860
    if (version_id == 1)
5861
        return ram_load_v1(f, opaque);
5862
    if (version_id != 2)
5863
        return -EINVAL;
5864
    if (qemu_get_be32(f) != phys_ram_size)
5865
        return -EINVAL;
5866
    if (ram_decompress_open(s, f) < 0)
5867
        return -EINVAL;
5868
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
5869
        if (ram_decompress_buf(s, buf, 1) < 0) {
5870
            fprintf(stderr, "Error while reading ram block header\n");
5871
            goto error;
5872
        }
5873
        if (buf[0] == 0) {
5874
            if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
5875
                fprintf(stderr, "Error while reading ram block address=0x%08x", i);
5876
                goto error;
5877
            }
5878
        } else 
5879
#if 0
5880
        if (buf[0] == 1) {
5881
            int bs_index;
5882
            int64_t sector_num;
5883

5884
            ram_decompress_buf(s, buf + 1, 9);
5885
            bs_index = buf[1];
5886
            sector_num = be64_to_cpupu((const uint64_t *)(buf + 2));
5887
            if (bs_index >= MAX_DISKS || bs_table[bs_index] == NULL) {
5888
                fprintf(stderr, "Invalid block device index %d\n", bs_index);
5889
                goto error;
5890
            }
5891
            if (bdrv_read(bs_table[bs_index], sector_num, phys_ram_base + i, 
5892
                          BDRV_HASH_BLOCK_SIZE / 512) < 0) {
5893
                fprintf(stderr, "Error while reading sector %d:%" PRId64 "\n", 
5894
                        bs_index, sector_num);
5895
                goto error;
5896
            }
5897
        } else 
5898
#endif
5899
        {
5900
        error:
5901
            printf("Error block header\n");
5902
            return -EINVAL;
5903
        }
5904
    }
5905
    ram_decompress_close(s);
5906
    return 0;
5907
}
5908

    
5909
/***********************************************************/
5910
/* bottom halves (can be seen as timers which expire ASAP) */
5911

    
5912
struct QEMUBH {
5913
    QEMUBHFunc *cb;
5914
    void *opaque;
5915
    int scheduled;
5916
    QEMUBH *next;
5917
};
5918

    
5919
static QEMUBH *first_bh = NULL;
5920

    
5921
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
5922
{
5923
    QEMUBH *bh;
5924
    bh = qemu_mallocz(sizeof(QEMUBH));
5925
    if (!bh)
5926
        return NULL;
5927
    bh->cb = cb;
5928
    bh->opaque = opaque;
5929
    return bh;
5930
}
5931

    
5932
int qemu_bh_poll(void)
5933
{
5934
    QEMUBH *bh, **pbh;
5935
    int ret;
5936

    
5937
    ret = 0;
5938
    for(;;) {
5939
        pbh = &first_bh;
5940
        bh = *pbh;
5941
        if (!bh)
5942
            break;
5943
        ret = 1;
5944
        *pbh = bh->next;
5945
        bh->scheduled = 0;
5946
        bh->cb(bh->opaque);
5947
    }
5948
    return ret;
5949
}
5950

    
5951
void qemu_bh_schedule(QEMUBH *bh)
5952
{
5953
    CPUState *env = cpu_single_env;
5954
    if (bh->scheduled)
5955
        return;
5956
    bh->scheduled = 1;
5957
    bh->next = first_bh;
5958
    first_bh = bh;
5959

    
5960
    /* stop the currently executing CPU to execute the BH ASAP */
5961
    if (env) {
5962
        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
5963
    }
5964
}
5965

    
5966
void qemu_bh_cancel(QEMUBH *bh)
5967
{
5968
    QEMUBH **pbh;
5969
    if (bh->scheduled) {
5970
        pbh = &first_bh;
5971
        while (*pbh != bh)
5972
            pbh = &(*pbh)->next;
5973
        *pbh = bh->next;
5974
        bh->scheduled = 0;
5975
    }
5976
}
5977

    
5978
void qemu_bh_delete(QEMUBH *bh)
5979
{
5980
    qemu_bh_cancel(bh);
5981
    qemu_free(bh);
5982
}
5983

    
5984
/***********************************************************/
5985
/* machine registration */
5986

    
5987
QEMUMachine *first_machine = NULL;
5988

    
5989
int qemu_register_machine(QEMUMachine *m)
5990
{
5991
    QEMUMachine **pm;
5992
    pm = &first_machine;
5993
    while (*pm != NULL)
5994
        pm = &(*pm)->next;
5995
    m->next = NULL;
5996
    *pm = m;
5997
    return 0;
5998
}
5999

    
6000
QEMUMachine *find_machine(const char *name)
6001
{
6002
    QEMUMachine *m;
6003

    
6004
    for(m = first_machine; m != NULL; m = m->next) {
6005
        if (!strcmp(m->name, name))
6006
            return m;
6007
    }
6008
    return NULL;
6009
}
6010

    
6011
/***********************************************************/
6012
/* main execution loop */
6013

    
6014
void gui_update(void *opaque)
6015
{
6016
    display_state.dpy_refresh(&display_state);
6017
    qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
6018
}
6019

    
6020
struct vm_change_state_entry {
6021
    VMChangeStateHandler *cb;
6022
    void *opaque;
6023
    LIST_ENTRY (vm_change_state_entry) entries;
6024
};
6025

    
6026
static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
6027

    
6028
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
6029
                                                     void *opaque)
6030
{
6031
    VMChangeStateEntry *e;
6032

    
6033
    e = qemu_mallocz(sizeof (*e));
6034
    if (!e)
6035
        return NULL;
6036

    
6037
    e->cb = cb;
6038
    e->opaque = opaque;
6039
    LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
6040
    return e;
6041
}
6042

    
6043
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
6044
{
6045
    LIST_REMOVE (e, entries);
6046
    qemu_free (e);
6047
}
6048

    
6049
static void vm_state_notify(int running)
6050
{
6051
    VMChangeStateEntry *e;
6052

    
6053
    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
6054
        e->cb(e->opaque, running);
6055
    }
6056
}
6057

    
6058
/* XXX: support several handlers */
6059
static VMStopHandler *vm_stop_cb;
6060
static void *vm_stop_opaque;
6061

    
6062
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
6063
{
6064
    vm_stop_cb = cb;
6065
    vm_stop_opaque = opaque;
6066
    return 0;
6067
}
6068

    
6069
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
6070
{
6071
    vm_stop_cb = NULL;
6072
}
6073

    
6074
void vm_start(void)
6075
{
6076
    if (!vm_running) {
6077
        cpu_enable_ticks();
6078
        vm_running = 1;
6079
        vm_state_notify(1);
6080
    }
6081
}
6082

    
6083
void vm_stop(int reason) 
6084
{
6085
    if (vm_running) {
6086
        cpu_disable_ticks();
6087
        vm_running = 0;
6088
        if (reason != 0) {
6089
            if (vm_stop_cb) {
6090
                vm_stop_cb(vm_stop_opaque, reason);
6091
            }
6092
        }
6093
        vm_state_notify(0);
6094
    }
6095
}
6096

    
6097
/* reset/shutdown handler */
6098

    
6099
typedef struct QEMUResetEntry {
6100
    QEMUResetHandler *func;
6101
    void *opaque;
6102
    struct QEMUResetEntry *next;
6103
} QEMUResetEntry;
6104

    
6105
static QEMUResetEntry *first_reset_entry;
6106
static int reset_requested;
6107
static int shutdown_requested;
6108
static int powerdown_requested;
6109

    
6110
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
6111
{
6112
    QEMUResetEntry **pre, *re;
6113

    
6114
    pre = &first_reset_entry;
6115
    while (*pre != NULL)
6116
        pre = &(*pre)->next;
6117
    re = qemu_mallocz(sizeof(QEMUResetEntry));
6118
    re->func = func;
6119
    re->opaque = opaque;
6120
    re->next = NULL;
6121
    *pre = re;
6122
}
6123

    
6124
static void qemu_system_reset(void)
6125
{
6126
    QEMUResetEntry *re;
6127

    
6128
    /* reset all devices */
6129
    for(re = first_reset_entry; re != NULL; re = re->next) {
6130
        re->func(re->opaque);
6131
    }
6132
}
6133

    
6134
void qemu_system_reset_request(void)
6135
{
6136
    if (no_reboot) {
6137
        shutdown_requested = 1;
6138
    } else {
6139
        reset_requested = 1;
6140
    }
6141
    if (cpu_single_env)
6142
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6143
}
6144

    
6145
void qemu_system_shutdown_request(void)
6146
{
6147
    shutdown_requested = 1;
6148
    if (cpu_single_env)
6149
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6150
}
6151

    
6152
void qemu_system_powerdown_request(void)
6153
{
6154
    powerdown_requested = 1;
6155
    if (cpu_single_env)
6156
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6157
}
6158

    
6159
void main_loop_wait(int timeout)
6160
{
6161
    IOHandlerRecord *ioh;
6162
    fd_set rfds, wfds, xfds;
6163
    int ret, nfds;
6164
    struct timeval tv;
6165
    PollingEntry *pe;
6166

    
6167

    
6168
    /* XXX: need to suppress polling by better using win32 events */
6169
    ret = 0;
6170
    for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
6171
        ret |= pe->func(pe->opaque);
6172
    }
6173
#ifdef _WIN32
6174
    if (ret == 0 && timeout > 0) {
6175
        int err;
6176
        WaitObjects *w = &wait_objects;
6177
        
6178
        ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout);
6179
        if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
6180
            if (w->func[ret - WAIT_OBJECT_0])
6181
                w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
6182
        } else if (ret == WAIT_TIMEOUT) {
6183
        } else {
6184
            err = GetLastError();
6185
            fprintf(stderr, "Wait error %d %d\n", ret, err);
6186
        }
6187
    }
6188
#endif
6189
    /* poll any events */
6190
    /* XXX: separate device handlers from system ones */
6191
    nfds = -1;
6192
    FD_ZERO(&rfds);
6193
    FD_ZERO(&wfds);
6194
    FD_ZERO(&xfds);
6195
    for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6196
        if (ioh->deleted)
6197
            continue;
6198
        if (ioh->fd_read &&
6199
            (!ioh->fd_read_poll ||
6200
             ioh->fd_read_poll(ioh->opaque) != 0)) {
6201
            FD_SET(ioh->fd, &rfds);
6202
            if (ioh->fd > nfds)
6203
                nfds = ioh->fd;
6204
        }
6205
        if (ioh->fd_write) {
6206
            FD_SET(ioh->fd, &wfds);
6207
            if (ioh->fd > nfds)
6208
                nfds = ioh->fd;
6209
        }
6210
    }
6211
    
6212
    tv.tv_sec = 0;
6213
#ifdef _WIN32
6214
    tv.tv_usec = 0;
6215
#else
6216
    tv.tv_usec = timeout * 1000;
6217
#endif
6218
#if defined(CONFIG_SLIRP)
6219
    if (slirp_inited) {
6220
        slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
6221
    }
6222
#endif
6223
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
6224
    if (ret > 0) {
6225
        IOHandlerRecord **pioh;
6226

    
6227
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6228
            if (ioh->deleted)
6229
                continue;
6230
            if (FD_ISSET(ioh->fd, &rfds)) {
6231
                ioh->fd_read(ioh->opaque);
6232
            }
6233
            if (FD_ISSET(ioh->fd, &wfds)) {
6234
                ioh->fd_write(ioh->opaque);
6235
            }
6236
        }
6237

    
6238
        /* remove deleted IO handlers */
6239
        pioh = &first_io_handler;
6240
        while (*pioh) {
6241
            ioh = *pioh;
6242
            if (ioh->deleted) {
6243
                *pioh = ioh->next;
6244
                qemu_free(ioh);
6245
            } else 
6246
                pioh = &ioh->next;
6247
        }
6248
    }
6249
#if defined(CONFIG_SLIRP)
6250
    if (slirp_inited) {
6251
        if (ret < 0) {
6252
            FD_ZERO(&rfds);
6253
            FD_ZERO(&wfds);
6254
            FD_ZERO(&xfds);
6255
        }
6256
        slirp_select_poll(&rfds, &wfds, &xfds);
6257
    }
6258
#endif
6259
    qemu_aio_poll();
6260
    qemu_bh_poll();
6261

    
6262
    if (vm_running) {
6263
        qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL], 
6264
                        qemu_get_clock(vm_clock));
6265
        /* run dma transfers, if any */
6266
        DMA_run();
6267
    }
6268
    
6269
    /* real time timers */
6270
    qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], 
6271
                    qemu_get_clock(rt_clock));
6272
}
6273

    
6274
static CPUState *cur_cpu;
6275

    
6276
int main_loop(void)
6277
{
6278
    int ret, timeout;
6279
#ifdef CONFIG_PROFILER
6280
    int64_t ti;
6281
#endif
6282
    CPUState *env;
6283

    
6284
    cur_cpu = first_cpu;
6285
    for(;;) {
6286
        if (vm_running) {
6287

    
6288
            env = cur_cpu;
6289
            for(;;) {
6290
                /* get next cpu */
6291
                env = env->next_cpu;
6292
                if (!env)
6293
                    env = first_cpu;
6294
#ifdef CONFIG_PROFILER
6295
                ti = profile_getclock();
6296
#endif
6297
                ret = cpu_exec(env);
6298
#ifdef CONFIG_PROFILER
6299
                qemu_time += profile_getclock() - ti;
6300
#endif
6301
                if (ret == EXCP_HLT) {
6302
                    /* Give the next CPU a chance to run.  */
6303
                    cur_cpu = env;
6304
                    continue;
6305
                }
6306
                if (ret != EXCP_HALTED)
6307
                    break;
6308
                /* all CPUs are halted ? */
6309
                if (env == cur_cpu)
6310
                    break;
6311
            }
6312
            cur_cpu = env;
6313

    
6314
            if (shutdown_requested) {
6315
                ret = EXCP_INTERRUPT;
6316
                break;
6317
            }
6318
            if (reset_requested) {
6319
                reset_requested = 0;
6320
                qemu_system_reset();
6321
                ret = EXCP_INTERRUPT;
6322
            }
6323
            if (powerdown_requested) {
6324
                powerdown_requested = 0;
6325
                qemu_system_powerdown();
6326
                ret = EXCP_INTERRUPT;
6327
            }
6328
            if (ret == EXCP_DEBUG) {
6329
                vm_stop(EXCP_DEBUG);
6330
            }
6331
            /* If all cpus are halted then wait until the next IRQ */
6332
            /* XXX: use timeout computed from timers */
6333
            if (ret == EXCP_HALTED)
6334
                timeout = 10;
6335
            else
6336
                timeout = 0;
6337
        } else {
6338
            timeout = 10;
6339
        }
6340
#ifdef CONFIG_PROFILER
6341
        ti = profile_getclock();
6342
#endif
6343
        main_loop_wait(timeout);
6344
#ifdef CONFIG_PROFILER
6345
        dev_time += profile_getclock() - ti;
6346
#endif
6347
    }
6348
    cpu_disable_ticks();
6349
    return ret;
6350
}
6351

    
6352
void help(void)
6353
{
6354
    printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2007 Fabrice Bellard\n"
6355
           "usage: %s [options] [disk_image]\n"
6356
           "\n"
6357
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
6358
           "\n"
6359
           "Standard options:\n"
6360
           "-M machine      select emulated machine (-M ? for list)\n"
6361
           "-cpu cpu        select CPU (-cpu ? for list)\n"
6362
           "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
6363
           "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n"
6364
           "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n"
6365
           "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
6366
           "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
6367
           "-snapshot       write to temporary files instead of disk image files\n"
6368
#ifdef CONFIG_SDL
6369
           "-no-frame       open SDL window without a frame and window decorations\n"
6370
           "-no-quit        disable SDL window close capability\n"
6371
#endif
6372
#ifdef TARGET_I386
6373
           "-no-fd-bootchk  disable boot signature checking for floppy disks\n"
6374
#endif
6375
           "-m megs         set virtual RAM size to megs MB [default=%d]\n"
6376
           "-smp n          set the number of CPUs to 'n' [default=1]\n"
6377
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
6378
#ifndef _WIN32
6379
           "-k language     use keyboard layout (for example \"fr\" for French)\n"
6380
#endif
6381
#ifdef HAS_AUDIO
6382
           "-audio-help     print list of audio drivers and their options\n"
6383
           "-soundhw c1,... enable audio support\n"
6384
           "                and only specified sound cards (comma separated list)\n"
6385
           "                use -soundhw ? to get the list of supported cards\n"
6386
           "                use -soundhw all to enable all of them\n"
6387
#endif
6388
           "-localtime      set the real time clock to local time [default=utc]\n"
6389
           "-full-screen    start in full screen\n"
6390
#ifdef TARGET_I386
6391
           "-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug\n"
6392
#endif
6393
           "-usb            enable the USB driver (will be the default soon)\n"
6394
           "-usbdevice name add the host or guest USB device 'name'\n"
6395
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
6396
           "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n"
6397
#endif
6398
           "\n"
6399
           "Network options:\n"
6400
           "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
6401
           "                create a new Network Interface Card and connect it to VLAN 'n'\n"
6402
#ifdef CONFIG_SLIRP
6403
           "-net user[,vlan=n][,hostname=host]\n"
6404
           "                connect the user mode network stack to VLAN 'n' and send\n"
6405
           "                hostname 'host' to DHCP clients\n"
6406
#endif
6407
#ifdef _WIN32
6408
           "-net tap[,vlan=n],ifname=name\n"
6409
           "                connect the host TAP network interface to VLAN 'n'\n"
6410
#else
6411
           "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]\n"
6412
           "                connect the host TAP network interface to VLAN 'n' and use\n"
6413
           "                the network script 'file' (default=%s);\n"
6414
           "                use 'script=no' to disable script execution;\n"
6415
           "                use 'fd=h' to connect to an already opened TAP interface\n"
6416
#endif
6417
           "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
6418
           "                connect the vlan 'n' to another VLAN using a socket connection\n"
6419
           "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
6420
           "                connect the vlan 'n' to multicast maddr and port\n"
6421
           "-net none       use it alone to have zero network devices; if no -net option\n"
6422
           "                is provided, the default is '-net nic -net user'\n"
6423
           "\n"
6424
#ifdef CONFIG_SLIRP
6425
           "-tftp dir       allow tftp access to files in dir [-net user]\n"
6426
           "-bootp file     advertise file in BOOTP replies\n"
6427
#ifndef _WIN32
6428
           "-smb dir        allow SMB access to files in 'dir' [-net user]\n"
6429
#endif
6430
           "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
6431
           "                redirect TCP or UDP connections from host to guest [-net user]\n"
6432
#endif
6433
           "\n"
6434
           "Linux boot specific:\n"
6435
           "-kernel bzImage use 'bzImage' as kernel image\n"
6436
           "-append cmdline use 'cmdline' as kernel command line\n"
6437
           "-initrd file    use 'file' as initial ram disk\n"
6438
           "\n"
6439
           "Debug/Expert options:\n"
6440
           "-monitor dev    redirect the monitor to char device 'dev'\n"
6441
           "-serial dev     redirect the serial port to char device 'dev'\n"
6442
           "-parallel dev   redirect the parallel port to char device 'dev'\n"
6443
           "-pidfile file   Write PID to 'file'\n"
6444
           "-S              freeze CPU at startup (use 'c' to start execution)\n"
6445
           "-s              wait gdb connection to port\n"
6446
           "-p port         set gdb connection port [default=%s]\n"
6447
           "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
6448
           "-hdachs c,h,s[,t]  force hard disk 0 physical geometry and the optional BIOS\n"
6449
           "                translation (t=none or lba) (usually qemu can guess them)\n"
6450
           "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n"
6451
#ifdef USE_KQEMU
6452
           "-kernel-kqemu   enable KQEMU full virtualization (default is user mode only)\n"
6453
           "-no-kqemu       disable KQEMU kernel module usage\n"
6454
#endif
6455
#ifdef USE_CODE_COPY
6456
           "-no-code-copy   disable code copy acceleration\n"
6457
#endif
6458
#ifdef TARGET_I386
6459
           "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
6460
           "                (default is CL-GD5446 PCI VGA)\n"
6461
           "-no-acpi        disable ACPI\n"
6462
#endif
6463
           "-no-reboot      exit instead of rebooting\n"
6464
           "-loadvm file    start right away with a saved state (loadvm in monitor)\n"
6465
           "-vnc display    start a VNC server on display\n"
6466
#ifndef _WIN32
6467
           "-daemonize      daemonize QEMU after initializing\n"
6468
#endif
6469
           "-option-rom rom load a file, rom, into the option ROM space\n"
6470
           "\n"
6471
           "During emulation, the following keys are useful:\n"
6472
           "ctrl-alt-f      toggle full screen\n"
6473
           "ctrl-alt-n      switch to virtual console 'n'\n"
6474
           "ctrl-alt        toggle mouse and keyboard grab\n"
6475
           "\n"
6476
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
6477
           ,
6478
           "qemu",
6479
           DEFAULT_RAM_SIZE,
6480
#ifndef _WIN32
6481
           DEFAULT_NETWORK_SCRIPT,
6482
#endif
6483
           DEFAULT_GDBSTUB_PORT,
6484
           "/tmp/qemu.log");
6485
    exit(1);
6486
}
6487

    
6488
#define HAS_ARG 0x0001
6489

    
6490
enum {
6491
    QEMU_OPTION_h,
6492

    
6493
    QEMU_OPTION_M,
6494
    QEMU_OPTION_cpu,
6495
    QEMU_OPTION_fda,
6496
    QEMU_OPTION_fdb,
6497
    QEMU_OPTION_hda,
6498
    QEMU_OPTION_hdb,
6499
    QEMU_OPTION_hdc,
6500
    QEMU_OPTION_hdd,
6501
    QEMU_OPTION_cdrom,
6502
    QEMU_OPTION_boot,
6503
    QEMU_OPTION_snapshot,
6504
#ifdef TARGET_I386
6505
    QEMU_OPTION_no_fd_bootchk,
6506
#endif
6507
    QEMU_OPTION_m,
6508
    QEMU_OPTION_nographic,
6509
#ifdef HAS_AUDIO
6510
    QEMU_OPTION_audio_help,
6511
    QEMU_OPTION_soundhw,
6512
#endif
6513

    
6514
    QEMU_OPTION_net,
6515
    QEMU_OPTION_tftp,
6516
    QEMU_OPTION_bootp,
6517
    QEMU_OPTION_smb,
6518
    QEMU_OPTION_redir,
6519

    
6520
    QEMU_OPTION_kernel,
6521
    QEMU_OPTION_append,
6522
    QEMU_OPTION_initrd,
6523

    
6524
    QEMU_OPTION_S,
6525
    QEMU_OPTION_s,
6526
    QEMU_OPTION_p,
6527
    QEMU_OPTION_d,
6528
    QEMU_OPTION_hdachs,
6529
    QEMU_OPTION_L,
6530
    QEMU_OPTION_no_code_copy,
6531
    QEMU_OPTION_k,
6532
    QEMU_OPTION_localtime,
6533
    QEMU_OPTION_cirrusvga,
6534
    QEMU_OPTION_g,
6535
    QEMU_OPTION_std_vga,
6536
    QEMU_OPTION_echr,
6537
    QEMU_OPTION_monitor,
6538
    QEMU_OPTION_serial,
6539
    QEMU_OPTION_parallel,
6540
    QEMU_OPTION_loadvm,
6541
    QEMU_OPTION_full_screen,
6542
    QEMU_OPTION_no_frame,
6543
    QEMU_OPTION_no_quit,
6544
    QEMU_OPTION_pidfile,
6545
    QEMU_OPTION_no_kqemu,
6546
    QEMU_OPTION_kernel_kqemu,
6547
    QEMU_OPTION_win2k_hack,
6548
    QEMU_OPTION_usb,
6549
    QEMU_OPTION_usbdevice,
6550
    QEMU_OPTION_smp,
6551
    QEMU_OPTION_vnc,
6552
    QEMU_OPTION_no_acpi,
6553
    QEMU_OPTION_no_reboot,
6554
    QEMU_OPTION_daemonize,
6555
    QEMU_OPTION_option_rom,
6556
    QEMU_OPTION_semihosting
6557
};
6558

    
6559
typedef struct QEMUOption {
6560
    const char *name;
6561
    int flags;
6562
    int index;
6563
} QEMUOption;
6564

    
6565
const QEMUOption qemu_options[] = {
6566
    { "h", 0, QEMU_OPTION_h },
6567
    { "help", 0, QEMU_OPTION_h },
6568

    
6569
    { "M", HAS_ARG, QEMU_OPTION_M },
6570
    { "cpu", HAS_ARG, QEMU_OPTION_cpu },
6571
    { "fda", HAS_ARG, QEMU_OPTION_fda },
6572
    { "fdb", HAS_ARG, QEMU_OPTION_fdb },
6573
    { "hda", HAS_ARG, QEMU_OPTION_hda },
6574
    { "hdb", HAS_ARG, QEMU_OPTION_hdb },
6575
    { "hdc", HAS_ARG, QEMU_OPTION_hdc },
6576
    { "hdd", HAS_ARG, QEMU_OPTION_hdd },
6577
    { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
6578
    { "boot", HAS_ARG, QEMU_OPTION_boot },
6579
    { "snapshot", 0, QEMU_OPTION_snapshot },
6580
#ifdef TARGET_I386
6581
    { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
6582
#endif
6583
    { "m", HAS_ARG, QEMU_OPTION_m },
6584
    { "nographic", 0, QEMU_OPTION_nographic },
6585
    { "k", HAS_ARG, QEMU_OPTION_k },
6586
#ifdef HAS_AUDIO
6587
    { "audio-help", 0, QEMU_OPTION_audio_help },
6588
    { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
6589
#endif
6590

    
6591
    { "net", HAS_ARG, QEMU_OPTION_net},
6592
#ifdef CONFIG_SLIRP
6593
    { "tftp", HAS_ARG, QEMU_OPTION_tftp },
6594
    { "bootp", HAS_ARG, QEMU_OPTION_bootp },
6595
#ifndef _WIN32
6596
    { "smb", HAS_ARG, QEMU_OPTION_smb },
6597
#endif
6598
    { "redir", HAS_ARG, QEMU_OPTION_redir },
6599
#endif
6600

    
6601
    { "kernel", HAS_ARG, QEMU_OPTION_kernel },
6602
    { "append", HAS_ARG, QEMU_OPTION_append },
6603
    { "initrd", HAS_ARG, QEMU_OPTION_initrd },
6604

    
6605
    { "S", 0, QEMU_OPTION_S },
6606
    { "s", 0, QEMU_OPTION_s },
6607
    { "p", HAS_ARG, QEMU_OPTION_p },
6608
    { "d", HAS_ARG, QEMU_OPTION_d },
6609
    { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
6610
    { "L", HAS_ARG, QEMU_OPTION_L },
6611
    { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
6612
#ifdef USE_KQEMU
6613
    { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
6614
    { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
6615
#endif
6616
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
6617
    { "g", 1, QEMU_OPTION_g },
6618
#endif
6619
    { "localtime", 0, QEMU_OPTION_localtime },
6620
    { "std-vga", 0, QEMU_OPTION_std_vga },
6621
    { "echr", 1, QEMU_OPTION_echr },
6622
    { "monitor", 1, QEMU_OPTION_monitor },
6623
    { "serial", 1, QEMU_OPTION_serial },
6624
    { "parallel", 1, QEMU_OPTION_parallel },
6625
    { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
6626
    { "full-screen", 0, QEMU_OPTION_full_screen },
6627
#ifdef CONFIG_SDL
6628
    { "no-frame", 0, QEMU_OPTION_no_frame },
6629
    { "no-quit", 0, QEMU_OPTION_no_quit },
6630
#endif
6631
    { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
6632
    { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
6633
    { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
6634
    { "smp", HAS_ARG, QEMU_OPTION_smp },
6635
    { "vnc", HAS_ARG, QEMU_OPTION_vnc },
6636

    
6637
    /* temporary options */
6638
    { "usb", 0, QEMU_OPTION_usb },
6639
    { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
6640
    { "no-acpi", 0, QEMU_OPTION_no_acpi },
6641
    { "no-reboot", 0, QEMU_OPTION_no_reboot },
6642
    { "daemonize", 0, QEMU_OPTION_daemonize },
6643
    { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
6644
#if defined(TARGET_ARM)
6645
    { "semihosting", 0, QEMU_OPTION_semihosting },
6646
#endif
6647
    { NULL },
6648
};
6649

    
6650
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
6651

    
6652
/* this stack is only used during signal handling */
6653
#define SIGNAL_STACK_SIZE 32768
6654

    
6655
static uint8_t *signal_stack;
6656

    
6657
#endif
6658

    
6659
/* password input */
6660

    
6661
static BlockDriverState *get_bdrv(int index)
6662
{
6663
    BlockDriverState *bs;
6664

    
6665
    if (index < 4) {
6666
        bs = bs_table[index];
6667
    } else if (index < 6) {
6668
        bs = fd_table[index - 4];
6669
    } else {
6670
        bs = NULL;
6671
    }
6672
    return bs;
6673
}
6674

    
6675
static void read_passwords(void)
6676
{
6677
    BlockDriverState *bs;
6678
    int i, j;
6679
    char password[256];
6680

    
6681
    for(i = 0; i < 6; i++) {
6682
        bs = get_bdrv(i);
6683
        if (bs && bdrv_is_encrypted(bs)) {
6684
            term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
6685
            for(j = 0; j < 3; j++) {
6686
                monitor_readline("Password: ", 
6687
                                 1, password, sizeof(password));
6688
                if (bdrv_set_key(bs, password) == 0)
6689
                    break;
6690
                term_printf("invalid password\n");
6691
            }
6692
        }
6693
    }
6694
}
6695

    
6696
/* XXX: currently we cannot use simultaneously different CPUs */
6697
void register_machines(void)
6698
{
6699
#if defined(TARGET_I386)
6700
    qemu_register_machine(&pc_machine);
6701
    qemu_register_machine(&isapc_machine);
6702
#elif defined(TARGET_PPC)
6703
    qemu_register_machine(&heathrow_machine);
6704
    qemu_register_machine(&core99_machine);
6705
    qemu_register_machine(&prep_machine);
6706
#elif defined(TARGET_MIPS)
6707
    qemu_register_machine(&mips_machine);
6708
    qemu_register_machine(&mips_malta_machine);
6709
#elif defined(TARGET_SPARC)
6710
#ifdef TARGET_SPARC64
6711
    qemu_register_machine(&sun4u_machine);
6712
#else
6713
    qemu_register_machine(&sun4m_machine);
6714
#endif
6715
#elif defined(TARGET_ARM)
6716
    qemu_register_machine(&integratorcp_machine);
6717
    qemu_register_machine(&versatilepb_machine);
6718
    qemu_register_machine(&versatileab_machine);
6719
    qemu_register_machine(&realview_machine);
6720
#elif defined(TARGET_SH4)
6721
    qemu_register_machine(&shix_machine);
6722
#else
6723
#error unsupported CPU
6724
#endif
6725
}
6726

    
6727
#ifdef HAS_AUDIO
6728
struct soundhw soundhw[] = {
6729
#ifdef TARGET_I386
6730
    {
6731
        "pcspk",
6732
        "PC speaker",
6733
        0,
6734
        1,
6735
        { .init_isa = pcspk_audio_init }
6736
    },
6737
#endif
6738
    {
6739
        "sb16",
6740
        "Creative Sound Blaster 16",
6741
        0,
6742
        1,
6743
        { .init_isa = SB16_init }
6744
    },
6745

    
6746
#ifdef CONFIG_ADLIB
6747
    {
6748
        "adlib",
6749
#ifdef HAS_YMF262
6750
        "Yamaha YMF262 (OPL3)",
6751
#else
6752
        "Yamaha YM3812 (OPL2)",
6753
#endif
6754
        0,
6755
        1,
6756
        { .init_isa = Adlib_init }
6757
    },
6758
#endif
6759

    
6760
#ifdef CONFIG_GUS
6761
    {
6762
        "gus",
6763
        "Gravis Ultrasound GF1",
6764
        0,
6765
        1,
6766
        { .init_isa = GUS_init }
6767
    },
6768
#endif
6769

    
6770
    {
6771
        "es1370",
6772
        "ENSONIQ AudioPCI ES1370",
6773
        0,
6774
        0,
6775
        { .init_pci = es1370_init }
6776
    },
6777

    
6778
    { NULL, NULL, 0, 0, { NULL } }
6779
};
6780

    
6781
static void select_soundhw (const char *optarg)
6782
{
6783
    struct soundhw *c;
6784

    
6785
    if (*optarg == '?') {
6786
    show_valid_cards:
6787

    
6788
        printf ("Valid sound card names (comma separated):\n");
6789
        for (c = soundhw; c->name; ++c) {
6790
            printf ("%-11s %s\n", c->name, c->descr);
6791
        }
6792
        printf ("\n-soundhw all will enable all of the above\n");
6793
        exit (*optarg != '?');
6794
    }
6795
    else {
6796
        size_t l;
6797
        const char *p;
6798
        char *e;
6799
        int bad_card = 0;
6800

    
6801
        if (!strcmp (optarg, "all")) {
6802
            for (c = soundhw; c->name; ++c) {
6803
                c->enabled = 1;
6804
            }
6805
            return;
6806
        }
6807

    
6808
        p = optarg;
6809
        while (*p) {
6810
            e = strchr (p, ',');
6811
            l = !e ? strlen (p) : (size_t) (e - p);
6812

    
6813
            for (c = soundhw; c->name; ++c) {
6814
                if (!strncmp (c->name, p, l)) {
6815
                    c->enabled = 1;
6816
                    break;
6817
                }
6818
            }
6819

    
6820
            if (!c->name) {
6821
                if (l > 80) {
6822
                    fprintf (stderr,
6823
                             "Unknown sound card name (too big to show)\n");
6824
                }
6825
                else {
6826
                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
6827
                             (int) l, p);
6828
                }
6829
                bad_card = 1;
6830
            }
6831
            p += l + (e != NULL);
6832
        }
6833

    
6834
        if (bad_card)
6835
            goto show_valid_cards;
6836
    }
6837
}
6838
#endif
6839

    
6840
#ifdef _WIN32
6841
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
6842
{
6843
    exit(STATUS_CONTROL_C_EXIT);
6844
    return TRUE;
6845
}
6846
#endif
6847

    
6848
#define MAX_NET_CLIENTS 32
6849

    
6850
int main(int argc, char **argv)
6851
{
6852
#ifdef CONFIG_GDBSTUB
6853
    int use_gdbstub;
6854
    const char *gdbstub_port;
6855
#endif
6856
    int i, cdrom_index;
6857
    int snapshot, linux_boot;
6858
    const char *initrd_filename;
6859
    const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
6860
    const char *kernel_filename, *kernel_cmdline;
6861
    DisplayState *ds = &display_state;
6862
    int cyls, heads, secs, translation;
6863
    char net_clients[MAX_NET_CLIENTS][256];
6864
    int nb_net_clients;
6865
    int optind;
6866
    const char *r, *optarg;
6867
    CharDriverState *monitor_hd;
6868
    char monitor_device[128];
6869
    char serial_devices[MAX_SERIAL_PORTS][128];
6870
    int serial_device_index;
6871
    char parallel_devices[MAX_PARALLEL_PORTS][128];
6872
    int parallel_device_index;
6873
    const char *loadvm = NULL;
6874
    QEMUMachine *machine;
6875
    const char *cpu_model;
6876
    char usb_devices[MAX_USB_CMDLINE][128];
6877
    int usb_devices_index;
6878
    int fds[2];
6879

    
6880
    LIST_INIT (&vm_change_state_head);
6881
#ifndef _WIN32
6882
    {
6883
        struct sigaction act;
6884
        sigfillset(&act.sa_mask);
6885
        act.sa_flags = 0;
6886
        act.sa_handler = SIG_IGN;
6887
        sigaction(SIGPIPE, &act, NULL);
6888
    }
6889
#else
6890
    SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
6891
    /* Note: cpu_interrupt() is currently not SMP safe, so we force
6892
       QEMU to run on a single CPU */
6893
    {
6894
        HANDLE h;
6895
        DWORD mask, smask;
6896
        int i;
6897
        h = GetCurrentProcess();
6898
        if (GetProcessAffinityMask(h, &mask, &smask)) {
6899
            for(i = 0; i < 32; i++) {
6900
                if (mask & (1 << i))
6901
                    break;
6902
            }
6903
            if (i != 32) {
6904
                mask = 1 << i;
6905
                SetProcessAffinityMask(h, mask);
6906
            }
6907
        }
6908
    }
6909
#endif
6910

    
6911
    register_machines();
6912
    machine = first_machine;
6913
    cpu_model = NULL;
6914
    initrd_filename = NULL;
6915
    for(i = 0; i < MAX_FD; i++)
6916
        fd_filename[i] = NULL;
6917
    for(i = 0; i < MAX_DISKS; i++)
6918
        hd_filename[i] = NULL;
6919
    ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
6920
    vga_ram_size = VGA_RAM_SIZE;
6921
#ifdef CONFIG_GDBSTUB
6922
    use_gdbstub = 0;
6923
    gdbstub_port = DEFAULT_GDBSTUB_PORT;
6924
#endif
6925
    snapshot = 0;
6926
    nographic = 0;
6927
    kernel_filename = NULL;
6928
    kernel_cmdline = "";
6929
#ifdef TARGET_PPC
6930
    cdrom_index = 1;
6931
#else
6932
    cdrom_index = 2;
6933
#endif
6934
    cyls = heads = secs = 0;
6935
    translation = BIOS_ATA_TRANSLATION_AUTO;
6936
    pstrcpy(monitor_device, sizeof(monitor_device), "vc");
6937

    
6938
    pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "vc");
6939
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
6940
        serial_devices[i][0] = '\0';
6941
    serial_device_index = 0;
6942
    
6943
    pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc");
6944
    for(i = 1; i < MAX_PARALLEL_PORTS; i++)
6945
        parallel_devices[i][0] = '\0';
6946
    parallel_device_index = 0;
6947
    
6948
    usb_devices_index = 0;
6949
    
6950
    nb_net_clients = 0;
6951

    
6952
    nb_nics = 0;
6953
    /* default mac address of the first network interface */
6954
    
6955
    optind = 1;
6956
    for(;;) {
6957
        if (optind >= argc)
6958
            break;
6959
        r = argv[optind];
6960
        if (r[0] != '-') {
6961
            hd_filename[0] = argv[optind++];
6962
        } else {
6963
            const QEMUOption *popt;
6964

    
6965
            optind++;
6966
            /* Treat --foo the same as -foo.  */
6967
            if (r[1] == '-')
6968
                r++;
6969
            popt = qemu_options;
6970
            for(;;) {
6971
                if (!popt->name) {
6972
                    fprintf(stderr, "%s: invalid option -- '%s'\n", 
6973
                            argv[0], r);
6974
                    exit(1);
6975
                }
6976
                if (!strcmp(popt->name, r + 1))
6977
                    break;
6978
                popt++;
6979
            }
6980
            if (popt->flags & HAS_ARG) {
6981
                if (optind >= argc) {
6982
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
6983
                            argv[0], r);
6984
                    exit(1);
6985
                }
6986
                optarg = argv[optind++];
6987
            } else {
6988
                optarg = NULL;
6989
            }
6990

    
6991
            switch(popt->index) {
6992
            case QEMU_OPTION_M:
6993
                machine = find_machine(optarg);
6994
                if (!machine) {
6995
                    QEMUMachine *m;
6996
                    printf("Supported machines are:\n");
6997
                    for(m = first_machine; m != NULL; m = m->next) {
6998
                        printf("%-10s %s%s\n",
6999
                               m->name, m->desc, 
7000
                               m == first_machine ? " (default)" : "");
7001
                    }
7002
                    exit(1);
7003
                }
7004
                break;
7005
            case QEMU_OPTION_cpu:
7006
                /* hw initialization will check this */
7007
                if (optarg[0] == '?') {
7008
#if defined(TARGET_PPC)
7009
                    ppc_cpu_list(stdout, &fprintf);
7010
#elif defined(TARGET_ARM)
7011
                    arm_cpu_list();
7012
#elif defined(TARGET_MIPS)
7013
                    mips_cpu_list(stdout, &fprintf);
7014
#endif
7015
                    exit(1);
7016
                } else {
7017
                    cpu_model = optarg;
7018
                }
7019
                break;
7020
            case QEMU_OPTION_initrd:
7021
                initrd_filename = optarg;
7022
                break;
7023
            case QEMU_OPTION_hda:
7024
            case QEMU_OPTION_hdb:
7025
            case QEMU_OPTION_hdc:
7026
            case QEMU_OPTION_hdd:
7027
                {
7028
                    int hd_index;
7029
                    hd_index = popt->index - QEMU_OPTION_hda;
7030
                    hd_filename[hd_index] = optarg;
7031
                    if (hd_index == cdrom_index)
7032
                        cdrom_index = -1;
7033
                }
7034
                break;
7035
            case QEMU_OPTION_snapshot:
7036
                snapshot = 1;
7037
                break;
7038
            case QEMU_OPTION_hdachs:
7039
                {
7040
                    const char *p;
7041
                    p = optarg;
7042
                    cyls = strtol(p, (char **)&p, 0);
7043
                    if (cyls < 1 || cyls > 16383)
7044
                        goto chs_fail;
7045
                    if (*p != ',')
7046
                        goto chs_fail;
7047
                    p++;
7048
                    heads = strtol(p, (char **)&p, 0);
7049
                    if (heads < 1 || heads > 16)
7050
                        goto chs_fail;
7051
                    if (*p != ',')
7052
                        goto chs_fail;
7053
                    p++;
7054
                    secs = strtol(p, (char **)&p, 0);
7055
                    if (secs < 1 || secs > 63)
7056
                        goto chs_fail;
7057
                    if (*p == ',') {
7058
                        p++;
7059
                        if (!strcmp(p, "none"))
7060
                            translation = BIOS_ATA_TRANSLATION_NONE;
7061
                        else if (!strcmp(p, "lba"))
7062
                            translation = BIOS_ATA_TRANSLATION_LBA;
7063
                        else if (!strcmp(p, "auto"))
7064
                            translation = BIOS_ATA_TRANSLATION_AUTO;
7065
                        else
7066
                            goto chs_fail;
7067
                    } else if (*p != '\0') {
7068
                    chs_fail:
7069
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
7070
                        exit(1);
7071
                    }
7072
                }
7073
                break;
7074
            case QEMU_OPTION_nographic:
7075
                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");
7076
                pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
7077
                nographic = 1;
7078
                break;
7079
            case QEMU_OPTION_kernel:
7080
                kernel_filename = optarg;
7081
                break;
7082
            case QEMU_OPTION_append:
7083
                kernel_cmdline = optarg;
7084
                break;
7085
            case QEMU_OPTION_cdrom:
7086
                if (cdrom_index >= 0) {
7087
                    hd_filename[cdrom_index] = optarg;
7088
                }
7089
                break;
7090
            case QEMU_OPTION_boot:
7091
                boot_device = optarg[0];
7092
                if (boot_device != 'a' && 
7093
#if defined(TARGET_SPARC) || defined(TARGET_I386)
7094
                    // Network boot
7095
                    boot_device != 'n' &&
7096
#endif
7097
                    boot_device != 'c' && boot_device != 'd') {
7098
                    fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device);
7099
                    exit(1);
7100
                }
7101
                break;
7102
            case QEMU_OPTION_fda:
7103
                fd_filename[0] = optarg;
7104
                break;
7105
            case QEMU_OPTION_fdb:
7106
                fd_filename[1] = optarg;
7107
                break;
7108
#ifdef TARGET_I386
7109
            case QEMU_OPTION_no_fd_bootchk:
7110
                fd_bootchk = 0;
7111
                break;
7112
#endif
7113
            case QEMU_OPTION_no_code_copy:
7114
                code_copy_enabled = 0;
7115
                break;
7116
            case QEMU_OPTION_net:
7117
                if (nb_net_clients >= MAX_NET_CLIENTS) {
7118
                    fprintf(stderr, "qemu: too many network clients\n");
7119
                    exit(1);
7120
                }
7121
                pstrcpy(net_clients[nb_net_clients],
7122
                        sizeof(net_clients[0]),
7123
                        optarg);
7124
                nb_net_clients++;
7125
                break;
7126
#ifdef CONFIG_SLIRP
7127
            case QEMU_OPTION_tftp:
7128
                tftp_prefix = optarg;
7129
                break;
7130
            case QEMU_OPTION_bootp:
7131
                bootp_filename = optarg;
7132
                break;
7133
#ifndef _WIN32
7134
            case QEMU_OPTION_smb:
7135
                net_slirp_smb(optarg);
7136
                break;
7137
#endif
7138
            case QEMU_OPTION_redir:
7139
                net_slirp_redir(optarg);                
7140
                break;
7141
#endif
7142
#ifdef HAS_AUDIO
7143
            case QEMU_OPTION_audio_help:
7144
                AUD_help ();
7145
                exit (0);
7146
                break;
7147
            case QEMU_OPTION_soundhw:
7148
                select_soundhw (optarg);
7149
                break;
7150
#endif
7151
            case QEMU_OPTION_h:
7152
                help();
7153
                break;
7154
            case QEMU_OPTION_m:
7155
                ram_size = atoi(optarg) * 1024 * 1024;
7156
                if (ram_size <= 0)
7157
                    help();
7158
                if (ram_size > PHYS_RAM_MAX_SIZE) {
7159
                    fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
7160
                            PHYS_RAM_MAX_SIZE / (1024 * 1024));
7161
                    exit(1);
7162
                }
7163
                break;
7164
            case QEMU_OPTION_d:
7165
                {
7166
                    int mask;
7167
                    CPULogItem *item;
7168
                    
7169
                    mask = cpu_str_to_log_mask(optarg);
7170
                    if (!mask) {
7171
                        printf("Log items (comma separated):\n");
7172
                    for(item = cpu_log_items; item->mask != 0; item++) {
7173
                        printf("%-10s %s\n", item->name, item->help);
7174
                    }
7175
                    exit(1);
7176
                    }
7177
                    cpu_set_log(mask);
7178
                }
7179
                break;
7180
#ifdef CONFIG_GDBSTUB
7181
            case QEMU_OPTION_s:
7182
                use_gdbstub = 1;
7183
                break;
7184
            case QEMU_OPTION_p:
7185
                gdbstub_port = optarg;
7186
                break;
7187
#endif
7188
            case QEMU_OPTION_L:
7189
                bios_dir = optarg;
7190
                break;
7191
            case QEMU_OPTION_S:
7192
                autostart = 0;
7193
                break;
7194
            case QEMU_OPTION_k:
7195
                keyboard_layout = optarg;
7196
                break;
7197
            case QEMU_OPTION_localtime:
7198
                rtc_utc = 0;
7199
                break;
7200
            case QEMU_OPTION_cirrusvga:
7201
                cirrus_vga_enabled = 1;
7202
                break;
7203
            case QEMU_OPTION_std_vga:
7204
                cirrus_vga_enabled = 0;
7205
                break;
7206
            case QEMU_OPTION_g:
7207
                {
7208
                    const char *p;
7209
                    int w, h, depth;
7210
                    p = optarg;
7211
                    w = strtol(p, (char **)&p, 10);
7212
                    if (w <= 0) {
7213
                    graphic_error:
7214
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
7215
                        exit(1);
7216
                    }
7217
                    if (*p != 'x')
7218
                        goto graphic_error;
7219
                    p++;
7220
                    h = strtol(p, (char **)&p, 10);
7221
                    if (h <= 0)
7222
                        goto graphic_error;
7223
                    if (*p == 'x') {
7224
                        p++;
7225
                        depth = strtol(p, (char **)&p, 10);
7226
                        if (depth != 8 && depth != 15 && depth != 16 && 
7227
                            depth != 24 && depth != 32)
7228
                            goto graphic_error;
7229
                    } else if (*p == '\0') {
7230
                        depth = graphic_depth;
7231
                    } else {
7232
                        goto graphic_error;
7233
                    }
7234
                    
7235
                    graphic_width = w;
7236
                    graphic_height = h;
7237
                    graphic_depth = depth;
7238
                }
7239
                break;
7240
            case QEMU_OPTION_echr:
7241
                {
7242
                    char *r;
7243
                    term_escape_char = strtol(optarg, &r, 0);
7244
                    if (r == optarg)
7245
                        printf("Bad argument to echr\n");
7246
                    break;
7247
                }
7248
            case QEMU_OPTION_monitor:
7249
                pstrcpy(monitor_device, sizeof(monitor_device), optarg);
7250
                break;
7251
            case QEMU_OPTION_serial:
7252
                if (serial_device_index >= MAX_SERIAL_PORTS) {
7253
                    fprintf(stderr, "qemu: too many serial ports\n");
7254
                    exit(1);
7255
                }
7256
                pstrcpy(serial_devices[serial_device_index], 
7257
                        sizeof(serial_devices[0]), optarg);
7258
                serial_device_index++;
7259
                break;
7260
            case QEMU_OPTION_parallel:
7261
                if (parallel_device_index >= MAX_PARALLEL_PORTS) {
7262
                    fprintf(stderr, "qemu: too many parallel ports\n");
7263
                    exit(1);
7264
                }
7265
                pstrcpy(parallel_devices[parallel_device_index], 
7266
                        sizeof(parallel_devices[0]), optarg);
7267
                parallel_device_index++;
7268
                break;
7269
            case QEMU_OPTION_loadvm:
7270
                loadvm = optarg;
7271
                break;
7272
            case QEMU_OPTION_full_screen:
7273
                full_screen = 1;
7274
                break;
7275
#ifdef CONFIG_SDL
7276
            case QEMU_OPTION_no_frame:
7277
                no_frame = 1;
7278
                break;
7279
            case QEMU_OPTION_no_quit:
7280
                no_quit = 1;
7281
                break;
7282
#endif
7283
            case QEMU_OPTION_pidfile:
7284
                create_pidfile(optarg);
7285
                break;
7286
#ifdef TARGET_I386
7287
            case QEMU_OPTION_win2k_hack:
7288
                win2k_install_hack = 1;
7289
                break;
7290
#endif
7291
#ifdef USE_KQEMU
7292
            case QEMU_OPTION_no_kqemu:
7293
                kqemu_allowed = 0;
7294
                break;
7295
            case QEMU_OPTION_kernel_kqemu:
7296
                kqemu_allowed = 2;
7297
                break;
7298
#endif
7299
            case QEMU_OPTION_usb:
7300
                usb_enabled = 1;
7301
                break;
7302
            case QEMU_OPTION_usbdevice:
7303
                usb_enabled = 1;
7304
                if (usb_devices_index >= MAX_USB_CMDLINE) {
7305
                    fprintf(stderr, "Too many USB devices\n");
7306
                    exit(1);
7307
                }
7308
                pstrcpy(usb_devices[usb_devices_index],
7309
                        sizeof(usb_devices[usb_devices_index]),
7310
                        optarg);
7311
                usb_devices_index++;
7312
                break;
7313
            case QEMU_OPTION_smp:
7314
                smp_cpus = atoi(optarg);
7315
                if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
7316
                    fprintf(stderr, "Invalid number of CPUs\n");
7317
                    exit(1);
7318
                }
7319
                break;
7320
            case QEMU_OPTION_vnc:
7321
                vnc_display = optarg;
7322
                break;
7323
            case QEMU_OPTION_no_acpi:
7324
                acpi_enabled = 0;
7325
                break;
7326
            case QEMU_OPTION_no_reboot:
7327
                no_reboot = 1;
7328
                break;
7329
            case QEMU_OPTION_daemonize:
7330
                daemonize = 1;
7331
                break;
7332
            case QEMU_OPTION_option_rom:
7333
                if (nb_option_roms >= MAX_OPTION_ROMS) {
7334
                    fprintf(stderr, "Too many option ROMs\n");
7335
                    exit(1);
7336
                }
7337
                option_rom[nb_option_roms] = optarg;
7338
                nb_option_roms++;
7339
                break;
7340
            case QEMU_OPTION_semihosting:
7341
                semihosting_enabled = 1;
7342
                break;
7343
            }
7344
        }
7345
    }
7346

    
7347
#ifndef _WIN32
7348
    if (daemonize && !nographic && vnc_display == NULL) {
7349
        fprintf(stderr, "Can only daemonize if using -nographic or -vnc\n");
7350
        daemonize = 0;
7351
    }
7352

    
7353
    if (daemonize) {
7354
        pid_t pid;
7355

    
7356
        if (pipe(fds) == -1)
7357
            exit(1);
7358

    
7359
        pid = fork();
7360
        if (pid > 0) {
7361
            uint8_t status;
7362
            ssize_t len;
7363

    
7364
            close(fds[1]);
7365

    
7366
        again:
7367
            len = read(fds[0], &status, 1);
7368
            if (len == -1 && (errno == EINTR))
7369
                goto again;
7370
            
7371
            if (len != 1 || status != 0)
7372
                exit(1);
7373
            else
7374
                exit(0);
7375
        } else if (pid < 0)
7376
            exit(1);
7377

    
7378
        setsid();
7379

    
7380
        pid = fork();
7381
        if (pid > 0)
7382
            exit(0);
7383
        else if (pid < 0)
7384
            exit(1);
7385

    
7386
        umask(027);
7387
        chdir("/");
7388

    
7389
        signal(SIGTSTP, SIG_IGN);
7390
        signal(SIGTTOU, SIG_IGN);
7391
        signal(SIGTTIN, SIG_IGN);
7392
    }
7393
#endif
7394

    
7395
#ifdef USE_KQEMU
7396
    if (smp_cpus > 1)
7397
        kqemu_allowed = 0;
7398
#endif
7399
    linux_boot = (kernel_filename != NULL);
7400

    
7401
    if (!linux_boot &&
7402
        boot_device != 'n' &&
7403
        hd_filename[0] == '\0' && 
7404
        (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
7405
        fd_filename[0] == '\0')
7406
        help();
7407

    
7408
    /* boot to floppy or the default cd if no hard disk defined yet */
7409
    if (hd_filename[0] == '\0' && boot_device == 'c') {
7410
        if (fd_filename[0] != '\0')
7411
            boot_device = 'a';
7412
        else
7413
            boot_device = 'd';
7414
    }
7415

    
7416
    setvbuf(stdout, NULL, _IOLBF, 0);
7417
    
7418
    init_timers();
7419
    init_timer_alarm();
7420
    qemu_aio_init();
7421

    
7422
#ifdef _WIN32
7423
    socket_init();
7424
#endif
7425

    
7426
    /* init network clients */
7427
    if (nb_net_clients == 0) {
7428
        /* if no clients, we use a default config */
7429
        pstrcpy(net_clients[0], sizeof(net_clients[0]),
7430
                "nic");
7431
        pstrcpy(net_clients[1], sizeof(net_clients[0]),
7432
                "user");
7433
        nb_net_clients = 2;
7434
    }
7435

    
7436
    for(i = 0;i < nb_net_clients; i++) {
7437
        if (net_client_init(net_clients[i]) < 0)
7438
            exit(1);
7439
    }
7440

    
7441
#ifdef TARGET_I386
7442
    if (boot_device == 'n') {
7443
        for (i = 0; i < nb_nics; i++) {
7444
            const char *model = nd_table[i].model;
7445
            char buf[1024];
7446
            if (model == NULL)
7447
                model = "ne2k_pci";
7448
            snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
7449
            if (get_image_size(buf) > 0) {
7450
                option_rom[nb_option_roms] = strdup(buf);
7451
                nb_option_roms++;
7452
                break;
7453
            }
7454
        }
7455
        if (i == nb_nics) {
7456
            fprintf(stderr, "No valid PXE rom found for network device\n");
7457
            exit(1);
7458
        }
7459
        boot_device = 'c'; /* to prevent confusion by the BIOS */
7460
    }
7461
#endif
7462

    
7463
    /* init the memory */
7464
    phys_ram_size = ram_size + vga_ram_size + MAX_BIOS_SIZE;
7465

    
7466
    phys_ram_base = qemu_vmalloc(phys_ram_size);
7467
    if (!phys_ram_base) {
7468
        fprintf(stderr, "Could not allocate physical memory\n");
7469
        exit(1);
7470
    }
7471

    
7472
    /* we always create the cdrom drive, even if no disk is there */
7473
    bdrv_init();
7474
    if (cdrom_index >= 0) {
7475
        bs_table[cdrom_index] = bdrv_new("cdrom");
7476
        bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM);
7477
    }
7478

    
7479
    /* open the virtual block devices */
7480
    for(i = 0; i < MAX_DISKS; i++) {
7481
        if (hd_filename[i]) {
7482
            if (!bs_table[i]) {
7483
                char buf[64];
7484
                snprintf(buf, sizeof(buf), "hd%c", i + 'a');
7485
                bs_table[i] = bdrv_new(buf);
7486
            }
7487
            if (bdrv_open(bs_table[i], hd_filename[i], snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
7488
                fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
7489
                        hd_filename[i]);
7490
                exit(1);
7491
            }
7492
            if (i == 0 && cyls != 0) {
7493
                bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
7494
                bdrv_set_translation_hint(bs_table[i], translation);
7495
            }
7496
        }
7497
    }
7498

    
7499
    /* we always create at least one floppy disk */
7500
    fd_table[0] = bdrv_new("fda");
7501
    bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
7502

    
7503
    for(i = 0; i < MAX_FD; i++) {
7504
        if (fd_filename[i]) {
7505
            if (!fd_table[i]) {
7506
                char buf[64];
7507
                snprintf(buf, sizeof(buf), "fd%c", i + 'a');
7508
                fd_table[i] = bdrv_new(buf);
7509
                bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
7510
            }
7511
            if (fd_filename[i] != '\0') {
7512
                if (bdrv_open(fd_table[i], fd_filename[i],
7513
                              snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
7514
                    fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
7515
                            fd_filename[i]);
7516
                    exit(1);
7517
                }
7518
            }
7519
        }
7520
    }
7521

    
7522
    register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
7523
    register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
7524

    
7525
    init_ioports();
7526

    
7527
    /* terminal init */
7528
    if (nographic) {
7529
        dumb_display_init(ds);
7530
    } else if (vnc_display != NULL) {
7531
        vnc_display_init(ds, vnc_display);
7532
    } else {
7533
#if defined(CONFIG_SDL)
7534
        sdl_display_init(ds, full_screen, no_frame);
7535
#elif defined(CONFIG_COCOA)
7536
        cocoa_display_init(ds, full_screen);
7537
#else
7538
        dumb_display_init(ds);
7539
#endif
7540
    }
7541

    
7542
    /* Maintain compatibility with multiple stdio monitors */
7543
    if (!strcmp(monitor_device,"stdio")) {
7544
        for (i = 0; i < MAX_SERIAL_PORTS; i++) {
7545
            if (!strcmp(serial_devices[i],"mon:stdio")) {
7546
                monitor_device[0] = '\0';
7547
                break;
7548
            } else if (!strcmp(serial_devices[i],"stdio")) {
7549
                monitor_device[0] = '\0';
7550
                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "mon:stdio");
7551
                break;
7552
            }
7553
        }
7554
    }
7555
    if (monitor_device[0] != '\0') {
7556
        monitor_hd = qemu_chr_open(monitor_device);
7557
        if (!monitor_hd) {
7558
            fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
7559
            exit(1);
7560
        }
7561
        monitor_init(monitor_hd, !nographic);
7562
    }
7563

    
7564
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
7565
        const char *devname = serial_devices[i];
7566
        if (devname[0] != '\0' && strcmp(devname, "none")) {
7567
            serial_hds[i] = qemu_chr_open(devname);
7568
            if (!serial_hds[i]) {
7569
                fprintf(stderr, "qemu: could not open serial device '%s'\n", 
7570
                        devname);
7571
                exit(1);
7572
            }
7573
            if (!strcmp(devname, "vc"))
7574
                qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
7575
        }
7576
    }
7577

    
7578
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
7579
        const char *devname = parallel_devices[i];
7580
        if (devname[0] != '\0' && strcmp(devname, "none")) {
7581
            parallel_hds[i] = qemu_chr_open(devname);
7582
            if (!parallel_hds[i]) {
7583
                fprintf(stderr, "qemu: could not open parallel device '%s'\n", 
7584
                        devname);
7585
                exit(1);
7586
            }
7587
            if (!strcmp(devname, "vc"))
7588
                qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
7589
        }
7590
    }
7591

    
7592
    machine->init(ram_size, vga_ram_size, boot_device,
7593
                  ds, fd_filename, snapshot,
7594
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
7595

    
7596
    /* init USB devices */
7597
    if (usb_enabled) {
7598
        for(i = 0; i < usb_devices_index; i++) {
7599
            if (usb_device_add(usb_devices[i]) < 0) {
7600
                fprintf(stderr, "Warning: could not add USB device %s\n",
7601
                        usb_devices[i]);
7602
            }
7603
        }
7604
    }
7605

    
7606
    gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
7607
    qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
7608

    
7609
#ifdef CONFIG_GDBSTUB
7610
    if (use_gdbstub) {
7611
        /* XXX: use standard host:port notation and modify options
7612
           accordingly. */
7613
        if (gdbserver_start(gdbstub_port) < 0) {
7614
            fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
7615
                    gdbstub_port);
7616
            exit(1);
7617
        }
7618
    } else 
7619
#endif
7620
    if (loadvm)
7621
        do_loadvm(loadvm);
7622

    
7623
    {
7624
        /* XXX: simplify init */
7625
        read_passwords();
7626
        if (autostart) {
7627
            vm_start();
7628
        }
7629
    }
7630

    
7631
    if (daemonize) {
7632
        uint8_t status = 0;
7633
        ssize_t len;
7634
        int fd;
7635

    
7636
    again1:
7637
        len = write(fds[1], &status, 1);
7638
        if (len == -1 && (errno == EINTR))
7639
            goto again1;
7640

    
7641
        if (len != 1)
7642
            exit(1);
7643

    
7644
        fd = open("/dev/null", O_RDWR);
7645
        if (fd == -1)
7646
            exit(1);
7647

    
7648
        dup2(fd, 0);
7649
        dup2(fd, 1);
7650
        dup2(fd, 2);
7651

    
7652
        close(fd);
7653
    }
7654

    
7655
    main_loop();
7656
    quit_timers();
7657
    return 0;
7658
}