Statistics
| Branch: | Revision:

root / vl.c @ c94c8d64

History | View | Annotate | Download (86.2 kB)

1
/*
2
 * QEMU System Emulator
3
 * 
4
 * Copyright (c) 2003-2004 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
#ifdef _BSD
44
#include <sys/stat.h>
45
#ifndef __APPLE__
46
#include <libutil.h>
47
#endif
48
#else
49
#include <linux/if.h>
50
#include <linux/if_tun.h>
51
#include <pty.h>
52
#include <malloc.h>
53
#include <linux/rtc.h>
54
#endif
55
#endif
56

    
57
#if defined(CONFIG_SLIRP)
58
#include "libslirp.h"
59
#endif
60

    
61
#ifdef _WIN32
62
#include <malloc.h>
63
#include <sys/timeb.h>
64
#include <windows.h>
65
#define getopt_long_only getopt_long
66
#define memalign(align, size) malloc(size)
67
#endif
68

    
69
#ifdef CONFIG_SDL
70
#ifdef __APPLE__
71
#include <SDL/SDL.h>
72
#endif
73
#endif /* CONFIG_SDL */
74

    
75
#include "disas.h"
76

    
77
#include "exec-all.h"
78

    
79
//#define DO_TB_FLUSH
80

    
81
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
82

    
83
//#define DEBUG_UNUSED_IOPORT
84
//#define DEBUG_IOPORT
85

    
86
#if !defined(CONFIG_SOFTMMU)
87
#define PHYS_RAM_MAX_SIZE (256 * 1024 * 1024)
88
#else
89
#define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
90
#endif
91

    
92
#ifdef TARGET_PPC
93
#define DEFAULT_RAM_SIZE 144
94
#else
95
#define DEFAULT_RAM_SIZE 128
96
#endif
97
/* in ms */
98
#define GUI_REFRESH_INTERVAL 30
99

    
100
/* XXX: use a two level table to limit memory usage */
101
#define MAX_IOPORTS 65536
102

    
103
const char *bios_dir = CONFIG_QEMU_SHAREDIR;
104
char phys_ram_file[1024];
105
CPUState *global_env;
106
CPUState *cpu_single_env;
107
void *ioport_opaque[MAX_IOPORTS];
108
IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
109
IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
110
BlockDriverState *bs_table[MAX_DISKS], *fd_table[MAX_FD];
111
int vga_ram_size;
112
int bios_size;
113
static DisplayState display_state;
114
int nographic;
115
int64_t ticks_per_sec;
116
int boot_device = 'c';
117
int ram_size;
118
static char network_script[1024];
119
int pit_min_timer_count = 0;
120
int nb_nics;
121
NetDriverState nd_table[MAX_NICS];
122
QEMUTimer *gui_timer;
123
int vm_running;
124
int audio_enabled = 0;
125
int pci_enabled = 1;
126
int prep_enabled = 0;
127
int rtc_utc = 1;
128
int cirrus_vga_enabled = 1;
129
int graphic_width = 800;
130
int graphic_height = 600;
131
int graphic_depth = 15;
132
TextConsole *vga_console;
133
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
134

    
135
/***********************************************************/
136
/* x86 ISA bus support */
137

    
138
target_phys_addr_t isa_mem_base = 0;
139

    
140
uint32_t default_ioport_readb(void *opaque, uint32_t address)
141
{
142
#ifdef DEBUG_UNUSED_IOPORT
143
    fprintf(stderr, "inb: port=0x%04x\n", address);
144
#endif
145
    return 0xff;
146
}
147

    
148
void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
149
{
150
#ifdef DEBUG_UNUSED_IOPORT
151
    fprintf(stderr, "outb: port=0x%04x data=0x%02x\n", address, data);
152
#endif
153
}
154

    
155
/* default is to make two byte accesses */
156
uint32_t default_ioport_readw(void *opaque, uint32_t address)
157
{
158
    uint32_t data;
159
    data = ioport_read_table[0][address](ioport_opaque[address], address);
160
    address = (address + 1) & (MAX_IOPORTS - 1);
161
    data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
162
    return data;
163
}
164

    
165
void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
166
{
167
    ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
168
    address = (address + 1) & (MAX_IOPORTS - 1);
169
    ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
170
}
171

    
172
uint32_t default_ioport_readl(void *opaque, uint32_t address)
173
{
174
#ifdef DEBUG_UNUSED_IOPORT
175
    fprintf(stderr, "inl: port=0x%04x\n", address);
176
#endif
177
    return 0xffffffff;
178
}
179

    
180
void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
181
{
182
#ifdef DEBUG_UNUSED_IOPORT
183
    fprintf(stderr, "outl: port=0x%04x data=0x%02x\n", address, data);
184
#endif
185
}
186

    
187
void init_ioports(void)
188
{
189
    int i;
190

    
191
    for(i = 0; i < MAX_IOPORTS; i++) {
192
        ioport_read_table[0][i] = default_ioport_readb;
193
        ioport_write_table[0][i] = default_ioport_writeb;
194
        ioport_read_table[1][i] = default_ioport_readw;
195
        ioport_write_table[1][i] = default_ioport_writew;
196
        ioport_read_table[2][i] = default_ioport_readl;
197
        ioport_write_table[2][i] = default_ioport_writel;
198
    }
199
}
200

    
201
/* size is the word size in byte */
202
int register_ioport_read(int start, int length, int size, 
203
                         IOPortReadFunc *func, void *opaque)
204
{
205
    int i, bsize;
206

    
207
    if (size == 1) {
208
        bsize = 0;
209
    } else if (size == 2) {
210
        bsize = 1;
211
    } else if (size == 4) {
212
        bsize = 2;
213
    } else {
214
        hw_error("register_ioport_read: invalid size");
215
        return -1;
216
    }
217
    for(i = start; i < start + length; i += size) {
218
        ioport_read_table[bsize][i] = func;
219
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
220
            hw_error("register_ioport_read: invalid opaque");
221
        ioport_opaque[i] = opaque;
222
    }
223
    return 0;
224
}
225

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

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

    
251
void isa_unassign_ioport(int start, int length)
252
{
253
    int i;
254

    
255
    for(i = start; i < start + length; i++) {
256
        ioport_read_table[0][i] = default_ioport_readb;
257
        ioport_read_table[1][i] = default_ioport_readw;
258
        ioport_read_table[2][i] = default_ioport_readl;
259

    
260
        ioport_write_table[0][i] = default_ioport_writeb;
261
        ioport_write_table[1][i] = default_ioport_writew;
262
        ioport_write_table[2][i] = default_ioport_writel;
263
    }
264
}
265

    
266
void pstrcpy(char *buf, int buf_size, const char *str)
267
{
268
    int c;
269
    char *q = buf;
270

    
271
    if (buf_size <= 0)
272
        return;
273

    
274
    for(;;) {
275
        c = *str++;
276
        if (c == 0 || q >= buf + buf_size - 1)
277
            break;
278
        *q++ = c;
279
    }
280
    *q = '\0';
281
}
282

    
283
/* strcat and truncate. */
284
char *pstrcat(char *buf, int buf_size, const char *s)
285
{
286
    int len;
287
    len = strlen(buf);
288
    if (len < buf_size) 
289
        pstrcpy(buf + len, buf_size - len, s);
290
    return buf;
291
}
292

    
293
int strstart(const char *str, const char *val, const char **ptr)
294
{
295
    const char *p, *q;
296
    p = str;
297
    q = val;
298
    while (*q != '\0') {
299
        if (*p != *q)
300
            return 0;
301
        p++;
302
        q++;
303
    }
304
    if (ptr)
305
        *ptr = p;
306
    return 1;
307
}
308

    
309
/* return the size or -1 if error */
310
int get_image_size(const char *filename)
311
{
312
    int fd, size;
313
    fd = open(filename, O_RDONLY | O_BINARY);
314
    if (fd < 0)
315
        return -1;
316
    size = lseek(fd, 0, SEEK_END);
317
    close(fd);
318
    return size;
319
}
320

    
321
/* return the size or -1 if error */
322
int load_image(const char *filename, uint8_t *addr)
323
{
324
    int fd, size;
325
    fd = open(filename, O_RDONLY | O_BINARY);
326
    if (fd < 0)
327
        return -1;
328
    size = lseek(fd, 0, SEEK_END);
329
    lseek(fd, 0, SEEK_SET);
330
    if (read(fd, addr, size) != size) {
331
        close(fd);
332
        return -1;
333
    }
334
    close(fd);
335
    return size;
336
}
337

    
338
void cpu_outb(CPUState *env, int addr, int val)
339
{
340
#ifdef DEBUG_IOPORT
341
    if (loglevel & CPU_LOG_IOPORT)
342
        fprintf(logfile, "outb: %04x %02x\n", addr, val);
343
#endif    
344
    ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
345
}
346

    
347
void cpu_outw(CPUState *env, int addr, int val)
348
{
349
#ifdef DEBUG_IOPORT
350
    if (loglevel & CPU_LOG_IOPORT)
351
        fprintf(logfile, "outw: %04x %04x\n", addr, val);
352
#endif    
353
    ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
354
}
355

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

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

    
376
int cpu_inw(CPUState *env, int addr)
377
{
378
    int val;
379
    val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
380
#ifdef DEBUG_IOPORT
381
    if (loglevel & CPU_LOG_IOPORT)
382
        fprintf(logfile, "inw : %04x %04x\n", addr, val);
383
#endif
384
    return val;
385
}
386

    
387
int cpu_inl(CPUState *env, int addr)
388
{
389
    int val;
390
    val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
391
#ifdef DEBUG_IOPORT
392
    if (loglevel & CPU_LOG_IOPORT)
393
        fprintf(logfile, "inl : %04x %08x\n", addr, val);
394
#endif
395
    return val;
396
}
397

    
398
/***********************************************************/
399
void hw_error(const char *fmt, ...)
400
{
401
    va_list ap;
402

    
403
    va_start(ap, fmt);
404
    fprintf(stderr, "qemu: hardware error: ");
405
    vfprintf(stderr, fmt, ap);
406
    fprintf(stderr, "\n");
407
#ifdef TARGET_I386
408
    cpu_x86_dump_state(global_env, stderr, X86_DUMP_FPU | X86_DUMP_CCOP);
409
#else
410
    cpu_dump_state(global_env, stderr, 0);
411
#endif
412
    va_end(ap);
413
    abort();
414
}
415

    
416
/***********************************************************/
417
/* keyboard/mouse */
418

    
419
static QEMUPutKBDEvent *qemu_put_kbd_event;
420
static void *qemu_put_kbd_event_opaque;
421
static QEMUPutMouseEvent *qemu_put_mouse_event;
422
static void *qemu_put_mouse_event_opaque;
423

    
424
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
425
{
426
    qemu_put_kbd_event_opaque = opaque;
427
    qemu_put_kbd_event = func;
428
}
429

    
430
void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque)
431
{
432
    qemu_put_mouse_event_opaque = opaque;
433
    qemu_put_mouse_event = func;
434
}
435

    
436
void kbd_put_keycode(int keycode)
437
{
438
    if (qemu_put_kbd_event) {
439
        qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
440
    }
441
}
442

    
443
void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
444
{
445
    if (qemu_put_mouse_event) {
446
        qemu_put_mouse_event(qemu_put_mouse_event_opaque, 
447
                             dx, dy, dz, buttons_state);
448
    }
449
}
450

    
451
/***********************************************************/
452
/* timers */
453

    
454
#if defined(__powerpc__)
455

    
456
static inline uint32_t get_tbl(void) 
457
{
458
    uint32_t tbl;
459
    asm volatile("mftb %0" : "=r" (tbl));
460
    return tbl;
461
}
462

    
463
static inline uint32_t get_tbu(void) 
464
{
465
        uint32_t tbl;
466
        asm volatile("mftbu %0" : "=r" (tbl));
467
        return tbl;
468
}
469

    
470
int64_t cpu_get_real_ticks(void)
471
{
472
    uint32_t l, h, h1;
473
    /* NOTE: we test if wrapping has occurred */
474
    do {
475
        h = get_tbu();
476
        l = get_tbl();
477
        h1 = get_tbu();
478
    } while (h != h1);
479
    return ((int64_t)h << 32) | l;
480
}
481

    
482
#elif defined(__i386__)
483

    
484
int64_t cpu_get_real_ticks(void)
485
{
486
    int64_t val;
487
    asm volatile ("rdtsc" : "=A" (val));
488
    return val;
489
}
490

    
491
#elif defined(__x86_64__)
492

    
493
int64_t cpu_get_real_ticks(void)
494
{
495
    uint32_t low,high;
496
    int64_t val;
497
    asm volatile("rdtsc" : "=a" (low), "=d" (high));
498
    val = high;
499
    val <<= 32;
500
    val |= low;
501
    return val;
502
}
503

    
504
#else
505
#error unsupported CPU
506
#endif
507

    
508
static int64_t cpu_ticks_offset;
509
static int cpu_ticks_enabled;
510

    
511
static inline int64_t cpu_get_ticks(void)
512
{
513
    if (!cpu_ticks_enabled) {
514
        return cpu_ticks_offset;
515
    } else {
516
        return cpu_get_real_ticks() + cpu_ticks_offset;
517
    }
518
}
519

    
520
/* enable cpu_get_ticks() */
521
void cpu_enable_ticks(void)
522
{
523
    if (!cpu_ticks_enabled) {
524
        cpu_ticks_offset -= cpu_get_real_ticks();
525
        cpu_ticks_enabled = 1;
526
    }
527
}
528

    
529
/* disable cpu_get_ticks() : the clock is stopped. You must not call
530
   cpu_get_ticks() after that.  */
