vl.c 147.1 KB
Newer Older
1
/*
B
bellard 已提交
2
 * QEMU System Emulator
3
 *
B
bellard 已提交
4
 * Copyright (c) 2003-2008 Fabrice Bellard
5
 *
B
bellard 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
23
 */
P
pbrook 已提交
24 25 26 27 28 29 30
#include "hw/hw.h"
#include "hw/boards.h"
#include "hw/usb.h"
#include "hw/pcmcia.h"
#include "hw/pc.h"
#include "hw/audiodev.h"
#include "hw/isa.h"
A
aurel32 已提交
31
#include "hw/baum.h"
32
#include "hw/bt.h"
P
pbrook 已提交
33 34 35 36 37 38
#include "net.h"
#include "console.h"
#include "sysemu.h"
#include "gdbstub.h"
#include "qemu-timer.h"
#include "qemu-char.h"
M
malc 已提交
39
#include "cache-utils.h"
P
pbrook 已提交
40 41
#include "block.h"
#include "audio/audio.h"
A
aliguori 已提交
42
#include "migration.h"
A
aliguori 已提交
43
#include "kvm.h"
A
aliguori 已提交
44
#include "balloon.h"
B
bellard 已提交
45

46 47 48 49 50
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include <errno.h>
B
bellard 已提交
51
#include <sys/time.h>
52
#include <zlib.h>
B
bellard 已提交
53 54 55

#ifndef _WIN32
#include <sys/times.h>
B
bellard 已提交
56
#include <sys/wait.h>
B
bellard 已提交
57 58
#include <termios.h>
#include <sys/mman.h>
B
bellard 已提交
59
#include <sys/ioctl.h>
B
blueswir1 已提交
60
#include <sys/resource.h>
B
bellard 已提交
61
#include <sys/socket.h>
B
bellard 已提交
62
#include <netinet/in.h>
B
blueswir1 已提交
63 64 65 66 67 68 69 70
#include <net/if.h>
#if defined(__NetBSD__)
#include <net/if_tap.h>
#endif
#ifdef __linux__
#include <linux/if_tun.h>
#endif
#include <arpa/inet.h>
B
bellard 已提交
71
#include <dirent.h>
B
bellard 已提交
72
#include <netdb.h>
73
#include <sys/select.h>
B
bellard 已提交
74 75
#ifdef _BSD
#include <sys/stat.h>
B
blueswir1 已提交
76
#ifdef __FreeBSD__
B
bellard 已提交
77
#include <libutil.h>
B
blueswir1 已提交
78 79
#else
#include <util.h>
80
#endif
T
ths 已提交
81 82
#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
#include <freebsd/stdlib.h>
B
bellard 已提交
83
#else
84
#ifdef __linux__
B
bellard 已提交
85 86
#include <pty.h>
#include <malloc.h>
87
#include <linux/rtc.h>
T
ths 已提交
88 89 90 91 92 93

/* For the benefit of older linux systems which don't supply it,
   we use a local copy of hpet.h. */
/* #include <linux/hpet.h> */
#include "hpet.h"

B
bellard 已提交
94
#include <linux/ppdev.h>
95
#include <linux/parport.h>
96 97
#endif
#ifdef __sun__
98 99 100 101 102 103 104 105 106 107 108 109 110
#include <sys/stat.h>
#include <sys/ethernet.h>
#include <sys/sockio.h>
#include <netinet/arp.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h> // must come after ip.h
#include <netinet/udp.h>
#include <netinet/tcp.h>
#include <net/if.h>
#include <syslog.h>
#include <stropts.h>
B
bellard 已提交
111
#endif
B
bellard 已提交
112
#endif
B
bellard 已提交
113
#endif
B
bellard 已提交
114

115 116
#include "qemu_socket.h"

B
bellard 已提交
117 118 119 120
#if defined(CONFIG_SLIRP)
#include "libslirp.h"
#endif

121 122 123 124
#if defined(__OpenBSD__)
#include <util.h>
#endif

125 126 127 128
#if defined(CONFIG_VDE)
#include <libvdeplug.h>
#endif

B
bellard 已提交
129
#ifdef _WIN32
B
bellard 已提交
130
#include <malloc.h>
B
bellard 已提交
131
#include <sys/timeb.h>
T
ths 已提交
132
#include <mmsystem.h>
B
bellard 已提交
133 134 135 136
#define getopt_long_only getopt_long
#define memalign(align, size) malloc(size)
#endif

B
bellard 已提交
137
#ifdef CONFIG_SDL
B
bellard 已提交
138
#ifdef __APPLE__
139
#include <SDL/SDL.h>
B
bellard 已提交
140
#endif
B
bellard 已提交
141
#endif /* CONFIG_SDL */
142

143 144 145 146 147
#ifdef CONFIG_COCOA
#undef main
#define main qemu_main
#endif /* CONFIG_COCOA */

148
#include "disas.h"
B
bellard 已提交
149

150
#include "exec-all.h"
151

152
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
T
ths 已提交
153
#define DEFAULT_NETWORK_DOWN_SCRIPT "/etc/qemu-ifdown"
P
pbrook 已提交
154 155 156 157 158
#ifdef __sun__
#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
#else
#define SMBD_COMMAND "/usr/sbin/smbd"
#endif
B
bellard 已提交
159

160
//#define DEBUG_UNUSED_IOPORT
161
//#define DEBUG_IOPORT
162 163
//#define DEBUG_NET
//#define DEBUG_SLIRP
164

B
bellard 已提交
165 166 167
#ifdef TARGET_PPC
#define DEFAULT_RAM_SIZE 144
#else
168
#define DEFAULT_RAM_SIZE 128
B
bellard 已提交
169
#endif
170

P
pbrook 已提交
171 172 173
/* Max number of USB devices that can be specified on the commandline.  */
#define MAX_USB_CMDLINE 8

174 175 176
/* Max number of bluetooth switches on the commandline.  */
#define MAX_BT_CMDLINE 10

177 178
/* XXX: use a two level table to limit memory usage */
#define MAX_IOPORTS 65536
179

B
bellard 已提交
180
const char *bios_dir = CONFIG_QEMU_SHAREDIR;
181
const char *bios_name = NULL;
B
blueswir1 已提交
182 183 184
static void *ioport_opaque[MAX_IOPORTS];
static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
T
ths 已提交
185
/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
B
bellard 已提交
186
   to store the VM snapshots */
T
ths 已提交
187 188
DriveInfo drives_table[MAX_DRIVES+1];
int nb_drives;
B
blueswir1 已提交
189
static int vga_ram_size;
M
malc 已提交
190
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
191
DisplayState display_state;
192
int nographic;
B
blueswir1 已提交
193
static int curses;
194
const char* keyboard_layout = NULL;
195
int64_t ticks_per_sec;
196
ram_addr_t ram_size;
197
int nb_nics;
B
bellard 已提交
198
NICInfo nd_table[MAX_NICS];
199
int vm_running;
200 201
static int rtc_utc = 1;
static int rtc_date_offset = -1; /* -1 means no change */
202
int cirrus_vga_enabled = 1;
203
int vmsvga_enabled = 0;
204 205 206
#ifdef TARGET_SPARC
int graphic_width = 1024;
int graphic_height = 768;
B
blueswir1 已提交
207
int graphic_depth = 8;
208
#else
209 210
int graphic_width = 800;
int graphic_height = 600;
211
int graphic_depth = 15;
B
blueswir1 已提交
212
#endif
B
blueswir1 已提交
213
static int full_screen = 0;
214
#ifdef CONFIG_SDL
B
blueswir1 已提交
215
static int no_frame = 0;
216
#endif
T
ths 已提交
217
int no_quit = 0;
218
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
219
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
220 221 222
#ifdef TARGET_I386
int win2k_install_hack = 0;
#endif
B
bellard 已提交
223
int usb_enabled = 0;
B
bellard 已提交
224
int smp_cpus = 1;
225
const char *vnc_display;
B
bellard 已提交
226
int acpi_enabled = 1;
A
aliguori 已提交
227
int no_hpet = 0;
B
bellard 已提交
228
int fd_bootchk = 1;
B
bellard 已提交
229
int no_reboot = 0;
A
aurel32 已提交
230
int no_shutdown = 0;
231
int cursor_hide = 1;
232
int graphic_rotate = 0;
T
ths 已提交
233
int daemonize = 0;
234 235
const char *option_rom[MAX_OPTION_ROMS];
int nb_option_roms;
236
int semihosting_enabled = 0;
237 238 239
#ifdef TARGET_ARM
int old_param = 0;
#endif
T
ths 已提交
240
const char *qemu_name;
T
ths 已提交
241
int alt_grab = 0;
B
blueswir1 已提交
242 243 244 245
#ifdef TARGET_SPARC
unsigned int nb_prom_envs = 0;
const char *prom_envs[MAX_PROM_ENVS];
#endif
B
blueswir1 已提交
246 247
static int nb_drives_opt;
static struct drive_opt {
248 249 250
    const char *file;
    char opt[1024];
} drives_opt[MAX_DRIVES];
251

252 253
static CPUState *cur_cpu;
static CPUState *next_cpu;
254
static int event_pending = 1;
T
ths 已提交
255
/* Conversion factor from emulated instructions to virtual clock ticks.  */
P
pbrook 已提交
256
static int icount_time_shift;
T
ths 已提交
257
/* Arbitrarily pick 1MIPS as the minimum allowable speed.  */
P
pbrook 已提交
258 259 260
#define MAX_ICOUNT_SHIFT 10
/* Compensate for varying guest execution speed.  */
static int64_t qemu_icount_bias;
B
blueswir1 已提交
261 262
static QEMUTimer *icount_rt_timer;
static QEMUTimer *icount_vm_timer;
263

264 265
uint8_t qemu_uuid[16];

266
/***********************************************************/
267 268 269
/* x86 ISA bus support */

target_phys_addr_t isa_mem_base = 0;
B
bellard 已提交
270
PicState2 *isa_pic;
271

272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl;
static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel;

static uint32_t ioport_read(int index, uint32_t address)
{
    static IOPortReadFunc *default_func[3] = {
        default_ioport_readb,
        default_ioport_readw,
        default_ioport_readl
    };
    IOPortReadFunc *func = ioport_read_table[index][address];
    if (!func)
        func = default_func[index];
    return func(ioport_opaque[address], address);
}

static void ioport_write(int index, uint32_t address, uint32_t data)
{
    static IOPortWriteFunc *default_func[3] = {
        default_ioport_writeb,
        default_ioport_writew,
        default_ioport_writel
    };
    IOPortWriteFunc *func = ioport_write_table[index][address];
    if (!func)
        func = default_func[index];
    func(ioport_opaque[address], address, data);
}

301
static uint32_t default_ioport_readb(void *opaque, uint32_t address)
302 303
{
#ifdef DEBUG_UNUSED_IOPORT
T
ths 已提交
304
    fprintf(stderr, "unused inb: port=0x%04x\n", address);
305
#endif
B
bellard 已提交
306
    return 0xff;
307 308
}

309
static void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
310 311
{
#ifdef DEBUG_UNUSED_IOPORT
T
ths 已提交
312
    fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
313 314 315 316
#endif
}

/* default is to make two byte accesses */
317
static uint32_t default_ioport_readw(void *opaque, uint32_t address)
318 319
{
    uint32_t data;
320
    data = ioport_read(0, address);
B
bellard 已提交
321
    address = (address + 1) & (MAX_IOPORTS - 1);
322
    data |= ioport_read(0, address) << 8;
323 324 325
    return data;
}

326
static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
327
{
328
    ioport_write(0, address, data & 0xff);
B
bellard 已提交
329
    address = (address + 1) & (MAX_IOPORTS - 1);
330
    ioport_write(0, address, (data >> 8) & 0xff);
331 332
}

333
static uint32_t default_ioport_readl(void *opaque, uint32_t address)
334
{
B
bellard 已提交
335
#ifdef DEBUG_UNUSED_IOPORT
T
ths 已提交
336
    fprintf(stderr, "unused inl: port=0x%04x\n", address);
B
bellard 已提交
337 338
#endif
    return 0xffffffff;
339 340
}

341
static void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
342
{
B
bellard 已提交
343
#ifdef DEBUG_UNUSED_IOPORT
T
ths 已提交
344
    fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
B
bellard 已提交
345
#endif
346 347
}

B
bellard 已提交
348
/* size is the word size in byte */
349
int register_ioport_read(int start, int length, int size,
350
                         IOPortReadFunc *func, void *opaque)
B
bellard 已提交
351
{
B
bellard 已提交
352
    int i, bsize;
B
bellard 已提交
353

354
    if (size == 1) {
B
bellard 已提交
355
        bsize = 0;
356
    } else if (size == 2) {
B
bellard 已提交
357
        bsize = 1;
358
    } else if (size == 4) {
B
bellard 已提交
359
        bsize = 2;
360
    } else {
361
        hw_error("register_ioport_read: invalid size");
B
bellard 已提交
362
        return -1;
363 364
    }
    for(i = start; i < start + length; i += size) {
B
bellard 已提交
365
        ioport_read_table[bsize][i] = func;
366
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
367
            hw_error("register_ioport_read: invalid opaque");
368 369
        ioport_opaque[i] = opaque;
    }
B
bellard 已提交
370 371 372
    return 0;
}

B
bellard 已提交
373
/* size is the word size in byte */
374
int register_ioport_write(int start, int length, int size,
375
                          IOPortWriteFunc *func, void *opaque)
B
bellard 已提交
376
{
B
bellard 已提交
377
    int i, bsize;
B
bellard 已提交
378

379
    if (size == 1) {
B
bellard 已提交
380
        bsize = 0;
381
    } else if (size == 2) {
B
bellard 已提交
382
        bsize = 1;
383
    } else if (size == 4) {
B
bellard 已提交
384
        bsize = 2;
385
    } else {
386
        hw_error("register_ioport_write: invalid size");
B
bellard 已提交
387
        return -1;
388 389
    }
    for(i = start; i < start + length; i += size) {
B
bellard 已提交
390
        ioport_write_table[bsize][i] = func;
391 392
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
            hw_error("register_ioport_write: invalid opaque");
393 394
        ioport_opaque[i] = opaque;
    }
B
bellard 已提交
395 396 397
    return 0;
}

B
bellard 已提交
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
void isa_unassign_ioport(int start, int length)
{
    int i;

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

        ioport_write_table[0][i] = default_ioport_writeb;
        ioport_write_table[1][i] = default_ioport_writew;
        ioport_write_table[2][i] = default_ioport_writel;
    }
}

B
bellard 已提交
413 414
/***********************************************************/

415
void cpu_outb(CPUState *env, int addr, int val)
416
{
417 418 419
#ifdef DEBUG_IOPORT
    if (loglevel & CPU_LOG_IOPORT)
        fprintf(logfile, "outb: %04x %02x\n", addr, val);
420
#endif
421
    ioport_write(0, addr, val);
422 423 424 425
#ifdef USE_KQEMU
    if (env)
        env->last_io_time = cpu_get_time_fast();
#endif
426 427
}

428
void cpu_outw(CPUState *env, int addr, int val)
429
{
430 431 432
#ifdef DEBUG_IOPORT
    if (loglevel & CPU_LOG_IOPORT)
        fprintf(logfile, "outw: %04x %04x\n", addr, val);
433
#endif
434
    ioport_write(1, addr, val);
435 436 437 438
#ifdef USE_KQEMU
    if (env)
        env->last_io_time = cpu_get_time_fast();
#endif
439 440
}

441
void cpu_outl(CPUState *env, int addr, int val)
442
{
443 444 445 446
#ifdef DEBUG_IOPORT
    if (loglevel & CPU_LOG_IOPORT)
        fprintf(logfile, "outl: %04x %08x\n", addr, val);
#endif
447
    ioport_write(2, addr, val);
448 449 450 451
#ifdef USE_KQEMU
    if (env)
        env->last_io_time = cpu_get_time_fast();
#endif
452 453
}

454
int cpu_inb(CPUState *env, int addr)
455
{
456
    int val;
457
    val = ioport_read(0, addr);
458 459 460
#ifdef DEBUG_IOPORT
    if (loglevel & CPU_LOG_IOPORT)
        fprintf(logfile, "inb : %04x %02x\n", addr, val);
461 462 463 464
#endif
#ifdef USE_KQEMU
    if (env)
        env->last_io_time = cpu_get_time_fast();
465 466
#endif
    return val;
467 468
}

469
int cpu_inw(CPUState *env, int addr)
470
{
471
    int val;
472
    val = ioport_read(1, addr);
473 474 475
#ifdef DEBUG_IOPORT
    if (loglevel & CPU_LOG_IOPORT)
        fprintf(logfile, "inw : %04x %04x\n", addr, val);
476 477 478 479
#endif
#ifdef USE_KQEMU
    if (env)
        env->last_io_time = cpu_get_time_fast();
480 481
#endif
    return val;
482 483
}

484
int cpu_inl(CPUState *env, int addr)
485
{
486
    int val;
487
    val = ioport_read(2, addr);
488 489 490
#ifdef DEBUG_IOPORT
    if (loglevel & CPU_LOG_IOPORT)
        fprintf(logfile, "inl : %04x %08x\n", addr, val);
491 492 493 494
#endif
#ifdef USE_KQEMU
    if (env)
        env->last_io_time = cpu_get_time_fast();
495 496
#endif
    return val;
497 498 499 500 501 502
}

/***********************************************************/
void hw_error(const char *fmt, ...)
{
    va_list ap;
B
bellard 已提交
503
    CPUState *env;
504 505 506 507 508

    va_start(ap, fmt);
    fprintf(stderr, "qemu: hardware error: ");
    vfprintf(stderr, fmt, ap);
    fprintf(stderr, "\n");
B
bellard 已提交
509 510
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
        fprintf(stderr, "CPU #%d:\n", env->cpu_index);
511
#ifdef TARGET_I386
B
bellard 已提交
512
        cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
513
#else
B
bellard 已提交
514
        cpu_dump_state(env, stderr, fprintf, 0);
515
#endif
B
bellard 已提交
516
    }
517 518 519
    va_end(ap);
    abort();
}
A
aliguori 已提交
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
 
/***************/
/* ballooning */

static QEMUBalloonEvent *qemu_balloon_event;
void *qemu_balloon_event_opaque;

void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque)
{
    qemu_balloon_event = func;
    qemu_balloon_event_opaque = opaque;
}

void qemu_balloon(ram_addr_t target)
{
    if (qemu_balloon_event)
        qemu_balloon_event(qemu_balloon_event_opaque, target);
}

ram_addr_t qemu_balloon_status(void)
{
    if (qemu_balloon_event)
        return qemu_balloon_event(qemu_balloon_event_opaque, 0);
    return 0;
}
545

B
bellard 已提交
546 547 548 549 550
/***********************************************************/
/* keyboard/mouse */

static QEMUPutKBDEvent *qemu_put_kbd_event;
static void *qemu_put_kbd_event_opaque;
551 552
static QEMUPutMouseEntry *qemu_put_mouse_event_head;
static QEMUPutMouseEntry *qemu_put_mouse_event_current;
B
bellard 已提交
553 554 555 556 557 558 559

void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
{
    qemu_put_kbd_event_opaque = opaque;
    qemu_put_kbd_event = func;
}

560 561 562
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
                                                void *opaque, int absolute,
                                                const char *name)
B
bellard 已提交
563
{
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
    QEMUPutMouseEntry *s, *cursor;

    s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
    if (!s)
        return NULL;

    s->qemu_put_mouse_event = func;
    s->qemu_put_mouse_event_opaque = opaque;
    s->qemu_put_mouse_event_absolute = absolute;
    s->qemu_put_mouse_event_name = qemu_strdup(name);
    s->next = NULL;

    if (!qemu_put_mouse_event_head) {
        qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
        return s;
    }

    cursor = qemu_put_mouse_event_head;
    while (cursor->next != NULL)
        cursor = cursor->next;

    cursor->next = s;
    qemu_put_mouse_event_current = s;

    return s;
}

void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
{
    QEMUPutMouseEntry *prev = NULL, *cursor;

    if (!qemu_put_mouse_event_head || entry == NULL)
        return;

    cursor = qemu_put_mouse_event_head;
    while (cursor != NULL && cursor != entry) {
        prev = cursor;
        cursor = cursor->next;
    }

    if (cursor == NULL) // does not exist or list empty
        return;
    else if (prev == NULL) { // entry is head
        qemu_put_mouse_event_head = cursor->next;
        if (qemu_put_mouse_event_current == entry)
            qemu_put_mouse_event_current = cursor->next;
        qemu_free(entry->qemu_put_mouse_event_name);
        qemu_free(entry);
        return;
    }

    prev->next = entry->next;

    if (qemu_put_mouse_event_current == entry)
        qemu_put_mouse_event_current = prev;

    qemu_free(entry->qemu_put_mouse_event_name);
    qemu_free(entry);
B
bellard 已提交
622 623 624 625 626 627 628 629 630 631 632
}

void kbd_put_keycode(int keycode)
{
    if (qemu_put_kbd_event) {
        qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
    }
}

void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
{
633 634
    QEMUPutMouseEvent *mouse_event;
    void *mouse_event_opaque;
635
    int width;
636 637 638 639 640 641 642 643 644 645 646

    if (!qemu_put_mouse_event_current) {
        return;
    }

    mouse_event =
        qemu_put_mouse_event_current->qemu_put_mouse_event;
    mouse_event_opaque =
        qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;

    if (mouse_event) {
647 648 649 650
        if (graphic_rotate) {
            if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
                width = 0x7fff;
            else
651
                width = graphic_width - 1;
652 653 654 655 656
            mouse_event(mouse_event_opaque,
                                 width - dy, dx, dz, buttons_state);
        } else
            mouse_event(mouse_event_opaque,
                                 dx, dy, dz, buttons_state);
B
bellard 已提交
657 658 659
    }
}

660 661
int kbd_mouse_is_absolute(void)
{
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
    if (!qemu_put_mouse_event_current)
        return 0;

    return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
}

void do_info_mice(void)
{
    QEMUPutMouseEntry *cursor;
    int index = 0;

    if (!qemu_put_mouse_event_head) {
        term_printf("No mouse devices connected\n");
        return;
    }

    term_printf("Mouse devices available:\n");
    cursor = qemu_put_mouse_event_head;
    while (cursor != NULL) {
        term_printf("%c Mouse #%d: %s\n",
                    (cursor == qemu_put_mouse_event_current ? '*' : ' '),
                    index, cursor->qemu_put_mouse_event_name);
        index++;
        cursor = cursor->next;
    }
}

void do_mouse_set(int index)
{
    QEMUPutMouseEntry *cursor;
    int i = 0;

    if (!qemu_put_mouse_event_head) {
        term_printf("No mouse devices connected\n");
        return;
    }

    cursor = qemu_put_mouse_event_head;
    while (cursor != NULL && index != i) {
        i++;
        cursor = cursor->next;
    }

    if (cursor != NULL)
        qemu_put_mouse_event_current = cursor;
    else
        term_printf("Mouse at given index not found\n");
709 710
}

