vl.c 99.0 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 24 25 26 27 28
 */
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include <errno.h>
B
bellard 已提交
29
#include <sys/time.h>
30
#include <zlib.h>
B
bellard 已提交
31

J
Juan Quintela 已提交
32
/* Needed early for CONFIG_BSD etc. */
B
blueswir1 已提交
33 34
#include "config-host.h"

B
bellard 已提交
35
#ifndef _WIN32
P
Paul Brook 已提交
36
#include <libgen.h>
B
bellard 已提交
37
#include <sys/times.h>
B
bellard 已提交
38
#include <sys/wait.h>
B
bellard 已提交
39 40
#include <termios.h>
#include <sys/mman.h>
B
bellard 已提交
41
#include <sys/ioctl.h>
B
blueswir1 已提交
42
#include <sys/resource.h>
B
bellard 已提交
43
#include <sys/socket.h>
B
bellard 已提交
44
#include <netinet/in.h>
B
blueswir1 已提交
45 46
#include <net/if.h>
#include <arpa/inet.h>
B
bellard 已提交
47
#include <dirent.h>
B
bellard 已提交
48
#include <netdb.h>
49
#include <sys/select.h>
50

J
Juan Quintela 已提交
51
#ifdef CONFIG_BSD
B
bellard 已提交
52
#include <sys/stat.h>
A
Aurelien Jarno 已提交
53
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
B
bellard 已提交
54
#include <libutil.h>
55
#include <sys/sysctl.h>
B
blueswir1 已提交
56 57
#else
#include <util.h>
58
#endif
59
#else
60
#ifdef __linux__
B
bellard 已提交
61 62
#include <pty.h>
#include <malloc.h>
T
ths 已提交
63

B
bellard 已提交
64
#include <linux/ppdev.h>
65
#include <linux/parport.h>
66 67
#endif
#ifdef __sun__
68 69 70 71 72 73 74 75 76 77 78 79
#include <sys/stat.h>
#include <sys/ethernet.h>
#include <sys/sockio.h>
#include <netinet/arp.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 已提交
80
#endif
B
bellard 已提交
81
#endif
B
bellard 已提交
82
#endif
B
bellard 已提交
83

84 85 86 87
#if defined(__OpenBSD__)
#include <util.h>
#endif

88 89 90 91
#if defined(CONFIG_VDE)
#include <libvdeplug.h>
#endif

B
bellard 已提交
92
#ifdef _WIN32
93
#include <windows.h>
B
bellard 已提交
94 95
#endif

B
bellard 已提交
96
#ifdef CONFIG_SDL
S
Stefan Weil 已提交
97
#if defined(__APPLE__) || defined(main)
S
Stefan Weil 已提交
98
#include <SDL.h>
M
malc 已提交
99 100 101
int qemu_main(int argc, char **argv, char **envp);
int main(int argc, char **argv)
{
S
Stefan Weil 已提交
102
    return qemu_main(argc, argv, NULL);
M
malc 已提交
103 104 105
}
#undef main
#define main qemu_main
B
bellard 已提交
106
#endif
B
bellard 已提交
107
#endif /* CONFIG_SDL */
108

109 110 111 112 113
#ifdef CONFIG_COCOA
#undef main
#define main qemu_main
#endif /* CONFIG_COCOA */

A
Anthony Liguori 已提交
114 115
#include <glib.h>

116 117 118 119 120 121 122 123
#include "hw/hw.h"
#include "hw/boards.h"
#include "hw/usb.h"
#include "hw/pcmcia.h"
#include "hw/pc.h"
#include "hw/isa.h"
#include "hw/baum.h"
#include "hw/bt.h"
R
Richard W.M. Jones 已提交
124
#include "hw/watchdog.h"
125
#include "hw/smbios.h"
126
#include "hw/xen.h"
127
#include "hw/qdev.h"
128
#include "hw/loader.h"
A
aurel32 已提交
129
#include "bt-host.h"
130
#include "net.h"
131
#include "net/slirp.h"
132 133 134 135 136 137 138 139
#include "monitor.h"
#include "console.h"
#include "sysemu.h"
#include "gdbstub.h"
#include "qemu-timer.h"
#include "qemu-char.h"
#include "cache-utils.h"
#include "block.h"
140
#include "blockdev.h"
L
lirans@il.ibm.com 已提交
141
#include "block-migration.h"
B
blueswir1 已提交
142
#include "dma.h"
143 144 145
#include "audio/audio.h"
#include "migration.h"
#include "kvm.h"
K
Kevin Wolf 已提交
146
#include "qemu-option.h"
G
Gerd Hoffmann 已提交
147
#include "qemu-config.h"
148
#include "qemu-objects.h"
149
#include "qemu-options.h"
150
#ifdef CONFIG_VIRTFS
151 152
#include "fsdev/qemu-fsdev.h"
#endif
153

154
#include "disas.h"
B
bellard 已提交
155

156 157
#include "qemu_socket.h"

J
Jan Kiszka 已提交
158
#include "slirp/libslirp.h"
159

160
#include "trace.h"
161
#include "trace/control.h"
B
Blue Swirl 已提交
162
#include "qemu-queue.h"
163
#include "cpus.h"
164
#include "arch_init.h"
B
Blue Swirl 已提交
165

G
Gerd Hoffmann 已提交
166 167
#include "ui/qemu-spice.h"

168 169
//#define DEBUG_NET
//#define DEBUG_SLIRP
170

171
#define DEFAULT_RAM_SIZE 128
172

173 174
#define MAX_VIRTIO_CONSOLES 1

P
Paul Brook 已提交
175
static const char *data_dir;
176
const char *bios_name = NULL;
M
malc 已提交
177
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
178
DisplayType display_type = DT_DEFAULT;
179
int display_remote = 0;
180
const char* keyboard_layout = NULL;
A
Anthony Liguori 已提交
181
ram_addr_t ram_size;
182 183 184 185
const char *mem_path = NULL;
#ifdef MAP_POPULATE
int mem_prealloc = 0; /* force preallocation of physical target memory */
#endif
186
int nb_nics;
B
bellard 已提交
187
NICInfo nd_table[MAX_NICS];
188
int vm_running;
P
Paolo Bonzini 已提交
189
int autostart;
190
int incoming_expected; /* Started with -incoming and waiting for incoming */
191 192
static int rtc_utc = 1;
static int rtc_date_offset = -1; /* -1 means no change */
J
Jan Kiszka 已提交
193
QEMUClock *rtc_clock;
G
Gerd Hoffmann 已提交
194
int vga_interface_type = VGA_NONE;
B
blueswir1 已提交
195
static int full_screen = 0;
196
#ifdef CONFIG_SDL
B
blueswir1 已提交
197
static int no_frame = 0;
198
#endif
T
ths 已提交
199
int no_quit = 0;
200
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
201
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
202
CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
203
int win2k_install_hack = 0;
204
int rtc_td_hack = 0;
B
bellard 已提交
205
int usb_enabled = 0;
206
int singlestep = 0;
B
bellard 已提交
207
int smp_cpus = 1;
208
int max_cpus = 0;
209 210
int smp_cores = 1;
int smp_threads = 1;
J
Jes Sorensen 已提交
211
#ifdef CONFIG_VNC
212
const char *vnc_display;
J
Jes Sorensen 已提交
213
#endif
B
bellard 已提交
214
int acpi_enabled = 1;
A
aliguori 已提交
215
int no_hpet = 0;
B
bellard 已提交
216
int fd_bootchk = 1;
B
bellard 已提交
217
int no_reboot = 0;
A
aurel32 已提交
218
int no_shutdown = 0;
219
int cursor_hide = 1;
220
int graphic_rotate = 0;
J
Jes Sorensen 已提交
221
uint8_t irq0override = 1;
M
Markus Armbruster 已提交
222
const char *watchdog;
G
Gleb Natapov 已提交
223
QEMUOptionRom option_rom[MAX_OPTION_ROMS];
224
int nb_option_roms;
225
int semihosting_enabled = 0;
226
int old_param = 0;
T
ths 已提交
227
const char *qemu_name;
T
ths 已提交
228
int alt_grab = 0;
229
int ctrl_grab = 0;
B
blueswir1 已提交
230 231
unsigned int nb_prom_envs = 0;
const char *prom_envs[MAX_PROM_ENVS];
232
int boot_menu;
W
wayne 已提交
233 234 235
uint8_t *boot_splash_filedata;
int boot_splash_filedata_size;
uint8_t qemu_extra_params_fw[2];
236

237 238 239 240 241 242 243 244 245 246 247
typedef struct FWBootEntry FWBootEntry;

struct FWBootEntry {
    QTAILQ_ENTRY(FWBootEntry) link;
    int32_t bootindex;
    DeviceState *dev;
    char *suffix;
};

QTAILQ_HEAD(, FWBootEntry) fw_boot_order = QTAILQ_HEAD_INITIALIZER(fw_boot_order);

248 249 250 251
int nb_numa_nodes;
uint64_t node_mem[MAX_NODES];
uint64_t node_cpumask[MAX_NODES];

B
blueswir1 已提交
252
static QEMUTimer *nographic_timer;
253

254 255
uint8_t qemu_uuid[16];

J
Jan Kiszka 已提交
256 257 258
static QEMUBootSetHandler *boot_set_handler;
static void *boot_set_opaque;

G
Gerd Hoffmann 已提交
259 260 261
static NotifierList exit_notifiers =
    NOTIFIER_LIST_INITIALIZER(exit_notifiers);

262 263 264
static NotifierList machine_init_done_notifiers =
    NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);

265
static int tcg_allowed = 1;
266
int kvm_allowed = 0;
A
Anthony PERARD 已提交
267
int xen_allowed = 0;
268 269
uint32_t xen_domid;
enum xen_mode xen_mode = XEN_EMULATE;
270
static int tcg_tb_size;
271

272
static int default_serial = 1;
G
Gerd Hoffmann 已提交
273
static int default_parallel = 1;
274
static int default_virtcon = 1;
G
Gerd Hoffmann 已提交
275
static int default_monitor = 1;
G
Gerd Hoffmann 已提交
276
static int default_vga = 1;
G
Gerd Hoffmann 已提交
277 278 279
static int default_floppy = 1;
static int default_cdrom = 1;
static int default_sdcard = 1;
280 281 282 283 284

static struct {
    const char *driver;
    int *flag;
} default_list[] = {
G
Gerd Hoffmann 已提交
285 286
    { .driver = "isa-serial",           .flag = &default_serial    },
    { .driver = "isa-parallel",         .flag = &default_parallel  },
G
Gerd Hoffmann 已提交
287
    { .driver = "isa-fdc",              .flag = &default_floppy    },
288 289
    { .driver = "ide-cd",               .flag = &default_cdrom     },
    { .driver = "ide-hd",               .flag = &default_cdrom     },
G
Gerd Hoffmann 已提交
290
    { .driver = "ide-drive",            .flag = &default_cdrom     },
291
    { .driver = "scsi-cd",              .flag = &default_cdrom     },
292 293 294
    { .driver = "virtio-serial-pci",    .flag = &default_virtcon   },
    { .driver = "virtio-serial-s390",   .flag = &default_virtcon   },
    { .driver = "virtio-serial",        .flag = &default_virtcon   },
G
Gerd Hoffmann 已提交
295
    { .driver = "VGA",                  .flag = &default_vga       },
G
Gerd Hoffmann 已提交
296 297
    { .driver = "cirrus-vga",           .flag = &default_vga       },
    { .driver = "vmware-svga",          .flag = &default_vga       },
298
    { .driver = "isa-vga",              .flag = &default_vga       },
299
    { .driver = "qxl-vga",              .flag = &default_vga       },
300 301
};

W
wayne 已提交
302 303 304
static void res_free(void)
{
    if (boot_splash_filedata != NULL) {
305
        g_free(boot_splash_filedata);
W
wayne 已提交
306 307 308 309
        boot_splash_filedata = NULL;
    }
}

310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
static int default_driver_check(QemuOpts *opts, void *opaque)
{
    const char *driver = qemu_opt_get(opts, "driver");
    int i;

    if (!driver)
        return 0;
    for (i = 0; i < ARRAY_SIZE(default_list); i++) {
        if (strcmp(default_list[i].driver, driver) != 0)
            continue;
        *(default_list[i].flag) = 0;
    }
    return 0;
}

325 326 327 328 329
/***********************************************************/
/* QEMU state */

static RunState current_run_state = RSTATE_NO_STATE;

330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
typedef struct {
    RunState from;
    RunState to;
} RunStateTransition;

static const RunStateTransition runstate_transitions_def[] = {
    /*     from      ->     to      */
    { RSTATE_NO_STATE, RSTATE_RUNNING },
    { RSTATE_NO_STATE, RSTATE_IN_MIGRATE },
    { RSTATE_NO_STATE, RSTATE_PRE_LAUNCH },

    { RSTATE_DEBUG, RSTATE_RUNNING },

    { RSTATE_IN_MIGRATE, RSTATE_RUNNING },
    { RSTATE_IN_MIGRATE, RSTATE_PRE_LAUNCH },

    { RSTATE_PANICKED, RSTATE_PAUSED },

    { RSTATE_IO_ERROR, RSTATE_RUNNING },

    { RSTATE_PAUSED, RSTATE_RUNNING },

    { RSTATE_POST_MIGRATE, RSTATE_RUNNING },

    { RSTATE_PRE_LAUNCH, RSTATE_RUNNING },
    { RSTATE_PRE_LAUNCH, RSTATE_POST_MIGRATE },

    { RSTATE_PRE_MIGRATE, RSTATE_RUNNING },
    { RSTATE_PRE_MIGRATE, RSTATE_POST_MIGRATE },

    { RSTATE_RESTORE, RSTATE_RUNNING },

    { RSTATE_RUNNING, RSTATE_DEBUG },
    { RSTATE_RUNNING, RSTATE_PANICKED },
    { RSTATE_RUNNING, RSTATE_IO_ERROR },
    { RSTATE_RUNNING, RSTATE_PAUSED },
    { RSTATE_RUNNING, RSTATE_PRE_MIGRATE },
    { RSTATE_RUNNING, RSTATE_RESTORE },
    { RSTATE_RUNNING, RSTATE_SAVEVM },
    { RSTATE_RUNNING, RSTATE_SHUTDOWN },
    { RSTATE_RUNNING, RSTATE_WATCHDOG },

    { RSTATE_SAVEVM, RSTATE_RUNNING },

    { RSTATE_SHUTDOWN, RSTATE_PAUSED },

    { RSTATE_WATCHDOG, RSTATE_RUNNING },

    { RSTATE_MAX, RSTATE_MAX },
};

static bool runstate_valid_transitions[RSTATE_MAX][RSTATE_MAX];

383 384 385 386 387
bool runstate_check(RunState state)
{
    return current_run_state == state;
}

