Statistics
| Branch: | Revision:

root / vl.c @ 115defd1

History | View | Annotate | Download (143.5 kB)

1
/*
2
 * QEMU System Emulator
3
 * 
4
 * Copyright (c) 2003-2005 Fabrice Bellard
5
 * 
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include "vl.h"
25

    
26
#include <unistd.h>
27
#include <fcntl.h>
28
#include <signal.h>
29
#include <time.h>
30
#include <errno.h>
31
#include <sys/time.h>
32

    
33
#ifndef _WIN32
34
#include <sys/times.h>
35
#include <sys/wait.h>
36
#include <termios.h>
37
#include <sys/poll.h>
38
#include <sys/mman.h>
39
#include <sys/ioctl.h>
40
#include <sys/socket.h>
41
#include <netinet/in.h>
42
#include <dirent.h>
43
#include <netdb.h>
44
#ifdef _BSD
45
#include <sys/stat.h>
46
#ifndef __APPLE__
47
#include <libutil.h>
48
#endif
49
#else
50
#include <linux/if.h>
51
#include <linux/if_tun.h>
52
#include <pty.h>
53
#include <malloc.h>
54
#include <linux/rtc.h>
55
#include <linux/ppdev.h>
56
#endif
57
#endif
58

    
59
#if defined(CONFIG_SLIRP)
60
#include "libslirp.h"
61
#endif
62

    
63
#ifdef _WIN32
64
#include <malloc.h>
65
#include <sys/timeb.h>
66
#include <windows.h>
67
#include <winsock2.h>
68
#include <ws2tcpip.h>
69
#define getopt_long_only getopt_long
70
#define memalign(align, size) malloc(size)
71
#endif
72

    
73
#ifdef CONFIG_SDL
74
#ifdef __APPLE__
75
#include <SDL/SDL.h>
76
#endif
77
#endif /* CONFIG_SDL */
78

    
79
#ifdef CONFIG_COCOA
80
#undef main
81
#define main qemu_main
82
#endif /* CONFIG_COCOA */
83

    
84
#include "disas.h"
85

    
86
#include "exec-all.h"
87

    
88
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
89

    
90
//#define DEBUG_UNUSED_IOPORT
91
//#define DEBUG_IOPORT
92

    
93
#if !defined(CONFIG_SOFTMMU)
94
#define PHYS_RAM_MAX_SIZE (256 * 1024 * 1024)
95
#else
96
#define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
97
#endif
98

    
99
#ifdef TARGET_PPC
100
#define DEFAULT_RAM_SIZE 144
101
#else
102
#define DEFAULT_RAM_SIZE 128
103
#endif
104
/* in ms */
105
#define GUI_REFRESH_INTERVAL 30
106

    
107
/* XXX: use a two level table to limit memory usage */
108
#define MAX_IOPORTS 65536
109

    
110
const char *bios_dir = CONFIG_QEMU_SHAREDIR;
111
char phys_ram_file[1024];
112
void *ioport_opaque[MAX_IOPORTS];
113
IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
114
IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
115
BlockDriverState *bs_table[MAX_DISKS], *fd_table[MAX_FD];
116
int vga_ram_size;
117
int bios_size;
118
static DisplayState display_state;
119
int nographic;
120
const char* keyboard_layout = NULL;
121
int64_t ticks_per_sec;
122
int boot_device = 'c';
123
int ram_size;
124
int pit_min_timer_count = 0;
125
int nb_nics;
126
NICInfo nd_table[MAX_NICS];
127
QEMUTimer *gui_timer;
128
int vm_running;
129
int rtc_utc = 1;
130
int cirrus_vga_enabled = 1;
131
#ifdef TARGET_SPARC
132
int graphic_width = 1024;
133
int graphic_height = 768;
134
#else
135
int graphic_width = 800;
136
int graphic_height = 600;
137
#endif
138
int graphic_depth = 15;
139
int full_screen = 0;
140
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
141
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
142
#ifdef TARGET_I386
143
int win2k_install_hack = 0;
144
#endif
145
int usb_enabled = 0;
146
USBPort *vm_usb_ports[MAX_VM_USB_PORTS];
147
USBDevice *vm_usb_hub;
148
static VLANState *first_vlan;
149
int smp_cpus = 1;
150
#if defined(TARGET_SPARC)
151
#define MAX_CPUS 16
152
#elif defined(TARGET_I386)
153
#define MAX_CPUS 255
154
#else
155
#define MAX_CPUS 1
156
#endif
157

    
158
/***********************************************************/
159
/* x86 ISA bus support */
160

    
161
target_phys_addr_t isa_mem_base = 0;
162
PicState2 *isa_pic;
163

    
164
uint32_t default_ioport_readb(void *opaque, uint32_t address)
165
{
166
#ifdef DEBUG_UNUSED_IOPORT
167
    fprintf(stderr, "inb: port=0x%04x\n", address);
168
#endif
169
    return 0xff;
170
}
171

    
172
void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
173
{
174
#ifdef DEBUG_UNUSED_IOPORT
175
    fprintf(stderr, "outb: port=0x%04x data=0x%02x\n", address, data);
176
#endif
177
}
178

    
179
/* default is to make two byte accesses */
180
uint32_t default_ioport_readw(void *opaque, uint32_t address)
181
{
182
    uint32_t data;
183
    data = ioport_read_table[0][address](ioport_opaque[address], address);
184
    address = (address + 1) & (MAX_IOPORTS - 1);
185
    data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
186
    return data;
187
}
188

    
189
void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
190
{
191
    ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
192
    address = (address + 1) & (MAX_IOPORTS - 1);
193
    ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
194
}
195

    
196
uint32_t default_ioport_readl(void *opaque, uint32_t address)
197
{
198
#ifdef DEBUG_UNUSED_IOPORT
199
    fprintf(stderr, "inl: port=0x%04x\n", address);
200
#endif
201
    return 0xffffffff;
202
}
203

    
204
void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
205
{
206
#ifdef DEBUG_UNUSED_IOPORT
207
    fprintf(stderr, "outl: port=0x%04x data=0x%02x\n", address, data);
208
#endif
209
}
210

    
211
void init_ioports(void)
212
{
213
    int i;
214

    
215
    for(i = 0; i < MAX_IOPORTS; i++) {
216
        ioport_read_table[0][i] = default_ioport_readb;
217
        ioport_write_table[0][i] = default_ioport_writeb;
218
        ioport_read_table[1][i] = default_ioport_readw;
219
        ioport_write_table[1][i] = default_ioport_writew;
220
        ioport_read_table[2][i] = default_ioport_readl;
221
        ioport_write_table[2][i] = default_ioport_writel;
222
    }
223
}
224

    
225
/* size is the word size in byte */
226
int register_ioport_read(int start, int length, int size, 
227
                         IOPortReadFunc *func, void *opaque)
228
{
229
    int i, bsize;
230

    
231
    if (size == 1) {
232
        bsize = 0;
233
    } else if (size == 2) {
234
        bsize = 1;
235
    } else if (size == 4) {
236
        bsize = 2;
237
    } else {
238
        hw_error("register_ioport_read: invalid size");
239
        return -1;
240
    }
241
    for(i = start; i < start + length; i += size) {
242
        ioport_read_table[bsize][i] = func;
243
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
244
            hw_error("register_ioport_read: invalid opaque");
245
        ioport_opaque[i] = opaque;
246
    }
247
    return 0;
248
}
249

    
250
/* size is the word size in byte */
251
int register_ioport_write(int start, int length, int size, 
252
                          IOPortWriteFunc *func, void *opaque)
253
{
254
    int i, bsize;
255

    
256
    if (size == 1) {
257
        bsize = 0;
258
    } else if (size == 2) {
259
        bsize = 1;
260
    } else if (size == 4) {
261
        bsize = 2;
262
    } else {
263
        hw_error("register_ioport_write: invalid size");
264
        return -1;
265
    }
266
    for(i = start; i < start + length; i += size) {
267
        ioport_write_table[bsize][i] = func;
268
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
269
            hw_error("register_ioport_read: invalid opaque");
270
        ioport_opaque[i] = opaque;
271
    }
272
    return 0;
273
}
274

    
275
void isa_unassign_ioport(int start, int length)
276
{
277
    int i;
278

    
279
    for(i = start; i < start + length; i++) {
280
        ioport_read_table[0][i] = default_ioport_readb;
281
        ioport_read_table[1][i] = default_ioport_readw;
282
        ioport_read_table[2][i] = default_ioport_readl;
283

    
284
        ioport_write_table[0][i] = default_ioport_writeb;
285
        ioport_write_table[1][i] = default_ioport_writew;
286
        ioport_write_table[2][i] = default_ioport_writel;
287
    }
288
}
289

    
290
/***********************************************************/
291

    
292
void pstrcpy(char *buf, int buf_size, const char *str)
293
{
294
    int c;
295
    char *q = buf;
296

    
297
    if (buf_size <= 0)
298
        return;
299

    
300
    for(;;) {
301
        c = *str++;
302
        if (c == 0 || q >= buf + buf_size - 1)
303
            break;
304
        *q++ = c;
305
    }
306
    *q = '\0';
307
}
308

    
309
/* strcat and truncate. */
310
char *pstrcat(char *buf, int buf_size, const char *s)
311
{
312
    int len;
313
    len = strlen(buf);
314
    if (len < buf_size) 
315
        pstrcpy(buf + len, buf_size - len, s);
316
    return buf;
317
}
318

    
319
int strstart(const char *str, const char *val, const char **ptr)
320
{
321
    const char *p, *q;
322
    p = str;
323
    q = val;
324
    while (*q != '\0') {
325
        if (*p != *q)
326
            return 0;
327
        p++;
328
        q++;
329
    }
330
    if (ptr)
331
        *ptr = p;
332
    return 1;
333
}
334

    
335
/* return the size or -1 if error */
336
int get_image_size(const char *filename)
337
{
338
    int fd, size;
339
    fd = open(filename, O_RDONLY | O_BINARY);
340
    if (fd < 0)
341
        return -1;
342
    size = lseek(fd, 0, SEEK_END);
343
    close(fd);
344
    return size;
345
}
346

    
347
/* return the size or -1 if error */
348
int load_image(const char *filename, uint8_t *addr)
349
{
350
    int fd, size;
351
    fd = open(filename, O_RDONLY | O_BINARY);
352
    if (fd < 0)
353
        return -1;
354
    size = lseek(fd, 0, SEEK_END);
355
    lseek(fd, 0, SEEK_SET);
356
    if (read(fd, addr, size) != size) {
357
        close(fd);
358
        return -1;
359
    }
360
    close(fd);
361
    return size;
362
}
363

    
364
void cpu_outb(CPUState *env, int addr, int val)
365
{
366
#ifdef DEBUG_IOPORT
367
    if (loglevel & CPU_LOG_IOPORT)
368
        fprintf(logfile, "outb: %04x %02x\n", addr, val);
369
#endif    
370
    ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
371
#ifdef USE_KQEMU
372
    if (env)
373
        env->last_io_time = cpu_get_time_fast();
374
#endif
375
}
376

    
377
void cpu_outw(CPUState *env, int addr, int val)
378
{
379
#ifdef DEBUG_IOPORT
380
    if (loglevel & CPU_LOG_IOPORT)
381
        fprintf(logfile, "outw: %04x %04x\n", addr, val);
382
#endif    
383
    ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
384
#ifdef USE_KQEMU
385
    if (env)
386
        env->last_io_time = cpu_get_time_fast();
387
#endif
388
}
389

    
390
void cpu_outl(CPUState *env, int addr, int val)
391
{
392
#ifdef DEBUG_IOPORT
393
    if (loglevel & CPU_LOG_IOPORT)
394
        fprintf(logfile, "outl: %04x %08x\n", addr, val);
395
#endif
396
    ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
397
#ifdef USE_KQEMU
398
    if (env)
399
        env->last_io_time = cpu_get_time_fast();
400
#endif
401
}
402

    
403
int cpu_inb(CPUState *env, int addr)
404
{
405
    int val;
406
    val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
407
#ifdef DEBUG_IOPORT
408
    if (loglevel & CPU_LOG_IOPORT)
409
        fprintf(logfile, "inb : %04x %02x\n", addr, val);
410
#endif
411
#ifdef USE_KQEMU
412
    if (env)
413
        env->last_io_time = cpu_get_time_fast();
414
#endif
415
    return val;
416
}
417

    
418
int cpu_inw(CPUState *env, int addr)
419
{
420
    int val;
421
    val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
422
#ifdef DEBUG_IOPORT
423
    if (loglevel & CPU_LOG_IOPORT)
424
        fprintf(logfile, "inw : %04x %04x\n", addr, val);
425
#endif
426
#ifdef USE_KQEMU
427
    if (env)
428
        env->last_io_time = cpu_get_time_fast();
429
#endif
430
    return val;
431
}
432

    
433
int cpu_inl(CPUState *env, int addr)
434
{
435
    int val;
436
    val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
437
#ifdef DEBUG_IOPORT
438
    if (loglevel & CPU_LOG_IOPORT)
439
        fprintf(logfile, "inl : %04x %08x\n", addr, val);
440
#endif
441
#ifdef USE_KQEMU
442
    if (env)
443
        env->last_io_time = cpu_get_time_fast();
444
#endif
445
    return val;
446
}
447

    
448
/***********************************************************/
449
void hw_error(const char *fmt, ...)
450
{
451
    va_list ap;
452
    CPUState *env;
453

    
454
    va_start(ap, fmt);
455
    fprintf(stderr, "qemu: hardware error: ");
456
    vfprintf(stderr, fmt, ap);
457
    fprintf(stderr, "\n");
458
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
459
        fprintf(stderr, "CPU #%d:\n", env->cpu_index);
460
#ifdef TARGET_I386
461
        cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
462
#else
463
        cpu_dump_state(env, stderr, fprintf, 0);
464
#endif
465
    }
466
    va_end(ap);
467
    abort();
468
}
469

    
470
/***********************************************************/
471
/* keyboard/mouse */
472

    
473
static QEMUPutKBDEvent *qemu_put_kbd_event;
474
static void *qemu_put_kbd_event_opaque;
475
static QEMUPutMouseEvent *qemu_put_mouse_event;
476
static void *qemu_put_mouse_event_opaque;
477
static int qemu_put_mouse_event_absolute;
478

    
479
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
480
{
481
    qemu_put_kbd_event_opaque = opaque;
482
    qemu_put_kbd_event = func;
483
}
484

    
485
void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque, int absolute)
486
{
487
    qemu_put_mouse_event_opaque = opaque;
488
    qemu_put_mouse_event = func;
489
    qemu_put_mouse_event_absolute = absolute;
490
}
491

    
492
void kbd_put_keycode(int keycode)
493
{
494
    if (qemu_put_kbd_event) {
495
        qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
496
    }
497
}
498

    
499
void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
500
{
501
    if (qemu_put_mouse_event) {
502
        qemu_put_mouse_event(qemu_put_mouse_event_opaque, 
503
                             dx, dy, dz, buttons_state);
504
    }
505
}
506

    
507
int kbd_mouse_is_absolute(void)
508
{
509
    return qemu_put_mouse_event_absolute;
510
}
511

    
512
/***********************************************************/
513
/* timers */
514

    
515
#if defined(__powerpc__)
516

    
517
static inline uint32_t get_tbl(void) 
518
{
519
    uint32_t tbl;
520
    asm volatile("mftb %0" : "=r" (tbl));
521
    return tbl;
522
}
523

    
524
static inline uint32_t get_tbu(void) 
525
{
526
        uint32_t tbl;
527
        asm volatile("mftbu %0" : "=r" (tbl));
528
        return tbl;
529
}
530

    
531
int64_t cpu_get_real_ticks(void)
532
{
533
    uint32_t l, h, h1;
534
    /* NOTE: we test if wrapping has occurred */
535
    do {
536
        h = get_tbu();
537
        l = get_tbl();
538
        h1 = get_tbu();
539
    } while (h != h1);
540
    return ((int64_t)h << 32) | l;
541
}
542

    
543
#elif defined(__i386__)
544

    
545
int64_t cpu_get_real_ticks(void)
546
{
547
    int64_t val;
548
    asm volatile ("rdtsc" : "=A" (val));
549
    return val;
550
}
551

    
552
#elif defined(__x86_64__)
553

    
554
int64_t cpu_get_real_ticks(void)
555
{
556
    uint32_t low,high;
557
    int64_t val;
558
    asm volatile("rdtsc" : "=a" (low), "=d" (high));
559
    val = high;
560
    val <<= 32;
561
    val |= low;
562
    return val;
563
}
564

    
565
#elif defined(__ia64)
566

    
567
int64_t cpu_get_real_ticks(void)
568
{
569
        int64_t val;
570
        asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory");
571
        return val;
572
}
573

    
574
#elif defined(__s390__)
575

    
576
int64_t cpu_get_real_ticks(void)
577
{
578
    int64_t val;
579
    asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc");
580
    return val;
581
}
582

    
583
#else
584
#error unsupported CPU
585
#endif
586

    
587
static int64_t cpu_ticks_offset;
588
static int cpu_ticks_enabled;
589

    
590
static inline int64_t cpu_get_ticks(void)
591
{
592
    if (!cpu_ticks_enabled) {
593
        return cpu_ticks_offset;
594
    } else {
595
        return cpu_get_real_ticks() + cpu_ticks_offset;
596
    }
597
}
598

    
599
/* enable cpu_get_ticks() */
600
void cpu_enable_ticks(void)
601
{
602
    if (!cpu_ticks_enabled) {
603
        cpu_ticks_offset -= cpu_get_real_ticks();
604
        cpu_ticks_enabled = 1;
605
    }
606
}
607

    
608
/* disable cpu_get_ticks() : the clock is stopped. You must not call
609
   cpu_get_ticks() after that.  */
610
void cpu_disable_ticks(void)
611
{
612
    if (cpu_ticks_enabled) {
613
        cpu_ticks_offset = cpu_get_ticks();
614
        cpu_ticks_enabled = 0;
615
    }
616
}
617

    
618
static int64_t get_clock(void)
619
{
620
#ifdef _WIN32
621
    struct _timeb tb;
622
    _ftime(&tb);
623
    return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
624
#else
625
    struct timeval tv;
626
    gettimeofday(&tv, NULL);
627
    return tv.tv_sec * 1000000LL + tv.tv_usec;
628
#endif
629
}
630

    
631
void cpu_calibrate_ticks(void)
632
{
633
    int64_t usec, ticks;
634

    
635
    usec = get_clock();
636
    ticks = cpu_get_real_ticks();
637
#ifdef _WIN32
638
    Sleep(50);
639
#else
640
    usleep(50 * 1000);
641
#endif
642
    usec = get_clock() - usec;
643
    ticks = cpu_get_real_ticks() - ticks;
644
    ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
645
}
646

    
647
/* compute with 96 bit intermediate result: (a*b)/c */
648
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
649
{
650
    union {
651
        uint64_t ll;
652
        struct {
653
#ifdef WORDS_BIGENDIAN
654
            uint32_t high, low;
655
#else
656
            uint32_t low, high;
657
#endif            
658
        } l;
659
    } u, res;
660
    uint64_t rl, rh;
661

    
662
    u.ll = a;
663
    rl = (uint64_t)u.l.low * (uint64_t)b;
664
    rh = (uint64_t)u.l.high * (uint64_t)b;
665
    rh += (rl >> 32);
666
    res.l.high = rh / c;
667
    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
668
    return res.ll;
669
}
670

    
671
#define QEMU_TIMER_REALTIME 0
672
#define QEMU_TIMER_VIRTUAL  1
673

    
674
struct QEMUClock {
675
    int type;
676
    /* XXX: add frequency */
677
};
678

    
679
struct QEMUTimer {
680
    QEMUClock *clock;
681
    int64_t expire_time;
682
    QEMUTimerCB *cb;
683
    void *opaque;
684
    struct QEMUTimer *next;
685
};
686

    
687
QEMUClock *rt_clock;
688
QEMUClock *vm_clock;
689

    
690
static QEMUTimer *active_timers[2];
691
#ifdef _WIN32
692
static MMRESULT timerID;
693
#else
694
/* frequency of the times() clock tick */
695
static int timer_freq;
696
#endif
697

    
698
QEMUClock *qemu_new_clock(int type)
699
{
700
    QEMUClock *clock;
701
    clock = qemu_mallocz(sizeof(QEMUClock));
702
    if (!clock)
703
        return NULL;
704
    clock->type = type;
705
    return clock;
706
}
707

    
708
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
709
{
710
    QEMUTimer *ts;
711

    
712
    ts = qemu_mallocz(sizeof(QEMUTimer));
713
    ts->clock = clock;
714
    ts->cb = cb;
715
    ts->opaque = opaque;
716
    return ts;
717
}
718

    
719
void qemu_free_timer(QEMUTimer *ts)
720
{
721
    qemu_free(ts);
722
}
723

    
724
/* stop a timer, but do not dealloc it */
725
void qemu_del_timer(QEMUTimer *ts)
726
{
727
    QEMUTimer **pt, *t;
728

    
729
    /* NOTE: this code must be signal safe because
730
       qemu_timer_expired() can be called from a signal. */
731
    pt = &active_timers[ts->clock->type];
732
    for(;;) {
733
        t = *pt;
734
        if (!t)
735
            break;
736
        if (t == ts) {
737
            *pt = t->next;
738
            break;
739
        }
740
        pt = &t->next;
741
    }
742
}
743

    
744
/* modify the current timer so that it will be fired when current_time
745
   >= expire_time. The corresponding callback will be called. */
746
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
747
{
748
    QEMUTimer **pt, *t;
749

    
750
    qemu_del_timer(ts);
751

    
752
    /* add the timer in the sorted list */
753
    /* NOTE: this code must be signal safe because
754
       qemu_timer_expired() can be called from a signal. */
755
    pt = &active_timers[ts->clock->type];
756
    for(;;) {
757
        t = *pt;
758
        if (!t)
759
            break;
760
        if (t->expire_time > expire_time) 
761
            break;
762
        pt = &t->next;
763
    }
764
    ts->expire_time = expire_time;
765
    ts->next = *pt;
766
    *pt = ts;
767
}
768

    
769
int qemu_timer_pending(QEMUTimer *ts)
770
{
771
    QEMUTimer *t;
772
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
773
        if (t == ts)
774
            return 1;
775
    }
776
    return 0;
