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

30
#ifdef CONFIG_SECCOMP
31
#include "sysemu/seccomp.h"
32 33
#endif

34 35 36 37
#if defined(CONFIG_VDE)
#include <libvdeplug.h>
#endif

B
bellard 已提交
38
#ifdef CONFIG_SDL
S
Stefan Weil 已提交
39
#if defined(__APPLE__) || defined(main)
S
Stefan Weil 已提交
40
#include <SDL.h>
M
malc 已提交
41 42 43
int qemu_main(int argc, char **argv, char **envp);
int main(int argc, char **argv)
{
S
Stefan Weil 已提交
44
    return qemu_main(argc, argv, NULL);
M
malc 已提交
45 46 47
}
#undef main
#define main qemu_main
B
bellard 已提交
48
#endif
B
bellard 已提交
49
#endif /* CONFIG_SDL */
50

51 52 53 54 55
#ifdef CONFIG_COCOA
#undef main
#define main qemu_main
#endif /* CONFIG_COCOA */

A
Anthony Liguori 已提交
56

57
#include "qemu/error-report.h"
58
#include "qemu/sockets.h"
59 60
#include "hw/hw.h"
#include "hw/boards.h"
61
#include "sysemu/accel.h"
62
#include "hw/usb.h"
P
Paolo Bonzini 已提交
63 64
#include "hw/i386/pc.h"
#include "hw/isa/isa.h"
65
#include "hw/scsi/scsi.h"
66
#include "hw/bt.h"
P
Paolo Bonzini 已提交
67
#include "sysemu/watchdog.h"
68
#include "hw/smbios/smbios.h"
69
#include "hw/acpi/acpi.h"
P
Paolo Bonzini 已提交
70
#include "hw/xen/xen.h"
71
#include "hw/qdev.h"
72
#include "hw/loader.h"
73
#include "monitor/qdev.h"
74
#include "sysemu/bt.h"
P
Paolo Bonzini 已提交
75
#include "net/net.h"
76
#include "net/slirp.h"
77
#include "monitor/monitor.h"
78
#include "ui/console.h"
G
Gerd Hoffmann 已提交
79
#include "ui/input.h"
80
#include "sysemu/sysemu.h"
81
#include "sysemu/numa.h"
82
#include "exec/gdbstub.h"
83
#include "qemu/timer.h"
84
#include "sysemu/char.h"
M
Michael Tokarev 已提交
85
#include "qemu/bitmap.h"
86
#include "qemu/log.h"
87
#include "sysemu/blockdev.h"
P
Paolo Bonzini 已提交
88
#include "hw/block/block.h"
89
#include "migration/block.h"
90
#include "sysemu/tpm.h"
91
#include "sysemu/dma.h"
92
#include "audio/audio.h"
93
#include "migration/migration.h"
94
#include "sysemu/cpus.h"
95
#include "migration/colo.h"
96
#include "sysemu/kvm.h"
97
#include "sysemu/hax.h"
98 99 100
#include "qapi/qobject-input-visitor.h"
#include "qapi/qobject-input-visitor.h"
#include "qapi-visit.h"
101
#include "qapi/qmp/qjson.h"
102 103
#include "qemu/option.h"
#include "qemu/config-file.h"
104
#include "qemu-options.h"
L
Luiz Capitulino 已提交
105
#include "qmp-commands.h"
106
#include "qemu/main-loop.h"
107
#ifdef CONFIG_VIRTFS
108 109
#include "fsdev/qemu-fsdev.h"
#endif
110
#include "sysemu/qtest.h"
111

112
#include "disas/disas.h"
B
bellard 已提交
113

114

J
Jan Kiszka 已提交
115
#include "slirp/libslirp.h"
116

117
#include "trace-root.h"
118
#include "trace/control.h"
119
#include "qemu/queue.h"
120
#include "sysemu/arch_init.h"
B
Blue Swirl 已提交
121

G
Gerd Hoffmann 已提交
122
#include "ui/qemu-spice.h"
123
#include "qapi/string-input-visitor.h"
P
Paolo Bonzini 已提交
124
#include "qapi/opts-visitor.h"
W
Wenchao Xia 已提交
125 126
#include "qom/object_interfaces.h"
#include "qapi-event.h"
127
#include "exec/semihost.h"
128
#include "crypto/init.h"
P
Pavel Dovgalyuk 已提交
129
#include "sysemu/replay.h"
130
#include "qapi/qmp/qerror.h"
131
#include "sysemu/iothread.h"
G
Gerd Hoffmann 已提交
132

133
#define MAX_VIRTIO_CONSOLES 1
134
#define MAX_SCLP_CONSOLES 1
135

136 137
static const char *data_dir[16];
static int data_dir_idx;
138
const char *bios_name = NULL;
M
malc 已提交
139
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
140
int request_opengl = -1;
G
Gerd Hoffmann 已提交
141
int display_opengl;
142
const char* keyboard_layout = NULL;
A
Anthony Liguori 已提交
143
ram_addr_t ram_size;
144 145
const char *mem_path = NULL;
int mem_prealloc = 0; /* force preallocation of physical target memory */
146
bool enable_mlock = false;
147
int nb_nics;
B
bellard 已提交
148
NICInfo nd_table[MAX_NICS];
P
Paolo Bonzini 已提交
149
int autostart;
150 151
static int rtc_utc = 1;
static int rtc_date_offset = -1; /* -1 means no change */
152
QEMUClockType rtc_clock;
G
Gerd Hoffmann 已提交
153
int vga_interface_type = VGA_NONE;
B
blueswir1 已提交
154 155
static int full_screen = 0;
static int no_frame = 0;
T
ths 已提交
156
int no_quit = 0;
157
static bool grab_on_hover;
158 159 160 161
Chardev *serial_hds[MAX_SERIAL_PORTS];
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES];
Chardev *sclp_hds[MAX_SCLP_CONSOLES];
162
int win2k_install_hack = 0;
163
int singlestep = 0;
B
bellard 已提交
164
int smp_cpus = 1;
A
Andrew Jones 已提交
165
int max_cpus = 1;
166 167
int smp_cores = 1;
int smp_threads = 1;
B
bellard 已提交
168
int acpi_enabled = 1;
A
aliguori 已提交
169
int no_hpet = 0;
B
bellard 已提交
170
int fd_bootchk = 1;
B
Blue Swirl 已提交
171
static int no_reboot;
A
aurel32 已提交
172
int no_shutdown = 0;
173
int cursor_hide = 1;
174
int graphic_rotate = 0;
M
Markus Armbruster 已提交
175
const char *watchdog;
G
Gleb Natapov 已提交
176
QEMUOptionRom option_rom[MAX_OPTION_ROMS];
177
int nb_option_roms;
178
int old_param = 0;
T
ths 已提交
179
const char *qemu_name;
T
ths 已提交
180
int alt_grab = 0;
181
int ctrl_grab = 0;
B
blueswir1 已提交
182 183
unsigned int nb_prom_envs = 0;
const char *prom_envs[MAX_PROM_ENVS];
184
int boot_menu;
185
bool boot_strict;
W
wayne 已提交
186
uint8_t *boot_splash_filedata;
187
size_t boot_splash_filedata_size;
W
wayne 已提交
188
uint8_t qemu_extra_params_fw[2];
189
int only_migratable; /* turn it off unless user states otherwise */
190

191
int icount_align_option;
192

F
Fam Zheng 已提交
193
/* The bytes in qemu_uuid are in the order specified by RFC4122, _not_ in the
194 195
 * little-endian "wire format" described in the SMBIOS 2.6 specification.
 */
F
Fam Zheng 已提交
196
QemuUUID qemu_uuid;
197
bool qemu_uuid_set;
198

G
Gerd Hoffmann 已提交
199 200 201
static NotifierList exit_notifiers =
    NOTIFIER_LIST_INITIALIZER(exit_notifiers);

202 203 204
static NotifierList machine_init_done_notifiers =
    NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);

205
bool xen_allowed;
206 207
uint32_t xen_domid;
enum xen_mode xen_mode = XEN_EMULATE;
208
bool xen_domid_restrict;
209

210
static int has_defaults = 1;
211
static int default_serial = 1;
G
Gerd Hoffmann 已提交
212
static int default_parallel = 1;
213
static int default_virtcon = 1;
214
static int default_sclp = 1;
G
Gerd Hoffmann 已提交
215
static int default_monitor = 1;
G
Gerd Hoffmann 已提交
216 217 218
static int default_floppy = 1;
static int default_cdrom = 1;
static int default_sdcard = 1;
219
static int default_vga = 1;
220
static int default_net = 1;
221 222 223 224 225

static struct {
    const char *driver;
    int *flag;
} default_list[] = {
G
Gerd Hoffmann 已提交
226 227
    { .driver = "isa-serial",           .flag = &default_serial    },
    { .driver = "isa-parallel",         .flag = &default_parallel  },
G
Gerd Hoffmann 已提交
228
    { .driver = "isa-fdc",              .flag = &default_floppy    },
229
    { .driver = "floppy",               .flag = &default_floppy    },
230 231
    { .driver = "ide-cd",               .flag = &default_cdrom     },
    { .driver = "ide-hd",               .flag = &default_cdrom     },
G
Gerd Hoffmann 已提交
232
    { .driver = "ide-drive",            .flag = &default_cdrom     },
233
    { .driver = "scsi-cd",              .flag = &default_cdrom     },
234
    { .driver = "scsi-hd",              .flag = &default_cdrom     },
235 236
    { .driver = "virtio-serial-pci",    .flag = &default_virtcon   },
    { .driver = "virtio-serial",        .flag = &default_virtcon   },
237 238 239 240 241 242
    { .driver = "VGA",                  .flag = &default_vga       },
    { .driver = "isa-vga",              .flag = &default_vga       },
    { .driver = "cirrus-vga",           .flag = &default_vga       },
    { .driver = "isa-cirrus-vga",       .flag = &default_vga       },
    { .driver = "vmware-svga",          .flag = &default_vga       },
    { .driver = "qxl-vga",              .flag = &default_vga       },
243
    { .driver = "virtio-vga",           .flag = &default_vga       },
244 245
};

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
static QemuOptsList qemu_rtc_opts = {
    .name = "rtc",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head),
    .desc = {
        {
            .name = "base",
            .type = QEMU_OPT_STRING,
        },{
            .name = "clock",
            .type = QEMU_OPT_STRING,
        },{
            .name = "driftfix",
            .type = QEMU_OPT_STRING,
        },
        { /* end of list */ }
    },
};

static QemuOptsList qemu_sandbox_opts = {
    .name = "sandbox",
    .implied_opt_name = "enable",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_sandbox_opts.head),
    .desc = {
        {
            .name = "enable",
            .type = QEMU_OPT_BOOL,
        },
        { /* end of list */ }
    },
};

static QemuOptsList qemu_option_rom_opts = {
    .name = "option-rom",
    .implied_opt_name = "romfile",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
    .desc = {
        {
            .name = "bootindex",
            .type = QEMU_OPT_NUMBER,
        }, {
            .name = "romfile",
            .type = QEMU_OPT_STRING,
        },
        { /* end of list */ }
    },
};

static QemuOptsList qemu_machine_opts = {
    .name = "machine",
    .implied_opt_name = "type",
    .merge_lists = true,
    .head = QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head),
    .desc = {
299 300 301 302 303 304
        /*
         * no elements => accept any
         * sanity checking will happen later
         * when setting machine properties
         */
        { }
305 306 307
    },
};

308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
static QemuOptsList qemu_accel_opts = {
    .name = "accel",
    .implied_opt_name = "accel",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_accel_opts.head),
    .merge_lists = true,
    .desc = {
        {
            .name = "accel",
            .type = QEMU_OPT_STRING,
            .help = "Select the type of accelerator",
        },
        {
            .name = "thread",
            .type = QEMU_OPT_STRING,
            .help = "Enable/disable multi-threaded TCG",
        },
        { /* end of list */ }
    },
};

328 329
static QemuOptsList qemu_boot_opts = {
    .name = "boot-opts",
330 331
    .implied_opt_name = "order",
    .merge_lists = true,
332 333 334 335 336 337 338 339 340 341
    .head = QTAILQ_HEAD_INITIALIZER(qemu_boot_opts.head),
    .desc = {
        {
            .name = "order",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "once",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "menu",
342
            .type = QEMU_OPT_BOOL,
343 344 345 346 347 348 349 350 351
        }, {
            .name = "splash",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "splash-time",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "reboot-timeout",
            .type = QEMU_OPT_STRING,
A
Amos Kong 已提交
352 353
        }, {
            .name = "strict",
354
            .type = QEMU_OPT_BOOL,
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 383 384 385 386 387 388 389
        },
        { /*End of list */ }
    },
};

static QemuOptsList qemu_add_fd_opts = {
    .name = "add-fd",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_add_fd_opts.head),
    .desc = {
        {
            .name = "fd",
            .type = QEMU_OPT_NUMBER,
            .help = "file descriptor of which a duplicate is added to fd set",
        },{
            .name = "set",
            .type = QEMU_OPT_NUMBER,
            .help = "ID of the fd set to add fd to",
        },{
            .name = "opaque",
            .type = QEMU_OPT_STRING,
            .help = "free-form string used to describe fd",
        },
        { /* end of list */ }
    },
};

static QemuOptsList qemu_object_opts = {
    .name = "object",
    .implied_opt_name = "qom-type",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
    .desc = {
        { }
    },
};

390 391 392 393 394
static QemuOptsList qemu_tpmdev_opts = {
    .name = "tpmdev",
    .implied_opt_name = "type",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_tpmdev_opts.head),
    .desc = {
395
        /* options are defined in the TPM backends */
396 397 398 399
        { /* end of list */ }
    },
};

400 401 402 403 404 405 406 407 408 409 410 411
static QemuOptsList qemu_realtime_opts = {
    .name = "realtime",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_realtime_opts.head),
    .desc = {
        {
            .name = "mlock",
            .type = QEMU_OPT_BOOL,
        },
        { /* end of list */ }
    },
};

S
Seiji Aguchi 已提交
412 413 414 415 416 417 418 419 420 421 422 423
static QemuOptsList qemu_msg_opts = {
    .name = "msg",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_msg_opts.head),
    .desc = {
        {
            .name = "timestamp",
            .type = QEMU_OPT_BOOL,
        },
        { /* end of list */ }
    },
};

424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
static QemuOptsList qemu_name_opts = {
    .name = "name",
    .implied_opt_name = "guest",
    .merge_lists = true,
    .head = QTAILQ_HEAD_INITIALIZER(qemu_name_opts.head),
    .desc = {
        {
            .name = "guest",
            .type = QEMU_OPT_STRING,
            .help = "Sets the name of the guest.\n"
                    "This name will be displayed in the SDL window caption.\n"
                    "The name will also be used for the VNC server",
        }, {
            .name = "process",
            .type = QEMU_OPT_STRING,
            .help = "Sets the name of the QEMU process, as shown in top etc",
440 441 442 443 444 445
        }, {
            .name = "debug-threads",
            .type = QEMU_OPT_BOOL,
            .help = "When enabled, name the individual threads; defaults off.\n"
                    "NOTE: The thread names are for debugging and not a\n"
                    "stable API.",
446 447 448 449 450
        },
        { /* End of list */ }
    },
};

I
Igor Mammedov 已提交
451 452 453 454 455 456 457 458 459 460
static QemuOptsList qemu_mem_opts = {
    .name = "memory",
    .implied_opt_name = "size",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_mem_opts.head),
    .merge_lists = true,
    .desc = {
        {
            .name = "size",
            .type = QEMU_OPT_SIZE,
        },
461 462 463 464 465 466 467 468
        {
            .name = "slots",
            .type = QEMU_OPT_NUMBER,
        },
        {
            .name = "maxmem",
            .type = QEMU_OPT_SIZE,
        },
I
Igor Mammedov 已提交
469 470 471 472
        { /* end of list */ }
    },
};

473 474 475 476 477 478 479 480 481
static QemuOptsList qemu_icount_opts = {
    .name = "icount",
    .implied_opt_name = "shift",
    .merge_lists = true,
    .head = QTAILQ_HEAD_INITIALIZER(qemu_icount_opts.head),
    .desc = {
        {
            .name = "shift",
            .type = QEMU_OPT_STRING,
482 483 484
        }, {
            .name = "align",
            .type = QEMU_OPT_BOOL,
485 486 487
        }, {
            .name = "sleep",
            .type = QEMU_OPT_BOOL,
P
Pavel Dovgalyuk 已提交
488 489 490 491 492 493
        }, {
            .name = "rr",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "rrfile",
            .type = QEMU_OPT_STRING,
494 495 496
        }, {
            .name = "rrsnapshot",
            .type = QEMU_OPT_STRING,
497 498 499 500 501
        },
        { /* end of list */ }
    },
};

502 503 504 505 506 507 508 509 510 511 512
static QemuOptsList qemu_semihosting_config_opts = {
    .name = "semihosting-config",
    .implied_opt_name = "enable",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_semihosting_config_opts.head),
    .desc = {
        {
            .name = "enable",
            .type = QEMU_OPT_BOOL,
        }, {
            .name = "target",
            .type = QEMU_OPT_STRING,
513 514 515
        }, {
            .name = "arg",
            .type = QEMU_OPT_STRING,
516 517 518 519 520
        },
        { /* end of list */ }
    },
};

521 522 523 524 525 526 527 528 529 530 531 532 533 534
static QemuOptsList qemu_fw_cfg_opts = {
    .name = "fw_cfg",
    .implied_opt_name = "name",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_fw_cfg_opts.head),
    .desc = {
        {
            .name = "name",
            .type = QEMU_OPT_STRING,
            .help = "Sets the fw_cfg name of the blob to be inserted",
        }, {
            .name = "file",
            .type = QEMU_OPT_STRING,
            .help = "Sets the name of the file from which\n"
                    "the fw_cfg blob will be loaded",
535 536 537 538
        }, {
            .name = "string",
            .type = QEMU_OPT_STRING,
            .help = "Sets content of the blob to be inserted from a string",
539 540 541 542 543
        },
        { /* end of list */ }
    },
};

544 545 546 547 548 549 550
/**
 * Get machine options
 *
 * Returns: machine options (never null).
 */
QemuOpts *qemu_get_machine_opts(void)
{
551
    return qemu_find_opts_singleton("machine");
552 553
}

554 555 556 557 558
const char *qemu_get_vm_name(void)
{
    return qemu_name;
}

W
wayne 已提交
559 560
static void res_free(void)
{
561 562
    g_free(boot_splash_filedata);
    boot_splash_filedata = NULL;
W
wayne 已提交
563 564
}

565
static int default_driver_check(void *opaque, QemuOpts *opts, Error **errp)
566 567 568 569 570 571 572 573 574 575 576 577 578 579
{
    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;
}

580 581 582
/***********************************************************/
/* QEMU state */

583
static RunState current_run_state = RUN_STATE_PRELAUNCH;
584

585 586
/* We use RUN_STATE__MAX but any invalid value will do */
static RunState vmstop_requested = RUN_STATE__MAX;
587 588
static QemuMutex vmstop_lock;

589 590 591 592 593 594 595
typedef struct {
    RunState from;
    RunState to;
} RunStateTransition;