388 389 390 391 392 393 394 395 396 397 398 399
void runstate_init(void)
{
    const RunStateTransition *p;

    memset(&runstate_valid_transitions, 0, sizeof(runstate_valid_transitions));

    for (p = &runstate_transitions_def[0]; p->from != RSTATE_MAX; p++) {
        runstate_valid_transitions[p->from][p->to] = true;
    }
}

/* This function will abort() on invalid state transitions */
400 401
void runstate_set(RunState new_state)
{
402 403 404 405 406 407
    if (new_state >= RSTATE_MAX ||
        !runstate_valid_transitions[current_run_state][new_state]) {
        fprintf(stderr, "invalid runstate transition\n");
        abort();
    }

408 409 410
    current_run_state = new_state;
}

411 412
/***********************************************************/
/* real time host monotonic timer */
413

414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
/***********************************************************/
/* 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);
}

451 452 453 454 455 456 457 458 459
void rtc_change_mon_event(struct tm *tm)
{
    QObject *data;

    data = qobject_from_jsonf("{ 'offset': %d }", qemu_timedate_diff(tm));
    monitor_protocol_event(QEVENT_RTC_CHANGE, data);
    qobject_decref(data);
}

J
Jan Kiszka 已提交
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
static void configure_rtc_date_offset(const char *startdate, int legacy)
{
    time_t rtc_start_date;
    struct tm tm;

    if (!strcmp(startdate, "now") && legacy) {
        rtc_date_offset = -1;
    } else {
        if (sscanf(startdate, "%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(startdate, "%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--;
        rtc_start_date = mktimegm(&tm);
        if (rtc_start_date == -1) {
        date_fail:
            fprintf(stderr, "Invalid date format. Valid formats are:\n"
                            "'2006-06-17T16:01:21' or '2006-06-17'\n");
            exit(1);
        }
        rtc_date_offset = time(NULL) - rtc_start_date;
    }
}

static void configure_rtc(QemuOpts *opts)
{
    const char *value;

    value = qemu_opt_get(opts, "base");
    if (value) {
        if (!strcmp(value, "utc")) {
            rtc_utc = 1;
        } else if (!strcmp(value, "localtime")) {
            rtc_utc = 0;
        } else {
            configure_rtc_date_offset(value, 0);
        }
    }
J
Jan Kiszka 已提交
513 514 515 516 517 518 519 520 521 522 523
    value = qemu_opt_get(opts, "clock");
    if (value) {
        if (!strcmp(value, "host")) {
            rtc_clock = host_clock;
        } else if (!strcmp(value, "vm")) {
            rtc_clock = vm_clock;
        } else {
            fprintf(stderr, "qemu: invalid option value '%s'\n", value);
            exit(1);
        }
    }
J
Jan Kiszka 已提交
524 525
    value = qemu_opt_get(opts, "driftfix");
    if (value) {
B
Blue Swirl 已提交
526
        if (!strcmp(value, "slew")) {
J
Jan Kiszka 已提交
527
            rtc_td_hack = 1;
B
Blue Swirl 已提交
528
        } else if (!strcmp(value, "none")) {
J
Jan Kiszka 已提交
529 530 531 532 533 534 535 536
            rtc_td_hack = 0;
        } else {
            fprintf(stderr, "qemu: invalid option value '%s'\n", value);
            exit(1);
        }
    }
}

537 538 539 540 541
/***********************************************************/
/* Bluetooth support */
static int nb_hcis;
static int cur_hci;
static struct HCIInfo *hci_table[MAX_NICS];
542

543 544 545 546 547 548 549
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 已提交
550
static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
551 552 553 554 555 556
{
    struct bt_vlan_s **pvlan, *vlan;
    for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
        if (vlan->id == id)
            return &vlan->net;
    }
557
    vlan = g_malloc0(sizeof(struct bt_vlan_s));
558 559 560 561 562 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
    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++];
}

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 622
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;
A
Anthony Liguori 已提交
623
    bdaddr_t bdaddr;
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 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 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727

    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;
}

728 729 730
/***********************************************************/
/* QEMU Block devices */

731 732 733 734 735 736
#define HD_OPTS "media=disk"
#define CDROM_OPTS "media=cdrom"
#define FD_OPTS ""
#define PFLASH_OPTS ""
#define MTD_OPTS ""
#define SD_OPTS ""
T
ths 已提交
737

G
Gerd Hoffmann 已提交
738 739
static int drive_init_func(QemuOpts *opts, void *opaque)
{
740
    int *use_scsi = opaque;
G
Gerd Hoffmann 已提交
741

742
    return drive_init(opts, *use_scsi) == NULL;
G
Gerd Hoffmann 已提交
743 744 745 746 747 748 749 750 751 752
}

static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
{
    if (NULL == qemu_opt_get(opts, "snapshot")) {
        qemu_opt_set(opts, "snapshot", "on");
    }
    return 0;
}

753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770
static void default_drive(int enable, int snapshot, int use_scsi,
                          BlockInterfaceType type, int index,
                          const char *optstr)
{
    QemuOpts *opts;

    if (type == IF_DEFAULT) {
        type = use_scsi ? IF_SCSI : IF_IDE;
    }

    if (!enable || drive_get_by_index(type, index)) {
        return;
    }

    opts = drive_add(type, index, NULL, optstr);
    if (snapshot) {
        drive_enable_snapshot(opts, NULL);
    }
771
    if (!drive_init(opts, use_scsi)) {
772 773 774 775
        exit(1);
    }
}

J
Jan Kiszka 已提交
776 777 778 779 780 781 782 783 784 785 786 787 788 789
void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
{
    boot_set_handler = func;
    boot_set_opaque = opaque;
}

int qemu_boot_set(const char *boot_devices)
{
    if (!boot_set_handler) {
        return -EINVAL;
    }
    return boot_set_handler(boot_set_opaque, boot_devices);
}

790
static void validate_bootdevices(char *devices)
J
Jan Kiszka 已提交
791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
{
    /* We just do some generic consistency checks */
    const char *p;
    int bitmap = 0;

    for (p = 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 > 'p') {
            fprintf(stderr, "Invalid boot device '%c'\n", *p);
            exit(1);
        }
        if (bitmap & (1 << (*p - 'a'))) {
            fprintf(stderr, "Boot device '%c' was given twice\n", *p);
            exit(1);
        }
        bitmap |= 1 << (*p - 'a');
    }
}

J
Jan Kiszka 已提交
818 819 820
static void restore_boot_devices(void *opaque)
{
    char *standard_boot_devices = opaque;
A
Alex Williamson 已提交
821 822 823 824 825 826 827
    static int first = 1;

    /* Restore boot order and remove ourselves after the first boot */
    if (first) {
        first = 0;
        return;
    }
J
Jan Kiszka 已提交
828 829 830 831

    qemu_boot_set(standard_boot_devices);

    qemu_unregister_reset(restore_boot_devices, standard_boot_devices);
832
    g_free(standard_boot_devices);
J
Jan Kiszka 已提交
833 834
}

835 836 837 838 839 840 841 842 843 844 845
void add_boot_device_path(int32_t bootindex, DeviceState *dev,
                          const char *suffix)
{
    FWBootEntry *node, *i;

    if (bootindex < 0) {
        return;
    }

    assert(dev != NULL || suffix != NULL);

846
    node = g_malloc0(sizeof(FWBootEntry));
847
    node->bootindex = bootindex;
848
    node->suffix = suffix ? g_strdup(suffix) : NULL;
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863
    node->dev = dev;

    QTAILQ_FOREACH(i, &fw_boot_order, link) {
        if (i->bootindex == bootindex) {
            fprintf(stderr, "Two devices with same boot index %d\n", bootindex);
            exit(1);
        } else if (i->bootindex < bootindex) {
            continue;
        }
        QTAILQ_INSERT_BEFORE(i, node, link);
        return;
    }
    QTAILQ_INSERT_TAIL(&fw_boot_order, node, link);
}

G
Gleb Natapov 已提交
864 865
/*
 * This function returns null terminated string that consist of new line
B
Brad Hards 已提交
866
 * separated device paths.
G
Gleb Natapov 已提交
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
 *
 * memory pointed by "size" is assigned total length of the array in bytes
 *
 */
char *get_boot_devices_list(uint32_t *size)
{
    FWBootEntry *i;
    uint32_t total = 0;
    char *list = NULL;

    QTAILQ_FOREACH(i, &fw_boot_order, link) {
        char *devpath = NULL, *bootpath;
        int len;

        if (i->dev) {
            devpath = qdev_get_fw_dev_path(i->dev);
            assert(devpath);
        }

        if (i->suffix && devpath) {
B
Blue Swirl 已提交
887 888
            size_t bootpathlen = strlen(devpath) + strlen(i->suffix) + 1;

889
            bootpath = g_malloc(bootpathlen);
B
Blue Swirl 已提交
890
            snprintf(bootpath, bootpathlen, "%s%s", devpath, i->suffix);
891
            g_free(devpath);
G
Gleb Natapov 已提交
892 893 894
        } else if (devpath) {
            bootpath = devpath;
        } else {
895
            bootpath = g_strdup(i->suffix);
G
Gleb Natapov 已提交
896 897 898 899 900 901 902
            assert(bootpath);
        }

        if (total) {
            list[total-1] = '\n';
        }
        len = strlen(bootpath) + 1;
903
        list = g_realloc(list, total + len);
G
Gleb Natapov 已提交
904 905
        memcpy(&list[total], bootpath, len);
        total += len;
906
        g_free(bootpath);
G
Gleb Natapov 已提交
907 908 909 910 911 912 913
    }

    *size = total;

    return list;
}

914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931
static void numa_add(const char *optarg)
{
    char option[128];
    char *endptr;
    unsigned long long value, endvalue;
    int nodenr;

    optarg = get_opt_name(option, 128, optarg, ',') + 1;
    if (!strcmp(option, "node")) {
        if (get_param_value(option, 128, "nodeid", optarg) == 0) {
            nodenr = nb_numa_nodes;
        } else {
            nodenr = strtoull(option, NULL, 10);
        }

        if (get_param_value(option, 128, "mem", optarg) == 0) {
            node_mem[nodenr] = 0;
        } else {
932
            int64_t sval;
933 934 935 936
            sval = strtosz(option, NULL);
            if (sval < 0) {
                fprintf(stderr, "qemu: invalid numa mem size: %s\n", optarg);
                exit(1);
937
            }
938
            node_mem[nodenr] = sval;
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
        }
        if (get_param_value(option, 128, "cpus", optarg) == 0) {
            node_cpumask[nodenr] = 0;
        } else {
            value = strtoull(option, &endptr, 10);
            if (value >= 64) {
                value = 63;
                fprintf(stderr, "only 64 CPUs in NUMA mode supported.\n");
            } else {
                if (*endptr == '-') {
                    endvalue = strtoull(endptr+1, &endptr, 10);
                    if (endvalue >= 63) {
                        endvalue = 62;
                        fprintf(stderr,
                            "only 63 CPUs in NUMA mode supported.\n");
                    }
P
Paolo Bonzini 已提交
955
                    value = (2ULL << endvalue) - (1ULL << value);
956
                } else {
P
Paolo Bonzini 已提交
957
                    value = 1ULL << value;
958 959 960 961 962 963 964 965 966
                }
            }
            node_cpumask[nodenr] = value;
        }
        nb_numa_nodes++;
    }
    return;
}

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
static void smp_parse(const char *optarg)
{
    int smp, sockets = 0, threads = 0, cores = 0;
    char *endptr;
    char option[128];

    smp = strtoul(optarg, &endptr, 10);
    if (endptr != optarg) {
        if (*endptr == ',') {
            endptr++;
        }
    }
    if (get_param_value(option, 128, "sockets", endptr) != 0)
        sockets = strtoull(option, NULL, 10);
    if (get_param_value(option, 128, "cores", endptr) != 0)
        cores = strtoull(option, NULL, 10);
    if (get_param_value(option, 128, "threads", endptr) != 0)
        threads = strtoull(option, NULL, 10);
    if (get_param_value(option, 128, "maxcpus", endptr) != 0)
        max_cpus = strtoull(option, NULL, 10);

    /* compute missing values, prefer sockets over cores over threads */
    if (smp == 0 || sockets == 0) {
        sockets = sockets > 0 ? sockets : 1;
        cores = cores > 0 ? cores : 1;
        threads = threads > 0 ? threads : 1;
        if (smp == 0) {
            smp = cores * threads * sockets;
        }
    } else {
        if (cores == 0) {
            threads = threads > 0 ? threads : 1;
            cores = smp / (sockets * threads);
        } else {
J
Joel Schopp 已提交
1001
            threads = smp / (cores * sockets);
1002 1003 1004 1005 1006 1007 1008 1009 1010
        }
    }
    smp_cpus = smp;
    smp_cores = cores > 0 ? cores : 1;
    smp_threads = threads > 0 ? threads : 1;
    if (max_cpus == 0)
        max_cpus = smp_cpus;
}

B
bellard 已提交
1011 1012 1013
/***********************************************************/
/* USB devices */

1014
static int usb_device_add(const char *devname)
B
bellard 已提交
1015 1016
{
    const char *p;
1017
    USBDevice *dev = NULL;
B
bellard 已提交
1018

1019
    if (!usb_enabled)
B
bellard 已提交
1020 1021
        return -1;

G
Gerd Hoffmann 已提交
1022 1023 1024 1025 1026
    /* drivers with .usbdevice_name entry in USBDeviceInfo */
    dev = usbdevice_create(devname);
    if (dev)
        goto done;

1027
    /* the other ones */
1028 1029
#ifndef CONFIG_LINUX
    /* only the linux version is qdev-ified, usb-bsd still needs this */
B
bellard 已提交
1030 1031
    if (strstart(devname, "host:", &p)) {
        dev = usb_host_device_open(p);
1032 1033 1034
    } else
#endif
    if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
1035 1036
        dev = usb_bt_init(devname[2] ? hci_init(p) :
                        bt_new_hci(qemu_find_bt_vlan(0)));
B
bellard 已提交
1037 1038 1039
    } else {
        return -1;
    }
P
pbrook 已提交
1040 1041 1042
    if (!dev)
        return -1;

1043
done:
B
bellard 已提交
1044 1045 1046
    return 0;
}

1047 1048 1049 1050 1051
static int usb_device_del(const char *devname)
{
    int bus_num, addr;
    const char *p;

1052 1053 1054
    if (strstart(devname, "host:", &p))
        return usb_host_device_close(p);

1055
    if (!usb_enabled)
1056 1057 1058 1059 1060 1061 1062 1063
        return -1;

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

1064
    return usb_device_delete_addr(bus_num, addr);
1065 1066
}

1067 1068
static int usb_parse(const char *cmdline)
{
S
Scott Tsai 已提交
1069
    int r;
1070
    r = usb_device_add(cmdline);
S
Scott Tsai 已提交
1071 1072 1073 1074
    if (r < 0) {
        fprintf(stderr, "qemu: could not add USB device '%s'\n", cmdline);
    }
    return r;
1075 1076
}