711 712
/* compute with 96 bit intermediate result: (a*b)/c */
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
713
{
714 715 716 717 718 719 720
    union {
        uint64_t ll;
        struct {
#ifdef WORDS_BIGENDIAN
            uint32_t high, low;
#else
            uint32_t low, high;
721
#endif
722 723 724
        } l;
    } u, res;
    uint64_t rl, rh;
725

726 727 728 729 730 731 732
    u.ll = a;
    rl = (uint64_t)u.l.low * (uint64_t)b;
    rh = (uint64_t)u.l.high * (uint64_t)b;
    rh += (rl >> 32);
    res.l.high = rh / c;
    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
    return res.ll;
733 734
}

735 736
/***********************************************************/
/* real time host monotonic timer */
737

738
#define QEMU_TIMER_BASE 1000000000LL
739

740
#ifdef WIN32
741

742
static int64_t clock_freq;
B
bellard 已提交
743

744
static void init_get_clock(void)
B
bellard 已提交
745
{
746 747
    LARGE_INTEGER freq;
    int ret;
748 749 750 751 752 753
    ret = QueryPerformanceFrequency(&freq);
    if (ret == 0) {
        fprintf(stderr, "Could not calibrate ticks\n");
        exit(1);
    }
    clock_freq = freq.QuadPart;
B
bellard 已提交
754 755
}

756
static int64_t get_clock(void)
B
bellard 已提交
757
{
758 759 760
    LARGE_INTEGER ti;
    QueryPerformanceCounter(&ti);
    return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
B
bellard 已提交
761 762
}

763
#else
B
bellard 已提交
764

765 766 767
static int use_rt_clock;

static void init_get_clock(void)
B
bellard 已提交
768
{
769
    use_rt_clock = 0;
A
aurel32 已提交
770
#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
771 772 773 774 775 776 777
    {
        struct timespec ts;
        if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
            use_rt_clock = 1;
        }
    }
#endif
B
bellard 已提交
778 779
}

780
static int64_t get_clock(void)
B
bellard 已提交
781
{
A
aurel32 已提交
782
#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
783 784 785 786
    if (use_rt_clock) {
        struct timespec ts;
        clock_gettime(CLOCK_MONOTONIC, &ts);
        return ts.tv_sec * 1000000000LL + ts.tv_nsec;
787
    } else
B
bellard 已提交
788
#endif
789 790 791 792 793 794 795
    {
        /* XXX: using gettimeofday leads to problems if the date
           changes, so it should be avoided. */
        struct timeval tv;
        gettimeofday(&tv, NULL);
        return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
    }
B
bellard 已提交
796
}
797 798
#endif

P
pbrook 已提交
799 800 801 802 803 804 805 806 807 808 809 810 811 812
/* Return the virtual CPU time, based on the instruction counter.  */
static int64_t cpu_get_icount(void)
{
    int64_t icount;
    CPUState *env = cpu_single_env;;
    icount = qemu_icount;
    if (env) {
        if (!can_do_io(env))
            fprintf(stderr, "Bad clock read\n");
        icount -= (env->icount_decr.u16.low + env->icount_extra);
    }
    return qemu_icount_bias + (icount << icount_time_shift);
}

813 814 815
/***********************************************************/
/* guest cycle counter */

816
static int64_t cpu_ticks_prev;
817
static int64_t cpu_ticks_offset;
818
static int64_t cpu_clock_offset;
819
static int cpu_ticks_enabled;
820

821 822
/* return the host CPU cycle counter and handle stop/restart */
int64_t cpu_get_ticks(void)
823
{
P
pbrook 已提交
824 825 826
    if (use_icount) {
        return cpu_get_icount();
    }
827 828 829
    if (!cpu_ticks_enabled) {
        return cpu_ticks_offset;
    } else {
830 831 832 833 834 835 836 837 838
        int64_t ticks;
        ticks = cpu_get_real_ticks();
        if (cpu_ticks_prev > ticks) {
            /* Note: non increasing ticks may happen if the host uses
               software suspend */
            cpu_ticks_offset += cpu_ticks_prev - ticks;
        }
        cpu_ticks_prev = ticks;
        return ticks + cpu_ticks_offset;
839
    }
840 841
}

842 843 844 845 846 847 848 849 850 851 852 853
/* return the host CPU monotonic timer and handle stop/restart */
static int64_t cpu_get_clock(void)
{
    int64_t ti;
    if (!cpu_ticks_enabled) {
        return cpu_clock_offset;
    } else {
        ti = get_clock();
        return ti + cpu_clock_offset;
    }
}

854 855 856
/* enable cpu_get_ticks() */
void cpu_enable_ticks(void)
{
857 858
    if (!cpu_ticks_enabled) {
        cpu_ticks_offset -= cpu_get_real_ticks();
859
        cpu_clock_offset -= get_clock();
860 861
        cpu_ticks_enabled = 1;
    }
862 863 864 865 866 867
}

/* disable cpu_get_ticks() : the clock is stopped. You must not call
   cpu_get_ticks() after that.  */
void cpu_disable_ticks(void)
{
868 869
    if (cpu_ticks_enabled) {
        cpu_ticks_offset = cpu_get_ticks();
870
        cpu_clock_offset = cpu_get_clock();
871 872
        cpu_ticks_enabled = 0;
    }
873 874
}

875 876
/***********************************************************/
/* timers */
877

878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
#define QEMU_TIMER_REALTIME 0
#define QEMU_TIMER_VIRTUAL  1

struct QEMUClock {
    int type;
    /* XXX: add frequency */
};

struct QEMUTimer {
    QEMUClock *clock;
    int64_t expire_time;
    QEMUTimerCB *cb;
    void *opaque;
    struct QEMUTimer *next;
};

894 895
struct qemu_alarm_timer {
    char const *name;
896
    unsigned int flags;
897 898 899

    int (*start)(struct qemu_alarm_timer *t);
    void (*stop)(struct qemu_alarm_timer *t);
900
    void (*rearm)(struct qemu_alarm_timer *t);
901 902 903
    void *priv;
};

904
#define ALARM_FLAG_DYNTICKS  0x1
905
#define ALARM_FLAG_EXPIRED   0x2
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922

static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
{
    return t->flags & ALARM_FLAG_DYNTICKS;
}

static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
{
    if (!alarm_has_dynticks(t))
        return;

    t->rearm(t);
}

/* TODO: MIN_TIMER_REARM_US should be optimized */
#define MIN_TIMER_REARM_US 250

923
static struct qemu_alarm_timer *alarm_timer;
924
#ifndef _WIN32
925
static int alarm_timer_rfd, alarm_timer_wfd;
926
#endif
927

B
bellard 已提交
928
#ifdef _WIN32
929 930 931 932 933 934 935 936 937

struct qemu_alarm_win32 {
    MMRESULT timerId;
    HANDLE host_alarm;
    unsigned int period;
} alarm_win32_data = {0, NULL, -1};

static int win32_start_timer(struct qemu_alarm_timer *t);
static void win32_stop_timer(struct qemu_alarm_timer *t);
938
static void win32_rearm_timer(struct qemu_alarm_timer *t);
939

B
bellard 已提交
940
#else
941 942 943 944

static int unix_start_timer(struct qemu_alarm_timer *t);
static void unix_stop_timer(struct qemu_alarm_timer *t);

945 946
#ifdef __linux__

947 948 949 950
static int dynticks_start_timer(struct qemu_alarm_timer *t);
static void dynticks_stop_timer(struct qemu_alarm_timer *t);
static void dynticks_rearm_timer(struct qemu_alarm_timer *t);

T
ths 已提交
951 952 953
static int hpet_start_timer(struct qemu_alarm_timer *t);
static void hpet_stop_timer(struct qemu_alarm_timer *t);

954 955 956
static int rtc_start_timer(struct qemu_alarm_timer *t);
static void rtc_stop_timer(struct qemu_alarm_timer *t);

957
#endif /* __linux__ */
958

959 960
#endif /* _WIN32 */

P
pbrook 已提交
961
/* Correlation between real and virtual time is always going to be
T
ths 已提交
962
   fairly approximate, so ignore small variation.
P
pbrook 已提交
963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
   When the guest is idle real and virtual time will be aligned in
   the IO wait loop.  */
#define ICOUNT_WOBBLE (QEMU_TIMER_BASE / 10)

static void icount_adjust(void)
{
    int64_t cur_time;
    int64_t cur_icount;
    int64_t delta;
    static int64_t last_delta;
    /* If the VM is not running, then do nothing.  */
    if (!vm_running)
        return;

    cur_time = cpu_get_clock();
    cur_icount = qemu_get_clock(vm_clock);
    delta = cur_icount - cur_time;
    /* FIXME: This is a very crude algorithm, somewhat prone to oscillation.  */
    if (delta > 0
        && last_delta + ICOUNT_WOBBLE < delta * 2
        && icount_time_shift > 0) {
        /* The guest is getting too far ahead.  Slow time down.  */
        icount_time_shift--;
    }
    if (delta < 0
        && last_delta - ICOUNT_WOBBLE > delta * 2
        && icount_time_shift < MAX_ICOUNT_SHIFT) {
        /* The guest is getting too far behind.  Speed time up.  */
        icount_time_shift++;
    }
    last_delta = delta;
    qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
}

static void icount_adjust_rt(void * opaque)
{
    qemu_mod_timer(icount_rt_timer,
                   qemu_get_clock(rt_clock) + 1000);
    icount_adjust();
}

static void icount_adjust_vm(void * opaque)
{
    qemu_mod_timer(icount_vm_timer,
                   qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
    icount_adjust();
}

static void init_icount_adjust(void)
{
    /* Have both realtime and virtual time triggers for speed adjustment.
       The realtime trigger catches emulated time passing too slowly,
       the virtual time trigger catches emulated time passing too fast.
       Realtime triggers occur even when idle, so use them less frequently
       than VM triggers.  */
    icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
    qemu_mod_timer(icount_rt_timer,
                   qemu_get_clock(rt_clock) + 1000);
    icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
    qemu_mod_timer(icount_vm_timer,
                   qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
}

1026
static struct qemu_alarm_timer alarm_timers[] = {
1027
#ifndef _WIN32
1028
#ifdef __linux__
1029 1030
    {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
     dynticks_stop_timer, dynticks_rearm_timer, NULL},
T
ths 已提交
1031
    /* HPET - if available - is preferred */
1032
    {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
T
ths 已提交
1033
    /* ...otherwise try RTC */
1034
    {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
1035
#endif
1036
    {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
1037
#else
1038 1039 1040 1041
    {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
     win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
    {"win32", 0, win32_start_timer,
     win32_stop_timer, NULL, &alarm_win32_data},
1042 1043 1044 1045
#endif
    {NULL, }
};

1046
static void show_available_alarms(void)
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
{
    int i;

    printf("Available alarm timers, in order of precedence:\n");
    for (i = 0; alarm_timers[i].name; i++)
        printf("%s\n", alarm_timers[i].name);
}

static void configure_alarms(char const *opt)
{
    int i;
    int cur = 0;
    int count = (sizeof(alarm_timers) / sizeof(*alarm_timers)) - 1;
    char *arg;
    char *name;
P
pbrook 已提交
1062
    struct qemu_alarm_timer tmp;
1063

1064
    if (!strcmp(opt, "?")) {
1065 1066 1067 1068 1069 1070 1071 1072 1073
        show_available_alarms();
        exit(0);
    }

    arg = strdup(opt);

    /* Reorder the array */
    name = strtok(arg, ",");
    while (name) {
1074
        for (i = 0; i < count && alarm_timers[i].name; i++) {
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
            if (!strcmp(alarm_timers[i].name, name))
                break;
        }

        if (i == count) {
            fprintf(stderr, "Unknown clock %s\n", name);
            goto next;
        }

        if (i < cur)
            /* Ignore */
            goto next;

	/* Swap */
        tmp = alarm_timers[i];
        alarm_timers[i] = alarm_timers[cur];
        alarm_timers[cur] = tmp;

        cur++;
next:
        name = strtok(NULL, ",");
    }

    free(arg);

    if (cur) {
P
pbrook 已提交
1101
        /* Disable remaining timers */
1102 1103
        for (i = cur; i < count; i++)
            alarm_timers[i].name = NULL;
1104 1105 1106
    } else {
        show_available_alarms();
        exit(1);
1107 1108 1109
    }
}

1110 1111 1112 1113 1114
QEMUClock *rt_clock;
QEMUClock *vm_clock;

static QEMUTimer *active_timers[2];

1115
static QEMUClock *qemu_new_clock(int type)
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
{
    QEMUClock *clock;
    clock = qemu_mallocz(sizeof(QEMUClock));
    if (!clock)
        return NULL;
    clock->type = type;
    return clock;
}

QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
{
    QEMUTimer *ts;

    ts = qemu_mallocz(sizeof(QEMUTimer));
    ts->clock = clock;
    ts->cb = cb;
    ts->opaque = opaque;
    return ts;
}

void qemu_free_timer(QEMUTimer *ts)
{
    qemu_free(ts);
}

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

    /* NOTE: this code must be signal safe because
       qemu_timer_expired() can be called from a signal. */
    pt = &active_timers[ts->clock->type];
    for(;;) {
        t = *pt;
        if (!t)
            break;
        if (t == ts) {
            *pt = t->next;
            break;
        }
        pt = &t->next;
    }
}

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

    qemu_del_timer(ts);

    /* add the timer in the sorted list */
    /* NOTE: this code must be signal safe because
       qemu_timer_expired() can be called from a signal. */
    pt = &active_timers[ts->clock->type];
    for(;;) {
        t = *pt;
        if (!t)
            break;
1177
        if (t->expire_time > expire_time)
1178 1179 1180 1181 1182 1183
            break;
        pt = &t->next;
    }
    ts->expire_time = expire_time;
    ts->next = *pt;
    *pt = ts;
1184 1185

    /* Rearm if necessary  */
P
pbrook 已提交
1186 1187 1188 1189 1190 1191 1192 1193 1194
    if (pt == &active_timers[ts->clock->type]) {
        if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
            qemu_rearm_alarm_timer(alarm_timer);
        }
        /* Interrupt execution to force deadline recalculation.  */
        if (use_icount && cpu_single_env) {
            cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
        }
    }
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
}

int qemu_timer_pending(QEMUTimer *ts)
{
    QEMUTimer *t;
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
        if (t == ts)
            return 1;
    }
    return 0;
}

static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
{
    if (!timer_head)
        return 0;
    return (timer_head->expire_time <= current_time);
}

static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
{
    QEMUTimer *ts;
1217

1218 1219
    for(;;) {
        ts = *ptimer_head;
1220
        if (!ts || ts->expire_time > current_time)
1221 1222 1223 1224
            break;
        /* remove timer from the list before calling the callback */
        *ptimer_head = ts->next;
        ts->next = NULL;
1225

1226 1227 1228 1229 1230 1231 1232 1233 1234
        /* run the callback (the timer list can be modified) */
        ts->cb(ts->opaque);
    }
}

int64_t qemu_get_clock(QEMUClock *clock)
{
    switch(clock->type) {
    case QEMU_TIMER_REALTIME:
1235
        return get_clock() / 1000000;
1236 1237
    default:
    case QEMU_TIMER_VIRTUAL:
P
pbrook 已提交
1238 1239 1240 1241 1242
        if (use_icount) {
            return cpu_get_icount();
        } else {
            return cpu_get_clock();
        }
1243 1244 1245
    }
}

1246 1247 1248 1249 1250 1251 1252 1253
static void init_timers(void)
{
    init_get_clock();
    ticks_per_sec = QEMU_TIMER_BASE;
    rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
    vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
}

1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
/* save a timer */
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
{
    uint64_t expire_time;

    if (qemu_timer_pending(ts)) {
        expire_time = ts->expire_time;
    } else {
        expire_time = -1;
    }
    qemu_put_be64(f, expire_time);
}

void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
{
    uint64_t expire_time;

    expire_time = qemu_get_be64(f);
    if (expire_time != -1) {
        qemu_mod_timer(ts, expire_time);
    } else {
        qemu_del_timer(ts);
    }
}

static void timer_save(QEMUFile *f, void *opaque)
{
    if (cpu_ticks_enabled) {
        hw_error("cannot save state if virtual timers are running");
    }
1284 1285 1286
    qemu_put_be64(f, cpu_ticks_offset);
    qemu_put_be64(f, ticks_per_sec);
    qemu_put_be64(f, cpu_clock_offset);
1287 1288 1289 1290
}

static int timer_load(QEMUFile *f, void *opaque, int version_id)
{
1291
    if (version_id != 1 && version_id != 2)
1292 1293 1294 1295
        return -EINVAL;
    if (cpu_ticks_enabled) {
        return -EINVAL;
    }
1296 1297
    cpu_ticks_offset=qemu_get_be64(f);
    ticks_per_sec=qemu_get_be64(f);
1298
    if (version_id == 2) {
1299
        cpu_clock_offset=qemu_get_be64(f);
1300
    }
1301 1302 1303
    return 0;
}

B
bellard 已提交
1304
#ifdef _WIN32
1305
void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
B
bellard 已提交
1306 1307
                                 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
#else
1308
static void host_alarm_handler(int host_signum)
B
bellard 已提交
1309
#endif
1310
{
1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325
#if 0
#define DISP_FREQ 1000
    {
        static int64_t delta_min = INT64_MAX;
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
        static int count;
        ti = qemu_get_clock(vm_clock);
        if (last_clock != 0) {
            delta = ti - last_clock;
            if (delta < delta_min)
                delta_min = delta;
            if (delta > delta_max)
                delta_max = delta;
            delta_cum += delta;
            if (++count == DISP_FREQ) {
B
bellard 已提交
1326
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
                       muldiv64(delta_min, 1000000, ticks_per_sec),
                       muldiv64(delta_max, 1000000, ticks_per_sec),
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
                       (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
                count = 0;
                delta_min = INT64_MAX;
                delta_max = 0;
                delta_cum = 0;
            }
        }
        last_clock = ti;
    }
#endif
1340
    if (alarm_has_dynticks(alarm_timer) ||
P
pbrook 已提交
1341 1342 1343
        (!use_icount &&
            qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
                               qemu_get_clock(vm_clock))) ||
1344 1345
        qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
                           qemu_get_clock(rt_clock))) {
1346 1347
        CPUState *env = next_cpu;

1348
#ifdef _WIN32
1349 1350
        struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
        SetEvent(data->host_alarm);
1351 1352
#else
        static const char byte = 0;
1353
        write(alarm_timer_wfd, &byte, sizeof(byte));
1354
#endif
1355 1356
        alarm_timer->flags |= ALARM_FLAG_EXPIRED;

1357 1358 1359
        if (env) {
            /* stop the currently executing cpu because a timer occured */
            cpu_interrupt(env, CPU_INTERRUPT_EXIT);
1360
#ifdef USE_KQEMU
1361 1362 1363
            if (env->kqemu_enabled) {
                kqemu_cpu_interrupt(env);
            }
1364
#endif
1365
        }
1366
        event_pending = 1;
1367 1368 1369
    }
}

P
pbrook 已提交
1370
static int64_t qemu_next_deadline(void)
1371
{
P
pbrook 已提交
1372
    int64_t delta;
1373 1374

    if (active_timers[QEMU_TIMER_VIRTUAL]) {
P
pbrook 已提交
1375 1376 1377 1378 1379
        delta = active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
                     qemu_get_clock(vm_clock);
    } else {
        /* To avoid problems with overflow limit this to 2^32.  */
        delta = INT32_MAX;
1380 1381
    }

P
pbrook 已提交
1382 1383
    if (delta < 0)
        delta = 0;
1384

P
pbrook 已提交
1385 1386 1387
    return delta;
}

1388
#if defined(__linux__) || defined(_WIN32)
P
pbrook 已提交
1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
static uint64_t qemu_next_deadline_dyntick(void)
{
    int64_t delta;
    int64_t rtdelta;

    if (use_icount)
        delta = INT32_MAX;
    else
        delta = (qemu_next_deadline() + 999) / 1000;

    if (active_timers[QEMU_TIMER_REALTIME]) {
        rtdelta = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
                 qemu_get_clock(rt_clock))*1000;
        if (rtdelta < delta)
            delta = rtdelta;
    }

    if (delta < MIN_TIMER_REARM_US)
        delta = MIN_TIMER_REARM_US;

    return delta;
1410
}
1411
#endif
1412

1413 1414
#ifndef _WIN32

1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
/* Sets a specific flag */
static int fcntl_setfl(int fd, int flag)
{
    int flags;

    flags = fcntl(fd, F_GETFL);
    if (flags == -1)
        return -errno;

    if (fcntl(fd, F_SETFL, flags | flag) == -1)
        return -errno;

    return 0;
}

B
BSD fix  
bellard 已提交
1430 1431
#if defined(__linux__)

1432 1433
#define RTC_FREQ 1024

1434
static void enable_sigio_timer(int fd)
1435 1436 1437 1438 1439 1440 1441 1442 1443
{
    struct sigaction act;

    /* timer signal */
    sigfillset(&act.sa_mask);
    act.sa_flags = 0;
    act.sa_handler = host_alarm_handler;

    sigaction(SIGIO, &act, NULL);
1444
    fcntl_setfl(fd, O_ASYNC);
1445 1446
    fcntl(fd, F_SETOWN, getpid());
}
B
BSD fix  
bellard 已提交
1447

T
ths 已提交
1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481
static int hpet_start_timer(struct qemu_alarm_timer *t)
{
    struct hpet_info info;
    int r, fd;

    fd = open("/dev/hpet", O_RDONLY);
    if (fd < 0)
        return -1;

    /* Set frequency */
    r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
    if (r < 0) {
        fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
                "error, but for better emulation accuracy type:\n"
                "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
        goto fail;
    }

    /* Check capabilities */
    r = ioctl(fd, HPET_INFO, &info);
    if (r < 0)
        goto fail;

    /* Enable periodic mode */
    r = ioctl(fd, HPET_EPI, 0);
    if (info.hi_flags && (r < 0))
        goto fail;

    /* Enable interrupt */
    r = ioctl(fd, HPET_IE_ON, 0);
    if (r < 0)
        goto fail;

    enable_sigio_timer(fd);
1482
    t->priv = (void *)(long)fd;
T
ths 已提交
1483 1484 1485 1486 1487 1488 1489 1490 1491

    return 0;
fail:
    close(fd);
    return -1;
}

static void hpet_stop_timer(struct qemu_alarm_timer *t)
{
1492
    int fd = (long)t->priv;
T
ths 已提交
1493 1494 1495 1496

    close(fd);
}

1497
static int rtc_start_timer(struct qemu_alarm_timer *t)
1498
{
1499
    int rtc_fd;
1500
    unsigned long current_rtc_freq = 0;
1501

1502
    TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
1503 1504
    if (rtc_fd < 0)
        return -1;
1505 1506 1507
    ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
    if (current_rtc_freq != RTC_FREQ &&
        ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
1508 1509 1510 1511 1512 1513 1514 1515 1516 1517
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
        goto fail;
    }
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
    fail:
        close(rtc_fd);
        return -1;
    }