777
}
778

    
779
static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
780
{
781
    if (!timer_head)
782
        return 0;
783
    return (timer_head->expire_time <= current_time);
784
}
785

    
786
static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
787
{
788
    QEMUTimer *ts;
789
    
790
    for(;;) {
791
        ts = *ptimer_head;
792
        if (!ts || ts->expire_time > current_time)
793
            break;
794
        /* remove timer from the list before calling the callback */
795
        *ptimer_head = ts->next;
796
        ts->next = NULL;
797
        
798
        /* run the callback (the timer list can be modified) */
799
        ts->cb(ts->opaque);
800
    }
801
}
802

    
803
int64_t qemu_get_clock(QEMUClock *clock)
804
{
805
    switch(clock->type) {
806
    case QEMU_TIMER_REALTIME:
807
#ifdef _WIN32
808
        return GetTickCount();
809
#else
810
        {
811
            struct tms tp;
812

    
813
            /* Note that using gettimeofday() is not a good solution
814
               for timers because its value change when the date is
815
               modified. */
816
            if (timer_freq == 100) {
817
                return times(&tp) * 10;
818
            } else {
819
                return ((int64_t)times(&tp) * 1000) / timer_freq;
820
            }
821
        }
822
#endif
823
    default:
824
    case QEMU_TIMER_VIRTUAL:
825
        return cpu_get_ticks();
826
    }
827
}
828

    
829
/* save a timer */
830
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
831
{
832
    uint64_t expire_time;
833

    
834
    if (qemu_timer_pending(ts)) {
835
        expire_time = ts->expire_time;
836
    } else {
837
        expire_time = -1;
838
    }
839
    qemu_put_be64(f, expire_time);
840
}
841

    
842
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
843
{
844
    uint64_t expire_time;
845

    
846
    expire_time = qemu_get_be64(f);
847
    if (expire_time != -1) {
848
        qemu_mod_timer(ts, expire_time);
849
    } else {
850
        qemu_del_timer(ts);
851
    }
852
}
853

    
854
static void timer_save(QEMUFile *f, void *opaque)
855
{
856
    if (cpu_ticks_enabled) {
857
        hw_error("cannot save state if virtual timers are running");
858
    }
859
    qemu_put_be64s(f, &cpu_ticks_offset);
860
    qemu_put_be64s(f, &ticks_per_sec);
861
}
862

    
863
static int timer_load(QEMUFile *f, void *opaque, int version_id)
864
{
865
    if (version_id != 1)
866
        return -EINVAL;
867
    if (cpu_ticks_enabled) {
868
        return -EINVAL;
869
    }
870
    qemu_get_be64s(f, &cpu_ticks_offset);
871
    qemu_get_be64s(f, &ticks_per_sec);
872
    return 0;
873
}
874

    
875
#ifdef _WIN32
876
void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg, 
877
                                 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
878
#else
879
static void host_alarm_handler(int host_signum)
880
#endif
881
{
882
#if 0
883
#define DISP_FREQ 1000
884
    {
885
        static int64_t delta_min = INT64_MAX;
886
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
887
        static int count;
888
        ti = qemu_get_clock(vm_clock);
889
        if (last_clock != 0) {
890
            delta = ti - last_clock;
891
            if (delta < delta_min)
892
                delta_min = delta;
893
            if (delta > delta_max)
894
                delta_max = delta;
895
            delta_cum += delta;
896
            if (++count == DISP_FREQ) {
897
                printf("timer: min=%lld us max=%lld us avg=%lld us avg_freq=%0.3f Hz\n",
898
                       muldiv64(delta_min, 1000000, ticks_per_sec),
899
                       muldiv64(delta_max, 1000000, ticks_per_sec),
900
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
901
                       (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
902
                count = 0;
903
                delta_min = INT64_MAX;
904
                delta_max = 0;
905
                delta_cum = 0;
906
            }
907
        }
908
        last_clock = ti;
909
    }
910
#endif
911
    if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
912
                           qemu_get_clock(vm_clock)) ||
913
        qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
914
                           qemu_get_clock(rt_clock))) {
915
        CPUState *env = cpu_single_env;
916
        if (env) {
917
            /* stop the currently executing cpu because a timer occured */
918
            cpu_interrupt(env, CPU_INTERRUPT_EXIT);
919
#ifdef USE_KQEMU
920
            if (env->kqemu_enabled) {
921
                kqemu_cpu_interrupt(env);
922
            }
923
#endif
924
        }
925
    }
926
}
927

    
928
#ifndef _WIN32
929

    
930
#if defined(__linux__)
931

    
932
#define RTC_FREQ 1024
933

    
934
static int rtc_fd;
935

    
936
static int start_rtc_timer(void)
937
{
938
    rtc_fd = open("/dev/rtc", O_RDONLY);
939
    if (rtc_fd < 0)
940
        return -1;
941
    if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
942
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
943
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
944
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
945
        goto fail;
946
    }
947
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
948
    fail:
949
        close(rtc_fd);
950
        return -1;
951
    }
952
    pit_min_timer_count = PIT_FREQ / RTC_FREQ;
953
    return 0;
954
}
955

    
956
#else
957

    
958
static int start_rtc_timer(void)
959
{
960
    return -1;
961
}
962

    
963
#endif /* !defined(__linux__) */
964

    
965
#endif /* !defined(_WIN32) */
966

    
967
static void init_timers(void)
968
{
969
    rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
970
    vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
971

    
972
#ifdef _WIN32
973
    {
974
        int count=0;
975
        timerID = timeSetEvent(1,     // interval (ms)
976
                               0,     // resolution
977
                               host_alarm_handler, // function
978
                               (DWORD)&count,  // user parameter
979
                               TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
980
         if( !timerID ) {
981
            perror("failed timer alarm");
982
            exit(1);
983
         }
984
    }
985
    pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
986
#else
987
    {
988
        struct sigaction act;
989
        struct itimerval itv;
990
        
991
        /* get times() syscall frequency */
992
        timer_freq = sysconf(_SC_CLK_TCK);
993
        
994
        /* timer signal */
995
        sigfillset(&act.sa_mask);
996
       act.sa_flags = 0;
997
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
998
        act.sa_flags |= SA_ONSTACK;
999
#endif
1000
        act.sa_handler = host_alarm_handler;
1001
        sigaction(SIGALRM, &act, NULL);
1002

    
1003
        itv.it_interval.tv_sec = 0;
1004
        itv.it_interval.tv_usec = 999; /* for i386 kernel 2.6 to get 1 ms */
1005
        itv.it_value.tv_sec = 0;
1006
        itv.it_value.tv_usec = 10 * 1000;
1007
        setitimer(ITIMER_REAL, &itv, NULL);
1008
        /* we probe the tick duration of the kernel to inform the user if
1009
           the emulated kernel requested a too high timer frequency */
1010
        getitimer(ITIMER_REAL, &itv);
1011

    
1012
#if defined(__linux__)
1013
        if (itv.it_interval.tv_usec > 1000) {
1014
            /* try to use /dev/rtc to have a faster timer */
1015
            if (start_rtc_timer() < 0)
1016
                goto use_itimer;
1017
            /* disable itimer */
1018
            itv.it_interval.tv_sec = 0;
1019
            itv.it_interval.tv_usec = 0;
1020
            itv.it_value.tv_sec = 0;
1021
            itv.it_value.tv_usec = 0;
1022
            setitimer(ITIMER_REAL, &itv, NULL);
1023

    
1024
            /* use the RTC */
1025
            sigaction(SIGIO, &act, NULL);
1026
            fcntl(rtc_fd, F_SETFL, O_ASYNC);
1027
            fcntl(rtc_fd, F_SETOWN, getpid());
1028
        } else 
1029
#endif /* defined(__linux__) */
1030
        {
1031
        use_itimer:
1032
            pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * 
1033
                                   PIT_FREQ) / 1000000;
1034
        }
1035
    }
1036
#endif
1037
}
1038

    
1039
void quit_timers(void)
1040
{
1041
#ifdef _WIN32
1042
    timeKillEvent(timerID);
1043
#endif
1044
}
1045

    
1046
/***********************************************************/
1047
/* character device */
1048

    
1049
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
1050
{
1051
    return s->chr_write(s, buf, len);
1052
}
1053

    
1054
int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg)
1055
{
1056
    if (!s->chr_ioctl)
1057
        return -ENOTSUP;
1058
    return s->chr_ioctl(s, cmd, arg);
1059
}
1060

    
1061
void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
1062
{
1063
    char buf[4096];
1064
    va_list ap;
1065
    va_start(ap, fmt);
1066
    vsnprintf(buf, sizeof(buf), fmt, ap);
1067
    qemu_chr_write(s, buf, strlen(buf));
1068
    va_end(ap);
1069
}
1070

    
1071
void qemu_chr_send_event(CharDriverState *s, int event)
1072
{
1073
    if (s->chr_send_event)
1074
        s->chr_send_event(s, event);
1075
}
1076

    
1077
void qemu_chr_add_read_handler(CharDriverState *s, 
1078
                               IOCanRWHandler *fd_can_read, 
1079
                               IOReadHandler *fd_read, void *opaque)
1080
{
1081
    s->chr_add_read_handler(s, fd_can_read, fd_read, opaque);
1082
}
1083
             
1084
void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event)
1085
{
1086
    s->chr_event = chr_event;
1087
}
1088

    
1089
static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1090
{
1091
    return len;
1092
}
1093

    
1094
static void null_chr_add_read_handler(CharDriverState *chr, 
1095
                                    IOCanRWHandler *fd_can_read, 
1096
                                    IOReadHandler *fd_read, void *opaque)
1097
{
1098
}
1099

    
1100
CharDriverState *qemu_chr_open_null(void)
1101
{
1102
    CharDriverState *chr;
1103

    
1104
    chr = qemu_mallocz(sizeof(CharDriverState));
1105
    if (!chr)
1106
        return NULL;
1107
    chr->chr_write = null_chr_write;
1108
    chr->chr_add_read_handler = null_chr_add_read_handler;
1109
    return chr;
1110
}
1111

    
1112
#ifdef _WIN32
1113

    
1114
#define socket_error() WSAGetLastError()
1115
#undef EINTR
1116
#define EWOULDBLOCK WSAEWOULDBLOCK
1117
#define EINTR       WSAEINTR
1118
#define EINPROGRESS WSAEINPROGRESS
1119

    
1120
static void socket_cleanup(void)
1121
{
1122
    WSACleanup();
1123
}
1124

    
1125
static int socket_init(void)
1126
{
1127
    WSADATA Data;
1128
    int ret, err;
1129

    
1130
    ret = WSAStartup(MAKEWORD(2,2), &Data);
1131
    if (ret != 0) {
1132
        err = WSAGetLastError();
1133
        fprintf(stderr, "WSAStartup: %d\n", err);
1134
        return -1;
1135
    }
1136
    atexit(socket_cleanup);
1137
    return 0;
1138
}
1139

    
1140
static int send_all(int fd, const uint8_t *buf, int len1)
1141
{
1142
    int ret, len;
1143
    
1144
    len = len1;
1145
    while (len > 0) {
1146
        ret = send(fd, buf, len, 0);
1147
        if (ret < 0) {
1148
            int errno;
1149
            errno = WSAGetLastError();
1150
            if (errno != WSAEWOULDBLOCK) {
1151
                return -1;
1152
            }
1153
        } else if (ret == 0) {
1154
            break;
1155
        } else {
1156
            buf += ret;
1157
            len -= ret;
1158
        }
1159
    }
1160
    return len1 - len;
1161
}
1162

    
1163
void socket_set_nonblock(int fd)
1164
{
1165
    unsigned long opt = 1;
1166
    ioctlsocket(fd, FIONBIO, &opt);
1167
}
1168

    
1169
#else
1170

    
1171
#define socket_error() errno
1172
#define closesocket(s) close(s)
1173

    
1174
static int unix_write(int fd, const uint8_t *buf, int len1)
1175
{
1176
    int ret, len;
1177

    
1178
    len = len1;
1179
    while (len > 0) {
1180
        ret = write(fd, buf, len);
1181
        if (ret < 0) {
1182
            if (errno != EINTR && errno != EAGAIN)
1183
                return -1;
1184
        } else if (ret == 0) {
1185
            break;
1186
        } else {
1187
            buf += ret;
1188
            len -= ret;
1189
        }
1190
    }
1191
    return len1 - len;
1192
}
1193

    
1194
static inline int send_all(int fd, const uint8_t *buf, int len1)
1195
{
1196
    return unix_write(fd, buf, len1);
1197
}
1198

    
1199
void socket_set_nonblock(int fd)
1200
{
1201
    fcntl(fd, F_SETFL, O_NONBLOCK);
1202
}
1203
#endif /* !_WIN32 */
1204

    
1205
#ifndef _WIN32
1206

    
1207
typedef struct {
1208
    int fd_in, fd_out;
1209
    IOCanRWHandler *fd_can_read; 
1210
    IOReadHandler *fd_read;
1211
    void *fd_opaque;
1212
    int max_size;
1213
} FDCharDriver;
1214

    
1215
#define STDIO_MAX_CLIENTS 2
1216

    
1217
static int stdio_nb_clients;
1218
static CharDriverState *stdio_clients[STDIO_MAX_CLIENTS];
1219

    
1220
static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1221
{
1222
    FDCharDriver *s = chr->opaque;
1223
    return unix_write(s->fd_out, buf, len);
1224
}
1225

    
1226
static int fd_chr_read_poll(void *opaque)
1227
{
1228
    CharDriverState *chr = opaque;
1229
    FDCharDriver *s = chr->opaque;
1230

    
1231
    s->max_size = s->fd_can_read(s->fd_opaque);
1232
    return s->max_size;
1233
}
1234

    
1235
static void fd_chr_read(void *opaque)
1236
{
1237
    CharDriverState *chr = opaque;
1238
    FDCharDriver *s = chr->opaque;
1239
    int size, len;
1240
    uint8_t buf[1024];
1241
    
1242
    len = sizeof(buf);
1243
    if (len > s->max_size)
1244
        len = s->max_size;
1245
    if (len == 0)
1246
        return;
1247
    size = read(s->fd_in, buf, len);
1248
    if (size > 0) {
1249
        s->fd_read(s->fd_opaque, buf, size);
1250
    }
1251
}
1252

    
1253
static void fd_chr_add_read_handler(CharDriverState *chr, 
1254
                                    IOCanRWHandler *fd_can_read, 
1255
                                    IOReadHandler *fd_read, void *opaque)
1256
{
1257
    FDCharDriver *s = chr->opaque;
1258

    
1259
    if (s->fd_in >= 0) {
1260
        s->fd_can_read = fd_can_read;
1261
        s->fd_read = fd_read;
1262
        s->fd_opaque = opaque;
1263
        if (nographic && s->fd_in == 0) {
1264
        } else {
1265
            qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll, 
1266
                                 fd_chr_read, NULL, chr);
1267
        }
1268
    }
1269
}
1270

    
1271
/* open a character device to a unix fd */
1272
CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1273
{
1274
    CharDriverState *chr;
1275
    FDCharDriver *s;
1276

    
1277
    chr = qemu_mallocz(sizeof(CharDriverState));
1278
    if (!chr)
1279
        return NULL;
1280
    s = qemu_mallocz(sizeof(FDCharDriver));
1281
    if (!s) {
1282
        free(chr);
1283
        return NULL;
1284
    }
1285
    s->fd_in = fd_in;
1286
    s->fd_out = fd_out;
1287
    chr->opaque = s;
1288
    chr->chr_write = fd_chr_write;
1289
    chr->chr_add_read_handler = fd_chr_add_read_handler;
1290
    return chr;
1291
}
1292

    
1293
CharDriverState *qemu_chr_open_file_out(const char *file_out)
1294
{
1295
    int fd_out;
1296

    
1297
    fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666);
1298
    if (fd_out < 0)
1299
        return NULL;
1300
    return qemu_chr_open_fd(-1, fd_out);
1301
}
1302

    
1303
CharDriverState *qemu_chr_open_pipe(const char *filename)
1304
{
1305
    int fd;
1306

    
1307
    fd = open(filename, O_RDWR | O_BINARY);
1308
    if (fd < 0)
1309
        return NULL;
1310
    return qemu_chr_open_fd(fd, fd);
1311
}
1312

    
1313

    
1314
/* for STDIO, we handle the case where several clients use it
1315
   (nographic mode) */
1316

    
1317
#define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
1318

    
1319
#define TERM_FIFO_MAX_SIZE 1
1320

    
1321
static int term_got_escape, client_index;
1322
static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
1323
int term_fifo_size;
1324

    
1325
void term_print_help(void)
1326
{
1327
    printf("\n"
1328
           "C-a h    print this help\n"
1329
           "C-a x    exit emulator\n"
1330
           "C-a s    save disk data back to file (if -snapshot)\n"
1331
           "C-a b    send break (magic sysrq)\n"
1332
           "C-a c    switch between console and monitor\n"
1333
           "C-a C-a  send C-a\n"
1334
           );
1335
}
1336

    
1337
/* called when a char is received */
1338
static void stdio_received_byte(int ch)
1339
{
1340
    if (term_got_escape) {
1341
        term_got_escape = 0;
1342
        switch(ch) {
1343
        case 'h':
1344
            term_print_help();
1345
            break;
1346
        case 'x':
1347
            exit(0);
1348
            break;
1349
        case 's': 
1350
            {
1351
                int i;
1352
                for (i = 0; i < MAX_DISKS; i++) {
1353
                    if (bs_table[i])
1354
                        bdrv_commit(bs_table[i]);
1355
                }
1356
            }
1357
            break;
1358
        case 'b':
1359
            if (client_index < stdio_nb_clients) {
1360
                CharDriverState *chr;
1361
                FDCharDriver *s;
1362

    
1363
                chr = stdio_clients[client_index];
1364
                s = chr->opaque;
1365
                chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK);
1366
            }
1367
            break;
1368
        case 'c':
1369
            client_index++;
1370
            if (client_index >= stdio_nb_clients)
1371
                client_index = 0;
1372
            if (client_index == 0) {
1373
                /* send a new line in the monitor to get the prompt */
1374
                ch = '\r';
1375
                goto send_char;
1376
            }
1377
            break;
1378
        case TERM_ESCAPE:
1379
            goto send_char;
1380
        }
1381
    } else if (ch == TERM_ESCAPE) {
1382
        term_got_escape = 1;
1383
    } else {
1384
    send_char:
1385
        if (client_index < stdio_nb_clients) {
1386
            uint8_t buf[1];
1387
            CharDriverState *chr;
1388
            FDCharDriver *s;
1389
            
1390
            chr = stdio_clients[client_index];
1391
            s = chr->opaque;
1392
            if (s->fd_can_read(s->fd_opaque) > 0) {
1393
                buf[0] = ch;
1394
                s->fd_read(s->fd_opaque, buf, 1);
1395
            } else if (term_fifo_size == 0) {
1396
                term_fifo[term_fifo_size++] = ch;
1397
            }
1398
        }
1399
    }
1400
}
1401

    
1402
static int stdio_read_poll(void *opaque)
1403
{
1404
    CharDriverState *chr;
1405
    FDCharDriver *s;
1406

    
1407
    if (client_index < stdio_nb_clients) {
1408
        chr = stdio_clients[client_index];
1409
        s = chr->opaque;
1410
        /* try to flush the queue if needed */
1411
        if (term_fifo_size != 0 && s->fd_can_read(s->fd_opaque) > 0) {
1412
            s->fd_read(s->fd_opaque, term_fifo, 1);
1413
            term_fifo_size = 0;
1414
        }
1415
        /* see if we can absorb more chars */
1416
        if (term_fifo_size == 0)
1417
            return 1;
1418
        else
1419
            return 0;
1420
    } else {
1421
        return 1;
1422
    }
1423
}
1424

    
1425
static void stdio_read(void *opaque)
1426
{
1427
    int size;
1428
    uint8_t buf[1];
1429
    
1430
    size = read(0, buf, 1);
1431
    if (size > 0)
1432
        stdio_received_byte(buf[0]);
1433
}
1434

    
1435
/* init terminal so that we can grab keys */
1436
static struct termios oldtty;
1437
static int old_fd0_flags;
1438

    
1439
static void term_exit(void)
1440
{
1441
    tcsetattr (0, TCSANOW, &oldtty);
1442
    fcntl(0, F_SETFL, old_fd0_flags);
1443
}
1444

    
1445
static void term_init(void)
1446
{
1447
    struct termios tty;
1448

    
1449
    tcgetattr (0, &tty);
1450
    oldtty = tty;
1451
    old_fd0_flags = fcntl(0, F_GETFL);
1452

    
1453
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1454
                          |INLCR|IGNCR|ICRNL|IXON);
1455
    tty.c_oflag |= OPOST;
1456
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1457
    /* if graphical mode, we allow Ctrl-C handling */
1458
    if (nographic)
1459
        tty.c_lflag &= ~ISIG;
1460
    tty.c_cflag &= ~(CSIZE|PARENB);
1461
    tty.c_cflag |= CS8;
1462
    tty.c_cc[VMIN] = 1;
1463
    tty.c_cc[VTIME] = 0;
1464
    
1465
    tcsetattr (0, TCSANOW, &tty);
1466

    
1467
    atexit(term_exit);
1468

    
1469
    fcntl(0, F_SETFL, O_NONBLOCK);
1470
}
1471

    
1472
CharDriverState *qemu_chr_open_stdio(void)
1473
{
1474
    CharDriverState *chr;
1475

    
1476
    if (nographic) {
1477
        if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1478
            return NULL;
1479
        chr = qemu_chr_open_fd(0, 1);
1480
        if (stdio_nb_clients == 0)
1481
            qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, NULL);
1482
        client_index = stdio_nb_clients;
1483
    } else {
1484
        if (stdio_nb_clients != 0)
1485
            return NULL;
1486
        chr = qemu_chr_open_fd(0, 1);
1487
    }
1488
    stdio_clients[stdio_nb_clients++] = chr;
1489
    if (stdio_nb_clients == 1) {
1490
        /* set the terminal in raw mode */
1491
        term_init();
1492
    }
1493
    return chr;
1494
}
1495

    
1496
#if defined(__linux__)
1497
CharDriverState *qemu_chr_open_pty(void)
1498
{
1499
    struct termios tty;
1500
    char slave_name[1024];
1501
    int master_fd, slave_fd;
1502
    
1503
    /* Not satisfying */
1504
    if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
1505
        return NULL;
1506
    }
1507
    
1508
    /* Disabling local echo and line-buffered output */
1509
    tcgetattr (master_fd, &tty);
1510
    tty.c_lflag &= ~(ECHO|ICANON|ISIG);
1511
    tty.c_cc[VMIN] = 1;
1512
    tty.c_cc[VTIME] = 0;
1513
    tcsetattr (master_fd, TCSAFLUSH, &tty);
1514

    
1515
    fprintf(stderr, "char device redirected to %s\n", slave_name);
1516
    return qemu_chr_open_fd(master_fd, master_fd);
1517
}
1518

    
1519
static void tty_serial_init(int fd, int speed, 
1520
                            int parity, int data_bits, int stop_bits)
1521
{
1522
    struct termios tty;
1523
    speed_t spd;
1524

    
1525
#if 0
1526
    printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n", 
1527
           speed, parity, data_bits, stop_bits);
1528
#endif
1529
    tcgetattr (fd, &tty);