1077
void do_usb_add(Monitor *mon, const QDict *qdict)
B
bellard 已提交
1078
{
S
Scott Tsai 已提交
1079
    const char *devname = qdict_get_str(qdict, "devname");
1080
    if (usb_device_add(devname) < 0) {
1081
        error_report("could not add USB device '%s'", devname);
S
Scott Tsai 已提交
1082
    }
B
bellard 已提交
1083 1084
}

1085
void do_usb_del(Monitor *mon, const QDict *qdict)
B
bellard 已提交
1086
{
S
Scott Tsai 已提交
1087 1088
    const char *devname = qdict_get_str(qdict, "devname");
    if (usb_device_del(devname) < 0) {
1089
        error_report("could not delete USB device '%s'", devname);
S
Scott Tsai 已提交
1090
    }
B
bellard 已提交
1091 1092
}

1093 1094 1095 1096
/***********************************************************/
/* PCMCIA/Cardbus */

static struct pcmcia_socket_entry_s {
P
Paul Brook 已提交
1097
    PCMCIASocket *socket;
1098 1099 1100
    struct pcmcia_socket_entry_s *next;
} *pcmcia_sockets = 0;

P
Paul Brook 已提交
1101
void pcmcia_socket_register(PCMCIASocket *socket)
1102 1103 1104
{
    struct pcmcia_socket_entry_s *entry;

1105
    entry = g_malloc(sizeof(struct pcmcia_socket_entry_s));
1106 1107 1108 1109 1110
    entry->socket = socket;
    entry->next = pcmcia_sockets;
    pcmcia_sockets = entry;
}

P
Paul Brook 已提交
1111
void pcmcia_socket_unregister(PCMCIASocket *socket)
1112 1113 1114 1115 1116 1117 1118
{
    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;
1119
            g_free(entry);
1120 1121 1122
        }
}

A
aliguori 已提交
1123
void pcmcia_info(Monitor *mon)
1124 1125
{
    struct pcmcia_socket_entry_s *iter;
A
aliguori 已提交
1126

1127
    if (!pcmcia_sockets)
A
aliguori 已提交
1128
        monitor_printf(mon, "No PCMCIA sockets\n");
1129 1130

    for (iter = pcmcia_sockets; iter; iter = iter->next)
A
aliguori 已提交
1131 1132 1133
        monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
                       iter->socket->attached ? iter->socket->card_string :
                       "Empty");
1134 1135
}

1136 1137 1138
/***********************************************************/
/* machine registration */

B
blueswir1 已提交
1139
static QEMUMachine *first_machine = NULL;
1140
QEMUMachine *current_machine = NULL;
1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152

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

1153
static QEMUMachine *find_machine(const char *name)
1154 1155 1156 1157 1158 1159
{
    QEMUMachine *m;

    for(m = first_machine; m != NULL; m = m->next) {
        if (!strcmp(m->name, name))
            return m;
M
Mark McLoughlin 已提交
1160 1161
        if (m->alias && !strcmp(m->alias, name))
            return m;
1162 1163 1164 1165
    }
    return NULL;
}

1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177
static QEMUMachine *find_default_machine(void)
{
    QEMUMachine *m;

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

1178 1179 1180
/***********************************************************/
/* main execution loop */

1181
static void gui_update(void *opaque)
1182
{
1183
    uint64_t interval = GUI_REFRESH_INTERVAL;
1184
    DisplayState *ds = opaque;
1185 1186
    DisplayChangeListener *dcl = ds->listeners;

1187
    qemu_flush_coalesced_mmio_buffer();
1188 1189 1190 1191 1192 1193 1194 1195
    dpy_refresh(ds);

    while (dcl != NULL) {
        if (dcl->gui_timer_interval &&
            dcl->gui_timer_interval < interval)
            interval = dcl->gui_timer_interval;
        dcl = dcl->next;
    }
1196
    qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock_ms(rt_clock));
1197 1198
}

B
blueswir1 已提交
1199 1200 1201 1202
static void nographic_update(void *opaque)
{
    uint64_t interval = GUI_REFRESH_INTERVAL;

1203
    qemu_flush_coalesced_mmio_buffer();
1204
    qemu_mod_timer(nographic_timer, interval + qemu_get_clock_ms(rt_clock));
B
blueswir1 已提交
1205 1206
}

B
bellard 已提交
1207 1208 1209
struct vm_change_state_entry {
    VMChangeStateHandler *cb;
    void *opaque;
B
Blue Swirl 已提交
1210
    QLIST_ENTRY (vm_change_state_entry) entries;
B
bellard 已提交
1211 1212
};

B
Blue Swirl 已提交
1213
static QLIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
B
bellard 已提交
1214 1215 1216 1217 1218 1219

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

1220
    e = g_malloc0(sizeof (*e));
B
bellard 已提交
1221 1222 1223

    e->cb = cb;
    e->opaque = opaque;
B
Blue Swirl 已提交
1224
    QLIST_INSERT_HEAD(&vm_change_state_head, e, entries);
B
bellard 已提交
1225 1226 1227 1228 1229
    return e;
}

void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
{
B
Blue Swirl 已提交
1230
    QLIST_REMOVE (e, entries);
1231
    g_free (e);
B
bellard 已提交
1232 1233
}

1234
void vm_state_notify(int running, RunState state)
B
bellard 已提交
1235 1236 1237
{
    VMChangeStateEntry *e;

1238
    trace_vm_state_notify(running, state);
1239

B
bellard 已提交
1240
    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
1241
        e->cb(e->opaque, running, state);
B
bellard 已提交
1242 1243 1244
    }
}

1245 1246 1247 1248 1249
void vm_start(void)
{
    if (!vm_running) {
        cpu_enable_ticks();
        vm_running = 1;
1250
        runstate_set(RSTATE_RUNNING);
1251
        vm_state_notify(1, RSTATE_RUNNING);
1252
        resume_all_vcpus();
L
Luiz Capitulino 已提交
1253
        monitor_protocol_event(QEVENT_RESUME, NULL);
1254 1255 1256
    }
}

1257 1258 1259
/* reset/shutdown handler */

typedef struct QEMUResetEntry {
B
Blue Swirl 已提交
1260
    QTAILQ_ENTRY(QEMUResetEntry) entry;
1261 1262 1263 1264
    QEMUResetHandler *func;
    void *opaque;
} QEMUResetEntry;

B
Blue Swirl 已提交
1265 1266
static QTAILQ_HEAD(reset_handlers, QEMUResetEntry) reset_handlers =
    QTAILQ_HEAD_INITIALIZER(reset_handlers);
1267
static int reset_requested;
1268 1269
static int shutdown_requested, shutdown_signal = -1;
static pid_t shutdown_pid;
B
bellard 已提交
1270
static int powerdown_requested;
1271
static int debug_requested;
1272
static RunState vmstop_requested = RSTATE_NO_STATE;
1273

1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
int qemu_shutdown_requested_get(void)
{
    return shutdown_requested;
}

int qemu_reset_requested_get(void)
{
    return reset_requested;
}

A
aurel32 已提交
1284 1285 1286 1287 1288 1289 1290
int qemu_shutdown_requested(void)
{
    int r = shutdown_requested;
    shutdown_requested = 0;
    return r;
}

1291 1292 1293
void qemu_kill_report(void)
{
    if (shutdown_signal != -1) {
1294 1295 1296 1297 1298 1299 1300
        fprintf(stderr, "qemu: terminating on signal %d", shutdown_signal);
        if (shutdown_pid == 0) {
            /* This happens for eg ^C at the terminal, so it's worth
             * avoiding printing an odd message in that case.
             */
            fputc('\n', stderr);
        } else {
1301
            fprintf(stderr, " from pid " FMT_pid "\n", shutdown_pid);
1302
        }
1303 1304 1305 1306
        shutdown_signal = -1;
    }
}

A
aurel32 已提交
1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
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;
}

1321 1322 1323 1324 1325 1326 1327
static int qemu_debug_requested(void)
{
    int r = debug_requested;
    debug_requested = 0;
    return r;
}

1328
static RunState qemu_vmstop_requested(void)
1329
{
1330 1331 1332
    RunState s = vmstop_requested;
    vmstop_requested = RSTATE_NO_STATE;
    return s;
1333 1334
}

1335
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
1336
{
1337
    QEMUResetEntry *re = g_malloc0(sizeof(QEMUResetEntry));
1338 1339 1340

    re->func = func;
    re->opaque = opaque;
B
Blue Swirl 已提交
1341
    QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
1342 1343
}

J
Jan Kiszka 已提交
1344
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
1345 1346 1347
{
    QEMUResetEntry *re;

B
Blue Swirl 已提交
1348
    QTAILQ_FOREACH(re, &reset_handlers, entry) {
J
Jan Kiszka 已提交
1349
        if (re->func == func && re->opaque == opaque) {
B
Blue Swirl 已提交
1350
            QTAILQ_REMOVE(&reset_handlers, re, entry);
1351
            g_free(re);
J
Jan Kiszka 已提交
1352 1353 1354 1355 1356
            return;
        }
    }
}

J
Jan Kiszka 已提交
1357
void qemu_system_reset(bool report)
J
Jan Kiszka 已提交
1358 1359 1360 1361
{
    QEMUResetEntry *re, *nre;

    /* reset all devices */
B
Blue Swirl 已提交
1362
    QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
1363 1364
        re->func(re->opaque);
    }
J
Jan Kiszka 已提交
1365 1366 1367
    if (report) {
        monitor_protocol_event(QEVENT_RESET, NULL);
    }
1368
    cpu_synchronize_all_post_reset();
1369 1370 1371 1372
}

void qemu_system_reset_request(void)
{
B
bellard 已提交
1373 1374 1375 1376 1377
    if (no_reboot) {
        shutdown_requested = 1;
    } else {
        reset_requested = 1;
    }
1378
    cpu_stop_current();
1379
    qemu_notify_event();
1380 1381
}

1382 1383 1384 1385 1386 1387 1388
void qemu_system_killed(int signal, pid_t pid)
{
    shutdown_signal = signal;
    shutdown_pid = pid;
    qemu_system_shutdown_request();
}

1389 1390 1391
void qemu_system_shutdown_request(void)
{
    shutdown_requested = 1;
1392
    qemu_notify_event();
1393 1394
}

B
bellard 已提交
1395 1396 1397
void qemu_system_powerdown_request(void)
{
    powerdown_requested = 1;
1398 1399 1400
    qemu_notify_event();
}

1401 1402 1403
void qemu_system_debug_request(void)
{
    debug_requested = 1;
1404
    qemu_notify_event();
1405 1406
}

1407
void qemu_system_vmstop_request(RunState state)
1408
{
1409
    vmstop_requested = state;
1410 1411 1412
    qemu_notify_event();
}

A
Anthony Liguori 已提交
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 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 GPollFD poll_fds[1024 * 2]; /* this is probably overkill */
static int n_poll_fds;
static int max_priority;

static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
                             fd_set *xfds, struct timeval *tv)
{
    GMainContext *context = g_main_context_default();
    int i;
    int timeout = 0, cur_timeout;

    g_main_context_prepare(context, &max_priority);

    n_poll_fds = g_main_context_query(context, max_priority, &timeout,
                                      poll_fds, ARRAY_SIZE(poll_fds));
    g_assert(n_poll_fds <= ARRAY_SIZE(poll_fds));

    for (i = 0; i < n_poll_fds; i++) {
        GPollFD *p = &poll_fds[i];

        if ((p->events & G_IO_IN)) {
            FD_SET(p->fd, rfds);
            *max_fd = MAX(*max_fd, p->fd);
        }
        if ((p->events & G_IO_OUT)) {
            FD_SET(p->fd, wfds);
            *max_fd = MAX(*max_fd, p->fd);
        }
        if ((p->events & G_IO_ERR)) {
            FD_SET(p->fd, xfds);
            *max_fd = MAX(*max_fd, p->fd);
        }
    }

    cur_timeout = (tv->tv_sec * 1000) + ((tv->tv_usec + 500) / 1000);
    if (timeout >= 0 && timeout < cur_timeout) {
        tv->tv_sec = timeout / 1000;
        tv->tv_usec = (timeout % 1000) * 1000;
    }
}

static void glib_select_poll(fd_set *rfds, fd_set *wfds, fd_set *xfds,
                             bool err)
{
    GMainContext *context = g_main_context_default();

    if (!err) {
        int i;

        for (i = 0; i < n_poll_fds; i++) {
            GPollFD *p = &poll_fds[i];

            if ((p->events & G_IO_IN) && FD_ISSET(p->fd, rfds)) {
                p->revents |= G_IO_IN;
            }
            if ((p->events & G_IO_OUT) && FD_ISSET(p->fd, wfds)) {
                p->revents |= G_IO_OUT;
            }
            if ((p->events & G_IO_ERR) && FD_ISSET(p->fd, xfds)) {
                p->revents |= G_IO_ERR;
            }
        }
    }

    if (g_main_context_check(context, max_priority, poll_fds, n_poll_fds)) {
        g_main_context_dispatch(context);
    }
}

1482
int main_loop_wait(int nonblocking)
A
aliguori 已提交
1483 1484 1485 1486
{
    fd_set rfds, wfds, xfds;
    int ret, nfds;
    struct timeval tv;
1487
    int timeout;
A
aliguori 已提交
1488

1489 1490 1491 1492 1493 1494
    if (nonblocking)
        timeout = 0;
    else {
        timeout = qemu_calculate_timeout();
        qemu_bh_update_timeout(&timeout);
    }
A
aliguori 已提交
1495

1496
    os_host_main_loop_wait(&timeout);
A
aliguori 已提交
1497

1498 1499 1500
    tv.tv_sec = timeout / 1000;
    tv.tv_usec = (timeout % 1000) * 1000;

B
bellard 已提交
1501 1502
    /* poll any events */
    /* XXX: separate device handlers from system ones */
1503
    nfds = -1;
B
bellard 已提交
1504 1505
    FD_ZERO(&rfds);
    FD_ZERO(&wfds);
1506
    FD_ZERO(&xfds);
A
Anthony Liguori 已提交
1507

1508
    qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds);
J
Jan Kiszka 已提交
1509
    slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
A
Anthony Liguori 已提交
1510
    glib_select_fill(&nfds, &rfds, &wfds, &xfds, &tv);
J
Jan Kiszka 已提交
1511

1512 1513 1514 1515
    if (timeout > 0) {
        qemu_mutex_unlock_iothread();
    }

1516
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
1517 1518 1519 1520

    if (timeout > 0) {
        qemu_mutex_lock_iothread();
    }
J
Jan Kiszka 已提交
1521

1522
    qemu_iohandler_poll(&rfds, &wfds, &xfds, ret);
J
Jan Kiszka 已提交
1523
    slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
A
Anthony Liguori 已提交
1524
    glib_select_poll(&rfds, &wfds, &xfds, (ret < 0));
B
bellard 已提交
1525

1526
    qemu_run_all_timers();
J
Jan Kiszka 已提交
1527