1518 1519 1520

    enable_sigio_timer(rtc_fd);

1521
    t->priv = (void *)(long)rtc_fd;
1522

1523 1524 1525
    return 0;
}

1526
static void rtc_stop_timer(struct qemu_alarm_timer *t)
B
BSD fix  
bellard 已提交
1527
{
1528
    int rtc_fd = (long)t->priv;
1529 1530

    close(rtc_fd);
B
BSD fix  
bellard 已提交
1531 1532
}

1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557
static int dynticks_start_timer(struct qemu_alarm_timer *t)
{
    struct sigevent ev;
    timer_t host_timer;
    struct sigaction act;

    sigfillset(&act.sa_mask);
    act.sa_flags = 0;
    act.sa_handler = host_alarm_handler;

    sigaction(SIGALRM, &act, NULL);

    ev.sigev_value.sival_int = 0;
    ev.sigev_notify = SIGEV_SIGNAL;
    ev.sigev_signo = SIGALRM;

    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
        perror("timer_create");

        /* disable dynticks */
        fprintf(stderr, "Dynamic Ticks disabled\n");

        return -1;
    }

1558
    t->priv = (void *)(long)host_timer;
1559 1560 1561 1562 1563 1564

    return 0;
}

static void dynticks_stop_timer(struct qemu_alarm_timer *t)
{
1565
    timer_t host_timer = (timer_t)(long)t->priv;
1566 1567 1568 1569 1570 1571

    timer_delete(host_timer);
}

static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
{
1572
    timer_t host_timer = (timer_t)(long)t->priv;
1573 1574 1575 1576 1577 1578
    struct itimerspec timeout;
    int64_t nearest_delta_us = INT64_MAX;
    int64_t current_us;

    if (!active_timers[QEMU_TIMER_REALTIME] &&
                !active_timers[QEMU_TIMER_VIRTUAL])
1579
        return;
1580

P
pbrook 已提交
1581
    nearest_delta_us = qemu_next_deadline_dyntick();
1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603

    /* check whether a timer is already running */
    if (timer_gettime(host_timer, &timeout)) {
        perror("gettime");
        fprintf(stderr, "Internal timer error: aborting\n");
        exit(1);
    }
    current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
    if (current_us && current_us <= nearest_delta_us)
        return;

    timeout.it_interval.tv_sec = 0;
    timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
    timeout.it_value.tv_sec =  nearest_delta_us / 1000000;
    timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
    if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
        perror("settime");
        fprintf(stderr, "Internal timer error: aborting\n");
        exit(1);
    }
}

T
ths 已提交
1604
#endif /* defined(__linux__) */
1605

1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
static int unix_start_timer(struct qemu_alarm_timer *t)
{
    struct sigaction act;
    struct itimerval itv;
    int err;

    /* timer signal */
    sigfillset(&act.sa_mask);
    act.sa_flags = 0;
    act.sa_handler = host_alarm_handler;

    sigaction(SIGALRM, &act, NULL);

    itv.it_interval.tv_sec = 0;
    /* for i386 kernel 2.6 to get 1 ms */
    itv.it_interval.tv_usec = 999;
    itv.it_value.tv_sec = 0;
    itv.it_value.tv_usec = 10 * 1000;

    err = setitimer(ITIMER_REAL, &itv, NULL);
    if (err)
        return -1;

    return 0;
}

static void unix_stop_timer(struct qemu_alarm_timer *t)
{
    struct itimerval itv;

    memset(&itv, 0, sizeof(itv));
    setitimer(ITIMER_REAL, &itv, NULL);
}

B
BSD fix  
bellard 已提交
1640
#endif /* !defined(_WIN32) */
1641

1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660
static void try_to_rearm_timer(void *opaque)
{
    struct qemu_alarm_timer *t = opaque;
#ifndef _WIN32
    ssize_t len;

    /* Drain the notify pipe */
    do {
        char buffer[512];
        len = read(alarm_timer_rfd, buffer, sizeof(buffer));
    } while ((len == -1 && errno == EINTR) || len > 0);
#endif

    if (t->flags & ALARM_FLAG_EXPIRED) {
        alarm_timer->flags &= ~ALARM_FLAG_EXPIRED;
        qemu_rearm_alarm_timer(alarm_timer);
    }
}

1661 1662 1663 1664 1665 1666
#ifdef _WIN32

static int win32_start_timer(struct qemu_alarm_timer *t)
{
    TIMECAPS tc;
    struct qemu_alarm_win32 *data = t->priv;
1667
    UINT flags;
1668 1669 1670 1671

    data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!data->host_alarm) {
        perror("Failed CreateEvent");
1672
        return -1;
1673 1674 1675 1676 1677 1678 1679 1680 1681 1682
    }

    memset(&tc, 0, sizeof(tc));
    timeGetDevCaps(&tc, sizeof(tc));

    if (data->period < tc.wPeriodMin)
        data->period = tc.wPeriodMin;

    timeBeginPeriod(data->period);

1683 1684 1685 1686 1687 1688
    flags = TIME_CALLBACK_FUNCTION;
    if (alarm_has_dynticks(t))
        flags |= TIME_ONESHOT;
    else
        flags |= TIME_PERIODIC;

1689 1690 1691 1692
    data->timerId = timeSetEvent(1,         // interval (ms)
                        data->period,       // resolution
                        host_alarm_handler, // function
                        (DWORD)t,           // parameter
1693
                        flags);
1694 1695 1696 1697 1698 1699 1700 1701 1702

    if (!data->timerId) {
        perror("Failed to initialize win32 alarm timer");

        timeEndPeriod(data->period);
        CloseHandle(data->host_alarm);
        return -1;
    }

1703
    qemu_add_wait_object(data->host_alarm, try_to_rearm_timer, t);
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717

    return 0;
}

static void win32_stop_timer(struct qemu_alarm_timer *t)
{
    struct qemu_alarm_win32 *data = t->priv;

    timeKillEvent(data->timerId);
    timeEndPeriod(data->period);

    CloseHandle(data->host_alarm);
}

1718 1719 1720 1721 1722 1723 1724
static void win32_rearm_timer(struct qemu_alarm_timer *t)
{
    struct qemu_alarm_win32 *data = t->priv;
    uint64_t nearest_delta_us;

    if (!active_timers[QEMU_TIMER_REALTIME] &&
                !active_timers[QEMU_TIMER_VIRTUAL])
1725
        return;
1726

P
pbrook 已提交
1727
    nearest_delta_us = qemu_next_deadline_dyntick();
1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746
    nearest_delta_us /= 1000;

    timeKillEvent(data->timerId);

    data->timerId = timeSetEvent(1,
                        data->period,
                        host_alarm_handler,
                        (DWORD)t,
                        TIME_ONESHOT | TIME_PERIODIC);

    if (!data->timerId) {
        perror("Failed to re-arm win32 alarm timer");

        timeEndPeriod(data->period);
        CloseHandle(data->host_alarm);
        exit(1);
    }
}

1747 1748
#endif /* _WIN32 */

1749
static int init_timer_alarm(void)
1750
{
1751
    struct qemu_alarm_timer *t = NULL;
1752
    int i, err = -1;
1753 1754

#ifndef _WIN32
1755 1756
    int fds[2];

1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768
    err = pipe(fds);
    if (err == -1)
        return -errno;

    err = fcntl_setfl(fds[0], O_NONBLOCK);
    if (err < 0)
        goto fail;

    err = fcntl_setfl(fds[1], O_NONBLOCK);
    if (err < 0)
        goto fail;

1769 1770
    alarm_timer_rfd = fds[0];
    alarm_timer_wfd = fds[1];
1771
#endif
1772 1773 1774 1775 1776 1777 1778

    for (i = 0; alarm_timers[i].name; i++) {
        t = &alarm_timers[i];

        err = t->start(t);
        if (!err)
            break;
B
bellard 已提交
1779
    }
1780

1781
    if (err) {
1782 1783
        err = -ENOENT;
        goto fail;
B
bellard 已提交
1784
    }
1785

1786
#ifndef _WIN32
1787 1788
    qemu_set_fd_handler2(alarm_timer_rfd, NULL,
                         try_to_rearm_timer, NULL, t);
1789
#endif
1790

1791
    alarm_timer = t;
1792

1793
    return 0;
1794 1795

fail:
1796
#ifndef _WIN32
1797 1798
    close(fds[0]);
    close(fds[1]);
1799
#endif
1800
    return err;
1801 1802
}

1803
static void quit_timers(void)
B
bellard 已提交
1804
{
1805 1806
    alarm_timer->stop(alarm_timer);
    alarm_timer = NULL;
B
bellard 已提交
1807 1808
}

1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
/***********************************************************/
/* host time/date access */
void qemu_get_timedate(struct tm *tm, int offset)
{
    time_t ti;
    struct tm *ret;

    time(&ti);
    ti += offset;
    if (rtc_date_offset == -1) {
        if (rtc_utc)
            ret = gmtime(&ti);
        else
            ret = localtime(&ti);
    } else {
        ti -= rtc_date_offset;
        ret = gmtime(&ti);
    }

    memcpy(tm, ret, sizeof(struct tm));
}

int qemu_timedate_diff(struct tm *tm)
{
    time_t seconds;

    if (rtc_date_offset == -1)
        if (rtc_utc)
            seconds = mktimegm(tm);
        else
            seconds = mktime(tm);
    else
        seconds = mktimegm(tm) + rtc_date_offset;

    return seconds - time(NULL);
}

B
bellard 已提交
1846 1847 1848 1849 1850
#ifdef _WIN32
static void socket_cleanup(void)
{
    WSACleanup();
}
B
bellard 已提交
1851

B
bellard 已提交
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865
static int socket_init(void)
{
    WSADATA Data;
    int ret, err;

    ret = WSAStartup(MAKEWORD(2,2), &Data);
    if (ret != 0) {
        err = WSAGetLastError();
        fprintf(stderr, "WSAStartup: %d\n", err);
        return -1;
    }
    atexit(socket_cleanup);
    return 0;
}
1866 1867
#endif

1868
const char *get_opt_name(char *buf, int buf_size, const char *p)
1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883
{
    char *q;

    q = buf;
    while (*p != '\0' && *p != '=') {
        if (q && (q - buf) < buf_size - 1)
            *q++ = *p;
        p++;
    }
    if (q)
        *q = '\0';

    return p;
}

1884
const char *get_opt_value(char *buf, int buf_size, const char *p)
T
ths 已提交
1885 1886 1887 1888 1889
{
    char *q;

    q = buf;
    while (*p != '\0') {
1890 1891
        if (*p == ',') {
            if (*(p + 1) != ',')
T
ths 已提交
1892 1893
                break;
            p++;
1894
        }
T
ths 已提交
1895 1896 1897 1898 1899 1900 1901 1902 1903 1904
        if (q && (q - buf) < buf_size - 1)
            *q++ = *p;
        p++;
    }
    if (q)
        *q = '\0';

    return p;
}

1905 1906
int get_param_value(char *buf, int buf_size,
                    const char *tag, const char *str)
B
bellard 已提交
1907 1908 1909 1910 1911 1912
{
    const char *p;
    char option[128];

    p = str;
    for(;;) {
1913
        p = get_opt_name(option, sizeof(option), p);
B
bellard 已提交
1914 1915 1916 1917
        if (*p != '=')
            break;
        p++;
        if (!strcmp(tag, option)) {
1918
            (void)get_opt_value(buf, buf_size, p);
T
ths 已提交
1919
            return strlen(buf);
B
bellard 已提交
1920
        } else {
1921
            p = get_opt_value(NULL, 0, p);
B
bellard 已提交
1922 1923 1924 1925 1926 1927 1928 1929
        }
        if (*p != ',')
            break;
        p++;
    }
    return 0;
}

1930 1931
int check_params(char *buf, int buf_size,
                 const char * const *params, const char *str)
T
ths 已提交
1932 1933 1934 1935 1936 1937
{
    const char *p;
    int i;

    p = str;
    for(;;) {
1938
        p = get_opt_name(buf, buf_size, p);
T
ths 已提交
1939 1940 1941 1942 1943 1944 1945 1946
        if (*p != '=')
            return -1;
        p++;
        for(i = 0; params[i] != NULL; i++)
            if (!strcmp(params[i], buf))
                break;
        if (params[i] == NULL)
            return -1;
1947
        p = get_opt_value(NULL, 0, p);
T
ths 已提交
1948 1949 1950 1951 1952 1953 1954
        if (*p != ',')
            break;
        p++;
    }
    return 0;
}

1955 1956 1957 1958 1959
/***********************************************************/
/* Bluetooth support */
static int nb_hcis;
static int cur_hci;
static struct HCIInfo *hci_table[MAX_NICS];
1960

1961 1962 1963 1964 1965 1966 1967
static struct bt_vlan_s {
    struct bt_scatternet_s net;
    int id;
    struct bt_vlan_s *next;
} *first_bt_vlan;

/* find or alloc a new bluetooth "VLAN" */
B
blueswir1 已提交
1968
static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007
{
    struct bt_vlan_s **pvlan, *vlan;
    for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
        if (vlan->id == id)
            return &vlan->net;
    }
    vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
    vlan->id = id;
    pvlan = &first_bt_vlan;
    while (*pvlan != NULL)
        pvlan = &(*pvlan)->next;
    *pvlan = vlan;
    return &vlan->net;
}

static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
{
}

static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
{
    return -ENOTSUP;
}

static struct HCIInfo null_hci = {
    .cmd_send = null_hci_send,
    .sco_send = null_hci_send,
    .acl_send = null_hci_send,
    .bdaddr_set = null_hci_addr_set,
};

struct HCIInfo *qemu_next_hci(void)
{
    if (cur_hci == nb_hcis)
        return &null_hci;

    return hci_table[cur_hci++];
}

2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145
static struct HCIInfo *hci_init(const char *str)
{
    char *endp;
    struct bt_scatternet_s *vlan = 0;

    if (!strcmp(str, "null"))
        /* null */
        return &null_hci;
    else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
        /* host[:hciN] */
        return bt_host_hci(str[4] ? str + 5 : "hci0");
    else if (!strncmp(str, "hci", 3)) {
        /* hci[,vlan=n] */
        if (str[3]) {
            if (!strncmp(str + 3, ",vlan=", 6)) {
                vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
                if (*endp)
                    vlan = 0;
            }
        } else
            vlan = qemu_find_bt_vlan(0);
        if (vlan)
           return bt_new_hci(vlan);
    }

    fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);

    return 0;
}

static int bt_hci_parse(const char *str)
{
    struct HCIInfo *hci;
    bdaddr_t bdaddr;

    if (nb_hcis >= MAX_NICS) {
        fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n", MAX_NICS);
        return -1;
    }

    hci = hci_init(str);
    if (!hci)
        return -1;

    bdaddr.b[0] = 0x52;
    bdaddr.b[1] = 0x54;
    bdaddr.b[2] = 0x00;
    bdaddr.b[3] = 0x12;
    bdaddr.b[4] = 0x34;
    bdaddr.b[5] = 0x56 + nb_hcis;
    hci->bdaddr_set(hci, bdaddr.b);

    hci_table[nb_hcis++] = hci;

    return 0;
}

static void bt_vhci_add(int vlan_id)
{
    struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);

    if (!vlan->slave)
        fprintf(stderr, "qemu: warning: adding a VHCI to "
                        "an empty scatternet %i\n", vlan_id);

    bt_vhci_init(bt_new_hci(vlan));
}

static struct bt_device_s *bt_device_add(const char *opt)
{
    struct bt_scatternet_s *vlan;
    int vlan_id = 0;
    char *endp = strstr(opt, ",vlan=");
    int len = (endp ? endp - opt : strlen(opt)) + 1;
    char devname[10];

    pstrcpy(devname, MIN(sizeof(devname), len), opt);

    if (endp) {
        vlan_id = strtol(endp + 6, &endp, 0);
        if (*endp) {
            fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
            return 0;
        }
    }

    vlan = qemu_find_bt_vlan(vlan_id);

    if (!vlan->slave)
        fprintf(stderr, "qemu: warning: adding a slave device to "
                        "an empty scatternet %i\n", vlan_id);

    if (!strcmp(devname, "keyboard"))
        return bt_keyboard_init(vlan);

    fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
    return 0;
}

static int bt_parse(const char *opt)
{
    const char *endp, *p;
    int vlan;

    if (strstart(opt, "hci", &endp)) {
        if (!*endp || *endp == ',') {
            if (*endp)
                if (!strstart(endp, ",vlan=", 0))
                    opt = endp + 1;

            return bt_hci_parse(opt);
       }
    } else if (strstart(opt, "vhci", &endp)) {
        if (!*endp || *endp == ',') {
            if (*endp) {
                if (strstart(endp, ",vlan=", &p)) {
                    vlan = strtol(p, (char **) &endp, 0);
                    if (*endp) {
                        fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
                        return 1;
                    }
                } else {
                    fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
                    return 1;
                }
            } else
                vlan = 0;

            bt_vhci_add(vlan);
            return 0;
        }
    } else if (strstart(opt, "device:", &endp))
        return !bt_device_add(endp);

    fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
    return 1;
}

2146 2147 2148
/***********************************************************/
/* QEMU Block devices */

2149
#define HD_ALIAS "index=%d,media=disk"
T
ths 已提交
2150 2151 2152 2153 2154 2155
#ifdef TARGET_PPC
#define CDROM_ALIAS "index=1,media=cdrom"
#else
#define CDROM_ALIAS "index=2,media=cdrom"
#endif
#define FD_ALIAS "index=%d,if=floppy"
2156 2157
#define PFLASH_ALIAS "if=pflash"
#define MTD_ALIAS "if=mtd"
2158
#define SD_ALIAS "index=0,if=sd"
T
ths 已提交
2159

2160
static int drive_add(const char *file, const char *fmt, ...)
T
ths 已提交
2161 2162 2163 2164 2165 2166 2167 2168
{
    va_list ap;

    if (nb_drives_opt >= MAX_DRIVES) {
        fprintf(stderr, "qemu: too many drives\n");
        exit(1);
    }

2169
    drives_opt[nb_drives_opt].file = file;
T
ths 已提交
2170
    va_start(ap, fmt);
2171 2172
    vsnprintf(drives_opt[nb_drives_opt].opt,
              sizeof(drives_opt[0].opt), fmt, ap);
T
ths 已提交
2173 2174 2175 2176 2177
    va_end(ap);

    return nb_drives_opt++;
}

2178
int drive_get_index(BlockInterfaceType type, int bus, int unit)
T
ths 已提交
2179 2180 2181 2182 2183 2184
{
    int index;

    /* seek interface, bus and unit */

    for (index = 0; index < nb_drives; index++)
2185
        if (drives_table[index].type == type &&
T
ths 已提交
2186 2187 2188 2189 2190 2191 2192
	    drives_table[index].bus == bus &&
	    drives_table[index].unit == unit)
        return index;

    return -1;
}

2193
int drive_get_max_bus(BlockInterfaceType type)
T
ths 已提交
2194 2195 2196 2197 2198 2199
{
    int max_bus;
    int index;

    max_bus = -1;
    for (index = 0; index < nb_drives; index++) {
2200
        if(drives_table[index].type == type &&
T
ths 已提交
2201 2202 2203 2204 2205 2206
           drives_table[index].bus > max_bus)
            max_bus = drives_table[index].bus;
    }
    return max_bus;
}

2207 2208 2209 2210 2211
static void bdrv_format_print(void *opaque, const char *name)
{
    fprintf(stderr, " %s", name);
}

2212 2213
static int drive_init(struct drive_opt *arg, int snapshot,
                      QEMUMachine *machine)
T
ths 已提交
2214 2215 2216
{
    char buf[128];
    char file[1024];
2217 2218
    char devname[128];
    const char *mediastr = "";
2219
    BlockInterfaceType type;
T
ths 已提交
2220 2221 2222 2223
    enum { MEDIA_DISK, MEDIA_CDROM } media;
    int bus_id, unit_id;
    int cyls, heads, secs, translation;
    BlockDriverState *bdrv;
2224
    BlockDriver *drv = NULL;
T
ths 已提交
2225 2226
    int max_devs;
    int index;
2227 2228
    int cache;
    int bdrv_flags;
2229
    char *str = arg->opt;
2230 2231 2232 2233
    static const char * const params[] = { "bus", "unit", "if", "index",
                                           "cyls", "heads", "secs", "trans",
                                           "media", "snapshot", "file",
                                           "cache", "format", NULL };
T
ths 已提交
2234 2235

    if (check_params(buf, sizeof(buf), params, str) < 0) {
2236
         fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
T
ths 已提交
2237 2238 2239 2240 2241 2242 2243 2244 2245 2246
                         buf, str);
         return -1;
    }

    file[0] = 0;
    cyls = heads = secs = 0;
    bus_id = 0;
    unit_id = -1;
    translation = BIOS_ATA_TRANSLATION_AUTO;
    index = -1;
2247
    cache = 3;
T
ths 已提交
2248