static const RunStateTransition runstate_transitions_def[] = {
    /*     from      ->     to      */
596
    { RUN_STATE_DEBUG, RUN_STATE_RUNNING },
597
    { RUN_STATE_DEBUG, RUN_STATE_FINISH_MIGRATE },
598
    { RUN_STATE_DEBUG, RUN_STATE_PRELAUNCH },
599

600 601
    { RUN_STATE_INMIGRATE, RUN_STATE_INTERNAL_ERROR },
    { RUN_STATE_INMIGRATE, RUN_STATE_IO_ERROR },
602
    { RUN_STATE_INMIGRATE, RUN_STATE_PAUSED },
603 604 605 606 607
    { RUN_STATE_INMIGRATE, RUN_STATE_RUNNING },
    { RUN_STATE_INMIGRATE, RUN_STATE_SHUTDOWN },
    { RUN_STATE_INMIGRATE, RUN_STATE_SUSPENDED },
    { RUN_STATE_INMIGRATE, RUN_STATE_WATCHDOG },
    { RUN_STATE_INMIGRATE, RUN_STATE_GUEST_PANICKED },
608
    { RUN_STATE_INMIGRATE, RUN_STATE_FINISH_MIGRATE },
609 610
    { RUN_STATE_INMIGRATE, RUN_STATE_PRELAUNCH },
    { RUN_STATE_INMIGRATE, RUN_STATE_POSTMIGRATE },
611
    { RUN_STATE_INMIGRATE, RUN_STATE_COLO },
612

613
    { RUN_STATE_INTERNAL_ERROR, RUN_STATE_PAUSED },
614
    { RUN_STATE_INTERNAL_ERROR, RUN_STATE_FINISH_MIGRATE },
615
    { RUN_STATE_INTERNAL_ERROR, RUN_STATE_PRELAUNCH },
616

617
    { RUN_STATE_IO_ERROR, RUN_STATE_RUNNING },
618
    { RUN_STATE_IO_ERROR, RUN_STATE_FINISH_MIGRATE },
619
    { RUN_STATE_IO_ERROR, RUN_STATE_PRELAUNCH },
620

621
    { RUN_STATE_PAUSED, RUN_STATE_RUNNING },
622
    { RUN_STATE_PAUSED, RUN_STATE_FINISH_MIGRATE },
623
    { RUN_STATE_PAUSED, RUN_STATE_PRELAUNCH },
624
    { RUN_STATE_PAUSED, RUN_STATE_COLO},
625

626
    { RUN_STATE_POSTMIGRATE, RUN_STATE_RUNNING },
627
    { RUN_STATE_POSTMIGRATE, RUN_STATE_FINISH_MIGRATE },
628
    { RUN_STATE_POSTMIGRATE, RUN_STATE_PRELAUNCH },
629

630
    { RUN_STATE_PRELAUNCH, RUN_STATE_RUNNING },
631
    { RUN_STATE_PRELAUNCH, RUN_STATE_FINISH_MIGRATE },
632
    { RUN_STATE_PRELAUNCH, RUN_STATE_INMIGRATE },
633

634 635
    { RUN_STATE_FINISH_MIGRATE, RUN_STATE_RUNNING },
    { RUN_STATE_FINISH_MIGRATE, RUN_STATE_POSTMIGRATE },
636
    { RUN_STATE_FINISH_MIGRATE, RUN_STATE_PRELAUNCH },
637
    { RUN_STATE_FINISH_MIGRATE, RUN_STATE_COLO},
638

639
    { RUN_STATE_RESTORE_VM, RUN_STATE_RUNNING },
640
    { RUN_STATE_RESTORE_VM, RUN_STATE_PRELAUNCH },
641

642 643
    { RUN_STATE_COLO, RUN_STATE_RUNNING },

644 645 646 647 648 649 650 651 652
    { RUN_STATE_RUNNING, RUN_STATE_DEBUG },
    { RUN_STATE_RUNNING, RUN_STATE_INTERNAL_ERROR },
    { RUN_STATE_RUNNING, RUN_STATE_IO_ERROR },
    { RUN_STATE_RUNNING, RUN_STATE_PAUSED },
    { RUN_STATE_RUNNING, RUN_STATE_FINISH_MIGRATE },
    { RUN_STATE_RUNNING, RUN_STATE_RESTORE_VM },
    { RUN_STATE_RUNNING, RUN_STATE_SAVE_VM },
    { RUN_STATE_RUNNING, RUN_STATE_SHUTDOWN },
    { RUN_STATE_RUNNING, RUN_STATE_WATCHDOG },
653
    { RUN_STATE_RUNNING, RUN_STATE_GUEST_PANICKED },
654
    { RUN_STATE_RUNNING, RUN_STATE_COLO},
655

656
    { RUN_STATE_SAVE_VM, RUN_STATE_RUNNING },
657

658
    { RUN_STATE_SHUTDOWN, RUN_STATE_PAUSED },
659
    { RUN_STATE_SHUTDOWN, RUN_STATE_FINISH_MIGRATE },
660
    { RUN_STATE_SHUTDOWN, RUN_STATE_PRELAUNCH },
661

662 663 664 665
    { RUN_STATE_DEBUG, RUN_STATE_SUSPENDED },
    { RUN_STATE_RUNNING, RUN_STATE_SUSPENDED },
    { RUN_STATE_SUSPENDED, RUN_STATE_RUNNING },
    { RUN_STATE_SUSPENDED, RUN_STATE_FINISH_MIGRATE },
666
    { RUN_STATE_SUSPENDED, RUN_STATE_PRELAUNCH },
667
    { RUN_STATE_SUSPENDED, RUN_STATE_COLO},
668

669
    { RUN_STATE_WATCHDOG, RUN_STATE_RUNNING },
670
    { RUN_STATE_WATCHDOG, RUN_STATE_FINISH_MIGRATE },
671
    { RUN_STATE_WATCHDOG, RUN_STATE_PRELAUNCH },
672
    { RUN_STATE_WATCHDOG, RUN_STATE_COLO},
673

674
    { RUN_STATE_GUEST_PANICKED, RUN_STATE_RUNNING },
675
    { RUN_STATE_GUEST_PANICKED, RUN_STATE_FINISH_MIGRATE },
676
    { RUN_STATE_GUEST_PANICKED, RUN_STATE_PRELAUNCH },
677

678
    { RUN_STATE__MAX, RUN_STATE__MAX },
679 680
};

681
static bool runstate_valid_transitions[RUN_STATE__MAX][RUN_STATE__MAX];
682

683 684 685 686 687
bool runstate_check(RunState state)
{
    return current_run_state == state;
}

J
Juan Quintela 已提交
688 689 690 691 692 693 694 695 696 697 698 699
bool runstate_store(char *str, size_t size)
{
    const char *state = RunState_lookup[current_run_state];
    size_t len = strlen(state) + 1;

    if (len > size) {
        return false;
    }
    memcpy(str, state, len);
    return true;
}

B
Blue Swirl 已提交
700
static void runstate_init(void)
701 702 703 704
{
    const RunStateTransition *p;

    memset(&runstate_valid_transitions, 0, sizeof(runstate_valid_transitions));
705
    for (p = &runstate_transitions_def[0]; p->from != RUN_STATE__MAX; p++) {
706 707
        runstate_valid_transitions[p->from][p->to] = true;
    }
708 709

    qemu_mutex_init(&vmstop_lock);
710 711 712
}

/* This function will abort() on invalid state transitions */
713 714
void runstate_set(RunState new_state)
{
715
    assert(new_state < RUN_STATE__MAX);
716

717 718 719 720
    if (current_run_state == new_state) {
        return;
    }

721
    if (!runstate_valid_transitions[current_run_state][new_state]) {
722 723 724
        error_report("invalid runstate transition: '%s' -> '%s'",
                     RunState_lookup[current_run_state],
                     RunState_lookup[new_state]);
725 726
        abort();
    }
K
Kazuya Saito 已提交
727
    trace_runstate_set(new_state);
728 729 730
    current_run_state = new_state;
}

L
Luiz Capitulino 已提交
731
int runstate_is_running(void)
732
{
L
Luiz Capitulino 已提交
733
    return runstate_check(RUN_STATE_RUNNING);
734 735
}

736 737 738
bool runstate_needs_reset(void)
{
    return runstate_check(RUN_STATE_INTERNAL_ERROR) ||
739
        runstate_check(RUN_STATE_SHUTDOWN);
740 741
}

L
Luiz Capitulino 已提交
742
StatusInfo *qmp_query_status(Error **errp)
743
{
L
Luiz Capitulino 已提交
744 745 746 747 748 749 750
    StatusInfo *info = g_malloc0(sizeof(*info));

    info->running = runstate_is_running();
    info->singlestep = singlestep;
    info->status = current_run_state;

    return info;
751 752
}

C
Claudio Imbrenda 已提交
753
bool qemu_vmstop_requested(RunState *r)
754 755 756
{
    qemu_mutex_lock(&vmstop_lock);
    *r = vmstop_requested;
757
    vmstop_requested = RUN_STATE__MAX;
758
    qemu_mutex_unlock(&vmstop_lock);
759
    return *r < RUN_STATE__MAX;
760 761 762 763 764 765 766 767 768 769 770 771 772 773
}

void qemu_system_vmstop_request_prepare(void)
{
    qemu_mutex_lock(&vmstop_lock);
}

void qemu_system_vmstop_request(RunState state)
{
    vmstop_requested = state;
    qemu_mutex_unlock(&vmstop_lock);
    qemu_notify_event();
}

774 775
/***********************************************************/
/* real time host monotonic timer */
776

777 778 779 780 781
static time_t qemu_time(void)
{
    return qemu_clock_get_ms(QEMU_CLOCK_HOST) / 1000;
}

782 783 784 785
/***********************************************************/
/* host time/date access */
void qemu_get_timedate(struct tm *tm, int offset)
{
786
    time_t ti = qemu_time();
787 788 789 790

    ti += offset;
    if (rtc_date_offset == -1) {
        if (rtc_utc)
791
            gmtime_r(&ti, tm);
792
        else
793
            localtime_r(&ti, tm);
794 795
    } else {
        ti -= rtc_date_offset;
796
        gmtime_r(&ti, tm);
797 798 799 800 801 802 803 804 805 806
    }
}

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

    if (rtc_date_offset == -1)
        if (rtc_utc)
            seconds = mktimegm(tm);
807 808 809 810 811
        else {
            struct tm tmp = *tm;
            tmp.tm_isdst = -1; /* use timezone to figure it out */
            seconds = mktime(&tmp);
	}
812 813 814
    else
        seconds = mktimegm(tm) + rtc_date_offset;

815
    return seconds - qemu_time();
816 817
}

J
Jan Kiszka 已提交
818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
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:
849 850 851
            error_report("invalid date format");
            error_printf("valid formats: "
                         "'2006-06-17T16:01:21' or '2006-06-17'\n");
J
Jan Kiszka 已提交
852 853
            exit(1);
        }
854
        rtc_date_offset = qemu_time() - rtc_start_date;
J
Jan Kiszka 已提交
855 856 857 858 859 860 861 862 863 864 865 866
    }
}

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")) {
867
            Error *blocker = NULL;
J
Jan Kiszka 已提交
868
            rtc_utc = 0;
869 870 871
            error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED,
                      "-rtc base=localtime");
            replay_add_blocker(blocker);
J
Jan Kiszka 已提交
872 873 874 875
        } else {
            configure_rtc_date_offset(value, 0);
        }
    }
J
Jan Kiszka 已提交
876 877 878
    value = qemu_opt_get(opts, "clock");
    if (value) {
        if (!strcmp(value, "host")) {
879
            rtc_clock = QEMU_CLOCK_HOST;
P
Paolo Bonzini 已提交
880
        } else if (!strcmp(value, "rt")) {
881
            rtc_clock = QEMU_CLOCK_REALTIME;
J
Jan Kiszka 已提交
882
        } else if (!strcmp(value, "vm")) {
883
            rtc_clock = QEMU_CLOCK_VIRTUAL;
J
Jan Kiszka 已提交
884
        } else {
885
            error_report("invalid option value '%s'", value);
J
Jan Kiszka 已提交
886 887 888
            exit(1);
        }
    }
J
Jan Kiszka 已提交
889 890
    value = qemu_opt_get(opts, "driftfix");
    if (value) {
B
Blue Swirl 已提交
891
        if (!strcmp(value, "slew")) {
892 893 894 895
            static GlobalProperty slew_lost_ticks = {
                .driver   = "mc146818rtc",
                .property = "lost_tick_policy",
                .value    = "slew",
896 897
            };

898
            qdev_prop_register_global(&slew_lost_ticks);
B
Blue Swirl 已提交
899
        } else if (!strcmp(value, "none")) {
900
            /* discard is default */
J
Jan Kiszka 已提交
901
        } else {
902
            error_report("invalid option value '%s'", value);
J
Jan Kiszka 已提交
903 904 905 906 907
            exit(1);
        }
    }
}

908 909 910 911 912
/***********************************************************/
/* Bluetooth support */
static int nb_hcis;
static int cur_hci;
static struct HCIInfo *hci_table[MAX_NICS];
913

914 915 916 917 918 919 920 921
struct HCIInfo *qemu_next_hci(void)
{
    if (cur_hci == nb_hcis)
        return &null_hci;

    return hci_table[cur_hci++];
}

922 923 924
static int bt_hci_parse(const char *str)
{
    struct HCIInfo *hci;
A
Anthony Liguori 已提交
925
    bdaddr_t bdaddr;
926 927

    if (nb_hcis >= MAX_NICS) {
928
        error_report("too many bluetooth HCIs (max %i)", MAX_NICS);
929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
        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)
954 955
        error_report("warning: adding a VHCI to an empty scatternet %i",
                     vlan_id);
956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972

    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) {
973
            error_report("unrecognised bluetooth vlan Id");
974 975 976 977 978 979 980
            return 0;
        }
    }

    vlan = qemu_find_bt_vlan(vlan_id);

    if (!vlan->slave)
981 982
        error_report("warning: adding a slave device to an empty scatternet %i",
                     vlan_id);
983 984 985 986

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

E
Eduardo Habkost 已提交
987
    error_report("unsupported bluetooth device '%s'", devname);
988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
    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) {
1010
                        error_report("bad scatternet '%s'", p);
1011 1012 1013
                        return 1;
                    }
                } else {
1014
                    error_report("bad parameter '%s'", endp + 1);
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
                    return 1;
                }
            } else
                vlan = 0;

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

1026
    error_report("bad bluetooth parameter '%s'", opt);
1027 1028 1029
    return 1;
}

1030
static int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
1031 1032 1033 1034 1035
{
    /* FIXME: change this to true for 1.3 */
    if (qemu_opt_get_bool(opts, "enable", false)) {
#ifdef CONFIG_SECCOMP
        if (seccomp_start() < 0) {
1036 1037
            error_report("failed to install seccomp syscall filter "
                         "in the kernel");
1038 1039 1040
            return -1;
        }
#else
1041
        error_report("seccomp support is disabled");
1042 1043 1044 1045 1046 1047 1048
        return -1;
#endif
    }

    return 0;
}

1049
static int parse_name(void *opaque, QemuOpts *opts, Error **errp)
1050 1051 1052
{
    const char *proc_name;

1053 1054 1055
    if (qemu_opt_get(opts, "debug-threads")) {
        qemu_thread_naming(qemu_opt_get_bool(opts, "debug-threads", false));
    }
1056 1057 1058 1059 1060 1061
    qemu_name = qemu_opt_get(opts, "guest");

    proc_name = qemu_opt_get(opts, "process");
    if (proc_name) {
        os_set_proc_name(proc_name);
    }
1062 1063

    return 0;
1064 1065
}

1066 1067 1068 1069 1070
bool defaults_enabled(void)
{
    return has_defaults;
}

1071
#ifndef _WIN32
1072
static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
1073 1074 1075 1076
{
    int fd, dupfd, flags;
    int64_t fdset_id;
    const char *fd_opaque = NULL;
1077
    AddfdInfo *fdinfo;
1078 1079 1080 1081 1082 1083

    fd = qemu_opt_get_number(opts, "fd", -1);
    fdset_id = qemu_opt_get_number(opts, "set", -1);
    fd_opaque = qemu_opt_get(opts, "opaque");

    if (fd < 0) {
1084
        error_report("fd option is required and must be non-negative");
1085 1086 1087 1088
        return -1;
    }

    if (fd <= STDERR_FILENO) {
1089
        error_report("fd cannot be a standard I/O stream");
1090 1091 1092 1093 1094 1095 1096 1097 1098
        return -1;
    }

    /*
     * All fds inherited across exec() necessarily have FD_CLOEXEC
     * clear, while qemu sets FD_CLOEXEC on all other fds used internally.
     */
    flags = fcntl(fd, F_GETFD);
    if (flags == -1 || (flags & FD_CLOEXEC)) {
1099
        error_report("fd is not valid or already in use");
1100 1101 1102 1103
        return -1;
    }

    if (fdset_id < 0) {
1104
        error_report("set option is required and must be non-negative");
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
        return -1;
    }

#ifdef F_DUPFD_CLOEXEC
    dupfd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
#else
    dupfd = dup(fd);
    if (dupfd != -1) {
        qemu_set_cloexec(dupfd);
    }
#endif
    if (dupfd == -1) {
1117
        error_report("error duplicating fd: %s", strerror(errno));
1118 1119 1120 1121
        return -1;
    }

    /* add the duplicate fd, and optionally the opaque string, to the fd set */
1122 1123 1124
    fdinfo = monitor_fdset_add_fd(dupfd, true, fdset_id, !!fd_opaque, fd_opaque,
                                  &error_abort);
    g_free(fdinfo);
1125 1126 1127 1128

    return 0;
}

1129
static int cleanup_add_fd(void *opaque, QemuOpts *opts, Error **errp)
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
{
    int fd;

    fd = qemu_opt_get_number(opts, "fd", -1);
    close(fd);

    return 0;
}
#endif

1140 1141 1142
/***********************************************************/
/* QEMU Block devices */

1143 1144 1145 1146 1147 1148
#define HD_OPTS "media=disk"
#define CDROM_OPTS "media=cdrom"
#define FD_OPTS ""
#define PFLASH_OPTS ""
#define MTD_OPTS ""
#define SD_OPTS ""
T
ths 已提交
1149

1150
static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
G
Gerd Hoffmann 已提交
1151
{
1152
    BlockInterfaceType *block_default_type = opaque;
G
Gerd Hoffmann 已提交
1153

1154
    return drive_new(opts, *block_default_type) == NULL;
G
Gerd Hoffmann 已提交
1155 1156
}

1157
static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
G
Gerd Hoffmann 已提交
1158
{
G
Gonglei 已提交
1159
    if (qemu_opt_get(opts, "snapshot") == NULL) {
1160
        qemu_opt_set(opts, "snapshot", "on", &error_abort);
G
Gerd Hoffmann 已提交
1161 1162 1163 1164
    }
    return 0;
}

1165 1166
static void default_drive(int enable, int snapshot, BlockInterfaceType type,
                          int index, const char *optstr)
1167 1168
{
    QemuOpts *opts;
J
John Snow 已提交
1169
    DriveInfo *dinfo;
1170 1171 1172 1173 1174 1175 1176

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

    opts = drive_add(type, index, NULL, optstr);
    if (snapshot) {
1177
        drive_enable_snapshot(NULL, opts, NULL);
1178
    }
J
John Snow 已提交
1179 1180 1181

    dinfo = drive_new(opts, type);
    if (!dinfo) {
1182 1183
        exit(1);
    }
J
John Snow 已提交
1184 1185
    dinfo->is_default = true;

1186 1187
}

1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214
static QemuOptsList qemu_smp_opts = {
    .name = "smp-opts",
    .implied_opt_name = "cpus",
    .merge_lists = true,
    .head = QTAILQ_HEAD_INITIALIZER(qemu_smp_opts.head),
    .desc = {
        {
            .name = "cpus",
            .type = QEMU_OPT_NUMBER,
        }, {
            .name = "sockets",
            .type = QEMU_OPT_NUMBER,
        }, {
            .name = "cores",
            .type = QEMU_OPT_NUMBER,
        }, {
            .name = "threads",
            .type = QEMU_OPT_NUMBER,
        }, {
            .name = "maxcpus",
            .type = QEMU_OPT_NUMBER,
        },
        { /*End of list */ }
    },
};

static void smp_parse(QemuOpts *opts)
1215
{
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
    if (opts) {
        unsigned cpus    = qemu_opt_get_number(opts, "cpus", 0);
        unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
        unsigned cores   = qemu_opt_get_number(opts, "cores", 0);
        unsigned threads = qemu_opt_get_number(opts, "threads", 0);

        /* compute missing values, prefer sockets over cores over threads */
        if (cpus == 0 || sockets == 0) {
            sockets = sockets > 0 ? sockets : 1;
            cores = cores > 0 ? cores : 1;
1226
            threads = threads > 0 ? threads : 1;
1227 1228 1229
            if (cpus == 0) {
                cpus = cores * threads * sockets;
            }
1230 1231 1232
        } else if (cores == 0) {
            threads = threads > 0 ? threads : 1;
            cores = cpus / (sockets * threads);
A
Andrew Jones 已提交
1233
            cores = cores > 0 ? cores : 1;
1234
        } else if (threads == 0) {
1235
            threads = cpus / (cores * sockets);
A
Andrew Jones 已提交
1236
            threads = threads > 0 ? threads : 1;
1237
        } else if (sockets * cores * threads < cpus) {
1238 1239 1240 1241
            error_report("cpu topology: "
                         "sockets (%u) * cores (%u) * threads (%u) < "
                         "smp_cpus (%u)",
                         sockets, cores, threads, cpus);
1242
            exit(1);
1243
        }
1244

1245
        max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus);
A
Andrew Jones 已提交
1246 1247 1248 1249 1250 1251

        if (max_cpus < cpus) {
            error_report("maxcpus must be equal to or greater than smp");
            exit(1);
        }

1252
        if (sockets * cores * threads > max_cpus) {
1253 1254 1255 1256
            error_report("cpu topology: "
                         "sockets (%u) * cores (%u) * threads (%u) > "
                         "maxcpus (%u)",
                         sockets, cores, threads, max_cpus);
1257 1258
            exit(1);
        }
1259 1260

        smp_cpus = cpus;
A
Andrew Jones 已提交
1261 1262
        smp_cores = cores;
        smp_threads = threads;
1263 1264
    }

A
Andrew Jones 已提交
1265
    if (smp_cpus > 1) {
1266 1267 1268 1269
        Error *blocker = NULL;
        error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED, "smp");
        replay_add_blocker(blocker);
    }
1270 1271
}

1272
static void realtime_init(void)
1273 1274 1275
{
    if (enable_mlock) {
        if (os_mlock() < 0) {
1276
            error_report("locking memory failed");
1277 1278 1279 1280 1281
            exit(1);
        }
    }
}

S
Seiji Aguchi 已提交
1282 1283 1284 1285 1286 1287

static void configure_msg(QemuOpts *opts)
{
    enable_timestamp_msg = qemu_opt_get_bool(opts, "timestamp", true);
}

1288 1289 1290 1291 1292 1293
/***********************************************************/
/* Semihosting */

typedef struct SemihostingConfig {
    bool enabled;
    SemihostingTarget target;
1294 1295 1296
    const char **argv;
    int argc;
    const char *cmdline; /* concatenated argv */
1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
} SemihostingConfig;

static SemihostingConfig semihosting;

bool semihosting_enabled(void)
{
    return semihosting.enabled;
}

SemihostingTarget semihosting_get_target(void)
{
    return semihosting.target;
}