P
pbrook 已提交
1528 1529 1530
    /* Check bottom-halves last in case any of the earlier events triggered
       them.  */
    qemu_bh_poll();
1531

1532
    return ret;
B
bellard 已提交
1533 1534
}

B
Blue Swirl 已提交
1535 1536
qemu_irq qemu_system_powerdown;

1537 1538
static void main_loop(void)
{
1539 1540
    bool nonblocking;
    int last_io __attribute__ ((unused)) = 0;
1541 1542 1543
#ifdef CONFIG_PROFILER
    int64_t ti;
#endif
1544
    int r;
1545

1546
    qemu_main_loop_start();
1547

1548
    for (;;) {
1549
        nonblocking = !kvm_enabled() && last_io > 0;
1550
#ifdef CONFIG_PROFILER
J
Jan Kiszka 已提交
1551
        ti = profile_getclock();
1552
#endif
1553
        last_io = main_loop_wait(nonblocking);
1554
#ifdef CONFIG_PROFILER
J
Jan Kiszka 已提交
1555
        dev_time += profile_getclock() - ti;
1556
#endif
1557

1558
        if (qemu_debug_requested()) {
1559
            vm_stop(RSTATE_DEBUG);
1560
        }
1561
        if (qemu_shutdown_requested()) {
1562
            qemu_kill_report();
1563
            monitor_protocol_event(QEVENT_SHUTDOWN, NULL);
1564
            if (no_shutdown) {
1565
                vm_stop(RSTATE_SHUTDOWN);
1566 1567 1568
            } else
                break;
        }
1569 1570
        if (qemu_reset_requested()) {
            pause_all_vcpus();
1571
            cpu_synchronize_all_states();
J
Jan Kiszka 已提交
1572
            qemu_system_reset(VMRESET_REPORT);
1573 1574
            resume_all_vcpus();
        }
B
Blue Swirl 已提交
1575
        if (qemu_powerdown_requested()) {
1576
            monitor_protocol_event(QEVENT_POWERDOWN, NULL);
B
Blue Swirl 已提交
1577 1578
            qemu_irq_raise(qemu_system_powerdown);
        }
1579
        if ((r = qemu_vmstop_requested())) {
1580
            vm_stop(r);
1581
        }
B
bellard 已提交
1582
    }
1583
    bdrv_close_all();
1584
    pause_all_vcpus();
B
bellard 已提交
1585 1586
}

P
pbrook 已提交
1587 1588
static void version(void)
{
T
Thomas Monjalon 已提交
1589
    printf("QEMU emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n");
P
pbrook 已提交
1590 1591
}

1592
static void help(int exitcode)
1593
{
1594
    const char *options_help =
1595 1596
#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)     \
        opt_help
1597
#define DEFHEADING(text) stringify(text) "\n"
1598
#include "qemu-options.def"
1599 1600 1601
#undef DEF
#undef DEFHEADING
#undef GEN_DOCS
1602 1603 1604 1605
        ;
    version();
    printf("usage: %s [options] [disk_image]\n"
           "\n"
T
Thomas Monjalon 已提交
1606
           "'disk_image' is a raw hard disk image for IDE hard disk 0\n"
1607
           "\n"
1608
           "%s\n"
1609 1610 1611 1612 1613
           "During emulation, the following keys are useful:\n"
           "ctrl-alt-f      toggle full screen\n"
           "ctrl-alt-n      switch to virtual console 'n'\n"
           "ctrl-alt        toggle mouse and keyboard grab\n"
           "\n"
1614 1615 1616
           "When using -nographic, press 'ctrl-a h' to get some help.\n",
           "qemu",
           options_help);
1617
    exit(exitcode);
1618 1619
}

1620 1621 1622 1623 1624 1625
#define HAS_ARG 0x0001

typedef struct QEMUOption {
    const char *name;
    int flags;
    int index;
1626
    uint32_t arch_mask;
1627 1628
} QEMUOption;

B
blueswir1 已提交
1629
static const QEMUOption qemu_options[] = {
1630 1631 1632
    { "h", 0, QEMU_OPTION_h, QEMU_ARCH_ALL },
#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)     \
    { option, opt_arg, opt_enum, arch_mask },
1633
#define DEFHEADING(text)
1634
#include "qemu-options.def"
1635 1636 1637
#undef DEF
#undef DEFHEADING
#undef GEN_DOCS
1638
    { NULL },
B
bellard 已提交
1639
};
1640 1641 1642 1643
static void select_vgahw (const char *p)
{
    const char *opts;

G
Gerd Hoffmann 已提交
1644
    default_vga = 0;
1645
    vga_interface_type = VGA_NONE;
1646
    if (strstart(p, "std", &opts)) {
1647
        vga_interface_type = VGA_STD;
1648
    } else if (strstart(p, "cirrus", &opts)) {
1649
        vga_interface_type = VGA_CIRRUS;
1650
    } else if (strstart(p, "vmware", &opts)) {
1651
        vga_interface_type = VGA_VMWARE;
1652
    } else if (strstart(p, "xenfb", &opts)) {
1653
        vga_interface_type = VGA_XENFB;
G
Gerd Hoffmann 已提交
1654 1655
    } else if (strstart(p, "qxl", &opts)) {
        vga_interface_type = VGA_QXL;
1656
    } else if (!strstart(p, "none", &opts)) {
1657 1658 1659 1660
    invalid_vga:
        fprintf(stderr, "Unknown vga type: %s\n", p);
        exit(1);
    }
M
malc 已提交
1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
    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;
    }
1674 1675
}

J
Jes Sorensen 已提交
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693
static DisplayType select_display(const char *p)
{
    const char *opts;
    DisplayType display = DT_DEFAULT;

    if (strstart(p, "sdl", &opts)) {
#ifdef CONFIG_SDL
        display = DT_SDL;
        while (*opts) {
            const char *nextopt;

            if (strstart(opts, ",frame=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    no_frame = 0;
                } else if (strstart(opts, "off", &nextopt)) {
                    no_frame = 1;
                } else {
1694
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
1695 1696 1697 1698 1699 1700 1701 1702
                }
            } else if (strstart(opts, ",alt_grab=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    alt_grab = 1;
                } else if (strstart(opts, "off", &nextopt)) {
                    alt_grab = 0;
                } else {
1703
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
1704 1705 1706 1707 1708 1709 1710 1711
                }
            } else if (strstart(opts, ",ctrl_grab=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    ctrl_grab = 1;
                } else if (strstart(opts, "off", &nextopt)) {
                    ctrl_grab = 0;
                } else {
1712
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
1713 1714 1715 1716 1717 1718 1719 1720
                }
            } else if (strstart(opts, ",window_close=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    no_quit = 0;
                } else if (strstart(opts, "off", &nextopt)) {
                    no_quit = 1;
                } else {
1721
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
1722 1723
                }
            } else {
1724 1725 1726
            invalid_sdl_args:
                fprintf(stderr, "Invalid SDL option string: %s\n", p);
                exit(1);
J
Jes Sorensen 已提交
1727 1728 1729 1730 1731 1732 1733
            }
            opts = nextopt;
        }
#else
        fprintf(stderr, "SDL support is disabled\n");
        exit(1);
#endif
J
Jes Sorensen 已提交
1734
    } else if (strstart(p, "vnc", &opts)) {
J
Jes Sorensen 已提交
1735
#ifdef CONFIG_VNC
J
Jes Sorensen 已提交
1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748
        display_remote++;

        if (*opts) {
            const char *nextopt;

            if (strstart(opts, "=", &nextopt)) {
                vnc_display = nextopt;
            }
        }
        if (!vnc_display) {
            fprintf(stderr, "VNC requires a display argument vnc=<display>\n");
            exit(1);
        }
J
Jes Sorensen 已提交
1749 1750 1751 1752
#else
        fprintf(stderr, "VNC support is disabled\n");
        exit(1);
#endif
J
Jes Sorensen 已提交
1753 1754 1755 1756 1757 1758 1759
    } else if (strstart(p, "curses", &opts)) {
#ifdef CONFIG_CURSES
        display = DT_CURSES;
#else
        fprintf(stderr, "Curses support is disabled\n");
        exit(1);
#endif
J
Jes Sorensen 已提交
1760 1761
    } else if (strstart(p, "none", &opts)) {
        display = DT_NONE;
J
Jes Sorensen 已提交
1762 1763 1764 1765 1766 1767 1768 1769
    } else {
        fprintf(stderr, "Unknown display type: %s\n", p);
        exit(1);
    }

    return display;
}

1770 1771
static int balloon_parse(const char *arg)
{
1772
    QemuOpts *opts;
1773

1774 1775 1776 1777 1778 1779 1780
    if (strcmp(arg, "none") == 0) {
        return 0;
    }

    if (!strncmp(arg, "virtio", 6)) {
        if (arg[6] == ',') {
            /* have params -> parse them */
1781
            opts = qemu_opts_parse(qemu_find_opts("device"), arg+7, 0);
1782 1783 1784 1785
            if (!opts)
                return  -1;
        } else {
            /* create empty opts */
1786
            opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0);
1787
        }
1788
        qemu_opt_set(opts, "driver", "virtio-balloon");
1789
        return 0;
1790
    }
1791 1792

    return -1;
1793 1794
}

P
Paul Brook 已提交
1795 1796 1797 1798 1799 1800 1801 1802 1803
char *qemu_find_file(int type, const char *name)
{
    int len;
    const char *subdir;
    char *buf;

    /* If name contains path separators then try it as a straight path.  */
    if ((strchr(name, '/') || strchr(name, '\\'))
        && access(name, R_OK) == 0) {
1804
        return g_strdup(name);
P
Paul Brook 已提交
1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816
    }
    switch (type) {
    case QEMU_FILE_TYPE_BIOS:
        subdir = "";
        break;
    case QEMU_FILE_TYPE_KEYMAP:
        subdir = "keymaps/";
        break;
    default:
        abort();
    }
    len = strlen(data_dir) + strlen(name) + strlen(subdir) + 2;
1817
    buf = g_malloc0(len);
1818
    snprintf(buf, len, "%s/%s%s", data_dir, subdir, name);
P
Paul Brook 已提交
1819
    if (access(buf, R_OK)) {
1820
        g_free(buf);
P
Paul Brook 已提交
1821 1822 1823 1824 1825
        return NULL;
    }
    return buf;
}

1826 1827 1828 1829 1830
static int device_help_func(QemuOpts *opts, void *opaque)
{
    return qdev_device_help(opts);
}

G
Gerd Hoffmann 已提交
1831 1832 1833 1834 1835 1836 1837 1838 1839 1840
static int device_init_func(QemuOpts *opts, void *opaque)
{
    DeviceState *dev;

    dev = qdev_device_add(opts);
    if (!dev)
        return -1;
    return 0;
}

1841 1842 1843 1844
static int chardev_init_func(QemuOpts *opts, void *opaque)
{
    CharDriverState *chr;

1845
    chr = qemu_chr_new_from_opts(opts, NULL);
1846 1847 1848 1849 1850
    if (!chr)
        return -1;
    return 0;
}

1851
#ifdef CONFIG_VIRTFS
1852 1853 1854 1855 1856 1857 1858 1859 1860
static int fsdev_init_func(QemuOpts *opts, void *opaque)
{
    int ret;
    ret = qemu_fsdev_add(opts);

    return ret;
}
#endif

1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880
static int mon_init_func(QemuOpts *opts, void *opaque)
{
    CharDriverState *chr;
    const char *chardev;
    const char *mode;
    int flags;

    mode = qemu_opt_get(opts, "mode");
    if (mode == NULL) {
        mode = "readline";
    }
    if (strcmp(mode, "readline") == 0) {
        flags = MONITOR_USE_READLINE;
    } else if (strcmp(mode, "control") == 0) {
        flags = MONITOR_USE_CONTROL;
    } else {
        fprintf(stderr, "unknown monitor mode \"%s\"\n", mode);
        exit(1);
    }

1881 1882 1883
    if (qemu_opt_get_bool(opts, "pretty", 0))
        flags |= MONITOR_USE_PRETTY;

1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897
    if (qemu_opt_get_bool(opts, "default", 0))
        flags |= MONITOR_IS_DEFAULT;

    chardev = qemu_opt_get(opts, "chardev");
    chr = qemu_chr_find(chardev);
    if (chr == NULL) {
        fprintf(stderr, "chardev \"%s\" not found\n", chardev);
        exit(1);
    }

    monitor_init(chr, flags);
    return 0;
}

G
Gerd Hoffmann 已提交
1898
static void monitor_parse(const char *optarg, const char *mode)
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908
{
    static int monitor_device_index = 0;
    QemuOpts *opts;
    const char *p;
    char label[32];
    int def = 0;

    if (strstart(optarg, "chardev:", &p)) {
        snprintf(label, sizeof(label), "%s", p);
    } else {
1909 1910 1911
        snprintf(label, sizeof(label), "compat_monitor%d",
                 monitor_device_index);
        if (monitor_device_index == 0) {
1912 1913 1914 1915 1916 1917 1918 1919 1920
            def = 1;
        }
        opts = qemu_chr_parse_compat(label, optarg);
        if (!opts) {
            fprintf(stderr, "parse error: %s\n", optarg);
            exit(1);
        }
    }

1921
    opts = qemu_opts_create(qemu_find_opts("mon"), label, 1);
1922 1923 1924 1925
    if (!opts) {
        fprintf(stderr, "duplicate chardev: %s\n", label);
        exit(1);
    }
G
Gerd Hoffmann 已提交
1926
    qemu_opt_set(opts, "mode", mode);
1927 1928 1929 1930 1931 1932
    qemu_opt_set(opts, "chardev", label);
    if (def)
        qemu_opt_set(opts, "default", "on");
    monitor_device_index++;
}

1933 1934
struct device_config {
    enum {
G
Gerd Hoffmann 已提交
1935 1936 1937 1938 1939
        DEV_USB,       /* -usbdevice     */
        DEV_BT,        /* -bt            */
        DEV_SERIAL,    /* -serial        */
        DEV_PARALLEL,  /* -parallel      */
        DEV_VIRTCON,   /* -virtioconsole */
1940
        DEV_DEBUGCON,  /* -debugcon */
1941 1942
    } type;
    const char *cmdline;
B
Blue Swirl 已提交
1943
    QTAILQ_ENTRY(device_config) next;
1944
};
B
Blue Swirl 已提交
1945
QTAILQ_HEAD(, device_config) device_configs = QTAILQ_HEAD_INITIALIZER(device_configs);
1946 1947 1948 1949 1950

static void add_device_config(int type, const char *cmdline)
{
    struct device_config *conf;

1951
    conf = g_malloc0(sizeof(*conf));
1952 1953
    conf->type = type;
    conf->cmdline = cmdline;
B
Blue Swirl 已提交
1954
    QTAILQ_INSERT_TAIL(&device_configs, conf, next);
1955 1956 1957 1958 1959 1960 1961
}