2249
    if (machine->use_scsi) {
2250
        type = IF_SCSI;
T
ths 已提交
2251
        max_devs = MAX_SCSI_DEVS;
B
blueswir1 已提交
2252
        pstrcpy(devname, sizeof(devname), "scsi");
T
ths 已提交
2253
    } else {
2254
        type = IF_IDE;
T
ths 已提交
2255
        max_devs = MAX_IDE_DEVS;
B
blueswir1 已提交
2256
        pstrcpy(devname, sizeof(devname), "ide");
T
ths 已提交
2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278
    }
    media = MEDIA_DISK;

    /* extract parameters */

    if (get_param_value(buf, sizeof(buf), "bus", str)) {
        bus_id = strtol(buf, NULL, 0);
	if (bus_id < 0) {
	    fprintf(stderr, "qemu: '%s' invalid bus id\n", str);
	    return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "unit", str)) {
        unit_id = strtol(buf, NULL, 0);
	if (unit_id < 0) {
	    fprintf(stderr, "qemu: '%s' invalid unit id\n", str);
	    return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "if", str)) {
B
bellard 已提交
2279
        pstrcpy(devname, sizeof(devname), buf);
T
ths 已提交
2280
        if (!strcmp(buf, "ide")) {
2281
	    type = IF_IDE;
T
ths 已提交
2282 2283
            max_devs = MAX_IDE_DEVS;
        } else if (!strcmp(buf, "scsi")) {
2284
	    type = IF_SCSI;
T
ths 已提交
2285 2286
            max_devs = MAX_SCSI_DEVS;
        } else if (!strcmp(buf, "floppy")) {
2287
	    type = IF_FLOPPY;
T
ths 已提交
2288 2289
            max_devs = 0;
        } else if (!strcmp(buf, "pflash")) {
2290
	    type = IF_PFLASH;
T
ths 已提交
2291 2292
            max_devs = 0;
	} else if (!strcmp(buf, "mtd")) {
2293
	    type = IF_MTD;
T
ths 已提交
2294 2295
            max_devs = 0;
	} else if (!strcmp(buf, "sd")) {
2296
	    type = IF_SD;
T
ths 已提交
2297
            max_devs = 0;
A
aliguori 已提交
2298 2299 2300 2301
        } else if (!strcmp(buf, "virtio")) {
            type = IF_VIRTIO;
            max_devs = 0;
        } else {
T
ths 已提交
2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387
            fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
            return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "index", str)) {
        index = strtol(buf, NULL, 0);
	if (index < 0) {
	    fprintf(stderr, "qemu: '%s' invalid index\n", str);
	    return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "cyls", str)) {
        cyls = strtol(buf, NULL, 0);
    }

    if (get_param_value(buf, sizeof(buf), "heads", str)) {
        heads = strtol(buf, NULL, 0);
    }

    if (get_param_value(buf, sizeof(buf), "secs", str)) {
        secs = strtol(buf, NULL, 0);
    }

    if (cyls || heads || secs) {
        if (cyls < 1 || cyls > 16383) {
            fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str);
	    return -1;
	}
        if (heads < 1 || heads > 16) {
            fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str);
	    return -1;
	}
        if (secs < 1 || secs > 63) {
            fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str);
	    return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "trans", str)) {
        if (!cyls) {
            fprintf(stderr,
                    "qemu: '%s' trans must be used with cyls,heads and secs\n",
                    str);
            return -1;
        }
        if (!strcmp(buf, "none"))
            translation = BIOS_ATA_TRANSLATION_NONE;
        else if (!strcmp(buf, "lba"))
            translation = BIOS_ATA_TRANSLATION_LBA;
        else if (!strcmp(buf, "auto"))
            translation = BIOS_ATA_TRANSLATION_AUTO;
	else {
            fprintf(stderr, "qemu: '%s' invalid translation type\n", str);
	    return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "media", str)) {
        if (!strcmp(buf, "disk")) {
	    media = MEDIA_DISK;
	} else if (!strcmp(buf, "cdrom")) {
            if (cyls || secs || heads) {
                fprintf(stderr,
                        "qemu: '%s' invalid physical CHS format\n", str);
	        return -1;
            }
	    media = MEDIA_CDROM;
	} else {
	    fprintf(stderr, "qemu: '%s' invalid media\n", str);
	    return -1;
	}
    }

    if (get_param_value(buf, sizeof(buf), "snapshot", str)) {
        if (!strcmp(buf, "on"))
	    snapshot = 1;
        else if (!strcmp(buf, "off"))
	    snapshot = 0;
	else {
	    fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str);
	    return -1;
	}
    }

2388
    if (get_param_value(buf, sizeof(buf), "cache", str)) {
2389
        if (!strcmp(buf, "off") || !strcmp(buf, "none"))
2390
            cache = 0;
2391
        else if (!strcmp(buf, "writethrough"))
2392
            cache = 1;
2393 2394
        else if (!strcmp(buf, "writeback"))
            cache = 2;
2395 2396 2397 2398 2399 2400
        else {
           fprintf(stderr, "qemu: invalid cache option\n");
           return -1;
        }
    }

2401
    if (get_param_value(buf, sizeof(buf), "format", str)) {
2402 2403 2404 2405 2406 2407
       if (strcmp(buf, "?") == 0) {
            fprintf(stderr, "qemu: Supported formats:");
            bdrv_iterate_format(bdrv_format_print, NULL);
            fprintf(stderr, "\n");
	    return -1;
        }
2408 2409 2410 2411 2412 2413 2414
        drv = bdrv_find_format(buf);
        if (!drv) {
            fprintf(stderr, "qemu: '%s' invalid format\n", buf);
            return -1;
        }
    }

2415 2416 2417 2418
    if (arg->file == NULL)
        get_param_value(file, sizeof(file), "file", str);
    else
        pstrcpy(file, sizeof(file), arg->file);
T
ths 已提交
2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443

    /* compute bus and unit according index */

    if (index != -1) {
        if (bus_id != 0 || unit_id != -1) {
            fprintf(stderr,
                    "qemu: '%s' index cannot be used with bus and unit\n", str);
            return -1;
        }
        if (max_devs == 0)
        {
            unit_id = index;
            bus_id = 0;
        } else {
            unit_id = index % max_devs;
            bus_id = index / max_devs;
        }
    }

    /* if user doesn't specify a unit_id,
     * try to find the first free
     */

    if (unit_id == -1) {
       unit_id = 0;
2444
       while (drive_get_index(type, bus_id, unit_id) != -1) {
T
ths 已提交
2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464
           unit_id++;
           if (max_devs && unit_id >= max_devs) {
               unit_id -= max_devs;
               bus_id++;
           }
       }
    }

    /* check unit id */

    if (max_devs && unit_id >= max_devs) {
        fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n",
                        str, unit_id, max_devs - 1);
        return -1;
    }

    /*
     * ignore multiple definitions
     */

2465
    if (drive_get_index(type, bus_id, unit_id) != -1)
T
ths 已提交
2466 2467 2468 2469
        return 0;

    /* init */

2470
    if (type == IF_IDE || type == IF_SCSI)
2471
        mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
2472 2473 2474 2475 2476 2477
    if (max_devs)
        snprintf(buf, sizeof(buf), "%s%i%s%i",
                 devname, bus_id, mediastr, unit_id);
    else
        snprintf(buf, sizeof(buf), "%s%s%i",
                 devname, mediastr, unit_id);
T
ths 已提交
2478 2479
    bdrv = bdrv_new(buf);
    drives_table[nb_drives].bdrv = bdrv;
2480
    drives_table[nb_drives].type = type;
T
ths 已提交
2481 2482 2483 2484
    drives_table[nb_drives].bus = bus_id;
    drives_table[nb_drives].unit = unit_id;
    nb_drives++;

2485
    switch(type) {
T
ths 已提交
2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
    case IF_IDE:
    case IF_SCSI:
        switch(media) {
	case MEDIA_DISK:
            if (cyls != 0) {
                bdrv_set_geometry_hint(bdrv, cyls, heads, secs);
                bdrv_set_translation_hint(bdrv, translation);
            }
	    break;
	case MEDIA_CDROM:
            bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
	    break;
	}
        break;
    case IF_SD:
        /* FIXME: This isn't really a floppy, but it's a reasonable
           approximation.  */
    case IF_FLOPPY:
        bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY);
        break;
    case IF_PFLASH:
    case IF_MTD:
A
aliguori 已提交
2508
    case IF_VIRTIO:
T
ths 已提交
2509 2510 2511 2512
        break;
    }
    if (!file[0])
        return 0;
2513
    bdrv_flags = 0;
2514
    if (snapshot) {
2515
        bdrv_flags |= BDRV_O_SNAPSHOT;
2516 2517 2518 2519 2520 2521
        cache = 2; /* always use write-back with snapshot */
    }
    if (cache == 0) /* no caching */
        bdrv_flags |= BDRV_O_NOCACHE;
    else if (cache == 2) /* write-back */
        bdrv_flags |= BDRV_O_CACHE_WB;
2522 2523
    else if (cache == 3) /* not specified */
        bdrv_flags |= BDRV_O_CACHE_DEF;
2524
    if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0 || qemu_key_check(bdrv, file)) {
T
ths 已提交
2525 2526 2527 2528 2529 2530 2531
        fprintf(stderr, "qemu: could not open disk image %s\n",
                        file);
        return -1;
    }
    return 0;
}

B
bellard 已提交
2532 2533 2534
/***********************************************************/
/* USB devices */

P
pbrook 已提交
2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548
static USBPort *used_usb_ports;
static USBPort *free_usb_ports;

/* ??? Maybe change this to register a hub to keep track of the topology.  */
void qemu_register_usb_port(USBPort *port, void *opaque, int index,
                            usb_attachfn attach)
{
    port->opaque = opaque;
    port->index = index;
    port->attach = attach;
    port->next = free_usb_ports;
    free_usb_ports = port;
}

2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574
int usb_device_add_dev(USBDevice *dev)
{
    USBPort *port;

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

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

        hub = usb_hub_init(VM_USB_HUB_SIZE);
        usb_attach(port, hub);
        port = free_usb_ports;
    }

    free_usb_ports = port->next;
    port->next = used_usb_ports;
    used_usb_ports = port;
    usb_attach(port, dev);
    return 0;
}

B
bellard 已提交
2575 2576 2577 2578 2579
static int usb_device_add(const char *devname)
{
    const char *p;
    USBDevice *dev;

P
pbrook 已提交
2580
    if (!free_usb_ports)
B
bellard 已提交
2581 2582 2583 2584 2585 2586
        return -1;

    if (strstart(devname, "host:", &p)) {
        dev = usb_host_device_open(p);
    } else if (!strcmp(devname, "mouse")) {
        dev = usb_mouse_init();
2587
    } else if (!strcmp(devname, "tablet")) {
B
balrog 已提交
2588 2589 2590
        dev = usb_tablet_init();
    } else if (!strcmp(devname, "keyboard")) {
        dev = usb_keyboard_init();
P
pbrook 已提交
2591 2592
    } else if (strstart(devname, "disk:", &p)) {
        dev = usb_msd_init(p);
2593 2594
    } else if (!strcmp(devname, "wacom-tablet")) {
        dev = usb_wacom_init();
B
balrog 已提交
2595 2596
    } else if (strstart(devname, "serial:", &p)) {
        dev = usb_serial_init(p);
A
aurel32 已提交
2597 2598 2599 2600
#ifdef CONFIG_BRLAPI
    } else if (!strcmp(devname, "braille")) {
        dev = usb_baum_init();
#endif
2601
    } else if (strstart(devname, "net:", &p)) {
2602
        int nic = nb_nics;
2603

2604
        if (net_client_init("nic", p) < 0)
2605
            return -1;
2606 2607
        nd_table[nic].model = "usb";
        dev = usb_net_init(&nd_table[nic]);
2608 2609 2610
    } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
        dev = usb_bt_init(devname[2] ? hci_init(p) :
                        bt_new_hci(qemu_find_bt_vlan(0)));
B
bellard 已提交
2611 2612 2613
    } else {
        return -1;
    }
P
pbrook 已提交
2614 2615 2616
    if (!dev)
        return -1;

2617
    return usb_device_add_dev(dev);
B
bellard 已提交
2618 2619
}

2620
int usb_device_del_addr(int bus_num, int addr)
B
bellard 已提交
2621
{
P
pbrook 已提交
2622 2623
    USBPort *port;
    USBPort **lastp;
B
bellard 已提交
2624
    USBDevice *dev;
B
bellard 已提交
2625

P
pbrook 已提交
2626
    if (!used_usb_ports)
B
bellard 已提交
2627 2628 2629 2630
        return -1;

    if (bus_num != 0)
        return -1;
P
pbrook 已提交
2631 2632 2633 2634 2635 2636

    lastp = &used_usb_ports;
    port = used_usb_ports;
    while (port && port->dev->addr != addr) {
        lastp = &port->next;
        port = port->next;
B
bellard 已提交
2637
    }
P
pbrook 已提交
2638 2639

    if (!port)
B
bellard 已提交
2640
        return -1;
P
pbrook 已提交
2641

B
bellard 已提交
2642
    dev = port->dev;
P
pbrook 已提交
2643 2644
    *lastp = port->next;
    usb_attach(port, NULL);
B
bellard 已提交
2645
    dev->handle_destroy(dev);
P
pbrook 已提交
2646 2647
    port->next = free_usb_ports;
    free_usb_ports = port;
B
bellard 已提交
2648 2649 2650
    return 0;
}

2651 2652 2653 2654 2655
static int usb_device_del(const char *devname)
{
    int bus_num, addr;
    const char *p;

2656 2657 2658
    if (strstart(devname, "host:", &p))
        return usb_host_device_close(p);

2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670
    if (!used_usb_ports)
        return -1;

    p = strchr(devname, '.');
    if (!p)
        return -1;
    bus_num = strtoul(devname, NULL, 0);
    addr = strtoul(p + 1, NULL, 0);

    return usb_device_del_addr(bus_num, addr);
}

B
bellard 已提交
2671 2672
void do_usb_add(const char *devname)
{
2673
    usb_device_add(devname);
B
bellard 已提交
2674 2675 2676 2677
}

void do_usb_del(const char *devname)
{
2678
    usb_device_del(devname);
B
bellard 已提交
2679 2680 2681 2682 2683
}

void usb_info(void)
{
    USBDevice *dev;
P
pbrook 已提交
2684
    USBPort *port;
B
bellard 已提交
2685 2686
    const char *speed_str;

P
pbrook 已提交
2687
    if (!usb_enabled) {
B
bellard 已提交
2688 2689 2690 2691
        term_printf("USB support not enabled\n");
        return;
    }

P
pbrook 已提交
2692 2693 2694 2695 2696
    for (port = used_usb_ports; port; port = port->next) {
        dev = port->dev;
        if (!dev)
            continue;
        switch(dev->speed) {
2697 2698
        case USB_SPEED_LOW:
            speed_str = "1.5";
P
pbrook 已提交
2699
            break;
2700 2701
        case USB_SPEED_FULL:
            speed_str = "12";
P
pbrook 已提交
2702
            break;
2703 2704
        case USB_SPEED_HIGH:
            speed_str = "480";
P
pbrook 已提交
2705 2706
            break;
        default:
2707
            speed_str = "?";
P
pbrook 已提交
2708
            break;
B
bellard 已提交
2709
        }
2710
        term_printf("  Device %d.%d, Speed %s Mb/s, Product %s\n",
2711
                    0, dev->addr, speed_str, dev->devname);
B
bellard 已提交
2712 2713 2714
    }
}

2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756
/***********************************************************/
/* PCMCIA/Cardbus */

static struct pcmcia_socket_entry_s {
    struct pcmcia_socket_s *socket;
    struct pcmcia_socket_entry_s *next;
} *pcmcia_sockets = 0;

void pcmcia_socket_register(struct pcmcia_socket_s *socket)
{
    struct pcmcia_socket_entry_s *entry;

    entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
    entry->socket = socket;
    entry->next = pcmcia_sockets;
    pcmcia_sockets = entry;
}

void pcmcia_socket_unregister(struct pcmcia_socket_s *socket)
{
    struct pcmcia_socket_entry_s *entry, **ptr;

    ptr = &pcmcia_sockets;
    for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
        if (entry->socket == socket) {
            *ptr = entry->next;
            qemu_free(entry);
        }
}

void pcmcia_info(void)
{
    struct pcmcia_socket_entry_s *iter;
    if (!pcmcia_sockets)
        term_printf("No PCMCIA sockets\n");

    for (iter = pcmcia_sockets; iter; iter = iter->next)
        term_printf("%s: %s\n", iter->socket->slot_string,
                    iter->socket->attached ? iter->socket->card_string :
                    "Empty");
}

2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
/***********************************************************/
/* dumb display */

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

static void dumb_resize(DisplayState *ds, int w, int h)
{
}

static void dumb_display_init(DisplayState *ds)
{
    ds->data = NULL;
    ds->linesize = 0;
    ds->depth = 0;
    ds->dpy_update = dumb_update;
    ds->dpy_resize = dumb_resize;
A
aliguori 已提交
2775 2776
    ds->dpy_refresh = NULL;
    ds->gui_timer_interval = 0;
2777
    ds->idle = 1;
2778 2779
}

2780 2781
/***********************************************************/
/* I/O handling */
2782

2783 2784 2785 2786
#define MAX_IO_HANDLERS 64

typedef struct IOHandlerRecord {
    int fd;
B
bellard 已提交
2787 2788 2789
    IOCanRWHandler *fd_read_poll;
    IOHandler *fd_read;
    IOHandler *fd_write;
2790
    int deleted;
2791 2792 2793
    void *opaque;
    /* temporary data */
    struct pollfd *ufd;
2794
    struct IOHandlerRecord *next;
2795 2796
} IOHandlerRecord;

2797
static IOHandlerRecord *first_io_handler;
2798

B
bellard 已提交
2799 2800
/* XXX: fd_read_poll should be suppressed, but an API change is
   necessary in the character devices to suppress fd_can_read(). */
2801 2802 2803 2804
int qemu_set_fd_handler2(int fd,
                         IOCanRWHandler *fd_read_poll,
                         IOHandler *fd_read,
                         IOHandler *fd_write,
B
bellard 已提交
2805
                         void *opaque)
2806
{
B
bellard 已提交
2807
    IOHandlerRecord **pioh, *ioh;
2808

B
bellard 已提交
2809 2810 2811 2812 2813 2814 2815
    if (!fd_read && !fd_write) {
        pioh = &first_io_handler;
        for(;;) {
            ioh = *pioh;
            if (ioh == NULL)
                break;
            if (ioh->fd == fd) {
2816
                ioh->deleted = 1;
B
bellard 已提交
2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
                break;
            }
            pioh = &ioh->next;
        }
    } else {
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
            if (ioh->fd == fd)
                goto found;
        }
        ioh = qemu_mallocz(sizeof(IOHandlerRecord));
        if (!ioh)
            return -1;
        ioh->next = first_io_handler;
        first_io_handler = ioh;
    found:
        ioh->fd = fd;
        ioh->fd_read_poll = fd_read_poll;
        ioh->fd_read = fd_read;
        ioh->fd_write = fd_write;
        ioh->opaque = opaque;
2837
        ioh->deleted = 0;
B
bellard 已提交
2838
    }
2839 2840 2841
    return 0;
}

2842 2843 2844
int qemu_set_fd_handler(int fd,
                        IOHandler *fd_read,
                        IOHandler *fd_write,
B
bellard 已提交
2845
                        void *opaque)
2846
{
B
bellard 已提交
2847
    return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
2848 2849
}

A
aliguori 已提交
2850
#ifdef _WIN32
2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887
/***********************************************************/
/* Polling handling */

typedef struct PollingEntry {
    PollingFunc *func;
    void *opaque;
    struct PollingEntry *next;
} PollingEntry;

static PollingEntry *first_polling_entry;

int qemu_add_polling_cb(PollingFunc *func, void *opaque)
{
    PollingEntry **ppe, *pe;
    pe = qemu_mallocz(sizeof(PollingEntry));
    if (!pe)
        return -1;
    pe->func = func;
    pe->opaque = opaque;
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
    *ppe = pe;
    return 0;
}

void qemu_del_polling_cb(PollingFunc *func, void *opaque)
{
    PollingEntry **ppe, *pe;
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
        pe = *ppe;
        if (pe->func == func && pe->opaque == opaque) {
            *ppe = pe->next;
            qemu_free(pe);
            break;
        }
    }
}

2888 2889 2890 2891 2892 2893 2894 2895 2896 2897
/***********************************************************/
/* Wait objects support */
typedef struct WaitObjects {
    int num;
    HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
    WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
    void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
} WaitObjects;

static WaitObjects wait_objects = {0};
2898

2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924
int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
{
    WaitObjects *w = &wait_objects;

    if (w->num >= MAXIMUM_WAIT_OBJECTS)
        return -1;
    w->events[w->num] = handle;
    w->func[w->num] = func;
    w->opaque[w->num] = opaque;
    w->num++;
    return 0;
}

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

    found = 0;
    for (i = 0; i < w->num; i++) {
        if (w->events[i] == handle)
            found = 1;
        if (found) {
            w->events[i] = w->events[i + 1];
            w->func[i] = w->func[i + 1];
            w->opaque[i] = w->opaque[i + 1];
2925
        }
2926 2927 2928 2929 2930 2931
    }
    if (found)
        w->num--;
}
#endif

2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951
/***********************************************************/
/* ram save/restore */

static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
{
    int v;

    v = qemu_get_byte(f);
    switch(v) {
    case 0:
        if (qemu_get_buffer(f, buf, len) != len)
            return -EIO;
        break;
    case 1:
        v = qemu_get_byte(f);
        memset(buf, v, len);
        break;
    default:
        return -EINVAL;
    }
A
aliguori 已提交
2952 2953 2954 2955

    if (qemu_file_has_error(f))
        return -EIO;

2956 2957 2958
    return 0;
}

2959 2960
static int ram_load_v1(QEMUFile *f, void *opaque)
{
2961 2962
    int ret;
    ram_addr_t i;
2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024

    if (qemu_get_be32(f) != phys_ram_size)
        return -EINVAL;
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
        ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
        if (ret)
            return ret;
    }
    return 0;
}

#define BDRV_HASH_BLOCK_SIZE 1024
#define IOBUF_SIZE 4096
#define RAM_CBLOCK_MAGIC 0xfabe

typedef struct RamDecompressState {
    z_stream zstream;
    QEMUFile *f;
    uint8_t buf[IOBUF_SIZE];
} RamDecompressState;

static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
{
    int ret;
    memset(s, 0, sizeof(*s));
    s->f = f;
    ret = inflateInit(&s->zstream);
    if (ret != Z_OK)
        return -1;
    return 0;
}

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

    s->zstream.avail_out = len;
    s->zstream.next_out = buf;
    while (s->zstream.avail_out > 0) {
        if (s->zstream.avail_in == 0) {
            if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
                return -1;
            clen = qemu_get_be16(s->f);
            if (clen > IOBUF_SIZE)
                return -1;
            qemu_get_buffer(s->f, s->buf, clen);
            s->zstream.avail_in = clen;
            s->zstream.next_in = s->buf;
        }
        ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
        if (ret != Z_OK && ret != Z_STREAM_END) {
            return -1;
        }
    }
    return 0;
}

static void ram_decompress_close(RamDecompressState *s)
{
    inflateEnd(&s->zstream);
}

3025 3026 3027 3028 3029 3030 3031
#define RAM_SAVE_FLAG_FULL	0x01
#define RAM_SAVE_FLAG_COMPRESS	0x02
#define RAM_SAVE_FLAG_MEM_SIZE	0x04
#define RAM_SAVE_FLAG_PAGE	0x08
#define RAM_SAVE_FLAG_EOS	0x10

static int is_dup_page(uint8_t *page, uint8_t ch)
3032
{
3033 3034 3035
    uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
    uint32_t *array = (uint32_t *)page;
    int i;
3036

3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
    for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
        if (array[i] != val)
            return 0;
    }

    return 1;
}

static int ram_save_block(QEMUFile *f)
{
    static ram_addr_t current_addr = 0;
    ram_addr_t saved_addr = current_addr;
    ram_addr_t addr = 0;
    int found = 0;

    while (addr < phys_ram_size) {
        if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
            uint8_t ch;

            cpu_physical_memory_reset_dirty(current_addr,
                                            current_addr + TARGET_PAGE_SIZE,
                                            MIGRATION_DIRTY_FLAG);

            ch = *(phys_ram_base + current_addr);

            if (is_dup_page(phys_ram_base + current_addr, ch)) {
                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
                qemu_put_byte(f, ch);
            } else {
                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
                qemu_put_buffer(f, phys_ram_base + current_addr, TARGET_PAGE_SIZE);
3068
            }
3069 3070 3071

            found = 1;
            break;
3072
        }
3073 3074
        addr += TARGET_PAGE_SIZE;
        current_addr = (saved_addr + addr) % phys_ram_size;
3075
    }