1530

    
1531
    switch(speed) {
1532
    case 50:
1533
        spd = B50;
1534
        break;
1535
    case 75:
1536
        spd = B75;
1537
        break;
1538
    case 300:
1539
        spd = B300;
1540
        break;
1541
    case 600:
1542
        spd = B600;
1543
        break;
1544
    case 1200:
1545
        spd = B1200;
1546
        break;
1547
    case 2400:
1548
        spd = B2400;
1549
        break;
1550
    case 4800:
1551
        spd = B4800;
1552
        break;
1553
    case 9600:
1554
        spd = B9600;
1555
        break;
1556
    case 19200:
1557
        spd = B19200;
1558
        break;
1559
    case 38400:
1560
        spd = B38400;
1561
        break;
1562
    case 57600:
1563
        spd = B57600;
1564
        break;
1565
    default:
1566
    case 115200:
1567
        spd = B115200;
1568
        break;
1569
    }
1570

    
1571
    cfsetispeed(&tty, spd);
1572
    cfsetospeed(&tty, spd);
1573

    
1574
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1575
                          |INLCR|IGNCR|ICRNL|IXON);
1576
    tty.c_oflag |= OPOST;
1577
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
1578
    tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS);
1579
    switch(data_bits) {
1580
    default:
1581
    case 8:
1582
        tty.c_cflag |= CS8;
1583
        break;
1584
    case 7:
1585
        tty.c_cflag |= CS7;
1586
        break;
1587
    case 6:
1588
        tty.c_cflag |= CS6;
1589
        break;
1590
    case 5:
1591
        tty.c_cflag |= CS5;
1592
        break;
1593
    }
1594
    switch(parity) {
1595
    default:
1596
    case 'N':
1597
        break;
1598
    case 'E':
1599
        tty.c_cflag |= PARENB;
1600
        break;
1601
    case 'O':
1602
        tty.c_cflag |= PARENB | PARODD;
1603
        break;
1604
    }
1605
    
1606
    tcsetattr (fd, TCSANOW, &tty);
1607
}
1608

    
1609
static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
1610
{
1611
    FDCharDriver *s = chr->opaque;
1612
    
1613
    switch(cmd) {
1614
    case CHR_IOCTL_SERIAL_SET_PARAMS:
1615
        {
1616
            QEMUSerialSetParams *ssp = arg;
1617
            tty_serial_init(s->fd_in, ssp->speed, ssp->parity, 
1618
                            ssp->data_bits, ssp->stop_bits);
1619
        }
1620
        break;
1621
    case CHR_IOCTL_SERIAL_SET_BREAK:
1622
        {
1623
            int enable = *(int *)arg;
1624
            if (enable)
1625
                tcsendbreak(s->fd_in, 1);
1626
        }
1627
        break;
1628
    default:
1629
        return -ENOTSUP;
1630
    }
1631
    return 0;
1632
}
1633

    
1634
CharDriverState *qemu_chr_open_tty(const char *filename)
1635
{
1636
    CharDriverState *chr;
1637
    int fd;
1638

    
1639
    fd = open(filename, O_RDWR | O_NONBLOCK);
1640
    if (fd < 0)
1641
        return NULL;
1642
    fcntl(fd, F_SETFL, O_NONBLOCK);
1643
    tty_serial_init(fd, 115200, 'N', 8, 1);
1644
    chr = qemu_chr_open_fd(fd, fd);
1645
    if (!chr)
1646
        return NULL;
1647
    chr->chr_ioctl = tty_serial_ioctl;
1648
    return chr;
1649
}
1650

    
1651
static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
1652
{
1653
    int fd = (int)chr->opaque;
1654
    uint8_t b;
1655

    
1656
    switch(cmd) {
1657
    case CHR_IOCTL_PP_READ_DATA:
1658
        if (ioctl(fd, PPRDATA, &b) < 0)
1659
            return -ENOTSUP;
1660
        *(uint8_t *)arg = b;
1661
        break;
1662
    case CHR_IOCTL_PP_WRITE_DATA:
1663
        b = *(uint8_t *)arg;
1664
        if (ioctl(fd, PPWDATA, &b) < 0)
1665
            return -ENOTSUP;
1666
        break;
1667
    case CHR_IOCTL_PP_READ_CONTROL:
1668
        if (ioctl(fd, PPRCONTROL, &b) < 0)
1669
            return -ENOTSUP;
1670
        *(uint8_t *)arg = b;
1671
        break;
1672
    case CHR_IOCTL_PP_WRITE_CONTROL:
1673
        b = *(uint8_t *)arg;
1674
        if (ioctl(fd, PPWCONTROL, &b) < 0)
1675
            return -ENOTSUP;
1676
        break;
1677
    case CHR_IOCTL_PP_READ_STATUS:
1678
        if (ioctl(fd, PPRSTATUS, &b) < 0)
1679
            return -ENOTSUP;
1680
        *(uint8_t *)arg = b;
1681
        break;
1682
    default:
1683
        return -ENOTSUP;
1684
    }
1685
    return 0;
1686
}
1687

    
1688
CharDriverState *qemu_chr_open_pp(const char *filename)
1689
{
1690
    CharDriverState *chr;
1691
    int fd;
1692

    
1693
    fd = open(filename, O_RDWR);
1694
    if (fd < 0)
1695
        return NULL;
1696

    
1697
    if (ioctl(fd, PPCLAIM) < 0) {
1698
        close(fd);
1699
        return NULL;
1700
    }
1701

    
1702
    chr = qemu_mallocz(sizeof(CharDriverState));
1703
    if (!chr) {
1704
        close(fd);
1705
        return NULL;
1706
    }
1707
    chr->opaque = (void *)fd;
1708
    chr->chr_write = null_chr_write;
1709
    chr->chr_add_read_handler = null_chr_add_read_handler;
1710
    chr->chr_ioctl = pp_ioctl;
1711
    return chr;
1712
}
1713

    
1714
#else
1715
CharDriverState *qemu_chr_open_pty(void)
1716
{
1717
    return NULL;
1718
}
1719
#endif
1720

    
1721
#endif /* !defined(_WIN32) */
1722

    
1723
#ifdef _WIN32
1724
typedef struct {
1725
    IOCanRWHandler *fd_can_read; 
1726
    IOReadHandler *fd_read;
1727
    void *win_opaque;
1728
    int max_size;
1729
    HANDLE hcom, hrecv, hsend;
1730
    OVERLAPPED orecv, osend;
1731
    BOOL fpipe;
1732
    DWORD len;
1733
} WinCharState;
1734

    
1735
#define NSENDBUF 2048
1736
#define NRECVBUF 2048
1737
#define MAXCONNECT 1
1738
#define NTIMEOUT 5000
1739

    
1740
static int win_chr_poll(void *opaque);
1741
static int win_chr_pipe_poll(void *opaque);
1742

    
1743
static void win_chr_close2(WinCharState *s)
1744
{
1745
    if (s->hsend) {
1746
        CloseHandle(s->hsend);
1747
        s->hsend = NULL;
1748
    }
1749
    if (s->hrecv) {
1750
        CloseHandle(s->hrecv);
1751
        s->hrecv = NULL;
1752
    }
1753
    if (s->hcom) {
1754
        CloseHandle(s->hcom);
1755
        s->hcom = NULL;
1756
    }
1757
    if (s->fpipe)
1758
        qemu_del_polling_cb(win_chr_pipe_poll, s);
1759
    else
1760
        qemu_del_polling_cb(win_chr_poll, s);
1761
}
1762

    
1763
static void win_chr_close(CharDriverState *chr)
1764
{
1765
    WinCharState *s = chr->opaque;
1766
    win_chr_close2(s);
1767
}
1768

    
1769
static int win_chr_init(WinCharState *s, const char *filename)
1770
{
1771
    COMMCONFIG comcfg;
1772
    COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
1773
    COMSTAT comstat;
1774
    DWORD size;
1775
    DWORD err;
1776
    
1777
    s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
1778
    if (!s->hsend) {
1779
        fprintf(stderr, "Failed CreateEvent\n");
1780
        goto fail;
1781
    }
1782
    s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
1783
    if (!s->hrecv) {
1784
        fprintf(stderr, "Failed CreateEvent\n");
1785
        goto fail;
1786
    }
1787

    
1788
    s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
1789
                      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
1790
    if (s->hcom == INVALID_HANDLE_VALUE) {
1791
        fprintf(stderr, "Failed CreateFile (%lu)\n", GetLastError());
1792
        s->hcom = NULL;
1793
        goto fail;
1794
    }
1795
    
1796
    if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
1797
        fprintf(stderr, "Failed SetupComm\n");
1798
        goto fail;
1799
    }
1800
    
1801
    ZeroMemory(&comcfg, sizeof(COMMCONFIG));
1802
    size = sizeof(COMMCONFIG);
1803
    GetDefaultCommConfig(filename, &comcfg, &size);
1804
    comcfg.dcb.DCBlength = sizeof(DCB);
1805
    CommConfigDialog(filename, NULL, &comcfg);
1806

    
1807
    if (!SetCommState(s->hcom, &comcfg.dcb)) {
1808
        fprintf(stderr, "Failed SetCommState\n");
1809
        goto fail;
1810
    }
1811

    
1812
    if (!SetCommMask(s->hcom, EV_ERR)) {
1813
        fprintf(stderr, "Failed SetCommMask\n");
1814
        goto fail;
1815
    }
1816

    
1817
    cto.ReadIntervalTimeout = MAXDWORD;
1818
    if (!SetCommTimeouts(s->hcom, &cto)) {
1819
        fprintf(stderr, "Failed SetCommTimeouts\n");
1820
        goto fail;
1821
    }
1822
    
1823
    if (!ClearCommError(s->hcom, &err, &comstat)) {
1824
        fprintf(stderr, "Failed ClearCommError\n");
1825
        goto fail;
1826
    }
1827
    qemu_add_polling_cb(win_chr_poll, s);
1828
    return 0;
1829

    
1830
 fail:
1831
    win_chr_close2(s);
1832
    return -1;
1833
}
1834

    
1835
static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
1836
{
1837
    WinCharState *s = chr->opaque;
1838
    DWORD len, ret, size, err;
1839

    
1840
    len = len1;
1841
    ZeroMemory(&s->osend, sizeof(s->osend));
1842
    s->osend.hEvent = s->hsend;
1843
    while (len > 0) {
1844
        if (s->hsend)
1845
            ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
1846
        else
1847
            ret = WriteFile(s->hcom, buf, len, &size, NULL);
1848
        if (!ret) {
1849
            err = GetLastError();
1850
            if (err == ERROR_IO_PENDING) {
1851
                ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
1852
                if (ret) {
1853
                    buf += size;
1854
                    len -= size;
1855
                } else {
1856
                    break;
1857
                }
1858
            } else {
1859
                break;
1860
            }
1861
        } else {
1862
            buf += size;
1863
            len -= size;
1864
        }
1865
    }
1866
    return len1 - len;
1867
}
1868

    
1869
static int win_chr_read_poll(WinCharState *s)
1870
{
1871
    s->max_size = s->fd_can_read(s->win_opaque);
1872
    return s->max_size;
1873
}
1874
            
1875
static void win_chr_readfile(WinCharState *s)
1876
{
1877
    int ret, err;
1878
    uint8_t buf[1024];
1879
    DWORD size;
1880
    
1881
    ZeroMemory(&s->orecv, sizeof(s->orecv));
1882
    s->orecv.hEvent = s->hrecv;
1883
    ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
1884
    if (!ret) {
1885
        err = GetLastError();
1886
        if (err == ERROR_IO_PENDING) {
1887
            ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
1888
        }
1889
    }
1890

    
1891
    if (size > 0) {
1892
        s->fd_read(s->win_opaque, buf, size);
1893
    }
1894
}
1895

    
1896
static void win_chr_read(WinCharState *s)
1897
{
1898
    if (s->len > s->max_size)
1899
        s->len = s->max_size;
1900
    if (s->len == 0)
1901
        return;
1902
    
1903
    win_chr_readfile(s);
1904
}
1905

    
1906
static int win_chr_poll(void *opaque)
1907
{
1908
    WinCharState *s = opaque;
1909
    COMSTAT status;
1910
    DWORD comerr;
1911
    
1912
    ClearCommError(s->hcom, &comerr, &status);
1913
    if (status.cbInQue > 0) {
1914
        s->len = status.cbInQue;
1915
        win_chr_read_poll(s);
1916
        win_chr_read(s);
1917
        return 1;
1918
    }
1919
    return 0;
1920
}
1921

    
1922
static void win_chr_add_read_handler(CharDriverState *chr, 
1923
                                    IOCanRWHandler *fd_can_read, 
1924
                                    IOReadHandler *fd_read, void *opaque)
1925
{
1926
    WinCharState *s = chr->opaque;
1927

    
1928
    s->fd_can_read = fd_can_read;
1929
    s->fd_read = fd_read;
1930
    s->win_opaque = opaque;
1931
}
1932

    
1933
CharDriverState *qemu_chr_open_win(const char *filename)
1934
{
1935
    CharDriverState *chr;
1936
    WinCharState *s;
1937
    
1938
    chr = qemu_mallocz(sizeof(CharDriverState));
1939
    if (!chr)
1940
        return NULL;
1941
    s = qemu_mallocz(sizeof(WinCharState));
1942
    if (!s) {
1943
        free(chr);
1944
        return NULL;
1945
    }
1946
    chr->opaque = s;
1947
    chr->chr_write = win_chr_write;
1948
    chr->chr_add_read_handler = win_chr_add_read_handler;
1949
    chr->chr_close = win_chr_close;
1950

    
1951
    if (win_chr_init(s, filename) < 0) {
1952
        free(s);
1953
        free(chr);
1954
        return NULL;
1955
    }
1956
    return chr;
1957
}
1958

    
1959
static int win_chr_pipe_poll(void *opaque)
1960
{
1961
    WinCharState *s = opaque;
1962
    DWORD size;
1963

    
1964
    PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
1965
    if (size > 0) {
1966
        s->len = size;
1967
        win_chr_read_poll(s);
1968
        win_chr_read(s);
1969
        return 1;
1970
    }
1971
    return 0;
1972
}
1973

    
1974
static int win_chr_pipe_init(WinCharState *s, const char *filename)
1975
{
1976
    OVERLAPPED ov;
1977
    int ret;
1978
    DWORD size;
1979
    char openname[256];
1980
    
1981
    s->fpipe = TRUE;
1982

    
1983
    s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
1984
    if (!s->hsend) {
1985
        fprintf(stderr, "Failed CreateEvent\n");
1986
        goto fail;
1987
    }
1988
    s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
1989
    if (!s->hrecv) {
1990
        fprintf(stderr, "Failed CreateEvent\n");
1991
        goto fail;
1992
    }
1993
    
1994
    snprintf(openname, sizeof(openname), "\\\\.\\pipe\\%s", filename);
1995
    s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
1996
                              PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
1997
                              PIPE_WAIT,
1998
                              MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
1999
    if (s->hcom == INVALID_HANDLE_VALUE) {
2000
        fprintf(stderr, "Failed CreateNamedPipe (%lu)\n", GetLastError());
2001
        s->hcom = NULL;
2002
        goto fail;
2003
    }
2004

    
2005
    ZeroMemory(&ov, sizeof(ov));
2006
    ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
2007
    ret = ConnectNamedPipe(s->hcom, &ov);
2008
    if (ret) {
2009
        fprintf(stderr, "Failed ConnectNamedPipe\n");
2010
        goto fail;
2011
    }
2012

    
2013
    ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
2014
    if (!ret) {
2015
        fprintf(stderr, "Failed GetOverlappedResult\n");
2016
        if (ov.hEvent) {
2017
            CloseHandle(ov.hEvent);
2018
            ov.hEvent = NULL;
2019
        }
2020
        goto fail;
2021
    }
2022

    
2023
    if (ov.hEvent) {
2024
        CloseHandle(ov.hEvent);
2025
        ov.hEvent = NULL;
2026
    }
2027
    qemu_add_polling_cb(win_chr_pipe_poll, s);
2028
    return 0;
2029

    
2030
 fail:
2031
    win_chr_close2(s);
2032
    return -1;
2033
}
2034

    
2035

    
2036
CharDriverState *qemu_chr_open_win_pipe(const char *filename)
2037
{
2038
    CharDriverState *chr;
2039
    WinCharState *s;
2040

    
2041
    chr = qemu_mallocz(sizeof(CharDriverState));
2042
    if (!chr)
2043
        return NULL;
2044
    s = qemu_mallocz(sizeof(WinCharState));
2045
    if (!s) {
2046
        free(chr);
2047
        return NULL;
2048
    }
2049
    chr->opaque = s;
2050
    chr->chr_write = win_chr_write;
2051
    chr->chr_add_read_handler = win_chr_add_read_handler;
2052
    chr->chr_close = win_chr_close;
2053
    
2054
    if (win_chr_pipe_init(s, filename) < 0) {
2055
        free(s);
2056
        free(chr);
2057
        return NULL;
2058
    }
2059
    return chr;
2060
}
2061

    
2062
CharDriverState *qemu_chr_open_win_file(HANDLE fd_out)
2063
{
2064
    CharDriverState *chr;
2065
    WinCharState *s;
2066

    
2067
    chr = qemu_mallocz(sizeof(CharDriverState));
2068
    if (!chr)
2069
        return NULL;
2070
    s = qemu_mallocz(sizeof(WinCharState));
2071
    if (!s) {
2072
        free(chr);
2073
        return NULL;
2074
    }
2075
    s->hcom = fd_out;
2076
    chr->opaque = s;
2077
    chr->chr_write = win_chr_write;
2078
    chr->chr_add_read_handler = win_chr_add_read_handler;
2079
    return chr;
2080
}
2081
    
2082
CharDriverState *qemu_chr_open_win_file_out(const char *file_out)
2083
{
2084
    HANDLE fd_out;
2085
    
2086
    fd_out = CreateFile(file_out, GENERIC_WRITE, FILE_SHARE_READ, NULL,
2087
                        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2088
    if (fd_out == INVALID_HANDLE_VALUE)
2089
        return NULL;
2090

    
2091
    return qemu_chr_open_win_file(fd_out);
2092
}
2093
#endif
2094

    
2095
CharDriverState *qemu_chr_open(const char *filename)
2096
{
2097
    const char *p;
2098

    
2099
    if (!strcmp(filename, "vc")) {
2100
        return text_console_init(&display_state);
2101
    } else if (!strcmp(filename, "null")) {
2102
        return qemu_chr_open_null();
2103
    } else 
2104
#ifndef _WIN32
2105
    if (strstart(filename, "file:", &p)) {
2106
        return qemu_chr_open_file_out(p);
2107
    } else if (strstart(filename, "pipe:", &p)) {
2108
        return qemu_chr_open_pipe(p);
2109
    } else if (!strcmp(filename, "pty")) {
2110
        return qemu_chr_open_pty();
2111
    } else if (!strcmp(filename, "stdio")) {
2112
        return qemu_chr_open_stdio();
2113
    } else 
2114
#endif
2115
#if defined(__linux__)
2116
    if (strstart(filename, "/dev/parport", NULL)) {
2117
        return qemu_chr_open_pp(filename);
2118
    } else 
2119
    if (strstart(filename, "/dev/", NULL)) {
2120
        return qemu_chr_open_tty(filename);
2121
    } else 
2122
#endif
2123
#ifdef _WIN32
2124
    if (strstart(filename, "COM", NULL)) {
2125
        return qemu_chr_open_win(filename);
2126
    } else
2127
    if (strstart(filename, "pipe:", &p)) {
2128
        return qemu_chr_open_win_pipe(p);
2129
    } else
2130
    if (strstart(filename, "file:", &p)) {
2131
        return qemu_chr_open_win_file_out(p);
2132
    }
2133
#endif
2134
    {
2135
        return NULL;
2136
    }
2137
}
2138

    
2139
void qemu_chr_close(CharDriverState *chr)
2140
{
2141
    if (chr->chr_close)
2142
        chr->chr_close(chr);
2143
}
2144

    
2145
/***********************************************************/
2146
/* network device redirectors */
2147

    
2148
void hex_dump(FILE *f, const uint8_t *buf, int size)
2149
{
2150
    int len, i, j, c;
2151

    
2152
    for(i=0;i<size;i+=16) {
2153
        len = size - i;
2154
        if (len > 16)
2155
            len = 16;
2156
        fprintf(f, "%08x ", i);
2157
        for(j=0;j<16;j++) {
2158
            if (j < len)
2159
                fprintf(f, " %02x", buf[i+j]);
2160
            else
2161
                fprintf(f, "   ");
2162
        }
2163
        fprintf(f, " ");
2164
        for(j=0;j<len;j++) {
2165
            c = buf[i+j];
2166
            if (c < ' ' || c > '~')
2167
                c = '.';
2168
            fprintf(f, "%c", c);
2169
        }
2170
        fprintf(f, "\n");
2171
    }
2172
}
2173

    
2174
static int parse_macaddr(uint8_t *macaddr, const char *p)
2175
{
2176
    int i;
2177
    for(i = 0; i < 6; i++) {
2178
        macaddr[i] = strtol(p, (char **)&p, 16);
2179
        if (i == 5) {
2180
            if (*p != '\0') 
2181
                return -1;
2182
        } else {
2183
            if (*p != ':') 
2184
                return -1;
2185
            p++;
2186
        }
2187
    }
2188
    return 0;
2189
}
2190

    
2191
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
2192
{
2193
    const char *p, *p1;
2194
    int len;
2195
    p = *pp;
2196
    p1 = strchr(p, sep);
2197
    if (!p1)
2198
        return -1;
2199
    len = p1 - p;
2200
    p1++;
2201
    if (buf_size > 0) {
2202
        if (len > buf_size - 1)
2203
            len = buf_size - 1;
2204
        memcpy(buf, p, len);
2205
        buf[len] = '\0';
2206
    }
2207
    *pp = p1;
2208
    return 0;
2209
}
2210

    
2211
int parse_host_port(struct sockaddr_in *saddr, const char *str)
2212
{
2213
    char buf[512];
2214
    struct hostent *he;
2215
    const char *p, *r;
2216
    int port;
2217

    
2218
    p = str;
2219
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2220
        return -1;
2221
    saddr->sin_family = AF_INET;
2222
    if (buf[0] == '\0') {
2223
        saddr->sin_addr.s_addr = 0;
2224
    } else {
2225
        if (isdigit(buf[0])) {
2226
            if (!inet_aton(buf, &saddr->sin_addr))
2227
                return -1;
2228
        } else {
2229
            if ((he = gethostbyname(buf)) == NULL)
2230
                return - 1;
2231
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
2232
        }
2233
    }
2234
    port = strtol(p, (char **)&r, 0);
2235
    if (r == p)
2236
        return -1;
2237
    saddr->sin_port = htons(port);
2238
    return 0;
2239
}
2240

    
2241
/* find or alloc a new VLAN */
2242
VLANState *qemu_find_vlan(int id)
2243
{
2244
    VLANState **pvlan, *vlan;
2245
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2246
        if (vlan->id == id)
2247
            return vlan;
2248
    }
2249
    vlan = qemu_mallocz(sizeof(VLANState));
2250
    if (!vlan)
2251
        return NULL;
2252
    vlan->id = id;
2253
    vlan->next = NULL;
2254
    pvlan = &first_vlan;
2255
    while (*pvlan != NULL)
2256
        pvlan = &(*pvlan)->next;
2257
    *pvlan = vlan;
2258
    return vlan;
2259
}
2260

    
2261
VLANClientState *qemu_new_vlan_client(VLANState *vlan,
2262
                                      IOReadHandler *fd_read,
2263
                                      IOCanRWHandler *fd_can_read,
2264
                                      void *opaque)