static int foreach_device_config(int type, int (*func)(const char *cmdline))
{
    struct device_config *conf;
    int rc;

B
Blue Swirl 已提交
1962
    QTAILQ_FOREACH(conf, &device_configs, next) {
1963 1964 1965 1966 1967 1968 1969 1970 1971
        if (conf->type != type)
            continue;
        rc = func(conf->cmdline);
        if (0 != rc)
            return rc;
    }
    return 0;
}

1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983
static int serial_parse(const char *devname)
{
    static int index = 0;
    char label[32];

    if (strcmp(devname, "none") == 0)
        return 0;
    if (index == MAX_SERIAL_PORTS) {
        fprintf(stderr, "qemu: too many serial ports\n");
        exit(1);
    }
    snprintf(label, sizeof(label), "serial%d", index);
1984
    serial_hds[index] = qemu_chr_new(label, devname, NULL);
1985 1986 1987 1988 1989 1990 1991 1992 1993
    if (!serial_hds[index]) {
        fprintf(stderr, "qemu: could not open serial device '%s': %s\n",
                devname, strerror(errno));
        return -1;
    }
    index++;
    return 0;
}

G
Gerd Hoffmann 已提交
1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005
static int parallel_parse(const char *devname)
{
    static int index = 0;
    char label[32];

    if (strcmp(devname, "none") == 0)
        return 0;
    if (index == MAX_PARALLEL_PORTS) {
        fprintf(stderr, "qemu: too many parallel ports\n");
        exit(1);
    }
    snprintf(label, sizeof(label), "parallel%d", index);
2006
    parallel_hds[index] = qemu_chr_new(label, devname, NULL);
G
Gerd Hoffmann 已提交
2007 2008 2009 2010 2011 2012 2013 2014 2015
    if (!parallel_hds[index]) {
        fprintf(stderr, "qemu: could not open parallel device '%s': %s\n",
                devname, strerror(errno));
        return -1;
    }
    index++;
    return 0;
}

G
Gerd Hoffmann 已提交
2016 2017
static int virtcon_parse(const char *devname)
{
2018
    QemuOptsList *device = qemu_find_opts("device");
G
Gerd Hoffmann 已提交
2019 2020
    static int index = 0;
    char label[32];
2021
    QemuOpts *bus_opts, *dev_opts;
G
Gerd Hoffmann 已提交
2022 2023 2024 2025 2026 2027 2028

    if (strcmp(devname, "none") == 0)
        return 0;
    if (index == MAX_VIRTIO_CONSOLES) {
        fprintf(stderr, "qemu: too many virtio consoles\n");
        exit(1);
    }
2029

2030
    bus_opts = qemu_opts_create(device, NULL, 0);
2031 2032
    qemu_opt_set(bus_opts, "driver", "virtio-serial");

2033
    dev_opts = qemu_opts_create(device, NULL, 0);
2034 2035
    qemu_opt_set(dev_opts, "driver", "virtconsole");

G
Gerd Hoffmann 已提交
2036
    snprintf(label, sizeof(label), "virtcon%d", index);
2037
    virtcon_hds[index] = qemu_chr_new(label, devname, NULL);
G
Gerd Hoffmann 已提交
2038 2039 2040 2041 2042
    if (!virtcon_hds[index]) {
        fprintf(stderr, "qemu: could not open virtio console '%s': %s\n",
                devname, strerror(errno));
        return -1;
    }
2043 2044
    qemu_opt_set(dev_opts, "chardev", label);

G
Gerd Hoffmann 已提交
2045 2046 2047 2048
    index++;
    return 0;
}

2049 2050 2051 2052
static int debugcon_parse(const char *devname)
{   
    QemuOpts *opts;

2053
    if (!qemu_chr_new("debugcon", devname, NULL)) {
2054 2055
        exit(1);
    }
2056
    opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1);
2057 2058 2059 2060 2061 2062 2063 2064 2065
    if (!opts) {
        fprintf(stderr, "qemu: already have a debugcon device\n");
        exit(1);
    }
    qemu_opt_set(opts, "driver", "isa-debugcon");
    qemu_opt_set(opts, "chardev", "debugcon");
    return 0;
}

2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086
static QEMUMachine *machine_parse(const char *name)
{
    QEMUMachine *m, *machine = NULL;

    if (name) {
        machine = find_machine(name);
    }
    if (machine) {
        return machine;
    }
    printf("Supported machines are:\n");
    for (m = first_machine; m != NULL; m = m->next) {
        if (m->alias) {
            printf("%-10s %s (alias of %s)\n", m->alias, m->desc, m->name);
        }
        printf("%-10s %s%s\n", m->name, m->desc,
               m->is_default ? " (default)" : "");
    }
    exit(!name || *name != '?');
}

2087 2088
static int tcg_init(void)
{
2089
    tcg_exec_init(tcg_tb_size * 1024 * 1024);
2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100
    return 0;
}

static struct {
    const char *opt_name;
    const char *name;
    int (*available)(void);
    int (*init)(void);
    int *allowed;
} accel_list[] = {
    { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed },
A
Anthony PERARD 已提交
2101
    { "xen", "Xen", xen_available, xen_init, &xen_allowed },
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
    { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed },
};

static int configure_accelerator(void)
{
    const char *p = NULL;
    char buf[10];
    int i, ret;
    bool accel_initalised = 0;
    bool init_failed = 0;

    QemuOptsList *list = qemu_find_opts("machine");
    if (!QTAILQ_EMPTY(&list->head)) {
        p = qemu_opt_get(QTAILQ_FIRST(&list->head), "accel");
    }

    if (p == NULL) {
        /* Use the default "accelerator", tcg */
        p = "tcg";
    }

    while (!accel_initalised && *p != '\0') {
        if (*p == ':') {
            p++;
        }
        p = get_opt_name(buf, sizeof (buf), p, ':');
        for (i = 0; i < ARRAY_SIZE(accel_list); i++) {
            if (strcmp(accel_list[i].opt_name, buf) == 0) {
2130
                *(accel_list[i].allowed) = 1;
2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141
                ret = accel_list[i].init();
                if (ret < 0) {
                    init_failed = 1;
                    if (!accel_list[i].available()) {
                        printf("%s not supported for this target\n",
                               accel_list[i].name);
                    } else {
                        fprintf(stderr, "failed to initialize %s: %s\n",
                                accel_list[i].name,
                                strerror(-ret));
                    }
2142
                    *(accel_list[i].allowed) = 0;
2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165
                } else {
                    accel_initalised = 1;
                }
                break;
            }
        }
        if (i == ARRAY_SIZE(accel_list)) {
            fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf);
        }
    }

    if (!accel_initalised) {
        fprintf(stderr, "No accelerator found!\n");
        exit(1);
    }

    if (init_failed) {
        fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name);
    }

    return !accel_initalised;
}

G
Gerd Hoffmann 已提交
2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177
void qemu_add_exit_notifier(Notifier *notify)
{
    notifier_list_add(&exit_notifiers, notify);
}

void qemu_remove_exit_notifier(Notifier *notify)
{
    notifier_list_remove(&exit_notifiers, notify);
}

static void qemu_run_exit_notifiers(void)
{
2178
    notifier_list_notify(&exit_notifiers, NULL);
G
Gerd Hoffmann 已提交
2179 2180
}

2181 2182 2183 2184 2185 2186 2187
void qemu_add_machine_init_done_notifier(Notifier *notify)
{
    notifier_list_add(&machine_init_done_notifiers, notify);
}

static void qemu_run_machine_init_done_notifiers(void)
{
2188
    notifier_list_notify(&machine_init_done_notifiers, NULL);
2189 2190
}

2191 2192 2193 2194 2195 2196 2197 2198
static const QEMUOption *lookup_opt(int argc, char **argv,
                                    const char **poptarg, int *poptind)
{
    const QEMUOption *popt;
    int optind = *poptind;
    char *r = argv[optind];
    const char *optarg;

2199
    loc_set_cmdline(argv, optind, 1);
2200 2201 2202 2203 2204 2205 2206
    optind++;
    /* Treat --foo the same as -foo.  */
    if (r[1] == '-')
        r++;
    popt = qemu_options;
    for(;;) {
        if (!popt->name) {
2207
            error_report("invalid option");
2208 2209 2210 2211 2212 2213 2214 2215
            exit(1);
        }
        if (!strcmp(popt->name, r + 1))
            break;
        popt++;
    }
    if (popt->flags & HAS_ARG) {
        if (optind >= argc) {
2216
            error_report("requires an argument");
2217 2218 2219
            exit(1);
        }
        optarg = argv[optind++];
2220
        loc_set_cmdline(argv, optind - 2, 2);
2221 2222 2223 2224 2225 2226 2227 2228 2229 2230
    } else {
        optarg = NULL;
    }

    *poptarg = optarg;
    *poptind = optind;

    return popt;
}

2231 2232 2233
static gpointer malloc_and_trace(gsize n_bytes)
{
    void *ptr = malloc(n_bytes);
2234
    trace_g_malloc(n_bytes, ptr);
2235 2236 2237 2238 2239 2240
    return ptr;
}

static gpointer realloc_and_trace(gpointer mem, gsize n_bytes)
{
    void *ptr = realloc(mem, n_bytes);
2241
    trace_g_realloc(mem, n_bytes, ptr);
2242 2243 2244 2245 2246
    return ptr;
}

static void free_and_trace(gpointer mem)
{
2247
    trace_g_free(mem);
2248 2249 2250
    free(mem);
}