3076 3077

    return found;
3078 3079
}

3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134
static ram_addr_t ram_save_threshold = 10;

static ram_addr_t ram_save_remaining(void)
{
    ram_addr_t addr;
    ram_addr_t count = 0;

    for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
        if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
            count++;
    }

    return count;
}

static int ram_save_live(QEMUFile *f, int stage, void *opaque)
{
    ram_addr_t addr;

    if (stage == 1) {
        /* Make sure all dirty bits are set */
        for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
            if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
                cpu_physical_memory_set_dirty(addr);
        }
        
        /* Enable dirty memory tracking */
        cpu_physical_memory_set_dirty_tracking(1);

        qemu_put_be64(f, phys_ram_size | RAM_SAVE_FLAG_MEM_SIZE);
    }

    while (!qemu_file_rate_limit(f)) {
        int ret;

        ret = ram_save_block(f);
        if (ret == 0) /* no more blocks */
            break;
    }

    /* try transferring iterative blocks of memory */

    if (stage == 3) {
        cpu_physical_memory_set_dirty_tracking(0);

        /* flush all remaining blocks regardless of rate limiting */
        while (ram_save_block(f) != 0);
    }

    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);

    return (stage == 2) && (ram_save_remaining() < ram_save_threshold);
}

static int ram_load_dead(QEMUFile *f, void *opaque)
3135
{
3136 3137
    RamDecompressState s1, *s = &s1;
    uint8_t buf[10];
3138
    ram_addr_t i;
3139

3140 3141 3142 3143 3144 3145 3146 3147 3148
    if (ram_decompress_open(s, f) < 0)
        return -EINVAL;
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
        if (ram_decompress_buf(s, buf, 1) < 0) {
            fprintf(stderr, "Error while reading ram block header\n");
            goto error;
        }
        if (buf[0] == 0) {
            if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
3149
                fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
3150 3151
                goto error;
            }
3152
        } else {
3153 3154 3155 3156
        error:
            printf("Error block header\n");
            return -EINVAL;
        }
3157
    }
3158
    ram_decompress_close(s);
3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202

    return 0;
}

static int ram_load(QEMUFile *f, void *opaque, int version_id)
{
    ram_addr_t addr;
    int flags;

    if (version_id == 1)
        return ram_load_v1(f, opaque);

    if (version_id == 2) {
        if (qemu_get_be32(f) != phys_ram_size)
            return -EINVAL;
        return ram_load_dead(f, opaque);
    }

    if (version_id != 3)
        return -EINVAL;

    do {
        addr = qemu_get_be64(f);

        flags = addr & ~TARGET_PAGE_MASK;
        addr &= TARGET_PAGE_MASK;

        if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
            if (addr != phys_ram_size)
                return -EINVAL;
        }

        if (flags & RAM_SAVE_FLAG_FULL) {
            if (ram_load_dead(f, opaque) < 0)
                return -EINVAL;
        }
        
        if (flags & RAM_SAVE_FLAG_COMPRESS) {
            uint8_t ch = qemu_get_byte(f);
            memset(phys_ram_base + addr, ch, TARGET_PAGE_SIZE);
        } else if (flags & RAM_SAVE_FLAG_PAGE)
            qemu_get_buffer(f, phys_ram_base + addr, TARGET_PAGE_SIZE);
    } while (!(flags & RAM_SAVE_FLAG_EOS));

3203 3204 3205
    return 0;
}

A
aliguori 已提交
3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218
void qemu_service_io(void)
{
    CPUState *env = cpu_single_env;
    if (env) {
        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
#ifdef USE_KQEMU
        if (env->kqemu_enabled) {
            kqemu_cpu_interrupt(env);
        }
#endif
    }
}

B
bellard 已提交
3219 3220 3221 3222 3223 3224 3225
/***********************************************************/
/* bottom halves (can be seen as timers which expire ASAP) */

struct QEMUBH {
    QEMUBHFunc *cb;
    void *opaque;
    int scheduled;
A
aliguori 已提交
3226 3227
    int idle;
    int deleted;
B
bellard 已提交
3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240
    QEMUBH *next;
};

static QEMUBH *first_bh = NULL;

QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
{
    QEMUBH *bh;
    bh = qemu_mallocz(sizeof(QEMUBH));
    if (!bh)
        return NULL;
    bh->cb = cb;
    bh->opaque = opaque;
A
aliguori 已提交
3241 3242
    bh->next = first_bh;
    first_bh = bh;
B
bellard 已提交
3243 3244 3245
    return bh;
}

B
bellard 已提交
3246
int qemu_bh_poll(void)
B
bellard 已提交
3247
{
A
aliguori 已提交
3248
    QEMUBH *bh, **bhp;
B
bellard 已提交
3249
    int ret;
B
bellard 已提交
3250

B
bellard 已提交
3251
    ret = 0;
A
aliguori 已提交
3252 3253 3254 3255 3256 3257 3258 3259
    for (bh = first_bh; bh; bh = bh->next) {
        if (!bh->deleted && bh->scheduled) {
            bh->scheduled = 0;
            if (!bh->idle)
                ret = 1;
            bh->idle = 0;
            bh->cb(bh->opaque);
        }
B
bellard 已提交
3260
    }
A
aliguori 已提交
3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272

    /* remove deleted bhs */
    bhp = &first_bh;
    while (*bhp) {
        bh = *bhp;
        if (bh->deleted) {
            *bhp = bh->next;
            qemu_free(bh);
        } else
            bhp = &bh->next;
    }

B
bellard 已提交
3273
    return ret;
B
bellard 已提交
3274 3275
}

A
aliguori 已提交
3276 3277 3278 3279 3280 3281 3282 3283
void qemu_bh_schedule_idle(QEMUBH *bh)
{
    if (bh->scheduled)
        return;
    bh->scheduled = 1;
    bh->idle = 1;
}

B
bellard 已提交
3284 3285 3286 3287 3288 3289
void qemu_bh_schedule(QEMUBH *bh)
{
    CPUState *env = cpu_single_env;
    if (bh->scheduled)
        return;
    bh->scheduled = 1;
A
aliguori 已提交
3290
    bh->idle = 0;
B
bellard 已提交
3291 3292 3293 3294 3295 3296 3297 3298
    /* stop the currently executing CPU to execute the BH ASAP */
    if (env) {
        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
    }
}

void qemu_bh_cancel(QEMUBH *bh)
{
A
aliguori 已提交
3299
    bh->scheduled = 0;
B
bellard 已提交
3300 3301 3302 3303
}

void qemu_bh_delete(QEMUBH *bh)
{
A
aliguori 已提交
3304 3305
    bh->scheduled = 0;
    bh->deleted = 1;
B
bellard 已提交
3306 3307
}

A
aliguori 已提交
3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327
static void qemu_bh_update_timeout(int *timeout)
{
    QEMUBH *bh;

    for (bh = first_bh; bh; bh = bh->next) {
        if (!bh->deleted && bh->scheduled) {
            if (bh->idle) {
                /* idle bottom halves will be polled at least
                 * every 10ms */
                *timeout = MIN(10, *timeout);
            } else {
                /* non-idle bottom halves will be executed
                 * immediately */
                *timeout = 0;
                break;
            }
        }
    }
}

3328 3329 3330
/***********************************************************/
/* machine registration */

B
blueswir1 已提交
3331
static QEMUMachine *first_machine = NULL;
3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343

int qemu_register_machine(QEMUMachine *m)
{
    QEMUMachine **pm;
    pm = &first_machine;
    while (*pm != NULL)
        pm = &(*pm)->next;
    m->next = NULL;
    *pm = m;
    return 0;
}

3344
static QEMUMachine *find_machine(const char *name)
3345 3346 3347 3348 3349 3350 3351 3352 3353 3354
{
    QEMUMachine *m;

    for(m = first_machine; m != NULL; m = m->next) {
        if (!strcmp(m->name, name))
            return m;
    }
    return NULL;
}

3355 3356 3357
/***********************************************************/
/* main execution loop */

3358
static void gui_update(void *opaque)
3359
{
3360 3361
    DisplayState *ds = opaque;
    ds->dpy_refresh(ds);
A
aurel32 已提交
3362 3363 3364 3365 3366
    qemu_mod_timer(ds->gui_timer,
        (ds->gui_timer_interval ?
	    ds->gui_timer_interval :
	    GUI_REFRESH_INTERVAL)
	+ qemu_get_clock(rt_clock));
3367 3368
}

B
bellard 已提交
3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406
struct vm_change_state_entry {
    VMChangeStateHandler *cb;
    void *opaque;
    LIST_ENTRY (vm_change_state_entry) entries;
};

static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;

VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
                                                     void *opaque)
{
    VMChangeStateEntry *e;

    e = qemu_mallocz(sizeof (*e));
    if (!e)
        return NULL;

    e->cb = cb;
    e->opaque = opaque;
    LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
    return e;
}

void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
{
    LIST_REMOVE (e, entries);
    qemu_free (e);
}

static void vm_state_notify(int running)
{
    VMChangeStateEntry *e;

    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
        e->cb(e->opaque, running);
    }
}

3407
/* XXX: support several handlers */
B
bellard 已提交
3408 3409
static VMStopHandler *vm_stop_cb;
static void *vm_stop_opaque;
3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427

int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
{
    vm_stop_cb = cb;
    vm_stop_opaque = opaque;
    return 0;
}

void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
{
    vm_stop_cb = NULL;
}

void vm_start(void)
{
    if (!vm_running) {
        cpu_enable_ticks();
        vm_running = 1;
B
bellard 已提交
3428
        vm_state_notify(1);
3429
        qemu_rearm_alarm_timer(alarm_timer);
3430 3431 3432
    }
}

3433
void vm_stop(int reason)
3434 3435 3436 3437 3438 3439 3440 3441
{
    if (vm_running) {
        cpu_disable_ticks();
        vm_running = 0;
        if (reason != 0) {
            if (vm_stop_cb) {
                vm_stop_cb(vm_stop_opaque, reason);
            }
3442
        }
B
bellard 已提交
3443
        vm_state_notify(0);
3444 3445 3446
    }
}

3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457
/* reset/shutdown handler */

typedef struct QEMUResetEntry {
    QEMUResetHandler *func;
    void *opaque;
    struct QEMUResetEntry *next;
} QEMUResetEntry;

static QEMUResetEntry *first_reset_entry;
static int reset_requested;
static int shutdown_requested;
B
bellard 已提交
3458
static int powerdown_requested;
3459

A
aurel32 已提交
3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480
int qemu_shutdown_requested(void)
{
    int r = shutdown_requested;
    shutdown_requested = 0;
    return r;
}

int qemu_reset_requested(void)
{
    int r = reset_requested;
    reset_requested = 0;
    return r;
}

int qemu_powerdown_requested(void)
{
    int r = powerdown_requested;
    powerdown_requested = 0;
    return r;
}

3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
{
    QEMUResetEntry **pre, *re;

    pre = &first_reset_entry;
    while (*pre != NULL)
        pre = &(*pre)->next;
    re = qemu_mallocz(sizeof(QEMUResetEntry));
    re->func = func;
    re->opaque = opaque;
    re->next = NULL;
    *pre = re;
}

A
aurel32 已提交
3495
void qemu_system_reset(void)
3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506
{
    QEMUResetEntry *re;

    /* reset all devices */
    for(re = first_reset_entry; re != NULL; re = re->next) {
        re->func(re->opaque);
    }
}

void qemu_system_reset_request(void)
{
B
bellard 已提交
3507 3508 3509 3510 3511
    if (no_reboot) {
        shutdown_requested = 1;
    } else {
        reset_requested = 1;
    }
B
bellard 已提交
3512 3513
    if (cpu_single_env)
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
3514 3515 3516 3517 3518
}

void qemu_system_shutdown_request(void)
{
    shutdown_requested = 1;
B
bellard 已提交
3519 3520
    if (cpu_single_env)
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
3521 3522
}

B
bellard 已提交
3523 3524 3525
void qemu_system_powerdown_request(void)
{
    powerdown_requested = 1;
B
bellard 已提交
3526 3527
    if (cpu_single_env)
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
3528 3529
}

T
ths 已提交
3530
#ifdef _WIN32
3531
static void host_main_loop_wait(int *timeout)
A
aliguori 已提交
3532 3533
{
    int ret, ret2, i;
3534 3535
    PollingEntry *pe;

3536

3537 3538 3539 3540 3541
    /* XXX: need to suppress polling by better using win32 events */
    ret = 0;
    for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
        ret |= pe->func(pe->opaque);
    }
3542
    if (ret == 0) {
3543 3544
        int err;
        WaitObjects *w = &wait_objects;
3545

A
aliguori 已提交
3546
        ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
3547 3548 3549
        if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
            if (w->func[ret - WAIT_OBJECT_0])
                w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
3550

3551
            /* Check for additional signaled events */
3552
            for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
3553

3554 3555 3556 3557 3558 3559 3560 3561 3562
                /* Check if event is signaled */
                ret2 = WaitForSingleObject(w->events[i], 0);
                if(ret2 == WAIT_OBJECT_0) {
                    if (w->func[i])
                        w->func[i](w->opaque[i]);
                } else if (ret2 == WAIT_TIMEOUT) {
                } else {
                    err = GetLastError();
                    fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
3563 3564
                }
            }
3565 3566 3567
        } else if (ret == WAIT_TIMEOUT) {
        } else {
            err = GetLastError();
3568
            fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
3569
        }
3570
    }
A
aliguori 已提交
3571 3572 3573 3574

    *timeout = 0;
}
#else
3575
static void host_main_loop_wait(int *timeout)
A
aliguori 已提交
3576 3577
{
}
B
bellard 已提交
3578
#endif
A
aliguori 已提交
3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590

void main_loop_wait(int timeout)
{
    IOHandlerRecord *ioh;
    fd_set rfds, wfds, xfds;
    int ret, nfds;
    struct timeval tv;

    qemu_bh_update_timeout(&timeout);

    host_main_loop_wait(&timeout);

B
bellard 已提交
3591 3592
    /* poll any events */
    /* XXX: separate device handlers from system ones */
3593
    nfds = -1;
B
bellard 已提交
3594 3595
    FD_ZERO(&rfds);
    FD_ZERO(&wfds);
3596
    FD_ZERO(&xfds);
B
bellard 已提交
3597
    for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3598 3599
        if (ioh->deleted)
            continue;
B
bellard 已提交
3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612
        if (ioh->fd_read &&
            (!ioh->fd_read_poll ||
             ioh->fd_read_poll(ioh->opaque) != 0)) {
            FD_SET(ioh->fd, &rfds);
            if (ioh->fd > nfds)
                nfds = ioh->fd;
        }
        if (ioh->fd_write) {
            FD_SET(ioh->fd, &wfds);
            if (ioh->fd > nfds)
                nfds = ioh->fd;
        }
    }
3613

A
aliguori 已提交
3614 3615 3616
    tv.tv_sec = timeout / 1000;
    tv.tv_usec = (timeout % 1000) * 1000;

3617
#if defined(CONFIG_SLIRP)
3618
    if (slirp_is_inited()) {
3619 3620 3621 3622
        slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
    }
#endif
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
B
bellard 已提交
3623
    if (ret > 0) {
3624 3625 3626
        IOHandlerRecord **pioh;

        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3627
            if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
B
bellard 已提交
3628
                ioh->fd_read(ioh->opaque);
B
bellard 已提交
3629
            }
3630
            if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
B
bellard 已提交
3631
                ioh->fd_write(ioh->opaque);
3632
            }
B
bellard 已提交
3633
        }
3634 3635 3636 3637 3638 3639 3640 3641

	/* remove deleted IO handlers */
	pioh = &first_io_handler;
	while (*pioh) {
            ioh = *pioh;
            if (ioh->deleted) {
                *pioh = ioh->next;
                qemu_free(ioh);
3642
            } else
3643 3644
                pioh = &ioh->next;
        }
B
bellard 已提交
3645
    }
B
bellard 已提交
3646
#if defined(CONFIG_SLIRP)
3647
    if (slirp_is_inited()) {
3648 3649 3650 3651
        if (ret < 0) {
            FD_ZERO(&rfds);
            FD_ZERO(&wfds);
            FD_ZERO(&xfds);
B
bellard 已提交
3652
        }
3653
        slirp_select_poll(&rfds, &wfds, &xfds);
B
bellard 已提交
3654
    }
3655
#endif
B
bellard 已提交
3656

3657 3658 3659 3660 3661 3662 3663 3664 3665
    /* vm time timers */
    if (vm_running && likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
        qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
                        qemu_get_clock(vm_clock));

    /* real time timers */
    qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
                    qemu_get_clock(rt_clock));

P
pbrook 已提交
3666 3667 3668
    /* Check bottom-halves last in case any of the earlier events triggered
       them.  */
    qemu_bh_poll();
3669

B
bellard 已提交
3670 3671
}

3672
static int main_loop(void)
B
bellard 已提交
3673 3674
{
    int ret, timeout;
3675 3676 3677
#ifdef CONFIG_PROFILER
    int64_t ti;
#endif
B
bellard 已提交
3678
    CPUState *env;
B
bellard 已提交
3679

B
bellard 已提交
3680
    cur_cpu = first_cpu;
3681
    next_cpu = cur_cpu->next_cpu ?: first_cpu;
B
bellard 已提交
3682 3683
    for(;;) {
        if (vm_running) {
B
bellard 已提交
3684 3685 3686

            for(;;) {
                /* get next cpu */
3687
                env = next_cpu;
3688 3689 3690
#ifdef CONFIG_PROFILER
                ti = profile_getclock();
#endif
P
pbrook 已提交
3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705
                if (use_icount) {
                    int64_t count;
                    int decr;
                    qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
                    env->icount_decr.u16.low = 0;
                    env->icount_extra = 0;
                    count = qemu_next_deadline();
                    count = (count + (1 << icount_time_shift) - 1)
                            >> icount_time_shift;
                    qemu_icount += count;
                    decr = (count > 0xffff) ? 0xffff : count;
                    count -= decr;
                    env->icount_decr.u16.low = decr;
                    env->icount_extra = count;
                }
B
bellard 已提交
3706
                ret = cpu_exec(env);
3707 3708 3709
#ifdef CONFIG_PROFILER
                qemu_time += profile_getclock() - ti;
#endif
P
pbrook 已提交
3710 3711 3712 3713 3714 3715 3716 3717
                if (use_icount) {
                    /* Fold pending instructions back into the
                       instruction counter, and clear the interrupt flag.  */
                    qemu_icount -= (env->icount_decr.u16.low
                                    + env->icount_extra);
                    env->icount_decr.u32 = 0;
                    env->icount_extra = 0;
                }
3718
                next_cpu = env->next_cpu ?: first_cpu;
3719
                if (event_pending && likely(ret != EXCP_DEBUG)) {
3720 3721 3722 3723
                    ret = EXCP_INTERRUPT;
                    event_pending = 0;
                    break;
                }
P
pbrook 已提交
3724 3725 3726 3727 3728
                if (ret == EXCP_HLT) {
                    /* Give the next CPU a chance to run.  */
                    cur_cpu = env;
                    continue;
                }
B
bellard 已提交
3729 3730 3731
                if (ret != EXCP_HALTED)
                    break;
                /* all CPUs are halted ? */
P
pbrook 已提交
3732
                if (env == cur_cpu)
B
bellard 已提交
3733 3734 3735 3736
                    break;
            }
            cur_cpu = env;

B
bellard 已提交
3737
            if (shutdown_requested) {
B
bellard 已提交
3738
                ret = EXCP_INTERRUPT;
A
aurel32 已提交
3739 3740 3741 3742 3743 3744
                if (no_shutdown) {
                    vm_stop(0);
                    no_shutdown = 0;
                }
                else
                    break;
B
bellard 已提交
3745 3746 3747 3748
            }
            if (reset_requested) {
                reset_requested = 0;
                qemu_system_reset();
B
bellard 已提交
3749 3750 3751 3752 3753 3754
                ret = EXCP_INTERRUPT;
            }
            if (powerdown_requested) {
                powerdown_requested = 0;
		qemu_system_powerdown();
                ret = EXCP_INTERRUPT;
B
bellard 已提交
3755
            }
3756
            if (unlikely(ret == EXCP_DEBUG)) {
3757
                gdb_set_stop_cpu(cur_cpu);
B
bellard 已提交
3758 3759
                vm_stop(EXCP_DEBUG);
            }
P
pbrook 已提交
3760
            /* If all cpus are halted then wait until the next IRQ */
B
bellard 已提交
3761
            /* XXX: use timeout computed from timers */
P
pbrook 已提交
3762 3763 3764 3765 3766 3767 3768 3769
            if (ret == EXCP_HALTED) {
                if (use_icount) {
                    int64_t add;
                    int64_t delta;
                    /* Advance virtual time to the next event.  */
                    if (use_icount == 1) {
                        /* When not using an adaptive execution frequency
                           we tend to get badly out of sync with real time,
T
ths 已提交
3770
                           so just delay for a reasonable amount of time.  */
P
pbrook 已提交
3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796
                        delta = 0;
                    } else {
                        delta = cpu_get_icount() - cpu_get_clock();
                    }
                    if (delta > 0) {
                        /* If virtual time is ahead of real time then just
                           wait for IO.  */
                        timeout = (delta / 1000000) + 1;
                    } else {
                        /* Wait for either IO to occur or the next
                           timer event.  */
                        add = qemu_next_deadline();
                        /* We advance the timer before checking for IO.
                           Limit the amount we advance so that early IO
                           activity won't get the guest too far ahead.  */
                        if (add > 10000000)
                            add = 10000000;
                        delta += add;
                        add = (add + (1 << icount_time_shift) - 1)
                              >> icount_time_shift;
                        qemu_icount += add;
                        timeout = delta / 1000000;
                        if (timeout < 0)
                            timeout = 0;
                    }
                } else {
3797
                    timeout = 5000;
P
pbrook 已提交
3798 3799
                }
            } else {
B
bellard 已提交
3800
                timeout = 0;
P
pbrook 已提交
3801
            }
B
bellard 已提交
3802
        } else {
3803 3804
            if (shutdown_requested) {
                ret = EXCP_INTERRUPT;
3805
                break;
3806
            }
3807
            timeout = 5000;
B
bellard 已提交
3808
        }
3809 3810 3811
#ifdef CONFIG_PROFILER
        ti = profile_getclock();
#endif
B
bellard 已提交
3812
        main_loop_wait(timeout);
3813 3814 3815
#ifdef CONFIG_PROFILER
        dev_time += profile_getclock() - ti;
#endif
B
bellard 已提交
3816
    }
3817 3818
    cpu_disable_ticks();
    return ret;
B
bellard 已提交
3819 3820
}