1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362
const char *semihosting_get_arg(int i)
{
    if (i >= semihosting.argc) {
        return NULL;
    }
    return semihosting.argv[i];
}

int semihosting_get_argc(void)
{
    return semihosting.argc;
}

const char *semihosting_get_cmdline(void)
{
    if (semihosting.cmdline == NULL && semihosting.argc > 0) {
        semihosting.cmdline = g_strjoinv(" ", (gchar **)semihosting.argv);
    }
    return semihosting.cmdline;
}

static int add_semihosting_arg(void *opaque,
                               const char *name, const char *val,
                               Error **errp)
{
    SemihostingConfig *s = opaque;
    if (strcmp(name, "arg") == 0) {
        s->argc++;
        /* one extra element as g_strjoinv() expects NULL-terminated array */
        s->argv = g_realloc(s->argv, (s->argc + 1) * sizeof(void *));
        s->argv[s->argc - 1] = val;
        s->argv[s->argc] = NULL;
    }
    return 0;
}

/* Use strings passed via -kernel/-append to initialize semihosting.argv[] */
static inline void semihosting_arg_fallback(const char *file, const char *cmd)
{
    char *cmd_token;

    /* argv[0] */
    add_semihosting_arg(&semihosting, "arg", file, NULL);

    /* split -append and initialize argv[1..n] */
    cmd_token = strtok(g_strdup(cmd), " ");
    while (cmd_token) {
        add_semihosting_arg(&semihosting, "arg", cmd_token, NULL);
        cmd_token = strtok(NULL, " ");
    }
}

1363 1364 1365 1366 1367 1368 1369
/* Now we still need this for compatibility with XEN. */
bool has_igd_gfx_passthru;
static void igd_gfx_passthru(void)
{
    has_igd_gfx_passthru = current_machine->igd_gfx_passthru;
}

B
bellard 已提交
1370 1371 1372
/***********************************************************/
/* USB devices */

1373
static int usb_device_add(const char *devname)
B
bellard 已提交
1374
{
1375
    USBDevice *dev = NULL;
1376 1377 1378
#ifndef CONFIG_LINUX
    const char *p;
#endif
B
bellard 已提交
1379

E
Eduardo Habkost 已提交
1380
    if (!machine_usb(current_machine)) {
B
bellard 已提交
1381
        return -1;
1382
    }
B
bellard 已提交
1383

G
Gerd Hoffmann 已提交
1384 1385 1386 1387 1388
    /* drivers with .usbdevice_name entry in USBDeviceInfo */
    dev = usbdevice_create(devname);
    if (dev)
        goto done;

1389
    /* the other ones */
1390 1391
#ifndef CONFIG_LINUX
    /* only the linux version is qdev-ified, usb-bsd still needs this */
B
bellard 已提交
1392
    if (strstart(devname, "host:", &p)) {
1393
        dev = usb_host_device_open(usb_bus_find(-1), p);
B
bellard 已提交
1394
    }
1395
#endif
P
pbrook 已提交
1396 1397 1398
    if (!dev)
        return -1;

1399
done:
B
bellard 已提交
1400 1401 1402
    return 0;
}

1403 1404 1405 1406 1407
static int usb_device_del(const char *devname)
{
    int bus_num, addr;
    const char *p;

1408 1409 1410
    if (strstart(devname, "host:", &p)) {
        return -1;
    }
1411

E
Eduardo Habkost 已提交
1412
    if (!machine_usb(current_machine)) {
1413
        return -1;
1414
    }
1415 1416 1417 1418 1419 1420 1421

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

1422
    return usb_device_delete_addr(bus_num, addr);
1423 1424
}

1425 1426
static int usb_parse(const char *cmdline)
{
S
Scott Tsai 已提交
1427
    int r;
1428
    r = usb_device_add(cmdline);
S
Scott Tsai 已提交
1429
    if (r < 0) {
1430
        error_report("could not add USB device '%s'", cmdline);
S
Scott Tsai 已提交
1431 1432
    }
    return r;
1433 1434
}

1435
void hmp_usb_add(Monitor *mon, const QDict *qdict)
B
bellard 已提交
1436
{
S
Scott Tsai 已提交
1437
    const char *devname = qdict_get_str(qdict, "devname");
1438
    if (usb_device_add(devname) < 0) {
1439
        error_report("could not add USB device '%s'", devname);
S
Scott Tsai 已提交
1440
    }
B
bellard 已提交
1441 1442
}

1443
void hmp_usb_del(Monitor *mon, const QDict *qdict)
B
bellard 已提交
1444
{
S
Scott Tsai 已提交
1445 1446
    const char *devname = qdict_get_str(qdict, "devname");
    if (usb_device_del(devname) < 0) {
1447
        error_report("could not delete USB device '%s'", devname);
S
Scott Tsai 已提交
1448
    }
B
bellard 已提交
1449 1450
}

1451 1452 1453
/***********************************************************/
/* machine registration */

1454
MachineState *current_machine;
1455

1456
static MachineClass *find_machine(const char *name)
1457
{
1458
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
1459
    MachineClass *mc = NULL;
1460

1461
    for (el = machines; el; el = el->next) {
1462
        MachineClass *temp = el->data;
1463

1464
        if (!strcmp(temp->name, name)) {
1465
            mc = temp;
1466 1467
            break;
        }
1468 1469
        if (temp->alias &&
            !strcmp(temp->alias, name)) {
1470
            mc = temp;
1471 1472
            break;
        }
1473
    }
1474 1475

    g_slist_free(machines);
1476
    return mc;
1477 1478
}

1479
MachineClass *find_default_machine(void)
1480
{
1481
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
1482
    MachineClass *mc = NULL;
1483

1484
    for (el = machines; el; el = el->next) {
1485
        MachineClass *temp = el->data;
1486

1487
        if (temp->is_default) {
1488
            mc = temp;
1489
            break;
1490 1491
        }
    }
1492 1493

    g_slist_free(machines);
1494
    return mc;
1495 1496
}

1497 1498
MachineInfoList *qmp_query_machines(Error **errp)
{
1499
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
1500 1501
    MachineInfoList *mach_list = NULL;

1502 1503
    for (el = machines; el; el = el->next) {
        MachineClass *mc = el->data;
1504 1505 1506 1507
        MachineInfoList *entry;
        MachineInfo *info;

        info = g_malloc0(sizeof(*info));
1508
        if (mc->is_default) {
1509 1510 1511 1512
            info->has_is_default = true;
            info->is_default = true;
        }

1513
        if (mc->alias) {
1514
            info->has_alias = true;
1515
            info->alias = g_strdup(mc->alias);
1516 1517
        }

1518 1519
        info->name = g_strdup(mc->name);
        info->cpu_max = !mc->max_cpus ? 1 : mc->max_cpus;
1520
        info->hotpluggable_cpus = mc->has_hotpluggable_cpus;
1521 1522 1523 1524 1525 1526 1527

        entry = g_malloc0(sizeof(*entry));
        entry->value = info;
        entry->next = mach_list;
        mach_list = entry;
    }

1528
    g_slist_free(machines);
1529 1530 1531
    return mach_list;
}

M
Marcel Apfelbaum 已提交
1532 1533 1534
static int machine_help_func(QemuOpts *opts, MachineState *machine)
{
    ObjectProperty *prop;
1535
    ObjectPropertyIterator iter;
M
Marcel Apfelbaum 已提交
1536 1537 1538 1539 1540

    if (!qemu_opt_has_help_opt(opts)) {
        return 0;
    }

1541 1542
    object_property_iter_init(&iter, OBJECT(machine));
    while ((prop = object_property_iter_next(&iter))) {
M
Marcel Apfelbaum 已提交
1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558
        if (!prop->set) {
            continue;
        }

        error_printf("%s.%s=%s", MACHINE_GET_CLASS(machine)->name,
                     prop->name, prop->type);
        if (prop->description) {
            error_printf(" (%s)\n", prop->description);
        } else {
            error_printf("\n");
        }
    }

    return 1;
}

1559 1560 1561
/***********************************************************/
/* main execution loop */

B
bellard 已提交
1562 1563 1564
struct vm_change_state_entry {
    VMChangeStateHandler *cb;
    void *opaque;
B
Blue Swirl 已提交
1565
    QLIST_ENTRY (vm_change_state_entry) entries;
B
bellard 已提交
1566 1567
};

B
Blue Swirl 已提交
1568
static QLIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
B
bellard 已提交
1569 1570 1571 1572 1573 1574

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

1575
    e = g_malloc0(sizeof (*e));
B
bellard 已提交
1576 1577 1578

    e->cb = cb;
    e->opaque = opaque;
B
Blue Swirl 已提交
1579
    QLIST_INSERT_HEAD(&vm_change_state_head, e, entries);
B
bellard 已提交
1580 1581 1582 1583 1584
    return e;
}

void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
{
B
Blue Swirl 已提交
1585
    QLIST_REMOVE (e, entries);
1586
    g_free (e);
B
bellard 已提交
1587 1588
}

1589
void vm_state_notify(int running, RunState state)
B
bellard 已提交
1590
{
1591
    VMChangeStateEntry *e, *next;
B
bellard 已提交
1592

1593
    trace_vm_state_notify(running, state);
1594

1595
    QLIST_FOREACH_SAFE(e, &vm_change_state_head, entries, next) {
1596
        e->cb(e->opaque, running, state);
B
bellard 已提交
1597 1598 1599
    }
}

1600
static int reset_requested;
1601 1602
static int shutdown_requested, shutdown_signal = -1;
static pid_t shutdown_pid;
B
bellard 已提交
1603
static int powerdown_requested;
1604
static int debug_requested;
G
Gerd Hoffmann 已提交
1605
static int suspend_requested;
L
Liu, Jinsong 已提交
1606
static WakeupReason wakeup_reason;
I
Igor Mammedov 已提交
1607 1608
static NotifierList powerdown_notifiers =
    NOTIFIER_LIST_INITIALIZER(powerdown_notifiers);
G
Gerd Hoffmann 已提交
1609 1610 1611 1612
static NotifierList suspend_notifiers =
    NOTIFIER_LIST_INITIALIZER(suspend_notifiers);
static NotifierList wakeup_notifiers =
    NOTIFIER_LIST_INITIALIZER(wakeup_notifiers);
L
Liu, Jinsong 已提交
1613
static uint32_t wakeup_reason_mask = ~(1 << QEMU_WAKEUP_REASON_NONE);
1614

1615 1616 1617 1618 1619 1620 1621 1622 1623 1624
int qemu_shutdown_requested_get(void)
{
    return shutdown_requested;
}

int qemu_reset_requested_get(void)
{
    return reset_requested;
}

B
Blue Swirl 已提交
1625
static int qemu_shutdown_requested(void)
A
aurel32 已提交
1626
{
1627
    return atomic_xchg(&shutdown_requested, 0);
A
aurel32 已提交
1628 1629
}

B
Blue Swirl 已提交
1630
static void qemu_kill_report(void)
1631
{
1632
    if (!qtest_driver() && shutdown_signal != -1) {
1633 1634 1635 1636
        if (shutdown_pid == 0) {
            /* This happens for eg ^C at the terminal, so it's worth
             * avoiding printing an odd message in that case.
             */
1637
            error_report("terminating on signal %d", shutdown_signal);
1638
        } else {
1639 1640 1641 1642 1643 1644
            char *shutdown_cmd = qemu_get_pid_name(shutdown_pid);

            error_report("terminating on signal %d from pid " FMT_pid " (%s)",
                         shutdown_signal, shutdown_pid,
                         shutdown_cmd ? shutdown_cmd : "<unknown process>");
            g_free(shutdown_cmd);
1645
        }
1646 1647 1648 1649
        shutdown_signal = -1;
    }
}

B
Blue Swirl 已提交
1650
static int qemu_reset_requested(void)
A
aurel32 已提交
1651 1652
{
    int r = reset_requested;
P
Pavel Dovgalyuk 已提交
1653 1654 1655 1656 1657
    if (r && replay_checkpoint(CHECKPOINT_RESET_REQUESTED)) {
        reset_requested = 0;
        return r;
    }
    return false;
A
aurel32 已提交
1658 1659
}

G
Gerd Hoffmann 已提交
1660 1661 1662
static int qemu_suspend_requested(void)
{
    int r = suspend_requested;
P
Pavel Dovgalyuk 已提交
1663 1664 1665 1666 1667
    if (r && replay_checkpoint(CHECKPOINT_SUSPEND_REQUESTED)) {
        suspend_requested = 0;
        return r;
    }
    return false;
G
Gerd Hoffmann 已提交
1668 1669
}

L
Liu, Jinsong 已提交
1670
static WakeupReason qemu_wakeup_requested(void)
1671
{
L
Liu, Jinsong 已提交
1672
    return wakeup_reason;
1673 1674
}

B
Blue Swirl 已提交
1675
static int qemu_powerdown_requested(void)
A
aurel32 已提交
1676 1677 1678 1679 1680 1681
{
    int r = powerdown_requested;
    powerdown_requested = 0;
    return r;
}

1682 1683 1684 1685 1686 1687 1688
static int qemu_debug_requested(void)
{
    int r = debug_requested;
    debug_requested = 0;
    return r;
}

1689 1690
void qemu_system_reset(bool report)
{
1691 1692 1693 1694
    MachineClass *mc;

    mc = current_machine ? MACHINE_GET_CLASS(current_machine) : NULL;

1695 1696
    cpu_synchronize_all_states();

1697 1698
    if (mc && mc->reset) {
        mc->reset();
1699 1700 1701
    } else {
        qemu_devices_reset();
    }
J
Jan Kiszka 已提交
1702
    if (report) {
W
Wenchao Xia 已提交
1703
        qapi_event_send_reset(&error_abort);
J
Jan Kiszka 已提交
1704
    }
1705
    cpu_synchronize_all_post_reset();
1706 1707
}

1708
void qemu_system_guest_panicked(GuestPanicInformation *info)
1709
{
1710 1711
    qemu_log_mask(LOG_GUEST_ERROR, "Guest crashed\n");

1712 1713 1714
    if (current_cpu) {
        current_cpu->crash_occurred = true;
    }
1715 1716
    qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
                                   !!info, info, &error_abort);
1717
    vm_stop(RUN_STATE_GUEST_PANICKED);
1718 1719
    if (!no_shutdown) {
        qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF,
1720
                                       !!info, info, &error_abort);
1721 1722
        qemu_system_shutdown_request();
    }
1723 1724

    if (info) {
1725
        if (info->type == GUEST_PANIC_INFORMATION_TYPE_HYPER_V) {
1726 1727
            qemu_log_mask(LOG_GUEST_ERROR, "HV crash parameters: (%#"PRIx64
                          " %#"PRIx64" %#"PRIx64" %#"PRIx64" %#"PRIx64")\n",
1728 1729 1730 1731 1732
                          info->u.hyper_v.arg1,
                          info->u.hyper_v.arg2,
                          info->u.hyper_v.arg3,
                          info->u.hyper_v.arg4,
                          info->u.hyper_v.arg5);
1733
        }
1734 1735
        qapi_free_GuestPanicInformation(info);
    }
1736 1737
}

1738 1739
void qemu_system_reset_request(void)
{
B
bellard 已提交
1740 1741 1742 1743 1744
    if (no_reboot) {
        shutdown_requested = 1;
    } else {
        reset_requested = 1;
    }
1745
    cpu_stop_current();
1746
    qemu_notify_event();
1747 1748
}

G
Gerd Hoffmann 已提交
1749 1750 1751 1752
static void qemu_system_suspend(void)
{
    pause_all_vcpus();
    notifier_list_notify(&suspend_notifiers, NULL);
1753
    runstate_set(RUN_STATE_SUSPENDED);
W
Wenchao Xia 已提交
1754
    qapi_event_send_suspend(&error_abort);
G
Gerd Hoffmann 已提交
1755 1756 1757 1758
}

void qemu_system_suspend_request(void)
{
L
Luiz Capitulino 已提交
1759
    if (runstate_check(RUN_STATE_SUSPENDED)) {
G
Gerd Hoffmann 已提交
1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773
        return;
    }
    suspend_requested = 1;
    cpu_stop_current();
    qemu_notify_event();
}

void qemu_register_suspend_notifier(Notifier *notifier)
{
    notifier_list_add(&suspend_notifiers, notifier);
}

void qemu_system_wakeup_request(WakeupReason reason)
{
1774 1775
    trace_system_wakeup_request(reason);

L
Luiz Capitulino 已提交
1776
    if (!runstate_check(RUN_STATE_SUSPENDED)) {
G
Gerd Hoffmann 已提交
1777 1778 1779 1780 1781
        return;
    }
    if (!(wakeup_reason_mask & (1 << reason))) {
        return;
    }
1782
    runstate_set(RUN_STATE_RUNNING);
L
Liu, Jinsong 已提交
1783
    wakeup_reason = reason;
G
Gerd Hoffmann 已提交
1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800
    qemu_notify_event();
}

void qemu_system_wakeup_enable(WakeupReason reason, bool enabled)
{
    if (enabled) {
        wakeup_reason_mask |= (1 << reason);
    } else {
        wakeup_reason_mask &= ~(1 << reason);
    }
}

void qemu_register_wakeup_notifier(Notifier *notifier)
{
    notifier_list_add(&wakeup_notifiers, notifier);
}

1801 1802 1803 1804
void qemu_system_killed(int signal, pid_t pid)
{
    shutdown_signal = signal;
    shutdown_pid = pid;
1805
    no_shutdown = 0;
P
Pavel Dovgalyuk 已提交
1806 1807 1808 1809 1810 1811

    /* Cannot call qemu_system_shutdown_request directly because
     * we are in a signal handler.
     */
    shutdown_requested = 1;
    qemu_notify_event();
1812 1813
}

1814 1815
void qemu_system_shutdown_request(void)
{
1816
    trace_qemu_system_shutdown_request();
P
Pavel Dovgalyuk 已提交
1817
    replay_shutdown_request();
1818
    shutdown_requested = 1;
1819
    qemu_notify_event();
1820 1821
}

1822 1823
static void qemu_system_powerdown(void)
{
W
Wenchao Xia 已提交
1824
    qapi_event_send_powerdown(&error_abort);
1825 1826 1827
    notifier_list_notify(&powerdown_notifiers, NULL);
}

B
bellard 已提交
1828 1829
void qemu_system_powerdown_request(void)
{
1830
    trace_qemu_system_powerdown_request();
B
bellard 已提交
1831
    powerdown_requested = 1;
1832 1833 1834
    qemu_notify_event();
}

I
Igor Mammedov 已提交
1835 1836 1837 1838 1839
void qemu_register_powerdown_notifier(Notifier *notifier)
{
    notifier_list_add(&powerdown_notifiers, notifier);
}

1840 1841 1842
void qemu_system_debug_request(void)
{
    debug_requested = 1;
1843
    qemu_notify_event();
1844 1845
}

P
Paolo Bonzini 已提交
1846 1847 1848 1849 1850 1851
static bool main_loop_should_exit(void)
{
    RunState r;
    if (qemu_debug_requested()) {
        vm_stop(RUN_STATE_DEBUG);
    }
G
Gerd Hoffmann 已提交
1852 1853 1854
    if (qemu_suspend_requested()) {
        qemu_system_suspend();
    }
P
Paolo Bonzini 已提交
1855 1856
    if (qemu_shutdown_requested()) {
        qemu_kill_report();
W
Wenchao Xia 已提交
1857
        qapi_event_send_shutdown(&error_abort);
P
Paolo Bonzini 已提交
1858 1859 1860 1861 1862 1863 1864 1865 1866 1867
        if (no_shutdown) {
            vm_stop(RUN_STATE_SHUTDOWN);
        } else {
            return true;
        }
    }
    if (qemu_reset_requested()) {
        pause_all_vcpus();
        qemu_system_reset(VMRESET_REPORT);
        resume_all_vcpus();
1868 1869 1870
        if (!runstate_check(RUN_STATE_RUNNING) &&
                !runstate_check(RUN_STATE_INMIGRATE)) {
            runstate_set(RUN_STATE_PRELAUNCH);
P
Paolo Bonzini 已提交
1871 1872
        }
    }
1873 1874 1875
    if (qemu_wakeup_requested()) {
        pause_all_vcpus();
        qemu_system_reset(VMRESET_SILENT);
L
Liu, Jinsong 已提交
1876 1877
        notifier_list_notify(&wakeup_notifiers, &wakeup_reason);
        wakeup_reason = QEMU_WAKEUP_REASON_NONE;
1878
        resume_all_vcpus();
W
Wenchao Xia 已提交
1879
        qapi_event_send_wakeup(&error_abort);
1880
    }
P
Paolo Bonzini 已提交
1881
    if (qemu_powerdown_requested()) {
1882
        qemu_system_powerdown();
P
Paolo Bonzini 已提交
1883 1884 1885 1886 1887 1888 1889
    }
    if (qemu_vmstop_requested(&r)) {
        vm_stop(r);
    }
    return false;
}

1890 1891
static void main_loop(void)
{
1892 1893 1894
#ifdef CONFIG_PROFILER
    int64_t ti;
#endif
P
Paolo Bonzini 已提交
1895
    do {
1896
#ifdef CONFIG_PROFILER
J
Jan Kiszka 已提交
1897
        ti = profile_getclock();
1898
#endif
1899
        main_loop_wait(false);
1900
#ifdef CONFIG_PROFILER
J
Jan Kiszka 已提交
1901
        dev_time += profile_getclock() - ti;
1902
#endif
P
Paolo Bonzini 已提交
1903
    } while (!main_loop_should_exit());
B
bellard 已提交
1904 1905
}