M
malc 已提交
2251
int main(int argc, char **argv, char **envp)
2252
{
2253
    const char *gdbstub_dev = NULL;
T
ths 已提交
2254
    int i;
2255
    int snapshot, linux_boot;
P
Paolo Bonzini 已提交
2256
    const char *icount_option = NULL;
B
bellard 已提交
2257
    const char *initrd_filename;
2258
    const char *kernel_filename, *kernel_cmdline;
2259
    char boot_devices[33] = "cad"; /* default to HD->floppy->CD-ROM */
2260
    DisplayState *ds;
2261
    DisplayChangeListener *dcl;
B
bellard 已提交
2262
    int cyls, heads, secs, translation;
G
Gerd Hoffmann 已提交
2263
    QemuOpts *hda_opts = NULL, *opts;
2264
    QemuOptsList *olist;
2265
    int optind;
2266
    const char *optarg;
B
bellard 已提交
2267
    const char *loadvm = NULL;
2268
    QEMUMachine *machine;
2269
    const char *cpu_model;
2270
    const char *pid_file = NULL;
A
aliguori 已提交
2271
    const char *incoming = NULL;
J
Jes Sorensen 已提交
2272
#ifdef CONFIG_VNC
2273
    int show_vnc_port = 0;
J
Jes Sorensen 已提交
2274
#endif
2275
    int defconfig = 1;
2276 2277
    const char *log_mask = NULL;
    const char *log_file = NULL;
2278 2279 2280 2281 2282
    GMemVTable mem_trace = {
        .malloc = malloc_and_trace,
        .realloc = realloc_and_trace,
        .free = free_and_trace,
    };
2283
    const char *trace_events = NULL;
2284
    const char *trace_file = NULL;
2285

G
Gerd Hoffmann 已提交
2286
    atexit(qemu_run_exit_notifiers);
2287 2288
    error_set_progname(argv[0]);

2289
    g_mem_set_vtable(&mem_trace);
2290
    g_thread_init(NULL);
2291

2292 2293
    runstate_init();

J
Jan Kiszka 已提交
2294 2295
    init_clocks();

M
malc 已提交
2296 2297
    qemu_cache_utils_init(envp);

B
Blue Swirl 已提交
2298
    QLIST_INIT (&vm_change_state_head);
2299
    os_setup_early_signal_handling();
2300

2301
    module_call_init(MODULE_INIT_MACHINE);
2302
    machine = find_default_machine();
2303
    cpu_model = NULL;
B
bellard 已提交
2304
    initrd_filename = NULL;
2305
    ram_size = 0;
2306
    snapshot = 0;
2307 2308
    kernel_filename = NULL;
    kernel_cmdline = "";
2309
    cyls = heads = secs = 0;
B
bellard 已提交
2310
    translation = BIOS_ATA_TRANSLATION_AUTO;
2311

2312 2313 2314 2315 2316 2317
    for (i = 0; i < MAX_NODES; i++) {
        node_mem[i] = 0;
        node_cpumask[i] = 0;
    }

    nb_numa_nodes = 0;
B
bellard 已提交
2318
    nb_nics = 0;
2319

2320 2321
    autostart= 1;

2322 2323 2324 2325 2326
    /* first pass of option parsing */
    optind = 1;
    while (optind < argc) {
        if (argv[optind][0] != '-') {
            /* disk image */
2327
            optind++;
2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341
            continue;
        } else {
            const QEMUOption *popt;

            popt = lookup_opt(argc, argv, &optarg, &optind);
            switch (popt->index) {
            case QEMU_OPTION_nodefconfig:
                defconfig=0;
                break;
            }
        }
    }

    if (defconfig) {
2342
        int ret;
2343

2344
        ret = qemu_read_config_file(CONFIG_QEMU_CONFDIR "/qemu.conf");
2345
        if (ret < 0 && ret != -ENOENT) {
2346
            exit(1);
2347 2348
        }

2349
        ret = qemu_read_config_file(arch_config_name);
2350
        if (ret < 0 && ret != -ENOENT) {
2351
            exit(1);
2352 2353
        }
    }
2354
    cpudef_init();
2355 2356

    /* second pass of option parsing */
2357
    optind = 1;
2358
    for(;;) {
2359
        if (optind >= argc)
2360
            break;
2361
        if (argv[optind][0] != '-') {
2362
	    hda_opts = drive_add(IF_DEFAULT, 0, argv[optind++], HD_OPTS);
2363 2364 2365
        } else {
            const QEMUOption *popt;

2366
            popt = lookup_opt(argc, argv, &optarg, &optind);
2367 2368 2369 2370
            if (!(popt->arch_mask & arch_type)) {
                printf("Option %s not supported for this target\n", popt->name);
                exit(1);
            }
2371
            switch(popt->index) {
2372
            case QEMU_OPTION_M:
2373
                machine = machine_parse(optarg);
2374
                break;
2375 2376
            case QEMU_OPTION_cpu:
                /* hw initialization will check this */
2377
                if (*optarg == '?') {
2378
                    list_cpus(stdout, &fprintf, optarg);
2379
                    exit(0);
2380 2381 2382 2383
                } else {
                    cpu_model = optarg;
                }
                break;
2384
            case QEMU_OPTION_initrd:
B
bellard 已提交
2385 2386
                initrd_filename = optarg;
                break;
2387
            case QEMU_OPTION_hda:
2388 2389 2390 2391 2392 2393 2394 2395 2396
                {
                    char buf[256];
                    if (cyls == 0)
                        snprintf(buf, sizeof(buf), "%s", HD_OPTS);
                    else
                        snprintf(buf, sizeof(buf),
                                 "%s,cyls=%d,heads=%d,secs=%d%s",
                                 HD_OPTS , cyls, heads, secs,
                                 translation == BIOS_ATA_TRANSLATION_LBA ?
T
ths 已提交
2397
                                 ",trans=lba" :
2398
                                 translation == BIOS_ATA_TRANSLATION_NONE ?
T
ths 已提交
2399
                                 ",trans=none" : "");
2400 2401 2402
                    drive_add(IF_DEFAULT, 0, optarg, buf);
                    break;
                }
2403
            case QEMU_OPTION_hdb:
2404 2405
            case QEMU_OPTION_hdc:
            case QEMU_OPTION_hdd:
2406 2407
                drive_add(IF_DEFAULT, popt->index - QEMU_OPTION_hda, optarg,
                          HD_OPTS);
B
bellard 已提交
2408
                break;
T
ths 已提交
2409
            case QEMU_OPTION_drive:
2410 2411 2412
                if (drive_def(optarg) == NULL) {
                    exit(1);
                }
T
ths 已提交
2413
	        break;
G
Gerd Hoffmann 已提交
2414 2415 2416 2417
            case QEMU_OPTION_set:
                if (qemu_set_option(optarg) != 0)
                    exit(1);
	        break;
2418 2419 2420 2421
            case QEMU_OPTION_global:
                if (qemu_global_option(optarg) != 0)
                    exit(1);
	        break;
2422
            case QEMU_OPTION_mtdblock:
2423
                drive_add(IF_MTD, -1, optarg, MTD_OPTS);
2424
                break;
2425
            case QEMU_OPTION_sd:
2426
                drive_add(IF_SD, 0, optarg, SD_OPTS);
2427
                break;
2428
            case QEMU_OPTION_pflash:
2429
                drive_add(IF_PFLASH, -1, optarg, PFLASH_OPTS);
2430
                break;
2431
            case QEMU_OPTION_snapshot:
2432 2433
                snapshot = 1;
                break;
2434
            case QEMU_OPTION_hdachs:
2435 2436 2437 2438
                {
                    const char *p;
                    p = optarg;
                    cyls = strtol(p, (char **)&p, 0);
B
bellard 已提交
2439 2440
                    if (cyls < 1 || cyls > 16383)
                        goto chs_fail;
2441 2442 2443 2444
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    heads = strtol(p, (char **)&p, 0);
B
bellard 已提交
2445 2446
                    if (heads < 1 || heads > 16)
                        goto chs_fail;
2447 2448 2449 2450
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    secs = strtol(p, (char **)&p, 0);
B
bellard 已提交
2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463
                    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') {
2464
                    chs_fail:
B
bellard 已提交
2465 2466
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
                        exit(1);
2467
                    }
G
Gerd Hoffmann 已提交
2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480
		    if (hda_opts != NULL) {
                        char num[16];
                        snprintf(num, sizeof(num), "%d", cyls);
                        qemu_opt_set(hda_opts, "cyls", num);
                        snprintf(num, sizeof(num), "%d", heads);
                        qemu_opt_set(hda_opts, "heads", num);
                        snprintf(num, sizeof(num), "%d", secs);
                        qemu_opt_set(hda_opts, "secs", num);
                        if (translation == BIOS_ATA_TRANSLATION_LBA)
                            qemu_opt_set(hda_opts, "trans", "lba");
                        if (translation == BIOS_ATA_TRANSLATION_NONE)
                            qemu_opt_set(hda_opts, "trans", "none");
                    }
2481 2482
                }
                break;
2483 2484 2485 2486 2487 2488 2489
            case QEMU_OPTION_numa:
                if (nb_numa_nodes >= MAX_NODES) {
                    fprintf(stderr, "qemu: too many NUMA nodes\n");
                    exit(1);
                }
                numa_add(optarg);
                break;
J
Jes Sorensen 已提交
2490 2491 2492
            case QEMU_OPTION_display:
                display_type = select_display(optarg);
                break;
2493
            case QEMU_OPTION_nographic:
2494
                display_type = DT_NOGRAPHIC;
2495
                break;
B
balrog 已提交
2496
            case QEMU_OPTION_curses:
2497
#ifdef CONFIG_CURSES
2498
                display_type = DT_CURSES;
2499 2500 2501
#else
                fprintf(stderr, "Curses support is disabled\n");
                exit(1);
B
balrog 已提交
2502
#endif
2503
                break;
2504
            case QEMU_OPTION_portrait:
2505 2506 2507 2508 2509 2510 2511 2512 2513 2514
                graphic_rotate = 90;
                break;
            case QEMU_OPTION_rotate:
                graphic_rotate = strtol(optarg, (char **) &optarg, 10);
                if (graphic_rotate != 0 && graphic_rotate != 90 &&
                    graphic_rotate != 180 && graphic_rotate != 270) {
                    fprintf(stderr,
                        "qemu: only 90, 180, 270 deg rotation is available\n");
                    exit(1);
                }
2515
                break;
2516
            case QEMU_OPTION_kernel:
2517 2518
                kernel_filename = optarg;
                break;
2519
            case QEMU_OPTION_append:
2520
                kernel_cmdline = optarg;
2521
                break;
2522
            case QEMU_OPTION_cdrom:
2523
                drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS);
2524
                break;
2525
            case QEMU_OPTION_boot:
2526
                {
J
Jan Kiszka 已提交
2527
                    static const char * const params[] = {
W
wayne 已提交
2528 2529
                        "order", "once", "menu",
                        "splash", "splash-time", NULL
J
Jan Kiszka 已提交
2530 2531
                    };
                    char buf[sizeof(boot_devices)];
J
Jan Kiszka 已提交
2532
                    char *standard_boot_devices;
J
Jan Kiszka 已提交
2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546
                    int legacy = 0;

                    if (!strchr(optarg, '=')) {
                        legacy = 1;
                        pstrcpy(buf, sizeof(buf), optarg);
                    } else if (check_params(buf, sizeof(buf), params, optarg) < 0) {
                        fprintf(stderr,
                                "qemu: unknown boot parameter '%s' in '%s'\n",
                                buf, optarg);
                        exit(1);
                    }

                    if (legacy ||
                        get_param_value(buf, sizeof(buf), "order", optarg)) {
2547
                        validate_bootdevices(buf);
J
Jan Kiszka 已提交
2548
                        pstrcpy(boot_devices, sizeof(boot_devices), buf);
2549
                    }
J
Jan Kiszka 已提交
2550 2551 2552
                    if (!legacy) {
                        if (get_param_value(buf, sizeof(buf),
                                            "once", optarg)) {
2553
                            validate_bootdevices(buf);
2554
                            standard_boot_devices = g_strdup(boot_devices);
J
Jan Kiszka 已提交
2555 2556 2557 2558
                            pstrcpy(boot_devices, sizeof(boot_devices), buf);
                            qemu_register_reset(restore_boot_devices,
                                                standard_boot_devices);
                        }
2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571
                        if (get_param_value(buf, sizeof(buf),
                                            "menu", optarg)) {
                            if (!strcmp(buf, "on")) {
                                boot_menu = 1;
                            } else if (!strcmp(buf, "off")) {
                                boot_menu = 0;
                            } else {
                                fprintf(stderr,
                                        "qemu: invalid option value '%s'\n",
                                        buf);
                                exit(1);
                            }
                        }
W
wayne 已提交
2572 2573
                        qemu_opts_parse(qemu_find_opts("boot-opts"),
                                        optarg, 0);
J
Jan Kiszka 已提交
2574
                    }
2575 2576
                }
                break;
2577 2578
            case QEMU_OPTION_fda:
            case QEMU_OPTION_fdb:
2579 2580
                drive_add(IF_FLOPPY, popt->index - QEMU_OPTION_fda,
                          optarg, FD_OPTS);
2581
                break;
B
bellard 已提交
2582 2583 2584
            case QEMU_OPTION_no_fd_bootchk:
                fd_bootchk = 0;
                break;
M
Mark McLoughlin 已提交
2585
            case QEMU_OPTION_netdev:
2586
                if (net_client_parse(qemu_find_opts("netdev"), optarg) == -1) {
M
Mark McLoughlin 已提交
2587 2588 2589
                    exit(1);
                }
                break;
B
bellard 已提交
2590
            case QEMU_OPTION_net:
2591
                if (net_client_parse(qemu_find_opts("net"), optarg) == -1) {
2592 2593
                    exit(1);
                }
B
bellard 已提交
2594
                break;
B
bellard 已提交
2595 2596
#ifdef CONFIG_SLIRP
            case QEMU_OPTION_tftp:
2597
                legacy_tftp_prefix = optarg;
B
bellard 已提交
2598
                break;
2599
            case QEMU_OPTION_bootp:
2600
                legacy_bootp_filename = optarg;
2601
                break;
B
bellard 已提交
2602
            case QEMU_OPTION_redir:
M
Markus Armbruster 已提交
2603 2604
                if (net_slirp_redir(optarg) < 0)
                    exit(1);
B
bellard 已提交
2605
                break;
B
bellard 已提交
2606
#endif
2607
            case QEMU_OPTION_bt:
2608
                add_device_config(DEV_BT, optarg);
2609
                break;
2610
            case QEMU_OPTION_audio_help:
2611 2612 2613 2614
                if (!(audio_available())) {
                    printf("Option %s not supported for this target\n", popt->name);
                    exit(1);
                }
2615 2616 2617 2618
                AUD_help ();
                exit (0);
                break;
            case QEMU_OPTION_soundhw:
2619 2620 2621 2622
                if (!(audio_available())) {
                    printf("Option %s not supported for this target\n", popt->name);
                    exit(1);
                }
2623 2624
                select_soundhw (optarg);
                break;
2625
            case QEMU_OPTION_h:
2626
                help(0);
2627
                break;
P
pbrook 已提交
2628 2629 2630 2631
            case QEMU_OPTION_version:
                version();
                exit(0);
                break;
2632
            case QEMU_OPTION_m: {
2633
                int64_t value;
2634 2635 2636

                value = strtosz(optarg, NULL);
                if (value < 0) {
2637
                    fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
2638 2639
                    exit(1);
                }
2640

A
Anthony Liguori 已提交
2641
                if (value != (uint64_t)(ram_addr_t)value) {
2642 2643 2644 2645
                    fprintf(stderr, "qemu: ram size too large\n");
                    exit(1);
                }
                ram_size = value;
2646
                break;
2647
            }
2648 2649 2650 2651 2652 2653 2654 2655
            case QEMU_OPTION_mempath:
                mem_path = optarg;
                break;
#ifdef MAP_POPULATE
            case QEMU_OPTION_mem_prealloc:
                mem_prealloc = 1;
                break;
#endif
2656
            case QEMU_OPTION_d:
2657 2658 2659 2660
                log_mask = optarg;
                break;
            case QEMU_OPTION_D:
                log_file = optarg;
2661 2662
                break;
            case QEMU_OPTION_s:
2663
                gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
2664
                break;
2665 2666
            case QEMU_OPTION_gdb:
                gdbstub_dev = optarg;
2667 2668
                break;
            case QEMU_OPTION_L:
P
Paul Brook 已提交
2669
                data_dir = optarg;
2670
                break;
2671 2672 2673
            case QEMU_OPTION_bios:
                bios_name = optarg;
                break;
2674 2675 2676
            case QEMU_OPTION_singlestep:
                singlestep = 1;
                break;
2677
            case QEMU_OPTION_S:
2678
                autostart = 0;
2679
                break;
2680 2681 2682
	    case QEMU_OPTION_k:
		keyboard_layout = optarg;
		break;
B
bellard 已提交
2683 2684 2685
            case QEMU_OPTION_localtime:
                rtc_utc = 0;
                break;
2686 2687
            case QEMU_OPTION_vga:
                select_vgahw (optarg);
2688
                break;
2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708
            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);
2709
                        if (depth != 8 && depth != 15 && depth != 16 &&
2710 2711 2712 2713 2714 2715 2716
                            depth != 24 && depth != 32)
                            goto graphic_error;
                    } else if (*p == '\0') {
                        depth = graphic_depth;
                    } else {
                        goto graphic_error;
                    }
2717

2718 2719 2720 2721 2722
                    graphic_width = w;
                    graphic_height = h;
                    graphic_depth = depth;
                }
                break;
T
ths 已提交
2723 2724 2725 2726 2727 2728 2729 2730
            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 已提交
2731
            case QEMU_OPTION_monitor:
G
Gerd Hoffmann 已提交
2732 2733 2734 2735 2736
                monitor_parse(optarg, "readline");
                default_monitor = 0;
                break;
            case QEMU_OPTION_qmp:
                monitor_parse(optarg, "control");
2737
                default_monitor = 0;
B
bellard 已提交
2738
                break;
G
Gerd Hoffmann 已提交
2739
            case QEMU_OPTION_mon:
2740
                opts = qemu_opts_parse(qemu_find_opts("mon"), optarg, 1);
G
Gerd Hoffmann 已提交
2741 2742 2743
                if (!opts) {
                    exit(1);
                }
2744
                default_monitor = 0;
G
Gerd Hoffmann 已提交
2745
                break;
2746
            case QEMU_OPTION_chardev:
2747
                opts = qemu_opts_parse(qemu_find_opts("chardev"), optarg, 1);
2748 2749 2750 2751
                if (!opts) {
                    exit(1);
                }
                break;
2752
            case QEMU_OPTION_fsdev:
2753 2754 2755 2756 2757 2758
                olist = qemu_find_opts("fsdev");
                if (!olist) {
                    fprintf(stderr, "fsdev is not supported by this qemu build.\n");
                    exit(1);
                }
                opts = qemu_opts_parse(olist, optarg, 1);
2759 2760 2761 2762 2763
                if (!opts) {
                    fprintf(stderr, "parse error: %s\n", optarg);
                    exit(1);
                }
                break;
2764
            case QEMU_OPTION_virtfs: {
2765 2766
                QemuOpts *fsdev;
                QemuOpts *device;
2767

2768 2769 2770 2771 2772 2773
                olist = qemu_find_opts("virtfs");
                if (!olist) {
                    fprintf(stderr, "virtfs is not supported by this qemu build.\n");
                    exit(1);
                }
                opts = qemu_opts_parse(olist, optarg, 1);
2774 2775 2776 2777 2778
                if (!opts) {
                    fprintf(stderr, "parse error: %s\n", optarg);
                    exit(1);
                }

2779 2780 2781 2782 2783
                if (qemu_opt_get(opts, "fstype") == NULL ||
                        qemu_opt_get(opts, "mount_tag") == NULL ||
                        qemu_opt_get(opts, "path") == NULL ||
                        qemu_opt_get(opts, "security_model") == NULL) {
                    fprintf(stderr, "Usage: -virtfs fstype,path=/share_path/,"
2784
                            "security_model=[mapped|passthrough|none],"
2785
                            "mount_tag=tag.\n");
2786 2787 2788
                    exit(1);
                }

2789 2790 2791 2792 2793
                fsdev = qemu_opts_create(qemu_find_opts("fsdev"),
                                         qemu_opt_get(opts, "mount_tag"), 1);
                if (!fsdev) {
                    fprintf(stderr, "duplicate fsdev id: %s\n",
                            qemu_opt_get(opts, "mount_tag"));
2794 2795
                    exit(1);
                }
2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806
                qemu_opt_set(fsdev, "fstype", qemu_opt_get(opts, "fstype"));
                qemu_opt_set(fsdev, "path", qemu_opt_get(opts, "path"));
                qemu_opt_set(fsdev, "security_model",
                             qemu_opt_get(opts, "security_model"));

                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0);
                qemu_opt_set(device, "driver", "virtio-9p-pci");
                qemu_opt_set(device, "fsdev",
                             qemu_opt_get(opts, "mount_tag"));
                qemu_opt_set(device, "mount_tag",
                             qemu_opt_get(opts, "mount_tag"));