3821
static void help(int exitcode)
3822
{
B
bellard 已提交
3823
    printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
3824
           "usage: %s [options] [disk_image]\n"
3825
           "\n"
3826
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
B
bellard 已提交
3827
           "\n"
3828
           "Standard options:\n"
3829
           "-M machine      select emulated machine (-M ? for list)\n"
P
pbrook 已提交
3830
           "-cpu cpu        select CPU (-cpu ? for list)\n"
3831
           "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
3832 3833
           "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n"
           "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n"
3834
           "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
3835 3836
	   "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
           "       [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
3837
           "       [,cache=writethrough|writeback|none][,format=f]\n"
T
ths 已提交
3838
	   "                use 'file' as a drive image\n"
3839
           "-mtdblock file  use 'file' as on-board Flash memory image\n"
3840
           "-sd file        use 'file' as SecureDigital card image\n"
3841
           "-pflash file    use 'file' as a parallel flash image\n"
3842
           "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
T
ths 已提交
3843 3844
           "-snapshot       write to temporary files instead of disk image files\n"
#ifdef CONFIG_SDL
3845
           "-no-frame       open SDL window without a frame and window decorations\n"
T
ths 已提交
3846
           "-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n"
T
ths 已提交
3847 3848
           "-no-quit        disable SDL window close capability\n"
#endif
B
bellard 已提交
3849 3850 3851
#ifdef TARGET_I386
           "-no-fd-bootchk  disable boot signature checking for floppy disks\n"
#endif
B
bellard 已提交
3852
           "-m megs         set virtual RAM size to megs MB [default=%d]\n"
3853
           "-smp n          set the number of CPUs to 'n' [default=1]\n"
3854
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
3855
           "-portrait       rotate graphical output 90 deg left (only PXA LCD)\n"
B
bellard 已提交
3856
#ifndef _WIN32
T
ths 已提交
3857
           "-k language     use keyboard layout (for example \"fr\" for French)\n"
B
bellard 已提交
3858
#endif
3859 3860
#ifdef HAS_AUDIO
           "-audio-help     print list of audio drivers and their options\n"
B
bellard 已提交
3861 3862 3863
           "-soundhw c1,... enable audio support\n"
           "                and only specified sound cards (comma separated list)\n"
           "                use -soundhw ? to get the list of supported cards\n"
3864
           "                use -soundhw all to enable all of them\n"
3865
#endif
3866 3867
           "-vga [std|cirrus|vmware]\n"
           "                select video card type\n"
B
bellard 已提交
3868
           "-localtime      set the real time clock to local time [default=utc]\n"
B
bellard 已提交
3869
           "-full-screen    start in full screen\n"
3870 3871 3872
#ifdef TARGET_I386
           "-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug\n"
#endif
B
bellard 已提交
3873 3874
           "-usb            enable the USB driver (will be the default soon)\n"
           "-usbdevice name add the host or guest USB device 'name'\n"
B
bellard 已提交
3875 3876
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
           "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n"
3877
#endif
T
ths 已提交
3878
           "-name string    set the name of the guest\n"
3879
           "-uuid %%08x-%%04x-%%04x-%%04x-%%012x specify machine UUID\n"
3880 3881
           "\n"
           "Network options:\n"
3882
           "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
B
bellard 已提交
3883
           "                create a new Network Interface Card and connect it to VLAN 'n'\n"
B
bellard 已提交
3884
#ifdef CONFIG_SLIRP
P
pbrook 已提交
3885 3886 3887
           "-net user[,vlan=n][,hostname=host]\n"
           "                connect the user mode network stack to VLAN 'n' and send\n"
           "                hostname 'host' to DHCP clients\n"
B
bellard 已提交
3888
#endif
B
bellard 已提交
3889 3890 3891 3892
#ifdef _WIN32
           "-net tap[,vlan=n],ifname=name\n"
           "                connect the host TAP network interface to VLAN 'n'\n"
#else
T
ths 已提交
3893 3894 3895 3896 3897
           "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file][,downscript=dfile]\n"
           "                connect the host TAP network interface to VLAN 'n' and use the\n"
           "                network scripts 'file' (default=%s)\n"
           "                and 'dfile' (default=%s);\n"
           "                use '[down]script=no' to disable script execution;\n"
B
bellard 已提交
3898
           "                use 'fd=h' to connect to an already opened TAP interface\n"
B
bellard 已提交
3899
#endif
B
bellard 已提交
3900
           "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
B
bellard 已提交
3901
           "                connect the vlan 'n' to another VLAN using a socket connection\n"
3902 3903
           "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
           "                connect the vlan 'n' to multicast maddr and port\n"
3904 3905 3906 3907 3908 3909 3910
#ifdef CONFIG_VDE
           "-net vde[,vlan=n][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
           "                connect the vlan 'n' to port 'n' of a vde switch running\n"
           "                on host and listening for incoming connections on 'socketpath'.\n"
           "                Use group 'groupname' and mode 'octalmode' to change default\n"
           "                ownership and permissions for communication port.\n"
#endif
B
bellard 已提交
3911 3912 3913
           "-net none       use it alone to have zero network devices; if no -net option\n"
           "                is provided, the default is '-net nic -net user'\n"
           "\n"
3914 3915 3916 3917 3918 3919 3920 3921 3922 3923
           "-bt hci,null    Dumb bluetooth HCI - doesn't respond to commands\n"
           "-bt hci,host[:id]\n"
           "                Use host's HCI with the given name\n"
           "-bt hci[,vlan=n]\n"
           "                Emulate a standard HCI in virtual scatternet 'n'\n"
           "-bt vhci[,vlan=n]\n"
           "                Add host computer to virtual scatternet 'n' using VHCI\n"
           "-bt device:dev[,vlan=n]\n"
           "                Emulate a bluetooth device 'dev' in scatternet 'n'\n"
           "\n"
B
bellard 已提交
3924
#ifdef CONFIG_SLIRP
3925
           "-tftp dir       allow tftp access to files in dir [-net user]\n"
3926
           "-bootp file     advertise file in BOOTP replies\n"
B
bellard 已提交
3927 3928
#ifndef _WIN32
           "-smb dir        allow SMB access to files in 'dir' [-net user]\n"
B
bellard 已提交
3929
#endif
B
bellard 已提交
3930
           "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
B
bellard 已提交
3931
           "                redirect TCP or UDP connections from host to guest [-net user]\n"
B
bellard 已提交
3932
#endif
3933
           "\n"
3934
           "Linux boot specific:\n"
3935 3936 3937
           "-kernel bzImage use 'bzImage' as kernel image\n"
           "-append cmdline use 'cmdline' as kernel command line\n"
           "-initrd file    use 'file' as initial ram disk\n"
B
bellard 已提交
3938
           "\n"
3939
           "Debug/Expert options:\n"
B
bellard 已提交
3940 3941
           "-monitor dev    redirect the monitor to char device 'dev'\n"
           "-serial dev     redirect the serial port to char device 'dev'\n"
3942
           "-parallel dev   redirect the parallel port to char device 'dev'\n"
B
bellard 已提交
3943
           "-pidfile file   Write PID to 'file'\n"
3944
           "-S              freeze CPU at startup (use 'c' to start execution)\n"
3945 3946
           "-s              wait gdb connection to port\n"
           "-p port         set gdb connection port [default=%s]\n"
3947
           "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
B
bellard 已提交
3948 3949
           "-hdachs c,h,s[,t]  force hard disk 0 physical geometry and the optional BIOS\n"
           "                translation (t=none or lba) (usually qemu can guess them)\n"
B
-L help  
bellard 已提交
3950
           "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n"
B
bellard 已提交
3951
#ifdef USE_KQEMU
B
bellard 已提交
3952
           "-kernel-kqemu   enable KQEMU full virtualization (default is user mode only)\n"
B
bellard 已提交
3953 3954
           "-no-kqemu       disable KQEMU kernel module usage\n"
#endif
A
aliguori 已提交
3955 3956 3957
#ifdef CONFIG_KVM
           "-enable-kvm     enable KVM full virtualization support\n"
#endif
3958
#ifdef TARGET_I386
B
bellard 已提交
3959
           "-no-acpi        disable ACPI\n"
A
aliguori 已提交
3960
           "-no-hpet        disable HPET\n"
B
balrog 已提交
3961 3962 3963
#endif
#ifdef CONFIG_CURSES
           "-curses         use a curses/ncurses interface instead of SDL\n"
3964
#endif
B
bellard 已提交
3965
           "-no-reboot      exit instead of rebooting\n"
A
aurel32 已提交
3966
           "-no-shutdown    stop before shutdown\n"
3967
           "-loadvm [tag|id]  start right away with a saved state (loadvm in monitor)\n"
B
bellard 已提交
3968
	   "-vnc display    start a VNC server on display\n"
T
ths 已提交
3969 3970 3971
#ifndef _WIN32
	   "-daemonize      daemonize QEMU after initializing\n"
#endif
3972
	   "-option-rom rom load a file, rom, into the option ROM space\n"
B
blueswir1 已提交
3973 3974 3975
#ifdef TARGET_SPARC
           "-prom-env variable=value  set OpenBIOS nvram variables\n"
#endif
3976
           "-clock          force the use of the given methods for timer alarm.\n"
3977
           "                To see what timers are available use -clock ?\n"
B
bellard 已提交
3978
           "-startdate      select initial date of the clock\n"
P
pbrook 已提交
3979
           "-icount [N|auto]\n"
P
pbrook 已提交
3980
           "                Enable virtual instruction counter with 2^N clock ticks per instruction\n"
3981
           "\n"
B
bellard 已提交
3982
           "During emulation, the following keys are useful:\n"
B
bellard 已提交
3983 3984 3985
           "ctrl-alt-f      toggle full screen\n"
           "ctrl-alt-n      switch to virtual console 'n'\n"
           "ctrl-alt        toggle mouse and keyboard grab\n"
B
bellard 已提交
3986 3987 3988
           "\n"
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
           ,
3989
           "qemu",
B
bellard 已提交
3990
           DEFAULT_RAM_SIZE,
B
bellard 已提交
3991
#ifndef _WIN32
B
bellard 已提交
3992
           DEFAULT_NETWORK_SCRIPT,
T
ths 已提交
3993
           DEFAULT_NETWORK_DOWN_SCRIPT,
B
bellard 已提交
3994
#endif
3995
           DEFAULT_GDBSTUB_PORT,
B
bellard 已提交
3996
           "/tmp/qemu.log");
3997
    exit(exitcode);
3998 3999
}

4000 4001 4002 4003 4004
#define HAS_ARG 0x0001

enum {
    QEMU_OPTION_h,

4005
    QEMU_OPTION_M,
4006
    QEMU_OPTION_cpu,
4007 4008 4009 4010 4011 4012
    QEMU_OPTION_fda,
    QEMU_OPTION_fdb,
    QEMU_OPTION_hda,
    QEMU_OPTION_hdb,
    QEMU_OPTION_hdc,
    QEMU_OPTION_hdd,
T
ths 已提交
4013
    QEMU_OPTION_drive,
4014
    QEMU_OPTION_cdrom,
4015
    QEMU_OPTION_mtdblock,
4016
    QEMU_OPTION_sd,
4017
    QEMU_OPTION_pflash,
4018 4019
    QEMU_OPTION_boot,
    QEMU_OPTION_snapshot,
B
bellard 已提交
4020 4021 4022
#ifdef TARGET_I386
    QEMU_OPTION_no_fd_bootchk,
#endif
4023 4024
    QEMU_OPTION_m,
    QEMU_OPTION_nographic,
4025
    QEMU_OPTION_portrait,
4026 4027 4028 4029
#ifdef HAS_AUDIO
    QEMU_OPTION_audio_help,
    QEMU_OPTION_soundhw,
#endif
4030

B
bellard 已提交
4031
    QEMU_OPTION_net,
B
bellard 已提交
4032
    QEMU_OPTION_tftp,
4033
    QEMU_OPTION_bootp,
B
bellard 已提交
4034
    QEMU_OPTION_smb,
B
bellard 已提交
4035
    QEMU_OPTION_redir,
4036
    QEMU_OPTION_bt,
4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047

    QEMU_OPTION_kernel,
    QEMU_OPTION_append,
    QEMU_OPTION_initrd,

    QEMU_OPTION_S,
    QEMU_OPTION_s,
    QEMU_OPTION_p,
    QEMU_OPTION_d,
    QEMU_OPTION_hdachs,
    QEMU_OPTION_L,
4048
    QEMU_OPTION_bios,
4049
    QEMU_OPTION_k,
B
bellard 已提交
4050
    QEMU_OPTION_localtime,
4051
    QEMU_OPTION_g,
4052
    QEMU_OPTION_vga,
T
ths 已提交
4053
    QEMU_OPTION_echr,
B
bellard 已提交
4054 4055
    QEMU_OPTION_monitor,
    QEMU_OPTION_serial,
4056
    QEMU_OPTION_parallel,
B
bellard 已提交
4057 4058
    QEMU_OPTION_loadvm,
    QEMU_OPTION_full_screen,
4059
    QEMU_OPTION_no_frame,
T
ths 已提交
4060
    QEMU_OPTION_alt_grab,
T
ths 已提交
4061
    QEMU_OPTION_no_quit,
B
bellard 已提交
4062
    QEMU_OPTION_pidfile,
B
bellard 已提交
4063
    QEMU_OPTION_no_kqemu,
4064
    QEMU_OPTION_kernel_kqemu,
A
aliguori 已提交
4065
    QEMU_OPTION_enable_kvm,
4066
    QEMU_OPTION_win2k_hack,
B
bellard 已提交
4067
    QEMU_OPTION_usb,
B
bellard 已提交
4068
    QEMU_OPTION_usbdevice,
B
bellard 已提交
4069
    QEMU_OPTION_smp,
B
bellard 已提交
4070
    QEMU_OPTION_vnc,
B
bellard 已提交
4071
    QEMU_OPTION_no_acpi,
A
aliguori 已提交
4072
    QEMU_OPTION_no_hpet,
B
balrog 已提交
4073
    QEMU_OPTION_curses,
B
bellard 已提交
4074
    QEMU_OPTION_no_reboot,
A
aurel32 已提交
4075
    QEMU_OPTION_no_shutdown,
4076
    QEMU_OPTION_show_cursor,
T
ths 已提交
4077
    QEMU_OPTION_daemonize,
4078
    QEMU_OPTION_option_rom,
T
ths 已提交
4079 4080
    QEMU_OPTION_semihosting,
    QEMU_OPTION_name,
B
blueswir1 已提交
4081
    QEMU_OPTION_prom_env,
4082
    QEMU_OPTION_old_param,
4083
    QEMU_OPTION_clock,
B
bellard 已提交
4084
    QEMU_OPTION_startdate,
4085
    QEMU_OPTION_tb_size,
P
pbrook 已提交
4086
    QEMU_OPTION_icount,
4087
    QEMU_OPTION_uuid,
A
aliguori 已提交
4088
    QEMU_OPTION_incoming,
4089 4090 4091 4092 4093 4094 4095 4096
};

typedef struct QEMUOption {
    const char *name;
    int flags;
    int index;
} QEMUOption;