531
void cpu_disable_ticks(void)
532
{
533
    if (cpu_ticks_enabled) {
534
        cpu_ticks_offset = cpu_get_ticks();
535
        cpu_ticks_enabled = 0;
536
    }
537
}
538

    
539
static int64_t get_clock(void)
540
{
541
#ifdef _WIN32
542
    struct _timeb tb;
543
    _ftime(&tb);
544
    return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
545
#else
546
    struct timeval tv;
547
    gettimeofday(&tv, NULL);
548
    return tv.tv_sec * 1000000LL + tv.tv_usec;
549
#endif
550
}
551

    
552
void cpu_calibrate_ticks(void)
553
{
554
    int64_t usec, ticks;
555

    
556
    usec = get_clock();
557
    ticks = cpu_get_real_ticks();
558
#ifdef _WIN32
559
    Sleep(50);
560
#else
561
    usleep(50 * 1000);
562
#endif
563
    usec = get_clock() - usec;
564
    ticks = cpu_get_real_ticks() - ticks;
565
    ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
566
}
567

    
568
/* compute with 96 bit intermediate result: (a*b)/c */
569
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
570
{
571
    union {
572
        uint64_t ll;
573
        struct {
574
#ifdef WORDS_BIGENDIAN
575
            uint32_t high, low;
576
#else
577
            uint32_t low, high;
578
#endif            
579
        } l;
580
    } u, res;
581
    uint64_t rl, rh;
582

    
583
    u.ll = a;
584
    rl = (uint64_t)u.l.low * (uint64_t)b;
585
    rh = (uint64_t)u.l.high * (uint64_t)b;
586
    rh += (rl >> 32);
587
    res.l.high = rh / c;
588
    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
589
    return res.ll;
590
}
591

    
592
#define QEMU_TIMER_REALTIME 0
593
#define QEMU_TIMER_VIRTUAL  1
594

    
595
struct QEMUClock {
596
    int type;
597
    /* XXX: add frequency */
598
};
599

    
600
struct QEMUTimer {
601
    QEMUClock *clock;
602
    int64_t expire_time;
603
    QEMUTimerCB *cb;
604
    void *opaque;
605
    struct QEMUTimer *next;
606
};
607

    
608
QEMUClock *rt_clock;
609
QEMUClock *vm_clock;
610

    
611
static QEMUTimer *active_timers[2];
612
#ifdef _WIN32
613
static MMRESULT timerID;
614
#else
615
/* frequency of the times() clock tick */
616
static int timer_freq;
617
#endif
618

    
619
QEMUClock *qemu_new_clock(int type)
620
{
621
    QEMUClock *clock;
622
    clock = qemu_mallocz(sizeof(QEMUClock));
623
    if (!clock)
624
        return NULL;
625
    clock->type = type;
626
    return clock;
627
}
628

    
629
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
630
{
631
    QEMUTimer *ts;
632

    
633
    ts = qemu_mallocz(sizeof(QEMUTimer));
634
    ts->clock = clock;
635
    ts->cb = cb;
636
    ts->opaque = opaque;
637
    return ts;
638
}
639

    
640
void qemu_free_timer(QEMUTimer *ts)
641
{
642
    qemu_free(ts);
643
}
644

    
645
/* stop a timer, but do not dealloc it */
646
void qemu_del_timer(QEMUTimer *ts)
647
{
648
    QEMUTimer **pt, *t;
649

    
650
    /* NOTE: this code must be signal safe because
651
       qemu_timer_expired() can be called from a signal. */
652
    pt = &active_timers[ts->clock->type];
653
    for(;;) {
654
        t = *pt;
655
        if (!t)
656
            break;
657
        if (t == ts) {
658
            *pt = t->next;
659
            break;
660
        }
661
        pt = &t->next;
662
    }
663
}
664

    
665
/* modify the current timer so that it will be fired when current_time
666
   >= expire_time. The corresponding callback will be called. */
667
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
668
{
669
    QEMUTimer **pt, *t;
670

    
671
    qemu_del_timer(ts);
672

    
673
    /* add the timer in the sorted list */
674
    /* NOTE: this code must be signal safe because
675
       qemu_timer_expired() can be called from a signal. */
676
    pt = &active_timers[ts->clock->type];
677
    for(;;) {
678
        t = *pt;
679
        if (!t)
680
            break;
681
        if (t->expire_time > expire_time) 
682
            break;
683
        pt = &t->next;
684
    }
685
    ts->expire_time = expire_time;
686
    ts->next = *pt;
687
    *pt = ts;
688
}
689

    
690
int qemu_timer_pending(QEMUTimer *ts)
691
{
692
    QEMUTimer *t;
693
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
694
        if (t == ts)
695
            return 1;
696
    }
697
    return 0;
698
}
699

    
700
static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
701
{
702
    if (!timer_head)
703
        return 0;
704
    return (timer_head->expire_time <= current_time);
705
}
706

    
707
static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
708
{
709
    QEMUTimer *ts;
710
    
711
    for(;;) {
712
        ts = *ptimer_head;
713
        if (ts->expire_time > current_time)
714
            break;
715
        /* remove timer from the list before calling the callback */
716
        *ptimer_head = ts->next;
717
        ts->next = NULL;
718
        
719
        /* run the callback (the timer list can be modified) */
720
        ts->cb(ts->opaque);
721
    }
722
}
723

    
724
int64_t qemu_get_clock(QEMUClock *clock)
725
{
726
    switch(clock->type) {
727
    case QEMU_TIMER_REALTIME:
728
#ifdef _WIN32
729
        return GetTickCount();
730
#else
731
        {
732
            struct tms tp;
733

    
734
            /* Note that using gettimeofday() is not a good solution
735
               for timers because its value change when the date is
736
               modified. */
737
            if (timer_freq == 100) {
738
                return times(&tp) * 10;
739
            } else {
740
                return ((int64_t)times(&tp) * 1000) / timer_freq;
741
            }
742
        }
743
#endif
744
    default:
745
    case QEMU_TIMER_VIRTUAL:
746
        return cpu_get_ticks();
747
    }
748
}
749

    
750
/* save a timer */
751
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
752
{
753
    uint64_t expire_time;
754

    
755
    if (qemu_timer_pending(ts)) {
756
        expire_time = ts->expire_time;
757
    } else {
758
        expire_time = -1;
759
    }
760
    qemu_put_be64(f, expire_time);
761
}
762

    
763
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
764
{
765
    uint64_t expire_time;
766

    
767
    expire_time = qemu_get_be64(f);
768
    if (expire_time != -1) {
769
        qemu_mod_timer(ts, expire_time);
770
    } else {
771
        qemu_del_timer(ts);
772
    }
773
}
774

    
775
static void timer_save(QEMUFile *f, void *opaque)
776
{
777
    if (cpu_ticks_enabled) {
778
        hw_error("cannot save state if virtual timers are running");
779
    }
780
    qemu_put_be64s(f, &cpu_ticks_offset);
781
    qemu_put_be64s(f, &ticks_per_sec);
782
}
783

    
784
static int timer_load(QEMUFile *f, void *opaque, int version_id)
785
{
786
    if (version_id != 1)
787
        return -EINVAL;
788
    if (cpu_ticks_enabled) {
789
        return -EINVAL;
790
    }
791
    qemu_get_be64s(f, &cpu_ticks_offset);
792
    qemu_get_be64s(f, &ticks_per_sec);
793
    return 0;
794
}
795

    
796
#ifdef _WIN32
797
void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg, 
798
                                 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
799
#else
800
static void host_alarm_handler(int host_signum)
801
#endif
802
{
803
#if 0
804
#define DISP_FREQ 1000
805
    {
806
        static int64_t delta_min = INT64_MAX;
807
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
808
        static int count;
809
        ti = qemu_get_clock(vm_clock);
810
        if (last_clock != 0) {
811
            delta = ti - last_clock;
812
            if (delta < delta_min)
813
                delta_min = delta;
814
            if (delta > delta_max)
815
                delta_max = delta;
816
            delta_cum += delta;
817
            if (++count == DISP_FREQ) {
818
                printf("timer: min=%lld us max=%lld us avg=%lld us avg_freq=%0.3f Hz\n",
819
                       muldiv64(delta_min, 1000000, ticks_per_sec),
820
                       muldiv64(delta_max, 1000000, ticks_per_sec),
821
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
822
                       (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
823
                count = 0;
824
                delta_min = INT64_MAX;
825
                delta_max = 0;
826
                delta_cum = 0;
827
            }
828
        }
829
        last_clock = ti;
830
    }
831
#endif
832
    if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
833
                           qemu_get_clock(vm_clock)) ||
834
        qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
835
                           qemu_get_clock(rt_clock))) {
836
        /* stop the cpu because a timer occured */
837
        cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
838
    }
839
}
840

    
841
#ifndef _WIN32
842

    
843
#if defined(__linux__)
844

    
845
#define RTC_FREQ 1024
846

    
847
static int rtc_fd;
848

    
849
static int start_rtc_timer(void)
850
{
851
    rtc_fd = open("/dev/rtc", O_RDONLY);
852
    if (rtc_fd < 0)
853
        return -1;
854
    if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
855
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
856
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
857
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
858
        goto fail;
859
    }
860
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
861
    fail:
862
        close(rtc_fd);
863
        return -1;
864
    }
865
    pit_min_timer_count = PIT_FREQ / RTC_FREQ;
866
    return 0;
867
}
868

    
869
#else
870

    
871
static int start_rtc_timer(void)
872
{
873
    return -1;
874
}
875

    
876
#endif /* !defined(__linux__) */
877

    
878
#endif /* !defined(_WIN32) */
879

    
880
static void init_timers(void)
881
{
882
    rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
883
    vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
884

    
885
#ifdef _WIN32
886
    {
887
        int count=0;
888
        timerID = timeSetEvent(10,    // interval (ms)
889
                               0,     // resolution
890
                               host_alarm_handler, // function
891
                               (DWORD)&count,  // user parameter
892
                               TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
893
         if( !timerID ) {
894
            perror("failed timer alarm");
895
            exit(1);
896
         }
897
    }
898
    pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
899
#else
900
    {
901
        struct sigaction act;
902
        struct itimerval itv;
903
        
904
        /* get times() syscall frequency */
905
        timer_freq = sysconf(_SC_CLK_TCK);
906
        
907
        /* timer signal */
908
        sigfillset(&act.sa_mask);
909
        act.sa_flags = 0;
910
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
911
        act.sa_flags |= SA_ONSTACK;
912
#endif
913
        act.sa_handler = host_alarm_handler;
914
        sigaction(SIGALRM, &act, NULL);
915

    
916
        itv.it_interval.tv_sec = 0;
917
        itv.it_interval.tv_usec = 1000;
918
        itv.it_value.tv_sec = 0;
919
        itv.it_value.tv_usec = 10 * 1000;
920
        setitimer(ITIMER_REAL, &itv, NULL);
921
        /* we probe the tick duration of the kernel to inform the user if
922
           the emulated kernel requested a too high timer frequency */
923
        getitimer(ITIMER_REAL, &itv);
924

    
925
#if defined(__linux__)
926
        if (itv.it_interval.tv_usec > 1000) {
927
            /* try to use /dev/rtc to have a faster timer */
928
            if (start_rtc_timer() < 0)
929
                goto use_itimer;
930
            /* disable itimer */
931
            itv.it_interval.tv_sec = 0;
932
            itv.it_interval.tv_usec = 0;
933
            itv.it_value.tv_sec = 0;
934
            itv.it_value.tv_usec = 0;
935
            setitimer(ITIMER_REAL, &itv, NULL);
936

    
937
            /* use the RTC */
938
            sigaction(SIGIO, &act, NULL);
939
            fcntl(rtc_fd, F_SETFL, O_ASYNC);
940
            fcntl(rtc_fd, F_SETOWN, getpid());
941
        } else 
942
#endif /* defined(__linux__) */
943
        {
944
        use_itimer:
945
            pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec * 
946
                                   PIT_FREQ) / 1000000;
947
        }
948
    }
949
#endif
950
}
951

    
952
void quit_timers(void)
953
{
954
#ifdef _WIN32
955
    timeKillEvent(timerID);
956
#endif
957
}
958

    
959
/***********************************************************/
960
/* character device */
961

    
962
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
963
{
964
    return s->chr_write(s, buf, len);
965
}
966

    
967
void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
968
{
969
    char buf[4096];
970
    va_list ap;
971
    va_start(ap, fmt);
972
    vsnprintf(buf, sizeof(buf), fmt, ap);
973
    qemu_chr_write(s, buf, strlen(buf));
974
    va_end(ap);
975
}
976

    
977
void qemu_chr_send_event(CharDriverState *s, int event)
978
{
979
    if (s->chr_send_event)
980
        s->chr_send_event(s, event);
981
}
982

    
983
void qemu_chr_add_read_handler(CharDriverState *s, 
984
                               IOCanRWHandler *fd_can_read, 
985
                               IOReadHandler *fd_read, void *opaque)
986
{
987
    s->chr_add_read_handler(s, fd_can_read, fd_read, opaque);
988
}
989
             
990
void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event)
991
{
992
    s->chr_event = chr_event;
993
}
994

    
995
static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
996
{
997
    return len;
998
}
999

    
1000
static void null_chr_add_read_handler(CharDriverState *chr, 
1001
                                    IOCanRWHandler *fd_can_read, 
1002
                                    IOReadHandler *fd_read, void *opaque)