2265
{
2266
    VLANClientState *vc, **pvc;
2267
    vc = qemu_mallocz(sizeof(VLANClientState));
2268
    if (!vc)
2269
        return NULL;
2270
    vc->fd_read = fd_read;
2271
    vc->fd_can_read = fd_can_read;
2272
    vc->opaque = opaque;
2273
    vc->vlan = vlan;
2274

    
2275
    vc->next = NULL;
2276
    pvc = &vlan->first_client;
2277
    while (*pvc != NULL)
2278
        pvc = &(*pvc)->next;
2279
    *pvc = vc;
2280
    return vc;
2281
}
2282

    
2283
int qemu_can_send_packet(VLANClientState *vc1)
2284
{
2285
    VLANState *vlan = vc1->vlan;
2286
    VLANClientState *vc;
2287

    
2288
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
2289
        if (vc != vc1) {
2290
            if (vc->fd_can_read && !vc->fd_can_read(vc->opaque))
2291
                return 0;
2292
        }
2293
    }
2294
    return 1;
2295
}
2296

    
2297
void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
2298
{
2299
    VLANState *vlan = vc1->vlan;
2300
    VLANClientState *vc;
2301

    
2302
#if 0
2303
    printf("vlan %d send:\n", vlan->id);
2304
    hex_dump(stdout, buf, size);
2305
#endif
2306
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
2307
        if (vc != vc1) {
2308
            vc->fd_read(vc->opaque, buf, size);
2309
        }
2310
    }
2311
}
2312

    
2313
#if defined(CONFIG_SLIRP)
2314

    
2315
/* slirp network adapter */
2316

    
2317
static int slirp_inited;
2318
static VLANClientState *slirp_vc;
2319

    
2320
int slirp_can_output(void)
2321
{
2322
    return !slirp_vc || qemu_can_send_packet(slirp_vc);
2323
}
2324

    
2325
void slirp_output(const uint8_t *pkt, int pkt_len)
2326
{
2327
#if 0
2328
    printf("slirp output:\n");
2329
    hex_dump(stdout, pkt, pkt_len);
2330
#endif
2331
    if (!slirp_vc)
2332
        return;
2333
    qemu_send_packet(slirp_vc, pkt, pkt_len);
2334
}
2335

    
2336
static void slirp_receive(void *opaque, const uint8_t *buf, int size)
2337
{
2338
#if 0
2339
    printf("slirp input:\n");
2340
    hex_dump(stdout, buf, size);
2341
#endif
2342
    slirp_input(buf, size);
2343
}
2344

    
2345
static int net_slirp_init(VLANState *vlan)
2346
{
2347
    if (!slirp_inited) {
2348
        slirp_inited = 1;
2349
        slirp_init();
2350
    }
2351
    slirp_vc = qemu_new_vlan_client(vlan, 
2352
                                    slirp_receive, NULL, NULL);
2353
    snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
2354
    return 0;
2355
}
2356

    
2357
static void net_slirp_redir(const char *redir_str)
2358
{
2359
    int is_udp;
2360
    char buf[256], *r;
2361
    const char *p;
2362
    struct in_addr guest_addr;
2363
    int host_port, guest_port;
2364
    
2365
    if (!slirp_inited) {
2366
        slirp_inited = 1;
2367
        slirp_init();
2368
    }
2369

    
2370
    p = redir_str;
2371
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2372
        goto fail;
2373
    if (!strcmp(buf, "tcp")) {
2374
        is_udp = 0;
2375
    } else if (!strcmp(buf, "udp")) {
2376
        is_udp = 1;
2377
    } else {
2378
        goto fail;
2379
    }
2380

    
2381
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2382
        goto fail;
2383
    host_port = strtol(buf, &r, 0);
2384
    if (r == buf)
2385
        goto fail;
2386

    
2387
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2388
        goto fail;
2389
    if (buf[0] == '\0') {
2390
        pstrcpy(buf, sizeof(buf), "10.0.2.15");
2391
    }
2392
    if (!inet_aton(buf, &guest_addr))
2393
        goto fail;
2394
    
2395
    guest_port = strtol(p, &r, 0);
2396
    if (r == p)
2397
        goto fail;
2398
    
2399
    if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
2400
        fprintf(stderr, "qemu: could not set up redirection\n");
2401
        exit(1);
2402
    }
2403
    return;
2404
 fail:
2405
    fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
2406
    exit(1);
2407
}
2408
    
2409
#ifndef _WIN32
2410

    
2411
char smb_dir[1024];
2412

    
2413
static void smb_exit(void)
2414
{
2415
    DIR *d;
2416
    struct dirent *de;
2417
    char filename[1024];
2418

    
2419
    /* erase all the files in the directory */
2420
    d = opendir(smb_dir);
2421
    for(;;) {
2422
        de = readdir(d);
2423
        if (!de)
2424
            break;
2425
        if (strcmp(de->d_name, ".") != 0 &&
2426
            strcmp(de->d_name, "..") != 0) {
2427
            snprintf(filename, sizeof(filename), "%s/%s", 
2428
                     smb_dir, de->d_name);
2429
            unlink(filename);
2430
        }
2431
    }
2432
    closedir(d);
2433
    rmdir(smb_dir);
2434
}
2435

    
2436
/* automatic user mode samba server configuration */
2437
void net_slirp_smb(const char *exported_dir)
2438
{
2439
    char smb_conf[1024];
2440
    char smb_cmdline[1024];
2441
    FILE *f;
2442

    
2443
    if (!slirp_inited) {
2444
        slirp_inited = 1;
2445
        slirp_init();
2446
    }
2447

    
2448
    /* XXX: better tmp dir construction */
2449
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
2450
    if (mkdir(smb_dir, 0700) < 0) {
2451
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
2452
        exit(1);
2453
    }
2454
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
2455
    
2456
    f = fopen(smb_conf, "w");
2457
    if (!f) {
2458
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
2459
        exit(1);
2460
    }
2461
    fprintf(f, 
2462
            "[global]\n"
2463
            "private dir=%s\n"
2464
            "smb ports=0\n"
2465
            "socket address=127.0.0.1\n"
2466
            "pid directory=%s\n"
2467
            "lock directory=%s\n"
2468
            "log file=%s/log.smbd\n"
2469
            "smb passwd file=%s/smbpasswd\n"
2470
            "security = share\n"
2471
            "[qemu]\n"
2472
            "path=%s\n"
2473
            "read only=no\n"
2474
            "guest ok=yes\n",
2475
            smb_dir,
2476
            smb_dir,
2477
            smb_dir,
2478
            smb_dir,
2479
            smb_dir,
2480
            exported_dir
2481
            );
2482
    fclose(f);
2483
    atexit(smb_exit);
2484

    
2485
    snprintf(smb_cmdline, sizeof(smb_cmdline), "/usr/sbin/smbd -s %s",
2486
             smb_conf);
2487
    
2488
    slirp_add_exec(0, smb_cmdline, 4, 139);
2489
}
2490

    
2491
#endif /* !defined(_WIN32) */
2492

    
2493
#endif /* CONFIG_SLIRP */
2494

    
2495
#if !defined(_WIN32)
2496

    
2497
typedef struct TAPState {
2498
    VLANClientState *vc;
2499
    int fd;
2500
} TAPState;
2501

    
2502
static void tap_receive(void *opaque, const uint8_t *buf, int size)
2503
{
2504
    TAPState *s = opaque;
2505
    int ret;
2506
    for(;;) {
2507
        ret = write(s->fd, buf, size);
2508
        if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
2509
        } else {
2510
            break;
2511
        }
2512
    }
2513
}
2514

    
2515
static void tap_send(void *opaque)
2516
{
2517
    TAPState *s = opaque;
2518
    uint8_t buf[4096];
2519
    int size;
2520

    
2521
    size = read(s->fd, buf, sizeof(buf));
2522
    if (size > 0) {
2523
        qemu_send_packet(s->vc, buf, size);
2524
    }
2525
}
2526

    
2527
/* fd support */
2528

    
2529
static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
2530
{
2531
    TAPState *s;
2532

    
2533
    s = qemu_mallocz(sizeof(TAPState));
2534
    if (!s)
2535
        return NULL;
2536
    s->fd = fd;
2537
    s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
2538
    qemu_set_fd_handler(s->fd, tap_send, NULL, s);
2539
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
2540
    return s;
2541
}
2542

    
2543
#ifdef _BSD
2544
static int tap_open(char *ifname, int ifname_size)
2545
{
2546
    int fd;
2547
    char *dev;
2548
    struct stat s;
2549

    
2550
    fd = open("/dev/tap", O_RDWR);
2551
    if (fd < 0) {
2552
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
2553
        return -1;
2554
    }
2555

    
2556
    fstat(fd, &s);
2557
    dev = devname(s.st_rdev, S_IFCHR);
2558
    pstrcpy(ifname, ifname_size, dev);
2559

    
2560
    fcntl(fd, F_SETFL, O_NONBLOCK);
2561
    return fd;
2562
}
2563
#else
2564
static int tap_open(char *ifname, int ifname_size)
2565
{
2566
    struct ifreq ifr;
2567
    int fd, ret;
2568
    
2569
    fd = open("/dev/net/tun", O_RDWR);
2570
    if (fd < 0) {
2571
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
2572
        return -1;
2573
    }
2574
    memset(&ifr, 0, sizeof(ifr));
2575
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
2576
    if (ifname[0] != '\0')
2577
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
2578
    else
2579
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
2580
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
2581
    if (ret != 0) {
2582
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
2583
        close(fd);
2584
        return -1;
2585
    }
2586
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
2587
    fcntl(fd, F_SETFL, O_NONBLOCK);
2588
    return fd;
2589
}
2590
#endif
2591

    
2592
static int net_tap_init(VLANState *vlan, const char *ifname1,
2593
                        const char *setup_script)
2594
{
2595
    TAPState *s;
2596
    int pid, status, fd;
2597
    char *args[3];
2598
    char **parg;
2599
    char ifname[128];
2600

    
2601
    if (ifname1 != NULL)
2602
        pstrcpy(ifname, sizeof(ifname), ifname1);
2603
    else
2604
        ifname[0] = '\0';
2605
    fd = tap_open(ifname, sizeof(ifname));
2606
    if (fd < 0)
2607
        return -1;
2608

    
2609
    if (!setup_script)
2610
        setup_script = "";
2611
    if (setup_script[0] != '\0') {
2612
        /* try to launch network init script */
2613
        pid = fork();
2614
        if (pid >= 0) {
2615
            if (pid == 0) {
2616
                parg = args;
2617
                *parg++ = (char *)setup_script;
2618
                *parg++ = ifname;
2619
                *parg++ = NULL;
2620
                execv(setup_script, args);
2621
                _exit(1);
2622
            }
2623
            while (waitpid(pid, &status, 0) != pid);
2624
            if (!WIFEXITED(status) ||
2625
                WEXITSTATUS(status) != 0) {
2626
                fprintf(stderr, "%s: could not launch network script\n",
2627
                        setup_script);
2628
                return -1;
2629
            }
2630
        }
2631
    }
2632
    s = net_tap_fd_init(vlan, fd);
2633
    if (!s)
2634
        return -1;
2635
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), 
2636
             "tap: ifname=%s setup_script=%s", ifname, setup_script);
2637
    return 0;
2638
}
2639

    
2640
#endif /* !_WIN32 */
2641

    
2642
/* network connection */
2643
typedef struct NetSocketState {
2644
    VLANClientState *vc;
2645
    int fd;
2646
    int state; /* 0 = getting length, 1 = getting data */
2647
    int index;
2648
    int packet_len;
2649
    uint8_t buf[4096];
2650
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
2651
} NetSocketState;
2652

    
2653
typedef struct NetSocketListenState {
2654
    VLANState *vlan;
2655
    int fd;
2656
} NetSocketListenState;
2657

    
2658
/* XXX: we consider we can send the whole packet without blocking */
2659
static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
2660
{
2661
    NetSocketState *s = opaque;
2662
    uint32_t len;
2663
    len = htonl(size);
2664

    
2665
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
2666
    send_all(s->fd, buf, size);
2667
}
2668

    
2669
static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
2670
{
2671
    NetSocketState *s = opaque;
2672
    sendto(s->fd, buf, size, 0, 
2673
           (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
2674
}
2675

    
2676
static void net_socket_send(void *opaque)
2677
{
2678
    NetSocketState *s = opaque;
2679
    int l, size, err;
2680
    uint8_t buf1[4096];
2681
    const uint8_t *buf;
2682

    
2683
    size = recv(s->fd, buf1, sizeof(buf1), 0);
2684
    if (size < 0) {
2685
        err = socket_error();
2686
        if (err != EWOULDBLOCK) 
2687
            goto eoc;
2688
    } else if (size == 0) {
2689
        /* end of connection */
2690
    eoc:
2691
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2692
        closesocket(s->fd);
2693
        return;
2694
    }
2695
    buf = buf1;
2696
    while (size > 0) {
2697
        /* reassemble a packet from the network */
2698
        switch(s->state) {
2699
        case 0:
2700
            l = 4 - s->index;
2701
            if (l > size)
2702
                l = size;
2703
            memcpy(s->buf + s->index, buf, l);
2704
            buf += l;
2705
            size -= l;
2706
            s->index += l;
2707
            if (s->index == 4) {
2708
                /* got length */
2709
                s->packet_len = ntohl(*(uint32_t *)s->buf);
2710
                s->index = 0;
2711
                s->state = 1;
2712
            }
2713
            break;
2714
        case 1:
2715
            l = s->packet_len - s->index;
2716
            if (l > size)
2717
                l = size;
2718
            memcpy(s->buf + s->index, buf, l);
2719
            s->index += l;
2720
            buf += l;
2721
            size -= l;
2722
            if (s->index >= s->packet_len) {
2723
                qemu_send_packet(s->vc, s->buf, s->packet_len);
2724
                s->index = 0;
2725
                s->state = 0;
2726
            }
2727
            break;
2728
        }
2729
    }
2730
}
2731

    
2732
static void net_socket_send_dgram(void *opaque)
2733
{
2734
    NetSocketState *s = opaque;
2735
    int size;
2736

    
2737
    size = recv(s->fd, s->buf, sizeof(s->buf), 0);
2738
    if (size < 0) 
2739
        return;
2740
    if (size == 0) {
2741
        /* end of connection */
2742
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2743
        return;
2744
    }
2745
    qemu_send_packet(s->vc, s->buf, size);
2746
}
2747

    
2748
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
2749
{
2750
    struct ip_mreq imr;
2751
    int fd;
2752
    int val, ret;
2753
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
2754
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
2755
                inet_ntoa(mcastaddr->sin_addr), 
2756
                (int)ntohl(mcastaddr->sin_addr.s_addr));
2757
        return -1;
2758

    
2759
    }
2760
    fd = socket(PF_INET, SOCK_DGRAM, 0);
2761
    if (fd < 0) {
2762
        perror("socket(PF_INET, SOCK_DGRAM)");
2763
        return -1;
2764
    }
2765

    
2766
    val = 1;
2767
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, 
2768
                   (const char *)&val, sizeof(val));
2769
    if (ret < 0) {
2770
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2771
        goto fail;
2772
    }
2773

    
2774
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2775
    if (ret < 0) {
2776
        perror("bind");
2777
        goto fail;
2778
    }
2779
    
2780
    /* Add host to multicast group */
2781
    imr.imr_multiaddr = mcastaddr->sin_addr;
2782
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
2783

    
2784
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
2785
                     (const char *)&imr, sizeof(struct ip_mreq));
2786
    if (ret < 0) {
2787
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
2788
        goto fail;
2789
    }
2790

    
2791
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2792
    val = 1;
2793
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, 
2794
                   (const char *)&val, sizeof(val));
2795
    if (ret < 0) {
2796
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2797
        goto fail;
2798
    }
2799

    
2800
    socket_set_nonblock(fd);
2801
    return fd;
2802
fail:
2803
    if (fd>=0) close(fd);
2804
    return -1;
2805
}
2806

    
2807
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd, 
2808
                                          int is_connected)
2809
{
2810
    struct sockaddr_in saddr;
2811
    int newfd;
2812
    socklen_t saddr_len;
2813
    NetSocketState *s;
2814

    
2815
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
2816
     * Because this may be "shared" socket from a "master" process, datagrams would be recv() 
2817
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
2818
     */
2819

    
2820
    if (is_connected) {
2821
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2822
            /* must be bound */
2823
            if (saddr.sin_addr.s_addr==0) {
2824
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2825
                        fd);
2826
                return NULL;
2827
            }
2828
            /* clone dgram socket */
2829
            newfd = net_socket_mcast_create(&saddr);
2830
            if (newfd < 0) {
2831
                /* error already reported by net_socket_mcast_create() */
2832
                close(fd);
2833
                return NULL;
2834
            }
2835
            /* clone newfd to fd, close newfd */
2836
            dup2(newfd, fd);
2837
            close(newfd);
2838
        
2839
        } else {
2840
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2841
                    fd, strerror(errno));
2842
            return NULL;
2843
        }
2844
    }
2845

    
2846
    s = qemu_mallocz(sizeof(NetSocketState));
2847
    if (!s)
2848
        return NULL;
2849
    s->fd = fd;
2850

    
2851
    s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
2852
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2853

    
2854
    /* mcast: save bound address as dst */
2855
    if (is_connected) s->dgram_dst=saddr;
2856

    
2857
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2858
            "socket: fd=%d (%s mcast=%s:%d)", 
2859
            fd, is_connected? "cloned" : "",
2860
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2861
    return s;
2862
}
2863

    
2864
static void net_socket_connect(void *opaque)
2865
{
2866
    NetSocketState *s = opaque;
2867
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2868
}
2869

    
2870
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd, 
2871
                                          int is_connected)
2872
{
2873
    NetSocketState *s;
2874
    s = qemu_mallocz(sizeof(NetSocketState));
2875
    if (!s)
2876
        return NULL;
2877
    s->fd = fd;
2878
    s->vc = qemu_new_vlan_client(vlan, 
2879
                                 net_socket_receive, NULL, s);
2880
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2881
             "socket: fd=%d", fd);
2882
    if (is_connected) {
2883
        net_socket_connect(s);
2884
    } else {
2885
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2886
    }
2887
    return s;
2888
}
2889

    
2890
static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd, 
2891
                                          int is_connected)
2892
{
2893
    int so_type=-1, optlen=sizeof(so_type);
2894

    
2895
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type, &optlen)< 0) {
2896
        fprintf(stderr, "qemu: error: setsockopt(SO_TYPE) for fd=%d failed\n", fd);
2897
        return NULL;
2898
    }
2899
    switch(so_type) {
2900
    case SOCK_DGRAM:
2901
        return net_socket_fd_init_dgram(vlan, fd, is_connected);
2902
    case SOCK_STREAM:
2903
        return net_socket_fd_init_stream(vlan, fd, is_connected);
2904
    default:
2905
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2906
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2907
        return net_socket_fd_init_stream(vlan, fd, is_connected);
2908
    }
2909
    return NULL;
2910
}
2911

    
2912
static void net_socket_accept(void *opaque)
2913
{
2914
    NetSocketListenState *s = opaque;    
2915
    NetSocketState *s1;
2916
    struct sockaddr_in saddr;
2917
    socklen_t len;
2918
    int fd;
2919

    
2920
    for(;;) {
2921
        len = sizeof(saddr);
2922
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2923
        if (fd < 0 && errno != EINTR) {
2924
            return;
2925
        } else if (fd >= 0) {
2926
            break;
2927
        }
2928
    }
2929
    s1 = net_socket_fd_init(s->vlan, fd, 1); 
2930
    if (!s1) {
2931
        close(fd);
2932
    } else {
2933
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2934
                 "socket: connection from %s:%d", 
2935
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2936
    }
2937
}
2938

    
2939
static int net_socket_listen_init(VLANState *vlan, const char *host_str)
2940
{
2941
    NetSocketListenState *s;
2942
    int fd, val, ret;
2943
    struct sockaddr_in saddr;
2944

    
2945
    if (parse_host_port(&saddr, host_str) < 0)
2946
        return -1;
2947
    
2948
    s = qemu_mallocz(sizeof(NetSocketListenState));
2949
    if (!s)
2950
        return -1;
2951

    
2952
    fd = socket(PF_INET, SOCK_STREAM, 0);
2953
    if (fd < 0) {
2954
        perror("socket");
2955
        return -1;
2956
    }
2957
    socket_set_nonblock(fd);
2958

    
2959
    /* allow fast reuse */
2960
    val = 1;
2961
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2962
    
2963
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2964
    if (ret < 0) {
2965
        perror("bind");
2966
        return -1;
2967
    }
2968
    ret = listen(fd, 0);
2969
    if (ret < 0) {
2970
        perror("listen");
2971
        return -1;
2972
    }
2973
    s->vlan = vlan;
2974
    s->fd = fd;
2975
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2976
    return 0;
2977
}
2978

    
2979
static int net_socket_connect_init(VLANState *vlan, const char *host_str)
2980
{
2981
    NetSocketState *s;
2982
    int fd, connected, ret, err;
2983
    struct sockaddr_in saddr;
2984

    
2985
    if (parse_host_port(&saddr, host_str) < 0)
2986
        return -1;
2987

    
2988
    fd = socket(PF_INET, SOCK_STREAM, 0);
2989
    if (fd < 0) {
2990
        perror("socket");
2991
        return -1;
2992
    }
2993
    socket_set_nonblock(fd);
2994

    
2995
    connected = 0;
2996
    for(;;) {
2997
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2998
        if (ret < 0) {
2999
            err = socket_error();
3000
            if (err == EINTR || err == EWOULDBLOCK) {
3001
            } else if (err == EINPROGRESS) {
3002
                break;
3003
            } else {
3004
                perror("connect");
3005
                closesocket(fd);
3006
                return -1;
3007
            }
3008
        } else {
3009
            connected = 1;
3010
            break;
3011
        }
3012
    }
3013
    s = net_socket_fd_init(vlan, fd, connected);
3014
    if (!s)
3015
        return -1;
3016
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3017
             "socket: connect to %s:%d", 
3018
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
3019
    return 0;
3020
}
3021

    
3022
static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
3023
{
3024
    NetSocketState *s;
3025
    int fd;
3026
    struct sockaddr_in saddr;
3027

    
3028
    if (parse_host_port(&saddr, host_str) < 0)
3029
        return -1;
3030

    
3031

    
3032
    fd = net_socket_mcast_create(&saddr);
3033
    if (fd < 0)
3034
        return -1;
3035

    
3036
    s = net_socket_fd_init(vlan, fd, 0);
3037
    if (!s)
3038
        return -1;
3039

    
3040
    s->dgram_dst = saddr;
3041
    
3042
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3043
             "socket: mcast=%s:%d", 
3044
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
3045
    return 0;
3046

    
3047
}
3048

    
3049
static int get_param_value(char *buf, int buf_size,
3050
                           const char *tag, const char *str)