P
pbrook 已提交
1906 1907
static void version(void)
{
1908
    printf("QEMU emulator version " QEMU_VERSION QEMU_PKGVERSION "\n"
1909
           QEMU_COPYRIGHT "\n");
P
pbrook 已提交
1910 1911
}

1912
static void help(int exitcode)
1913
{
1914 1915 1916 1917 1918
    version();
    printf("usage: %s [options] [disk_image]\n\n"
           "'disk_image' is a raw hard disk image for IDE hard disk 0\n\n",
            error_get_progname());

1919 1920
#define QEMU_OPTIONS_GENERATE_HELP
#include "qemu-options-wrapper.h"
1921 1922

    printf("\nDuring emulation, the following keys are useful:\n"
1923 1924 1925 1926
           "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"
1927 1928
           "When using -nographic, press 'ctrl-a h' to get some help.\n");

1929
    exit(exitcode);
1930 1931
}

1932 1933 1934 1935 1936 1937
#define HAS_ARG 0x0001

typedef struct QEMUOption {
    const char *name;
    int flags;
    int index;
1938
    uint32_t arch_mask;
1939 1940
} QEMUOption;

B
blueswir1 已提交
1941
static const QEMUOption qemu_options[] = {
1942
    { "h", 0, QEMU_OPTION_h, QEMU_ARCH_ALL },
1943 1944
#define QEMU_OPTIONS_GENERATE_OPTIONS
#include "qemu-options-wrapper.h"
1945
    { NULL },
B
bellard 已提交
1946
};
B
Blue Swirl 已提交
1947

E
Eduardo Habkost 已提交
1948 1949 1950
typedef struct VGAInterfaceInfo {
    const char *opt_name;    /* option name */
    const char *name;        /* human-readable name */
1951 1952 1953
    /* Class names indicating that support is available.
     * If no class is specified, the interface is always available */
    const char *class_names[2];
E
Eduardo Habkost 已提交
1954 1955 1956 1957 1958 1959 1960 1961 1962
} VGAInterfaceInfo;

static VGAInterfaceInfo vga_interfaces[VGA_TYPE_MAX] = {
    [VGA_NONE] = {
        .opt_name = "none",
    },
    [VGA_STD] = {
        .opt_name = "std",
        .name = "standard VGA",
1963
        .class_names = { "VGA", "isa-vga" },
E
Eduardo Habkost 已提交
1964 1965 1966 1967
    },
    [VGA_CIRRUS] = {
        .opt_name = "cirrus",
        .name = "Cirrus VGA",
1968
        .class_names = { "cirrus-vga", "isa-cirrus-vga" },
E
Eduardo Habkost 已提交
1969 1970 1971 1972
    },
    [VGA_VMWARE] = {
        .opt_name = "vmware",
        .name = "VMWare SVGA",
1973
        .class_names = { "vmware-svga" },
E
Eduardo Habkost 已提交
1974 1975 1976 1977
    },
    [VGA_VIRTIO] = {
        .opt_name = "virtio",
        .name = "Virtio VGA",
1978
        .class_names = { "virtio-vga" },
E
Eduardo Habkost 已提交
1979 1980 1981 1982
    },
    [VGA_QXL] = {
        .opt_name = "qxl",
        .name = "QXL VGA",
1983
        .class_names = { "qxl-vga" },
E
Eduardo Habkost 已提交
1984 1985 1986 1987
    },
    [VGA_TCX] = {
        .opt_name = "tcx",
        .name = "TCX framebuffer",
1988
        .class_names = { "SUNW,tcx" },
E
Eduardo Habkost 已提交
1989 1990 1991 1992
    },
    [VGA_CG3] = {
        .opt_name = "cg3",
        .name = "CG3 framebuffer",
1993
        .class_names = { "cgthree" },
E
Eduardo Habkost 已提交
1994 1995 1996 1997 1998 1999
    },
    [VGA_XENFB] = {
        .opt_name = "xenfb",
    },
};

2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
static bool vga_interface_available(VGAInterfaceType t)
{
    VGAInterfaceInfo *ti = &vga_interfaces[t];

    assert(t < VGA_TYPE_MAX);
    return !ti->class_names[0] ||
           object_class_by_name(ti->class_names[0]) ||
           object_class_by_name(ti->class_names[1]);
}

E
Eduardo Habkost 已提交
2010
static void select_vgahw(const char *p)
2011 2012
{
    const char *opts;
E
Eduardo Habkost 已提交
2013
    int t;
2014

2015
    assert(vga_interface_type == VGA_NONE);
E
Eduardo Habkost 已提交
2016 2017 2018
    for (t = 0; t < VGA_TYPE_MAX; t++) {
        VGAInterfaceInfo *ti = &vga_interfaces[t];
        if (ti->opt_name && strstart(p, ti->opt_name, &opts)) {
2019
            if (!vga_interface_available(t)) {
E
Eduardo Habkost 已提交
2020 2021 2022 2023 2024
                error_report("%s not available", ti->name);
                exit(1);
            }
            vga_interface_type = t;
            break;
2025
        }
E
Eduardo Habkost 已提交
2026 2027
    }
    if (t == VGA_TYPE_MAX) {
2028
    invalid_vga:
2029
        error_report("unknown vga type: %s", p);
2030 2031
        exit(1);
    }
M
malc 已提交
2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044
    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;
    }
2045 2046
}

2047 2048 2049 2050 2051 2052 2053 2054 2055
typedef enum DisplayType {
    DT_DEFAULT,
    DT_CURSES,
    DT_SDL,
    DT_COCOA,
    DT_GTK,
    DT_NONE,
} DisplayType;

J
Jes Sorensen 已提交
2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073
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 {
2074
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2075 2076 2077 2078 2079 2080 2081 2082
                }
            } 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 {
2083
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2084 2085 2086 2087 2088 2089 2090 2091
                }
            } 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 {
2092
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2093 2094 2095 2096 2097 2098 2099 2100
                }
            } 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 {
2101
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2102
                }
2103 2104 2105 2106 2107 2108 2109 2110 2111
            } else if (strstart(opts, ",gl=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    request_opengl = 1;
                } else if (strstart(opts, "off", &nextopt)) {
                    request_opengl = 0;
                } else {
                    goto invalid_sdl_args;
                }
J
Jes Sorensen 已提交
2112
            } else {
2113
            invalid_sdl_args:
2114
                error_report("invalid SDL option string");
2115
                exit(1);
J
Jes Sorensen 已提交
2116 2117 2118 2119
            }
            opts = nextopt;
        }
#else
2120
        error_report("SDL support is disabled");
J
Jes Sorensen 已提交
2121 2122
        exit(1);
#endif
J
Jes Sorensen 已提交
2123
    } else if (strstart(p, "vnc", &opts)) {
2124
        if (*opts == '=') {
2125
            vnc_parse(opts + 1, &error_fatal);
2126
        } else {
2127
            error_report("VNC requires a display argument vnc=<display>");
J
Jes Sorensen 已提交
2128 2129
            exit(1);
        }
J
Jes Sorensen 已提交
2130 2131 2132 2133
    } else if (strstart(p, "curses", &opts)) {
#ifdef CONFIG_CURSES
        display = DT_CURSES;
#else
2134
        error_report("curses support is disabled");
J
Jes Sorensen 已提交
2135
        exit(1);
A
Anthony Liguori 已提交
2136 2137 2138 2139
#endif
    } else if (strstart(p, "gtk", &opts)) {
#ifdef CONFIG_GTK
        display = DT_GTK;
2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151
        while (*opts) {
            const char *nextopt;

            if (strstart(opts, ",grab_on_hover=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    grab_on_hover = true;
                } else if (strstart(opts, "off", &nextopt)) {
                    grab_on_hover = false;
                } else {
                    goto invalid_gtk_args;
                }
2152 2153 2154 2155 2156 2157 2158 2159 2160
            } else if (strstart(opts, ",gl=", &nextopt)) {
                opts = nextopt;
                if (strstart(opts, "on", &nextopt)) {
                    request_opengl = 1;
                } else if (strstart(opts, "off", &nextopt)) {
                    request_opengl = 0;
                } else {
                    goto invalid_gtk_args;
                }
2161 2162
            } else {
            invalid_gtk_args:
2163
                error_report("invalid GTK option string");
2164 2165 2166 2167
                exit(1);
            }
            opts = nextopt;
        }
A
Anthony Liguori 已提交
2168
#else
2169
        error_report("GTK support is disabled");
A
Anthony Liguori 已提交
2170
        exit(1);
J
Jes Sorensen 已提交
2171
#endif
J
Jes Sorensen 已提交
2172 2173
    } else if (strstart(p, "none", &opts)) {
        display = DT_NONE;
J
Jes Sorensen 已提交
2174
    } else {
2175
        error_report("unknown display type");
J
Jes Sorensen 已提交
2176 2177 2178 2179 2180 2181
        exit(1);
    }

    return display;
}

2182 2183
static int balloon_parse(const char *arg)
{
2184
    QemuOpts *opts;
2185

2186 2187 2188 2189 2190 2191 2192
    if (strcmp(arg, "none") == 0) {
        return 0;
    }

    if (!strncmp(arg, "virtio", 6)) {
        if (arg[6] == ',') {
            /* have params -> parse them */
2193 2194
            opts = qemu_opts_parse_noisily(qemu_find_opts("device"), arg + 7,
                                           false);
2195 2196 2197 2198
            if (!opts)
                return  -1;
        } else {
            /* create empty opts */
2199 2200
            opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                    &error_abort);
2201
        }
2202
        qemu_opt_set(opts, "driver", "virtio-balloon", &error_abort);
2203
        return 0;
2204
    }
2205 2206

    return -1;
2207 2208
}

P
Paul Brook 已提交
2209 2210
char *qemu_find_file(int type, const char *name)
{
2211
    int i;
P
Paul Brook 已提交
2212 2213 2214
    const char *subdir;
    char *buf;

2215 2216
    /* Try the name as a straight path first */
    if (access(name, R_OK) == 0) {
2217
        trace_load_file(name, name);
2218
        return g_strdup(name);
P
Paul Brook 已提交
2219
    }
2220

P
Paul Brook 已提交
2221 2222 2223 2224 2225 2226 2227 2228 2229 2230
    switch (type) {
    case QEMU_FILE_TYPE_BIOS:
        subdir = "";
        break;
    case QEMU_FILE_TYPE_KEYMAP:
        subdir = "keymaps/";
        break;
    default:
        abort();
    }
2231 2232 2233 2234 2235 2236 2237

    for (i = 0; i < data_dir_idx; i++) {
        buf = g_strdup_printf("%s/%s%s", data_dir[i], subdir, name);
        if (access(buf, R_OK) == 0) {
            trace_load_file(name, buf);
            return buf;
        }
2238
        g_free(buf);
P
Paul Brook 已提交
2239
    }
2240
    return NULL;
P
Paul Brook 已提交
2241 2242
}

2243 2244 2245 2246 2247
static inline bool nonempty_str(const char *str)
{
    return str && *str;
}

2248 2249 2250 2251
static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
{
    gchar *buf;
    size_t size;
2252
    const char *name, *file, *str;
G
Gerd Hoffmann 已提交
2253
    FWCfgState *fw_cfg = (FWCfgState *) opaque;
2254

G
Gerd Hoffmann 已提交
2255
    if (fw_cfg == NULL) {
2256 2257 2258 2259 2260
        error_report("fw_cfg device not available");
        return -1;
    }
    name = qemu_opt_get(opts, "name");
    file = qemu_opt_get(opts, "file");
2261 2262 2263 2264 2265 2266 2267 2268 2269
    str = qemu_opt_get(opts, "string");

    /* we need name and either a file or the content string */
    if (!(nonempty_str(name) && (nonempty_str(file) || nonempty_str(str)))) {
        error_report("invalid argument(s)");
        return -1;
    }
    if (nonempty_str(file) && nonempty_str(str)) {
        error_report("file and string are mutually exclusive");
2270 2271 2272 2273 2274 2275 2276
        return -1;
    }
    if (strlen(name) > FW_CFG_MAX_FILE_PATH - 1) {
        error_report("name too long (max. %d char)", FW_CFG_MAX_FILE_PATH - 1);
        return -1;
    }
    if (strncmp(name, "opt/", 4) != 0) {
2277
        error_report("warning: externally provided fw_cfg item names "
2278
                     "should be prefixed with \"opt/\"");
2279
    }
2280 2281 2282 2283 2284 2285 2286 2287
    if (nonempty_str(str)) {
        size = strlen(str); /* NUL terminator NOT included in fw_cfg blob */
        buf = g_memdup(str, size);
    } else {
        if (!g_file_get_contents(file, &buf, &size, NULL)) {
            error_report("can't load %s", file);
            return -1;
        }
2288
    }
G
Gerd Hoffmann 已提交
2289 2290 2291 2292
    /* For legacy, keep user files in a specific global order. */
    fw_cfg_set_order_override(fw_cfg, FW_CFG_ORDER_OVERRIDE_USER);
    fw_cfg_add_file(fw_cfg, name, buf, size);
    fw_cfg_reset_order_override(fw_cfg);
2293 2294 2295
    return 0;
}

2296
static int device_help_func(void *opaque, QemuOpts *opts, Error **errp)
2297 2298 2299 2300
{
    return qdev_device_help(opts);
}

2301
static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
G
Gerd Hoffmann 已提交
2302
{
2303
    Error *err = NULL;
G
Gerd Hoffmann 已提交
2304 2305
    DeviceState *dev;

2306 2307 2308
    dev = qdev_device_add(opts, &err);
    if (!dev) {
        error_report_err(err);
G
Gerd Hoffmann 已提交
2309
        return -1;
2310
    }
2311
    object_unref(OBJECT(dev));
G
Gerd Hoffmann 已提交
2312 2313 2314
    return 0;
}

2315
static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
2316
{
2317
    Error *local_err = NULL;
2318

M
Marc-André Lureau 已提交
2319
    qemu_chr_new_from_opts(opts, &local_err);
2320
    if (local_err) {
2321
        error_report_err(local_err);
2322
        return -1;
2323
    }
2324 2325 2326
    return 0;
}

2327
#ifdef CONFIG_VIRTFS
2328
static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp)
2329
{
2330
    return qemu_fsdev_add(opts);
2331 2332 2333
}
#endif

2334
static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
2335
{
2336
    Chardev *chr;
2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349
    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 {
2350
        error_report("unknown monitor mode \"%s\"", mode);
2351 2352 2353
        exit(1);
    }

2354 2355 2356
    if (qemu_opt_get_bool(opts, "pretty", 0))
        flags |= MONITOR_USE_PRETTY;

2357 2358 2359
    if (qemu_opt_get_bool(opts, "default", 0)) {
        error_report("option 'default' does nothing and is deprecated");
    }
2360 2361 2362 2363

    chardev = qemu_opt_get(opts, "chardev");
    chr = qemu_chr_find(chardev);
    if (chr == NULL) {
2364
        error_report("chardev \"%s\" not found", chardev);
2365 2366 2367 2368 2369 2370 2371
        exit(1);
    }

    monitor_init(chr, flags);
    return 0;
}

M
Max Reitz 已提交
2372
static void monitor_parse(const char *optarg, const char *mode, bool pretty)
2373 2374 2375 2376 2377 2378 2379 2380 2381
{
    static int monitor_device_index = 0;
    QemuOpts *opts;
    const char *p;
    char label[32];

    if (strstart(optarg, "chardev:", &p)) {
        snprintf(label, sizeof(label), "%s", p);
    } else {
2382 2383
        snprintf(label, sizeof(label), "compat_monitor%d",
                 monitor_device_index);
2384 2385
        opts = qemu_chr_parse_compat(label, optarg);
        if (!opts) {
2386
            error_report("parse error: %s", optarg);
2387 2388 2389 2390
            exit(1);
        }
    }

2391
    opts = qemu_opts_create(qemu_find_opts("mon"), label, 1, &error_fatal);
2392 2393
    qemu_opt_set(opts, "mode", mode, &error_abort);
    qemu_opt_set(opts, "chardev", label, &error_abort);
2394
    qemu_opt_set_bool(opts, "pretty", pretty, &error_abort);
2395 2396 2397
    monitor_device_index++;
}

2398 2399
struct device_config {
    enum {
G
Gerd Hoffmann 已提交
2400 2401 2402 2403 2404
        DEV_USB,       /* -usbdevice     */
        DEV_BT,        /* -bt            */
        DEV_SERIAL,    /* -serial        */
        DEV_PARALLEL,  /* -parallel      */
        DEV_VIRTCON,   /* -virtioconsole */
2405
        DEV_DEBUGCON,  /* -debugcon */
2406
        DEV_GDB,       /* -gdb, -s */
2407
        DEV_SCLP,      /* s390 sclp */
2408 2409
    } type;
    const char *cmdline;
2410
    Location loc;
B
Blue Swirl 已提交
2411
    QTAILQ_ENTRY(device_config) next;
2412
};
B
Blue Swirl 已提交
2413 2414 2415

static QTAILQ_HEAD(, device_config) device_configs =
    QTAILQ_HEAD_INITIALIZER(device_configs);
2416 2417 2418 2419 2420

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

2421
    conf = g_malloc0(sizeof(*conf));
2422 2423
    conf->type = type;
    conf->cmdline = cmdline;
2424
    loc_save(&conf->loc);
B
Blue Swirl 已提交
2425
    QTAILQ_INSERT_TAIL(&device_configs, conf, next);
2426 2427 2428 2429 2430 2431 2432
}

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

B
Blue Swirl 已提交
2433
    QTAILQ_FOREACH(conf, &device_configs, next) {
2434 2435
        if (conf->type != type)
            continue;
2436
        loc_push_restore(&conf->loc);
2437
        rc = func(conf->cmdline);
2438
        loc_pop(&conf->loc);
G
Gonglei 已提交
2439
        if (rc) {
2440
            return rc;
G
Gonglei 已提交
2441
        }
2442 2443 2444 2445
    }
    return 0;
}

2446 2447 2448 2449 2450 2451 2452 2453
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) {
2454
        error_report("too many serial ports");
2455 2456 2457
        exit(1);
    }
    snprintf(label, sizeof(label), "serial%d", index);
M
Marc-André Lureau 已提交
2458
    serial_hds[index] = qemu_chr_new(label, devname);
2459
    if (!serial_hds[index]) {
2460 2461
        error_report("could not connect serial device"
                     " to character backend '%s'", devname);
2462 2463 2464 2465 2466 2467
        return -1;
    }
    index++;
    return 0;
}

G
Gerd Hoffmann 已提交
2468 2469 2470 2471 2472 2473 2474 2475
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) {
2476
        error_report("too many parallel ports");
G
Gerd Hoffmann 已提交
2477 2478 2479
        exit(1);
    }
    snprintf(label, sizeof(label), "parallel%d", index);
M
Marc-André Lureau 已提交
2480
    parallel_hds[index] = qemu_chr_new(label, devname);
G
Gerd Hoffmann 已提交
2481
    if (!parallel_hds[index]) {
2482 2483
        error_report("could not connect parallel device"
                     " to character backend '%s'", devname);
G
Gerd Hoffmann 已提交
2484 2485 2486 2487 2488 2489
        return -1;
    }
    index++;
    return 0;
}

G
Gerd Hoffmann 已提交
2490 2491
static int virtcon_parse(const char *devname)
{
2492
    QemuOptsList *device = qemu_find_opts("device");
G
Gerd Hoffmann 已提交
2493 2494
    static int index = 0;
    char label[32];
2495
    QemuOpts *bus_opts, *dev_opts;
G
Gerd Hoffmann 已提交
2496 2497 2498 2499

    if (strcmp(devname, "none") == 0)
        return 0;
    if (index == MAX_VIRTIO_CONSOLES) {
2500
        error_report("too many virtio consoles");
G
Gerd Hoffmann 已提交
2501 2502
        exit(1);
    }
2503

2504
    bus_opts = qemu_opts_create(device, NULL, 0, &error_abort);
P
Pierre Morel 已提交
2505
    qemu_opt_set(bus_opts, "driver", "virtio-serial", &error_abort);
2506

2507
    dev_opts = qemu_opts_create(device, NULL, 0, &error_abort);
2508
    qemu_opt_set(dev_opts, "driver", "virtconsole", &error_abort);
2509

G
Gerd Hoffmann 已提交
2510
    snprintf(label, sizeof(label), "virtcon%d", index);
M
Marc-André Lureau 已提交
2511
    virtcon_hds[index] = qemu_chr_new(label, devname);
G
Gerd Hoffmann 已提交
2512
    if (!virtcon_hds[index]) {
2513 2514
        error_report("could not connect virtio console"
                     " to character backend '%s'", devname);
G
Gerd Hoffmann 已提交
2515 2516
        return -1;
    }
2517
    qemu_opt_set(dev_opts, "chardev", label, &error_abort);
2518

G
Gerd Hoffmann 已提交
2519 2520 2521 2522
    index++;
    return 0;
}