1003
{
1004
}
1005

    
1006
CharDriverState *qemu_chr_open_null(void)
1007
{
1008
    CharDriverState *chr;
1009

    
1010
    chr = qemu_mallocz(sizeof(CharDriverState));
1011
    if (!chr)
1012
        return NULL;
1013
    chr->chr_write = null_chr_write;
1014
    chr->chr_add_read_handler = null_chr_add_read_handler;
1015
    return chr;
1016
}
1017

    
1018
#ifndef _WIN32
1019

    
1020
typedef struct {
1021
    int fd_in, fd_out;
1022
    /* for nographic stdio only */
1023
    IOCanRWHandler *fd_can_read; 
1024
    IOReadHandler *fd_read;
1025
    void *fd_opaque;
1026
} FDCharDriver;
1027

    
1028
#define STDIO_MAX_CLIENTS 2
1029

    
1030
static int stdio_nb_clients;
1031
static CharDriverState *stdio_clients[STDIO_MAX_CLIENTS];
1032

    
1033
static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1034
{
1035
    FDCharDriver *s = chr->opaque;
1036
    return write(s->fd_out, buf, len);
1037
}
1038

    
1039
static void fd_chr_add_read_handler(CharDriverState *chr, 
1040
                                    IOCanRWHandler *fd_can_read, 
1041
                                    IOReadHandler *fd_read, void *opaque)
1042
{
1043
    FDCharDriver *s = chr->opaque;
1044

    
1045
    if (nographic && s->fd_in == 0) {
1046
        s->fd_can_read = fd_can_read;
1047
        s->fd_read = fd_read;
1048
        s->fd_opaque = opaque;
1049
    } else {
1050
        qemu_add_fd_read_handler(s->fd_in, fd_can_read, fd_read, opaque);
1051
    }
1052
}
1053

    
1054
/* open a character device to a unix fd */
1055
CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1056
{
1057
    CharDriverState *chr;
1058
    FDCharDriver *s;
1059

    
1060
    chr = qemu_mallocz(sizeof(CharDriverState));
1061
    if (!chr)
1062
        return NULL;
1063
    s = qemu_mallocz(sizeof(FDCharDriver));
1064
    if (!s) {
1065
        free(chr);
1066
        return NULL;
1067
    }
1068
    s->fd_in = fd_in;
1069
    s->fd_out = fd_out;
1070
    chr->opaque = s;
1071
    chr->chr_write = fd_chr_write;
1072
    chr->chr_add_read_handler = fd_chr_add_read_handler;
1073
    return chr;
1074
}
1075

    
1076
/* for STDIO, we handle the case where several clients use it
1077
   (nographic mode) */
1078

    
1079
#define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
1080

    
1081
static int term_got_escape, client_index;
1082

    
1083
void term_print_help(void)
1084
{
1085
    printf("\n"
1086
           "C-a h    print this help\n"
1087
           "C-a x    exit emulator\n"
1088
           "C-a s    save disk data back to file (if -snapshot)\n"
1089
           "C-a b    send break (magic sysrq)\n"
1090
           "C-a c    switch between console and monitor\n"
1091
           "C-a C-a  send C-a\n"
1092
           );
1093
}
1094

    
1095
/* called when a char is received */
1096
static void stdio_received_byte(int ch)
1097
{
1098
    if (term_got_escape) {
1099
        term_got_escape = 0;
1100
        switch(ch) {
1101
        case 'h':
1102
            term_print_help();
1103
            break;
1104
        case 'x':
1105
            exit(0);
1106
            break;
1107
        case 's': 
1108
            {
1109
                int i;
1110
                for (i = 0; i < MAX_DISKS; i++) {
1111
                    if (bs_table[i])
1112
                        bdrv_commit(bs_table[i]);
1113
                }
1114
            }
1115
            break;
1116
        case 'b':
1117
            if (client_index < stdio_nb_clients) {
1118
                CharDriverState *chr;
1119
                FDCharDriver *s;
1120

    
1121
                chr = stdio_clients[client_index];
1122
                s = chr->opaque;
1123
                chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK);
1124
            }
1125
            break;
1126
        case 'c':
1127
            client_index++;
1128
            if (client_index >= stdio_nb_clients)
1129
                client_index = 0;
1130
            if (client_index == 0) {
1131
                /* send a new line in the monitor to get the prompt */
1132
                ch = '\r';
1133
                goto send_char;
1134
            }
1135
            break;
1136
        case TERM_ESCAPE:
1137
            goto send_char;
1138
        }
1139
    } else if (ch == TERM_ESCAPE) {
1140
        term_got_escape = 1;
1141
    } else {
1142
    send_char:
1143
        if (client_index < stdio_nb_clients) {
1144
            uint8_t buf[1];
1145
            CharDriverState *chr;
1146
            FDCharDriver *s;
1147
            
1148
            chr = stdio_clients[client_index];
1149
            s = chr->opaque;
1150
            buf[0] = ch;
1151
            /* XXX: should queue the char if the device is not
1152
               ready */
1153
            if (s->fd_can_read(s->fd_opaque) > 0) 
1154
                s->fd_read(s->fd_opaque, buf, 1);
1155
        }
1156
    }
1157
}
1158

    
1159
static int stdio_can_read(void *opaque)
1160
{
1161
    /* XXX: not strictly correct */
1162
    return 1;
1163
}
1164

    
1165
static void stdio_read(void *opaque, const uint8_t *buf, int size)
1166
{
1167
    int i;
1168
    for(i = 0; i < size; i++)
1169
        stdio_received_byte(buf[i]);
1170
}
1171

    
1172
/* init terminal so that we can grab keys */
1173
static struct termios oldtty;
1174
static int old_fd0_flags;
1175

    
1176
static void term_exit(void)
1177
{
1178
    tcsetattr (0, TCSANOW, &oldtty);
1179
    fcntl(0, F_SETFL, old_fd0_flags);
1180
}
1181

    
1182
static void term_init(void)
1183
{
1184
    struct termios tty;
1185

    
1186
    tcgetattr (0, &tty);
1187
    oldtty = tty;
1188
    old_fd0_flags = fcntl(0, F_GETFL);
1189

    
1190
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1191
                          |INLCR|IGNCR|ICRNL|IXON);
1192
    tty.c_oflag |= OPOST;
1193
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1194
    /* if graphical mode, we allow Ctrl-C handling */
1195
    if (nographic)
1196
        tty.c_lflag &= ~ISIG;
1197
    tty.c_cflag &= ~(CSIZE|PARENB);
1198
    tty.c_cflag |= CS8;
1199
    tty.c_cc[VMIN] = 1;
1200
    tty.c_cc[VTIME] = 0;
1201
    
1202
    tcsetattr (0, TCSANOW, &tty);
1203

    
1204
    atexit(term_exit);
1205

    
1206
    fcntl(0, F_SETFL, O_NONBLOCK);
1207
}
1208

    
1209
CharDriverState *qemu_chr_open_stdio(void)
1210
{
1211
    CharDriverState *chr;
1212

    
1213
    if (nographic) {
1214
        if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1215
            return NULL;
1216
        chr = qemu_chr_open_fd(0, 1);
1217
        if (stdio_nb_clients == 0)
1218
            qemu_add_fd_read_handler(0, stdio_can_read, stdio_read, NULL);
1219
        client_index = stdio_nb_clients;
1220
    } else {
1221
        if (stdio_nb_clients != 0)
1222
            return NULL;
1223
        chr = qemu_chr_open_fd(0, 1);
1224
    }
1225
    stdio_clients[stdio_nb_clients++] = chr;
1226
    if (stdio_nb_clients == 1) {
1227
        /* set the terminal in raw mode */
1228
        term_init();
1229
    }
1230
    return chr;
1231
}
1232

    
1233
#if defined(__linux__)
1234
CharDriverState *qemu_chr_open_pty(void)
1235
{
1236
    char slave_name[1024];
1237
    int master_fd, slave_fd;
1238
    
1239
    /* Not satisfying */
1240
    if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
1241
        return NULL;
1242
    }
1243
    fprintf(stderr, "char device redirected to %s\n", slave_name);
1244
    return qemu_chr_open_fd(master_fd, master_fd);
1245
}
1246
#else
1247
CharDriverState *qemu_chr_open_pty(void)
1248
{
1249
    return NULL;
1250
}
1251
#endif
1252

    
1253
#endif /* !defined(_WIN32) */
1254

    
1255
CharDriverState *qemu_chr_open(const char *filename)
1256
{
1257
    if (!strcmp(filename, "vc")) {
1258
        return text_console_init(&display_state);
1259
    } else if (!strcmp(filename, "null")) {
1260
        return qemu_chr_open_null();
1261
    } else 
1262
#ifndef _WIN32
1263
    if (!strcmp(filename, "pty")) {
1264
        return qemu_chr_open_pty();
1265
    } else if (!strcmp(filename, "stdio")) {
1266
        return qemu_chr_open_stdio();
1267
    } else 
1268
#endif
1269
    {
1270
        return NULL;
1271
    }
1272
}
1273

    
1274
/***********************************************************/
1275
/* Linux network device redirectors */
1276

    
1277
void hex_dump(FILE *f, const uint8_t *buf, int size)
1278
{
1279
    int len, i, j, c;
1280

    
1281
    for(i=0;i<size;i+=16) {
1282
        len = size - i;
1283
        if (len > 16)
1284
            len = 16;
1285
        fprintf(f, "%08x ", i);
1286
        for(j=0;j<16;j++) {
1287
            if (j < len)
1288
                fprintf(f, " %02x", buf[i+j]);
1289
            else
1290
                fprintf(f, "   ");
1291
        }
1292
        fprintf(f, " ");
1293
        for(j=0;j<len;j++) {
1294
            c = buf[i+j];
1295
            if (c < ' ' || c > '~')
1296
                c = '.';
1297
            fprintf(f, "%c", c);
1298
        }
1299
        fprintf(f, "\n");
1300
    }
1301
}
1302

    
1303
void qemu_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1304
{
1305
    nd->send_packet(nd, buf, size);
1306
}
1307

    
1308
void qemu_add_read_packet(NetDriverState *nd, IOCanRWHandler *fd_can_read, 
1309
                          IOReadHandler *fd_read, void *opaque)
1310
{
1311
    nd->add_read_packet(nd, fd_can_read, fd_read, opaque);
1312
}
1313

    
1314
/* dummy network adapter */
1315

    
1316
static void dummy_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1317
{
1318
}
1319

    
1320
static void dummy_add_read_packet(NetDriverState *nd, 
1321
                                  IOCanRWHandler *fd_can_read, 
1322
                                  IOReadHandler *fd_read, void *opaque)
1323
{
1324
}
1325

    
1326
static int net_dummy_init(NetDriverState *nd)
1327
{
1328
    nd->send_packet = dummy_send_packet;
1329
    nd->add_read_packet = dummy_add_read_packet;
1330
    pstrcpy(nd->ifname, sizeof(nd->ifname), "dummy");
1331
    return 0;
1332
}
1333

    
1334
#if defined(CONFIG_SLIRP)
1335

    
1336
/* slirp network adapter */
1337

    
1338
static void *slirp_fd_opaque;
1339
static IOCanRWHandler *slirp_fd_can_read;
1340
static IOReadHandler *slirp_fd_read;
1341
static int slirp_inited;
1342

    
1343
int slirp_can_output(void)
1344
{
1345
    return slirp_fd_can_read(slirp_fd_opaque);
1346
}
1347

    
1348
void slirp_output(const uint8_t *pkt, int pkt_len)
1349
{
1350
#if 0
1351
    printf("output:\n");
1352
    hex_dump(stdout, pkt, pkt_len);
1353
#endif
1354
    slirp_fd_read(slirp_fd_opaque, pkt, pkt_len);
1355
}
1356

    
1357
static void slirp_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1358
{
1359
#if 0
1360
    printf("input:\n");
1361
    hex_dump(stdout, buf, size);
1362
#endif
1363
    slirp_input(buf, size);
1364
}
1365

    
1366
static void slirp_add_read_packet(NetDriverState *nd, 
1367
                                  IOCanRWHandler *fd_can_read, 
1368
                                  IOReadHandler *fd_read, void *opaque)
1369
{
1370
    slirp_fd_opaque = opaque;
1371
    slirp_fd_can_read = fd_can_read;
1372
    slirp_fd_read = fd_read;
1373
}
1374

    
1375
static int net_slirp_init(NetDriverState *nd)
1376
{
1377
    if (!slirp_inited) {
1378
        slirp_inited = 1;
1379
        slirp_init();
1380
    }
1381
    nd->send_packet = slirp_send_packet;
1382
    nd->add_read_packet = slirp_add_read_packet;
1383
    pstrcpy(nd->ifname, sizeof(nd->ifname), "slirp");
1384
    return 0;
1385
}
1386

    
1387
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
1388
{
1389
    const char *p, *p1;
1390
    int len;
1391
    p = *pp;
1392
    p1 = strchr(p, sep);
1393
    if (!p1)
1394
        return -1;
1395
    len = p1 - p;
1396
    p1++;
1397
    if (buf_size > 0) {
1398
        if (len > buf_size - 1)
1399
            len = buf_size - 1;
1400
        memcpy(buf, p, len);
1401
        buf[len] = '\0';
1402
    }
1403
    *pp = p1;
1404
    return 0;
1405
}
1406

    
1407
static void net_slirp_redir(const char *redir_str)
1408
{
1409
    int is_udp;
1410
    char buf[256], *r;
1411
    const char *p;
1412
    struct in_addr guest_addr;
1413
    int host_port, guest_port;
1414
    
1415
    if (!slirp_inited) {
1416
        slirp_inited = 1;
1417
        slirp_init();
1418
    }
1419

    
1420
    p = redir_str;
1421
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
1422
        goto fail;
1423
    if (!strcmp(buf, "tcp")) {
1424
        is_udp = 0;
1425
    } else if (!strcmp(buf, "udp")) {
1426
        is_udp = 1;
1427
    } else {
1428
        goto fail;
1429
    }
1430

    
1431
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
1432
        goto fail;
1433
    host_port = strtol(buf, &r, 0);
1434
    if (r == buf)
1435
        goto fail;
1436

    
1437
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
1438
        goto fail;
1439
    if (buf[0] == '\0') {
1440
        pstrcpy(buf, sizeof(buf), "10.0.2.15");
1441
    }
1442
    if (!inet_aton(buf, &guest_addr))
1443
        goto fail;
1444
    
1445
    guest_port = strtol(p, &r, 0);
1446
    if (r == p)
1447
        goto fail;
1448
    
1449
    if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
1450
        fprintf(stderr, "qemu: could not set up redirection\n");
1451
        exit(1);
1452
    }