3051
{
3052
    const char *p;
3053
    char *q;
3054
    char option[128];
3055

    
3056
    p = str;
3057
    for(;;) {
3058
        q = option;
3059
        while (*p != '\0' && *p != '=') {
3060
            if ((q - option) < sizeof(option) - 1)
3061
                *q++ = *p;
3062
            p++;
3063
        }
3064
        *q = '\0';
3065
        if (*p != '=')
3066
            break;
3067
        p++;
3068
        if (!strcmp(tag, option)) {
3069
            q = buf;
3070
            while (*p != '\0' && *p != ',') {
3071
                if ((q - buf) < buf_size - 1)
3072
                    *q++ = *p;
3073
                p++;
3074
            }
3075
            *q = '\0';
3076
            return q - buf;
3077
        } else {
3078
            while (*p != '\0' && *p != ',') {
3079
                p++;
3080
            }
3081
        }
3082
        if (*p != ',')
3083
            break;
3084
        p++;
3085
    }
3086
    return 0;
3087
}
3088

    
3089
int net_client_init(const char *str)
3090
{
3091
    const char *p;
3092
    char *q;
3093
    char device[64];
3094
    char buf[1024];
3095
    int vlan_id, ret;
3096
    VLANState *vlan;
3097

    
3098
    p = str;
3099
    q = device;
3100
    while (*p != '\0' && *p != ',') {
3101
        if ((q - device) < sizeof(device) - 1)
3102
            *q++ = *p;
3103
        p++;
3104
    }
3105
    *q = '\0';
3106
    if (*p == ',')
3107
        p++;
3108
    vlan_id = 0;
3109
    if (get_param_value(buf, sizeof(buf), "vlan", p)) {
3110
        vlan_id = strtol(buf, NULL, 0);
3111
    }
3112
    vlan = qemu_find_vlan(vlan_id);
3113
    if (!vlan) {
3114
        fprintf(stderr, "Could not create vlan %d\n", vlan_id);
3115
        return -1;
3116
    }
3117
    if (!strcmp(device, "nic")) {
3118
        NICInfo *nd;
3119
        uint8_t *macaddr;
3120

    
3121
        if (nb_nics >= MAX_NICS) {
3122
            fprintf(stderr, "Too Many NICs\n");
3123
            return -1;
3124
        }
3125
        nd = &nd_table[nb_nics];
3126
        macaddr = nd->macaddr;
3127
        macaddr[0] = 0x52;
3128
        macaddr[1] = 0x54;
3129
        macaddr[2] = 0x00;
3130
        macaddr[3] = 0x12;
3131
        macaddr[4] = 0x34;
3132
        macaddr[5] = 0x56 + nb_nics;
3133

    
3134
        if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
3135
            if (parse_macaddr(macaddr, buf) < 0) {
3136
                fprintf(stderr, "invalid syntax for ethernet address\n");
3137
                return -1;
3138
            }
3139
        }
3140
        if (get_param_value(buf, sizeof(buf), "model", p)) {
3141
            nd->model = strdup(buf);
3142
        }
3143
        nd->vlan = vlan;
3144
        nb_nics++;
3145
        ret = 0;
3146
    } else
3147
    if (!strcmp(device, "none")) {
3148
        /* does nothing. It is needed to signal that no network cards
3149
           are wanted */
3150
        ret = 0;
3151
    } else
3152
#ifdef CONFIG_SLIRP
3153
    if (!strcmp(device, "user")) {
3154
        if (get_param_value(buf, sizeof(buf), "hostname", p)) {
3155
            if (strlen(buf) > 32)
3156
              buf[32] = 0;
3157
            strcpy(slirp_hostname, buf);
3158
        }
3159
        ret = net_slirp_init(vlan);
3160
    } else
3161
#endif
3162
#ifdef _WIN32
3163
    if (!strcmp(device, "tap")) {
3164
        char ifname[64];
3165
        if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
3166
            fprintf(stderr, "tap: no interface name\n");
3167
            return -1;
3168
        }
3169
        ret = tap_win32_init(vlan, ifname);
3170
    } else
3171
#else
3172
    if (!strcmp(device, "tap")) {
3173
        char ifname[64];
3174
        char setup_script[1024];
3175
        int fd;
3176
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
3177
            fd = strtol(buf, NULL, 0);
3178
            ret = -1;
3179
            if (net_tap_fd_init(vlan, fd))
3180
                ret = 0;
3181
        } else {
3182
            get_param_value(ifname, sizeof(ifname), "ifname", p);
3183
            if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
3184
                pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
3185
            }
3186
            ret = net_tap_init(vlan, ifname, setup_script);
3187
        }
3188
    } else
3189
#endif
3190
    if (!strcmp(device, "socket")) {
3191
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
3192
            int fd;
3193
            fd = strtol(buf, NULL, 0);
3194
            ret = -1;
3195
            if (net_socket_fd_init(vlan, fd, 1))
3196
                ret = 0;
3197
        } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
3198
            ret = net_socket_listen_init(vlan, buf);
3199
        } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
3200
            ret = net_socket_connect_init(vlan, buf);
3201
        } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
3202
            ret = net_socket_mcast_init(vlan, buf);
3203
        } else {
3204
            fprintf(stderr, "Unknown socket options: %s\n", p);
3205
            return -1;
3206
        }
3207
    } else
3208
    {
3209
        fprintf(stderr, "Unknown network device: %s\n", device);
3210
        return -1;
3211
    }
3212
    if (ret < 0) {
3213
        fprintf(stderr, "Could not initialize device '%s'\n", device);
3214
    }
3215
    
3216
    return ret;
3217
}
3218

    
3219
void do_info_network(void)
3220
{
3221
    VLANState *vlan;
3222
    VLANClientState *vc;
3223

    
3224
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
3225
        term_printf("VLAN %d devices:\n", vlan->id);
3226
        for(vc = vlan->first_client; vc != NULL; vc = vc->next)
3227
            term_printf("  %s\n", vc->info_str);
3228
    }
3229
}
3230
 
3231
/***********************************************************/
3232
/* USB devices */
3233

    
3234
static int usb_device_add(const char *devname)
3235
{
3236
    const char *p;
3237
    USBDevice *dev;
3238
    int i;
3239

    
3240
    if (!vm_usb_hub)
3241
        return -1;
3242
    for(i = 0;i < MAX_VM_USB_PORTS; i++) {
3243
        if (!vm_usb_ports[i]->dev)
3244
            break;
3245
    }
3246
    if (i == MAX_VM_USB_PORTS)
3247
        return -1;
3248

    
3249
    if (strstart(devname, "host:", &p)) {
3250
        dev = usb_host_device_open(p);
3251
        if (!dev)
3252
            return -1;
3253
    } else if (!strcmp(devname, "mouse")) {
3254
        dev = usb_mouse_init();
3255
        if (!dev)
3256
            return -1;
3257
    } else if (!strcmp(devname, "tablet")) {
3258
        dev = usb_tablet_init();
3259
        if (!dev)
3260
            return -1;
3261
    } else {
3262
        return -1;
3263
    }
3264
    usb_attach(vm_usb_ports[i], dev);
3265
    return 0;
3266
}
3267

    
3268
static int usb_device_del(const char *devname)
3269
{
3270
    USBDevice *dev;
3271
    int bus_num, addr, i;
3272
    const char *p;
3273

    
3274
    if (!vm_usb_hub)
3275
        return -1;
3276

    
3277
    p = strchr(devname, '.');
3278
    if (!p) 
3279
        return -1;
3280
    bus_num = strtoul(devname, NULL, 0);
3281
    addr = strtoul(p + 1, NULL, 0);
3282
    if (bus_num != 0)
3283
        return -1;
3284
    for(i = 0;i < MAX_VM_USB_PORTS; i++) {
3285
        dev = vm_usb_ports[i]->dev;
3286
        if (dev && dev->addr == addr)
3287
            break;
3288
    }
3289
    if (i == MAX_VM_USB_PORTS)
3290
        return -1;
3291
    usb_attach(vm_usb_ports[i], NULL);
3292
    return 0;
3293
}
3294

    
3295
void do_usb_add(const char *devname)
3296
{
3297
    int ret;
3298
    ret = usb_device_add(devname);
3299
    if (ret < 0) 
3300
        term_printf("Could not add USB device '%s'\n", devname);
3301
}
3302

    
3303
void do_usb_del(const char *devname)
3304
{
3305
    int ret;
3306
    ret = usb_device_del(devname);
3307
    if (ret < 0) 
3308
        term_printf("Could not remove USB device '%s'\n", devname);
3309
}
3310

    
3311
void usb_info(void)
3312
{
3313
    USBDevice *dev;
3314
    int i;
3315
    const char *speed_str;
3316

    
3317
    if (!vm_usb_hub) {
3318
        term_printf("USB support not enabled\n");
3319
        return;
3320
    }
3321

    
3322
    for(i = 0; i < MAX_VM_USB_PORTS; i++) {
3323
        dev = vm_usb_ports[i]->dev;
3324
        if (dev) {
3325
            term_printf("Hub port %d:\n", i);
3326
            switch(dev->speed) {
3327
            case USB_SPEED_LOW: 
3328
                speed_str = "1.5"; 
3329
                break;
3330
            case USB_SPEED_FULL: 
3331
                speed_str = "12"; 
3332
                break;
3333
            case USB_SPEED_HIGH: 
3334
                speed_str = "480"; 
3335
                break;
3336
            default:
3337
                speed_str = "?"; 
3338
                break;
3339
            }
3340
            term_printf("  Device %d.%d, speed %s Mb/s\n", 
3341
                        0, dev->addr, speed_str);
3342
        }
3343
    }
3344
}
3345

    
3346
/***********************************************************/
3347
/* pid file */
3348

    
3349
static char *pid_filename;
3350

    
3351
/* Remove PID file. Called on normal exit */
3352

    
3353
static void remove_pidfile(void) 
3354
{
3355
    unlink (pid_filename);
3356
}
3357

    
3358
static void create_pidfile(const char *filename)
3359
{
3360
    struct stat pidstat;
3361
    FILE *f;
3362

    
3363
    /* Try to write our PID to the named file */
3364
    if (stat(filename, &pidstat) < 0) {
3365
        if (errno == ENOENT) {
3366
            if ((f = fopen (filename, "w")) == NULL) {
3367
                perror("Opening pidfile");
3368
                exit(1);
3369
            }
3370
            fprintf(f, "%d\n", getpid());
3371
            fclose(f);
3372
            pid_filename = qemu_strdup(filename);
3373
            if (!pid_filename) {
3374
                fprintf(stderr, "Could not save PID filename");
3375
                exit(1);
3376
            }
3377
            atexit(remove_pidfile);
3378
        }
3379
    } else {
3380
        fprintf(stderr, "%s already exists. Remove it and try again.\n", 
3381
                filename);
3382
        exit(1);
3383
    }
3384
}
3385

    
3386
/***********************************************************/
3387
/* dumb display */
3388

    
3389
static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
3390
{
3391
}
3392

    
3393
static void dumb_resize(DisplayState *ds, int w, int h)
3394
{
3395
}
3396

    
3397
static void dumb_refresh(DisplayState *ds)
3398
{
3399
    vga_hw_update();
3400
}
3401

    
3402
void dumb_display_init(DisplayState *ds)
3403
{
3404
    ds->data = NULL;
3405
    ds->linesize = 0;
3406
    ds->depth = 0;
3407
    ds->dpy_update = dumb_update;
3408
    ds->dpy_resize = dumb_resize;
3409
    ds->dpy_refresh = dumb_refresh;
3410
}
3411

    
3412
#if !defined(CONFIG_SOFTMMU)
3413
/***********************************************************/
3414
/* cpu signal handler */
3415
static void host_segv_handler(int host_signum, siginfo_t *info, 
3416
                              void *puc)
3417
{
3418
    if (cpu_signal_handler(host_signum, info, puc))
3419
        return;
3420
    if (stdio_nb_clients > 0)
3421
        term_exit();
3422
    abort();
3423
}
3424
#endif
3425

    
3426
/***********************************************************/
3427
/* I/O handling */
3428

    
3429
#define MAX_IO_HANDLERS 64
3430

    
3431
typedef struct IOHandlerRecord {
3432
    int fd;
3433
    IOCanRWHandler *fd_read_poll;
3434
    IOHandler *fd_read;
3435
    IOHandler *fd_write;
3436
    void *opaque;
3437
    /* temporary data */
3438
    struct pollfd *ufd;
3439
    struct IOHandlerRecord *next;
3440
} IOHandlerRecord;
3441

    
3442
static IOHandlerRecord *first_io_handler;
3443

    
3444
/* XXX: fd_read_poll should be suppressed, but an API change is
3445
   necessary in the character devices to suppress fd_can_read(). */
3446
int qemu_set_fd_handler2(int fd, 
3447
                         IOCanRWHandler *fd_read_poll, 
3448
                         IOHandler *fd_read, 
3449
                         IOHandler *fd_write, 
3450
                         void *opaque)
3451
{
3452
    IOHandlerRecord **pioh, *ioh;
3453

    
3454
    if (!fd_read && !fd_write) {
3455
        pioh = &first_io_handler;
3456
        for(;;) {
3457
            ioh = *pioh;
3458
            if (ioh == NULL)
3459
                break;
3460
            if (ioh->fd == fd) {
3461
                *pioh = ioh->next;
3462
                qemu_free(ioh);
3463
                break;
3464
            }
3465
            pioh = &ioh->next;
3466
        }
3467
    } else {
3468
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3469
            if (ioh->fd == fd)
3470
                goto found;
3471
        }
3472
        ioh = qemu_mallocz(sizeof(IOHandlerRecord));
3473
        if (!ioh)
3474
            return -1;
3475
        ioh->next = first_io_handler;
3476
        first_io_handler = ioh;
3477
    found:
3478
        ioh->fd = fd;
3479
        ioh->fd_read_poll = fd_read_poll;
3480
        ioh->fd_read = fd_read;
3481
        ioh->fd_write = fd_write;
3482
        ioh->opaque = opaque;
3483
    }
3484
    return 0;
3485
}
3486

    
3487
int qemu_set_fd_handler(int fd, 
3488
                        IOHandler *fd_read, 
3489
                        IOHandler *fd_write, 
3490
                        void *opaque)
3491
{
3492
    return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
3493
}
3494

    
3495
/***********************************************************/
3496
/* Polling handling */
3497

    
3498
typedef struct PollingEntry {
3499
    PollingFunc *func;
3500
    void *opaque;
3501
    struct PollingEntry *next;
3502
} PollingEntry;
3503

    
3504
static PollingEntry *first_polling_entry;
3505

    
3506
int qemu_add_polling_cb(PollingFunc *func, void *opaque)
3507
{
3508
    PollingEntry **ppe, *pe;
3509
    pe = qemu_mallocz(sizeof(PollingEntry));
3510
    if (!pe)
3511
        return -1;
3512
    pe->func = func;
3513
    pe->opaque = opaque;
3514
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
3515
    *ppe = pe;
3516
    return 0;
3517
}
3518

    
3519
void qemu_del_polling_cb(PollingFunc *func, void *opaque)
3520
{
3521
    PollingEntry **ppe, *pe;
3522
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
3523
        pe = *ppe;
3524
        if (pe->func == func && pe->opaque == opaque) {
3525
            *ppe = pe->next;
3526
            qemu_free(pe);
3527
            break;
3528
        }
3529
    }
3530
}
3531

    
3532
/***********************************************************/
3533
/* savevm/loadvm support */
3534

    
3535
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
3536
{
3537
    fwrite(buf, 1, size, f);
3538
}
3539

    
3540
void qemu_put_byte(QEMUFile *f, int v)
3541
{
3542
    fputc(v, f);
3543
}
3544

    
3545
void qemu_put_be16(QEMUFile *f, unsigned int v)
3546
{
3547
    qemu_put_byte(f, v >> 8);
3548
    qemu_put_byte(f, v);
3549
}
3550

    
3551
void qemu_put_be32(QEMUFile *f, unsigned int v)
3552
{
3553
    qemu_put_byte(f, v >> 24);
3554
    qemu_put_byte(f, v >> 16);
3555
    qemu_put_byte(f, v >> 8);
3556
    qemu_put_byte(f, v);
3557
}
3558

    
3559
void qemu_put_be64(QEMUFile *f, uint64_t v)
3560
{
3561
    qemu_put_be32(f, v >> 32);
3562
    qemu_put_be32(f, v);
3563
}
3564

    
3565
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
3566
{
3567
    return fread(buf, 1, size, f);
3568
}
3569

    
3570
int qemu_get_byte(QEMUFile *f)
3571
{
3572
    int v;
3573
    v = fgetc(f);
3574
    if (v == EOF)
3575
        return 0;
3576
    else
3577
        return v;
3578
}
3579

    
3580
unsigned int qemu_get_be16(QEMUFile *f)
3581
{
3582
    unsigned int v;
3583
    v = qemu_get_byte(f) << 8;
3584
    v |= qemu_get_byte(f);
3585
    return v;
3586
}
3587

    
3588
unsigned int qemu_get_be32(QEMUFile *f)
3589
{
3590
    unsigned int v;
3591
    v = qemu_get_byte(f) << 24;
3592
    v |= qemu_get_byte(f) << 16;
3593
    v |= qemu_get_byte(f) << 8;
3594
    v |= qemu_get_byte(f);
3595
    return v;
3596
}
3597

    
3598
uint64_t qemu_get_be64(QEMUFile *f)
3599
{
3600
    uint64_t v;
3601
    v = (uint64_t)qemu_get_be32(f) << 32;
3602
    v |= qemu_get_be32(f);
3603
    return v;
3604
}
3605

    
3606
int64_t qemu_ftell(QEMUFile *f)
3607
{
3608
    return ftell(f);
3609
}
3610

    
3611
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
3612
{
3613
    if (fseek(f, pos, whence) < 0)
3614
        return -1;
3615
    return ftell(f);
3616
}
3617

    
3618
typedef struct SaveStateEntry {
3619
    char idstr[256];
3620
    int instance_id;
3621
    int version_id;
3622
    SaveStateHandler *save_state;
3623
    LoadStateHandler *load_state;
3624
    void *opaque;
3625
    struct SaveStateEntry *next;
3626
} SaveStateEntry;
3627

    
3628
static SaveStateEntry *first_se;
3629

    
3630
int register_savevm(const char *idstr, 
3631
                    int instance_id, 
3632
                    int version_id,
3633
                    SaveStateHandler *save_state,
3634
                    LoadStateHandler *load_state,
3635
                    void *opaque)
3636
{
3637
    SaveStateEntry *se, **pse;
3638

    
3639
    se = qemu_malloc(sizeof(SaveStateEntry));
3640
    if (!se)
3641
        return -1;
3642
    pstrcpy(se->idstr, sizeof(se->idstr), idstr);
3643
    se->instance_id = instance_id;
3644
    se->version_id = version_id;
3645
    se->save_state = save_state;
3646
    se->load_state = load_state;
3647
    se->opaque = opaque;
3648
    se->next = NULL;
3649

    
3650
    /* add at the end of list */
3651
    pse = &first_se;
3652
    while (*pse != NULL)
3653
        pse = &(*pse)->next;
3654
    *pse = se;
3655
    return 0;
3656
}
3657

    
3658
#define QEMU_VM_FILE_MAGIC   0x5145564d
3659
#define QEMU_VM_FILE_VERSION 0x00000001
3660

    
3661
int qemu_savevm(const char *filename)
3662
{
3663
    SaveStateEntry *se;
3664
    QEMUFile *f;
3665
    int len, len_pos, cur_pos, saved_vm_running, ret;
3666

    
3667
    saved_vm_running = vm_running;
3668
    vm_stop(0);
3669

    
3670
    f = fopen(filename, "wb");
3671
    if (!f) {
3672
        ret = -1;
3673
        goto the_end;
3674
    }
3675

    
3676
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
3677
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
3678

    
3679
    for(se = first_se; se != NULL; se = se->next) {
3680
        /* ID string */
3681
        len = strlen(se->idstr);
3682
        qemu_put_byte(f, len);
3683
        qemu_put_buffer(f, se->idstr, len);
3684

    
3685
        qemu_put_be32(f, se->instance_id);
3686
        qemu_put_be32(f, se->version_id);
3687

    
3688
        /* record size: filled later */
3689
        len_pos = ftell(f);
3690
        qemu_put_be32(f, 0);
3691
        
3692
        se->save_state(f, se->opaque);
3693

    
3694
        /* fill record size */
3695
        cur_pos = ftell(f);
3696
        len = ftell(f) - len_pos - 4;
3697
        fseek(f, len_pos, SEEK_SET);
3698
        qemu_put_be32(f, len);
3699
        fseek(f, cur_pos, SEEK_SET);
3700
    }
3701

    
3702
    fclose(f);
3703
    ret = 0;
3704
 the_end:
3705
    if (saved_vm_running)
3706
        vm_start();
3707
    return ret;
3708
}
3709

    
3710
static SaveStateEntry *find_se(const char *idstr, int instance_id)
3711
{
3712
    SaveStateEntry *se;
3713

    
3714
    for(se = first_se; se != NULL; se = se->next) {
3715
        if (!strcmp(se->idstr, idstr) && 
3716
            instance_id == se->instance_id)
3717
            return se;
3718
    }
3719
    return NULL;
3720
}
3721

    
3722
int qemu_loadvm(const char *filename)
3723
{
3724
    SaveStateEntry *se;
3725
    QEMUFile *f;
3726
    int len, cur_pos, ret, instance_id, record_len, version_id;
3727
    int saved_vm_running;
3728
    unsigned int v;
3729
    char idstr[256];
3730
    
3731
    saved_vm_running = vm_running;
3732
    vm_stop(0);
3733

    
3734
    f = fopen(filename, "rb");
3735
    if (!f) {
3736
        ret = -1;
3737
        goto the_end;
3738
    }
3739

    
3740
    v = qemu_get_be32(f);
3741
    if (v != QEMU_VM_FILE_MAGIC)
3742
        goto fail;
3743
    v = qemu_get_be32(f);
3744
    if (v != QEMU_VM_FILE_VERSION) {
3745
    fail:
3746
        fclose(f);
3747
        ret = -1;
3748
        goto the_end;
3749
    }
3750
    for(;;) {
3751
        len = qemu_get_byte(f);
3752
        if (feof(f))
3753
            break;
3754
        qemu_get_buffer(f, idstr, len);
3755
        idstr[len] = '\0';
3756
        instance_id = qemu_get_be32(f);
3757
        version_id = qemu_get_be32(f);
3758
        record_len = qemu_get_be32(f);
3759
#if 0
3760
        printf("idstr=%s instance=0x%x version=%d len=%d\n", 
3761
               idstr, instance_id, version_id, record_len);
3762
#endif
3763
        cur_pos = ftell(f);
3764
        se = find_se(idstr, instance_id);
3765
        if (!se) {
3766
            fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n", 
3767
                    instance_id, idstr);
3768
        } else {
3769
            ret = se->load_state(f, se->opaque, version_id);
3770
            if (ret < 0) {
3771
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n", 
3772
                        instance_id, idstr);
3773
            }
3774
        }