2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533
static int sclp_parse(const char *devname)
{
    QemuOptsList *device = qemu_find_opts("device");
    static int index = 0;
    char label[32];
    QemuOpts *dev_opts;

    if (strcmp(devname, "none") == 0) {
        return 0;
    }
    if (index == MAX_SCLP_CONSOLES) {
2534
        error_report("too many sclp consoles");
2535 2536 2537 2538 2539 2540
        exit(1);
    }

    assert(arch_type == QEMU_ARCH_S390X);

    dev_opts = qemu_opts_create(device, NULL, 0, NULL);
2541
    qemu_opt_set(dev_opts, "driver", "sclpconsole", &error_abort);
2542 2543

    snprintf(label, sizeof(label), "sclpcon%d", index);
M
Marc-André Lureau 已提交
2544
    sclp_hds[index] = qemu_chr_new(label, devname);
2545
    if (!sclp_hds[index]) {
2546 2547
        error_report("could not connect sclp console"
                     " to character backend '%s'", devname);
2548 2549
        return -1;
    }
2550
    qemu_opt_set(dev_opts, "chardev", label, &error_abort);
2551 2552 2553 2554 2555

    index++;
    return 0;
}

2556
static int debugcon_parse(const char *devname)
L
Laszlo Ersek 已提交
2557
{
2558 2559
    QemuOpts *opts;

M
Marc-André Lureau 已提交
2560
    if (!qemu_chr_new("debugcon", devname)) {
2561 2562
        exit(1);
    }
2563
    opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1, NULL);
2564
    if (!opts) {
2565
        error_report("already have a debugcon device");
2566 2567
        exit(1);
    }
2568 2569
    qemu_opt_set(opts, "driver", "isa-debugcon", &error_abort);
    qemu_opt_set(opts, "chardev", "debugcon", &error_abort);
2570 2571 2572
    return 0;
}

2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607
static gint machine_class_cmp(gconstpointer a, gconstpointer b)
{
    const MachineClass *mc1 = a, *mc2 = b;
    int res;

    if (mc1->family == NULL) {
        if (mc2->family == NULL) {
            /* Compare standalone machine types against each other; they sort
             * in increasing order.
             */
            return strcmp(object_class_get_name(OBJECT_CLASS(mc1)),
                          object_class_get_name(OBJECT_CLASS(mc2)));
        }

        /* Standalone machine types sort after families. */
        return 1;
    }

    if (mc2->family == NULL) {
        /* Families sort before standalone machine types. */
        return -1;
    }

    /* Families sort between each other alphabetically increasingly. */
    res = strcmp(mc1->family, mc2->family);
    if (res != 0) {
        return res;
    }

    /* Within the same family, machine types sort in decreasing order. */
    return strcmp(object_class_get_name(OBJECT_CLASS(mc2)),
                  object_class_get_name(OBJECT_CLASS(mc1)));
}

 static MachineClass *machine_parse(const char *name)
2608
{
2609
    MachineClass *mc = NULL;
2610
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
2611 2612

    if (name) {
2613
        mc = find_machine(name);
2614
    }
2615
    if (mc) {
2616
        g_slist_free(machines);
2617
        return mc;
2618
    }
2619
    if (name && !is_help_option(name)) {
2620
        error_report("unsupported machine type");
2621
        error_printf("Use -machine help to list supported machines\n");
2622 2623
    } else {
        printf("Supported machines are:\n");
2624
        machines = g_slist_sort(machines, machine_class_cmp);
2625 2626
        for (el = machines; el; el = el->next) {
            MachineClass *mc = el->data;
2627 2628
            if (mc->alias) {
                printf("%-20s %s (alias of %s)\n", mc->alias, mc->desc, mc->name);
2629
            }
2630 2631
            printf("%-20s %s%s\n", mc->name, mc->desc,
                   mc->is_default ? " (default)" : "");
2632 2633
        }
    }
2634 2635

    g_slist_free(machines);
2636
    exit(!name || !is_help_option(name));
2637 2638
}

G
Gerd Hoffmann 已提交
2639 2640 2641 2642 2643 2644 2645
void qemu_add_exit_notifier(Notifier *notify)
{
    notifier_list_add(&exit_notifiers, notify);
}

void qemu_remove_exit_notifier(Notifier *notify)
{
P
Paolo Bonzini 已提交
2646
    notifier_remove(notify);
G
Gerd Hoffmann 已提交
2647 2648 2649 2650
}

static void qemu_run_exit_notifiers(void)
{
2651
    notifier_list_notify(&exit_notifiers, NULL);
G
Gerd Hoffmann 已提交
2652 2653
}

2654 2655
static bool machine_init_done;

2656 2657 2658
void qemu_add_machine_init_done_notifier(Notifier *notify)
{
    notifier_list_add(&machine_init_done_notifiers, notify);
2659 2660 2661
    if (machine_init_done) {
        notify->notify(notify, NULL);
    }
2662 2663
}

2664 2665 2666 2667 2668
void qemu_remove_machine_init_done_notifier(Notifier *notify)
{
    notifier_remove(notify);
}

2669 2670
static void qemu_run_machine_init_done_notifiers(void)
{
2671
    notifier_list_notify(&machine_init_done_notifiers, NULL);
2672
    machine_init_done = true;
2673 2674
}

2675 2676 2677 2678 2679 2680 2681 2682
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;

2683
    loc_set_cmdline(argv, optind, 1);
2684 2685 2686 2687 2688 2689 2690
    optind++;
    /* Treat --foo the same as -foo.  */
    if (r[1] == '-')
        r++;
    popt = qemu_options;
    for(;;) {
        if (!popt->name) {
2691
            error_report("invalid option");
2692 2693 2694 2695 2696 2697 2698 2699
            exit(1);
        }
        if (!strcmp(popt->name, r + 1))
            break;
        popt++;
    }
    if (popt->flags & HAS_ARG) {
        if (optind >= argc) {
2700
            error_report("requires an argument");
2701 2702 2703
            exit(1);
        }
        optarg = argv[optind++];
2704
        loc_set_cmdline(argv, optind - 2, 2);
2705 2706 2707 2708 2709 2710 2711 2712 2713 2714
    } else {
        optarg = NULL;
    }

    *poptarg = optarg;
    *poptind = optind;

    return popt;
}

2715
static MachineClass *select_machine(void)
2716
{
2717
    MachineClass *machine_class = find_default_machine();
2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728
    const char *optarg;
    QemuOpts *opts;
    Location loc;

    loc_push_none(&loc);

    opts = qemu_get_machine_opts();
    qemu_opts_loc_restore(opts);

    optarg = qemu_opt_get(opts, "type");
    if (optarg) {
2729
        machine_class = machine_parse(optarg);
2730 2731
    }

2732
    if (!machine_class) {
2733 2734 2735 2736 2737 2738
        error_report("No machine specified, and there is no default");
        error_printf("Use -machine help to list supported machines\n");
        exit(1);
    }

    loc_pop(&loc);
2739
    return machine_class;
2740 2741
}

2742 2743 2744
static int machine_set_property(void *opaque,
                                const char *name, const char *value,
                                Error **errp)
2745 2746 2747
{
    Object *obj = OBJECT(opaque);
    Error *local_err = NULL;
2748
    char *p, *qom_name;
2749

2750
    if (strcmp(name, "type") == 0) {
2751 2752 2753
        return 0;
    }

2754
    qom_name = g_strdup(name);
2755 2756 2757
    for (p = qom_name; *p; p++) {
        if (*p == '_') {
            *p = '-';
2758 2759 2760
        }
    }

2761
    object_property_parse(obj, value, qom_name, &local_err);
2762
    g_free(qom_name);
2763 2764

    if (local_err) {
2765
        error_report_err(local_err);
2766 2767 2768 2769 2770 2771
        return -1;
    }

    return 0;
}

2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784

/*
 * Initial object creation happens before all other
 * QEMU data types are created. The majority of objects
 * can be created at this point. The rng-egd object
 * cannot be created here, as it depends on the chardev
 * already existing.
 */
static bool object_create_initial(const char *type)
{
    if (g_str_equal(type, "rng-egd")) {
        return false;
    }
Y
Yang Hongyang 已提交
2785

2786 2787 2788 2789 2790
    /*
     * return false for concrete netfilters since
     * they depend on netdevs already existing
     */
    if (g_str_equal(type, "filter-buffer") ||
Z
Zhang Chen 已提交
2791
        g_str_equal(type, "filter-dump") ||
2792
        g_str_equal(type, "filter-mirror") ||
2793
        g_str_equal(type, "filter-redirector") ||
2794
        g_str_equal(type, "colo-compare") ||
2795 2796
        g_str_equal(type, "filter-rewriter") ||
        g_str_equal(type, "filter-replay")) {
Y
Yang Hongyang 已提交
2797 2798 2799
        return false;
    }

2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812
    /* Memory allocation by backends needs to be done
     * after configure_accelerator() (due to the tcg_enabled()
     * checks at memory_region_init_*()).
     *
     * Also, allocation of large amounts of memory may delay
     * chardev initialization for too long, and trigger timeouts
     * on software that waits for a monitor socket to be created
     * (e.g. libvirt).
     */
    if (g_str_has_prefix(type, "memory-backend-")) {
        return false;
    }

2813 2814 2815 2816 2817 2818
    return true;
}


/*
 * The remainder of object creation happens after the
2819
 * creation of chardev, fsdev, net clients and device data types.
2820 2821 2822 2823 2824 2825 2826
 */
static bool object_create_delayed(const char *type)
{
    return !object_create_initial(type);
}


2827 2828
static void set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
                               MachineClass *mc)
2829 2830 2831 2832
{
    uint64_t sz;
    const char *mem_str;
    const char *maxmem_str, *slots_str;
2833
    const ram_addr_t default_ram_size = mc->default_ram_size;
2834
    QemuOpts *opts = qemu_find_opts_singleton("memory");
2835 2836 2837 2838
    Location loc;

    loc_push_none(&loc);
    qemu_opts_loc_restore(opts);
2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874

    sz = 0;
    mem_str = qemu_opt_get(opts, "size");
    if (mem_str) {
        if (!*mem_str) {
            error_report("missing 'size' option value");
            exit(EXIT_FAILURE);
        }

        sz = qemu_opt_get_size(opts, "size", ram_size);

        /* Fix up legacy suffix-less format */
        if (g_ascii_isdigit(mem_str[strlen(mem_str) - 1])) {
            uint64_t overflow_check = sz;

            sz <<= 20;
            if ((sz >> 20) != overflow_check) {
                error_report("too large 'size' option value");
                exit(EXIT_FAILURE);
            }
        }
    }

    /* backward compatibility behaviour for case "-m 0" */
    if (sz == 0) {
        sz = default_ram_size;
    }

    sz = QEMU_ALIGN_UP(sz, 8192);
    ram_size = sz;
    if (ram_size != sz) {
        error_report("ram size too large");
        exit(EXIT_FAILURE);
    }

    /* store value for the future use */
2875
    qemu_opt_set_number(opts, "size", ram_size, &error_abort);
2876 2877 2878 2879 2880 2881 2882 2883
    *maxram_size = ram_size;

    maxmem_str = qemu_opt_get(opts, "maxmem");
    slots_str = qemu_opt_get(opts, "slots");
    if (maxmem_str && slots_str) {
        uint64_t slots;

        sz = qemu_opt_get_size(opts, "maxmem", 0);
2884
        slots = qemu_opt_get_number(opts, "slots", 0);
2885
        if (sz < ram_size) {
2886 2887 2888 2889
            error_report("invalid value of -m option maxmem: "
                         "maximum memory size (0x%" PRIx64 ") must be at least "
                         "the initial memory size (0x" RAM_ADDR_FMT ")",
                         sz, ram_size);
2890
            exit(EXIT_FAILURE);
2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901
        } else if (sz > ram_size) {
            if (!slots) {
                error_report("invalid value of -m option: maxmem was "
                             "specified, but no hotplug slots were specified");
                exit(EXIT_FAILURE);
            }
        } else if (slots) {
            error_report("invalid value of -m option maxmem: "
                         "memory slots were specified but maximum memory size "
                         "(0x%" PRIx64 ") is equal to the initial memory size "
                         "(0x" RAM_ADDR_FMT ")", sz, ram_size);
2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912
            exit(EXIT_FAILURE);
        }

        *maxram_size = sz;
        *ram_slots = slots;
    } else if ((!maxmem_str && slots_str) ||
            (maxmem_str && !slots_str)) {
        error_report("invalid -m option value: missing "
                "'%s' option", slots_str ? "maxmem" : "slots");
        exit(EXIT_FAILURE);
    }
2913 2914

    loc_pop(&loc);
2915 2916
}

2917 2918 2919 2920 2921 2922 2923 2924 2925
static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
    GlobalProperty *g;

    g = g_malloc0(sizeof(*g));
    g->driver   = qemu_opt_get(opts, "driver");
    g->property = qemu_opt_get(opts, "property");
    g->value    = qemu_opt_get(opts, "value");
    g->user_provided = true;
2926
    g->errp = &error_fatal;
2927 2928 2929 2930
    qdev_prop_register_global(g);
    return 0;
}

2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942
static int qemu_read_default_config_file(void)
{
    int ret;

    ret = qemu_read_config_file(CONFIG_QEMU_CONFDIR "/qemu.conf");
    if (ret < 0 && ret != -ENOENT) {
        return ret;
    }

    return 0;
}