1453
    return;
1454
 fail:
1455
    fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
1456
    exit(1);
1457
}
1458
    
1459
#ifndef _WIN32
1460

    
1461
char smb_dir[1024];
1462

    
1463
static void smb_exit(void)
1464
{
1465
    DIR *d;
1466
    struct dirent *de;
1467
    char filename[1024];
1468

    
1469
    /* erase all the files in the directory */
1470
    d = opendir(smb_dir);
1471
    for(;;) {
1472
        de = readdir(d);
1473
        if (!de)
1474
            break;
1475
        if (strcmp(de->d_name, ".") != 0 &&
1476
            strcmp(de->d_name, "..") != 0) {
1477
            snprintf(filename, sizeof(filename), "%s/%s", 
1478
                     smb_dir, de->d_name);
1479
            unlink(filename);
1480
        }
1481
    }
1482
    closedir(d);
1483
    rmdir(smb_dir);
1484
}
1485

    
1486
/* automatic user mode samba server configuration */
1487
void net_slirp_smb(const char *exported_dir)
1488
{
1489
    char smb_conf[1024];
1490
    char smb_cmdline[1024];
1491
    FILE *f;
1492

    
1493
    if (!slirp_inited) {
1494
        slirp_inited = 1;
1495
        slirp_init();
1496
    }
1497

    
1498
    /* XXX: better tmp dir construction */
1499
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
1500
    if (mkdir(smb_dir, 0700) < 0) {
1501
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
1502
        exit(1);
1503
    }
1504
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
1505
    
1506
    f = fopen(smb_conf, "w");
1507
    if (!f) {
1508
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
1509
        exit(1);
1510
    }
1511
    fprintf(f, 
1512
            "[global]\n"
1513
            "pid directory=%s\n"
1514
            "lock directory=%s\n"
1515
            "log file=%s/log.smbd\n"
1516
            "smb passwd file=%s/smbpasswd\n"
1517
            "security = share\n"
1518
            "[qemu]\n"
1519
            "path=%s\n"
1520
            "read only=no\n"
1521
            "guest ok=yes\n",
1522
            smb_dir,
1523
            smb_dir,
1524
            smb_dir,
1525
            smb_dir,
1526
            exported_dir
1527
            );
1528
    fclose(f);
1529
    atexit(smb_exit);
1530

    
1531
    snprintf(smb_cmdline, sizeof(smb_cmdline), "/usr/sbin/smbd -s %s",
1532
             smb_conf);
1533
    
1534
    slirp_add_exec(0, smb_cmdline, 4, 139);
1535
}
1536

    
1537
#endif /* !defined(_WIN32) */
1538

    
1539
#endif /* CONFIG_SLIRP */
1540

    
1541
#if !defined(_WIN32)
1542
#ifdef _BSD
1543
static int tun_open(char *ifname, int ifname_size)
1544
{
1545
    int fd;
1546
    char *dev;
1547
    struct stat s;
1548

    
1549
    fd = open("/dev/tap", O_RDWR);
1550
    if (fd < 0) {
1551
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1552
        return -1;
1553
    }
1554

    
1555
    fstat(fd, &s);
1556
    dev = devname(s.st_rdev, S_IFCHR);
1557
    pstrcpy(ifname, ifname_size, dev);
1558

    
1559
    fcntl(fd, F_SETFL, O_NONBLOCK);
1560
    return fd;
1561
}
1562
#else
1563
static int tun_open(char *ifname, int ifname_size)
1564
{
1565
    struct ifreq ifr;
1566
    int fd, ret;
1567
    
1568
    fd = open("/dev/net/tun", O_RDWR);
1569
    if (fd < 0) {
1570
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1571
        return -1;
1572
    }
1573
    memset(&ifr, 0, sizeof(ifr));
1574
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1575
    pstrcpy(ifr.ifr_name, IFNAMSIZ, "tun%d");
1576
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1577
    if (ret != 0) {
1578
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1579
        close(fd);
1580
        return -1;
1581
    }
1582
    printf("Connected to host network interface: %s\n", ifr.ifr_name);
1583
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1584
    fcntl(fd, F_SETFL, O_NONBLOCK);
1585
    return fd;
1586
}
1587
#endif
1588

    
1589
static void tun_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1590
{
1591
    write(nd->fd, buf, size);
1592
}
1593

    
1594
static void tun_add_read_packet(NetDriverState *nd, 
1595
                                IOCanRWHandler *fd_can_read, 
1596
                                IOReadHandler *fd_read, void *opaque)
1597
{
1598
    qemu_add_fd_read_handler(nd->fd, fd_can_read, fd_read, opaque);
1599
}
1600

    
1601
static int net_tun_init(NetDriverState *nd)
1602
{
1603
    int pid, status;
1604
    char *args[3];
1605
    char **parg;
1606

    
1607
    nd->fd = tun_open(nd->ifname, sizeof(nd->ifname));
1608
    if (nd->fd < 0)
1609
        return -1;
1610

    
1611
    /* try to launch network init script */
1612
    pid = fork();
1613
    if (pid >= 0) {
1614
        if (pid == 0) {
1615
            parg = args;
1616
            *parg++ = network_script;
1617
            *parg++ = nd->ifname;
1618
            *parg++ = NULL;
1619
            execv(network_script, args);
1620
            exit(1);
1621
        }
1622
        while (waitpid(pid, &status, 0) != pid);
1623
        if (!WIFEXITED(status) ||
1624
            WEXITSTATUS(status) != 0) {
1625
            fprintf(stderr, "%s: could not launch network script\n",
1626
                    network_script);
1627
        }
1628
    }
1629
    nd->send_packet = tun_send_packet;
1630
    nd->add_read_packet = tun_add_read_packet;
1631
    return 0;
1632
}
1633

    
1634
static int net_fd_init(NetDriverState *nd, int fd)
1635
{
1636
    nd->fd = fd;
1637
    nd->send_packet = tun_send_packet;
1638
    nd->add_read_packet = tun_add_read_packet;
1639
    pstrcpy(nd->ifname, sizeof(nd->ifname), "tunfd");
1640
    return 0;
1641
}
1642

    
1643
#endif /* !_WIN32 */
1644

    
1645
/***********************************************************/
1646
/* dumb display */
1647

    
1648
static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
1649
{
1650
}
1651

    
1652
static void dumb_resize(DisplayState *ds, int w, int h)
1653
{
1654
}
1655

    
1656
static void dumb_refresh(DisplayState *ds)
1657
{
1658
    vga_update_display();
1659
}
1660

    
1661
void dumb_display_init(DisplayState *ds)
1662
{
1663
    ds->data = NULL;
1664
    ds->linesize = 0;
1665
    ds->depth = 0;
1666
    ds->dpy_update = dumb_update;
1667
    ds->dpy_resize = dumb_resize;
1668
    ds->dpy_refresh = dumb_refresh;
1669
}
1670

    
1671
#if !defined(CONFIG_SOFTMMU)
1672
/***********************************************************/
1673
/* cpu signal handler */
1674
static void host_segv_handler(int host_signum, siginfo_t *info, 
1675
                              void *puc)
1676
{
1677
    if (cpu_signal_handler(host_signum, info, puc))
1678
        return;
1679
    if (stdio_nb_clients > 0)
1680
        term_exit();
1681
    abort();
1682
}
1683
#endif
1684

    
1685
/***********************************************************/
1686
/* I/O handling */
1687

    
1688
#define MAX_IO_HANDLERS 64
1689

    
1690
typedef struct IOHandlerRecord {
1691
    int fd;
1692
    IOCanRWHandler *fd_can_read;
1693
    IOReadHandler *fd_read;
1694
    void *opaque;
1695
    /* temporary data */
1696
    struct pollfd *ufd;
1697
    int max_size;
1698
    struct IOHandlerRecord *next;
1699
} IOHandlerRecord;
1700

    
1701
static IOHandlerRecord *first_io_handler;
1702

    
1703
int qemu_add_fd_read_handler(int fd, IOCanRWHandler *fd_can_read, 
1704
                             IOReadHandler *fd_read, void *opaque)
1705
{
1706
    IOHandlerRecord *ioh;
1707

    
1708
    ioh = qemu_mallocz(sizeof(IOHandlerRecord));
1709
    if (!ioh)
1710
        return -1;
1711
    ioh->fd = fd;
1712
    ioh->fd_can_read = fd_can_read;
1713
    ioh->fd_read = fd_read;
1714
    ioh->opaque = opaque;
1715
    ioh->next = first_io_handler;
1716
    first_io_handler = ioh;
1717
    return 0;
1718
}
1719

    
1720
void qemu_del_fd_read_handler(int fd)
1721
{
1722
    IOHandlerRecord **pioh, *ioh;
1723

    
1724
    pioh = &first_io_handler;
1725
    for(;;) {
1726
        ioh = *pioh;
1727
        if (ioh == NULL)
1728
            break;
1729
        if (ioh->fd == fd) {
1730
            *pioh = ioh->next;
1731
            break;
1732
        }
1733
        pioh = &ioh->next;
1734
    }
1735
}
1736

    
1737
/***********************************************************/
1738
/* savevm/loadvm support */
1739

    
1740
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
1741
{
1742
    fwrite(buf, 1, size, f);
1743
}
1744

    
1745
void qemu_put_byte(QEMUFile *f, int v)
1746
{
1747
    fputc(v, f);
1748
}
1749

    
1750
void qemu_put_be16(QEMUFile *f, unsigned int v)
1751
{
1752
    qemu_put_byte(f, v >> 8);
1753
    qemu_put_byte(f, v);
1754
}
1755

    
1756
void qemu_put_be32(QEMUFile *f, unsigned int v)
1757
{
1758
    qemu_put_byte(f, v >> 24);
1759
    qemu_put_byte(f, v >> 16);
1760
    qemu_put_byte(f, v >> 8);
1761
    qemu_put_byte(f, v);
1762
}
1763

    
1764
void qemu_put_be64(QEMUFile *f, uint64_t v)
1765
{
1766
    qemu_put_be32(f, v >> 32);
1767
    qemu_put_be32(f, v);
1768
}
1769

    
1770
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
1771
{
1772
    return fread(buf, 1, size, f);
1773
}
1774

    
1775
int qemu_get_byte(QEMUFile *f)
1776
{
1777
    int v;
1778
    v = fgetc(f);
1779
    if (v == EOF)
1780
        return 0;
1781
    else
1782
        return v;
1783
}
1784

    
1785
unsigned int qemu_get_be16(QEMUFile *f)
1786
{
1787
    unsigned int v;
1788
    v = qemu_get_byte(f) << 8;
1789
    v |= qemu_get_byte(f);
1790
    return v;
1791
}
1792

    
1793
unsigned int qemu_get_be32(QEMUFile *f)
1794
{
1795
    unsigned int v;
1796
    v = qemu_get_byte(f) << 24;
1797
    v |= qemu_get_byte(f) << 16;
1798
    v |= qemu_get_byte(f) << 8;
1799
    v |= qemu_get_byte(f);
1800
    return v;
1801
}
1802

    
1803
uint64_t qemu_get_be64(QEMUFile *f)
1804
{
1805
    uint64_t v;
1806
    v = (uint64_t)qemu_get_be32(f) << 32;
1807
    v |= qemu_get_be32(f);
1808
    return v;
1809
}
1810

    
1811
int64_t qemu_ftell(QEMUFile *f)
1812
{
1813
    return ftell(f);
1814
}
1815

    
1816
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
1817
{
1818
    if (fseek(f, pos, whence) < 0)
1819
        return -1;
1820
    return ftell(f);
1821
}
1822

    
1823
typedef struct SaveStateEntry {
1824
    char idstr[256];
1825
    int instance_id;
1826
    int version_id;
1827
    SaveStateHandler *save_state;
1828
    LoadStateHandler *load_state;
1829
    void *opaque;
1830
    struct SaveStateEntry *next;
1831
} SaveStateEntry;
1832

    
1833
static SaveStateEntry *first_se;
1834

    
1835
int register_savevm(const char *idstr, 
1836
                    int instance_id, 
1837
                    int version_id,
1838
                    SaveStateHandler *save_state,
1839
                    LoadStateHandler *load_state,
1840
                    void *opaque)