3775
        /* always seek to exact end of record */
3776
        qemu_fseek(f, cur_pos + record_len, SEEK_SET);
3777
    }
3778
    fclose(f);
3779
    ret = 0;
3780
 the_end:
3781
    if (saved_vm_running)
3782
        vm_start();
3783
    return ret;
3784
}
3785

    
3786
/***********************************************************/
3787
/* cpu save/restore */
3788

    
3789
#if defined(TARGET_I386)
3790

    
3791
static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
3792
{
3793
    qemu_put_be32(f, dt->selector);
3794
    qemu_put_betl(f, dt->base);
3795
    qemu_put_be32(f, dt->limit);
3796
    qemu_put_be32(f, dt->flags);
3797
}
3798

    
3799
static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
3800
{
3801
    dt->selector = qemu_get_be32(f);
3802
    dt->base = qemu_get_betl(f);
3803
    dt->limit = qemu_get_be32(f);
3804
    dt->flags = qemu_get_be32(f);
3805
}
3806

    
3807
void cpu_save(QEMUFile *f, void *opaque)
3808
{
3809
    CPUState *env = opaque;
3810
    uint16_t fptag, fpus, fpuc, fpregs_format;
3811
    uint32_t hflags;
3812
    int i;
3813
    
3814
    for(i = 0; i < CPU_NB_REGS; i++)
3815
        qemu_put_betls(f, &env->regs[i]);
3816
    qemu_put_betls(f, &env->eip);
3817
    qemu_put_betls(f, &env->eflags);
3818
    hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
3819
    qemu_put_be32s(f, &hflags);
3820
    
3821
    /* FPU */
3822
    fpuc = env->fpuc;
3823
    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
3824
    fptag = 0;
3825
    for(i = 0; i < 8; i++) {
3826
        fptag |= ((!env->fptags[i]) << i);
3827
    }
3828
    
3829
    qemu_put_be16s(f, &fpuc);
3830
    qemu_put_be16s(f, &fpus);
3831
    qemu_put_be16s(f, &fptag);
3832

    
3833
#ifdef USE_X86LDOUBLE
3834
    fpregs_format = 0;
3835
#else
3836
    fpregs_format = 1;
3837
#endif
3838
    qemu_put_be16s(f, &fpregs_format);
3839
    
3840
    for(i = 0; i < 8; i++) {
3841
#ifdef USE_X86LDOUBLE
3842
        {
3843
            uint64_t mant;
3844
            uint16_t exp;
3845
            /* we save the real CPU data (in case of MMX usage only 'mant'
3846
               contains the MMX register */
3847
            cpu_get_fp80(&mant, &exp, env->fpregs[i].d);
3848
            qemu_put_be64(f, mant);
3849
            qemu_put_be16(f, exp);
3850
        }
3851
#else
3852
        /* if we use doubles for float emulation, we save the doubles to
3853
           avoid losing information in case of MMX usage. It can give
3854
           problems if the image is restored on a CPU where long
3855
           doubles are used instead. */
3856
        qemu_put_be64(f, env->fpregs[i].mmx.MMX_Q(0));
3857
#endif
3858
    }
3859

    
3860
    for(i = 0; i < 6; i++)
3861
        cpu_put_seg(f, &env->segs[i]);
3862
    cpu_put_seg(f, &env->ldt);
3863
    cpu_put_seg(f, &env->tr);
3864
    cpu_put_seg(f, &env->gdt);
3865
    cpu_put_seg(f, &env->idt);
3866
    
3867
    qemu_put_be32s(f, &env->sysenter_cs);
3868
    qemu_put_be32s(f, &env->sysenter_esp);
3869
    qemu_put_be32s(f, &env->sysenter_eip);
3870
    
3871
    qemu_put_betls(f, &env->cr[0]);
3872
    qemu_put_betls(f, &env->cr[2]);
3873
    qemu_put_betls(f, &env->cr[3]);
3874
    qemu_put_betls(f, &env->cr[4]);
3875
    
3876
    for(i = 0; i < 8; i++)
3877
        qemu_put_betls(f, &env->dr[i]);
3878

    
3879
    /* MMU */
3880
    qemu_put_be32s(f, &env->a20_mask);
3881

    
3882
    /* XMM */
3883
    qemu_put_be32s(f, &env->mxcsr);
3884
    for(i = 0; i < CPU_NB_REGS; i++) {
3885
        qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(0));
3886
        qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(1));
3887
    }
3888

    
3889
#ifdef TARGET_X86_64
3890
    qemu_put_be64s(f, &env->efer);
3891
    qemu_put_be64s(f, &env->star);
3892
    qemu_put_be64s(f, &env->lstar);
3893
    qemu_put_be64s(f, &env->cstar);
3894
    qemu_put_be64s(f, &env->fmask);
3895
    qemu_put_be64s(f, &env->kernelgsbase);
3896
#endif
3897
}
3898

    
3899
#ifdef USE_X86LDOUBLE
3900
/* XXX: add that in a FPU generic layer */
3901
union x86_longdouble {
3902
    uint64_t mant;
3903
    uint16_t exp;
3904
};
3905

    
3906
#define MANTD1(fp)        (fp & ((1LL << 52) - 1))
3907
#define EXPBIAS1 1023
3908
#define EXPD1(fp)        ((fp >> 52) & 0x7FF)
3909
#define SIGND1(fp)        ((fp >> 32) & 0x80000000)
3910

    
3911
static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp)
3912
{
3913
    int e;
3914
    /* mantissa */
3915
    p->mant = (MANTD1(temp) << 11) | (1LL << 63);
3916
    /* exponent + sign */
3917
    e = EXPD1(temp) - EXPBIAS1 + 16383;
3918
    e |= SIGND1(temp) >> 16;
3919
    p->exp = e;
3920
}
3921
#endif
3922

    
3923
int cpu_load(QEMUFile *f, void *opaque, int version_id)
3924
{
3925
    CPUState *env = opaque;
3926
    int i, guess_mmx;
3927
    uint32_t hflags;
3928
    uint16_t fpus, fpuc, fptag, fpregs_format;
3929

    
3930
    if (version_id != 3)
3931
        return -EINVAL;
3932
    for(i = 0; i < CPU_NB_REGS; i++)
3933
        qemu_get_betls(f, &env->regs[i]);
3934
    qemu_get_betls(f, &env->eip);
3935
    qemu_get_betls(f, &env->eflags);
3936
    qemu_get_be32s(f, &hflags);
3937

    
3938
    qemu_get_be16s(f, &fpuc);
3939
    qemu_get_be16s(f, &fpus);
3940
    qemu_get_be16s(f, &fptag);
3941
    qemu_get_be16s(f, &fpregs_format);
3942
    
3943
    /* NOTE: we cannot always restore the FPU state if the image come
3944
       from a host with a different 'USE_X86LDOUBLE' define. We guess
3945
       if we are in an MMX state to restore correctly in that case. */
3946
    guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0);
3947
    for(i = 0; i < 8; i++) {
3948
        uint64_t mant;
3949
        uint16_t exp;
3950
        
3951
        switch(fpregs_format) {
3952
        case 0:
3953
            mant = qemu_get_be64(f);
3954
            exp = qemu_get_be16(f);
3955
#ifdef USE_X86LDOUBLE
3956
            env->fpregs[i].d = cpu_set_fp80(mant, exp);
3957
#else
3958
            /* difficult case */
3959
            if (guess_mmx)
3960
                env->fpregs[i].mmx.MMX_Q(0) = mant;
3961
            else
3962
                env->fpregs[i].d = cpu_set_fp80(mant, exp);
3963
#endif
3964
            break;
3965
        case 1:
3966
            mant = qemu_get_be64(f);
3967
#ifdef USE_X86LDOUBLE
3968
            {
3969
                union x86_longdouble *p;
3970
                /* difficult case */
3971
                p = (void *)&env->fpregs[i];
3972
                if (guess_mmx) {
3973
                    p->mant = mant;
3974
                    p->exp = 0xffff;
3975
                } else {
3976
                    fp64_to_fp80(p, mant);
3977
                }
3978
            }
3979
#else
3980
            env->fpregs[i].mmx.MMX_Q(0) = mant;
3981
#endif            
3982
            break;
3983
        default:
3984
            return -EINVAL;
3985
        }
3986
    }
3987

    
3988
    env->fpuc = fpuc;
3989
    /* XXX: restore FPU round state */
3990
    env->fpstt = (fpus >> 11) & 7;
3991
    env->fpus = fpus & ~0x3800;
3992
    fptag ^= 0xff;
3993
    for(i = 0; i < 8; i++) {
3994
        env->fptags[i] = (fptag >> i) & 1;
3995
    }
3996
    
3997
    for(i = 0; i < 6; i++)
3998
        cpu_get_seg(f, &env->segs[i]);
3999
    cpu_get_seg(f, &env->ldt);
4000
    cpu_get_seg(f, &env->tr);
4001
    cpu_get_seg(f, &env->gdt);
4002
    cpu_get_seg(f, &env->idt);
4003
    
4004
    qemu_get_be32s(f, &env->sysenter_cs);
4005
    qemu_get_be32s(f, &env->sysenter_esp);
4006
    qemu_get_be32s(f, &env->sysenter_eip);
4007
    
4008
    qemu_get_betls(f, &env->cr[0]);
4009
    qemu_get_betls(f, &env->cr[2]);
4010
    qemu_get_betls(f, &env->cr[3]);
4011
    qemu_get_betls(f, &env->cr[4]);
4012
    
4013
    for(i = 0; i < 8; i++)
4014
        qemu_get_betls(f, &env->dr[i]);
4015

    
4016
    /* MMU */
4017
    qemu_get_be32s(f, &env->a20_mask);
4018

    
4019
    qemu_get_be32s(f, &env->mxcsr);
4020
    for(i = 0; i < CPU_NB_REGS; i++) {
4021
        qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(0));
4022
        qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(1));
4023
    }
4024

    
4025
#ifdef TARGET_X86_64
4026
    qemu_get_be64s(f, &env->efer);
4027
    qemu_get_be64s(f, &env->star);
4028
    qemu_get_be64s(f, &env->lstar);
4029
    qemu_get_be64s(f, &env->cstar);
4030
    qemu_get_be64s(f, &env->fmask);
4031
    qemu_get_be64s(f, &env->kernelgsbase);
4032
#endif
4033

    
4034
    /* XXX: compute hflags from scratch, except for CPL and IIF */
4035
    env->hflags = hflags;
4036
    tlb_flush(env, 1);
4037
    return 0;
4038
}
4039

    
4040
#elif defined(TARGET_PPC)
4041
void cpu_save(QEMUFile *f, void *opaque)
4042
{
4043
}
4044

    
4045
int cpu_load(QEMUFile *f, void *opaque, int version_id)
4046
{
4047
    return 0;
4048
}
4049

    
4050
#elif defined(TARGET_MIPS)
4051
void cpu_save(QEMUFile *f, void *opaque)
4052
{
4053
}
4054

    
4055
int cpu_load(QEMUFile *f, void *opaque, int version_id)
4056
{
4057
    return 0;
4058
}
4059

    
4060
#elif defined(TARGET_SPARC)
4061
void cpu_save(QEMUFile *f, void *opaque)
4062
{
4063
    CPUState *env = opaque;
4064
    int i;
4065
    uint32_t tmp;
4066

    
4067
    for(i = 0; i < 8; i++)
4068
        qemu_put_betls(f, &env->gregs[i]);
4069
    for(i = 0; i < NWINDOWS * 16; i++)
4070
        qemu_put_betls(f, &env->regbase[i]);
4071

    
4072
    /* FPU */
4073
    for(i = 0; i < TARGET_FPREGS; i++) {
4074
        union {
4075
            TARGET_FPREG_T f;
4076
            target_ulong i;
4077
        } u;
4078
        u.f = env->fpr[i];
4079
        qemu_put_betl(f, u.i);
4080
    }
4081

    
4082
    qemu_put_betls(f, &env->pc);
4083
    qemu_put_betls(f, &env->npc);
4084
    qemu_put_betls(f, &env->y);
4085
    tmp = GET_PSR(env);
4086
    qemu_put_be32(f, tmp);
4087
    qemu_put_betls(f, &env->fsr);
4088
    qemu_put_betls(f, &env->tbr);
4089
#ifndef TARGET_SPARC64
4090
    qemu_put_be32s(f, &env->wim);
4091
    /* MMU */
4092
    for(i = 0; i < 16; i++)
4093
        qemu_put_be32s(f, &env->mmuregs[i]);
4094
#endif
4095
}
4096

    
4097
int cpu_load(QEMUFile *f, void *opaque, int version_id)
4098
{
4099
    CPUState *env = opaque;
4100
    int i;
4101
    uint32_t tmp;
4102

    
4103
    for(i = 0; i < 8; i++)
4104
        qemu_get_betls(f, &env->gregs[i]);
4105
    for(i = 0; i < NWINDOWS * 16; i++)
4106
        qemu_get_betls(f, &env->regbase[i]);
4107

    
4108
    /* FPU */
4109
    for(i = 0; i < TARGET_FPREGS; i++) {
4110
        union {
4111
            TARGET_FPREG_T f;
4112
            target_ulong i;
4113
        } u;
4114
        u.i = qemu_get_betl(f);
4115
        env->fpr[i] = u.f;
4116
    }
4117

    
4118
    qemu_get_betls(f, &env->pc);
4119
    qemu_get_betls(f, &env->npc);
4120
    qemu_get_betls(f, &env->y);
4121
    tmp = qemu_get_be32(f);
4122
    env->cwp = 0; /* needed to ensure that the wrapping registers are
4123
                     correctly updated */
4124
    PUT_PSR(env, tmp);
4125
    qemu_get_betls(f, &env->fsr);
4126
    qemu_get_betls(f, &env->tbr);
4127
#ifndef TARGET_SPARC64
4128
    qemu_get_be32s(f, &env->wim);
4129
    /* MMU */
4130
    for(i = 0; i < 16; i++)
4131
        qemu_get_be32s(f, &env->mmuregs[i]);
4132
#endif
4133
    tlb_flush(env, 1);
4134
    return 0;
4135
}
4136

    
4137
#elif defined(TARGET_ARM)
4138

    
4139
/* ??? Need to implement these.  */
4140
void cpu_save(QEMUFile *f, void *opaque)
4141
{
4142
}
4143

    
4144
int cpu_load(QEMUFile *f, void *opaque, int version_id)
4145
{
4146
    return 0;
4147
}
4148

    
4149
#else
4150

    
4151
#warning No CPU save/restore functions
4152

    
4153
#endif
4154

    
4155
/***********************************************************/
4156
/* ram save/restore */
4157

    
4158
/* we just avoid storing empty pages */
4159
static void ram_put_page(QEMUFile *f, const uint8_t *buf, int len)
4160
{
4161
    int i, v;
4162

    
4163
    v = buf[0];
4164
    for(i = 1; i < len; i++) {
4165
        if (buf[i] != v)
4166
            goto normal_save;
4167
    }
4168
    qemu_put_byte(f, 1);
4169
    qemu_put_byte(f, v);
4170
    return;
4171
 normal_save:
4172
    qemu_put_byte(f, 0); 
4173
    qemu_put_buffer(f, buf, len);
4174
}
4175

    
4176
static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
4177
{
4178
    int v;
4179

    
4180
    v = qemu_get_byte(f);
4181
    switch(v) {
4182
    case 0:
4183
        if (qemu_get_buffer(f, buf, len) != len)
4184
            return -EIO;
4185
        break;
4186
    case 1:
4187
        v = qemu_get_byte(f);
4188
        memset(buf, v, len);
4189
        break;
4190
    default:
4191
        return -EINVAL;
4192
    }
4193
    return 0;
4194
}
4195

    
4196
static void ram_save(QEMUFile *f, void *opaque)
4197
{
4198
    int i;
4199
    qemu_put_be32(f, phys_ram_size);
4200
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
4201
        ram_put_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
4202
    }
4203
}
4204

    
4205
static int ram_load(QEMUFile *f, void *opaque, int version_id)
4206
{
4207
    int i, ret;
4208

    
4209
    if (version_id != 1)
4210
        return -EINVAL;
4211
    if (qemu_get_be32(f) != phys_ram_size)
4212
        return -EINVAL;
4213
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
4214
        ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
4215
        if (ret)
4216
            return ret;
4217
    }
4218
    return 0;
4219
}
4220

    
4221
/***********************************************************/
4222
/* machine registration */
4223

    
4224
QEMUMachine *first_machine = NULL;
4225

    
4226
int qemu_register_machine(QEMUMachine *m)
4227
{
4228
    QEMUMachine **pm;
4229
    pm = &first_machine;
4230
    while (*pm != NULL)
4231
        pm = &(*pm)->next;
4232
    m->next = NULL;
4233
    *pm = m;
4234
    return 0;
4235
}
4236

    
4237
QEMUMachine *find_machine(const char *name)
4238
{
4239
    QEMUMachine *m;
4240

    
4241
    for(m = first_machine; m != NULL; m = m->next) {
4242
        if (!strcmp(m->name, name))
4243
            return m;
4244
    }
4245
    return NULL;
4246
}
4247

    
4248
/***********************************************************/
4249
/* main execution loop */
4250

    
4251
void gui_update(void *opaque)
4252
{
4253
    display_state.dpy_refresh(&display_state);
4254
    qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
4255
}
4256

    
4257
struct vm_change_state_entry {
4258
    VMChangeStateHandler *cb;
4259
    void *opaque;
4260
    LIST_ENTRY (vm_change_state_entry) entries;
4261
};
4262

    
4263
static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
4264

    
4265
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
4266
                                                     void *opaque)
4267
{
4268
    VMChangeStateEntry *e;
4269

    
4270
    e = qemu_mallocz(sizeof (*e));
4271
    if (!e)
4272
        return NULL;
4273

    
4274
    e->cb = cb;
4275
    e->opaque = opaque;
4276
    LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
4277
    return e;
4278
}
4279

    
4280
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
4281
{
4282
    LIST_REMOVE (e, entries);
4283
    qemu_free (e);
4284
}
4285

    
4286
static void vm_state_notify(int running)
4287
{
4288
    VMChangeStateEntry *e;
4289

    
4290
    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
4291
        e->cb(e->opaque, running);
4292
    }
4293
}
4294

    
4295
/* XXX: support several handlers */
4296
static VMStopHandler *vm_stop_cb;
4297
static void *vm_stop_opaque;
4298

    
4299
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
4300
{
4301
    vm_stop_cb = cb;
4302
    vm_stop_opaque = opaque;
4303
    return 0;
4304
}
4305

    
4306
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
4307
{
4308
    vm_stop_cb = NULL;
4309
}
4310

    
4311
void vm_start(void)
4312
{
4313
    if (!vm_running) {
4314
        cpu_enable_ticks();
4315
        vm_running = 1;
4316
        vm_state_notify(1);
4317
    }
4318
}
4319

    
4320
void vm_stop(int reason) 
4321
{
4322
    if (vm_running) {
4323
        cpu_disable_ticks();
4324
        vm_running = 0;
4325
        if (reason != 0) {
4326
            if (vm_stop_cb) {
4327
                vm_stop_cb(vm_stop_opaque, reason);
4328
            }
4329
        }
4330
        vm_state_notify(0);
4331
    }
4332
}
4333

    
4334
/* reset/shutdown handler */
4335

    
4336
typedef struct QEMUResetEntry {
4337
    QEMUResetHandler *func;
4338
    void *opaque;
4339
    struct QEMUResetEntry *next;
4340
} QEMUResetEntry;
4341

    
4342
static QEMUResetEntry *first_reset_entry;
4343
static int reset_requested;
4344
static int shutdown_requested;
4345
static int powerdown_requested;
4346

    
4347
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
4348
{
4349
    QEMUResetEntry **pre, *re;
4350

    
4351
    pre = &first_reset_entry;
4352
    while (*pre != NULL)
4353
        pre = &(*pre)->next;
4354
    re = qemu_mallocz(sizeof(QEMUResetEntry));
4355
    re->func = func;
4356
    re->opaque = opaque;
4357
    re->next = NULL;
4358
    *pre = re;
4359
}
4360

    
4361
void qemu_system_reset(void)
4362
{
4363
    QEMUResetEntry *re;
4364

    
4365
    /* reset all devices */
4366
    for(re = first_reset_entry; re != NULL; re = re->next) {
4367
        re->func(re->opaque);
4368
    }
4369
}
4370

    
4371
void qemu_system_reset_request(void)
4372
{
4373
    reset_requested = 1;
4374
    if (cpu_single_env)
4375
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
4376
}
4377

    
4378
void qemu_system_shutdown_request(void)
4379
{
4380
    shutdown_requested = 1;
4381
    if (cpu_single_env)
4382
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
4383
}
4384

    
4385
void qemu_system_powerdown_request(void)
4386
{
4387
    powerdown_requested = 1;
4388
    if (cpu_single_env)
4389
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
4390
}
4391

    
4392
void main_loop_wait(int timeout)
4393
{
4394
    IOHandlerRecord *ioh, *ioh_next;
4395
    fd_set rfds, wfds;
4396
    int ret, nfds;
4397
    struct timeval tv;
4398
    PollingEntry *pe;
4399

    
4400

    
4401
    /* XXX: need to suppress polling by better using win32 events */
4402
    ret = 0;
4403
    for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
4404
        ret |= pe->func(pe->opaque);
4405
    }
4406
#ifdef _WIN32
4407
    if (ret == 0 && timeout > 0) {
4408
        Sleep(timeout);
4409
    }
4410
#endif
4411
    /* poll any events */
4412
    /* XXX: separate device handlers from system ones */
4413
    nfds = -1;
4414
    FD_ZERO(&rfds);
4415
    FD_ZERO(&wfds);
4416
    for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
4417
        if (ioh->fd_read &&
4418
            (!ioh->fd_read_poll ||
4419
             ioh->fd_read_poll(ioh->opaque) != 0)) {
4420
            FD_SET(ioh->fd, &rfds);
4421
            if (ioh->fd > nfds)
4422
                nfds = ioh->fd;
4423
        }
4424
        if (ioh->fd_write) {
4425
            FD_SET(ioh->fd, &wfds);
4426
            if (ioh->fd > nfds)
4427
                nfds = ioh->fd;
4428
        }