M
malc 已提交
2943
int main(int argc, char **argv, char **envp)
2944
{
T
ths 已提交
2945
    int i;
2946
    int snapshot, linux_boot;
B
bellard 已提交
2947
    const char *initrd_filename;
2948
    const char *kernel_filename, *kernel_cmdline;
2949 2950
    const char *boot_order = NULL;
    const char *boot_once = NULL;
2951
    DisplayState *ds;
2952
    int cyls, heads, secs, translation;
2953 2954
    QemuOpts *opts, *machine_opts;
    QemuOpts *hda_opts = NULL, *icount_opts = NULL, *accel_opts = NULL;
2955
    QemuOptsList *olist;
2956
    int optind;
2957
    const char *optarg;
B
bellard 已提交
2958
    const char *loadvm = NULL;
2959
    MachineClass *machine_class;
2960
    const char *cpu_model;
2961
    const char *vga_model = NULL;
2962 2963
    const char *qtest_chrdev = NULL;
    const char *qtest_log = NULL;
2964
    const char *pid_file = NULL;
A
aliguori 已提交
2965
    const char *incoming = NULL;
2966
    bool defconfig = true;
2967
    bool userconfig = true;
2968
    bool nographic = false;
2969
    DisplayType display_type = DT_DEFAULT;
2970
    int display_remote = 0;
2971 2972
    const char *log_mask = NULL;
    const char *log_file = NULL;
2973
    char *trace_file = NULL;
2974
    ram_addr_t maxram_size;
2975
    uint64_t ram_slots = 0;
2976
    FILE *vmstate_dump_file = NULL;
2977
    Error *main_loop_err = NULL;
2978
    Error *err = NULL;
2979
    bool list_data_dirs = false;
2980 2981 2982 2983 2984 2985 2986
    typedef struct BlockdevOptions_queue {
        BlockdevOptions *bdo;
        Location loc;
        QSIMPLEQ_ENTRY(BlockdevOptions_queue) entry;
    } BlockdevOptions_queue;
    QSIMPLEQ_HEAD(, BlockdevOptions_queue) bdo_queue
        = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
2987

2988 2989
    module_call_init(MODULE_INIT_TRACE);

2990
    qemu_init_cpu_list();
2991 2992 2993
    qemu_init_cpu_loop();
    qemu_mutex_lock_iothread();

G
Gerd Hoffmann 已提交
2994
    atexit(qemu_run_exit_notifiers);
2995
    error_set_progname(argv[0]);
2996
    qemu_init_exec_dir(argv[0]);
2997

2998
    module_call_init(MODULE_INIT_QOM);
2999
    monitor_init_qmp_commands();
3000

3001
    qemu_add_opts(&qemu_drive_opts);
3002 3003 3004
    qemu_add_drive_opts(&qemu_legacy_drive_opts);
    qemu_add_drive_opts(&qemu_common_drive_opts);
    qemu_add_drive_opts(&qemu_drive_opts);
3005
    qemu_add_drive_opts(&bdrv_runtime_opts);
3006 3007 3008 3009 3010 3011 3012 3013 3014 3015
    qemu_add_opts(&qemu_chardev_opts);
    qemu_add_opts(&qemu_device_opts);
    qemu_add_opts(&qemu_netdev_opts);
    qemu_add_opts(&qemu_net_opts);
    qemu_add_opts(&qemu_rtc_opts);
    qemu_add_opts(&qemu_global_opts);
    qemu_add_opts(&qemu_mon_opts);
    qemu_add_opts(&qemu_trace_opts);
    qemu_add_opts(&qemu_option_rom_opts);
    qemu_add_opts(&qemu_machine_opts);
3016
    qemu_add_opts(&qemu_accel_opts);
I
Igor Mammedov 已提交
3017
    qemu_add_opts(&qemu_mem_opts);
3018
    qemu_add_opts(&qemu_smp_opts);
3019 3020 3021 3022
    qemu_add_opts(&qemu_boot_opts);
    qemu_add_opts(&qemu_sandbox_opts);
    qemu_add_opts(&qemu_add_fd_opts);
    qemu_add_opts(&qemu_object_opts);
3023
    qemu_add_opts(&qemu_tpmdev_opts);
3024
    qemu_add_opts(&qemu_realtime_opts);
S
Seiji Aguchi 已提交
3025
    qemu_add_opts(&qemu_msg_opts);
3026
    qemu_add_opts(&qemu_name_opts);
3027
    qemu_add_opts(&qemu_numa_opts);
3028
    qemu_add_opts(&qemu_icount_opts);
3029
    qemu_add_opts(&qemu_semihosting_config_opts);
3030
    qemu_add_opts(&qemu_fw_cfg_opts);
3031
    module_call_init(MODULE_INIT_OPTS);
3032

3033 3034
    runstate_init();

3035
    if (qcrypto_init(&err) < 0) {
3036
        error_reportf_err(err, "cannot initialize crypto: ");
3037 3038
        exit(1);
    }
3039
    rtc_clock = QEMU_CLOCK_HOST;
J
Jan Kiszka 已提交
3040

B
Blue Swirl 已提交
3041
    QLIST_INIT (&vm_change_state_head);
3042
    os_setup_early_signal_handling();
3043

3044
    cpu_model = NULL;
3045
    snapshot = 0;
3046 3047
    cyls = heads = secs = 0;
    translation = BIOS_ATA_TRANSLATION_AUTO;
3048

B
bellard 已提交
3049
    nb_nics = 0;
3050

3051 3052
    bdrv_init_with_whitelist();

3053
    autostart = 1;
3054

3055 3056 3057 3058 3059
    /* first pass of option parsing */
    optind = 1;
    while (optind < argc) {
        if (argv[optind][0] != '-') {
            /* disk image */
3060
            optind++;
3061 3062 3063 3064 3065 3066
        } else {
            const QEMUOption *popt;

            popt = lookup_opt(argc, argv, &optarg, &optind);
            switch (popt->index) {
            case QEMU_OPTION_nodefconfig:
3067
                defconfig = false;
3068
                break;
3069 3070 3071
            case QEMU_OPTION_nouserconfig:
                userconfig = false;
                break;
3072 3073 3074 3075
            }
        }
    }

3076 3077
    if (defconfig && userconfig) {
        if (qemu_read_default_config_file() < 0) {
3078
            exit(1);
3079 3080 3081 3082
        }
    }

    /* second pass of option parsing */
3083
    optind = 1;
3084
    for(;;) {
3085
        if (optind >= argc)
3086
            break;
3087
        if (argv[optind][0] != '-') {
3088
            hda_opts = drive_add(IF_DEFAULT, 0, argv[optind++], HD_OPTS);
3089 3090 3091
        } else {
            const QEMUOption *popt;

3092
            popt = lookup_opt(argc, argv, &optarg, &optind);
3093
            if (!(popt->arch_mask & arch_type)) {
3094
                error_report("Option not supported for this target");
3095 3096
                exit(1);
            }
3097
            switch(popt->index) {
3098 3099
            case QEMU_OPTION_no_kvm_irqchip: {
                olist = qemu_find_opts("machine");
3100
                qemu_opts_parse_noisily(olist, "kernel_irqchip=off", false);
3101 3102
                break;
            }
3103 3104
            case QEMU_OPTION_cpu:
                /* hw initialization will check this */
3105
                cpu_model = optarg;
3106
                break;
3107
            case QEMU_OPTION_hda:
3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122
                {
                    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 ?
                                 ",trans=lba" :
                                 translation == BIOS_ATA_TRANSLATION_NONE ?
                                 ",trans=none" : "");
                    drive_add(IF_DEFAULT, 0, optarg, buf);
                    break;
                }
3123
            case QEMU_OPTION_hdb:
3124 3125
            case QEMU_OPTION_hdc:
            case QEMU_OPTION_hdd:
3126 3127
                drive_add(IF_DEFAULT, popt->index - QEMU_OPTION_hda, optarg,
                          HD_OPTS);
B
bellard 已提交
3128
                break;
3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147
            case QEMU_OPTION_blockdev:
                {
                    Visitor *v;
                    BlockdevOptions_queue *bdo;

                    v = qobject_input_visitor_new_str(optarg, "driver", &err);
                    if (!v) {
                        error_report_err(err);
                        exit(1);
                    }

                    bdo = g_new(BlockdevOptions_queue, 1);
                    visit_type_BlockdevOptions(v, NULL, &bdo->bdo,
                                               &error_fatal);
                    visit_free(v);
                    loc_save(&bdo->loc);
                    QSIMPLEQ_INSERT_TAIL(&bdo_queue, bdo, entry);
                    break;
                }
T
ths 已提交
3148
            case QEMU_OPTION_drive:
3149 3150 3151
                if (drive_def(optarg) == NULL) {
                    exit(1);
                }
3152
                break;
G
Gerd Hoffmann 已提交
3153 3154 3155
            case QEMU_OPTION_set:
                if (qemu_set_option(optarg) != 0)
                    exit(1);
3156
                break;
3157 3158 3159
            case QEMU_OPTION_global:
                if (qemu_global_option(optarg) != 0)
                    exit(1);
3160
                break;
3161
            case QEMU_OPTION_mtdblock:
3162
                drive_add(IF_MTD, -1, optarg, MTD_OPTS);
3163
                break;
3164
            case QEMU_OPTION_sd:
3165
                drive_add(IF_SD, -1, optarg, SD_OPTS);
3166
                break;
3167
            case QEMU_OPTION_pflash:
3168
                drive_add(IF_PFLASH, -1, optarg, PFLASH_OPTS);
3169
                break;
3170
            case QEMU_OPTION_snapshot:
3171 3172
                snapshot = 1;
                break;
3173
            case QEMU_OPTION_hdachs:
3174 3175 3176 3177
                {
                    const char *p;
                    p = optarg;
                    cyls = strtol(p, (char **)&p, 0);
B
bellard 已提交
3178 3179
                    if (cyls < 1 || cyls > 16383)
                        goto chs_fail;
3180 3181 3182 3183
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    heads = strtol(p, (char **)&p, 0);
B
bellard 已提交
3184 3185
                    if (heads < 1 || heads > 16)
                        goto chs_fail;
3186 3187 3188 3189
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    secs = strtol(p, (char **)&p, 0);
B
bellard 已提交
3190 3191 3192 3193
                    if (secs < 1 || secs > 63)
                        goto chs_fail;
                    if (*p == ',') {
                        p++;
3194 3195 3196 3197 3198
                        if (!strcmp(p, "large")) {
                            translation = BIOS_ATA_TRANSLATION_LARGE;
                        } else if (!strcmp(p, "rechs")) {
                            translation = BIOS_ATA_TRANSLATION_RECHS;
                        } else if (!strcmp(p, "none")) {
B
bellard 已提交
3199
                            translation = BIOS_ATA_TRANSLATION_NONE;
3200
                        } else if (!strcmp(p, "lba")) {
B
bellard 已提交
3201
                            translation = BIOS_ATA_TRANSLATION_LBA;
3202
                        } else if (!strcmp(p, "auto")) {
B
bellard 已提交
3203
                            translation = BIOS_ATA_TRANSLATION_AUTO;
3204
                        } else {
B
bellard 已提交
3205
                            goto chs_fail;
3206
                        }
B
bellard 已提交
3207
                    } else if (*p != '\0') {
3208
                    chs_fail:
3209
                        error_report("invalid physical CHS format");
B
bellard 已提交
3210
                        exit(1);
3211
                    }
3212
                    if (hda_opts != NULL) {
3213 3214 3215 3216 3217 3218
                        qemu_opt_set_number(hda_opts, "cyls", cyls,
                                            &error_abort);
                        qemu_opt_set_number(hda_opts, "heads", heads,
                                            &error_abort);
                        qemu_opt_set_number(hda_opts, "secs", secs,
                                            &error_abort);
3219
                        if (translation == BIOS_ATA_TRANSLATION_LARGE) {
3220 3221
                            qemu_opt_set(hda_opts, "trans", "large",
                                         &error_abort);
3222
                        } else if (translation == BIOS_ATA_TRANSLATION_RECHS) {
3223 3224
                            qemu_opt_set(hda_opts, "trans", "rechs",
                                         &error_abort);
3225
                        } else if (translation == BIOS_ATA_TRANSLATION_LBA) {
3226 3227
                            qemu_opt_set(hda_opts, "trans", "lba",
                                         &error_abort);
3228
                        } else if (translation == BIOS_ATA_TRANSLATION_NONE) {
3229 3230
                            qemu_opt_set(hda_opts, "trans", "none",
                                         &error_abort);
3231
                        }
G
Gerd Hoffmann 已提交
3232
                    }
3233 3234
                }
                break;
3235
            case QEMU_OPTION_numa:
3236 3237
                opts = qemu_opts_parse_noisily(qemu_find_opts("numa"),
                                               optarg, true);
3238 3239 3240
                if (!opts) {
                    exit(1);
                }
3241
                break;
J
Jes Sorensen 已提交
3242 3243 3244
            case QEMU_OPTION_display:
                display_type = select_display(optarg);
                break;
3245
            case QEMU_OPTION_nographic:
3246 3247 3248 3249
                olist = qemu_find_opts("machine");
                qemu_opts_parse_noisily(olist, "graphics=off", false);
                nographic = true;
                display_type = DT_NONE;
3250
                break;
B
balrog 已提交
3251
            case QEMU_OPTION_curses:
3252
#ifdef CONFIG_CURSES
3253
                display_type = DT_CURSES;
3254
#else
3255
                error_report("curses support is disabled");
3256
                exit(1);
B
balrog 已提交
3257
#endif
3258
                break;
3259
            case QEMU_OPTION_portrait:
3260 3261 3262 3263 3264 3265
                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) {
3266
                    error_report("only 90, 180, 270 deg rotation is available");
3267 3268
                    exit(1);
                }
3269
                break;
3270
            case QEMU_OPTION_kernel:
3271 3272
                qemu_opts_set(qemu_find_opts("machine"), 0, "kernel", optarg,
                              &error_abort);
3273 3274
                break;
            case QEMU_OPTION_initrd:
3275 3276
                qemu_opts_set(qemu_find_opts("machine"), 0, "initrd", optarg,
                              &error_abort);
3277
                break;
3278
            case QEMU_OPTION_append:
3279 3280
                qemu_opts_set(qemu_find_opts("machine"), 0, "append", optarg,
                              &error_abort);
3281
                break;
G
Grant Likely 已提交
3282
            case QEMU_OPTION_dtb:
3283 3284
                qemu_opts_set(qemu_find_opts("machine"), 0, "dtb", optarg,
                              &error_abort);
G
Grant Likely 已提交
3285
                break;
3286
            case QEMU_OPTION_cdrom:
3287
                drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS);
3288
                break;
3289
            case QEMU_OPTION_boot:
3290 3291
                opts = qemu_opts_parse_noisily(qemu_find_opts("boot-opts"),
                                               optarg, true);
3292 3293
                if (!opts) {
                    exit(1);
3294 3295
                }
                break;
3296 3297
            case QEMU_OPTION_fda:
            case QEMU_OPTION_fdb:
3298 3299
                drive_add(IF_FLOPPY, popt->index - QEMU_OPTION_fda,
                          optarg, FD_OPTS);
3300
                break;
B
bellard 已提交
3301 3302 3303
            case QEMU_OPTION_no_fd_bootchk:
                fd_bootchk = 0;
                break;
M
Mark McLoughlin 已提交
3304
            case QEMU_OPTION_netdev:
3305
                default_net = 0;
3306
                if (net_client_parse(qemu_find_opts("netdev"), optarg) == -1) {
M
Mark McLoughlin 已提交
3307 3308 3309
                    exit(1);
                }
                break;
B
bellard 已提交
3310
            case QEMU_OPTION_net:
3311
                default_net = 0;
3312
                if (net_client_parse(qemu_find_opts("net"), optarg) == -1) {
3313 3314
                    exit(1);
                }
B
bellard 已提交
3315
                break;
3316 3317
#ifdef CONFIG_LIBISCSI
            case QEMU_OPTION_iscsi:
3318 3319
                opts = qemu_opts_parse_noisily(qemu_find_opts("iscsi"),
                                               optarg, false);
3320 3321 3322 3323 3324
                if (!opts) {
                    exit(1);
                }
                break;
#endif
B
bellard 已提交
3325 3326
#ifdef CONFIG_SLIRP
            case QEMU_OPTION_tftp:
3327 3328
                error_report("The -tftp option is deprecated. "
                             "Please use '-netdev user,tftp=...' instead.");
3329
                legacy_tftp_prefix = optarg;
B
bellard 已提交
3330
                break;
3331
            case QEMU_OPTION_bootp:
3332 3333
                error_report("The -bootp option is deprecated. "
                             "Please use '-netdev user,bootfile=...' instead.");
3334
                legacy_bootp_filename = optarg;
3335
                break;
B
bellard 已提交
3336
            case QEMU_OPTION_redir:
3337 3338
                error_report("The -redir option is deprecated. "
                             "Please use '-netdev user,hostfwd=...' instead.");
M
Markus Armbruster 已提交
3339 3340
                if (net_slirp_redir(optarg) < 0)
                    exit(1);
B
bellard 已提交
3341
                break;
B
bellard 已提交
3342
#endif
3343
            case QEMU_OPTION_bt:
3344
                add_device_config(DEV_BT, optarg);
3345
                break;
3346 3347 3348 3349 3350 3351 3352
            case QEMU_OPTION_audio_help:
                AUD_help ();
                exit (0);
                break;
            case QEMU_OPTION_soundhw:
                select_soundhw (optarg);
                break;
3353
            case QEMU_OPTION_h:
3354
                help(0);
3355
                break;
P
pbrook 已提交
3356 3357 3358 3359
            case QEMU_OPTION_version:
                version();
                exit(0);
                break;
3360
            case QEMU_OPTION_m:
3361 3362
                opts = qemu_opts_parse_noisily(qemu_find_opts("memory"),
                                               optarg, true);
I
Igor Mammedov 已提交
3363 3364 3365
                if (!opts) {
                    exit(EXIT_FAILURE);
                }
3366
                break;
3367 3368 3369 3370 3371 3372 3373
#ifdef CONFIG_TPM
            case QEMU_OPTION_tpmdev:
                if (tpm_config_parse(qemu_find_opts("tpmdev"), optarg) < 0) {
                    exit(1);
                }
                break;
#endif
3374 3375 3376 3377 3378 3379
            case QEMU_OPTION_mempath:
                mem_path = optarg;
                break;
            case QEMU_OPTION_mem_prealloc:
                mem_prealloc = 1;
                break;
3380
            case QEMU_OPTION_d:
3381 3382 3383 3384
                log_mask = optarg;
                break;
            case QEMU_OPTION_D:
                log_file = optarg;
3385
                break;
3386
            case QEMU_OPTION_DFILTER:
3387
                qemu_set_dfilter_ranges(optarg, &error_fatal);
3388
                break;
3389
            case QEMU_OPTION_s:
3390
                add_device_config(DEV_GDB, "tcp::" DEFAULT_GDBSTUB_PORT);
3391
                break;
3392
            case QEMU_OPTION_gdb:
3393
                add_device_config(DEV_GDB, optarg);
3394 3395
                break;
            case QEMU_OPTION_L:
3396 3397 3398
                if (is_help_option(optarg)) {
                    list_data_dirs = true;
                } else if (data_dir_idx < ARRAY_SIZE(data_dir)) {
3399 3400
                    data_dir[data_dir_idx++] = optarg;
                }
3401
                break;
3402
            case QEMU_OPTION_bios:
3403 3404
                qemu_opts_set(qemu_find_opts("machine"), 0, "firmware", optarg,
                              &error_abort);
3405
                break;
3406 3407 3408
            case QEMU_OPTION_singlestep:
                singlestep = 1;
                break;
3409
            case QEMU_OPTION_S:
3410
                autostart = 0;
3411
                break;
3412 3413 3414
            case QEMU_OPTION_k:
                keyboard_layout = optarg;
                break;
B
bellard 已提交
3415 3416 3417
            case QEMU_OPTION_localtime:
                rtc_utc = 0;
                break;
3418
            case QEMU_OPTION_vga:
B
Blue Swirl 已提交
3419
                vga_model = optarg;
3420
                default_vga = 0;
3421
                break;
3422 3423 3424 3425 3426 3427 3428 3429
            case QEMU_OPTION_g:
                {
                    const char *p;
                    int w, h, depth;
                    p = optarg;
                    w = strtol(p, (char **)&p, 10);
                    if (w <= 0) {
                    graphic_error:
3430
                        error_report("invalid resolution or depth");
3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441
                        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);
3442
                        if (depth != 8 && depth != 15 && depth != 16 &&
3443 3444 3445 3446 3447 3448 3449
                            depth != 24 && depth != 32)
                            goto graphic_error;
                    } else if (*p == '\0') {
                        depth = graphic_depth;
                    } else {
                        goto graphic_error;
                    }
3450

3451 3452 3453 3454 3455
                    graphic_width = w;
                    graphic_height = h;
                    graphic_depth = depth;
                }
                break;
T
ths 已提交
3456 3457 3458 3459 3460 3461 3462 3463
            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 已提交
3464
            case QEMU_OPTION_monitor:
G
Gerd Hoffmann 已提交
3465
                default_monitor = 0;
3466
                if (strncmp(optarg, "none", 4)) {
M
Max Reitz 已提交
3467
                    monitor_parse(optarg, "readline", false);
3468
                }
G
Gerd Hoffmann 已提交
3469 3470
                break;
            case QEMU_OPTION_qmp:
M
Max Reitz 已提交
3471 3472 3473 3474 3475
                monitor_parse(optarg, "control", false);
                default_monitor = 0;
                break;
            case QEMU_OPTION_qmp_pretty:
                monitor_parse(optarg, "control", true);
3476
                default_monitor = 0;
B
bellard 已提交
3477
                break;
G
Gerd Hoffmann 已提交
3478
            case QEMU_OPTION_mon:
3479 3480
                opts = qemu_opts_parse_noisily(qemu_find_opts("mon"), optarg,
                                               true);
G
Gerd Hoffmann 已提交
3481 3482 3483
                if (!opts) {
                    exit(1);
                }
3484
                default_monitor = 0;
G
Gerd Hoffmann 已提交
3485
                break;
3486
            case QEMU_OPTION_chardev:
3487 3488
                opts = qemu_opts_parse_noisily(qemu_find_opts("chardev"),
                                               optarg, true);
3489 3490 3491 3492
                if (!opts) {
                    exit(1);
                }
                break;
3493
            case QEMU_OPTION_fsdev:
3494 3495
                olist = qemu_find_opts("fsdev");
                if (!olist) {
3496
                    error_report("fsdev support is disabled");
3497 3498
                    exit(1);
                }
3499
                opts = qemu_opts_parse_noisily(olist, optarg, true);
3500 3501 3502 3503
                if (!opts) {
                    exit(1);
                }
                break;
3504
            case QEMU_OPTION_virtfs: {
3505 3506
                QemuOpts *fsdev;
                QemuOpts *device;
3507
                const char *writeout, *sock_fd, *socket;
3508

3509 3510
                olist = qemu_find_opts("virtfs");
                if (!olist) {
3511
                    error_report("virtfs support is disabled");
3512 3513
                    exit(1);
                }
3514
                opts = qemu_opts_parse_noisily(olist, optarg, true);
3515 3516 3517 3518
                if (!opts) {
                    exit(1);
                }

3519
                if (qemu_opt_get(opts, "fsdriver") == NULL ||
3520
                    qemu_opt_get(opts, "mount_tag") == NULL) {
3521
                    error_report("Usage: -virtfs fsdriver,mount_tag=tag");
3522 3523
                    exit(1);
                }
3524
                fsdev = qemu_opts_create(qemu_find_opts("fsdev"),
3525 3526
                                         qemu_opt_get(opts, "mount_tag"),
                                         1, NULL);
3527
                if (!fsdev) {
3528 3529
                    error_report("duplicate fsdev id: %s",
                                 qemu_opt_get(opts, "mount_tag"));
3530 3531
                    exit(1);
                }
3532 3533 3534 3535

                writeout = qemu_opt_get(opts, "writeout");
                if (writeout) {
#ifdef CONFIG_SYNC_FILE_RANGE
3536
                    qemu_opt_set(fsdev, "writeout", writeout, &error_abort);
3537
#else
3538 3539
                    error_report("writeout=immediate not supported "
                                 "on this platform");
3540 3541 3542
                    exit(1);
#endif
                }
3543 3544 3545 3546
                qemu_opt_set(fsdev, "fsdriver",
                             qemu_opt_get(opts, "fsdriver"), &error_abort);
                qemu_opt_set(fsdev, "path", qemu_opt_get(opts, "path"),
                             &error_abort);
3547
                qemu_opt_set(fsdev, "security_model",
3548 3549
                             qemu_opt_get(opts, "security_model"),
                             &error_abort);
3550 3551
                socket = qemu_opt_get(opts, "socket");
                if (socket) {
3552
                    qemu_opt_set(fsdev, "socket", socket, &error_abort);
3553
                }
3554 3555
                sock_fd = qemu_opt_get(opts, "sock_fd");
                if (sock_fd) {
3556
                    qemu_opt_set(fsdev, "sock_fd", sock_fd, &error_abort);
3557
                }
3558

3559
                qemu_opt_set_bool(fsdev, "readonly",
3560 3561
                                  qemu_opt_get_bool(opts, "readonly", 0),
                                  &error_abort);
3562 3563
                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                          &error_abort);
3564
                qemu_opt_set(device, "driver", "virtio-9p-pci", &error_abort);
3565
                qemu_opt_set(device, "fsdev",
3566
                             qemu_opt_get(opts, "mount_tag"), &error_abort);
3567
                qemu_opt_set(device, "mount_tag",
3568
                             qemu_opt_get(opts, "mount_tag"), &error_abort);
3569 3570
                break;
            }
3571 3572 3573 3574
            case QEMU_OPTION_virtfs_synth: {
                QemuOpts *fsdev;
                QemuOpts *device;

3575 3576
                fsdev = qemu_opts_create(qemu_find_opts("fsdev"), "v_synth",
                                         1, NULL);
3577
                if (!fsdev) {
3578
                    error_report("duplicate option: %s", "virtfs_synth");
3579 3580
                    exit(1);
                }
3581
                qemu_opt_set(fsdev, "fsdriver", "synth", &error_abort);
3582

3583 3584
                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                          &error_abort);
3585 3586 3587
                qemu_opt_set(device, "driver", "virtio-9p-pci", &error_abort);
                qemu_opt_set(device, "fsdev", "v_synth", &error_abort);
                qemu_opt_set(device, "mount_tag", "v_synth", &error_abort);
3588 3589
                break;
            }
B
bellard 已提交
3590
            case QEMU_OPTION_serial:
3591 3592
                add_device_config(DEV_SERIAL, optarg);
                default_serial = 0;
3593 3594 3595
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
B
bellard 已提交
3596
                break;
R
Richard W.M. Jones 已提交
3597
            case QEMU_OPTION_watchdog:
M
Markus Armbruster 已提交
3598
                if (watchdog) {
3599
                    error_report("only one watchdog option may be given");
M
Markus Armbruster 已提交
3600 3601 3602
                    return 1;
                }
                watchdog = optarg;
R
Richard W.M. Jones 已提交
3603 3604 3605
                break;
            case QEMU_OPTION_watchdog_action:
                if (select_watchdog_action(optarg) == -1) {
3606
                    error_report("unknown -watchdog-action parameter");
R
Richard W.M. Jones 已提交
3607 3608 3609
                    exit(1);
                }
                break;
3610
            case QEMU_OPTION_virtiocon:
G
Gerd Hoffmann 已提交
3611 3612
                add_device_config(DEV_VIRTCON, optarg);
                default_virtcon = 0;
3613 3614 3615
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
3616
                break;
3617
            case QEMU_OPTION_parallel:
G
Gerd Hoffmann 已提交
3618 3619
                add_device_config(DEV_PARALLEL, optarg);
                default_parallel = 0;
3620 3621 3622
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
3623
                break;
3624 3625 3626
            case QEMU_OPTION_debugcon:
                add_device_config(DEV_DEBUGCON, optarg);
                break;
3627 3628 3629
            case QEMU_OPTION_loadvm:
                loadvm = optarg;
                break;
B
bellard 已提交
3630 3631 3632
            case QEMU_OPTION_full_screen:
                full_screen = 1;
                break;
3633 3634 3635
            case QEMU_OPTION_no_frame:
                no_frame = 1;
                break;
T
ths 已提交
3636 3637 3638
            case QEMU_OPTION_alt_grab:
                alt_grab = 1;
                break;
3639 3640 3641
            case QEMU_OPTION_ctrl_grab:
                ctrl_grab = 1;
                break;
T
ths 已提交
3642 3643 3644
            case QEMU_OPTION_no_quit:
                no_quit = 1;
                break;
3645
            case QEMU_OPTION_sdl:
3646
#ifdef CONFIG_SDL
3647
                display_type = DT_SDL;
3648
                break;
3649
#else
3650
                error_report("SDL support is disabled");
3651
                exit(1);
T
ths 已提交
3652
#endif
B
bellard 已提交
3653
            case QEMU_OPTION_pidfile:
3654
                pid_file = optarg;
B
bellard 已提交
3655
                break;
3656 3657 3658
            case QEMU_OPTION_win2k_hack:
                win2k_install_hack = 1;
                break;
3659
            case QEMU_OPTION_rtc_td_hack: {
3660 3661 3662 3663
                static GlobalProperty slew_lost_ticks = {
                    .driver   = "mc146818rtc",
                    .property = "lost_tick_policy",
                    .value    = "slew",
3664 3665
                };

3666
                qdev_prop_register_global(&slew_lost_ticks);
3667
                break;
3668
            }