1841
{
1842
    SaveStateEntry *se, **pse;
1843

    
1844
    se = qemu_malloc(sizeof(SaveStateEntry));
1845
    if (!se)
1846
        return -1;
1847
    pstrcpy(se->idstr, sizeof(se->idstr), idstr);
1848
    se->instance_id = instance_id;
1849
    se->version_id = version_id;
1850
    se->save_state = save_state;
1851
    se->load_state = load_state;
1852
    se->opaque = opaque;
1853
    se->next = NULL;
1854

    
1855
    /* add at the end of list */
1856
    pse = &first_se;
1857
    while (*pse != NULL)
1858
        pse = &(*pse)->next;
1859
    *pse = se;
1860
    return 0;
1861
}
1862

    
1863
#define QEMU_VM_FILE_MAGIC   0x5145564d
1864
#define QEMU_VM_FILE_VERSION 0x00000001
1865

    
1866
int qemu_savevm(const char *filename)
1867
{
1868
    SaveStateEntry *se;
1869
    QEMUFile *f;
1870
    int len, len_pos, cur_pos, saved_vm_running, ret;
1871

    
1872
    saved_vm_running = vm_running;
1873
    vm_stop(0);
1874

    
1875
    f = fopen(filename, "wb");
1876
    if (!f) {
1877
        ret = -1;
1878
        goto the_end;
1879
    }
1880

    
1881
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1882
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1883

    
1884
    for(se = first_se; se != NULL; se = se->next) {
1885
        /* ID string */
1886
        len = strlen(se->idstr);
1887
        qemu_put_byte(f, len);
1888
        qemu_put_buffer(f, se->idstr, len);
1889

    
1890
        qemu_put_be32(f, se->instance_id);
1891
        qemu_put_be32(f, se->version_id);
1892

    
1893
        /* record size: filled later */
1894
        len_pos = ftell(f);
1895
        qemu_put_be32(f, 0);
1896
        
1897
        se->save_state(f, se->opaque);
1898

    
1899
        /* fill record size */
1900
        cur_pos = ftell(f);
1901
        len = ftell(f) - len_pos - 4;
1902
        fseek(f, len_pos, SEEK_SET);
1903
        qemu_put_be32(f, len);
1904
        fseek(f, cur_pos, SEEK_SET);
1905
    }
1906

    
1907
    fclose(f);
1908
    ret = 0;
1909
 the_end:
1910
    if (saved_vm_running)
1911
        vm_start();
1912
    return ret;
1913
}
1914

    
1915
static SaveStateEntry *find_se(const char *idstr, int instance_id)
1916
{
1917
    SaveStateEntry *se;
1918

    
1919
    for(se = first_se; se != NULL; se = se->next) {
1920
        if (!strcmp(se->idstr, idstr) && 
1921
            instance_id == se->instance_id)
1922
            return se;
1923
    }
1924
    return NULL;
1925
}
1926

    
1927
int qemu_loadvm(const char *filename)
1928
{
1929
    SaveStateEntry *se;
1930
    QEMUFile *f;
1931
    int len, cur_pos, ret, instance_id, record_len, version_id;
1932
    int saved_vm_running;
1933
    unsigned int v;
1934
    char idstr[256];
1935
    
1936
    saved_vm_running = vm_running;
1937
    vm_stop(0);
1938

    
1939
    f = fopen(filename, "rb");
1940
    if (!f) {
1941
        ret = -1;
1942
        goto the_end;
1943
    }
1944

    
1945
    v = qemu_get_be32(f);
1946
    if (v != QEMU_VM_FILE_MAGIC)
1947
        goto fail;
1948
    v = qemu_get_be32(f);
1949
    if (v != QEMU_VM_FILE_VERSION) {
1950
    fail:
1951
        fclose(f);
1952
        ret = -1;
1953
        goto the_end;
1954
    }
1955
    for(;;) {
1956
#if defined (DO_TB_FLUSH)
1957
        tb_flush(global_env);
1958
#endif
1959
        len = qemu_get_byte(f);
1960
        if (feof(f))
1961
            break;
1962
        qemu_get_buffer(f, idstr, len);
1963
        idstr[len] = '\0';
1964
        instance_id = qemu_get_be32(f);
1965
        version_id = qemu_get_be32(f);
1966
        record_len = qemu_get_be32(f);
1967
#if 0
1968
        printf("idstr=%s instance=0x%x version=%d len=%d\n", 
1969
               idstr, instance_id, version_id, record_len);
1970
#endif
1971
        cur_pos = ftell(f);
1972
        se = find_se(idstr, instance_id);
1973
        if (!se) {
1974
            fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n", 
1975
                    instance_id, idstr);
1976
        } else {
1977
            ret = se->load_state(f, se->opaque, version_id);
1978
            if (ret < 0) {
1979
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n", 
1980
                        instance_id, idstr);
1981
            }
1982
        }
1983
        /* always seek to exact end of record */
1984
        qemu_fseek(f, cur_pos + record_len, SEEK_SET);
1985
    }
1986
    fclose(f);
1987
    ret = 0;
1988
 the_end:
1989
    if (saved_vm_running)
1990
        vm_start();
1991
    return ret;
1992
}
1993

    
1994
/***********************************************************/
1995
/* cpu save/restore */
1996

    
1997
#if defined(TARGET_I386)
1998

    
1999
static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
2000
{
2001
    qemu_put_be32(f, dt->selector);
2002
    qemu_put_be32(f, (uint32_t)dt->base);
2003
    qemu_put_be32(f, dt->limit);
2004
    qemu_put_be32(f, dt->flags);
2005
}
2006

    
2007
static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
2008
{
2009
    dt->selector = qemu_get_be32(f);
2010
    dt->base = (uint8_t *)qemu_get_be32(f);
2011
    dt->limit = qemu_get_be32(f);
2012
    dt->flags = qemu_get_be32(f);
2013
}
2014

    
2015
void cpu_save(QEMUFile *f, void *opaque)
2016
{
2017
    CPUState *env = opaque;
2018
    uint16_t fptag, fpus, fpuc;
2019
    uint32_t hflags;
2020
    int i;
2021

    
2022
    for(i = 0; i < 8; i++)
2023
        qemu_put_be32s(f, &env->regs[i]);
2024
    qemu_put_be32s(f, &env->eip);
2025
    qemu_put_be32s(f, &env->eflags);
2026
    qemu_put_be32s(f, &env->eflags);
2027
    hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
2028
    qemu_put_be32s(f, &hflags);
2029
    
2030
    /* FPU */
2031
    fpuc = env->fpuc;
2032
    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
2033
    fptag = 0;
2034
    for (i=7; i>=0; i--) {
2035
        fptag <<= 2;
2036
        if (env->fptags[i]) {
2037
            fptag |= 3;
2038
        }
2039
    }
2040
    
2041
    qemu_put_be16s(f, &fpuc);
2042
    qemu_put_be16s(f, &fpus);
2043
    qemu_put_be16s(f, &fptag);
2044

    
2045
    for(i = 0; i < 8; i++) {
2046
        uint64_t mant;
2047
        uint16_t exp;
2048
        cpu_get_fp80(&mant, &exp, env->fpregs[i]);
2049
        qemu_put_be64(f, mant);
2050
        qemu_put_be16(f, exp);
2051
    }
2052

    
2053
    for(i = 0; i < 6; i++)
2054
        cpu_put_seg(f, &env->segs[i]);
2055
    cpu_put_seg(f, &env->ldt);
2056
    cpu_put_seg(f, &env->tr);
2057
    cpu_put_seg(f, &env->gdt);
2058
    cpu_put_seg(f, &env->idt);
2059
    
2060
    qemu_put_be32s(f, &env->sysenter_cs);
2061
    qemu_put_be32s(f, &env->sysenter_esp);
2062
    qemu_put_be32s(f, &env->sysenter_eip);
2063
    
2064
    qemu_put_be32s(f, &env->cr[0]);
2065
    qemu_put_be32s(f, &env->cr[2]);
2066
    qemu_put_be32s(f, &env->cr[3]);
2067
    qemu_put_be32s(f, &env->cr[4]);
2068
    
2069
    for(i = 0; i < 8; i++)
2070
        qemu_put_be32s(f, &env->dr[i]);
2071

    
2072
    /* MMU */
2073
    qemu_put_be32s(f, &env->a20_mask);
2074
}
2075

    
2076
int cpu_load(QEMUFile *f, void *opaque, int version_id)
2077
{
2078
    CPUState *env = opaque;
2079
    int i;
2080
    uint32_t hflags;
2081
    uint16_t fpus, fpuc, fptag;
2082

    
2083
    if (version_id != 2)
2084
        return -EINVAL;
2085
    for(i = 0; i < 8; i++)
2086
        qemu_get_be32s(f, &env->regs[i]);
2087
    qemu_get_be32s(f, &env->eip);
2088
    qemu_get_be32s(f, &env->eflags);
2089
    qemu_get_be32s(f, &env->eflags);
2090
    qemu_get_be32s(f, &hflags);
2091

    
2092
    qemu_get_be16s(f, &fpuc);
2093
    qemu_get_be16s(f, &fpus);
2094
    qemu_get_be16s(f, &fptag);
2095

    
2096
    for(i = 0; i < 8; i++) {
2097
        uint64_t mant;
2098
        uint16_t exp;
2099
        mant = qemu_get_be64(f);
2100
        exp = qemu_get_be16(f);
2101
        env->fpregs[i] = cpu_set_fp80(mant, exp);
2102
    }
2103

    
2104
    env->fpuc = fpuc;
2105
    env->fpstt = (fpus >> 11) & 7;
2106
    env->fpus = fpus & ~0x3800;
2107
    for(i = 0; i < 8; i++) {
2108
        env->fptags[i] = ((fptag & 3) == 3);
2109
        fptag >>= 2;
2110
    }
2111
    
2112
    for(i = 0; i < 6; i++)
2113
        cpu_get_seg(f, &env->segs[i]);
2114
    cpu_get_seg(f, &env->ldt);
2115
    cpu_get_seg(f, &env->tr);
2116
    cpu_get_seg(f, &env->gdt);
2117
    cpu_get_seg(f, &env->idt);
2118
    
2119
    qemu_get_be32s(f, &env->sysenter_cs);
2120
    qemu_get_be32s(f, &env->sysenter_esp);
2121
    qemu_get_be32s(f, &env->sysenter_eip);
2122
    
2123
    qemu_get_be32s(f, &env->cr[0]);
2124
    qemu_get_be32s(f, &env->cr[2]);
2125
    qemu_get_be32s(f, &env->cr[3]);
2126
    qemu_get_be32s(f, &env->cr[4]);
2127
    
2128
    for(i = 0; i < 8; i++)
2129
        qemu_get_be32s(f, &env->dr[i]);
2130

    
2131
    /* MMU */
2132
    qemu_get_be32s(f, &env->a20_mask);
2133

    
2134
    /* XXX: compute hflags from scratch, except for CPL and IIF */
2135
    env->hflags = hflags;
2136
    tlb_flush(env, 1);
2137
    return 0;
2138
}
2139

    
2140
#elif defined(TARGET_PPC)
2141
void cpu_save(QEMUFile *f, void *opaque)
2142
{
2143
}
2144

    
2145
int cpu_load(QEMUFile *f, void *opaque, int version_id)
2146
{
2147
    return 0;
2148
}
2149
#else
2150

    
2151
#warning No CPU save/restore functions
2152

    
2153
#endif
2154

    
2155
/***********************************************************/
2156
/* ram save/restore */
2157

    
2158
/* we just avoid storing empty pages */
2159
static void ram_put_page(QEMUFile *f, const uint8_t *buf, int len)
2160
{
2161
    int i, v;
2162

    
2163
    v = buf[0];
2164
    for(i = 1; i < len; i++) {
2165
        if (buf[i] != v)
2166
            goto normal_save;
2167
    }
2168
    qemu_put_byte(f, 1);
2169
    qemu_put_byte(f, v);
2170
    return;
2171
 normal_save:
2172
    qemu_put_byte(f, 0); 
2173
    qemu_put_buffer(f, buf, len);
2174
}
2175

    
2176
static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
2177
{
2178
    int v;
2179

    
2180
    v = qemu_get_byte(f);
2181
    switch(v) {
2182
    case 0:
2183
        if (qemu_get_buffer(f, buf, len) != len)
2184
            return -EIO;
2185
        break;
2186
    case 1:
2187
        v = qemu_get_byte(f);
2188
        memset(buf, v, len);
2189
        break;
2190
    default:
2191
        return -EINVAL;
2192
    }
2193
    return 0;
2194
}
2195

    
2196
static void ram_save(QEMUFile *f, void *opaque)
2197
{
2198
    int i;
2199
    qemu_put_be32(f, phys_ram_size);
2200
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
2201
        ram_put_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
2202
    }
2203
}
2204

    
2205
static int ram_load(QEMUFile *f, void *opaque, int version_id)
2206
{
2207
    int i, ret;
2208

    
2209
    if (version_id != 1)
2210
        return -EINVAL;
2211
    if (qemu_get_be32(f) != phys_ram_size)
2212
        return -EINVAL;
2213
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
2214
        ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
2215
        if (ret)
2216
            return ret;
2217
    }
2218
    return 0;