B
blueswir1 已提交
4097
static const QEMUOption qemu_options[] = {
4098
    { "h", 0, QEMU_OPTION_h },
P
pbrook 已提交
4099
    { "help", 0, QEMU_OPTION_h },
4100

4101
    { "M", HAS_ARG, QEMU_OPTION_M },
4102
    { "cpu", HAS_ARG, QEMU_OPTION_cpu },
4103 4104 4105 4106 4107 4108
    { "fda", HAS_ARG, QEMU_OPTION_fda },
    { "fdb", HAS_ARG, QEMU_OPTION_fdb },
    { "hda", HAS_ARG, QEMU_OPTION_hda },
    { "hdb", HAS_ARG, QEMU_OPTION_hdb },
    { "hdc", HAS_ARG, QEMU_OPTION_hdc },
    { "hdd", HAS_ARG, QEMU_OPTION_hdd },
T
ths 已提交
4109
    { "drive", HAS_ARG, QEMU_OPTION_drive },
4110
    { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
4111
    { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock },
4112
    { "sd", HAS_ARG, QEMU_OPTION_sd },
4113
    { "pflash", HAS_ARG, QEMU_OPTION_pflash },
4114 4115
    { "boot", HAS_ARG, QEMU_OPTION_boot },
    { "snapshot", 0, QEMU_OPTION_snapshot },
B
bellard 已提交
4116 4117 4118
#ifdef TARGET_I386
    { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
#endif
4119 4120
    { "m", HAS_ARG, QEMU_OPTION_m },
    { "nographic", 0, QEMU_OPTION_nographic },
4121
    { "portrait", 0, QEMU_OPTION_portrait },
4122
    { "k", HAS_ARG, QEMU_OPTION_k },
4123 4124 4125 4126
#ifdef HAS_AUDIO
    { "audio-help", 0, QEMU_OPTION_audio_help },
    { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
#endif
4127

B
bellard 已提交
4128
    { "net", HAS_ARG, QEMU_OPTION_net},
B
bellard 已提交
4129
#ifdef CONFIG_SLIRP
B
bellard 已提交
4130
    { "tftp", HAS_ARG, QEMU_OPTION_tftp },
4131
    { "bootp", HAS_ARG, QEMU_OPTION_bootp },
B
bellard 已提交
4132
#ifndef _WIN32
B
bellard 已提交
4133
    { "smb", HAS_ARG, QEMU_OPTION_smb },
B
bellard 已提交
4134
#endif
B
bellard 已提交
4135
    { "redir", HAS_ARG, QEMU_OPTION_redir },
B
bellard 已提交
4136
#endif
4137
    { "bt", HAS_ARG, QEMU_OPTION_bt },
4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148

    { "kernel", HAS_ARG, QEMU_OPTION_kernel },
    { "append", HAS_ARG, QEMU_OPTION_append },
    { "initrd", HAS_ARG, QEMU_OPTION_initrd },

    { "S", 0, QEMU_OPTION_S },
    { "s", 0, QEMU_OPTION_s },
    { "p", HAS_ARG, QEMU_OPTION_p },
    { "d", HAS_ARG, QEMU_OPTION_d },
    { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
    { "L", HAS_ARG, QEMU_OPTION_L },
4149
    { "bios", HAS_ARG, QEMU_OPTION_bios },
B
bellard 已提交
4150 4151
#ifdef USE_KQEMU
    { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
4152
    { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
B
bellard 已提交
4153
#endif
A
aliguori 已提交
4154 4155 4156
#ifdef CONFIG_KVM
    { "enable-kvm", 0, QEMU_OPTION_enable_kvm },
#endif
B
bellard 已提交
4157
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
4158
    { "g", 1, QEMU_OPTION_g },
B
bellard 已提交
4159
#endif
B
bellard 已提交
4160
    { "localtime", 0, QEMU_OPTION_localtime },
4161
    { "vga", HAS_ARG, QEMU_OPTION_vga },
4162 4163 4164 4165
    { "echr", HAS_ARG, QEMU_OPTION_echr },
    { "monitor", HAS_ARG, QEMU_OPTION_monitor },
    { "serial", HAS_ARG, QEMU_OPTION_serial },
    { "parallel", HAS_ARG, QEMU_OPTION_parallel },
B
bellard 已提交
4166 4167
    { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
    { "full-screen", 0, QEMU_OPTION_full_screen },
T
ths 已提交
4168
#ifdef CONFIG_SDL
4169
    { "no-frame", 0, QEMU_OPTION_no_frame },
T
ths 已提交
4170
    { "alt-grab", 0, QEMU_OPTION_alt_grab },
T
ths 已提交
4171 4172
    { "no-quit", 0, QEMU_OPTION_no_quit },
#endif
B
bellard 已提交
4173
    { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
4174
    { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
B
bellard 已提交
4175
    { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
B
bellard 已提交
4176
    { "smp", HAS_ARG, QEMU_OPTION_smp },
B
bellard 已提交
4177
    { "vnc", HAS_ARG, QEMU_OPTION_vnc },
B
balrog 已提交
4178 4179 4180
#ifdef CONFIG_CURSES
    { "curses", 0, QEMU_OPTION_curses },
#endif
4181
    { "uuid", HAS_ARG, QEMU_OPTION_uuid },
4182

B
bellard 已提交
4183
    /* temporary options */
B
bellard 已提交
4184
    { "usb", 0, QEMU_OPTION_usb },
B
bellard 已提交
4185
    { "no-acpi", 0, QEMU_OPTION_no_acpi },
A
aliguori 已提交
4186
    { "no-hpet", 0, QEMU_OPTION_no_hpet },
B
bellard 已提交
4187
    { "no-reboot", 0, QEMU_OPTION_no_reboot },
A
aurel32 已提交
4188
    { "no-shutdown", 0, QEMU_OPTION_no_shutdown },
4189
    { "show-cursor", 0, QEMU_OPTION_show_cursor },
T
ths 已提交
4190
    { "daemonize", 0, QEMU_OPTION_daemonize },
4191
    { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
P
pbrook 已提交
4192
#if defined(TARGET_ARM) || defined(TARGET_M68K)
4193 4194
    { "semihosting", 0, QEMU_OPTION_semihosting },
#endif
T
ths 已提交
4195
    { "name", HAS_ARG, QEMU_OPTION_name },
B
blueswir1 已提交
4196 4197
#if defined(TARGET_SPARC)
    { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
4198 4199 4200
#endif
#if defined(TARGET_ARM)
    { "old-param", 0, QEMU_OPTION_old_param },
B
blueswir1 已提交
4201
#endif
4202
    { "clock", HAS_ARG, QEMU_OPTION_clock },
B
bellard 已提交
4203
    { "startdate", HAS_ARG, QEMU_OPTION_startdate },
4204
    { "tb-size", HAS_ARG, QEMU_OPTION_tb_size },
P
pbrook 已提交
4205
    { "icount", HAS_ARG, QEMU_OPTION_icount },
A
aliguori 已提交
4206
    { "incoming", HAS_ARG, QEMU_OPTION_incoming },
4207
    { NULL },
B
bellard 已提交
4208 4209
};

B
bellard 已提交
4210 4211
/* password input */

4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229
int qemu_key_check(BlockDriverState *bs, const char *name)
{
    char password[256];
    int i;

    if (!bdrv_is_encrypted(bs))
        return 0;

    term_printf("%s is encrypted.\n", name);
    for(i = 0; i < 3; i++) {
        monitor_readline("Password: ", 1, password, sizeof(password));
        if (bdrv_set_key(bs, password) == 0)
            return 0;
        term_printf("invalid password\n");
    }
    return -EPERM;
}

4230 4231 4232 4233 4234 4235 4236
static BlockDriverState *get_bdrv(int index)
{
    if (index > nb_drives)
        return NULL;
    return drives_table[index].bdrv;
}

B
bellard 已提交
4237 4238 4239
static void read_passwords(void)
{
    BlockDriverState *bs;
4240
    int i;
B
bellard 已提交
4241

4242 4243 4244 4245
    for(i = 0; i < 6; i++) {
        bs = get_bdrv(i);
        if (bs)
            qemu_key_check(bs, bdrv_get_device_name(bs));
B
bellard 已提交
4246 4247 4248
    }
}

4249
#ifdef HAS_AUDIO
4250
struct soundhw soundhw[] = {
4251
#ifdef HAS_AUDIO_CHOICE
A
aurel32 已提交
4252
#if defined(TARGET_I386) || defined(TARGET_MIPS)
B
bellard 已提交
4253 4254 4255 4256 4257 4258 4259 4260
    {
        "pcspk",
        "PC speaker",
        0,
        1,
        { .init_isa = pcspk_audio_init }
    },
#endif
4261 4262 4263 4264 4265 4266 4267 4268
    {
        "sb16",
        "Creative Sound Blaster 16",
        0,
        1,
        { .init_isa = SB16_init }
    },

M
malc 已提交
4269 4270 4271 4272 4273 4274 4275 4276 4277 4278
#ifdef CONFIG_CS4231A
    {
        "cs4231a",
        "CS4231A",
        0,
        1,
        { .init_isa = cs4231a_init }
    },
#endif

4279
#ifdef CONFIG_ADLIB
4280 4281
    {
        "adlib",
4282
#ifdef HAS_YMF262
4283
        "Yamaha YMF262 (OPL3)",
4284
#else
4285
        "Yamaha YM3812 (OPL2)",
4286
#endif
4287 4288 4289 4290
        0,
        1,
        { .init_isa = Adlib_init }
    },
4291
#endif
4292

4293
#ifdef CONFIG_GUS
4294 4295 4296 4297 4298 4299 4300
    {
        "gus",
        "Gravis Ultrasound GF1",
        0,
        1,
        { .init_isa = GUS_init }
    },
4301
#endif
4302

B
balrog 已提交
4303 4304 4305 4306 4307 4308 4309 4310 4311 4312
#ifdef CONFIG_AC97
    {
        "ac97",
        "Intel 82801AA AC97 Audio",
        0,
        0,
        { .init_pci = ac97_init }
    },
#endif

4313 4314 4315 4316 4317 4318 4319
    {
        "es1370",
        "ENSONIQ AudioPCI ES1370",
        0,
        0,
        { .init_pci = es1370_init }
    },
4320
#endif
4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336

    { NULL, NULL, 0, 0, { NULL } }
};

static void select_soundhw (const char *optarg)
{
    struct soundhw *c;

    if (*optarg == '?') {
    show_valid_cards:

        printf ("Valid sound card names (comma separated):\n");
        for (c = soundhw; c->name; ++c) {
            printf ("%-11s %s\n", c->name, c->descr);
        }
        printf ("\n-soundhw all will enable all of the above\n");
4337 4338 4339
        exit (*optarg != '?');
    }
    else {
4340
        size_t l;
4341 4342 4343 4344
        const char *p;
        char *e;
        int bad_card = 0;

4345 4346 4347 4348 4349 4350
        if (!strcmp (optarg, "all")) {
            for (c = soundhw; c->name; ++c) {
                c->enabled = 1;
            }
            return;
        }
4351

4352
        p = optarg;
4353 4354 4355
        while (*p) {
            e = strchr (p, ',');
            l = !e ? strlen (p) : (size_t) (e - p);
4356 4357 4358 4359

            for (c = soundhw; c->name; ++c) {
                if (!strncmp (c->name, p, l)) {
                    c->enabled = 1;
4360 4361 4362
                    break;
                }
            }
4363 4364

            if (!c->name) {
4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383
                if (l > 80) {
                    fprintf (stderr,
                             "Unknown sound card name (too big to show)\n");
                }
                else {
                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
                             (int) l, p);
                }
                bad_card = 1;
            }
            p += l + (e != NULL);
        }

        if (bad_card)
            goto show_valid_cards;
    }
}
#endif

4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401
static void select_vgahw (const char *p)
{
    const char *opts;

    if (strstart(p, "std", &opts)) {
        cirrus_vga_enabled = 0;
        vmsvga_enabled = 0;
    } else if (strstart(p, "cirrus", &opts)) {
        cirrus_vga_enabled = 1;
        vmsvga_enabled = 0;
    } else if (strstart(p, "vmware", &opts)) {
        cirrus_vga_enabled = 0;
        vmsvga_enabled = 1;
    } else {
    invalid_vga:
        fprintf(stderr, "Unknown vga type: %s\n", p);
        exit(1);
    }
M
malc 已提交
4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414
    while (*opts) {
        const char *nextopt;

        if (strstart(opts, ",retrace=", &nextopt)) {
            opts = nextopt;
            if (strstart(opts, "dumb", &nextopt))
                vga_retrace_method = VGA_RETRACE_DUMB;
            else if (strstart(opts, "precise", &nextopt))
                vga_retrace_method = VGA_RETRACE_PRECISE;
            else goto invalid_vga;
        } else goto invalid_vga;
        opts = nextopt;
    }
4415 4416
}

4417 4418 4419 4420 4421 4422 4423 4424
#ifdef _WIN32
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
{
    exit(STATUS_CONTROL_C_EXIT);
    return TRUE;
}
#endif

4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441
static int qemu_uuid_parse(const char *str, uint8_t *uuid)
{
    int ret;

    if(strlen(str) != 36)
        return -1;

    ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
            &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
            &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);

    if(ret != 16)
        return -1;

    return 0;
}

B
bellard 已提交
4442
#define MAX_NET_CLIENTS 32
B
bellard 已提交
4443

4444 4445 4446 4447 4448 4449 4450
#ifndef _WIN32

static void termsig_handler(int signal)
{
    qemu_system_shutdown_request();
}

B
blueswir1 已提交
4451
static void termsig_setup(void)
4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463
{
    struct sigaction act;

    memset(&act, 0, sizeof(act));
    act.sa_handler = termsig_handler;
    sigaction(SIGINT,  &act, NULL);
    sigaction(SIGHUP,  &act, NULL);
    sigaction(SIGTERM, &act, NULL);
}

#endif

M
malc 已提交
4464
int main(int argc, char **argv, char **envp)
4465
{
B
bellard 已提交
4466
#ifdef CONFIG_GDBSTUB
4467 4468
    int use_gdbstub;
    const char *gdbstub_port;
B
bellard 已提交
4469
#endif
4470
    uint32_t boot_devices_bitmap = 0;
T
ths 已提交
4471
    int i;
4472
    int snapshot, linux_boot, net_boot;
B
bellard 已提交
4473
    const char *initrd_filename;
4474
    const char *kernel_filename, *kernel_cmdline;
4475
    const char *boot_devices = "";
4476
    DisplayState *ds = &display_state;
B
bellard 已提交
4477
    int cyls, heads, secs, translation;
4478
    const char *net_clients[MAX_NET_CLIENTS];
B
bellard 已提交
4479
    int nb_net_clients;
4480 4481
    const char *bt_opts[MAX_BT_CMDLINE];
    int nb_bt_opts;
T
ths 已提交
4482
    int hda_index;
4483 4484
    int optind;
    const char *r, *optarg;
B
bellard 已提交
4485
    CharDriverState *monitor_hd;
4486 4487
    const char *monitor_device;
    const char *serial_devices[MAX_SERIAL_PORTS];
4488
    int serial_device_index;
4489
    const char *parallel_devices[MAX_PARALLEL_PORTS];
4490
    int parallel_device_index;
B
bellard 已提交
4491
    const char *loadvm = NULL;
4492
    QEMUMachine *machine;
4493
    const char *cpu_model;
4494
    const char *usb_devices[MAX_USB_CMDLINE];
B
bellard 已提交
4495
    int usb_devices_index;
T
ths 已提交
4496
    int fds[2];
4497
    int tb_size;
4498
    const char *pid_file = NULL;
4499
    int autostart;
A
aliguori 已提交
4500
    const char *incoming = NULL;
B
bellard 已提交
4501

M
malc 已提交
4502 4503
    qemu_cache_utils_init(envp);

B
bellard 已提交
4504
    LIST_INIT (&vm_change_state_head);
4505 4506 4507 4508 4509 4510 4511 4512
#ifndef _WIN32
    {
        struct sigaction act;
        sigfillset(&act.sa_mask);
        act.sa_flags = 0;
        act.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &act, NULL);
    }
4513 4514
#else
    SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532
    /* Note: cpu_interrupt() is currently not SMP safe, so we force
       QEMU to run on a single CPU */
    {
        HANDLE h;
        DWORD mask, smask;
        int i;
        h = GetCurrentProcess();
        if (GetProcessAffinityMask(h, &mask, &smask)) {
            for(i = 0; i < 32; i++) {
                if (mask & (1 << i))
                    break;
            }
            if (i != 32) {
                mask = 1 << i;
                SetProcessAffinityMask(h, mask);
            }
        }
    }
B
bellard 已提交
4533
#endif
4534

4535 4536
    register_machines();
    machine = first_machine;
4537
    cpu_model = NULL;
B
bellard 已提交
4538
    initrd_filename = NULL;
4539
    ram_size = 0;
4540
    vga_ram_size = VGA_RAM_SIZE;
B
bellard 已提交
4541
#ifdef CONFIG_GDBSTUB
B
bellard 已提交
4542
    use_gdbstub = 0;
B
bellard 已提交
4543
    gdbstub_port = DEFAULT_GDBSTUB_PORT;
B
bellard 已提交
4544
#endif
4545
    snapshot = 0;
4546
    nographic = 0;
B
balrog 已提交
4547
    curses = 0;
4548 4549
    kernel_filename = NULL;
    kernel_cmdline = "";
4550
    cyls = heads = secs = 0;
B
bellard 已提交
4551
    translation = BIOS_ATA_TRANSLATION_AUTO;
4552
    monitor_device = "vc";
4553

A
aurel32 已提交
4554
    serial_devices[0] = "vc:80Cx24C";
4555
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
4556
        serial_devices[i] = NULL;
4557
    serial_device_index = 0;
4558

A
aurel32 已提交
4559
    parallel_devices[0] = "vc:640x480";
4560
    for(i = 1; i < MAX_PARALLEL_PORTS; i++)
4561
        parallel_devices[i] = NULL;
4562
    parallel_device_index = 0;
4563

B
bellard 已提交
4564
    usb_devices_index = 0;
4565

B
bellard 已提交
4566
    nb_net_clients = 0;
4567
    nb_bt_opts = 0;
T
ths 已提交
4568 4569 4570
    nb_drives = 0;
    nb_drives_opt = 0;
    hda_index = -1;
B
bellard 已提交
4571 4572

    nb_nics = 0;
4573

4574
    tb_size = 0;
4575 4576
    autostart= 1;

4577
    optind = 1;
4578
    for(;;) {
4579
        if (optind >= argc)
4580
            break;
4581 4582
        r = argv[optind];
        if (r[0] != '-') {
4583
	    hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
4584 4585 4586 4587
        } else {
            const QEMUOption *popt;

            optind++;
P
pbrook 已提交
4588 4589 4590
            /* Treat --foo the same as -foo.  */
            if (r[1] == '-')
                r++;
4591 4592 4593
            popt = qemu_options;
            for(;;) {
                if (!popt->name) {
4594
                    fprintf(stderr, "%s: invalid option -- '%s'\n",
4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613
                            argv[0], r);
                    exit(1);
                }
                if (!strcmp(popt->name, r + 1))
                    break;
                popt++;
            }
            if (popt->flags & HAS_ARG) {
                if (optind >= argc) {
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
                            argv[0], r);
                    exit(1);
                }
                optarg = argv[optind++];
            } else {
                optarg = NULL;
            }

            switch(popt->index) {
4614 4615 4616 4617 4618 4619 4620
            case QEMU_OPTION_M:
                machine = find_machine(optarg);
                if (!machine) {
                    QEMUMachine *m;
                    printf("Supported machines are:\n");
                    for(m = first_machine; m != NULL; m = m->next) {
                        printf("%-10s %s%s\n",
4621
                               m->name, m->desc,
4622 4623
                               m == first_machine ? " (default)" : "");
                    }
4624
                    exit(*optarg != '?');
4625 4626
                }
                break;
4627 4628
            case QEMU_OPTION_cpu:
                /* hw initialization will check this */
4629
                if (*optarg == '?') {
J
j_mayer 已提交
4630 4631 4632
/* XXX: implement xxx_cpu_list for targets that still miss it */
#if defined(cpu_list)
                    cpu_list(stdout, &fprintf);
4633
#endif
4634
                    exit(0);
4635 4636 4637 4638
                } else {
                    cpu_model = optarg;
                }
                break;
4639
            case QEMU_OPTION_initrd:
B
bellard 已提交
4640 4641
                initrd_filename = optarg;
                break;
4642
            case QEMU_OPTION_hda:
T
ths 已提交
4643
                if (cyls == 0)
4644
                    hda_index = drive_add(optarg, HD_ALIAS, 0);
T
ths 已提交
4645
                else
4646
                    hda_index = drive_add(optarg, HD_ALIAS
T
ths 已提交
4647
			     ",cyls=%d,heads=%d,secs=%d%s",
4648
                             0, cyls, heads, secs,
T
ths 已提交
4649 4650 4651 4652 4653
                             translation == BIOS_ATA_TRANSLATION_LBA ?
                                 ",trans=lba" :
                             translation == BIOS_ATA_TRANSLATION_NONE ?
                                 ",trans=none" : "");
                 break;
4654
            case QEMU_OPTION_hdb:
4655 4656
            case QEMU_OPTION_hdc:
            case QEMU_OPTION_hdd:
4657
                drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
B
bellard 已提交
4658
                break;
T
ths 已提交
4659
            case QEMU_OPTION_drive:
4660
                drive_add(NULL, "%s", optarg);
T
ths 已提交
4661
	        break;
4662
            case QEMU_OPTION_mtdblock:
4663
                drive_add(optarg, MTD_ALIAS);
4664
                break;
4665
            case QEMU_OPTION_sd:
4666
                drive_add(optarg, SD_ALIAS);
4667
                break;
4668
            case QEMU_OPTION_pflash:
4669
                drive_add(optarg, PFLASH_ALIAS);
4670
                break;
4671
            case QEMU_OPTION_snapshot:
4672 4673
                snapshot = 1;
                break;
4674
            case QEMU_OPTION_hdachs:
4675 4676 4677 4678
                {
                    const char *p;
                    p = optarg;
                    cyls = strtol(p, (char **)&p, 0);
B
bellard 已提交
4679 4680
                    if (cyls < 1 || cyls > 16383)
                        goto chs_fail;
4681 4682 4683 4684
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    heads = strtol(p, (char **)&p, 0);
B
bellard 已提交
4685 4686
                    if (heads < 1 || heads > 16)
                        goto chs_fail;
4687 4688 4689 4690
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    secs = strtol(p, (char **)&p, 0);
B
bellard 已提交
4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703
                    if (secs < 1 || secs > 63)
                        goto chs_fail;
                    if (*p == ',') {
                        p++;
                        if (!strcmp(p, "none"))
                            translation = BIOS_ATA_TRANSLATION_NONE;
                        else if (!strcmp(p, "lba"))
                            translation = BIOS_ATA_TRANSLATION_LBA;
                        else if (!strcmp(p, "auto"))
                            translation = BIOS_ATA_TRANSLATION_AUTO;
                        else
                            goto chs_fail;
                    } else if (*p != '\0') {
4704
                    chs_fail:
B
bellard 已提交
4705 4706
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
                        exit(1);
4707
                    }
T
ths 已提交
4708
		    if (hda_index != -1)
4709 4710 4711 4712
                        snprintf(drives_opt[hda_index].opt,
                                 sizeof(drives_opt[hda_index].opt),
                                 HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s",
                                 0, cyls, heads, secs,
T
ths 已提交
4713 4714 4715 4716
			         translation == BIOS_ATA_TRANSLATION_LBA ?
			     	    ",trans=lba" :
			         translation == BIOS_ATA_TRANSLATION_NONE ?
			             ",trans=none" : "");
4717 4718
                }
                break;
4719
            case QEMU_OPTION_nographic:
4720 4721
                nographic = 1;
                break;
B
balrog 已提交
4722 4723 4724 4725 4726
#ifdef CONFIG_CURSES
            case QEMU_OPTION_curses:
                curses = 1;
                break;
#endif
4727 4728 4729
            case QEMU_OPTION_portrait:
                graphic_rotate = 1;
                break;
4730
            case QEMU_OPTION_kernel:
4731 4732
                kernel_filename = optarg;
                break;
4733
            case QEMU_OPTION_append:
4734
                kernel_cmdline = optarg;
4735
                break;
4736
            case QEMU_OPTION_cdrom:
4737
                drive_add(optarg, CDROM_ALIAS);
4738
                break;
4739
            case QEMU_OPTION_boot:
4740 4741 4742 4743
                boot_devices = optarg;
                /* We just do some generic consistency checks */
                {
                    /* Could easily be extended to 64 devices if needed */
T
ths 已提交
4744
                    const char *p;
4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767
                    
                    boot_devices_bitmap = 0;
                    for (p = boot_devices; *p != '\0'; p++) {
                        /* Allowed boot devices are:
                         * a b     : floppy disk drives
                         * c ... f : IDE disk drives
                         * g ... m : machine implementation dependant drives
                         * n ... p : network devices
                         * It's up to each machine implementation to check
                         * if the given boot devices match the actual hardware
                         * implementation and firmware features.
                         */
                        if (*p < 'a' || *p > 'q') {
                            fprintf(stderr, "Invalid boot device '%c'\n", *p);
                            exit(1);
                        }
                        if (boot_devices_bitmap & (1 << (*p - 'a'))) {
                            fprintf(stderr,
                                    "Boot device '%c' was given twice\n",*p);
                            exit(1);
                        }
                        boot_devices_bitmap |= 1 << (*p - 'a');
                    }
4768 4769
                }
                break;
4770 4771
            case QEMU_OPTION_fda:
            case QEMU_OPTION_fdb:
4772
                drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
4773
                break;
B
bellard 已提交
4774 4775 4776 4777 4778
#ifdef TARGET_I386
            case QEMU_OPTION_no_fd_bootchk:
                fd_bootchk = 0;
                break;
#endif
B
bellard 已提交
4779 4780 4781
            case QEMU_OPTION_net:
                if (nb_net_clients >= MAX_NET_CLIENTS) {
                    fprintf(stderr, "qemu: too many network clients\n");
4782 4783
                    exit(1);
                }
4784
                net_clients[nb_net_clients] = optarg;
B
bellard 已提交
4785
                nb_net_clients++;
B
bellard 已提交
4786
                break;
B
bellard 已提交
4787 4788 4789
#ifdef CONFIG_SLIRP
            case QEMU_OPTION_tftp:
		tftp_prefix = optarg;
B
bellard 已提交
4790
                break;
4791 4792 4793
            case QEMU_OPTION_bootp:
                bootp_filename = optarg;
                break;
B
bellard 已提交
4794
#ifndef _WIN32
B
bellard 已提交
4795 4796 4797
            case QEMU_OPTION_smb:
		net_slirp_smb(optarg);
                break;
B
bellard 已提交
4798
#endif
B
bellard 已提交
4799
            case QEMU_OPTION_redir:
4800
                net_slirp_redir(optarg);
B
bellard 已提交
4801
                break;
B
bellard 已提交
4802
#endif
4803 4804 4805 4806 4807 4808 4809
            case QEMU_OPTION_bt:
                if (nb_bt_opts >= MAX_BT_CMDLINE) {
                    fprintf(stderr, "qemu: too many bluetooth options\n");
                    exit(1);
                }
                bt_opts[nb_bt_opts++] = optarg;
                break;
4810 4811 4812 4813 4814 4815 4816 4817 4818
#ifdef HAS_AUDIO
            case QEMU_OPTION_audio_help:
                AUD_help ();
                exit (0);
                break;
            case QEMU_OPTION_soundhw:
                select_soundhw (optarg);
                break;
#endif
4819
            case QEMU_OPTION_h:
4820
                help(0);
4821
                break;
4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835
            case QEMU_OPTION_m: {
                uint64_t value;
                char *ptr;

                value = strtoul(optarg, &ptr, 10);
                switch (*ptr) {
                case 0: case 'M': case 'm':
                    value <<= 20;
                    break;
                case 'G': case 'g':
                    value <<= 30;
                    break;
                default:
                    fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
4836 4837
                    exit(1);
                }
4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852

                /* On 32-bit hosts, QEMU is limited by virtual address space */
                if (value > (2047 << 20)
#ifndef USE_KQEMU
                    && HOST_LONG_BITS == 32
#endif
                    ) {
                    fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
                    exit(1);
                }
                if (value != (uint64_t)(ram_addr_t)value) {
                    fprintf(stderr, "qemu: ram size too large\n");
                    exit(1);
                }
                ram_size = value;
4853
                break;
4854
            }
4855 4856 4857
            case QEMU_OPTION_d:
                {
                    int mask;
B
blueswir1 已提交
4858
                    const CPULogItem *item;
4859

4860 4861 4862
                    mask = cpu_str_to_log_mask(optarg);
                    if (!mask) {
                        printf("Log items (comma separated):\n");
4863 4864 4865 4866
                    for(item = cpu_log_items; item->mask != 0; item++) {
                        printf("%-10s %s\n", item->name, item->help);
                    }
                    exit(1);
4867 4868
                    }
                    cpu_set_log(mask);
4869
                }
4870
                break;
B
bellard 已提交
4871
#ifdef CONFIG_GDBSTUB
4872 4873 4874 4875
            case QEMU_OPTION_s:
                use_gdbstub = 1;
                break;
            case QEMU_OPTION_p:
4876
                gdbstub_port = optarg;
4877
                break;
B
bellard 已提交
4878
#endif
4879 4880 4881
            case QEMU_OPTION_L:
                bios_dir = optarg;
                break;
4882 4883 4884
            case QEMU_OPTION_bios:
                bios_name = optarg;
                break;
4885
            case QEMU_OPTION_S:
4886
                autostart = 0;
4887
                break;
4888 4889 4890
	    case QEMU_OPTION_k:
		keyboard_layout = optarg;
		break;
B
bellard 已提交
4891 4892 4893
            case QEMU_OPTION_localtime:
                rtc_utc = 0;
                break;
4894 4895
            case QEMU_OPTION_vga:
                select_vgahw (optarg);
4896
                break;
4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916
            case QEMU_OPTION_g:
                {
                    const char *p;
                    int w, h, depth;
                    p = optarg;
                    w = strtol(p, (char **)&p, 10);
                    if (w <= 0) {
                    graphic_error:
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
                        exit(1);
                    }
                    if (*p != 'x')
                        goto graphic_error;
                    p++;
                    h = strtol(p, (char **)&p, 10);
                    if (h <= 0)
                        goto graphic_error;
                    if (*p == 'x') {
                        p++;
                        depth = strtol(p, (char **)&p, 10);
4917
                        if (depth != 8 && depth != 15 && depth != 16 &&
4918 4919 4920 4921 4922 4923 4924
                            depth != 24 && depth != 32)
                            goto graphic_error;
                    } else if (*p == '\0') {
                        depth = graphic_depth;
                    } else {
                        goto graphic_error;
                    }
4925

4926 4927 4928 4929 4930
                    graphic_width = w;
                    graphic_height = h;
                    graphic_depth = depth;
                }
                break;
T
ths 已提交
4931 4932 4933 4934 4935 4936 4937 4938
            case QEMU_OPTION_echr:
                {
                    char *r;
                    term_escape_char = strtol(optarg, &r, 0);
                    if (r == optarg)
                        printf("Bad argument to echr\n");
                    break;
                }
B
bellard 已提交
4939
            case QEMU_OPTION_monitor:
4940
                monitor_device = optarg;
B
bellard 已提交
4941 4942
                break;
            case QEMU_OPTION_serial:
4943 4944 4945 4946
                if (serial_device_index >= MAX_SERIAL_PORTS) {
                    fprintf(stderr, "qemu: too many serial ports\n");
                    exit(1);
                }
4947
                serial_devices[serial_device_index] = optarg;
4948
                serial_device_index++;
B
bellard 已提交
4949
                break;
4950 4951 4952 4953 4954
            case QEMU_OPTION_parallel:
                if (parallel_device_index >= MAX_PARALLEL_PORTS) {
                    fprintf(stderr, "qemu: too many parallel ports\n");
                    exit(1);
                }
4955
                parallel_devices[parallel_device_index] = optarg;
4956 4957
                parallel_device_index++;
                break;
B
bellard 已提交
4958 4959 4960 4961 4962 4963
	    case QEMU_OPTION_loadvm:
		loadvm = optarg;
		break;
            case QEMU_OPTION_full_screen:
                full_screen = 1;
                break;
T
ths 已提交
4964
#ifdef CONFIG_SDL
4965 4966 4967
            case QEMU_OPTION_no_frame:
                no_frame = 1;
                break;
T
ths 已提交
4968 4969 4970
            case QEMU_OPTION_alt_grab:
                alt_grab = 1;
                break;
T
ths 已提交
4971 4972 4973 4974
            case QEMU_OPTION_no_quit:
                no_quit = 1;
                break;
#endif
B
bellard 已提交
4975
            case QEMU_OPTION_pidfile:
4976
                pid_file = optarg;
B
bellard 已提交
4977
                break;
4978 4979 4980 4981 4982
#ifdef TARGET_I386
            case QEMU_OPTION_win2k_hack:
                win2k_install_hack = 1;
                break;
#endif
B
bellard 已提交
4983 4984 4985 4986
#ifdef USE_KQEMU
            case QEMU_OPTION_no_kqemu:
                kqemu_allowed = 0;
                break;
4987 4988 4989
            case QEMU_OPTION_kernel_kqemu:
                kqemu_allowed = 2;
                break;
A
aliguori 已提交
4990 4991 4992 4993 4994 4995 4996 4997
#endif
#ifdef CONFIG_KVM
            case QEMU_OPTION_enable_kvm:
                kvm_allowed = 1;
#ifdef USE_KQEMU
                kqemu_allowed = 0;
#endif
                break;
B
bellard 已提交
4998
#endif
B
bellard 已提交
4999 5000 5001
            case QEMU_OPTION_usb:
                usb_enabled = 1;
                break;
B
bellard 已提交
5002 5003
            case QEMU_OPTION_usbdevice:
                usb_enabled = 1;
P
pbrook 已提交
5004
                if (usb_devices_index >= MAX_USB_CMDLINE) {
B
bellard 已提交
5005 5006 5007
                    fprintf(stderr, "Too many USB devices\n");
                    exit(1);
                }
5008
                usb_devices[usb_devices_index] = optarg;
B
bellard 已提交
5009 5010
                usb_devices_index++;
                break;
B
bellard 已提交
5011 5012
            case QEMU_OPTION_smp:
                smp_cpus = atoi(optarg);
5013
                if (smp_cpus < 1) {
B
bellard 已提交
5014 5015 5016 5017
                    fprintf(stderr, "Invalid number of CPUs\n");
                    exit(1);
                }
                break;
B
bellard 已提交
5018
	    case QEMU_OPTION_vnc:
5019
		vnc_display = optarg;
B
bellard 已提交
5020
		break;
B
bellard 已提交
5021 5022 5023
            case QEMU_OPTION_no_acpi:
                acpi_enabled = 0;
                break;
A
aliguori 已提交
5024 5025 5026
            case QEMU_OPTION_no_hpet:
                no_hpet = 1;
                break;
B
bellard 已提交
5027 5028 5029
            case QEMU_OPTION_no_reboot:
                no_reboot = 1;
                break;
A
aurel32 已提交
5030 5031 5032
            case QEMU_OPTION_no_shutdown:
                no_shutdown = 1;
                break;
5033 5034 5035
            case QEMU_OPTION_show_cursor:
                cursor_hide = 0;
                break;
5036 5037 5038 5039 5040 5041 5042
            case QEMU_OPTION_uuid:
                if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
                    fprintf(stderr, "Fail to parse UUID string."
                            " Wrong format.\n");
                    exit(1);
                }
                break;
T
ths 已提交
5043 5044 5045
	    case QEMU_OPTION_daemonize:
		daemonize = 1;
		break;
5046 5047 5048 5049 5050 5051 5052 5053
	    case QEMU_OPTION_option_rom:
		if (nb_option_roms >= MAX_OPTION_ROMS) {
		    fprintf(stderr, "Too many option ROMs\n");
		    exit(1);
		}
		option_rom[nb_option_roms] = optarg;
		nb_option_roms++;
		break;
5054 5055 5056
            case QEMU_OPTION_semihosting:
                semihosting_enabled = 1;
                break;
T
ths 已提交
5057 5058 5059
            case QEMU_OPTION_name:
                qemu_name = optarg;
                break;
B
blueswir1 已提交
5060 5061 5062 5063 5064 5065 5066 5067 5068
#ifdef TARGET_SPARC
            case QEMU_OPTION_prom_env:
                if (nb_prom_envs >= MAX_PROM_ENVS) {
                    fprintf(stderr, "Too many prom variables\n");
                    exit(1);
                }
                prom_envs[nb_prom_envs] = optarg;
                nb_prom_envs++;
                break;
5069 5070 5071 5072
#endif
#ifdef TARGET_ARM
            case QEMU_OPTION_old_param:
                old_param = 1;
5073
                break;
B
blueswir1 已提交
5074
#endif
5075 5076 5077
            case QEMU_OPTION_clock:
                configure_alarms(optarg);
                break;
B
bellard 已提交
5078 5079 5080
            case QEMU_OPTION_startdate:
                {
                    struct tm tm;
5081
                    time_t rtc_start_date;
B
bellard 已提交
5082
                    if (!strcmp(optarg, "now")) {
5083
                        rtc_date_offset = -1;
B
bellard 已提交
5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104
                    } else {
                        if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
                               &tm.tm_year,
                               &tm.tm_mon,
                               &tm.tm_mday,
                               &tm.tm_hour,
                               &tm.tm_min,
                               &tm.tm_sec) == 6) {
                            /* OK */
                        } else if (sscanf(optarg, "%d-%d-%d",
                                          &tm.tm_year,
                                          &tm.tm_mon,
                                          &tm.tm_mday) == 3) {
                            tm.tm_hour = 0;
                            tm.tm_min = 0;
                            tm.tm_sec = 0;
                        } else {
                            goto date_fail;
                        }
                        tm.tm_year -= 1900;
                        tm.tm_mon--;
B
bellard 已提交
5105
                        rtc_start_date = mktimegm(&tm);
B
bellard 已提交
5106 5107 5108 5109 5110 5111
                        if (rtc_start_date == -1) {
                        date_fail:
                            fprintf(stderr, "Invalid date format. Valid format are:\n"
                                    "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
                            exit(1);
                        }
5112
                        rtc_date_offset = time(NULL) - rtc_start_date;
B
bellard 已提交
5113 5114 5115
                    }
                }
                break;
5116 5117 5118 5119 5120
            case QEMU_OPTION_tb_size:
                tb_size = strtol(optarg, NULL, 0);
                if (tb_size < 0)
                    tb_size = 0;
                break;
P
pbrook 已提交
5121 5122 5123 5124 5125 5126 5127 5128
            case QEMU_OPTION_icount:
                use_icount = 1;
                if (strcmp(optarg, "auto") == 0) {
                    icount_time_shift = -1;
                } else {
                    icount_time_shift = strtol(optarg, NULL, 0);
                }
                break;
A
aliguori 已提交
5129 5130 5131
            case QEMU_OPTION_incoming:
                incoming = optarg;
                break;
5132
            }
5133 5134
        }
    }
5135

A
aliguori 已提交
5136 5137 5138 5139 5140 5141 5142 5143
#if defined(CONFIG_KVM) && defined(USE_KQEMU)
    if (kvm_allowed && kqemu_allowed) {
        fprintf(stderr,
                "You can not enable both KVM and kqemu at the same time\n");
        exit(1);
    }
#endif

B
balrog 已提交
5144
    machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
5145 5146 5147 5148 5149 5150 5151
    if (smp_cpus > machine->max_cpus) {
        fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
                "supported by machine `%s' (%d)\n", smp_cpus,  machine->name,
                machine->max_cpus);
        exit(1);
    }

5152 5153 5154 5155 5156 5157 5158 5159 5160
    if (nographic) {
       if (serial_device_index == 0)
           serial_devices[0] = "stdio";
       if (parallel_device_index == 0)
           parallel_devices[0] = "null";
       if (strncmp(monitor_device, "vc", 2) == 0)
           monitor_device = "stdio";
    }

T
ths 已提交
5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175
#ifndef _WIN32
    if (daemonize) {
	pid_t pid;

	if (pipe(fds) == -1)
	    exit(1);

	pid = fork();
	if (pid > 0) {
	    uint8_t status;
	    ssize_t len;

	    close(fds[1]);

	again:
5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186
            len = read(fds[0], &status, 1);
            if (len == -1 && (errno == EINTR))
                goto again;

            if (len != 1)
                exit(1);
            else if (status == 1) {
                fprintf(stderr, "Could not acquire pidfile\n");
                exit(1);
            } else
                exit(0);
T
ths 已提交
5187
	} else if (pid < 0)
5188
            exit(1);
T
ths 已提交
5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205

	setsid();

	pid = fork();
	if (pid > 0)
	    exit(0);
	else if (pid < 0)
	    exit(1);

	umask(027);

        signal(SIGTSTP, SIG_IGN);
        signal(SIGTTOU, SIG_IGN);
        signal(SIGTTIN, SIG_IGN);
    }
#endif

5206
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
5207 5208 5209 5210 5211 5212 5213 5214
        if (daemonize) {
            uint8_t status = 1;
            write(fds[1], &status, 1);
        } else
            fprintf(stderr, "Could not acquire pid file\n");
        exit(1);
    }

5215 5216 5217 5218
#ifdef USE_KQEMU
    if (smp_cpus > 1)
        kqemu_allowed = 0;
#endif
5219
    linux_boot = (kernel_filename != NULL);
B
balrog 已提交
5220
    net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
B
balrog 已提交
5221

5222
    if (!linux_boot && net_boot == 0 &&
5223
        !machine->nodisk_ok && nb_drives_opt == 0)
5224
        help(1);
5225

5226 5227 5228 5229 5230 5231 5232 5233 5234 5235
    if (!linux_boot && *kernel_cmdline != '\0') {
        fprintf(stderr, "-append only allowed with -kernel option\n");
        exit(1);
    }

    if (!linux_boot && initrd_filename != NULL) {
        fprintf(stderr, "-initrd only allowed with -kernel option\n");
        exit(1);
    }

5236
    /* boot to floppy or the default cd if no hard disk defined yet */
5237
    if (!boot_devices[0]) {
T
ths 已提交
5238
        boot_devices = "cad";
5239
    }
B
bellard 已提交
5240
    setvbuf(stdout, NULL, _IOLBF, 0);
5241

5242
    init_timers();
5243 5244 5245 5246
    if (init_timer_alarm() < 0) {
        fprintf(stderr, "could not initialize alarm timer\n");
        exit(1);
    }
P
pbrook 已提交
5247 5248 5249 5250 5251 5252 5253
    if (use_icount && icount_time_shift < 0) {
        use_icount = 2;
        /* 125MIPS seems a reasonable initial guess at the guest speed.
           It will be corrected fairly quickly anyway.  */
        icount_time_shift = 3;
        init_icount_adjust();
    }
5254

B
bellard 已提交
5255 5256 5257 5258
#ifdef _WIN32
    socket_init();
#endif

B
bellard 已提交
5259 5260 5261
    /* init network clients */
    if (nb_net_clients == 0) {
        /* if no clients, we use a default config */
5262 5263 5264 5265
        net_clients[nb_net_clients++] = "nic";
#ifdef CONFIG_SLIRP
        net_clients[nb_net_clients++] = "user";
#endif
B
bellard 已提交
5266 5267
    }

B
bellard 已提交
5268
    for(i = 0;i < nb_net_clients; i++) {
5269
        if (net_client_parse(net_clients[i]) < 0)
B
bellard 已提交
5270
            exit(1);
B
bellard 已提交
5271
    }
5272
    net_client_check();
B
bellard 已提交
5273

5274
#ifdef TARGET_I386
5275
    /* XXX: this should be moved in the PC machine instantiation code */
5276 5277 5278
    if (net_boot != 0) {
        int netroms = 0;
	for (i = 0; i < nb_nics && i < 4; i++) {
5279 5280
	    const char *model = nd_table[i].model;
	    char buf[1024];
5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294
            if (net_boot & (1 << i)) {
                if (model == NULL)
                    model = "ne2k_pci";
                snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
                if (get_image_size(buf) > 0) {
                    if (nb_option_roms >= MAX_OPTION_ROMS) {
                        fprintf(stderr, "Too many option ROMs\n");
                        exit(1);
                    }
                    option_rom[nb_option_roms] = strdup(buf);
                    nb_option_roms++;
                    netroms++;
                }
            }
5295
	}
5296
	if (netroms == 0) {
5297 5298 5299 5300 5301 5302
	    fprintf(stderr, "No valid PXE rom found for network device\n");
	    exit(1);
	}
    }
#endif

5303 5304 5305 5306 5307
    /* init the bluetooth world */
    for (i = 0; i < nb_bt_opts; i++)
        if (bt_parse(bt_opts[i]))
            exit(1);

5308
    /* init the memory */
5309 5310 5311 5312 5313
    phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;

    if (machine->ram_require & RAMSIZE_FIXED) {
        if (ram_size > 0) {
            if (ram_size < phys_ram_size) {
5314 5315
                fprintf(stderr, "Machine `%s' requires %llu bytes of memory\n",
                                machine->name, (unsigned long long) phys_ram_size);
5316 5317 5318 5319 5320 5321 5322
                exit(-1);
            }

            phys_ram_size = ram_size;
        } else
            ram_size = phys_ram_size;
    } else {
5323
        if (ram_size == 0)
5324 5325 5326 5327
            ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;

        phys_ram_size += ram_size;
    }
5328

B
bellard 已提交
5329
    phys_ram_base = qemu_vmalloc(phys_ram_size);
B
bellard 已提交
5330 5331
    if (!phys_ram_base) {
        fprintf(stderr, "Could not allocate physical memory\n");
5332 5333 5334
        exit(1);
    }

5335 5336 5337
    /* init the dynamic translator */
    cpu_exec_init_all(tb_size * 1024 * 1024);

B
bellard 已提交
5338
    bdrv_init();
5339

T
ths 已提交
5340
    /* we always create the cdrom drive, even if no disk is there */
5341

T
ths 已提交
5342
    if (nb_drives_opt < MAX_DRIVES)
5343
        drive_add(NULL, CDROM_ALIAS);
5344

5345
    /* we always create at least one floppy */
5346

T
ths 已提交
5347
    if (nb_drives_opt < MAX_DRIVES)
5348
        drive_add(NULL, FD_ALIAS, 0);
5349

5350 5351 5352
    /* we always create one sd slot, even if no card is in it */

    if (nb_drives_opt < MAX_DRIVES)
5353
        drive_add(NULL, SD_ALIAS);
5354

T
ths 已提交
5355 5356 5357
    /* open the virtual block devices */

    for(i = 0; i < nb_drives_opt; i++)
5358
        if (drive_init(&drives_opt[i], snapshot, machine) == -1)
T
ths 已提交
5359
	    exit(1);
5360

5361
    register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
5362
    register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
5363

5364
    /* terminal init */
5365
    memset(&display_state, 0, sizeof(display_state));
5366
    if (nographic) {
B
balrog 已提交
5367 5368 5369 5370
        if (curses) {
            fprintf(stderr, "fatal: -nographic can't be used with -curses\n");
            exit(1);
        }
5371 5372
        /* nearly nothing to do */
        dumb_display_init(ds);
5373
    } else if (vnc_display != NULL) {
5374 5375 5376
        vnc_display_init(ds);
        if (vnc_display_open(ds, vnc_display) < 0)
            exit(1);
B
balrog 已提交
5377 5378 5379 5380 5381 5382 5383
    } else
#if defined(CONFIG_CURSES)
    if (curses) {
        curses_display_init(ds, full_screen);
    } else
#endif
    {
5384
#if defined(CONFIG_SDL)
5385
        sdl_display_init(ds, full_screen, no_frame);
5386 5387
#elif defined(CONFIG_COCOA)
        cocoa_display_init(ds, full_screen);
P
pbrook 已提交
5388 5389
#else
        dumb_display_init(ds);
5390 5391
#endif
    }
5392

5393 5394 5395 5396 5397
#ifndef _WIN32
    /* must be after terminal init, SDL library changes signal handlers */
    termsig_setup();
#endif

T
ths 已提交
5398 5399 5400
    /* Maintain compatibility with multiple stdio monitors */
    if (!strcmp(monitor_device,"stdio")) {
        for (i = 0; i < MAX_SERIAL_PORTS; i++) {
5401 5402 5403
            const char *devname = serial_devices[i];
            if (devname && !strcmp(devname,"mon:stdio")) {
                monitor_device = NULL;
T
ths 已提交
5404
                break;
5405 5406 5407
            } else if (devname && !strcmp(devname,"stdio")) {
                monitor_device = NULL;
                serial_devices[i] = "mon:stdio";
T
ths 已提交
5408 5409 5410 5411
                break;
            }
        }
    }
5412
    if (monitor_device) {
5413
        monitor_hd = qemu_chr_open("monitor", monitor_device);
T
ths 已提交
5414 5415 5416 5417 5418
        if (!monitor_hd) {
            fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
            exit(1);
        }
        monitor_init(monitor_hd, !nographic);
B
bellard 已提交
5419 5420
    }

5421
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5422
        const char *devname = serial_devices[i];
5423
        if (devname && strcmp(devname, "none")) {
5424 5425 5426
            char label[32];
            snprintf(label, sizeof(label), "serial%d", i);
            serial_hds[i] = qemu_chr_open(label, devname);
5427
            if (!serial_hds[i]) {
5428
                fprintf(stderr, "qemu: could not open serial device '%s'\n",
5429
                        devname);
5430 5431
                exit(1);
            }
5432
            if (strstart(devname, "vc", 0))
B
bellard 已提交
5433
                qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
5434
        }
B
bellard 已提交
5435 5436
    }

5437
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5438
        const char *devname = parallel_devices[i];
5439
        if (devname && strcmp(devname, "none")) {
5440 5441 5442
            char label[32];
            snprintf(label, sizeof(label), "parallel%d", i);
            parallel_hds[i] = qemu_chr_open(label, devname);
5443
            if (!parallel_hds[i]) {
5444
                fprintf(stderr, "qemu: could not open parallel device '%s'\n",
5445
                        devname);
5446 5447
                exit(1);
            }
5448
            if (strstart(devname, "vc", 0))
B
bellard 已提交
5449
                qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
5450 5451 5452
        }
    }

A
aliguori 已提交
5453 5454 5455 5456 5457 5458 5459 5460 5461 5462
    if (kvm_enabled()) {
        int ret;

        ret = kvm_init(smp_cpus);
        if (ret < 0) {
            fprintf(stderr, "failed to initialize KVM\n");
            exit(1);
        }
    }

5463
    machine->init(ram_size, vga_ram_size, boot_devices, ds,
5464
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
B
bellard 已提交
5465

5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476
    /* Set KVM's vcpu state to qemu's initial CPUState. */
    if (kvm_enabled()) {
        int ret;

        ret = kvm_sync_vcpus();
        if (ret < 0) {
            fprintf(stderr, "failed to initialize vcpus\n");
            exit(1);
        }
    }

P
pbrook 已提交
5477 5478 5479 5480 5481 5482 5483 5484 5485 5486
    /* init USB devices */
    if (usb_enabled) {
        for(i = 0; i < usb_devices_index; i++) {
            if (usb_device_add(usb_devices[i]) < 0) {
                fprintf(stderr, "Warning: could not add USB device %s\n",
                        usb_devices[i]);
            }
        }
    }

5487 5488 5489 5490
    if (display_state.dpy_refresh) {
        display_state.gui_timer = qemu_new_timer(rt_clock, gui_update, &display_state);
        qemu_mod_timer(display_state.gui_timer, qemu_get_clock(rt_clock));
    }
B
bellard 已提交
5491

B
bellard 已提交
5492
#ifdef CONFIG_GDBSTUB
B
bellard 已提交
5493
    if (use_gdbstub) {
B
bellard 已提交
5494 5495
        /* XXX: use standard host:port notation and modify options
           accordingly. */
5496 5497
        if (gdbserver_start(gdbstub_port) < 0) {
            fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
B
bellard 已提交
5498
                    gdbstub_port);
5499 5500
            exit(1);
        }
5501
    }
B
bellard 已提交
5502
#endif
5503

B
bellard 已提交
5504
    if (loadvm)
B
bellard 已提交
5505
        do_loadvm(loadvm);
B
bellard 已提交
5506

A
aliguori 已提交
5507 5508 5509 5510 5511
    if (incoming) {
        autostart = 0; /* fixme how to deal with -daemonize */
        qemu_start_incoming_migration(incoming);
    }

B
bellard 已提交
5512
    {
B
bellard 已提交
5513
        /* XXX: simplify init */
5514
        read_passwords();
5515
        if (autostart) {
B
bellard 已提交
5516 5517
            vm_start();
        }
5518
    }
5519

T
ths 已提交
5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532
    if (daemonize) {
	uint8_t status = 0;
	ssize_t len;
	int fd;

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

	if (len != 1)
	    exit(1);

A
aliguori 已提交
5533
	chdir("/");
5534
	TFR(fd = open("/dev/null", O_RDWR));
T
ths 已提交
5535 5536 5537 5538 5539 5540 5541 5542 5543 5544
	if (fd == -1)
	    exit(1);

	dup2(fd, 0);
	dup2(fd, 1);
	dup2(fd, 2);

	close(fd);
    }

5545
    main_loop();
B
bellard 已提交
5546
    quit_timers();
5547
    net_cleanup();
T
ths 已提交
5548

5549 5550
    return 0;
}