2807 2808
                break;
            }
B
bellard 已提交
2809
            case QEMU_OPTION_serial:
2810 2811
                add_device_config(DEV_SERIAL, optarg);
                default_serial = 0;
2812 2813 2814
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
B
bellard 已提交
2815
                break;
R
Richard W.M. Jones 已提交
2816
            case QEMU_OPTION_watchdog:
M
Markus Armbruster 已提交
2817 2818 2819 2820 2821 2822
                if (watchdog) {
                    fprintf(stderr,
                            "qemu: only one watchdog option may be given\n");
                    return 1;
                }
                watchdog = optarg;
R
Richard W.M. Jones 已提交
2823 2824 2825 2826 2827 2828 2829
                break;
            case QEMU_OPTION_watchdog_action:
                if (select_watchdog_action(optarg) == -1) {
                    fprintf(stderr, "Unknown -watchdog-action parameter\n");
                    exit(1);
                }
                break;
2830
            case QEMU_OPTION_virtiocon:
G
Gerd Hoffmann 已提交
2831 2832
                add_device_config(DEV_VIRTCON, optarg);
                default_virtcon = 0;
2833 2834 2835
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
2836
                break;
2837
            case QEMU_OPTION_parallel:
G
Gerd Hoffmann 已提交
2838 2839
                add_device_config(DEV_PARALLEL, optarg);
                default_parallel = 0;
2840 2841 2842
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
2843
                break;
2844 2845 2846
            case QEMU_OPTION_debugcon:
                add_device_config(DEV_DEBUGCON, optarg);
                break;
B
bellard 已提交
2847 2848 2849 2850 2851 2852
	    case QEMU_OPTION_loadvm:
		loadvm = optarg;
		break;
            case QEMU_OPTION_full_screen:
                full_screen = 1;
                break;
T
ths 已提交
2853
#ifdef CONFIG_SDL
2854 2855 2856
            case QEMU_OPTION_no_frame:
                no_frame = 1;
                break;
T
ths 已提交
2857 2858 2859
            case QEMU_OPTION_alt_grab:
                alt_grab = 1;
                break;
2860 2861 2862
            case QEMU_OPTION_ctrl_grab:
                ctrl_grab = 1;
                break;
T
ths 已提交
2863 2864 2865
            case QEMU_OPTION_no_quit:
                no_quit = 1;
                break;
2866
            case QEMU_OPTION_sdl:
2867
                display_type = DT_SDL;
2868
                break;
2869 2870 2871 2872 2873 2874 2875 2876
#else
            case QEMU_OPTION_no_frame:
            case QEMU_OPTION_alt_grab:
            case QEMU_OPTION_ctrl_grab:
            case QEMU_OPTION_no_quit:
            case QEMU_OPTION_sdl:
                fprintf(stderr, "SDL support is disabled\n");
                exit(1);
T
ths 已提交
2877
#endif
B
bellard 已提交
2878
            case QEMU_OPTION_pidfile:
2879
                pid_file = optarg;
B
bellard 已提交
2880
                break;
2881 2882 2883
            case QEMU_OPTION_win2k_hack:
                win2k_install_hack = 1;
                break;
2884 2885 2886
            case QEMU_OPTION_rtc_td_hack:
                rtc_td_hack = 1;
                break;
2887
            case QEMU_OPTION_acpitable:
2888
                do_acpitable_option(optarg);
2889
                break;
2890
            case QEMU_OPTION_smbios:
2891
                do_smbios_option(optarg);
2892
                break;
A
aliguori 已提交
2893
            case QEMU_OPTION_enable_kvm:
2894 2895 2896 2897 2898 2899 2900
                olist = qemu_find_opts("machine");
                qemu_opts_reset(olist);
                qemu_opts_parse(olist, "accel=kvm", 0);
                break;
            case QEMU_OPTION_machine:
                olist = qemu_find_opts("machine");
                qemu_opts_reset(olist);
2901
                opts = qemu_opts_parse(olist, optarg, 1);
2902 2903 2904 2905
                if (!opts) {
                    fprintf(stderr, "parse error: %s\n", optarg);
                    exit(1);
                }
2906 2907 2908 2909
                optarg = qemu_opt_get(opts, "type");
                if (optarg) {
                    machine = machine_parse(optarg);
                }
A
aliguori 已提交
2910
                break;
B
bellard 已提交
2911 2912 2913
            case QEMU_OPTION_usb:
                usb_enabled = 1;
                break;
B
bellard 已提交
2914 2915
            case QEMU_OPTION_usbdevice:
                usb_enabled = 1;
2916 2917 2918
                add_device_config(DEV_USB, optarg);
                break;
            case QEMU_OPTION_device:
2919
                if (!qemu_opts_parse(qemu_find_opts("device"), optarg, 1)) {
G
Gerd Hoffmann 已提交
2920 2921
                    exit(1);
                }
B
bellard 已提交
2922
                break;
B
bellard 已提交
2923
            case QEMU_OPTION_smp:
2924
                smp_parse(optarg);
2925
                if (smp_cpus < 1) {
B
bellard 已提交
2926 2927 2928
                    fprintf(stderr, "Invalid number of CPUs\n");
                    exit(1);
                }
2929 2930 2931 2932 2933 2934 2935 2936 2937
                if (max_cpus < smp_cpus) {
                    fprintf(stderr, "maxcpus must be equal to or greater than "
                            "smp\n");
                    exit(1);
                }
                if (max_cpus > 255) {
                    fprintf(stderr, "Unsupported number of maxcpus\n");
                    exit(1);
                }
B
bellard 已提交
2938
                break;
B
bellard 已提交
2939
	    case QEMU_OPTION_vnc:
J
Jes Sorensen 已提交
2940
#ifdef CONFIG_VNC
2941
                display_remote++;
J
Jes Sorensen 已提交
2942 2943 2944 2945 2946 2947
                vnc_display = optarg;
#else
                fprintf(stderr, "VNC support is disabled\n");
                exit(1);
#endif
                break;
B
bellard 已提交
2948 2949 2950
            case QEMU_OPTION_no_acpi:
                acpi_enabled = 0;
                break;
A
aliguori 已提交
2951 2952 2953
            case QEMU_OPTION_no_hpet:
                no_hpet = 1;
                break;
2954 2955 2956 2957 2958
            case QEMU_OPTION_balloon:
                if (balloon_parse(optarg) < 0) {
                    fprintf(stderr, "Unknown -balloon argument %s\n", optarg);
                    exit(1);
                }
2959
                break;
B
bellard 已提交
2960 2961 2962
            case QEMU_OPTION_no_reboot:
                no_reboot = 1;
                break;
A
aurel32 已提交
2963 2964 2965
            case QEMU_OPTION_no_shutdown:
                no_shutdown = 1;
                break;
2966 2967 2968
            case QEMU_OPTION_show_cursor:
                cursor_hide = 0;
                break;
2969 2970 2971 2972 2973 2974 2975
            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;
2976 2977 2978 2979 2980
	    case QEMU_OPTION_option_rom:
		if (nb_option_roms >= MAX_OPTION_ROMS) {
		    fprintf(stderr, "Too many option ROMs\n");
		    exit(1);
		}
G
Gleb Natapov 已提交
2981 2982 2983 2984 2985 2986 2987 2988
                opts = qemu_opts_parse(qemu_find_opts("option-rom"), optarg, 1);
                option_rom[nb_option_roms].name = qemu_opt_get(opts, "romfile");
                option_rom[nb_option_roms].bootindex =
                    qemu_opt_get_number(opts, "bootindex", -1);
                if (!option_rom[nb_option_roms].name) {
                    fprintf(stderr, "Option ROM file is not specified\n");
                    exit(1);
                }
2989 2990
		nb_option_roms++;
		break;
2991 2992 2993
            case QEMU_OPTION_semihosting:
                semihosting_enabled = 1;
                break;
T
ths 已提交
2994
            case QEMU_OPTION_name:
2995
                qemu_name = g_strdup(optarg);
A
Andi Kleen 已提交
2996 2997 2998 2999 3000
		 {
		     char *p = strchr(qemu_name, ',');
		     if (p != NULL) {
		        *p++ = 0;
			if (strncmp(p, "process=", 8)) {
A
Aurelien Jarno 已提交
3001
			    fprintf(stderr, "Unknown subargument %s to -name\n", p);
A
Andi Kleen 已提交
3002 3003 3004
			    exit(1);
			}
			p += 8;
3005
			os_set_proc_name(p);
A
Andi Kleen 已提交
3006 3007
		     }	
		 }	
T
ths 已提交
3008
                break;
B
blueswir1 已提交
3009 3010 3011 3012 3013 3014 3015 3016
            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;
3017 3018
            case QEMU_OPTION_old_param:
                old_param = 1;
3019
                break;
3020 3021 3022
            case QEMU_OPTION_clock:
                configure_alarms(optarg);
                break;
B
bellard 已提交
3023
            case QEMU_OPTION_startdate:
J
Jan Kiszka 已提交
3024 3025 3026
                configure_rtc_date_offset(optarg, 1);
                break;
            case QEMU_OPTION_rtc:
3027
                opts = qemu_opts_parse(qemu_find_opts("rtc"), optarg, 0);
J
Jan Kiszka 已提交
3028 3029
                if (!opts) {
                    exit(1);
B
bellard 已提交
3030
                }
J
Jan Kiszka 已提交
3031
                configure_rtc(opts);
B
bellard 已提交
3032
                break;
3033
            case QEMU_OPTION_tb_size:
3034 3035 3036 3037
                tcg_tb_size = strtol(optarg, NULL, 0);
                if (tcg_tb_size < 0) {
                    tcg_tb_size = 0;
                }
3038
                break;
P
pbrook 已提交
3039
            case QEMU_OPTION_icount:
P
Paolo Bonzini 已提交
3040
                icount_option = optarg;
P
pbrook 已提交
3041
                break;
A
aliguori 已提交
3042 3043
            case QEMU_OPTION_incoming:
                incoming = optarg;
3044
                incoming_expected = true;
A
aliguori 已提交
3045
                break;
3046 3047 3048
            case QEMU_OPTION_nodefaults:
                default_serial = 0;
                default_parallel = 0;
G
Gerd Hoffmann 已提交
3049
                default_virtcon = 0;
3050 3051
                default_monitor = 0;
                default_vga = 0;
G
Gerd Hoffmann 已提交
3052
                default_net = 0;
G
Gerd Hoffmann 已提交
3053 3054 3055
                default_floppy = 0;
                default_cdrom = 0;
                default_sdcard = 0;
3056
                break;
3057
            case QEMU_OPTION_xen_domid:
3058 3059 3060 3061
                if (!(xen_available())) {
                    printf("Option %s not supported for this target\n", popt->name);
                    exit(1);
                }
3062 3063 3064
                xen_domid = atoi(optarg);
                break;
            case QEMU_OPTION_xen_create:
3065 3066 3067 3068
                if (!(xen_available())) {
                    printf("Option %s not supported for this target\n", popt->name);
                    exit(1);
                }
3069 3070 3071
                xen_mode = XEN_CREATE;
                break;
            case QEMU_OPTION_xen_attach:
3072 3073 3074 3075
                if (!(xen_available())) {
                    printf("Option %s not supported for this target\n", popt->name);
                    exit(1);
                }
3076 3077
                xen_mode = XEN_ATTACH;
                break;
3078
            case QEMU_OPTION_trace:
3079
            {
3080
                opts = qemu_opts_parse(qemu_find_opts("trace"), optarg, 0);
3081 3082
                if (!opts) {
                    exit(1);
3083
                }
3084
                trace_events = qemu_opt_get(opts, "events");
3085
                trace_file = qemu_opt_get(opts, "file");
3086
                break;
3087
            }
3088 3089
            case QEMU_OPTION_readconfig:
                {
3090 3091 3092 3093
                    int ret = qemu_read_config_file(optarg);
                    if (ret < 0) {
                        fprintf(stderr, "read config %s: %s\n", optarg,
                            strerror(-ret));
3094 3095 3096 3097
                        exit(1);
                    }
                    break;
                }
G
Gerd Hoffmann 已提交
3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109
            case QEMU_OPTION_spice:
                olist = qemu_find_opts("spice");
                if (!olist) {
                    fprintf(stderr, "spice is not supported by this qemu build.\n");
                    exit(1);
                }
                opts = qemu_opts_parse(olist, optarg, 0);
                if (!opts) {
                    fprintf(stderr, "parse error: %s\n", optarg);
                    exit(1);
                }
                break;
3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125
            case QEMU_OPTION_writeconfig:
                {
                    FILE *fp;
                    if (strcmp(optarg, "-") == 0) {
                        fp = stdout;
                    } else {
                        fp = fopen(optarg, "w");
                        if (fp == NULL) {
                            fprintf(stderr, "open %s: %s\n", optarg, strerror(errno));
                            exit(1);
                        }
                    }
                    qemu_config_write(fp);
                    fclose(fp);
                    break;
                }
3126 3127
            default:
                os_parse_cmd_args(popt->index, optarg);
3128
            }
3129 3130
        }
    }
3131
    loc_set_none();
3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143

    /* Open the logfile at this point, if necessary. We can't open the logfile
     * when encountering either of the logging options (-d or -D) because the
     * other one may be encountered later on the command line, changing the
     * location or level of logging.
     */
    if (log_mask) {
        if (log_file) {
            set_cpu_log_filename(log_file);
        }
        set_cpu_log(log_mask);
    }
3144

3145
    if (!trace_backend_init(trace_events, trace_file)) {
3146
        exit(1);
3147
    }
3148

P
Paul Brook 已提交
3149 3150 3151
    /* If no data_dir is specified then try to find it relative to the
       executable path.  */
    if (!data_dir) {
3152
        data_dir = os_find_datadir(argv[0]);
P
Paul Brook 已提交
3153
    }
3154
    /* If all else fails use the install path specified when building. */
P
Paul Brook 已提交
3155
    if (!data_dir) {
3156
        data_dir = CONFIG_QEMU_DATADIR;
P
Paul Brook 已提交
3157 3158
    }