2219
}
2220

    
2221
/***********************************************************/
2222
/* main execution loop */
2223

    
2224
void gui_update(void *opaque)
2225
{
2226
    display_state.dpy_refresh(&display_state);
2227
    qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
2228
}
2229

    
2230
/* XXX: support several handlers */
2231
VMStopHandler *vm_stop_cb;
2232
VMStopHandler *vm_stop_opaque;
2233

    
2234
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
2235
{
2236
    vm_stop_cb = cb;
2237
    vm_stop_opaque = opaque;
2238
    return 0;
2239
}
2240

    
2241
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
2242
{
2243
    vm_stop_cb = NULL;
2244
}
2245

    
2246
void vm_start(void)
2247
{
2248
    if (!vm_running) {
2249
        cpu_enable_ticks();
2250
        vm_running = 1;
2251
    }
2252
}
2253

    
2254
void vm_stop(int reason) 
2255
{
2256
    if (vm_running) {
2257
        cpu_disable_ticks();
2258
        vm_running = 0;
2259
        if (reason != 0) {
2260
            if (vm_stop_cb) {
2261
                vm_stop_cb(vm_stop_opaque, reason);
2262
            }
2263
        }
2264
    }
2265
}
2266

    
2267
/* reset/shutdown handler */
2268

    
2269
typedef struct QEMUResetEntry {
2270
    QEMUResetHandler *func;
2271
    void *opaque;
2272
    struct QEMUResetEntry *next;
2273
} QEMUResetEntry;
2274

    
2275
static QEMUResetEntry *first_reset_entry;
2276
static int reset_requested;
2277
static int shutdown_requested;
2278

    
2279
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
2280
{
2281
    QEMUResetEntry **pre, *re;
2282

    
2283
    pre = &first_reset_entry;
2284
    while (*pre != NULL)
2285
        pre = &(*pre)->next;
2286
    re = qemu_mallocz(sizeof(QEMUResetEntry));
2287
    re->func = func;
2288
    re->opaque = opaque;
2289
    re->next = NULL;
2290
    *pre = re;
2291
}
2292

    
2293
void qemu_system_reset(void)
2294
{
2295
    QEMUResetEntry *re;
2296

    
2297
    /* reset all devices */
2298
    for(re = first_reset_entry; re != NULL; re = re->next) {
2299
        re->func(re->opaque);
2300
    }
2301
}
2302

    
2303
void qemu_system_reset_request(void)
2304
{
2305
    reset_requested = 1;
2306
    cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
2307
}
2308

    
2309
void qemu_system_shutdown_request(void)
2310
{
2311
    shutdown_requested = 1;
2312
    cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
2313
}
2314

    
2315
static void main_cpu_reset(void *opaque)
2316
{
2317
#ifdef TARGET_I386
2318
    CPUState *env = opaque;
2319
    cpu_reset(env);
2320
#endif
2321
}
2322

    
2323
void main_loop_wait(int timeout)
2324
{
2325
#ifndef _WIN32
2326
    struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf;
2327
    IOHandlerRecord *ioh, *ioh_next;
2328
    uint8_t buf[4096];
2329
    int n, max_size;
2330
#endif
2331
    int ret;
2332

    
2333
#ifdef _WIN32
2334
        if (timeout > 0)
2335
            Sleep(timeout);
2336
#else
2337
        /* poll any events */
2338
        /* XXX: separate device handlers from system ones */
2339
        pf = ufds;
2340
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
2341
            if (!ioh->fd_can_read) {
2342
                max_size = 0;
2343
                pf->fd = ioh->fd;
2344
                pf->events = POLLIN;
2345
                ioh->ufd = pf;
2346
                pf++;
2347
            } else {
2348
                max_size = ioh->fd_can_read(ioh->opaque);
2349
                if (max_size > 0) {
2350
                    if (max_size > sizeof(buf))
2351
                        max_size = sizeof(buf);
2352
                    pf->fd = ioh->fd;
2353
                    pf->events = POLLIN;
2354
                    ioh->ufd = pf;
2355
                    pf++;
2356
                } else {
2357
                    ioh->ufd = NULL;
2358
                }
2359
            }
2360
            ioh->max_size = max_size;
2361
        }
2362
        
2363
        ret = poll(ufds, pf - ufds, timeout);
2364
        if (ret > 0) {
2365
            /* XXX: better handling of removal */
2366
            for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
2367
                ioh_next = ioh->next;
2368
                pf = ioh->ufd;
2369
                if (pf) {
2370
                    if (pf->revents & POLLIN) {
2371
                        if (ioh->max_size == 0) {
2372
                            /* just a read event */
2373
                            ioh->fd_read(ioh->opaque, NULL, 0);
2374
                        } else {
2375
                            n = read(ioh->fd, buf, ioh->max_size);
2376
                            if (n >= 0) {
2377
                                ioh->fd_read(ioh->opaque, buf, n);
2378
                            } else if (errno != EAGAIN) {
2379
                                ioh->fd_read(ioh->opaque, NULL, -errno);
2380
                            }
2381
                        }
2382
                    }
2383
                }
2384
            }
2385
        }
2386
#endif /* !defined(_WIN32) */
2387
#if defined(CONFIG_SLIRP)
2388
        /* XXX: merge with poll() */
2389
        if (slirp_inited) {
2390
            fd_set rfds, wfds, xfds;
2391
            int nfds;
2392
            struct timeval tv;
2393

    
2394
            nfds = -1;
2395
            FD_ZERO(&rfds);
2396
            FD_ZERO(&wfds);
2397
            FD_ZERO(&xfds);
2398
            slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
2399
            tv.tv_sec = 0;
2400
            tv.tv_usec = 0;
2401
            ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
2402
            if (ret >= 0) {
2403
                slirp_select_poll(&rfds, &wfds, &xfds);
2404
            }
2405
        }
2406
#endif
2407

    
2408
        if (vm_running) {
2409
            qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL], 
2410
                            qemu_get_clock(vm_clock));
2411
            
2412
            if (audio_enabled) {
2413
                /* XXX: add explicit timer */
2414
                SB16_run();
2415
            }
2416
            
2417
            /* run dma transfers, if any */
2418
            DMA_run();
2419
        }
2420

    
2421
        /* real time timers */
2422
        qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], 
2423
                        qemu_get_clock(rt_clock));
2424
}
2425

    
2426
int main_loop(void)
2427
{
2428
    int ret, timeout;
2429
    CPUState *env = global_env;
2430

    
2431
    for(;;) {
2432
        if (vm_running) {
2433
            ret = cpu_exec(env);
2434
            if (shutdown_requested) {
2435
                ret = EXCP_INTERRUPT; 
2436
                break;
2437
            }
2438
            if (reset_requested) {
2439
                reset_requested = 0;
2440
                qemu_system_reset();
2441
                ret = EXCP_INTERRUPT; 
2442
            }
2443
            if (ret == EXCP_DEBUG) {
2444
                vm_stop(EXCP_DEBUG);
2445
            }
2446
            /* if hlt instruction, we wait until the next IRQ */
2447
            /* XXX: use timeout computed from timers */
2448
            if (ret == EXCP_HLT) 
2449
                timeout = 10;
2450
            else
2451
                timeout = 0;
2452
        } else {
2453
            timeout = 10;
2454
        }
2455
        main_loop_wait(timeout);
2456
    }
2457
    cpu_disable_ticks();
2458
    return ret;
2459
}
2460

    
2461
void help(void)
2462
{
2463
    printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2004 Fabrice Bellard\n"
2464
           "usage: %s [options] [disk_image]\n"
2465
           "\n"
2466
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
2467
           "\n"
2468
           "Standard options:\n"
2469
           "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
2470
           "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n"
2471
           "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n"
2472
           "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
2473
           "-boot [a|b|c|d] boot on floppy (a, b), hard disk (c) or CD-ROM (d)\n"
2474
           "-snapshot       write to temporary files instead of disk image files\n"
2475
           "-m megs         set virtual RAM size to megs MB [default=%d]\n"
2476
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
2477
           "-enable-audio   enable audio support\n"
2478
           "-localtime      set the real time clock to local time [default=utc]\n"
2479
#ifdef TARGET_PPC
2480
           "-prep           Simulate a PREP system (default is PowerMAC)\n"
2481
           "-g WxH[xDEPTH]  Set the initial VGA graphic mode\n"
2482
#endif
2483
           "\n"
2484
           "Network options:\n"
2485
           "-nics n         simulate 'n' network cards [default=1]\n"
2486
           "-macaddr addr   set the mac address of the first interface\n"
2487
           "-n script       set tap/tun network init script [default=%s]\n"
2488
           "-tun-fd fd      use this fd as already opened tap/tun interface\n"
2489
#ifdef CONFIG_SLIRP
2490
           "-user-net       use user mode network stack [default if no tap/tun script]\n"
2491
           "-tftp prefix    allow tftp access to files starting with prefix [-user-net]\n"
2492
#ifndef _WIN32
2493
           "-smb dir        allow SMB access to files in 'dir' [-user-net]\n"
2494
#endif
2495
           "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
2496
           "                redirect TCP or UDP connections from host to guest [-user-net]\n"
2497
#endif
2498
           "-dummy-net      use dummy network stack\n"
2499
           "\n"
2500
           "Linux boot specific:\n"
2501
           "-kernel bzImage use 'bzImage' as kernel image\n"
2502
           "-append cmdline use 'cmdline' as kernel command line\n"
2503
           "-initrd file    use 'file' as initial ram disk\n"
2504
           "\n"
2505
           "Debug/Expert options:\n"
2506
           "-monitor dev    redirect the monitor to char device 'dev'\n"
2507
           "-serial dev     redirect the serial port to char device 'dev'\n"
2508
           "-S              freeze CPU at startup (use 'c' to start execution)\n"
2509
           "-s              wait gdb connection to port %d\n"
2510
           "-p port         change gdb connection port\n"
2511
           "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
2512
           "-hdachs c,h,s   force hard disk 0 geometry (usually qemu can guess it)\n"
2513
           "-L path         set the directory for the BIOS and VGA BIOS\n"
2514
#ifdef USE_CODE_COPY
2515
           "-no-code-copy   disable code copy acceleration\n"
2516
#endif
2517
#ifdef TARGET_I386
2518
           "-isa            simulate an ISA-only system (default is PCI system)\n"
2519
           "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
2520
           "                (default is CL-GD5446 PCI VGA)\n"
2521
#endif
2522
           "\n"
2523
           "During emulation, the following keys are useful:\n"
2524
           "ctrl-shift-f    toggle full screen\n"
2525
           "ctrl-shift-Fn   switch to virtual console 'n'\n"
2526
           "ctrl-shift      toggle mouse and keyboard grab\n"
2527
           "\n"
2528
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
2529
           ,
2530
#ifdef CONFIG_SOFTMMU
2531
           "qemu",
2532
#else
2533
           "qemu-fast",
2534
#endif
2535
           DEFAULT_RAM_SIZE,
2536
           DEFAULT_NETWORK_SCRIPT,
2537
           DEFAULT_GDBSTUB_PORT,
2538
           "/tmp/qemu.log");
2539
#ifndef CONFIG_SOFTMMU
2540
    printf("\n"
2541
           "NOTE: this version of QEMU is faster but it needs slightly patched OSes to\n"
2542
           "work. Please use the 'qemu' executable to have a more accurate (but slower)\n"
2543
           "PC emulation.\n");
2544
#endif
2545
    exit(1);