4429
    }
4430
    
4431
    tv.tv_sec = 0;
4432
#ifdef _WIN32
4433
    tv.tv_usec = 0;
4434
#else
4435
    tv.tv_usec = timeout * 1000;
4436
#endif
4437
    ret = select(nfds + 1, &rfds, &wfds, NULL, &tv);
4438
    if (ret > 0) {
4439
        /* XXX: better handling of removal */
4440
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
4441
            ioh_next = ioh->next;
4442
            if (FD_ISSET(ioh->fd, &rfds)) {
4443
                ioh->fd_read(ioh->opaque);
4444
            }
4445
            if (FD_ISSET(ioh->fd, &wfds)) {
4446
                ioh->fd_write(ioh->opaque);
4447
            }
4448
        }
4449
    }
4450
#ifdef _WIN32
4451
    tap_win32_poll();
4452
#endif
4453

    
4454
#if defined(CONFIG_SLIRP)
4455
    /* XXX: merge with the previous select() */
4456
    if (slirp_inited) {
4457
        fd_set rfds, wfds, xfds;
4458
        int nfds;
4459
        struct timeval tv;
4460
        
4461
        nfds = -1;
4462
        FD_ZERO(&rfds);
4463
        FD_ZERO(&wfds);
4464
        FD_ZERO(&xfds);
4465
        slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
4466
        tv.tv_sec = 0;
4467
        tv.tv_usec = 0;
4468
        ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
4469
        if (ret >= 0) {
4470
            slirp_select_poll(&rfds, &wfds, &xfds);
4471
        }
4472
    }
4473
#endif
4474

    
4475
    if (vm_running) {
4476
        qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL], 
4477
                        qemu_get_clock(vm_clock));
4478
        /* run dma transfers, if any */
4479
        DMA_run();
4480
    }
4481
    
4482
    /* real time timers */
4483
    qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], 
4484
                    qemu_get_clock(rt_clock));
4485
}
4486

    
4487
static CPUState *cur_cpu;
4488

    
4489
int main_loop(void)
4490
{
4491
    int ret, timeout;
4492
#ifdef CONFIG_PROFILER
4493
    int64_t ti;
4494
#endif
4495
    CPUState *env;
4496

    
4497
    cur_cpu = first_cpu;
4498
    for(;;) {
4499
        if (vm_running) {
4500

    
4501
            env = cur_cpu;
4502
            for(;;) {
4503
                /* get next cpu */
4504
                env = env->next_cpu;
4505
                if (!env)
4506
                    env = first_cpu;
4507
#ifdef CONFIG_PROFILER
4508
                ti = profile_getclock();
4509
#endif
4510
                ret = cpu_exec(env);
4511
#ifdef CONFIG_PROFILER
4512
                qemu_time += profile_getclock() - ti;
4513
#endif
4514
                if (ret != EXCP_HALTED)
4515
                    break;
4516
                /* all CPUs are halted ? */
4517
                if (env == cur_cpu) {
4518
                    ret = EXCP_HLT;
4519
                    break;
4520
                }
4521
            }
4522
            cur_cpu = env;
4523

    
4524
            if (shutdown_requested) {
4525
                ret = EXCP_INTERRUPT;
4526
                break;
4527
            }
4528
            if (reset_requested) {
4529
                reset_requested = 0;
4530
                qemu_system_reset();
4531
                ret = EXCP_INTERRUPT;
4532
            }
4533
            if (powerdown_requested) {
4534
                powerdown_requested = 0;
4535
                qemu_system_powerdown();
4536
                ret = EXCP_INTERRUPT;
4537
            }
4538
            if (ret == EXCP_DEBUG) {
4539
                vm_stop(EXCP_DEBUG);
4540
            }
4541
            /* if hlt instruction, we wait until the next IRQ */
4542
            /* XXX: use timeout computed from timers */
4543
            if (ret == EXCP_HLT)
4544
                timeout = 10;
4545
            else
4546
                timeout = 0;
4547
        } else {
4548
            timeout = 10;
4549
        }
4550
#ifdef CONFIG_PROFILER
4551
        ti = profile_getclock();
4552
#endif
4553
        main_loop_wait(timeout);
4554
#ifdef CONFIG_PROFILER
4555
        dev_time += profile_getclock() - ti;
4556
#endif
4557
    }
4558
    cpu_disable_ticks();
4559
    return ret;
4560
}
4561

    
4562
void help(void)
4563
{
4564
    printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"
4565
           "usage: %s [options] [disk_image]\n"
4566
           "\n"
4567
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
4568
           "\n"
4569
           "Standard options:\n"
4570
           "-M machine      select emulated machine (-M ? for list)\n"
4571
           "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
4572
           "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n"
4573
           "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n"
4574
           "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
4575
           "-boot [a|c|d]   boot on floppy (a), hard disk (c) or CD-ROM (d)\n"
4576
           "-snapshot       write to temporary files instead of disk image files\n"
4577
           "-m megs         set virtual RAM size to megs MB [default=%d]\n"
4578
           "-smp n          set the number of CPUs to 'n' [default=1]\n"
4579
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
4580
#ifndef _WIN32
4581
           "-k language     use keyboard layout (for example \"fr\" for French)\n"
4582
#endif
4583
#ifdef HAS_AUDIO
4584
           "-audio-help     print list of audio drivers and their options\n"
4585
           "-soundhw c1,... enable audio support\n"
4586
           "                and only specified sound cards (comma separated list)\n"
4587
           "                use -soundhw ? to get the list of supported cards\n"
4588
           "                use -soundhw all to enable all of them\n"
4589
#endif
4590
           "-localtime      set the real time clock to local time [default=utc]\n"
4591
           "-full-screen    start in full screen\n"
4592
#ifdef TARGET_I386
4593
           "-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug\n"
4594
#endif
4595
           "-usb            enable the USB driver (will be the default soon)\n"
4596
           "-usbdevice name add the host or guest USB device 'name'\n"
4597
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
4598
           "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n"
4599
#endif
4600
           "\n"
4601
           "Network options:\n"
4602
           "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
4603
           "                create a new Network Interface Card and connect it to VLAN 'n'\n"
4604
#ifdef CONFIG_SLIRP
4605
           "-net user[,vlan=n][,hostname=host]\n"
4606
           "                connect the user mode network stack to VLAN 'n' and send\n"
4607
           "                hostname 'host' to DHCP clients\n"
4608
#endif
4609
#ifdef _WIN32
4610
           "-net tap[,vlan=n],ifname=name\n"
4611
           "                connect the host TAP network interface to VLAN 'n'\n"
4612
#else
4613
           "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]\n"
4614
           "                connect the host TAP network interface to VLAN 'n' and use\n"
4615
           "                the network script 'file' (default=%s);\n"
4616
           "                use 'fd=h' to connect to an already opened TAP interface\n"
4617
#endif
4618
           "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
4619
           "                connect the vlan 'n' to another VLAN using a socket connection\n"
4620
           "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
4621
           "                connect the vlan 'n' to multicast maddr and port\n"
4622
           "-net none       use it alone to have zero network devices; if no -net option\n"
4623
           "                is provided, the default is '-net nic -net user'\n"
4624
           "\n"
4625
#ifdef CONFIG_SLIRP
4626
           "-tftp prefix    allow tftp access to files starting with prefix [-net user]\n"
4627
#ifndef _WIN32
4628
           "-smb dir        allow SMB access to files in 'dir' [-net user]\n"
4629
#endif
4630
           "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
4631
           "                redirect TCP or UDP connections from host to guest [-net user]\n"
4632
#endif
4633
           "\n"
4634
           "Linux boot specific:\n"
4635
           "-kernel bzImage use 'bzImage' as kernel image\n"
4636
           "-append cmdline use 'cmdline' as kernel command line\n"
4637
           "-initrd file    use 'file' as initial ram disk\n"
4638
           "\n"
4639
           "Debug/Expert options:\n"
4640
           "-monitor dev    redirect the monitor to char device 'dev'\n"
4641
           "-serial dev     redirect the serial port to char device 'dev'\n"
4642
           "-parallel dev   redirect the parallel port to char device 'dev'\n"
4643
           "-pidfile file   Write PID to 'file'\n"
4644
           "-S              freeze CPU at startup (use 'c' to start execution)\n"
4645
           "-s              wait gdb connection to port %d\n"
4646
           "-p port         change gdb connection port\n"
4647
           "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
4648
           "-hdachs c,h,s[,t]  force hard disk 0 physical geometry and the optional BIOS\n"
4649
           "                translation (t=none or lba) (usually qemu can guess them)\n"
4650
           "-L path         set the directory for the BIOS and VGA BIOS\n"
4651
#ifdef USE_KQEMU
4652
           "-no-kqemu       disable KQEMU kernel module usage\n"
4653
#endif
4654
#ifdef USE_CODE_COPY
4655
           "-no-code-copy   disable code copy acceleration\n"
4656
#endif
4657
#ifdef TARGET_I386
4658
           "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
4659
           "                (default is CL-GD5446 PCI VGA)\n"
4660
#endif
4661
           "-loadvm file    start right away with a saved state (loadvm in monitor)\n"
4662
           "\n"
4663
           "During emulation, the following keys are useful:\n"
4664
           "ctrl-alt-f      toggle full screen\n"
4665
           "ctrl-alt-n      switch to virtual console 'n'\n"
4666
           "ctrl-alt        toggle mouse and keyboard grab\n"
4667
           "\n"
4668
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
4669
           ,
4670
#ifdef CONFIG_SOFTMMU
4671
           "qemu",
4672
#else
4673
           "qemu-fast",
4674
#endif
4675
           DEFAULT_RAM_SIZE,
4676
#ifndef _WIN32
4677
           DEFAULT_NETWORK_SCRIPT,
4678
#endif
4679
           DEFAULT_GDBSTUB_PORT,
4680
           "/tmp/qemu.log");
4681
#ifndef CONFIG_SOFTMMU
4682
    printf("\n"
4683
           "NOTE: this version of QEMU is faster but it needs slightly patched OSes to\n"
4684
           "work. Please use the 'qemu' executable to have a more accurate (but slower)\n"
4685
           "PC emulation.\n");
4686
#endif
4687
    exit(1);