3669
            case QEMU_OPTION_acpitable:
3670 3671
                opts = qemu_opts_parse_noisily(qemu_find_opts("acpi"),
                                               optarg, true);
3672 3673 3674
                if (!opts) {
                    exit(1);
                }
3675
                acpi_table_add(opts, &error_fatal);
3676
                break;
3677
            case QEMU_OPTION_smbios:
3678 3679
                opts = qemu_opts_parse_noisily(qemu_find_opts("smbios"),
                                               optarg, false);
3680 3681 3682
                if (!opts) {
                    exit(1);
                }
3683
                smbios_entry_add(opts, &error_fatal);
3684
                break;
3685
            case QEMU_OPTION_fwcfg:
3686 3687
                opts = qemu_opts_parse_noisily(qemu_find_opts("fw_cfg"),
                                               optarg, true);
3688 3689 3690 3691
                if (opts == NULL) {
                    exit(1);
                }
                break;
A
aliguori 已提交
3692
            case QEMU_OPTION_enable_kvm:
3693
                olist = qemu_find_opts("machine");
3694
                qemu_opts_parse_noisily(olist, "accel=kvm", false);
3695
                break;
3696 3697 3698 3699
            case QEMU_OPTION_enable_hax:
                olist = qemu_find_opts("machine");
                qemu_opts_parse_noisily(olist, "accel=hax", false);
                break;
3700
            case QEMU_OPTION_M:
3701 3702
            case QEMU_OPTION_machine:
                olist = qemu_find_opts("machine");
3703
                opts = qemu_opts_parse_noisily(olist, optarg, true);
3704 3705 3706
                if (!opts) {
                    exit(1);
                }
A
aliguori 已提交
3707
                break;
J
Jan Kiszka 已提交
3708 3709
             case QEMU_OPTION_no_kvm:
                olist = qemu_find_opts("machine");
3710
                qemu_opts_parse_noisily(olist, "accel=tcg", false);
J
Jan Kiszka 已提交
3711
                break;
3712
            case QEMU_OPTION_no_kvm_pit: {
3713
                error_report("warning: ignoring deprecated option");
3714 3715
                break;
            }
3716
            case QEMU_OPTION_no_kvm_pit_reinjection: {
3717 3718 3719 3720
                static GlobalProperty kvm_pit_lost_tick_policy = {
                    .driver   = "kvm-pit",
                    .property = "lost_tick_policy",
                    .value    = "discard",
3721 3722
                };

3723 3724
                error_report("warning: deprecated, replaced by "
                             "-global kvm-pit.lost_tick_policy=discard");
3725
                qdev_prop_register_global(&kvm_pit_lost_tick_policy);
3726 3727
                break;
            }
3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747
            case QEMU_OPTION_accel:
                accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"),
                                                     optarg, true);
                optarg = qemu_opt_get(accel_opts, "accel");

                olist = qemu_find_opts("machine");
                if (strcmp("kvm", optarg) == 0) {
                    qemu_opts_parse_noisily(olist, "accel=kvm", false);
                } else if (strcmp("xen", optarg) == 0) {
                    qemu_opts_parse_noisily(olist, "accel=xen", false);
                } else if (strcmp("tcg", optarg) == 0) {
                    qemu_opts_parse_noisily(olist, "accel=tcg", false);
                } else {
                    if (!is_help_option(optarg)) {
                        error_printf("Unknown accelerator: %s", optarg);
                    }
                    error_printf("Supported accelerators: kvm, xen, tcg\n");
                    exit(1);
                }
                break;
B
bellard 已提交
3748
            case QEMU_OPTION_usb:
P
Peter Maydell 已提交
3749
                olist = qemu_find_opts("machine");
3750
                qemu_opts_parse_noisily(olist, "usb=on", false);
B
bellard 已提交
3751
                break;
B
bellard 已提交
3752
            case QEMU_OPTION_usbdevice:
P
Peter Maydell 已提交
3753
                olist = qemu_find_opts("machine");
3754
                qemu_opts_parse_noisily(olist, "usb=on", false);
3755 3756 3757
                add_device_config(DEV_USB, optarg);
                break;
            case QEMU_OPTION_device:
3758 3759
                if (!qemu_opts_parse_noisily(qemu_find_opts("device"),
                                             optarg, true)) {
G
Gerd Hoffmann 已提交
3760 3761
                    exit(1);
                }
B
bellard 已提交
3762
                break;
B
bellard 已提交
3763
            case QEMU_OPTION_smp:
3764 3765
                if (!qemu_opts_parse_noisily(qemu_find_opts("smp-opts"),
                                             optarg, true)) {
3766 3767
                    exit(1);
                }
B
bellard 已提交
3768
                break;
3769
            case QEMU_OPTION_vnc:
3770
                vnc_parse(optarg, &error_fatal);
J
Jes Sorensen 已提交
3771
                break;
B
bellard 已提交
3772 3773 3774
            case QEMU_OPTION_no_acpi:
                acpi_enabled = 0;
                break;
A
aliguori 已提交
3775 3776 3777
            case QEMU_OPTION_no_hpet:
                no_hpet = 1;
                break;
3778 3779
            case QEMU_OPTION_balloon:
                if (balloon_parse(optarg) < 0) {
3780
                    error_report("unknown -balloon argument %s", optarg);
3781 3782
                    exit(1);
                }
3783
                break;
B
bellard 已提交
3784 3785 3786
            case QEMU_OPTION_no_reboot:
                no_reboot = 1;
                break;
A
aurel32 已提交
3787 3788 3789
            case QEMU_OPTION_no_shutdown:
                no_shutdown = 1;
                break;
3790 3791 3792
            case QEMU_OPTION_show_cursor:
                cursor_hide = 0;
                break;
3793
            case QEMU_OPTION_uuid:
F
Fam Zheng 已提交
3794
                if (qemu_uuid_parse(optarg, &qemu_uuid) < 0) {
E
Eduardo Habkost 已提交
3795
                    error_report("failed to parse UUID string: wrong format");
3796 3797
                    exit(1);
                }
3798
                qemu_uuid_set = true;
3799
                break;
3800 3801
            case QEMU_OPTION_option_rom:
                if (nb_option_roms >= MAX_OPTION_ROMS) {
3802
                    error_report("too many option ROMs");
3803 3804
                    exit(1);
                }
3805 3806
                opts = qemu_opts_parse_noisily(qemu_find_opts("option-rom"),
                                               optarg, true);
3807 3808 3809
                if (!opts) {
                    exit(1);
                }
G
Gleb Natapov 已提交
3810 3811 3812 3813
                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) {
3814
                    error_report("Option ROM file is not specified");
G
Gleb Natapov 已提交
3815 3816
                    exit(1);
                }
3817 3818
                nb_option_roms++;
                break;
3819
            case QEMU_OPTION_semihosting:
3820 3821
                semihosting.enabled = true;
                semihosting.target = SEMIHOSTING_TARGET_AUTO;
3822 3823
                break;
            case QEMU_OPTION_semihosting_config:
3824
                semihosting.enabled = true;
3825 3826
                opts = qemu_opts_parse_noisily(qemu_find_opts("semihosting-config"),
                                               optarg, false);
3827
                if (opts != NULL) {
3828
                    semihosting.enabled = qemu_opt_get_bool(opts, "enable",
3829 3830 3831 3832
                                                            true);
                    const char *target = qemu_opt_get(opts, "target");
                    if (target != NULL) {
                        if (strcmp("native", target) == 0) {
3833
                            semihosting.target = SEMIHOSTING_TARGET_NATIVE;
3834
                        } else if (strcmp("gdb", target) == 0) {
3835
                            semihosting.target = SEMIHOSTING_TARGET_GDB;
3836
                        } else  if (strcmp("auto", target) == 0) {
3837
                            semihosting.target = SEMIHOSTING_TARGET_AUTO;
3838
                        } else {
3839
                            error_report("unsupported semihosting-config %s",
3840
                                         optarg);
3841 3842 3843
                            exit(1);
                        }
                    } else {
3844
                        semihosting.target = SEMIHOSTING_TARGET_AUTO;
3845
                    }
3846 3847 3848
                    /* Set semihosting argument count and vector */
                    qemu_opt_foreach(opts, add_semihosting_arg,
                                     &semihosting, NULL);
3849
                } else {
3850
                    error_report("unsupported semihosting-config %s", optarg);
3851 3852
                    exit(1);
                }
3853
                break;
3854
            case QEMU_OPTION_tdf:
3855
                error_report("warning: ignoring deprecated option");
3856
                break;
T
ths 已提交
3857
            case QEMU_OPTION_name:
3858 3859
                opts = qemu_opts_parse_noisily(qemu_find_opts("name"),
                                               optarg, true);
3860 3861 3862
                if (!opts) {
                    exit(1);
                }
T
ths 已提交
3863
                break;
B
blueswir1 已提交
3864 3865
            case QEMU_OPTION_prom_env:
                if (nb_prom_envs >= MAX_PROM_ENVS) {
3866
                    error_report("too many prom variables");
B
blueswir1 已提交
3867 3868 3869 3870 3871
                    exit(1);
                }
                prom_envs[nb_prom_envs] = optarg;
                nb_prom_envs++;
                break;
3872 3873
            case QEMU_OPTION_old_param:
                old_param = 1;
3874
                break;
3875
            case QEMU_OPTION_clock:
A
Alex Bligh 已提交
3876 3877 3878
                /* Clock options no longer exist.  Keep this option for
                 * backward compatibility.
                 */
3879
                break;
B
bellard 已提交
3880
            case QEMU_OPTION_startdate:
J
Jan Kiszka 已提交
3881 3882 3883
                configure_rtc_date_offset(optarg, 1);
                break;
            case QEMU_OPTION_rtc:
3884 3885
                opts = qemu_opts_parse_noisily(qemu_find_opts("rtc"), optarg,
                                               false);
J
Jan Kiszka 已提交
3886 3887
                if (!opts) {
                    exit(1);
B
bellard 已提交
3888
                }
J
Jan Kiszka 已提交
3889
                configure_rtc(opts);
B
bellard 已提交
3890
                break;
3891
            case QEMU_OPTION_tb_size:
3892 3893 3894 3895
                tcg_tb_size = strtol(optarg, NULL, 0);
                if (tcg_tb_size < 0) {
                    tcg_tb_size = 0;
                }
3896
                break;
P
pbrook 已提交
3897
            case QEMU_OPTION_icount:
3898 3899
                icount_opts = qemu_opts_parse_noisily(qemu_find_opts("icount"),
                                                      optarg, true);
3900 3901 3902
                if (!icount_opts) {
                    exit(1);
                }
P
pbrook 已提交
3903
                break;
A
aliguori 已提交
3904
            case QEMU_OPTION_incoming:
3905 3906 3907
                if (!incoming) {
                    runstate_set(RUN_STATE_INMIGRATE);
                }
A
aliguori 已提交
3908 3909
                incoming = optarg;
                break;
3910 3911 3912
            case QEMU_OPTION_only_migratable:
                only_migratable = 1;
                break;
3913
            case QEMU_OPTION_nodefaults:
3914
                has_defaults = 0;
3915
                break;
3916
            case QEMU_OPTION_xen_domid:
3917
                if (!(xen_available())) {
3918
                    error_report("Option not supported for this target");
3919 3920
                    exit(1);
                }
3921 3922 3923
                xen_domid = atoi(optarg);
                break;
            case QEMU_OPTION_xen_create:
3924
                if (!(xen_available())) {
3925
                    error_report("Option not supported for this target");
3926 3927
                    exit(1);
                }
3928 3929 3930
                xen_mode = XEN_CREATE;
                break;
            case QEMU_OPTION_xen_attach:
3931
                if (!(xen_available())) {
3932
                    error_report("Option not supported for this target");
3933 3934
                    exit(1);
                }
3935 3936
                xen_mode = XEN_ATTACH;
                break;
3937 3938 3939 3940 3941 3942 3943
            case QEMU_OPTION_xen_domid_restrict:
                if (!(xen_available())) {
                    error_report("Option not supported for this target");
                    exit(1);
                }
                xen_domid_restrict = true;
                break;
3944
            case QEMU_OPTION_trace:
3945 3946
                g_free(trace_file);
                trace_file = trace_opt_parse(optarg);
3947
                break;
3948 3949
            case QEMU_OPTION_readconfig:
                {
3950 3951
                    int ret = qemu_read_config_file(optarg);
                    if (ret < 0) {
3952 3953
                        error_report("read config %s: %s", optarg,
                                     strerror(-ret));
3954 3955 3956 3957
                        exit(1);
                    }
                    break;
                }
G
Gerd Hoffmann 已提交
3958 3959 3960
            case QEMU_OPTION_spice:
                olist = qemu_find_opts("spice");
                if (!olist) {
3961
                    error_report("spice support is disabled");
G
Gerd Hoffmann 已提交
3962 3963
                    exit(1);
                }
3964
                opts = qemu_opts_parse_noisily(olist, optarg, false);
G
Gerd Hoffmann 已提交
3965 3966 3967
                if (!opts) {
                    exit(1);
                }
G
Gerd Hoffmann 已提交
3968
                display_remote++;
G
Gerd Hoffmann 已提交
3969
                break;
3970 3971 3972 3973 3974 3975 3976 3977
            case QEMU_OPTION_writeconfig:
                {
                    FILE *fp;
                    if (strcmp(optarg, "-") == 0) {
                        fp = stdout;
                    } else {
                        fp = fopen(optarg, "w");
                        if (fp == NULL) {
3978 3979
                            error_report("open %s: %s", optarg,
                                         strerror(errno));
3980 3981 3982 3983
                            exit(1);
                        }
                    }
                    qemu_config_write(fp);
3984 3985 3986
                    if (fp != stdout) {
                        fclose(fp);
                    }
3987 3988
                    break;
                }
A
Anthony Liguori 已提交
3989 3990 3991 3992 3993 3994
            case QEMU_OPTION_qtest:
                qtest_chrdev = optarg;
                break;
            case QEMU_OPTION_qtest_log:
                qtest_log = optarg;
                break;
3995
            case QEMU_OPTION_sandbox:
3996 3997
                opts = qemu_opts_parse_noisily(qemu_find_opts("sandbox"),
                                               optarg, true);
3998
                if (!opts) {
3999
                    exit(1);
4000 4001
                }
                break;
4002 4003
            case QEMU_OPTION_add_fd:
#ifndef _WIN32
4004 4005
                opts = qemu_opts_parse_noisily(qemu_find_opts("add-fd"),
                                               optarg, false);
4006
                if (!opts) {
4007
                    exit(1);
4008 4009 4010 4011 4012 4013 4014
                }
#else
                error_report("File descriptor passing is disabled on this "
                             "platform");
                exit(1);
#endif
                break;
4015
            case QEMU_OPTION_object:
4016 4017
                opts = qemu_opts_parse_noisily(qemu_find_opts("object"),
                                               optarg, true);
4018 4019 4020
                if (!opts) {
                    exit(1);
                }
4021
                break;
4022
            case QEMU_OPTION_realtime:
4023 4024
                opts = qemu_opts_parse_noisily(qemu_find_opts("realtime"),
                                               optarg, false);
4025 4026 4027
                if (!opts) {
                    exit(1);
                }
4028
                enable_mlock = qemu_opt_get_bool(opts, "mlock", true);
4029
                break;
S
Seiji Aguchi 已提交
4030
            case QEMU_OPTION_msg:
4031 4032
                opts = qemu_opts_parse_noisily(qemu_find_opts("msg"), optarg,
                                               false);
S
Seiji Aguchi 已提交
4033 4034 4035 4036 4037
                if (!opts) {
                    exit(1);
                }
                configure_msg(opts);
                break;
4038
            case QEMU_OPTION_dump_vmstate:
4039
                if (vmstate_dump_file) {
4040 4041
                    error_report("only one '-dump-vmstate' "
                                 "option may be given");
4042 4043
                    exit(1);
                }
4044 4045
                vmstate_dump_file = fopen(optarg, "w");
                if (vmstate_dump_file == NULL) {
4046
                    error_report("open %s: %s", optarg, strerror(errno));
4047 4048 4049
                    exit(1);
                }
                break;
4050 4051
            default:
                os_parse_cmd_args(popt->index, optarg);
4052
            }
4053 4054
        }
    }
4055 4056 4057 4058 4059
    /*
     * Clear error location left behind by the loop.
     * Best done right after the loop.  Do not insert code here!
     */
    loc_set_none();
4060

P
Pavel Dovgalyuk 已提交
4061 4062
    replay_configure(icount_opts);

4063
    machine_class = select_machine();
4064 4065

    set_memory_options(&ram_slots, &maxram_size, machine_class);
4066

4067 4068
    os_daemonize();

4069 4070 4071 4072 4073
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
        error_report("could not acquire pid file: %s", strerror(errno));
        exit(1);
    }

4074
    if (qemu_init_main_loop(&main_loop_err)) {
4075
        error_report_err(main_loop_err);
P
Paolo Bonzini 已提交
4076 4077 4078
        exit(1);
    }

4079 4080
    if (qemu_opts_foreach(qemu_find_opts("sandbox"),
                          parse_sandbox, NULL, NULL)) {
4081 4082 4083
        exit(1);
    }

4084 4085
    if (qemu_opts_foreach(qemu_find_opts("name"),
                          parse_name, NULL, NULL)) {
4086 4087 4088
        exit(1);
    }

4089
#ifndef _WIN32
4090 4091
    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
                          parse_add_fd, NULL, NULL)) {
4092 4093 4094
        exit(1);
    }

4095 4096
    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
                          cleanup_add_fd, NULL, NULL)) {
4097 4098 4099 4100
        exit(1);
    }
#endif

4101 4102
    current_machine = MACHINE(object_new(object_class_get_name(
                          OBJECT_CLASS(machine_class))));
M
Marcel Apfelbaum 已提交
4103 4104 4105
    if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
        exit(0);
    }
4106 4107
    object_property_add_child(object_get_root(), "machine",
                              OBJECT(current_machine), &error_abort);
4108 4109 4110 4111 4112 4113 4114 4115 4116 4117

    if (machine_class->minimum_page_bits) {
        if (!set_preferred_target_page_bits(machine_class->minimum_page_bits)) {
            /* This would be a board error: specifying a minimum smaller than
             * a target's compile-time fixed setting.
             */
            g_assert_not_reached();
        }
    }

4118
    cpu_exec_init_all();
4119

4120
    if (machine_class->hw_version) {
4121
        qemu_set_hw_version(machine_class->hw_version);
4122 4123
    }

4124
    if (cpu_model && is_help_option(cpu_model)) {
E
Eduardo Habkost 已提交
4125
        list_cpus(stdout, &fprintf, cpu_model);
4126 4127 4128
        exit(0);
    }

D
Denis V. Lunev 已提交
4129 4130 4131
    if (!trace_init_backends()) {
        exit(1);
    }
4132 4133
    trace_init_file(trace_file);

4134
    /* Open the logfile at this point and set the log mask if necessary.
4135
     */
4136
    if (log_file) {
4137
        qemu_set_log_filename(log_file, &error_fatal);
4138 4139
    }

4140
    if (log_mask) {
4141 4142 4143 4144 4145 4146 4147
        int mask;
        mask = qemu_str_to_log_mask(log_mask);
        if (!mask) {
            qemu_print_log_usage(stdout);
            exit(1);
        }
        qemu_set_log(mask);
4148 4149
    } else {
        qemu_set_log(0);
4150
    }
4151

P
Paul Brook 已提交
4152 4153
    /* If no data_dir is specified then try to find it relative to the
       executable path.  */
4154
    if (data_dir_idx < ARRAY_SIZE(data_dir)) {
4155
        data_dir[data_dir_idx] = os_find_datadir();
4156 4157 4158
        if (data_dir[data_dir_idx] != NULL) {
            data_dir_idx++;
        }
P
Paul Brook 已提交
4159
    }
4160
    /* If all else fails use the install path specified when building. */
4161 4162
    if (data_dir_idx < ARRAY_SIZE(data_dir)) {
        data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR;
P
Paul Brook 已提交
4163 4164
    }

4165 4166 4167 4168 4169 4170 4171 4172
    /* -L help lists the data directories and exits. */
    if (list_data_dirs) {
        for (i = 0; i < data_dir_idx; i++) {
            printf("%s\n", data_dir[i]);
        }
        exit(0);
    }

4173
    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
4174

4175
    machine_class->max_cpus = machine_class->max_cpus ?: 1; /* Default to UP */
A
Andrew Jones 已提交
4176
    if (max_cpus > machine_class->max_cpus) {
4177 4178 4179
        error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
                     "supported by machine '%s' (%d)", max_cpus,
                     machine_class->name, machine_class->max_cpus);
4180 4181 4182
        exit(1);
    }

4183 4184 4185 4186
    /*
     * Get the default machine options from the machine if it is not already
     * specified either by the configuration file or by the command line.
     */
4187
    if (machine_class->default_machine_opts) {
4188
        qemu_opts_set_defaults(qemu_find_opts("machine"),
4189
                               machine_class->default_machine_opts, 0);
4190 4191
    }

4192 4193 4194 4195
    qemu_opts_foreach(qemu_find_opts("device"),
                      default_driver_check, NULL, NULL);
    qemu_opts_foreach(qemu_find_opts("global"),
                      default_driver_check, NULL, NULL);
4196

4197 4198 4199
    if (!vga_model && !default_vga) {
        vga_interface_type = VGA_DEVICE;
    }