2546
}
2547

    
2548
#define HAS_ARG 0x0001
2549

    
2550
enum {
2551
    QEMU_OPTION_h,
2552

    
2553
    QEMU_OPTION_fda,
2554
    QEMU_OPTION_fdb,
2555
    QEMU_OPTION_hda,
2556
    QEMU_OPTION_hdb,
2557
    QEMU_OPTION_hdc,
2558
    QEMU_OPTION_hdd,
2559
    QEMU_OPTION_cdrom,
2560
    QEMU_OPTION_boot,
2561
    QEMU_OPTION_snapshot,
2562
    QEMU_OPTION_m,
2563
    QEMU_OPTION_nographic,
2564
    QEMU_OPTION_enable_audio,
2565

    
2566
    QEMU_OPTION_nics,
2567
    QEMU_OPTION_macaddr,
2568
    QEMU_OPTION_n,
2569
    QEMU_OPTION_tun_fd,
2570
    QEMU_OPTION_user_net,
2571
    QEMU_OPTION_tftp,
2572
    QEMU_OPTION_smb,
2573
    QEMU_OPTION_redir,
2574
    QEMU_OPTION_dummy_net,
2575

    
2576
    QEMU_OPTION_kernel,
2577
    QEMU_OPTION_append,
2578
    QEMU_OPTION_initrd,
2579

    
2580
    QEMU_OPTION_S,
2581
    QEMU_OPTION_s,
2582
    QEMU_OPTION_p,
2583
    QEMU_OPTION_d,
2584
    QEMU_OPTION_hdachs,
2585
    QEMU_OPTION_L,
2586
    QEMU_OPTION_no_code_copy,
2587
    QEMU_OPTION_pci,
2588
    QEMU_OPTION_isa,
2589
    QEMU_OPTION_prep,
2590
    QEMU_OPTION_localtime,
2591
    QEMU_OPTION_cirrusvga,
2592
    QEMU_OPTION_g,
2593
    QEMU_OPTION_std_vga,
2594
    QEMU_OPTION_monitor,
2595
    QEMU_OPTION_serial,
2596
};
2597

    
2598
typedef struct QEMUOption {
2599
    const char *name;
2600
    int flags;
2601
    int index;
2602
} QEMUOption;
2603

    
2604
const QEMUOption qemu_options[] = {
2605
    { "h", 0, QEMU_OPTION_h },
2606

    
2607
    { "fda", HAS_ARG, QEMU_OPTION_fda },
2608
    { "fdb", HAS_ARG, QEMU_OPTION_fdb },
2609
    { "hda", HAS_ARG, QEMU_OPTION_hda },
2610
    { "hdb", HAS_ARG, QEMU_OPTION_hdb },
2611
    { "hdc", HAS_ARG, QEMU_OPTION_hdc },
2612
    { "hdd", HAS_ARG, QEMU_OPTION_hdd },
2613
    { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
2614
    { "boot", HAS_ARG, QEMU_OPTION_boot },
2615
    { "snapshot", 0, QEMU_OPTION_snapshot },
2616
    { "m", HAS_ARG, QEMU_OPTION_m },
2617
    { "nographic", 0, QEMU_OPTION_nographic },
2618
    { "enable-audio", 0, QEMU_OPTION_enable_audio },
2619

    
2620
    { "nics", HAS_ARG, QEMU_OPTION_nics},
2621
    { "macaddr", HAS_ARG, QEMU_OPTION_macaddr},
2622
    { "n", HAS_ARG, QEMU_OPTION_n },
2623
    { "tun-fd", HAS_ARG, QEMU_OPTION_tun_fd },
2624
#ifdef CONFIG_SLIRP
2625
    { "user-net", 0, QEMU_OPTION_user_net },
2626
    { "tftp", HAS_ARG, QEMU_OPTION_tftp },
2627
#ifndef _WIN32
2628
    { "smb", HAS_ARG, QEMU_OPTION_smb },
2629
#endif
2630
    { "redir", HAS_ARG, QEMU_OPTION_redir },
2631
#endif
2632
    { "dummy-net", 0, QEMU_OPTION_dummy_net },
2633

    
2634
    { "kernel", HAS_ARG, QEMU_OPTION_kernel },
2635
    { "append", HAS_ARG, QEMU_OPTION_append },
2636
    { "initrd", HAS_ARG, QEMU_OPTION_initrd },
2637

    
2638
    { "S", 0, QEMU_OPTION_S },
2639
    { "s", 0, QEMU_OPTION_s },
2640
    { "p", HAS_ARG, QEMU_OPTION_p },
2641
    { "d", HAS_ARG, QEMU_OPTION_d },
2642
    { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
2643
    { "L", HAS_ARG, QEMU_OPTION_L },
2644
    { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
2645
#ifdef TARGET_PPC
2646
    { "prep", 0, QEMU_OPTION_prep },
2647
    { "g", 1, QEMU_OPTION_g },
2648
#endif
2649
    { "localtime", 0, QEMU_OPTION_localtime },
2650
    { "isa", 0, QEMU_OPTION_isa },
2651
    { "std-vga", 0, QEMU_OPTION_std_vga },
2652
    { "monitor", 1, QEMU_OPTION_monitor },
2653
    { "serial", 1, QEMU_OPTION_serial },
2654
    
2655
    /* temporary options */
2656
    { "pci", 0, QEMU_OPTION_pci },
2657
    { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
2658
    { NULL },
2659
};
2660

    
2661
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
2662

    
2663
/* this stack is only used during signal handling */
2664
#define SIGNAL_STACK_SIZE 32768
2665

    
2666
static uint8_t *signal_stack;
2667

    
2668
#endif
2669

    
2670
/* password input */
2671

    
2672
static BlockDriverState *get_bdrv(int index)
2673
{
2674
    BlockDriverState *bs;
2675

    
2676
    if (index < 4) {
2677
        bs = bs_table[index];
2678
    } else if (index < 6) {
2679
        bs = fd_table[index - 4];
2680
    } else {
2681
        bs = NULL;
2682
    }
2683
    return bs;
2684
}
2685

    
2686
static void read_passwords(void)
2687
{
2688
    BlockDriverState *bs;
2689
    int i, j;
2690
    char password[256];
2691

    
2692
    for(i = 0; i < 6; i++) {
2693
        bs = get_bdrv(i);
2694
        if (bs && bdrv_is_encrypted(bs)) {
2695
            term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
2696
            for(j = 0; j < 3; j++) {
2697
                monitor_readline("Password: ", 
2698
                                 1, password, sizeof(password));
2699
                if (bdrv_set_key(bs, password) == 0)
2700
                    break;
2701
                term_printf("invalid password\n");
2702
            }
2703
        }
2704
    }
2705
}
2706

    
2707
#define NET_IF_TUN   0
2708
#define NET_IF_USER  1
2709
#define NET_IF_DUMMY 2
2710

    
2711
int main(int argc, char **argv)
2712
{
2713
#ifdef CONFIG_GDBSTUB
2714
    int use_gdbstub, gdbstub_port;
2715
#endif
2716
    int i, has_cdrom;
2717
    int snapshot, linux_boot;
2718
    CPUState *env;
2719
    const char *initrd_filename;
2720
    const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
2721
    const char *kernel_filename, *kernel_cmdline;
2722
    DisplayState *ds = &display_state;
2723
    int cyls, heads, secs;
2724
    int start_emulation = 1;
2725
    uint8_t macaddr[6];
2726
    int net_if_type, nb_tun_fds, tun_fds[MAX_NICS];
2727
    int optind;
2728
    const char *r, *optarg;
2729
    CharDriverState *monitor_hd;
2730
    char monitor_device[128];
2731
    char serial_devices[MAX_SERIAL_PORTS][128];
2732
    int serial_device_index;
2733
    
2734
#if !defined(CONFIG_SOFTMMU)
2735
    /* we never want that malloc() uses mmap() */
2736
    mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
2737
#endif
2738
    initrd_filename = NULL;
2739
    for(i = 0; i < MAX_FD; i++)
2740
        fd_filename[i] = NULL;
2741
    for(i = 0; i < MAX_DISKS; i++)
2742
        hd_filename[i] = NULL;
2743
    ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
2744
    vga_ram_size = VGA_RAM_SIZE;
2745
    bios_size = BIOS_SIZE;
2746
    pstrcpy(network_script, sizeof(network_script), DEFAULT_NETWORK_SCRIPT);
2747
#ifdef CONFIG_GDBSTUB
2748
    use_gdbstub = 0;
2749
    gdbstub_port = DEFAULT_GDBSTUB_PORT;
2750
#endif
2751
    snapshot = 0;
2752
    nographic = 0;
2753
    kernel_filename = NULL;
2754
    kernel_cmdline = "";
2755
    has_cdrom = 1;
2756
    cyls = heads = secs = 0;
2757
    pstrcpy(monitor_device, sizeof(monitor_device), "vc");
2758

    
2759
    pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "vc");
2760
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
2761
        serial_devices[i][0] = '\0';
2762
    serial_device_index = 0;
2763
    
2764
    nb_tun_fds = 0;
2765
    net_if_type = -1;
2766
    nb_nics = 1;
2767
    /* default mac address of the first network interface */
2768
    macaddr[0] = 0x52;
2769
    macaddr[1] = 0x54;
2770
    macaddr[2] = 0x00;
2771
    macaddr[3] = 0x12;
2772
    macaddr[4] = 0x34;
2773
    macaddr[5] = 0x56;
2774
    
2775
    optind = 1;
2776
    for(;;) {
2777
        if (optind >= argc)
2778
            break;
2779
        r = argv[optind];
2780
        if (r[0] != '-') {
2781
            hd_filename[0] = argv[optind++];
2782
        } else {
2783
            const QEMUOption *popt;
2784

    
2785
            optind++;
2786
            popt = qemu_options;
2787
            for(;;) {
2788
                if (!popt->name) {
2789
                    fprintf(stderr, "%s: invalid option -- '%s'\n", 
2790
                            argv[0], r);
2791
                    exit(1);
2792
                }
2793
                if (!strcmp(popt->name, r + 1))
2794
                    break;
2795
                popt++;
2796
            }
2797
            if (popt->flags & HAS_ARG) {
2798
                if (optind >= argc) {
2799
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
2800
                            argv[0], r);
2801
                    exit(1);
2802
                }
2803
                optarg = argv[optind++];
2804
            } else {
2805
                optarg = NULL;
2806
            }
2807

    
2808
            switch(popt->index) {
2809
            case QEMU_OPTION_initrd:
2810
                initrd_filename = optarg;
2811
                break;
2812
            case QEMU_OPTION_hda:
2813
                hd_filename[0] = optarg;
2814
                break;
2815
            case QEMU_OPTION_hdb:
2816
                hd_filename[1] = optarg;
2817
                break;
2818
            case QEMU_OPTION_snapshot:
2819
                snapshot = 1;
2820
                break;
2821
            case QEMU_OPTION_hdachs:
2822
                {
2823
                    const char *p;
2824
                    p = optarg;
2825
                    cyls = strtol(p, (char **)&p, 0);
2826
                    if (*p != ',')
2827
                        goto chs_fail;
2828
                    p++;
2829
                    heads = strtol(p, (char **)&p, 0);
2830
                    if (*p != ',')
2831
                        goto chs_fail;
2832
                    p++;
2833
                    secs = strtol(p, (char **)&p, 0);
2834
                    if (*p != '\0') {
2835
                    chs_fail:
2836
                        cyls = 0;
2837
                    }
2838
                }
2839
                break;
2840
            case QEMU_OPTION_nographic:
2841
                pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
2842
                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");
2843
                nographic = 1;
2844
                break;
2845
            case QEMU_OPTION_kernel:
2846
                kernel_filename = optarg;
2847
                break;
2848
            case QEMU_OPTION_append:
2849
                kernel_cmdline = optarg;
2850
                break;
2851
            case QEMU_OPTION_tun_fd:
2852
                {
2853
                    const char *p;
2854
                    int fd;
2855
                    net_if_type = NET_IF_TUN;
2856
                    if (nb_tun_fds < MAX_NICS) {
2857
                        fd = strtol(optarg, (char **)&p, 0);
2858
                        if (*p != '\0') {
2859
                            fprintf(stderr, "qemu: invalid fd for network interface %d\n", nb_tun_fds);
2860
                            exit(1);
2861
                        }
2862
                        tun_fds[nb_tun_fds++] = fd;
2863
                    }
2864
                }
2865
                break;
2866
            case QEMU_OPTION_hdc:
2867
                hd_filename[2] = optarg;
2868
                has_cdrom = 0;
2869
                break;
2870
            case QEMU_OPTION_hdd:
2871
                hd_filename[3] = optarg;
2872
                break;
2873
            case QEMU_OPTION_cdrom:
2874
                hd_filename[2] = optarg;
2875
                has_cdrom = 1;
2876
                break;
2877
            case QEMU_OPTION_boot:
2878
                boot_device = optarg[0];
2879
                if (boot_device != 'a' && boot_device != 'b' &&
2880
                    boot_device != 'c' && boot_device != 'd') {
2881
                    fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device);
2882
                    exit(1);
2883
                }
2884
                break;
2885
            case QEMU_OPTION_fda:
2886
                fd_filename[0] = optarg;
2887
                break;
2888
            case QEMU_OPTION_fdb:
2889
                fd_filename[1] = optarg;
2890
                break;
2891
            case QEMU_OPTION_no_code_copy:
2892
                code_copy_enabled = 0;
2893
                break;
2894
            case QEMU_OPTION_nics:
2895
                nb_nics = atoi(optarg);
2896
                if (nb_nics < 0 || nb_nics > MAX_NICS) {
2897
                    fprintf(stderr, "qemu: invalid number of network interfaces\n");
2898
                    exit(1);
2899
                }
2900
                break;
2901
            case QEMU_OPTION_macaddr:
2902
                {
2903
                    const char *p;
2904
                    int i;
2905
                    p = optarg;
2906
                    for(i = 0; i < 6; i++) {
2907
                        macaddr[i] = strtol(p, (char **)&p, 16);
2908
                        if (i == 5) {
2909
                            if (*p != '\0') 
2910
                                goto macaddr_error;
2911
                        } else {
2912
                            if (*p != ':') {
2913
                            macaddr_error:
2914
                                fprintf(stderr, "qemu: invalid syntax for ethernet address\n");
2915
                                exit(1);
2916
                            }
2917
                            p++;
2918
                        }
2919
                    }
2920
                }
2921
                break;
2922
#ifdef CONFIG_SLIRP
2923
            case QEMU_OPTION_tftp:
2924
                tftp_prefix = optarg;
2925
                break;
2926
#ifndef _WIN32
2927
            case QEMU_OPTION_smb:
2928
                net_slirp_smb(optarg);
2929
                break;
2930
#endif
2931
            case QEMU_OPTION_user_net:
2932
                net_if_type = NET_IF_USER;
2933
                break;
2934
            case QEMU_OPTION_redir:
2935
                net_slirp_redir(optarg);                
2936
                break;
2937
#endif
2938
            case QEMU_OPTION_dummy_net:
2939
                net_if_type = NET_IF_DUMMY;
2940
                break;
2941
            case QEMU_OPTION_enable_audio:
2942
                audio_enabled = 1;
2943
                break;
2944
            case QEMU_OPTION_h:
2945
                help();
2946
                break;
2947
            case QEMU_OPTION_m:
2948
                ram_size = atoi(optarg) * 1024 * 1024;
2949
                if (ram_size <= 0)
2950
                    help();
2951
                if (ram_size > PHYS_RAM_MAX_SIZE) {
2952
                    fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
2953
                            PHYS_RAM_MAX_SIZE / (1024 * 1024));
2954
                    exit(1);
2955
                }
2956
                break;
2957
            case QEMU_OPTION_d:
2958
                {
2959
                    int mask;
2960
                    CPULogItem *item;
2961
                    
2962
                    mask = cpu_str_to_log_mask(optarg);
2963
                    if (!mask) {
2964
                        printf("Log items (comma separated):\n");
2965
                    for(item = cpu_log_items; item->mask != 0; item++) {
2966
                        printf("%-10s %s\n", item->name, item->help);
2967
                    }
2968
                    exit(1);
2969
                    }
2970
                    cpu_set_log(mask);
2971
                }
2972
                break;
2973
            case QEMU_OPTION_n:
2974
                pstrcpy(network_script, sizeof(network_script), optarg);
2975
                break;
2976
#ifdef CONFIG_GDBSTUB
2977
            case QEMU_OPTION_s:
2978
                use_gdbstub = 1;
2979
                break;
2980
            case QEMU_OPTION_p:
2981
                gdbstub_port = atoi(optarg);
2982
                break;
2983
#endif
2984
            case QEMU_OPTION_L:
2985
                bios_dir = optarg;
2986
                break;
2987
            case QEMU_OPTION_S:
2988
                start_emulation = 0;
2989
                break;
2990
            case QEMU_OPTION_pci:
2991
                pci_enabled = 1;
2992
                break;
2993
            case QEMU_OPTION_isa:
2994
                pci_enabled = 0;
2995
                break;
2996
            case QEMU_OPTION_prep:
2997
                prep_enabled = 1;
2998
                break;
2999
            case QEMU_OPTION_localtime:
3000
                rtc_utc = 0;
3001
                break;
3002
            case QEMU_OPTION_cirrusvga:
3003
                cirrus_vga_enabled = 1;
3004
                break;
3005
            case QEMU_OPTION_std_vga:
3006
                cirrus_vga_enabled = 0;
3007
                break;
3008
            case QEMU_OPTION_g:
3009
                {
3010
                    const char *p;
3011
                    int w, h, depth;
3012
                    p = optarg;
3013
                    w = strtol(p, (char **)&p, 10);
3014
                    if (w <= 0) {
3015
                    graphic_error:
3016
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
3017
                        exit(1);
3018
                    }
3019
                    if (*p != 'x')
3020
                        goto graphic_error;
3021
                    p++;
3022
                    h = strtol(p, (char **)&p, 10);
3023
                    if (h <= 0)
3024
                        goto graphic_error;
3025
                    if (*p == 'x') {
3026
                        p++;
3027
                        depth = strtol(p, (char **)&p, 10);
3028
                        if (depth != 8 && depth != 15 && depth != 16 && 
3029
                            depth != 24 && depth != 32)
3030
                            goto graphic_error;
3031
                    } else if (*p == '\0') {
3032
                        depth = graphic_depth;
3033
                    } else {
3034
                        goto graphic_error;
3035
                    }
3036
                    
3037
                    graphic_width = w;
3038
                    graphic_height = h;
3039
                    graphic_depth = depth;
3040
                }
3041
                break;
3042
            case QEMU_OPTION_monitor:
3043
                pstrcpy(monitor_device, sizeof(monitor_device), optarg);
3044
                break;
3045
            case QEMU_OPTION_serial:
3046
                if (serial_device_index >= MAX_SERIAL_PORTS) {
3047
                    fprintf(stderr, "qemu: too many serial ports\n");
3048
                    exit(1);
3049
                }
3050
                pstrcpy(serial_devices[serial_device_index], 
3051
                        sizeof(serial_devices[0]), optarg);
3052
                serial_device_index++;
3053
                break;
3054
            }
3055
        }
3056
    }
3057

    
3058
    linux_boot = (kernel_filename != NULL);
3059
        
3060
    if (!linux_boot && hd_filename[0] == '\0' && hd_filename[2] == '\0' &&
3061
        fd_filename[0] == '\0')
3062
        help();
3063
    
3064
    /* boot to cd by default if no hard disk */
3065
    if (hd_filename[0] == '\0' && boot_device == 'c') {
3066
        if (fd_filename[0] != '\0')
3067
            boot_device = 'a';
3068
        else
3069
            boot_device = 'd';
3070
    }
3071

    
3072
#if !defined(CONFIG_SOFTMMU)
3073
    /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
3074
    {
3075
        static uint8_t stdout_buf[4096];
3076
        setvbuf(stdout, stdout_buf, _IOLBF, sizeof(stdout_buf));
3077
    }
3078
#else
3079
    setvbuf(stdout, NULL, _IOLBF, 0);
3080
#endif
3081

    
3082
    /* init host network redirectors */
3083
    if (net_if_type == -1) {
3084
        net_if_type = NET_IF_TUN;
3085
#if defined(CONFIG_SLIRP)
3086
        if (access(network_script, R_OK) < 0) {
3087
            net_if_type = NET_IF_USER;
3088
        }
3089
#endif
3090
    }
3091

    
3092
    for(i = 0; i < nb_nics; i++) {
3093
        NetDriverState *nd = &nd_table[i];
3094
        nd->index = i;
3095
        /* init virtual mac address */
3096
        nd->macaddr[0] = macaddr[0];
3097
        nd->macaddr[1] = macaddr[1];
3098
        nd->macaddr[2] = macaddr[2];
3099
        nd->macaddr[3] = macaddr[3];
3100
        nd->macaddr[4] = macaddr[4];
3101
        nd->macaddr[5] = macaddr[5] + i;
3102
        switch(net_if_type) {
3103
#if defined(CONFIG_SLIRP)
3104
        case NET_IF_USER:
3105
            net_slirp_init(nd);
3106
            break;
3107
#endif
3108
#if !defined(_WIN32)
3109
        case NET_IF_TUN:
3110
            if (i < nb_tun_fds) {
3111
                net_fd_init(nd, tun_fds[i]);
3112
            } else {
3113
                if (net_tun_init(nd) < 0)
3114
                    net_dummy_init(nd);
3115
            }
3116
            break;
3117
#endif
3118
        case NET_IF_DUMMY:
3119
        default:
3120
            net_dummy_init(nd);
3121
            break;
3122
        }
3123
    }
3124

    
3125
    /* init the memory */
3126
    phys_ram_size = ram_size + vga_ram_size + bios_size;
3127

    
3128
#ifdef CONFIG_SOFTMMU
3129
#ifdef _BSD
3130
    /* mallocs are always aligned on BSD. valloc is better for correctness */
3131
    phys_ram_base = valloc(phys_ram_size);
3132
#else
3133
    phys_ram_base = memalign(TARGET_PAGE_SIZE, phys_ram_size);
3134
#endif
3135
    if (!phys_ram_base) {
3136
        fprintf(stderr, "Could not allocate physical memory\n");
3137
        exit(1);
3138
    }
3139
#else
3140
    /* as we must map the same page at several addresses, we must use
3141
       a fd */
3142
    {
3143
        const char *tmpdir;
3144

    
3145
        tmpdir = getenv("QEMU_TMPDIR");
3146
        if (!tmpdir)
3147
            tmpdir = "/tmp";
3148
        snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);
3149
        if (mkstemp(phys_ram_file) < 0) {
3150
            fprintf(stderr, "Could not create temporary memory file '%s'\n", 
3151
                    phys_ram_file);
3152
            exit(1);
3153
        }
3154
        phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);