4688
}
4689

    
4690
#define HAS_ARG 0x0001
4691

    
4692
enum {
4693
    QEMU_OPTION_h,
4694

    
4695
    QEMU_OPTION_M,
4696
    QEMU_OPTION_fda,
4697
    QEMU_OPTION_fdb,
4698
    QEMU_OPTION_hda,
4699
    QEMU_OPTION_hdb,
4700
    QEMU_OPTION_hdc,
4701
    QEMU_OPTION_hdd,
4702
    QEMU_OPTION_cdrom,
4703
    QEMU_OPTION_boot,
4704
    QEMU_OPTION_snapshot,
4705
    QEMU_OPTION_m,
4706
    QEMU_OPTION_nographic,
4707
#ifdef HAS_AUDIO
4708
    QEMU_OPTION_audio_help,
4709
    QEMU_OPTION_soundhw,
4710
#endif
4711

    
4712
    QEMU_OPTION_net,
4713
    QEMU_OPTION_tftp,
4714
    QEMU_OPTION_smb,
4715
    QEMU_OPTION_redir,
4716

    
4717
    QEMU_OPTION_kernel,
4718
    QEMU_OPTION_append,
4719
    QEMU_OPTION_initrd,
4720

    
4721
    QEMU_OPTION_S,
4722
    QEMU_OPTION_s,
4723
    QEMU_OPTION_p,
4724
    QEMU_OPTION_d,
4725
    QEMU_OPTION_hdachs,
4726
    QEMU_OPTION_L,
4727
    QEMU_OPTION_no_code_copy,
4728
    QEMU_OPTION_k,
4729
    QEMU_OPTION_localtime,
4730
    QEMU_OPTION_cirrusvga,
4731
    QEMU_OPTION_g,
4732
    QEMU_OPTION_std_vga,
4733
    QEMU_OPTION_monitor,
4734
    QEMU_OPTION_serial,
4735
    QEMU_OPTION_parallel,
4736
    QEMU_OPTION_loadvm,
4737
    QEMU_OPTION_full_screen,
4738
    QEMU_OPTION_pidfile,
4739
    QEMU_OPTION_no_kqemu,
4740
    QEMU_OPTION_kernel_kqemu,
4741
    QEMU_OPTION_win2k_hack,
4742
    QEMU_OPTION_usb,
4743
    QEMU_OPTION_usbdevice,
4744
    QEMU_OPTION_smp,
4745
};
4746

    
4747
typedef struct QEMUOption {
4748
    const char *name;
4749
    int flags;
4750
    int index;
4751
} QEMUOption;
4752

    
4753
const QEMUOption qemu_options[] = {
4754
    { "h", 0, QEMU_OPTION_h },
4755

    
4756
    { "M", HAS_ARG, QEMU_OPTION_M },
4757
    { "fda", HAS_ARG, QEMU_OPTION_fda },
4758
    { "fdb", HAS_ARG, QEMU_OPTION_fdb },
4759
    { "hda", HAS_ARG, QEMU_OPTION_hda },
4760
    { "hdb", HAS_ARG, QEMU_OPTION_hdb },
4761
    { "hdc", HAS_ARG, QEMU_OPTION_hdc },
4762
    { "hdd", HAS_ARG, QEMU_OPTION_hdd },
4763
    { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
4764
    { "boot", HAS_ARG, QEMU_OPTION_boot },
4765
    { "snapshot", 0, QEMU_OPTION_snapshot },
4766
    { "m", HAS_ARG, QEMU_OPTION_m },
4767
    { "nographic", 0, QEMU_OPTION_nographic },
4768
    { "k", HAS_ARG, QEMU_OPTION_k },
4769
#ifdef HAS_AUDIO
4770
    { "audio-help", 0, QEMU_OPTION_audio_help },
4771
    { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
4772
#endif
4773

    
4774
    { "net", HAS_ARG, QEMU_OPTION_net},
4775
#ifdef CONFIG_SLIRP
4776
    { "tftp", HAS_ARG, QEMU_OPTION_tftp },
4777
#ifndef _WIN32
4778
    { "smb", HAS_ARG, QEMU_OPTION_smb },
4779
#endif
4780
    { "redir", HAS_ARG, QEMU_OPTION_redir },
4781
#endif
4782

    
4783
    { "kernel", HAS_ARG, QEMU_OPTION_kernel },
4784
    { "append", HAS_ARG, QEMU_OPTION_append },
4785
    { "initrd", HAS_ARG, QEMU_OPTION_initrd },
4786

    
4787
    { "S", 0, QEMU_OPTION_S },
4788
    { "s", 0, QEMU_OPTION_s },
4789
    { "p", HAS_ARG, QEMU_OPTION_p },
4790
    { "d", HAS_ARG, QEMU_OPTION_d },
4791
    { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
4792
    { "L", HAS_ARG, QEMU_OPTION_L },
4793
    { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
4794
#ifdef USE_KQEMU
4795
    { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
4796
    { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
4797
#endif
4798
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
4799
    { "g", 1, QEMU_OPTION_g },
4800
#endif
4801
    { "localtime", 0, QEMU_OPTION_localtime },
4802
    { "std-vga", 0, QEMU_OPTION_std_vga },
4803
    { "monitor", 1, QEMU_OPTION_monitor },
4804
    { "serial", 1, QEMU_OPTION_serial },
4805
    { "parallel", 1, QEMU_OPTION_parallel },
4806
    { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
4807
    { "full-screen", 0, QEMU_OPTION_full_screen },
4808
    { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
4809
    { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
4810
    { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
4811
    { "smp", HAS_ARG, QEMU_OPTION_smp },
4812
    
4813
    /* temporary options */
4814
    { "usb", 0, QEMU_OPTION_usb },
4815
    { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
4816
    { NULL },
4817
};
4818

    
4819
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
4820

    
4821
/* this stack is only used during signal handling */
4822
#define SIGNAL_STACK_SIZE 32768
4823

    
4824
static uint8_t *signal_stack;
4825

    
4826
#endif
4827

    
4828
/* password input */
4829

    
4830
static BlockDriverState *get_bdrv(int index)
4831
{
4832
    BlockDriverState *bs;
4833

    
4834
    if (index < 4) {
4835
        bs = bs_table[index];
4836
    } else if (index < 6) {
4837
        bs = fd_table[index - 4];
4838
    } else {
4839
        bs = NULL;
4840
    }
4841
    return bs;
4842
}
4843

    
4844
static void read_passwords(void)
4845
{
4846
    BlockDriverState *bs;
4847
    int i, j;
4848
    char password[256];
4849

    
4850
    for(i = 0; i < 6; i++) {
4851
        bs = get_bdrv(i);
4852
        if (bs && bdrv_is_encrypted(bs)) {
4853
            term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
4854
            for(j = 0; j < 3; j++) {
4855
                monitor_readline("Password: ", 
4856
                                 1, password, sizeof(password));
4857
                if (bdrv_set_key(bs, password) == 0)
4858
                    break;
4859
                term_printf("invalid password\n");
4860
            }
4861
        }
4862
    }
4863
}
4864

    
4865
/* XXX: currently we cannot use simultaneously different CPUs */
4866
void register_machines(void)
4867
{
4868
#if defined(TARGET_I386)
4869
    qemu_register_machine(&pc_machine);
4870
    qemu_register_machine(&isapc_machine);
4871
#elif defined(TARGET_PPC)
4872
    qemu_register_machine(&heathrow_machine);
4873
    qemu_register_machine(&core99_machine);
4874
    qemu_register_machine(&prep_machine);
4875
#elif defined(TARGET_MIPS)
4876
    qemu_register_machine(&mips_machine);
4877
#elif defined(TARGET_SPARC)
4878
#ifdef TARGET_SPARC64
4879
    qemu_register_machine(&sun4u_machine);
4880
#else
4881
    qemu_register_machine(&sun4m_machine);
4882
#endif
4883
#elif defined(TARGET_ARM)
4884
    qemu_register_machine(&integratorcp926_machine);
4885
    qemu_register_machine(&integratorcp1026_machine);
4886
    qemu_register_machine(&versatilepb_machine);
4887
#else
4888
#error unsupported CPU
4889
#endif
4890
}
4891

    
4892
#ifdef HAS_AUDIO
4893
struct soundhw soundhw[] = {
4894
    {
4895
        "sb16",
4896
        "Creative Sound Blaster 16",
4897
        0,
4898
        1,
4899
        { .init_isa = SB16_init }
4900
    },
4901

    
4902
#ifdef CONFIG_ADLIB
4903
    {
4904
        "adlib",
4905
#ifdef HAS_YMF262
4906
        "Yamaha YMF262 (OPL3)",
4907
#else
4908
        "Yamaha YM3812 (OPL2)",
4909
#endif
4910
        0,
4911
        1,
4912
        { .init_isa = Adlib_init }
4913
    },
4914
#endif
4915

    
4916
#ifdef CONFIG_GUS
4917
    {
4918
        "gus",
4919
        "Gravis Ultrasound GF1",
4920
        0,
4921
        1,
4922
        { .init_isa = GUS_init }
4923
    },
4924
#endif
4925

    
4926
    {
4927
        "es1370",
4928
        "ENSONIQ AudioPCI ES1370",
4929
        0,
4930
        0,
4931
        { .init_pci = es1370_init }
4932
    },
4933

    
4934
    { NULL, NULL, 0, 0, { NULL } }
4935
};
4936

    
4937
static void select_soundhw (const char *optarg)
4938
{
4939
    struct soundhw *c;
4940

    
4941
    if (*optarg == '?') {
4942
    show_valid_cards:
4943

    
4944
        printf ("Valid sound card names (comma separated):\n");
4945
        for (c = soundhw; c->name; ++c) {
4946
            printf ("%-11s %s\n", c->name, c->descr);
4947
        }
4948
        printf ("\n-soundhw all will enable all of the above\n");
4949
        exit (*optarg != '?');
4950
    }
4951
    else {
4952
        size_t l;
4953
        const char *p;
4954
        char *e;
4955
        int bad_card = 0;
4956

    
4957
        if (!strcmp (optarg, "all")) {
4958
            for (c = soundhw; c->name; ++c) {
4959
                c->enabled = 1;
4960
            }
4961
            return;
4962
        }
4963

    
4964
        p = optarg;
4965
        while (*p) {
4966
            e = strchr (p, ',');
4967
            l = !e ? strlen (p) : (size_t) (e - p);
4968

    
4969
            for (c = soundhw; c->name; ++c) {
4970
                if (!strncmp (c->name, p, l)) {
4971
                    c->enabled = 1;
4972
                    break;
4973
                }
4974
            }
4975

    
4976
            if (!c->name) {
4977
                if (l > 80) {
4978
                    fprintf (stderr,
4979
                             "Unknown sound card name (too big to show)\n");
4980
                }
4981
                else {
4982
                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
4983
                             (int) l, p);
4984
                }
4985
                bad_card = 1;
4986
            }
4987
            p += l + (e != NULL);
4988
        }
4989

    
4990
        if (bad_card)
4991
            goto show_valid_cards;
4992
    }
4993
}
4994
#endif
4995

    
4996
#define MAX_NET_CLIENTS 32
4997

    
4998
int main(int argc, char **argv)
4999
{
5000
#ifdef CONFIG_GDBSTUB
5001
    int use_gdbstub, gdbstub_port;
5002
#endif
5003
    int i, cdrom_index;
5004
    int snapshot, linux_boot;
5005
    const char *initrd_filename;
5006
    const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
5007
    const char *kernel_filename, *kernel_cmdline;
5008
    DisplayState *ds = &display_state;
5009
    int cyls, heads, secs, translation;
5010
    int start_emulation = 1;
5011
    char net_clients[MAX_NET_CLIENTS][256];
5012
    int nb_net_clients;
5013
    int optind;
5014
    const char *r, *optarg;
5015
    CharDriverState *monitor_hd;
5016
    char monitor_device[128];
5017
    char serial_devices[MAX_SERIAL_PORTS][128];
5018
    int serial_device_index;
5019
    char parallel_devices[MAX_PARALLEL_PORTS][128];
5020
    int parallel_device_index;
5021
    const char *loadvm = NULL;
5022
    QEMUMachine *machine;
5023
    char usb_devices[MAX_VM_USB_PORTS][128];
5024
    int usb_devices_index;
5025

    
5026
    LIST_INIT (&vm_change_state_head);
5027
#if !defined(CONFIG_SOFTMMU)
5028
    /* we never want that malloc() uses mmap() */
5029
    mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
5030
#endif
5031
    register_machines();
5032
    machine = first_machine;
5033
    initrd_filename = NULL;
5034
    for(i = 0; i < MAX_FD; i++)
5035
        fd_filename[i] = NULL;
5036
    for(i = 0; i < MAX_DISKS; i++)
5037
        hd_filename[i] = NULL;
5038
    ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
5039
    vga_ram_size = VGA_RAM_SIZE;
5040
    bios_size = BIOS_SIZE;
5041
#ifdef CONFIG_GDBSTUB
5042
    use_gdbstub = 0;
5043
    gdbstub_port = DEFAULT_GDBSTUB_PORT;
5044
#endif
5045
    snapshot = 0;
5046
    nographic = 0;
5047
    kernel_filename = NULL;
5048
    kernel_cmdline = "";
5049
#ifdef TARGET_PPC
5050
    cdrom_index = 1;
5051
#else
5052
    cdrom_index = 2;
5053
#endif
5054
    cyls = heads = secs = 0;
5055
    translation = BIOS_ATA_TRANSLATION_AUTO;
5056
    pstrcpy(monitor_device, sizeof(monitor_device), "vc");
5057

    
5058
    pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "vc");
5059
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
5060
        serial_devices[i][0] = '\0';
5061
    serial_device_index = 0;
5062
    
5063
    pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc");
5064
    for(i = 1; i < MAX_PARALLEL_PORTS; i++)
5065
        parallel_devices[i][0] = '\0';
5066
    parallel_device_index = 0;
5067
    
5068
    usb_devices_index = 0;
5069
    
5070
    nb_net_clients = 0;
5071

    
5072
    nb_nics = 0;
5073
    /* default mac address of the first network interface */
5074
    
5075
    optind = 1;
5076
    for(;;) {
5077
        if (optind >= argc)
5078
            break;
5079
        r = argv[optind];
5080
        if (r[0] != '-') {
5081
            hd_filename[0] = argv[optind++];
5082
        } else {
5083
            const QEMUOption *popt;
5084

    
5085
            optind++;
5086
            popt = qemu_options;
5087
            for(;;) {
5088
                if (!popt->name) {
5089
                    fprintf(stderr, "%s: invalid option -- '%s'\n", 
5090
                            argv[0], r);
5091
                    exit(1);
5092
                }
5093
                if (!strcmp(popt->name, r + 1))
5094
                    break;
5095
                popt++;
5096
            }
5097
            if (popt->flags & HAS_ARG) {
5098
                if (optind >= argc) {
5099
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
5100
                            argv[0], r);
5101
                    exit(1);
5102
                }
5103
                optarg = argv[optind++];
5104
            } else {
5105
                optarg = NULL;
5106
            }
5107

    
5108
            switch(popt->index) {
5109
            case QEMU_OPTION_M:
5110
                machine = find_machine(optarg);
5111
                if (!machine) {
5112
                    QEMUMachine *m;
5113
                    printf("Supported machines are:\n");
5114
                    for(m = first_machine; m != NULL; m = m->next) {
5115
                        printf("%-10s %s%s\n",
5116
                               m->name, m->desc, 
5117
                               m == first_machine ? " (default)" : "");
5118
                    }
5119
                    exit(1);
5120
                }
5121
                break;
5122
            case QEMU_OPTION_initrd:
5123
                initrd_filename = optarg;
5124
                break;
5125
            case QEMU_OPTION_hda:
5126
            case QEMU_OPTION_hdb:
5127
            case QEMU_OPTION_hdc:
5128
            case QEMU_OPTION_hdd:
5129
                {
5130
                    int hd_index;
5131
                    hd_index = popt->index - QEMU_OPTION_hda;
5132
                    hd_filename[hd_index] = optarg;
5133
                    if (hd_index == cdrom_index)
5134
                        cdrom_index = -1;
5135
                }
5136
                break;
5137
            case QEMU_OPTION_snapshot:
5138
                snapshot = 1;
5139
                break;
5140
            case QEMU_OPTION_hdachs:
5141
                {
5142
                    const char *p;
5143
                    p = optarg;
5144
                    cyls = strtol(p, (char **)&p, 0);
5145
                    if (cyls < 1 || cyls > 16383)
5146
                        goto chs_fail;
5147
                    if (*p != ',')
5148
                        goto chs_fail;
5149
                    p++;
5150
                    heads = strtol(p, (char **)&p, 0);
5151
                    if (heads < 1 || heads > 16)
5152
                        goto chs_fail;
5153
                    if (*p != ',')
5154
                        goto chs_fail;
5155
                    p++;
5156
                    secs = strtol(p, (char **)&p, 0);
5157
                    if (secs < 1 || secs > 63)
5158
                        goto chs_fail;
5159
                    if (*p == ',') {
5160
                        p++;
5161
                        if (!strcmp(p, "none"))
5162
                            translation = BIOS_ATA_TRANSLATION_NONE;
5163
                        else if (!strcmp(p, "lba"))
5164
                            translation = BIOS_ATA_TRANSLATION_LBA;
5165
                        else if (!strcmp(p, "auto"))
5166
                            translation = BIOS_ATA_TRANSLATION_AUTO;
5167
                        else
5168
                            goto chs_fail;
5169
                    } else if (*p != '\0') {
5170
                    chs_fail:
5171
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
5172
                        exit(1);
5173
                    }
5174
                }
5175
                break;
5176
            case QEMU_OPTION_nographic:
5177
                pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
5178
                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");
5179
                nographic = 1;
5180
                break;
5181
            case QEMU_OPTION_kernel:
5182
                kernel_filename = optarg;
5183
                break;
5184
            case QEMU_OPTION_append:
5185
                kernel_cmdline = optarg;
5186
                break;
5187
            case QEMU_OPTION_cdrom:
5188
                if (cdrom_index >= 0) {
5189
                    hd_filename[cdrom_index] = optarg;
5190
                }
5191
                break;
5192
            case QEMU_OPTION_boot:
5193
                boot_device = optarg[0];
5194
                if (boot_device != 'a' && 
5195
#ifdef TARGET_SPARC
5196
                    // Network boot
5197
                    boot_device != 'n' &&
5198
#endif
5199
                    boot_device != 'c' && boot_device != 'd') {
5200
                    fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device);
5201
                    exit(1);
5202
                }
5203
                break;
5204
            case QEMU_OPTION_fda:
5205
                fd_filename[0] = optarg;
5206
                break;
5207
            case QEMU_OPTION_fdb:
5208
                fd_filename[1] = optarg;
5209
                break;
5210
            case QEMU_OPTION_no_code_copy:
5211
                code_copy_enabled = 0;
5212
                break;
5213
            case QEMU_OPTION_net:
5214
                if (nb_net_clients >= MAX_NET_CLIENTS) {
5215
                    fprintf(stderr, "qemu: too many network clients\n");
5216
                    exit(1);
5217
                }
5218
                pstrcpy(net_clients[nb_net_clients],
5219
                        sizeof(net_clients[0]),
5220
                        optarg);
5221
                nb_net_clients++;
5222
                break;
5223
#ifdef CONFIG_SLIRP
5224
            case QEMU_OPTION_tftp:
5225
                tftp_prefix = optarg;
5226
                break;
5227
#ifndef _WIN32
5228
            case QEMU_OPTION_smb:
5229
                net_slirp_smb(optarg);
5230
                break;
5231
#endif
5232
            case QEMU_OPTION_redir:
5233
                net_slirp_redir(optarg);                
5234
                break;
5235
#endif
5236
#ifdef HAS_AUDIO
5237
            case QEMU_OPTION_audio_help:
5238
                AUD_help ();
5239
                exit (0);
5240
                break;
5241
            case QEMU_OPTION_soundhw:
5242
                select_soundhw (optarg);
5243
                break;
5244
#endif
5245
            case QEMU_OPTION_h:
5246
                help();
5247
                break;
5248
            case QEMU_OPTION_m:
5249
                ram_size = atoi(optarg) * 1024 * 1024;
5250
                if (ram_size <= 0)
5251
                    help();
5252
                if (ram_size > PHYS_RAM_MAX_SIZE) {
5253
                    fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
5254
                            PHYS_RAM_MAX_SIZE / (1024 * 1024));
5255
                    exit(1);
5256
                }
5257
                break;
5258
            case QEMU_OPTION_d:
5259
                {
5260
                    int mask;
5261
                    CPULogItem *item;
5262
                    
5263
                    mask = cpu_str_to_log_mask(optarg);
5264
                    if (!mask) {
5265
                        printf("Log items (comma separated):\n");
5266
                    for(item = cpu_log_items; item->mask != 0; item++) {
5267
                        printf("%-10s %s\n", item->name, item->help);
5268
                    }
5269
                    exit(1);
5270
                    }
5271
                    cpu_set_log(mask);
5272
                }
5273
                break;
5274
#ifdef CONFIG_GDBSTUB
5275
            case QEMU_OPTION_s:
5276
                use_gdbstub = 1;
5277
                break;
5278
            case QEMU_OPTION_p:
5279
                gdbstub_port = atoi(optarg);
5280
                break;
5281
#endif
5282
            case QEMU_OPTION_L:
5283
                bios_dir = optarg;
5284
                break;
5285
            case QEMU_OPTION_S:
5286
                start_emulation = 0;
5287
                break;
5288
            case QEMU_OPTION_k:
5289
                keyboard_layout = optarg;
5290
                break;
5291
            case QEMU_OPTION_localtime:
5292
                rtc_utc = 0;
5293
                break;
5294
            case QEMU_OPTION_cirrusvga:
5295
                cirrus_vga_enabled = 1;
5296
                break;
5297
            case QEMU_OPTION_std_vga:
5298
                cirrus_vga_enabled = 0;
5299
                break;
5300
            case QEMU_OPTION_g:
5301
                {
5302
                    const char *p;
5303
                    int w, h, depth;
5304
                    p = optarg;
5305
                    w = strtol(p, (char **)&p, 10);
5306
                    if (w <= 0) {
5307
                    graphic_error:
5308
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
5309
                        exit(1);
5310
                    }
5311
                    if (*p != 'x')
5312
                        goto graphic_error;
5313
                    p++;
5314
                    h = strtol(p, (char **)&p, 10);
5315
                    if (h <= 0)
5316
                        goto graphic_error;
5317
                    if (*p == 'x') {
5318
                        p++;
5319
                        depth = strtol(p, (char **)&p, 10);
5320
                        if (depth != 8 && depth != 15 && depth != 16 && 
5321
                            depth != 24 && depth != 32)
5322
                            goto graphic_error;
5323
                    } else if (*p == '\0') {
5324
                        depth = graphic_depth;
5325
                    } else {
5326
                        goto graphic_error;
5327
                    }
5328
                    
5329
                    graphic_width = w;
5330
                    graphic_height = h;
5331
                    graphic_depth = depth;
5332
                }
5333
                break;
5334
            case QEMU_OPTION_monitor:
5335
                pstrcpy(monitor_device, sizeof(monitor_device), optarg);
5336
                break;
5337
            case QEMU_OPTION_serial:
5338
                if (serial_device_index >= MAX_SERIAL_PORTS) {
5339
                    fprintf(stderr, "qemu: too many serial ports\n");
5340
                    exit(1);
5341
                }
5342
                pstrcpy(serial_devices[serial_device_index], 
5343
                        sizeof(serial_devices[0]), optarg);
5344
                serial_device_index++;
5345
                break;
5346
            case QEMU_OPTION_parallel:
5347
                if (parallel_device_index >= MAX_PARALLEL_PORTS) {
5348
                    fprintf(stderr, "qemu: too many parallel ports\n");
5349
                    exit(1);
5350
                }
5351
                pstrcpy(parallel_devices[parallel_device_index], 
5352
                        sizeof(parallel_devices[0]), optarg);
5353
                parallel_device_index++;
5354
                break;
5355
            case QEMU_OPTION_loadvm:
5356
                loadvm = optarg;
5357
                break;
5358
            case QEMU_OPTION_full_screen:
5359
                full_screen = 1;
5360
                break;
5361
            case QEMU_OPTION_pidfile:
5362
                create_pidfile(optarg);
5363
                break;
5364
#ifdef TARGET_I386
5365
            case QEMU_OPTION_win2k_hack:
5366
                win2k_install_hack = 1;
5367
                break;
5368
#endif
5369
#ifdef USE_KQEMU
5370
            case QEMU_OPTION_no_kqemu:
5371
                kqemu_allowed = 0;
5372
                break;
5373
            case QEMU_OPTION_kernel_kqemu:
5374
                kqemu_allowed = 2;
5375
                break;
5376
#endif
5377
            case QEMU_OPTION_usb:
5378
                usb_enabled = 1;
5379
                break;
5380
            case QEMU_OPTION_usbdevice:
5381
                usb_enabled = 1;
5382
                if (usb_devices_index >= MAX_VM_USB_PORTS) {
5383
                    fprintf(stderr, "Too many USB devices\n");
5384
                    exit(1);
5385
                }
5386
                pstrcpy(usb_devices[usb_devices_index],
5387
                        sizeof(usb_devices[usb_devices_index]),
5388
                        optarg);
5389
                usb_devices_index++;
5390
                break;
5391
            case QEMU_OPTION_smp:
5392
                smp_cpus = atoi(optarg);
5393
                if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
5394
                    fprintf(stderr, "Invalid number of CPUs\n");
5395
                    exit(1);
5396
                }
5397
                break;
5398
            }
5399
        }
5400
    }
5401

    
5402
#ifdef USE_KQEMU
5403
    if (smp_cpus > 1)
5404
        kqemu_allowed = 0;
5405
#endif
5406
    linux_boot = (kernel_filename != NULL);
5407
        
5408
    if (!linux_boot && 
5409
        hd_filename[0] == '\0' && 
5410
        (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
5411
        fd_filename[0] == '\0')
5412
        help();
5413
    
5414
    /* boot to cd by default if no hard disk */
5415
    if (hd_filename[0] == '\0' && boot_device == 'c') {
5416
        if (fd_filename[0] != '\0')
5417
            boot_device = 'a';
5418
        else
5419
            boot_device = 'd';
5420
    }
5421

    
5422
#if !defined(CONFIG_SOFTMMU)
5423
    /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
5424
    {
5425
        static uint8_t stdout_buf[4096];
5426
        setvbuf(stdout, stdout_buf, _IOLBF, sizeof(stdout_buf));
5427
    }
5428
#else
5429
    setvbuf(stdout, NULL, _IOLBF, 0);
5430
#endif
5431
    
5432
#ifdef _WIN32
5433
    socket_init();
5434
#endif
5435

    
5436
    /* init network clients */
5437
    if (nb_net_clients == 0) {
5438
        /* if no clients, we use a default config */
5439
        pstrcpy(net_clients[0], sizeof(net_clients[0]),
5440
                "nic");
5441
        pstrcpy(net_clients[1], sizeof(net_clients[0]),
5442
                "user");
5443
        nb_net_clients = 2;
5444
    }
5445

    
5446
    for(i = 0;i < nb_net_clients; i++) {
5447
        if (net_client_init(net_clients[i]) < 0)
5448
            exit(1);
5449
    }
5450

    
5451
    /* init the memory */
5452
    phys_ram_size = ram_size + vga_ram_size + bios_size;
5453

    
5454
#ifdef CONFIG_SOFTMMU
5455
    phys_ram_base = qemu_vmalloc(phys_ram_size);
5456
    if (!phys_ram_base) {
5457
        fprintf(stderr, "Could not allocate physical memory\n");
5458
        exit(1);
5459
    }
5460
#else
5461
    /* as we must map the same page at several addresses, we must use
5462
       a fd */
5463
    {
5464
        const char *tmpdir;
5465

    
5466
        tmpdir = getenv("QEMU_TMPDIR");
5467
        if (!tmpdir)
5468
            tmpdir = "/tmp";
5469
        snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);
5470
        if (mkstemp(phys_ram_file) < 0) {
5471
            fprintf(stderr, "Could not create temporary memory file '%s'\n", 
5472
                    phys_ram_file);
5473
            exit(1);
5474
        }
5475
        phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);
5476
        if (phys_ram_fd < 0) {
5477
            fprintf(stderr, "Could not open temporary memory file '%s'\n", 
5478
                    phys_ram_file);
5479
            exit(1);
5480
        }
5481
        ftruncate(phys_ram_fd, phys_ram_size);
5482
        unlink(phys_ram_file);
5483
        phys_ram_base = mmap(get_mmap_addr(phys_ram_size), 
5484
                             phys_ram_size, 
5485
                             PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED, 
5486
                             phys_ram_fd, 0);
5487
        if (phys_ram_base == MAP_FAILED) {
5488
            fprintf(stderr, "Could not map physical memory\n");
5489
            exit(1);
5490
        }
5491
    }
5492
#endif
5493

    
5494
    /* we always create the cdrom drive, even if no disk is there */
5495
    bdrv_init();
5496
    if (cdrom_index >= 0) {
5497
        bs_table[cdrom_index] = bdrv_new("cdrom");
5498
        bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM);
5499
    }
5500

    
5501
    /* open the virtual block devices */
5502
    for(i = 0; i < MAX_DISKS; i++) {
5503
        if (hd_filename[i]) {
5504
            if (!bs_table[i]) {
5505
                char buf[64];
5506
                snprintf(buf, sizeof(buf), "hd%c", i + 'a');
5507
                bs_table[i] = bdrv_new(buf);
5508
            }
5509
            if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) {
5510
                fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
5511
                        hd_filename[i]);
5512
                exit(1);
5513
            }
5514
            if (i == 0 && cyls != 0) {
5515
                bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
5516
                bdrv_set_translation_hint(bs_table[i], translation);
5517
            }
5518
        }
5519
    }
5520

    
5521
    /* we always create at least one floppy disk */
5522
    fd_table[0] = bdrv_new("fda");
5523
    bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
5524

    
5525
    for(i = 0; i < MAX_FD; i++) {
5526
        if (fd_filename[i]) {
5527
            if (!fd_table[i]) {
5528
                char buf[64];
5529
                snprintf(buf, sizeof(buf), "fd%c", i + 'a');
5530
                fd_table[i] = bdrv_new(buf);
5531
                bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
5532
            }
5533
            if (fd_filename[i] != '\0') {
5534
                if (bdrv_open(fd_table[i], fd_filename[i], snapshot) < 0) {
5535
                    fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
5536
                            fd_filename[i]);
5537
                    exit(1);
5538
                }
5539
            }
5540
        }
5541
    }
5542

    
5543
    /* init USB devices */
5544
    if (usb_enabled) {
5545
        vm_usb_hub = usb_hub_init(vm_usb_ports, MAX_VM_USB_PORTS);
5546
        for(i = 0; i < usb_devices_index; i++) {
5547
            if (usb_device_add(usb_devices[i]) < 0) {
5548
                fprintf(stderr, "Warning: could not add USB device %s\n",
5549
                        usb_devices[i]);
5550
            }
5551
        }
5552
    }
5553

    
5554
    register_savevm("timer", 0, 1, timer_save, timer_load, NULL);
5555
    register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
5556

    
5557
    init_ioports();
5558
    cpu_calibrate_ticks();
5559

    
5560
    /* terminal init */
5561
    if (nographic) {
5562
        dumb_display_init(ds);
5563
    } else {
5564
#if defined(CONFIG_SDL)
5565
        sdl_display_init(ds, full_screen);
5566
#elif defined(CONFIG_COCOA)
5567
        cocoa_display_init(ds, full_screen);
5568
#else
5569
        dumb_display_init(ds);
5570
#endif
5571
    }
5572

    
5573
    monitor_hd = qemu_chr_open(monitor_device);
5574
    if (!monitor_hd) {
5575
        fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
5576
        exit(1);
5577
    }
5578
    monitor_init(monitor_hd, !nographic);
5579

    
5580
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5581
        if (serial_devices[i][0] != '\0') {
5582
            serial_hds[i] = qemu_chr_open(serial_devices[i]);
5583
            if (!serial_hds[i]) {
5584
                fprintf(stderr, "qemu: could not open serial device '%s'\n", 
5585
                        serial_devices[i]);
5586
                exit(1);
5587
            }
5588
            if (!strcmp(serial_devices[i], "vc"))
5589
                qemu_chr_printf(serial_hds[i], "serial%d console\n", i);
5590
        }
5591
    }
5592

    
5593
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5594
        if (parallel_devices[i][0] != '\0') {
5595
            parallel_hds[i] = qemu_chr_open(parallel_devices[i]);
5596
            if (!parallel_hds[i]) {
5597
                fprintf(stderr, "qemu: could not open parallel device '%s'\n", 
5598
                        parallel_devices[i]);
5599
                exit(1);
5600
            }
5601
            if (!strcmp(parallel_devices[i], "vc"))
5602
                qemu_chr_printf(parallel_hds[i], "parallel%d console\n", i);
5603
        }
5604
    }
5605

    
5606
    /* setup cpu signal handlers for MMU / self modifying code handling */
5607
#if !defined(CONFIG_SOFTMMU)
5608
    
5609
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
5610
    {
5611
        stack_t stk;
5612
        signal_stack = memalign(16, SIGNAL_STACK_SIZE);
5613
        stk.ss_sp = signal_stack;
5614
        stk.ss_size = SIGNAL_STACK_SIZE;
5615
        stk.ss_flags = 0;
5616

    
5617
        if (sigaltstack(&stk, NULL) < 0) {
5618
            perror("sigaltstack");
5619
            exit(1);
5620
        }
5621
    }
5622
#endif
5623
    {
5624
        struct sigaction act;
5625
        
5626
        sigfillset(&act.sa_mask);
5627
        act.sa_flags = SA_SIGINFO;
5628
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
5629
        act.sa_flags |= SA_ONSTACK;
5630
#endif
5631
        act.sa_sigaction = host_segv_handler;
5632
        sigaction(SIGSEGV, &act, NULL);
5633
        sigaction(SIGBUS, &act, NULL);
5634
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
5635
        sigaction(SIGFPE, &act, NULL);
5636
#endif
5637
    }
5638
#endif
5639

    
5640
#ifndef _WIN32
5641
    {
5642
        struct sigaction act;
5643
        sigfillset(&act.sa_mask);
5644
        act.sa_flags = 0;
5645
        act.sa_handler = SIG_IGN;
5646
        sigaction(SIGPIPE, &act, NULL);
5647
    }
5648
#endif
5649
    init_timers();
5650

    
5651
    machine->init(ram_size, vga_ram_size, boot_device,
5652
                  ds, fd_filename, snapshot,
5653
                  kernel_filename, kernel_cmdline, initrd_filename);
5654

    
5655
    gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
5656
    qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
5657

    
5658
#ifdef CONFIG_GDBSTUB
5659
    if (use_gdbstub) {
5660
        if (gdbserver_start(gdbstub_port) < 0) {
5661
            fprintf(stderr, "Could not open gdbserver socket on port %d\n", 
5662
                    gdbstub_port);
5663
            exit(1);
5664
        } else {
5665
            printf("Waiting gdb connection on port %d\n", gdbstub_port);
5666
        }
5667
    } else 
5668
#endif
5669
    if (loadvm)
5670
        qemu_loadvm(loadvm);
5671

    
5672
    {
5673
        /* XXX: simplify init */
5674
        read_passwords();
5675
        if (start_emulation) {
5676
            vm_start();
5677
        }
5678
    }
5679
    main_loop();
5680
    quit_timers();
5681
    return 0;
5682
}