4200
    if (!has_defaults || machine_class->no_serial) {
4201 4202
        default_serial = 0;
    }
4203
    if (!has_defaults || machine_class->no_parallel) {
4204 4205
        default_parallel = 0;
    }
4206
    if (!has_defaults || !machine_class->use_virtcon) {
4207 4208
        default_virtcon = 0;
    }
4209
    if (!has_defaults || !machine_class->use_sclp) {
4210 4211
        default_sclp = 0;
    }
4212
    if (!has_defaults || machine_class->no_floppy) {
G
Gerd Hoffmann 已提交
4213 4214
        default_floppy = 0;
    }
4215
    if (!has_defaults || machine_class->no_cdrom) {
G
Gerd Hoffmann 已提交
4216 4217
        default_cdrom = 0;
    }
4218
    if (!has_defaults || machine_class->no_sdcard) {
G
Gerd Hoffmann 已提交
4219 4220
        default_sdcard = 0;
    }
4221 4222 4223 4224 4225
    if (!has_defaults) {
        default_monitor = 0;
        default_net = 0;
        default_vga = 0;
    }
4226

4227 4228 4229 4230 4231 4232 4233 4234 4235 4236
    if (is_daemonized()) {
        /* According to documentation and historically, -nographic redirects
         * serial port, parallel port and monitor to stdio, which does not work
         * with -daemonize.  We can redirect these to null instead, but since
         * -nographic is legacy, let's just error out.
         * We disallow -nographic only if all other ports are not redirected
         * explicitly, to not break existing legacy setups which uses
         * -nographic _and_ redirects all ports explicitly - this is valid
         * usage, -nographic is just a no-op in this case.
         */
4237
        if (nographic
4238 4239
            && (default_parallel || default_serial
                || default_monitor || default_virtcon)) {
E
Eduardo Habkost 已提交
4240
            error_report("-nographic cannot be used with -daemonize");
4241 4242 4243 4244
            exit(1);
        }
#ifdef CONFIG_CURSES
        if (display_type == DT_CURSES) {
E
Eduardo Habkost 已提交
4245
            error_report("curses display cannot be used with -daemonize");
4246 4247 4248 4249 4250
            exit(1);
        }
#endif
    }

4251
    if (nographic) {
G
Gerd Hoffmann 已提交
4252 4253
        if (default_parallel)
            add_device_config(DEV_PARALLEL, "null");
G
Gerd Hoffmann 已提交
4254 4255
        if (default_serial && default_monitor) {
            add_device_config(DEV_SERIAL, "mon:stdio");
4256 4257
        } else if (default_virtcon && default_monitor) {
            add_device_config(DEV_VIRTCON, "mon:stdio");
4258 4259
        } else if (default_sclp && default_monitor) {
            add_device_config(DEV_SCLP, "mon:stdio");
G
Gerd Hoffmann 已提交
4260 4261 4262
        } else {
            if (default_serial)
                add_device_config(DEV_SERIAL, "stdio");
4263 4264
            if (default_virtcon)
                add_device_config(DEV_VIRTCON, "stdio");
4265 4266 4267
            if (default_sclp) {
                add_device_config(DEV_SCLP, "stdio");
            }
G
Gerd Hoffmann 已提交
4268
            if (default_monitor)
M
Max Reitz 已提交
4269
                monitor_parse("stdio", "readline", false);
G
Gerd Hoffmann 已提交
4270
        }
4271 4272 4273
    } else {
        if (default_serial)
            add_device_config(DEV_SERIAL, "vc:80Cx24C");
G
Gerd Hoffmann 已提交
4274 4275
        if (default_parallel)
            add_device_config(DEV_PARALLEL, "vc:80Cx24C");
G
Gerd Hoffmann 已提交
4276
        if (default_monitor)
M
Max Reitz 已提交
4277
            monitor_parse("vc:80Cx24C", "readline", false);
4278 4279
        if (default_virtcon)
            add_device_config(DEV_VIRTCON, "vc:80Cx24C");
4280 4281 4282
        if (default_sclp) {
            add_device_config(DEV_SCLP, "vc:80Cx24C");
        }
4283 4284
    }

G
Gerd Hoffmann 已提交
4285 4286 4287 4288 4289
#if defined(CONFIG_VNC)
    if (!QTAILQ_EMPTY(&(qemu_find_opts("vnc")->head))) {
        display_remote++;
    }
#endif
A
Anthony Liguori 已提交
4290 4291 4292
    if (display_type == DT_DEFAULT && !display_remote) {
#if defined(CONFIG_GTK)
        display_type = DT_GTK;
4293
#elif defined(CONFIG_SDL)
A
Anthony Liguori 已提交
4294
        display_type = DT_SDL;
4295 4296
#elif defined(CONFIG_COCOA)
        display_type = DT_COCOA;
A
Anthony Liguori 已提交
4297
#elif defined(CONFIG_VNC)
4298
        vnc_parse("localhost:0,to=99,id=default", &error_abort);
A
Anthony Liguori 已提交
4299 4300 4301 4302 4303
#else
        display_type = DT_NONE;
#endif
    }

4304
    if ((no_frame || alt_grab || ctrl_grab) && display_type != DT_SDL) {
4305 4306
        error_report("-no-frame, -alt-grab and -ctrl-grab are only valid "
                     "for SDL, ignoring option");
4307 4308
    }
    if (no_quit && (display_type != DT_GTK && display_type != DT_SDL)) {
4309 4310
        error_report("-no-quit is only valid for GTK and SDL, "
                     "ignoring option");
4311 4312
    }

A
Anthony Liguori 已提交
4313
    if (display_type == DT_GTK) {
4314
        early_gtk_display_init(request_opengl);
A
Anthony Liguori 已提交
4315
    }
E
Eduardo Habkost 已提交
4316

4317 4318 4319
    if (display_type == DT_SDL) {
        sdl_display_early_init(request_opengl);
    }
E
Eduardo Habkost 已提交
4320

M
Marc-André Lureau 已提交
4321 4322
    qemu_console_early_init();

4323 4324
    if (request_opengl == 1 && display_opengl == 0) {
#if defined(CONFIG_OPENGL)
4325
        error_report("OpenGL is not supported by the display");
4326
#else
4327
        error_report("OpenGL support is disabled");
4328 4329 4330
#endif
        exit(1);
    }
A
Anthony Liguori 已提交
4331

4332
    page_size_init();
T
TeLeMan 已提交
4333 4334
    socket_init();

4335
    if (qemu_opts_foreach(qemu_find_opts("object"),
4336
                          user_creatable_add_opts_foreach,
4337
                          object_create_initial, NULL)) {
4338
        exit(1);
4339 4340
    }

4341 4342 4343 4344 4345
    if (qemu_opts_foreach(qemu_find_opts("chardev"),
                          chardev_init_func, NULL, NULL)) {
        exit(1);
    }

4346
#ifdef CONFIG_VIRTFS
4347 4348
    if (qemu_opts_foreach(qemu_find_opts("fsdev"),
                          fsdev_init_func, NULL, NULL)) {
4349 4350 4351
        exit(1);
    }
#endif
4352

4353 4354
    if (qemu_opts_foreach(qemu_find_opts("device"),
                          device_help_func, NULL, NULL)) {
4355 4356 4357
        exit(0);
    }

4358
    machine_opts = qemu_get_machine_opts();
4359 4360
    if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
                         NULL)) {
4361 4362 4363 4364
        object_unref(OBJECT(current_machine));
        exit(1);
    }

4365
    configure_accelerator(current_machine);
M
Marcelo Tosatti 已提交
4366

4367
    if (qtest_chrdev) {
4368
        qtest_init(qtest_chrdev, qtest_log, &error_fatal);
4369 4370
    }

4371 4372 4373 4374
    machine_opts = qemu_get_machine_opts();
    kernel_filename = qemu_opt_get(machine_opts, "kernel");
    initrd_filename = qemu_opt_get(machine_opts, "initrd");
    kernel_cmdline = qemu_opt_get(machine_opts, "append");
G
Gerd Hoffmann 已提交
4375
    bios_name = qemu_opt_get(machine_opts, "firmware");
4376

4377 4378
    opts = qemu_opts_find(qemu_find_opts("boot-opts"), NULL);
    if (opts) {
4379 4380
        boot_order = qemu_opt_get(opts, "order");
        if (boot_order) {
4381
            validate_bootdevices(boot_order, &error_fatal);
4382 4383
        }

4384 4385
        boot_once = qemu_opt_get(opts, "once");
        if (boot_once) {
4386
            validate_bootdevices(boot_once, &error_fatal);
4387 4388 4389
        }

        boot_menu = qemu_opt_get_bool(opts, "menu", boot_menu);
4390
        boot_strict = qemu_opt_get_bool(opts, "strict", false);
4391 4392
    }

4393 4394 4395 4396
    if (!boot_order) {
        boot_order = machine_class->default_boot_order;
    }

4397 4398
    if (!kernel_cmdline) {
        kernel_cmdline = "";
4399
        current_machine->kernel_cmdline = (char *)kernel_cmdline;
4400 4401
    }

4402
    linux_boot = (kernel_filename != NULL);
B
balrog 已提交
4403

4404
    if (!linux_boot && *kernel_cmdline != '\0') {
4405
        error_report("-append only allowed with -kernel option");
4406 4407 4408 4409
        exit(1);
    }

    if (!linux_boot && initrd_filename != NULL) {
4410
        error_report("-initrd only allowed with -kernel option");
4411 4412 4413
        exit(1);
    }

4414 4415 4416 4417 4418
    if (semihosting_enabled() && !semihosting_get_argc() && kernel_filename) {
        /* fall back to the -kernel/-append */
        semihosting_arg_fallback(kernel_filename, kernel_cmdline);
    }

4419
    os_set_line_buffering();
4420

A
Alon Levy 已提交
4421 4422 4423
    /* spice needs the timers to be initialized by this point */
    qemu_spice_init();

4424
    cpu_ticks_init();
4425
    if (icount_opts) {
4426 4427
        if (!tcg_enabled()) {
            error_report("-icount is not allowed with hardware virtualization");
4428 4429 4430 4431
            exit(1);
        }
        configure_icount(icount_opts, &error_abort);
        qemu_opts_del(icount_opts);
4432
    }
4433

4434 4435
    qemu_tcg_configure(accel_opts, &error_fatal);

4436 4437 4438 4439 4440 4441 4442 4443
    if (default_net) {
        QemuOptsList *net = qemu_find_opts("net");
        qemu_opts_set(net, NULL, "type", "nic", &error_abort);
#ifdef CONFIG_SLIRP
        qemu_opts_set(net, NULL, "type", "user", &error_abort);
#endif
    }

4444 4445
    colo_info_init();

4446 4447
    if (net_init_clients() < 0) {
        exit(1);
B
bellard 已提交
4448
    }
B
bellard 已提交
4449

4450
    if (qemu_opts_foreach(qemu_find_opts("object"),
4451
                          user_creatable_add_opts_foreach,
4452
                          object_create_delayed, NULL)) {
4453 4454 4455
        exit(1);
    }

4456 4457 4458 4459 4460 4461
#ifdef CONFIG_TPM
    if (tpm_init() < 0) {
        exit(1);
    }
#endif

4462
    /* init the bluetooth world */
4463 4464
    if (foreach_device_config(DEV_BT, bt_parse))
        exit(1);
4465

4466 4467 4468
    if (!xen_enabled()) {
        /* On 32-bit hosts, QEMU is limited by virtual address space */
        if (ram_size > (2047 << 20) && HOST_LONG_BITS == 32) {
4469
            error_report("at most 2047 MB RAM can be simulated");
4470 4471 4472
            exit(1);
        }
    }
4473

L
lirans@il.ibm.com 已提交
4474
    blk_mig_init();
4475
    ram_mig_init();
L
lirans@il.ibm.com 已提交
4476

4477 4478 4479 4480 4481 4482 4483
    /* If the currently selected machine wishes to override the units-per-bus
     * property of its default HBA interface type, do so now. */
    if (machine_class->units_per_default_bus) {
        override_max_devs(machine_class->block_default_type,
                          machine_class->units_per_default_bus);
    }

T
ths 已提交
4484
    /* open the virtual block devices */
4485 4486 4487 4488 4489 4490 4491 4492 4493 4494
    while (!QSIMPLEQ_EMPTY(&bdo_queue)) {
        BlockdevOptions_queue *bdo = QSIMPLEQ_FIRST(&bdo_queue);

        QSIMPLEQ_REMOVE_HEAD(&bdo_queue, entry);
        loc_push_restore(&bdo->loc);
        qmp_blockdev_add(bdo->bdo, &error_fatal);
        loc_pop(&bdo->loc);
        qapi_free_BlockdevOptions(bdo->bdo);
        g_free(bdo);
    }
P
Pavel Dovgalyuk 已提交
4495 4496 4497 4498
    if (snapshot || replay_mode != REPLAY_MODE_NONE) {
        qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
                          NULL, NULL);
    }
4499
    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
4500
                          &machine_class->block_default_type, NULL)) {
G
Gerd Hoffmann 已提交
4501
        exit(1);
4502
    }
4503

4504
    default_drive(default_cdrom, snapshot, machine_class->block_default_type, 2,
4505 4506 4507
                  CDROM_OPTS);
    default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS);
    default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS);
4508

4509
    parse_numa_opts(machine_class);
4510

4511 4512
    if (qemu_opts_foreach(qemu_find_opts("mon"),
                          mon_init_func, NULL, NULL)) {
4513 4514 4515
        exit(1);
    }

4516 4517
    if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
        exit(1);
G
Gerd Hoffmann 已提交
4518 4519
    if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
        exit(1);
G
Gerd Hoffmann 已提交
4520 4521
    if (foreach_device_config(DEV_VIRTCON, virtcon_parse) < 0)
        exit(1);
4522 4523 4524
    if (foreach_device_config(DEV_SCLP, sclp_parse) < 0) {
        exit(1);
    }
4525 4526
    if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)
        exit(1);
4527

4528
    /* If no default VGA is requested, the default is "none".  */
4529
    if (default_vga) {
4530 4531
        if (machine_class->default_display) {
            vga_model = machine_class->default_display;
4532
        } else if (vga_interface_available(VGA_CIRRUS)) {
4533
            vga_model = "cirrus";
4534
        } else if (vga_interface_available(VGA_STD)) {
4535 4536
            vga_model = "std";
        }
B
Blue Swirl 已提交
4537
    }
4538 4539 4540
    if (vga_model) {
        select_vgahw(vga_model);
    }
B
Blue Swirl 已提交
4541

M
Markus Armbruster 已提交
4542 4543 4544 4545 4546 4547
    if (watchdog) {
        i = select_watchdog(watchdog);
        if (i > 0)
            exit (i == 1 ? 1 : 0);
    }

4548 4549
    machine_register_compat_props(current_machine);

4550 4551
    qemu_opts_foreach(qemu_find_opts("global"),
                      global_init_func, NULL, NULL);
4552

P
Pavel Dovgalyuk 已提交
4553 4554 4555 4556
    /* This checkpoint is required by replay to separate prior clock
       reading from the other reads, because timer polling functions query
       clock values from the log. */
    replay_checkpoint(CHECKPOINT_INIT);
4557 4558
    qdev_machine_init();

4559
    current_machine->ram_size = ram_size;
4560 4561
    current_machine->maxram_size = maxram_size;
    current_machine->ram_slots = ram_slots;
4562 4563 4564 4565
    current_machine->boot_order = boot_order;
    current_machine->cpu_model = cpu_model;

    machine_class->init(current_machine);
4566

4567 4568
    realtime_init();

4569 4570
    audio_init();

4571 4572 4573 4574
    if (hax_enabled()) {
        hax_sync_vcpus();
    }

4575 4576 4577 4578 4579
    if (qemu_opts_foreach(qemu_find_opts("fw_cfg"),
                          parse_fw_cfg, fw_cfg_find(), NULL) != 0) {
        exit(1);
    }

4580
    /* init USB devices */
E
Eduardo Habkost 已提交
4581
    if (machine_usb(current_machine)) {
M
Markus Armbruster 已提交
4582 4583
        if (foreach_device_config(DEV_USB, usb_parse) < 0)
            exit(1);
4584 4585
    }

4586 4587 4588
    /* Check if IGD GFX passthrough. */
    igd_gfx_passthru();

4589
    /* init generic devices */
G
Gerd Hoffmann 已提交
4590
    rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
4591 4592
    if (qemu_opts_foreach(qemu_find_opts("device"),
                          device_init_func, NULL, NULL)) {
4593
        exit(1);
4594
    }
4595

4596 4597
    cpu_synchronize_all_post_init();

4598 4599
    numa_post_machine_init();

G
Gerd Hoffmann 已提交
4600
    rom_reset_order_override();
4601

4602 4603 4604 4605 4606 4607 4608
    /*
     * Create frontends for -drive if=scsi leftovers.
     * Normally, frontends for -drive get created by machine
     * initialization for onboard SCSI HBAs.  However, we create a few
     * more ever since SCSI qdevification, but this is pretty much an
     * implementation accident, and deprecated.
     */
4609 4610
    scsi_legacy_handle_cmdline();

J
John Snow 已提交
4611 4612 4613
    /* Did we create any drives that we failed to create a device for? */
    drive_check_orphaned();

4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625
    /* Don't warn about the default network setup that you get if
     * no command line -net or -netdev options are specified. There
     * are two cases that we would otherwise complain about:
     * (1) board doesn't support a NIC but the implicit "-net nic"
     * requested one
     * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"
     * sets up a nic that isn't connected to anything.
     */
    if (!default_net) {
        net_check_clients();
    }

4626

4627
    if (boot_once) {
4628
        qemu_boot_set(boot_once, &error_fatal);
4629 4630 4631
        qemu_register_reset(restore_boot_order, g_strdup(boot_order));
    }

4632
    ds = init_displaystate();
4633

4634
    /* init local displays */
4635 4636
    switch (display_type) {
    case DT_CURSES:
4637
        curses_display_init(ds, full_screen);
4638 4639 4640 4641
        break;
    case DT_SDL:
        sdl_display_init(ds, full_screen, no_frame);
        break;
4642
    case DT_COCOA:
4643 4644
        cocoa_display_init(ds, full_screen);
        break;
A
Anthony Liguori 已提交
4645
    case DT_GTK:
4646
        gtk_display_init(ds, full_screen, grab_on_hover);
A
Anthony Liguori 已提交
4647
        break;
4648 4649 4650 4651
    default:
        break;
    }

4652 4653 4654
    /* must be after terminal init, SDL library changes signal handlers */
    os_setup_signal_handling();

4655
    /* init remote displays */
4656
#ifdef CONFIG_VNC
4657 4658
    qemu_opts_foreach(qemu_find_opts("vnc"),
                      vnc_init_func, NULL, NULL);
4659
#endif
E
Eduardo Habkost 已提交
4660

G
Gerd Hoffmann 已提交
4661 4662
    if (using_spice) {
        qemu_spice_display_init();
G
Gerd Hoffmann 已提交
4663
    }
4664

4665
    if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
4666
        exit(1);
4667 4668
    }

4669 4670
    qdev_machine_creation_done();

4671 4672 4673
    /* 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());
4674 4675
    qemu_run_machine_init_done_notifiers();

4676
    if (rom_check_and_register_reset() != 0) {
4677
        error_report("rom check and register reset failed");
4678 4679
        exit(1);
    }
4680

4681 4682
    replay_start();

P
Pavel Dovgalyuk 已提交
4683 4684 4685 4686
    /* This checkpoint is required by replay to separate prior clock
       reading from the other reads, because timer polling functions query
       clock values from the log. */
    replay_checkpoint(CHECKPOINT_RESET);
J
Jan Kiszka 已提交
4687
    qemu_system_reset(VMRESET_SILENT);
4688
    register_global_state();
4689 4690 4691
    if (replay_mode != REPLAY_MODE_NONE) {
        replay_vmstate_init();
    } else if (loadvm) {
4692
        if (load_vmstate(loadvm) < 0) {
4693 4694 4695
            autostart = 0;
        }
    }
B
bellard 已提交
4696

4697
    qdev_prop_check_globals();
4698 4699 4700 4701 4702
    if (vmstate_dump_file) {
        /* dump and exit */
        dump_vmstate_json_to_file(vmstate_dump_file);
        return 0;
    }
4703

G
Glauber Costa 已提交
4704
    if (incoming) {
4705 4706 4707
        Error *local_err = NULL;
        qemu_start_incoming_migration(incoming, &local_err);
        if (local_err) {
4708
            error_reportf_err(local_err, "-incoming %s: ", incoming);
4709
            exit(1);
J
Juan Quintela 已提交
4710
        }
4711
    } else if (autostart) {
4712
        vm_start();
4713
    }
4714

4715
    os_setup_post();
T
ths 已提交
4716

4717
    main_loop();
4718
    replay_disable_events();
4719
    iothread_stop_all();
4720

P
Paolo Bonzini 已提交
4721 4722
    bdrv_close_all();
    pause_all_vcpus();
W
wayne 已提交
4723
    res_free();
T
ths 已提交
4724

4725
    /* vhost-user must be cleaned up before chardevs.  */
4726
    net_cleanup();
4727
    audio_cleanup();
4728
    monitor_cleanup();
4729
    qemu_chr_cleanup();
4730
    /* TODO: unref root container, check all devices are ok */
4731

4732 4733
    return 0;
}