3155
        if (phys_ram_fd < 0) {
3156
            fprintf(stderr, "Could not open temporary memory file '%s'\n", 
3157
                    phys_ram_file);
3158
            exit(1);
3159
        }
3160
        ftruncate(phys_ram_fd, phys_ram_size);
3161
        unlink(phys_ram_file);
3162
        phys_ram_base = mmap(get_mmap_addr(phys_ram_size), 
3163
                             phys_ram_size, 
3164
                             PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED, 
3165
                             phys_ram_fd, 0);
3166
        if (phys_ram_base == MAP_FAILED) {
3167
            fprintf(stderr, "Could not map physical memory\n");
3168
            exit(1);
3169
        }
3170
    }
3171
#endif
3172

    
3173
    /* we always create the cdrom drive, even if no disk is there */
3174
    bdrv_init();
3175
    if (has_cdrom) {
3176
        bs_table[2] = bdrv_new("cdrom");
3177
        bdrv_set_type_hint(bs_table[2], BDRV_TYPE_CDROM);
3178
    }
3179

    
3180
    /* open the virtual block devices */
3181
    for(i = 0; i < MAX_DISKS; i++) {
3182
        if (hd_filename[i]) {
3183
            if (!bs_table[i]) {
3184
                char buf[64];
3185
                snprintf(buf, sizeof(buf), "hd%c", i + 'a');
3186
                bs_table[i] = bdrv_new(buf);
3187
            }
3188
            if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) {
3189
                fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
3190
                        hd_filename[i]);
3191
                exit(1);
3192
            }
3193
            if (i == 0 && cyls != 0) 
3194
                bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
3195
        }
3196
    }
3197

    
3198
    /* we always create at least one floppy disk */
3199
    fd_table[0] = bdrv_new("fda");
3200
    bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
3201

    
3202
    for(i = 0; i < MAX_FD; i++) {
3203
        if (fd_filename[i]) {
3204
            if (!fd_table[i]) {
3205
                char buf[64];
3206
                snprintf(buf, sizeof(buf), "fd%c", i + 'a');
3207
                fd_table[i] = bdrv_new(buf);
3208
                bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
3209
            }
3210
            if (fd_filename[i] != '\0') {
3211
                if (bdrv_open(fd_table[i], fd_filename[i], snapshot) < 0) {
3212
                    fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
3213
                            fd_filename[i]);
3214
                    exit(1);
3215
                }
3216
            }
3217
        }
3218
    }
3219

    
3220
    /* init CPU state */
3221
    env = cpu_init();
3222
    global_env = env;
3223
    cpu_single_env = env;
3224

    
3225
    register_savevm("timer", 0, 1, timer_save, timer_load, env);
3226
    register_savevm("cpu", 0, 2, cpu_save, cpu_load, env);
3227
    register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
3228
    qemu_register_reset(main_cpu_reset, global_env);
3229

    
3230
    init_ioports();
3231
    cpu_calibrate_ticks();
3232

    
3233
    /* terminal init */
3234
    if (nographic) {
3235
        dumb_display_init(ds);
3236
    } else {
3237
#ifdef CONFIG_SDL
3238
        sdl_display_init(ds);
3239
#else
3240
        dumb_display_init(ds);
3241
#endif
3242
    }
3243

    
3244
    vga_console = graphic_console_init(ds);
3245
    
3246
    monitor_hd = qemu_chr_open(monitor_device);
3247
    if (!monitor_hd) {
3248
        fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
3249
        exit(1);
3250
    }
3251
    monitor_init(monitor_hd, !nographic);
3252

    
3253
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
3254
        if (serial_devices[i][0] != '\0') {
3255
            serial_hds[i] = qemu_chr_open(serial_devices[i]);
3256
            if (!serial_hds[i]) {
3257
                fprintf(stderr, "qemu: could not open serial device '%s'\n", 
3258
                        serial_devices[i]);
3259
                exit(1);
3260
            }
3261
            if (!strcmp(serial_devices[i], "vc"))
3262
                qemu_chr_printf(serial_hds[i], "serial%d console\n", i);
3263
        }
3264
    }
3265

    
3266
    /* setup cpu signal handlers for MMU / self modifying code handling */
3267
#if !defined(CONFIG_SOFTMMU)
3268
    
3269
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
3270
    {
3271
        stack_t stk;
3272
        signal_stack = memalign(16, SIGNAL_STACK_SIZE);
3273
        stk.ss_sp = signal_stack;
3274
        stk.ss_size = SIGNAL_STACK_SIZE;
3275
        stk.ss_flags = 0;
3276

    
3277
        if (sigaltstack(&stk, NULL) < 0) {
3278
            perror("sigaltstack");
3279
            exit(1);
3280
        }
3281
    }
3282
#endif
3283
    {
3284
        struct sigaction act;
3285
        
3286
        sigfillset(&act.sa_mask);
3287
        act.sa_flags = SA_SIGINFO;
3288
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
3289
        act.sa_flags |= SA_ONSTACK;
3290
#endif
3291
        act.sa_sigaction = host_segv_handler;
3292
        sigaction(SIGSEGV, &act, NULL);
3293
        sigaction(SIGBUS, &act, NULL);
3294
#if defined (TARGET_I386) && defined(USE_CODE_COPY)
3295
        sigaction(SIGFPE, &act, NULL);
3296
#endif
3297
    }
3298
#endif
3299

    
3300
#ifndef _WIN32
3301
    {
3302
        struct sigaction act;
3303
        sigfillset(&act.sa_mask);
3304
        act.sa_flags = 0;
3305
        act.sa_handler = SIG_IGN;
3306
        sigaction(SIGPIPE, &act, NULL);
3307
    }
3308
#endif
3309
    init_timers();
3310

    
3311
#if defined(TARGET_I386)
3312
    pc_init(ram_size, vga_ram_size, boot_device,
3313
            ds, fd_filename, snapshot,
3314
            kernel_filename, kernel_cmdline, initrd_filename);
3315
#elif defined(TARGET_PPC)
3316
    ppc_init(ram_size, vga_ram_size, boot_device,
3317
             ds, fd_filename, snapshot,
3318
             kernel_filename, kernel_cmdline, initrd_filename);
3319
#endif
3320

    
3321
    gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
3322
    qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
3323

    
3324
#ifdef CONFIG_GDBSTUB
3325
    if (use_gdbstub) {
3326
        if (gdbserver_start(gdbstub_port) < 0) {
3327
            fprintf(stderr, "Could not open gdbserver socket on port %d\n", 
3328
                    gdbstub_port);
3329
            exit(1);
3330
        } else {
3331
            printf("Waiting gdb connection on port %d\n", gdbstub_port);
3332
        }
3333
    } else 
3334
#endif
3335
    {
3336
        /* XXX: simplify init */
3337
        read_passwords();
3338
        if (start_emulation) {
3339
            vm_start();
3340
        }
3341
    }
3342
    main_loop();
3343
    quit_timers();
3344
    return 0;
3345
}