3159 3160 3161 3162 3163 3164 3165
    /*
     * Default to max_cpus = smp_cpus, in case the user doesn't
     * specify a max_cpus value.
     */
    if (!max_cpus)
        max_cpus = smp_cpus;

B
balrog 已提交
3166
    machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
3167 3168 3169 3170 3171 3172 3173
    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);
    }

3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185
    /*
     * Get the default machine options from the machine if it is not already
     * specified either by the configuration file or by the command line.
     */
    if (machine->default_machine_opts) {
        QemuOptsList *list = qemu_find_opts("machine");
        const char *p = NULL;

        if (!QTAILQ_EMPTY(&list->head)) {
            p = qemu_opt_get(QTAILQ_FIRST(&list->head), "accel");
        }
        if (p == NULL) {
3186 3187
            qemu_opts_reset(list);
            opts = qemu_opts_parse(list, machine->default_machine_opts, 0);
3188 3189 3190 3191 3192 3193 3194 3195
            if (!opts) {
                fprintf(stderr, "parse error for machine %s: %s\n",
                        machine->name, machine->default_machine_opts);
                exit(1);
            }
        }
    }

3196 3197
    qemu_opts_foreach(qemu_find_opts("device"), default_driver_check, NULL, 0);
    qemu_opts_foreach(qemu_find_opts("global"), default_driver_check, NULL, 0);
3198

3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210
    if (machine->no_serial) {
        default_serial = 0;
    }
    if (machine->no_parallel) {
        default_parallel = 0;
    }
    if (!machine->use_virtcon) {
        default_virtcon = 0;
    }
    if (machine->no_vga) {
        default_vga = 0;
    }
G
Gerd Hoffmann 已提交
3211 3212 3213 3214 3215 3216 3217 3218 3219
    if (machine->no_floppy) {
        default_floppy = 0;
    }
    if (machine->no_cdrom) {
        default_cdrom = 0;
    }
    if (machine->no_sdcard) {
        default_sdcard = 0;
    }
3220

3221
    if (display_type == DT_NOGRAPHIC) {
G
Gerd Hoffmann 已提交
3222 3223
        if (default_parallel)
            add_device_config(DEV_PARALLEL, "null");
G
Gerd Hoffmann 已提交
3224 3225
        if (default_serial && default_monitor) {
            add_device_config(DEV_SERIAL, "mon:stdio");
3226 3227
        } else if (default_virtcon && default_monitor) {
            add_device_config(DEV_VIRTCON, "mon:stdio");
G
Gerd Hoffmann 已提交
3228 3229 3230
        } else {
            if (default_serial)
                add_device_config(DEV_SERIAL, "stdio");
3231 3232
            if (default_virtcon)
                add_device_config(DEV_VIRTCON, "stdio");
G
Gerd Hoffmann 已提交
3233
            if (default_monitor)
G
Gerd Hoffmann 已提交
3234
                monitor_parse("stdio", "readline");
G
Gerd Hoffmann 已提交
3235
        }
3236 3237 3238
    } else {
        if (default_serial)
            add_device_config(DEV_SERIAL, "vc:80Cx24C");
G
Gerd Hoffmann 已提交
3239 3240
        if (default_parallel)
            add_device_config(DEV_PARALLEL, "vc:80Cx24C");
G
Gerd Hoffmann 已提交
3241
        if (default_monitor)
G
Gerd Hoffmann 已提交
3242
            monitor_parse("vc:80Cx24C", "readline");
3243 3244
        if (default_virtcon)
            add_device_config(DEV_VIRTCON, "vc:80Cx24C");
3245
    }
G
Gerd Hoffmann 已提交
3246 3247
    if (default_vga)
        vga_interface_type = VGA_CIRRUS;
3248

T
TeLeMan 已提交
3249 3250
    socket_init();

3251
    if (qemu_opts_foreach(qemu_find_opts("chardev"), chardev_init_func, NULL, 1) != 0)
3252
        exit(1);
3253
#ifdef CONFIG_VIRTFS
3254
    if (qemu_opts_foreach(qemu_find_opts("fsdev"), fsdev_init_func, NULL, 1) != 0) {
3255 3256 3257
        exit(1);
    }
#endif
3258

3259
    os_daemonize();
T
ths 已提交
3260

3261
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
3262
        os_pidfile_error();
3263 3264 3265
        exit(1);
    }

3266 3267 3268 3269 3270
    /* init the memory */
    if (ram_size == 0) {
        ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
    }

3271
    configure_accelerator();
M
Marcelo Tosatti 已提交
3272

3273 3274 3275 3276
    if (qemu_init_main_loop()) {
        fprintf(stderr, "qemu_init_main_loop failed\n");
        exit(1);
    }
3277
    linux_boot = (kernel_filename != NULL);
B
balrog 已提交
3278

3279 3280 3281 3282 3283 3284 3285 3286 3287 3288
    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);
    }

3289
    os_set_line_buffering();
3290

3291 3292 3293 3294
    if (init_timer_alarm() < 0) {
        fprintf(stderr, "could not initialize alarm timer\n");
        exit(1);
    }
P
Paolo Bonzini 已提交
3295
    configure_icount(icount_option);
3296

3297 3298
    if (net_init_clients() < 0) {
        exit(1);
B
bellard 已提交
3299
    }
B
bellard 已提交
3300

3301
    /* init the bluetooth world */
3302 3303
    if (foreach_device_config(DEV_BT, bt_parse))
        exit(1);
3304

3305 3306 3307 3308 3309 3310 3311
    if (!xen_enabled()) {
        /* On 32-bit hosts, QEMU is limited by virtual address space */
        if (ram_size > (2047 << 20) && HOST_LONG_BITS == 32) {
            fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
            exit(1);
        }
    }
3312

3313
    cpu_exec_init_all();
3314

3315
    bdrv_init_with_whitelist();
3316

L
lirans@il.ibm.com 已提交
3317 3318
    blk_mig_init();

T
ths 已提交
3319
    /* open the virtual block devices */
G
Gerd Hoffmann 已提交
3320
    if (snapshot)
3321 3322
        qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0);
    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, &machine->use_scsi, 1) != 0)
G
Gerd Hoffmann 已提交
3323
        exit(1);
3324

3325 3326 3327 3328 3329 3330 3331
    default_drive(default_cdrom, snapshot, machine->use_scsi,
                  IF_DEFAULT, 2, CDROM_OPTS);
    default_drive(default_floppy, snapshot, machine->use_scsi,
                  IF_FLOPPY, 0, FD_OPTS);
    default_drive(default_sdcard, snapshot, machine->use_scsi,
                  IF_SD, 0, SD_OPTS);

3332
    register_savevm_live(NULL, "ram", 0, 4, NULL, ram_save_live, NULL,
L
lirans@il.ibm.com 已提交
3333
                         ram_load, NULL);
3334

3335 3336 3337
    if (nb_numa_nodes > 0) {
        int i;

3338 3339
        if (nb_numa_nodes > MAX_NODES) {
            nb_numa_nodes = MAX_NODES;
3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376
        }

        /* If no memory size if given for any node, assume the default case
         * and distribute the available memory equally across all nodes
         */
        for (i = 0; i < nb_numa_nodes; i++) {
            if (node_mem[i] != 0)
                break;
        }
        if (i == nb_numa_nodes) {
            uint64_t usedmem = 0;

            /* On Linux, the each node's border has to be 8MB aligned,
             * the final node gets the rest.
             */
            for (i = 0; i < nb_numa_nodes - 1; i++) {
                node_mem[i] = (ram_size / nb_numa_nodes) & ~((1 << 23UL) - 1);
                usedmem += node_mem[i];
            }
            node_mem[i] = ram_size - usedmem;
        }

        for (i = 0; i < nb_numa_nodes; i++) {
            if (node_cpumask[i] != 0)
                break;
        }
        /* assigning the VCPUs round-robin is easier to implement, guest OSes
         * must cope with this anyway, because there are BIOSes out there in
         * real machines which also use this scheme.
         */
        if (i == nb_numa_nodes) {
            for (i = 0; i < smp_cpus; i++) {
                node_cpumask[i % nb_numa_nodes] |= 1 << i;
            }
        }
    }

3377
    if (qemu_opts_foreach(qemu_find_opts("mon"), mon_init_func, NULL, 1) != 0) {
3378 3379 3380
        exit(1);
    }

3381 3382
    if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
        exit(1);
G
Gerd Hoffmann 已提交
3383 3384
    if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
        exit(1);
G
Gerd Hoffmann 已提交
3385 3386
    if (foreach_device_config(DEV_VIRTCON, virtcon_parse) < 0)
        exit(1);
3387 3388
    if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)
        exit(1);
3389

P
Paul Brook 已提交
3390 3391
    module_call_init(MODULE_INIT_DEVICE);

3392
    if (qemu_opts_foreach(qemu_find_opts("device"), device_help_func, NULL, 0) != 0)
3393 3394
        exit(0);

M
Markus Armbruster 已提交
3395 3396 3397 3398 3399 3400
    if (watchdog) {
        i = select_watchdog(watchdog);
        if (i > 0)
            exit (i == 1 ? 1 : 0);
    }

3401
    if (machine->compat_props) {
3402
        qdev_prop_register_global_list(machine->compat_props);
3403
    }
3404 3405
    qemu_add_globals();

P
Paul Brook 已提交
3406
    machine->init(ram_size, boot_devices,
3407 3408
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);

3409
    cpu_synchronize_all_post_init();
3410

B
Blue Swirl 已提交
3411
    set_numa_modes();
3412

3413 3414
    current_machine = machine;

3415 3416
    /* init USB devices */
    if (usb_enabled) {
M
Markus Armbruster 已提交
3417 3418
        if (foreach_device_config(DEV_USB, usb_parse) < 0)
            exit(1);
3419 3420
    }

3421
    /* init generic devices */
3422
    if (qemu_opts_foreach(qemu_find_opts("device"), device_init_func, NULL, 1) != 0)
3423 3424
        exit(1);

3425 3426
    net_check_clients();

3427
    /* just use the first displaystate for the moment */
3428
    ds = get_displaystate();
3429

G
Gerd Hoffmann 已提交
3430 3431
    if (using_spice)
        display_remote++;
3432
    if (display_type == DT_DEFAULT && !display_remote) {
3433 3434
#if defined(CONFIG_SDL) || defined(CONFIG_COCOA)
        display_type = DT_SDL;
J
Jes Sorensen 已提交
3435
#elif defined(CONFIG_VNC)
3436 3437
        vnc_display = "localhost:0,to=99";
        show_vnc_port = 1;
J
Jes Sorensen 已提交
3438 3439
#else
        display_type = DT_NONE;
3440 3441
#endif
    }
J
Jes Sorensen 已提交
3442

3443

3444
    /* init local displays */
3445 3446 3447
    switch (display_type) {
    case DT_NOGRAPHIC:
        break;
B
balrog 已提交
3448
#if defined(CONFIG_CURSES)
3449 3450 3451
    case DT_CURSES:
        curses_display_init(ds, full_screen);
        break;
B
balrog 已提交
3452
#endif
3453
#if defined(CONFIG_SDL)
3454 3455 3456
    case DT_SDL:
        sdl_display_init(ds, full_screen, no_frame);
        break;
3457
#elif defined(CONFIG_COCOA)
3458 3459 3460
    case DT_SDL:
        cocoa_display_init(ds, full_screen);
        break;
3461
#endif
3462 3463 3464 3465
    default:
        break;
    }

3466 3467 3468
    /* must be after terminal init, SDL library changes signal handlers */
    os_setup_signal_handling();

J
Jes Sorensen 已提交
3469
#ifdef CONFIG_VNC
3470 3471
    /* init remote displays */
    if (vnc_display) {
3472 3473 3474
        vnc_display_init(ds);
        if (vnc_display_open(ds, vnc_display) < 0)
            exit(1);
3475

3476 3477
        if (show_vnc_port) {
            printf("VNC server running on `%s'\n", vnc_display_local_addr(ds));
3478
        }
3479
    }
J
Jes Sorensen 已提交
3480
#endif
G
Gerd Hoffmann 已提交
3481
#ifdef CONFIG_SPICE
G
Gerd Hoffmann 已提交
3482
    if (using_spice && !qxl_enabled) {
G
Gerd Hoffmann 已提交
3483 3484 3485
        qemu_spice_display_init(ds);
    }
#endif
3486

3487 3488
    /* display setup */
    dpy_resize(ds);
3489 3490 3491
    dcl = ds->listeners;
    while (dcl != NULL) {
        if (dcl->dpy_refresh != NULL) {
3492 3493
            ds->gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds);
            qemu_mod_timer(ds->gui_timer, qemu_get_clock_ms(rt_clock));
3494
            break;
T
ths 已提交
3495
        }
3496
        dcl = dcl->next;
T
ths 已提交
3497
    }
3498
    if (ds->gui_timer == NULL) {
3499 3500
        nographic_timer = qemu_new_timer_ms(rt_clock, nographic_update, NULL);
        qemu_mod_timer(nographic_timer, qemu_get_clock_ms(rt_clock));
B
blueswir1 已提交
3501
    }
3502
    text_consoles_set_display(ds);
3503

3504 3505 3506 3507
    if (gdbstub_dev && gdbserver_start(gdbstub_dev) < 0) {
        fprintf(stderr, "qemu: could not open gdbserver on device '%s'\n",
                gdbstub_dev);
        exit(1);
3508 3509
    }

3510 3511
    qdev_machine_creation_done();

G
Gerd Hoffmann 已提交
3512 3513 3514 3515
    if (rom_load_all() != 0) {
        fprintf(stderr, "rom loading failed\n");
        exit(1);
    }
3516

3517 3518 3519
    /* TODO: once all bus devices are qdevified, this should be done
     * when bus is created by qdev.c */
    qemu_register_reset(qbus_reset_all_fn, sysbus_get_default());
3520 3521
    qemu_run_machine_init_done_notifiers();

J
Jan Kiszka 已提交
3522
    qemu_system_reset(VMRESET_SILENT);
3523
    if (loadvm) {
3524
        if (load_vmstate(loadvm) < 0) {
3525 3526 3527
            autostart = 0;
        }
    }
B
bellard 已提交
3528

G
Glauber Costa 已提交
3529
    if (incoming) {
3530
        runstate_set(RSTATE_IN_MIGRATE);
J
Juan Quintela 已提交
3531 3532 3533 3534 3535 3536
        int ret = qemu_start_incoming_migration(incoming);
        if (ret < 0) {
            fprintf(stderr, "Migration failed. Exit code %s(%d), exiting.\n",
                    incoming, ret);
            exit(ret);
        }
3537
    } else if (autostart) {
3538
        vm_start();
3539 3540
    } else {
        runstate_set(RSTATE_PRE_LAUNCH);
3541
    }
3542

3543
    os_setup_post();
T
ths 已提交
3544

3545
    main_loop();
B
bellard 已提交
3546
    quit_timers();
3547
    net_cleanup();
W
wayne 已提交
3548
    res_free();
T
ths 已提交
3549

3550 3551
    return 0;
}