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

B
blueswir1 已提交
31 32
#include "config-host.h"

33
#ifdef CONFIG_SECCOMP
34
#include "sysemu/seccomp.h"
35 36
#endif

37 38 39 40
#if defined(CONFIG_VDE)
#include <libvdeplug.h>
#endif

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

54 55 56 57 58
#ifdef CONFIG_COCOA
#undef main
#define main qemu_main
#endif /* CONFIG_COCOA */

A
Anthony Liguori 已提交
59 60
#include <glib.h>

61
#include "qemu/error-report.h"
62
#include "qemu/sockets.h"
63 64
#include "hw/hw.h"
#include "hw/boards.h"
65
#include "sysemu/accel.h"
66
#include "hw/usb.h"
P
Paolo Bonzini 已提交
67 68
#include "hw/i386/pc.h"
#include "hw/isa/isa.h"
69
#include "hw/bt.h"
P
Paolo Bonzini 已提交
70
#include "sysemu/watchdog.h"
71
#include "hw/smbios/smbios.h"
P
Paolo Bonzini 已提交
72
#include "hw/xen/xen.h"
73
#include "hw/qdev.h"
74
#include "hw/loader.h"
75
#include "monitor/qdev.h"
76
#include "sysemu/bt.h"
P
Paolo Bonzini 已提交
77
#include "net/net.h"
78
#include "net/slirp.h"
79
#include "monitor/monitor.h"
80
#include "ui/console.h"
81
#include "sysemu/sysemu.h"
82
#include "sysemu/numa.h"
83
#include "exec/gdbstub.h"
84
#include "qemu/timer.h"
85
#include "sysemu/char.h"
M
Michael Tokarev 已提交
86
#include "qemu/bitmap.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/kvm.h"
95
#include "qapi/qmp/qjson.h"
96 97
#include "qemu/option.h"
#include "qemu/config-file.h"
98
#include "qemu-options.h"
L
Luiz Capitulino 已提交
99
#include "qmp-commands.h"
100
#include "qemu/main-loop.h"
101
#ifdef CONFIG_VIRTFS
102 103
#include "fsdev/qemu-fsdev.h"
#endif
104
#include "sysemu/qtest.h"
105

106
#include "disas/disas.h"
B
bellard 已提交
107

108

J
Jan Kiszka 已提交
109
#include "slirp/libslirp.h"
110

111
#include "trace.h"
112
#include "trace/control.h"
113
#include "qemu/queue.h"
114 115
#include "sysemu/cpus.h"
#include "sysemu/arch_init.h"
116
#include "qemu/osdep.h"
B
Blue Swirl 已提交
117

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

128
#define MAX_VIRTIO_CONSOLES 1
129
#define MAX_SCLP_CONSOLES 1
130

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

189
int icount_align_option;
190

191 192 193
/* The bytes in qemu_uuid[] are in the order specified by RFC4122, _not_ in the
 * little-endian "wire format" described in the SMBIOS 2.6 specification.
 */
194
uint8_t qemu_uuid[16];
195
bool qemu_uuid_set;
196

G
Gerd Hoffmann 已提交
197 198 199
static NotifierList exit_notifiers =
    NOTIFIER_LIST_INITIALIZER(exit_notifiers);

200 201 202
static NotifierList machine_init_done_notifiers =
    NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);

203
bool xen_allowed;
204 205 206
uint32_t xen_domid;
enum xen_mode xen_mode = XEN_EMULATE;

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

static struct {
    const char *driver;
    int *flag;
} default_list[] = {
G
Gerd Hoffmann 已提交
222 223
    { .driver = "isa-serial",           .flag = &default_serial    },
    { .driver = "isa-parallel",         .flag = &default_parallel  },
G
Gerd Hoffmann 已提交
224
    { .driver = "isa-fdc",              .flag = &default_floppy    },
225 226
    { .driver = "ide-cd",               .flag = &default_cdrom     },
    { .driver = "ide-hd",               .flag = &default_cdrom     },
G
Gerd Hoffmann 已提交
227
    { .driver = "ide-drive",            .flag = &default_cdrom     },
228
    { .driver = "scsi-cd",              .flag = &default_cdrom     },
229 230
    { .driver = "virtio-serial-pci",    .flag = &default_virtcon   },
    { .driver = "virtio-serial",        .flag = &default_virtcon   },
231 232 233 234 235 236
    { .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       },
237
    { .driver = "virtio-vga",           .flag = &default_vga       },
238 239
};

240 241 242 243 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 299 300 301 302 303 304 305 306 307 308
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_trace_opts = {
    .name = "trace",
    .implied_opt_name = "trace",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head),
    .desc = {
        {
            .name = "events",
            .type = QEMU_OPT_STRING,
        },{
            .name = "file",
            .type = QEMU_OPT_STRING,
        },
        { /* 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 = {
309 310 311 312 313 314
        /*
         * no elements => accept any
         * sanity checking will happen later
         * when setting machine properties
         */
        { }
315 316 317 318 319
    },
};

static QemuOptsList qemu_boot_opts = {
    .name = "boot-opts",
320 321
    .implied_opt_name = "order",
    .merge_lists = true,
322 323 324 325 326 327 328 329 330 331
    .head = QTAILQ_HEAD_INITIALIZER(qemu_boot_opts.head),
    .desc = {
        {
            .name = "order",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "once",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "menu",
332
            .type = QEMU_OPT_BOOL,
333 334 335 336 337 338 339 340 341
        }, {
            .name = "splash",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "splash-time",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "reboot-timeout",
            .type = QEMU_OPT_STRING,
A
Amos Kong 已提交
342 343
        }, {
            .name = "strict",
344
            .type = QEMU_OPT_BOOL,
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
        },
        { /*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 = {
        { }
    },
};

380 381 382 383 384
static QemuOptsList qemu_tpmdev_opts = {
    .name = "tpmdev",
    .implied_opt_name = "type",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_tpmdev_opts.head),
    .desc = {
385
        /* options are defined in the TPM backends */
386 387 388 389
        { /* end of list */ }
    },
};

390 391 392 393 394 395 396 397 398 399 400 401
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 已提交
402 403 404 405 406 407 408 409 410 411 412 413
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 */ }
    },
};

414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
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",
430 431 432 433 434 435
        }, {
            .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.",
436 437 438 439 440
        },
        { /* End of list */ }
    },
};

I
Igor Mammedov 已提交
441 442 443 444 445 446 447 448 449 450
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,
        },
451 452 453 454 455 456 457 458
        {
            .name = "slots",
            .type = QEMU_OPT_NUMBER,
        },
        {
            .name = "maxmem",
            .type = QEMU_OPT_SIZE,
        },
I
Igor Mammedov 已提交
459 460 461 462
        { /* end of list */ }
    },
};

463 464 465 466 467 468 469 470 471
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,
472 473 474
        }, {
            .name = "align",
            .type = QEMU_OPT_BOOL,
475 476 477
        }, {
            .name = "sleep",
            .type = QEMU_OPT_BOOL,
P
Pavel Dovgalyuk 已提交
478 479 480 481 482 483
        }, {
            .name = "rr",
            .type = QEMU_OPT_STRING,
        }, {
            .name = "rrfile",
            .type = QEMU_OPT_STRING,
484 485 486 487 488
        },
        { /* end of list */ }
    },
};

489 490 491 492 493 494 495 496 497 498 499
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,
500 501 502
        }, {
            .name = "arg",
            .type = QEMU_OPT_STRING,
503 504 505 506 507
        },
        { /* end of list */ }
    },
};

508 509 510 511 512 513 514 515 516 517 518 519 520 521
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",
522 523 524 525
        }, {
            .name = "string",
            .type = QEMU_OPT_STRING,
            .help = "Sets content of the blob to be inserted from a string",
526 527 528 529 530
        },
        { /* end of list */ }
    },
};

531 532 533 534 535 536 537
/**
 * Get machine options
 *
 * Returns: machine options (never null).
 */
QemuOpts *qemu_get_machine_opts(void)
{
538
    return qemu_find_opts_singleton("machine");
539 540
}

541 542 543 544 545
const char *qemu_get_vm_name(void)
{
    return qemu_name;
}

W
wayne 已提交
546 547
static void res_free(void)
{
548 549
    g_free(boot_splash_filedata);
    boot_splash_filedata = NULL;
W
wayne 已提交
550 551
}

552
static int default_driver_check(void *opaque, QemuOpts *opts, Error **errp)
553 554 555 556 557 558 559 560 561 562 563 564 565 566
{
    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;
}

567 568 569
/***********************************************************/
/* QEMU state */

570
static RunState current_run_state = RUN_STATE_PRELAUNCH;
571

572 573
/* We use RUN_STATE__MAX but any invalid value will do */
static RunState vmstop_requested = RUN_STATE__MAX;
574 575
static QemuMutex vmstop_lock;

576 577 578 579 580 581 582
typedef struct {
    RunState from;
    RunState to;
} RunStateTransition;

static const RunStateTransition runstate_transitions_def[] = {
    /*     from      ->     to      */
583
    { RUN_STATE_DEBUG, RUN_STATE_RUNNING },
584
    { RUN_STATE_DEBUG, RUN_STATE_FINISH_MIGRATE },
585

586 587
    { RUN_STATE_INMIGRATE, RUN_STATE_INTERNAL_ERROR },
    { RUN_STATE_INMIGRATE, RUN_STATE_IO_ERROR },
588
    { RUN_STATE_INMIGRATE, RUN_STATE_PAUSED },
589 590 591 592 593
    { 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 },
594
    { RUN_STATE_INMIGRATE, RUN_STATE_FINISH_MIGRATE },
595

596
    { RUN_STATE_INTERNAL_ERROR, RUN_STATE_PAUSED },
597
    { RUN_STATE_INTERNAL_ERROR, RUN_STATE_FINISH_MIGRATE },
598

599
    { RUN_STATE_IO_ERROR, RUN_STATE_RUNNING },
600
    { RUN_STATE_IO_ERROR, RUN_STATE_FINISH_MIGRATE },
601

602
    { RUN_STATE_PAUSED, RUN_STATE_RUNNING },
603
    { RUN_STATE_PAUSED, RUN_STATE_FINISH_MIGRATE },
604

605
    { RUN_STATE_POSTMIGRATE, RUN_STATE_RUNNING },
606
    { RUN_STATE_POSTMIGRATE, RUN_STATE_FINISH_MIGRATE },
607

608
    { RUN_STATE_PRELAUNCH, RUN_STATE_RUNNING },
609
    { RUN_STATE_PRELAUNCH, RUN_STATE_FINISH_MIGRATE },
610
    { RUN_STATE_PRELAUNCH, RUN_STATE_INMIGRATE },
611

612 613
    { RUN_STATE_FINISH_MIGRATE, RUN_STATE_RUNNING },
    { RUN_STATE_FINISH_MIGRATE, RUN_STATE_POSTMIGRATE },
614

615
    { RUN_STATE_RESTORE_VM, RUN_STATE_RUNNING },
616

617 618 619 620 621 622 623 624 625
    { 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 },
626
    { RUN_STATE_RUNNING, RUN_STATE_GUEST_PANICKED },
627

628
    { RUN_STATE_SAVE_VM, RUN_STATE_RUNNING },
629

630
    { RUN_STATE_SHUTDOWN, RUN_STATE_PAUSED },
631
    { RUN_STATE_SHUTDOWN, RUN_STATE_FINISH_MIGRATE },
632

633 634 635 636 637
    { 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 },

638
    { RUN_STATE_WATCHDOG, RUN_STATE_RUNNING },
639
    { RUN_STATE_WATCHDOG, RUN_STATE_FINISH_MIGRATE },
640

641
    { RUN_STATE_GUEST_PANICKED, RUN_STATE_RUNNING },
642
    { RUN_STATE_GUEST_PANICKED, RUN_STATE_FINISH_MIGRATE },
643

644
    { RUN_STATE__MAX, RUN_STATE__MAX },
645 646
};

647
static bool runstate_valid_transitions[RUN_STATE__MAX][RUN_STATE__MAX];
648

649 650 651 652 653
bool runstate_check(RunState state)
{
    return current_run_state == state;
}

J
Juan Quintela 已提交
654 655 656 657 658 659 660 661 662 663 664 665
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 已提交
666
static void runstate_init(void)
667 668 669 670
{
    const RunStateTransition *p;

    memset(&runstate_valid_transitions, 0, sizeof(runstate_valid_transitions));
671
    for (p = &runstate_transitions_def[0]; p->from != RUN_STATE__MAX; p++) {
672 673
        runstate_valid_transitions[p->from][p->to] = true;
    }
674 675

    qemu_mutex_init(&vmstop_lock);
676 677 678
}

/* This function will abort() on invalid state transitions */
679 680
void runstate_set(RunState new_state)
{
681
    assert(new_state < RUN_STATE__MAX);
682 683

    if (!runstate_valid_transitions[current_run_state][new_state]) {
684 685 686
        error_report("invalid runstate transition: '%s' -> '%s'",
                     RunState_lookup[current_run_state],
                     RunState_lookup[new_state]);
687 688
        abort();
    }
K
Kazuya Saito 已提交
689
    trace_runstate_set(new_state);
690 691 692
    current_run_state = new_state;
}

L
Luiz Capitulino 已提交
693
int runstate_is_running(void)
694
{
L
Luiz Capitulino 已提交
695
    return runstate_check(RUN_STATE_RUNNING);
696 697
}

698 699 700
bool runstate_needs_reset(void)
{
    return runstate_check(RUN_STATE_INTERNAL_ERROR) ||
701
        runstate_check(RUN_STATE_SHUTDOWN);
702 703
}

L
Luiz Capitulino 已提交
704
StatusInfo *qmp_query_status(Error **errp)
705
{
L
Luiz Capitulino 已提交
706 707 708 709 710 711 712
    StatusInfo *info = g_malloc0(sizeof(*info));

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

    return info;
713 714
}

715 716 717 718
static bool qemu_vmstop_requested(RunState *r)
{
    qemu_mutex_lock(&vmstop_lock);
    *r = vmstop_requested;
719
    vmstop_requested = RUN_STATE__MAX;
720
    qemu_mutex_unlock(&vmstop_lock);
721
    return *r < RUN_STATE__MAX;
722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740
}

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

void vm_start(void)
{
    RunState requested;

    qemu_vmstop_requested(&requested);
741
    if (runstate_is_running() && requested == RUN_STATE__MAX) {
742 743 744 745 746 747 748 749 750
        return;
    }

    /* Ensure that a STOP/RESUME pair of events is emitted if a
     * vmstop request was pending.  The BLOCK_IO_ERROR event, for
     * example, according to documentation is always followed by
     * the STOP event.
     */
    if (runstate_is_running()) {
W
Wenchao Xia 已提交
751
        qapi_event_send_stop(&error_abort);
752 753 754 755 756 757 758
    } else {
        cpu_enable_ticks();
        runstate_set(RUN_STATE_RUNNING);
        vm_state_notify(1, RUN_STATE_RUNNING);
        resume_all_vcpus();
    }

W
Wenchao Xia 已提交
759
    qapi_event_send_resume(&error_abort);
760 761 762
}


763 764
/***********************************************************/
/* real time host monotonic timer */
765

766 767 768 769 770
static time_t qemu_time(void)
{
    return qemu_clock_get_ms(QEMU_CLOCK_HOST) / 1000;
}

771 772 773 774
/***********************************************************/
/* host time/date access */
void qemu_get_timedate(struct tm *tm, int offset)
{
775
    time_t ti = qemu_time();
776 777 778 779

    ti += offset;
    if (rtc_date_offset == -1) {
        if (rtc_utc)
780
            gmtime_r(&ti, tm);
781
        else
782
            localtime_r(&ti, tm);
783 784
    } else {
        ti -= rtc_date_offset;
785
        gmtime_r(&ti, tm);
786 787 788 789 790 791 792 793 794 795
    }
}

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

    if (rtc_date_offset == -1)
        if (rtc_utc)
            seconds = mktimegm(tm);
796 797 798 799 800
        else {
            struct tm tmp = *tm;
            tmp.tm_isdst = -1; /* use timezone to figure it out */
            seconds = mktime(&tmp);
	}
801 802 803
    else
        seconds = mktimegm(tm) + rtc_date_offset;

804
    return seconds - qemu_time();
805 806
}

J
Jan Kiszka 已提交
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837
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:
838 839 840
            error_report("invalid date format");
            error_printf("valid formats: "
                         "'2006-06-17T16:01:21' or '2006-06-17'\n");
J
Jan Kiszka 已提交
841 842
            exit(1);
        }
843
        rtc_date_offset = qemu_time() - rtc_start_date;
J
Jan Kiszka 已提交
844 845 846 847 848 849 850 851 852 853 854 855
    }
}

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

            qdev_prop_register_global_list(slew_lost_ticks);
B
Blue Swirl 已提交
891
        } else if (!strcmp(value, "none")) {
892
            /* discard is default */
J
Jan Kiszka 已提交
893
        } else {
894
            error_report("invalid option value '%s'", value);
J
Jan Kiszka 已提交
895 896 897 898 899
            exit(1);
        }
    }
}

900 901 902 903 904
/***********************************************************/
/* Bluetooth support */
static int nb_hcis;
static int cur_hci;
static struct HCIInfo *hci_table[MAX_NICS];
905

906 907 908 909 910 911 912 913
struct HCIInfo *qemu_next_hci(void)
{
    if (cur_hci == nb_hcis)
        return &null_hci;

    return hci_table[cur_hci++];
}

914 915 916
static int bt_hci_parse(const char *str)
{
    struct HCIInfo *hci;
A
Anthony Liguori 已提交
917
    bdaddr_t bdaddr;
918 919

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

    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) {
965
            error_report("unrecognised bluetooth vlan Id");
966 967 968 969 970 971 972
            return 0;
        }
    }

    vlan = qemu_find_bt_vlan(vlan_id);

    if (!vlan->slave)
973 974
        error_report("warning: adding a slave device to an empty scatternet %i",
                     vlan_id);
975 976 977 978

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

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

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

1018
    error_report("bad bluetooth parameter '%s'", opt);
1019 1020 1021
    return 1;
}

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

    return 0;
}

1041
static int parse_name(void *opaque, QemuOpts *opts, Error **errp)
1042 1043 1044
{
    const char *proc_name;

1045 1046 1047
    if (qemu_opt_get(opts, "debug-threads")) {
        qemu_thread_naming(qemu_opt_get_bool(opts, "debug-threads", false));
    }
1048 1049 1050 1051 1052 1053
    qemu_name = qemu_opt_get(opts, "guest");

    proc_name = qemu_opt_get(opts, "process");
    if (proc_name) {
        os_set_proc_name(proc_name);
    }
1054 1055

    return 0;
1056 1057
}

1058 1059 1060 1061 1062
bool defaults_enabled(void)
{
    return has_defaults;
}

1063
bool usb_enabled(void)
1064
{
1065
    return machine_usb(current_machine);
1066 1067
}

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

    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) {
1081
        error_report("fd option is required and must be non-negative");
1082 1083 1084 1085
        return -1;
    }

    if (fd <= STDERR_FILENO) {
1086
        error_report("fd cannot be a standard I/O stream");
1087 1088 1089 1090 1091 1092 1093 1094 1095
        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)) {
1096
        error_report("fd is not valid or already in use");
1097 1098 1099 1100
        return -1;
    }

    if (fdset_id < 0) {
1101
        error_report("set option is required and must be non-negative");
1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
        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) {
1114
        error_report("error duplicating fd: %s", strerror(errno));
1115 1116 1117 1118
        return -1;
    }

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

    return 0;
}

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

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

    return 0;
}
#endif

1137 1138 1139
/***********************************************************/
/* QEMU Block devices */

1140 1141 1142 1143 1144 1145
#define HD_OPTS "media=disk"
#define CDROM_OPTS "media=cdrom"
#define FD_OPTS ""
#define PFLASH_OPTS ""
#define MTD_OPTS ""
#define SD_OPTS ""
T
ths 已提交
1146

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

1151
    return drive_new(opts, *block_default_type) == NULL;
G
Gerd Hoffmann 已提交
1152 1153
}

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

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

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

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

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

1183 1184
}

1185 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
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)
1212
{
1213
    if (opts) {
1214

1215 1216 1217 1218 1219 1220 1221 1222 1223
        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;
1224
            threads = threads > 0 ? threads : 1;
1225 1226 1227
            if (cpus == 0) {
                cpus = cores * threads * sockets;
            }
1228 1229 1230
        } else if (cores == 0) {
            threads = threads > 0 ? threads : 1;
            cores = cpus / (sockets * threads);
1231
        } else if (threads == 0) {
1232
            threads = cpus / (cores * sockets);
1233
        } else if (sockets * cores * threads < cpus) {
1234 1235 1236 1237
            error_report("cpu topology: "
                         "sockets (%u) * cores (%u) * threads (%u) < "
                         "smp_cpus (%u)",
                         sockets, cores, threads, cpus);
1238
            exit(1);
1239
        }
1240

1241 1242
        max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus);
        if (sockets * cores * threads > max_cpus) {
1243 1244 1245 1246
            error_report("cpu topology: "
                         "sockets (%u) * cores (%u) * threads (%u) > "
                         "maxcpus (%u)",
                         sockets, cores, threads, max_cpus);
1247 1248
            exit(1);
        }
1249 1250 1251 1252 1253

        smp_cpus = cpus;
        smp_cores = cores > 0 ? cores : 1;
        smp_threads = threads > 0 ? threads : 1;

1254
    }
1255 1256

    if (max_cpus == 0) {
1257
        max_cpus = smp_cpus;
1258 1259
    }

1260
    if (max_cpus > MAX_CPUMASK_BITS) {
1261
        error_report("unsupported number of maxcpus");
1262 1263 1264
        exit(1);
    }
    if (max_cpus < smp_cpus) {
1265
        error_report("maxcpus must be equal to or greater than smp");
1266 1267 1268
        exit(1);
    }

1269 1270 1271 1272 1273
    if (smp_cpus > 1 || smp_cores > 1 || smp_threads > 1) {
        Error *blocker = NULL;
        error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED, "smp");
        replay_add_blocker(blocker);
    }
1274 1275
}

1276
static void realtime_init(void)
1277 1278 1279
{
    if (enable_mlock) {
        if (os_mlock() < 0) {
1280
            error_report("locking memory failed");
1281 1282 1283 1284 1285
            exit(1);
        }
    }
}

S
Seiji Aguchi 已提交
1286 1287 1288 1289 1290 1291

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

1292 1293 1294 1295 1296 1297
/***********************************************************/
/* Semihosting */

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

static SemihostingConfig semihosting;

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

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

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 1363 1364 1365 1366
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, " ");
    }
}

1367 1368 1369 1370 1371 1372 1373
/* 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 已提交
1374 1375 1376
/***********************************************************/
/* USB devices */

1377
static int usb_device_add(const char *devname)
B
bellard 已提交
1378
{
1379
    USBDevice *dev = NULL;
1380 1381 1382
#ifndef CONFIG_LINUX
    const char *p;
#endif
B
bellard 已提交
1383

1384
    if (!usb_enabled()) {
B
bellard 已提交
1385
        return -1;
1386
    }
B
bellard 已提交
1387

G
Gerd Hoffmann 已提交
1388 1389 1390 1391 1392
    /* drivers with .usbdevice_name entry in USBDeviceInfo */
    dev = usbdevice_create(devname);
    if (dev)
        goto done;

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

1403
done:
B
bellard 已提交
1404 1405 1406
    return 0;
}

1407 1408 1409 1410 1411
static int usb_device_del(const char *devname)
{
    int bus_num, addr;
    const char *p;

1412 1413 1414
    if (strstart(devname, "host:", &p)) {
        return -1;
    }
1415

1416
    if (!usb_enabled()) {
1417
        return -1;
1418
    }
1419 1420 1421 1422 1423 1424 1425

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

1426
    return usb_device_delete_addr(bus_num, addr);
1427 1428
}

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

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

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

1455 1456 1457
/***********************************************************/
/* machine registration */

1458
MachineState *current_machine;
1459

1460
static MachineClass *find_machine(const char *name)
1461
{
1462
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
1463
    MachineClass *mc = NULL;
1464

1465
    for (el = machines; el; el = el->next) {
1466
        MachineClass *temp = el->data;
1467

1468
        if (!strcmp(temp->name, name)) {
1469
            mc = temp;
1470 1471
            break;
        }
1472 1473
        if (temp->alias &&
            !strcmp(temp->alias, name)) {
1474
            mc = temp;
1475 1476
            break;
        }
1477
    }
1478 1479

    g_slist_free(machines);
1480
    return mc;
1481 1482
}

1483
MachineClass *find_default_machine(void)
1484
{
1485
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
1486
    MachineClass *mc = NULL;
1487

1488
    for (el = machines; el; el = el->next) {
1489
        MachineClass *temp = el->data;
1490

1491
        if (temp->is_default) {
1492
            mc = temp;
1493
            break;
1494 1495
        }
    }
1496 1497

    g_slist_free(machines);
1498
    return mc;
1499 1500
}

1501 1502
MachineInfoList *qmp_query_machines(Error **errp)
{
1503
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
1504 1505
    MachineInfoList *mach_list = NULL;

1506 1507
    for (el = machines; el; el = el->next) {
        MachineClass *mc = el->data;
1508 1509 1510 1511
        MachineInfoList *entry;
        MachineInfo *info;

        info = g_malloc0(sizeof(*info));
1512
        if (mc->is_default) {
1513 1514 1515 1516
            info->has_is_default = true;
            info->is_default = true;
        }

1517
        if (mc->alias) {
1518
            info->has_alias = true;
1519
            info->alias = g_strdup(mc->alias);
1520 1521
        }

1522 1523
        info->name = g_strdup(mc->name);
        info->cpu_max = !mc->max_cpus ? 1 : mc->max_cpus;
1524 1525 1526 1527 1528 1529 1530

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

1531
    g_slist_free(machines);
1532 1533 1534
    return mach_list;
}

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

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

1544 1545
    object_property_iter_init(&iter, OBJECT(machine));
    while ((prop = object_property_iter_next(&iter))) {
M
Marcel Apfelbaum 已提交
1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561
        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;
}

1562 1563 1564
/***********************************************************/
/* main execution loop */

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

B
Blue Swirl 已提交
1571
static QLIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
B
bellard 已提交
1572 1573 1574 1575 1576 1577

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

1578
    e = g_malloc0(sizeof (*e));
B
bellard 已提交
1579 1580 1581

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

void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
{
B
Blue Swirl 已提交
1588
    QLIST_REMOVE (e, entries);
1589
    g_free (e);
B
bellard 已提交
1590 1591
}

1592
void vm_state_notify(int running, RunState state)
B
bellard 已提交
1593
{
1594
    VMChangeStateEntry *e, *next;
B
bellard 已提交
1595

1596
    trace_vm_state_notify(running, state);
1597

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

1603 1604 1605
/* reset/shutdown handler */

typedef struct QEMUResetEntry {
B
Blue Swirl 已提交
1606
    QTAILQ_ENTRY(QEMUResetEntry) entry;
1607 1608 1609 1610
    QEMUResetHandler *func;
    void *opaque;
} QEMUResetEntry;

B
Blue Swirl 已提交
1611 1612
static QTAILQ_HEAD(reset_handlers, QEMUResetEntry) reset_handlers =
    QTAILQ_HEAD_INITIALIZER(reset_handlers);
1613
static int reset_requested;
1614 1615
static int shutdown_requested, shutdown_signal = -1;
static pid_t shutdown_pid;
B
bellard 已提交
1616
static int powerdown_requested;
1617
static int debug_requested;
G
Gerd Hoffmann 已提交
1618
static int suspend_requested;
L
Liu, Jinsong 已提交
1619
static WakeupReason wakeup_reason;
I
Igor Mammedov 已提交
1620 1621
static NotifierList powerdown_notifiers =
    NOTIFIER_LIST_INITIALIZER(powerdown_notifiers);
G
Gerd Hoffmann 已提交
1622 1623 1624 1625
static NotifierList suspend_notifiers =
    NOTIFIER_LIST_INITIALIZER(suspend_notifiers);
static NotifierList wakeup_notifiers =
    NOTIFIER_LIST_INITIALIZER(wakeup_notifiers);
L
Liu, Jinsong 已提交
1626
static uint32_t wakeup_reason_mask = ~(1 << QEMU_WAKEUP_REASON_NONE);
1627

1628 1629 1630 1631 1632 1633 1634 1635 1636 1637
int qemu_shutdown_requested_get(void)
{
    return shutdown_requested;
}

int qemu_reset_requested_get(void)
{
    return reset_requested;
}

B
Blue Swirl 已提交
1638
static int qemu_shutdown_requested(void)
A
aurel32 已提交
1639
{
1640
    return atomic_xchg(&shutdown_requested, 0);
A
aurel32 已提交
1641 1642
}

B
Blue Swirl 已提交
1643
static void qemu_kill_report(void)
1644
{
1645
    if (!qtest_driver() && shutdown_signal != -1) {
1646 1647 1648 1649
        if (shutdown_pid == 0) {
            /* This happens for eg ^C at the terminal, so it's worth
             * avoiding printing an odd message in that case.
             */
1650
            error_report("terminating on signal %d", shutdown_signal);
1651
        } else {
1652 1653
            error_report("terminating on signal %d from pid " FMT_pid,
                         shutdown_signal, shutdown_pid);
1654
        }
1655 1656 1657 1658
        shutdown_signal = -1;
    }
}

B
Blue Swirl 已提交
1659
static int qemu_reset_requested(void)
A
aurel32 已提交
1660 1661
{
    int r = reset_requested;
P
Pavel Dovgalyuk 已提交
1662 1663 1664 1665 1666
    if (r && replay_checkpoint(CHECKPOINT_RESET_REQUESTED)) {
        reset_requested = 0;
        return r;
    }
    return false;
A
aurel32 已提交
1667 1668
}

G
Gerd Hoffmann 已提交
1669 1670 1671
static int qemu_suspend_requested(void)
{
    int r = suspend_requested;
P
Pavel Dovgalyuk 已提交
1672 1673 1674 1675 1676
    if (r && replay_checkpoint(CHECKPOINT_SUSPEND_REQUESTED)) {
        suspend_requested = 0;
        return r;
    }
    return false;
G
Gerd Hoffmann 已提交
1677 1678
}

L
Liu, Jinsong 已提交
1679
static WakeupReason qemu_wakeup_requested(void)
1680
{
L
Liu, Jinsong 已提交
1681
    return wakeup_reason;
1682 1683
}

B
Blue Swirl 已提交
1684
static int qemu_powerdown_requested(void)
A
aurel32 已提交
1685 1686 1687 1688 1689 1690
{
    int r = powerdown_requested;
    powerdown_requested = 0;
    return r;
}

1691 1692 1693 1694 1695 1696 1697
static int qemu_debug_requested(void)
{
    int r = debug_requested;
    debug_requested = 0;
    return r;
}

1698
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
1699
{
1700
    QEMUResetEntry *re = g_malloc0(sizeof(QEMUResetEntry));
1701 1702 1703

    re->func = func;
    re->opaque = opaque;
B
Blue Swirl 已提交
1704
    QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
1705 1706
}

J
Jan Kiszka 已提交
1707
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
1708 1709 1710
{
    QEMUResetEntry *re;

B
Blue Swirl 已提交
1711
    QTAILQ_FOREACH(re, &reset_handlers, entry) {
J
Jan Kiszka 已提交
1712
        if (re->func == func && re->opaque == opaque) {
B
Blue Swirl 已提交
1713
            QTAILQ_REMOVE(&reset_handlers, re, entry);
1714
            g_free(re);
J
Jan Kiszka 已提交
1715 1716 1717 1718 1719
            return;
        }
    }
}

1720
void qemu_devices_reset(void)
J
Jan Kiszka 已提交
1721 1722 1723 1724
{
    QEMUResetEntry *re, *nre;

    /* reset all devices */
B
Blue Swirl 已提交
1725
    QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
1726 1727
        re->func(re->opaque);
    }
1728 1729 1730 1731
}

void qemu_system_reset(bool report)
{
1732 1733 1734 1735
    MachineClass *mc;

    mc = current_machine ? MACHINE_GET_CLASS(current_machine) : NULL;

1736 1737
    if (mc && mc->reset) {
        mc->reset();
1738 1739 1740
    } else {
        qemu_devices_reset();
    }
J
Jan Kiszka 已提交
1741
    if (report) {
W
Wenchao Xia 已提交
1742
        qapi_event_send_reset(&error_abort);
J
Jan Kiszka 已提交
1743
    }
1744
    cpu_synchronize_all_post_reset();
1745 1746
}

1747 1748
void qemu_system_guest_panicked(void)
{
1749 1750 1751
    if (current_cpu) {
        current_cpu->crash_occurred = true;
    }
1752 1753 1754 1755
    qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE, &error_abort);
    vm_stop(RUN_STATE_GUEST_PANICKED);
}

1756 1757
void qemu_system_reset_request(void)
{
B
bellard 已提交
1758 1759 1760 1761 1762
    if (no_reboot) {
        shutdown_requested = 1;
    } else {
        reset_requested = 1;
    }
1763
    cpu_stop_current();
1764
    qemu_notify_event();
1765 1766
}

G
Gerd Hoffmann 已提交
1767 1768 1769 1770
static void qemu_system_suspend(void)
{
    pause_all_vcpus();
    notifier_list_notify(&suspend_notifiers, NULL);
1771
    runstate_set(RUN_STATE_SUSPENDED);
W
Wenchao Xia 已提交
1772
    qapi_event_send_suspend(&error_abort);
G
Gerd Hoffmann 已提交
1773 1774 1775 1776
}

void qemu_system_suspend_request(void)
{
L
Luiz Capitulino 已提交
1777
    if (runstate_check(RUN_STATE_SUSPENDED)) {
G
Gerd Hoffmann 已提交
1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791
        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)
{
1792 1793
    trace_system_wakeup_request(reason);

L
Luiz Capitulino 已提交
1794
    if (!runstate_check(RUN_STATE_SUSPENDED)) {
G
Gerd Hoffmann 已提交
1795 1796 1797 1798 1799
        return;
    }
    if (!(wakeup_reason_mask & (1 << reason))) {
        return;
    }
1800
    runstate_set(RUN_STATE_RUNNING);
L
Liu, Jinsong 已提交
1801
    wakeup_reason = reason;
G
Gerd Hoffmann 已提交
1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
    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);
}

1819 1820 1821 1822
void qemu_system_killed(int signal, pid_t pid)
{
    shutdown_signal = signal;
    shutdown_pid = pid;
1823
    no_shutdown = 0;
P
Pavel Dovgalyuk 已提交
1824 1825 1826 1827 1828 1829

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

1832 1833
void qemu_system_shutdown_request(void)
{
1834
    trace_qemu_system_shutdown_request();
P
Pavel Dovgalyuk 已提交
1835
    replay_shutdown_request();
1836
    shutdown_requested = 1;
1837
    qemu_notify_event();
1838 1839
}

1840 1841
static void qemu_system_powerdown(void)
{
W
Wenchao Xia 已提交
1842
    qapi_event_send_powerdown(&error_abort);
1843 1844 1845
    notifier_list_notify(&powerdown_notifiers, NULL);
}

B
bellard 已提交
1846 1847
void qemu_system_powerdown_request(void)
{
1848
    trace_qemu_system_powerdown_request();
B
bellard 已提交
1849
    powerdown_requested = 1;
1850 1851 1852
    qemu_notify_event();
}

I
Igor Mammedov 已提交
1853 1854 1855 1856 1857
void qemu_register_powerdown_notifier(Notifier *notifier)
{
    notifier_list_add(&powerdown_notifiers, notifier);
}

1858 1859 1860
void qemu_system_debug_request(void)
{
    debug_requested = 1;
1861
    qemu_notify_event();
1862 1863
}

P
Paolo Bonzini 已提交
1864 1865 1866 1867 1868 1869
static bool main_loop_should_exit(void)
{
    RunState r;
    if (qemu_debug_requested()) {
        vm_stop(RUN_STATE_DEBUG);
    }
G
Gerd Hoffmann 已提交
1870 1871 1872
    if (qemu_suspend_requested()) {
        qemu_system_suspend();
    }
P
Paolo Bonzini 已提交
1873 1874
    if (qemu_shutdown_requested()) {
        qemu_kill_report();
W
Wenchao Xia 已提交
1875
        qapi_event_send_shutdown(&error_abort);
P
Paolo Bonzini 已提交
1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886
        if (no_shutdown) {
            vm_stop(RUN_STATE_SHUTDOWN);
        } else {
            return true;
        }
    }
    if (qemu_reset_requested()) {
        pause_all_vcpus();
        cpu_synchronize_all_states();
        qemu_system_reset(VMRESET_REPORT);
        resume_all_vcpus();
1887
        if (runstate_needs_reset()) {
P
Paolo Bonzini 已提交
1888 1889 1890
            runstate_set(RUN_STATE_PAUSED);
        }
    }
1891 1892 1893 1894
    if (qemu_wakeup_requested()) {
        pause_all_vcpus();
        cpu_synchronize_all_states();
        qemu_system_reset(VMRESET_SILENT);
L
Liu, Jinsong 已提交
1895 1896
        notifier_list_notify(&wakeup_notifiers, &wakeup_reason);
        wakeup_reason = QEMU_WAKEUP_REASON_NONE;
1897
        resume_all_vcpus();
W
Wenchao Xia 已提交
1898
        qapi_event_send_wakeup(&error_abort);
1899
    }
P
Paolo Bonzini 已提交
1900
    if (qemu_powerdown_requested()) {
1901
        qemu_system_powerdown();
P
Paolo Bonzini 已提交
1902 1903 1904 1905 1906 1907 1908
    }
    if (qemu_vmstop_requested(&r)) {
        vm_stop(r);
    }
    return false;
}

1909 1910
static void main_loop(void)
{
1911
    bool nonblocking;
P
Paolo Bonzini 已提交
1912
    int last_io = 0;
1913 1914 1915
#ifdef CONFIG_PROFILER
    int64_t ti;
#endif
P
Paolo Bonzini 已提交
1916
    do {
1917
        nonblocking = !kvm_enabled() && !xen_enabled() && last_io > 0;
1918
#ifdef CONFIG_PROFILER
J
Jan Kiszka 已提交
1919
        ti = profile_getclock();
1920
#endif
1921
        last_io = main_loop_wait(nonblocking);
1922
#ifdef CONFIG_PROFILER
J
Jan Kiszka 已提交
1923
        dev_time += profile_getclock() - ti;
1924
#endif
P
Paolo Bonzini 已提交
1925
    } while (!main_loop_should_exit());
B
bellard 已提交
1926 1927
}

P
pbrook 已提交
1928 1929
static void version(void)
{
T
Thomas Monjalon 已提交
1930
    printf("QEMU emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n");
P
pbrook 已提交
1931 1932
}

1933
static void help(int exitcode)
1934
{
1935 1936 1937 1938 1939
    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());

1940 1941
#define QEMU_OPTIONS_GENERATE_HELP
#include "qemu-options-wrapper.h"
1942 1943

    printf("\nDuring emulation, the following keys are useful:\n"
1944 1945 1946 1947
           "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"
1948 1949
           "When using -nographic, press 'ctrl-a h' to get some help.\n");

1950
    exit(exitcode);
1951 1952
}

1953 1954 1955 1956 1957 1958
#define HAS_ARG 0x0001

typedef struct QEMUOption {
    const char *name;
    int flags;
    int index;
1959
    uint32_t arch_mask;
1960 1961
} QEMUOption;

B
blueswir1 已提交
1962
static const QEMUOption qemu_options[] = {
1963
    { "h", 0, QEMU_OPTION_h, QEMU_ARCH_ALL },
1964 1965
#define QEMU_OPTIONS_GENERATE_OPTIONS
#include "qemu-options-wrapper.h"
1966
    { NULL },
B
bellard 已提交
1967
};
B
Blue Swirl 已提交
1968 1969 1970

static bool vga_available(void)
{
1971
    return object_class_by_name("VGA") || object_class_by_name("isa-vga");
B
Blue Swirl 已提交
1972 1973 1974 1975
}

static bool cirrus_vga_available(void)
{
1976 1977
    return object_class_by_name("cirrus-vga")
           || object_class_by_name("isa-cirrus-vga");
B
Blue Swirl 已提交
1978 1979 1980 1981
}

static bool vmware_vga_available(void)
{
1982
    return object_class_by_name("vmware-svga");
B
Blue Swirl 已提交
1983 1984
}

A
Aurelien Jarno 已提交
1985 1986 1987 1988 1989
static bool qxl_vga_available(void)
{
    return object_class_by_name("qxl-vga");
}

1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
static bool tcx_vga_available(void)
{
    return object_class_by_name("SUNW,tcx");
}

static bool cg3_vga_available(void)
{
    return object_class_by_name("cgthree");
}

2000 2001 2002 2003 2004
static bool virtio_vga_available(void)
{
    return object_class_by_name("virtio-vga");
}

2005 2006 2007 2008
static void select_vgahw (const char *p)
{
    const char *opts;

2009
    assert(vga_interface_type == VGA_NONE);
2010
    if (strstart(p, "std", &opts)) {
B
Blue Swirl 已提交
2011 2012 2013
        if (vga_available()) {
            vga_interface_type = VGA_STD;
        } else {
2014
            error_report("standard VGA not available");
B
Blue Swirl 已提交
2015 2016
            exit(0);
        }
2017
    } else if (strstart(p, "cirrus", &opts)) {
B
Blue Swirl 已提交
2018 2019 2020
        if (cirrus_vga_available()) {
            vga_interface_type = VGA_CIRRUS;
        } else {
2021
            error_report("Cirrus VGA not available");
B
Blue Swirl 已提交
2022 2023
            exit(0);
        }
2024
    } else if (strstart(p, "vmware", &opts)) {
B
Blue Swirl 已提交
2025 2026 2027
        if (vmware_vga_available()) {
            vga_interface_type = VGA_VMWARE;
        } else {
2028
            error_report("VMWare SVGA not available");
B
Blue Swirl 已提交
2029 2030
            exit(0);
        }
2031 2032 2033 2034
    } else if (strstart(p, "virtio", &opts)) {
        if (virtio_vga_available()) {
            vga_interface_type = VGA_VIRTIO;
        } else {
2035
            error_report("Virtio VGA not available");
2036 2037
            exit(0);
        }
2038
    } else if (strstart(p, "xenfb", &opts)) {
2039
        vga_interface_type = VGA_XENFB;
G
Gerd Hoffmann 已提交
2040
    } else if (strstart(p, "qxl", &opts)) {
A
Aurelien Jarno 已提交
2041 2042 2043
        if (qxl_vga_available()) {
            vga_interface_type = VGA_QXL;
        } else {
2044
            error_report("QXL VGA not available");
A
Aurelien Jarno 已提交
2045 2046
            exit(0);
        }
2047 2048 2049 2050
    } else if (strstart(p, "tcx", &opts)) {
        if (tcx_vga_available()) {
            vga_interface_type = VGA_TCX;
        } else {
2051
            error_report("TCX framebuffer not available");
2052 2053 2054 2055 2056 2057
            exit(0);
        }
    } else if (strstart(p, "cg3", &opts)) {
        if (cg3_vga_available()) {
            vga_interface_type = VGA_CG3;
        } else {
2058
            error_report("CG3 framebuffer not available");
2059 2060
            exit(0);
        }
2061
    } else if (!strstart(p, "none", &opts)) {
2062
    invalid_vga:
2063
        error_report("unknown vga type: %s", p);
2064 2065
        exit(1);
    }
M
malc 已提交
2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078
    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;
    }
2079 2080
}

J
Jes Sorensen 已提交
2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098
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 {
2099
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2100 2101 2102 2103 2104 2105 2106 2107
                }
            } 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 {
2108
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2109 2110 2111 2112 2113 2114 2115 2116
                }
            } 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 {
2117
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2118 2119 2120 2121 2122 2123 2124 2125
                }
            } 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 {
2126
                    goto invalid_sdl_args;
J
Jes Sorensen 已提交
2127
                }
2128 2129 2130 2131 2132 2133 2134 2135 2136
            } 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 已提交
2137
            } else {
2138
            invalid_sdl_args:
2139
                error_report("invalid SDL option string");
2140
                exit(1);
J
Jes Sorensen 已提交
2141 2142 2143 2144
            }
            opts = nextopt;
        }
#else
2145
        error_report("SDL support is disabled");
J
Jes Sorensen 已提交
2146 2147
        exit(1);
#endif
J
Jes Sorensen 已提交
2148
    } else if (strstart(p, "vnc", &opts)) {
J
Jes Sorensen 已提交
2149
#ifdef CONFIG_VNC
2150
        if (*opts == '=') {
2151
            Error *err = NULL;
2152 2153
            if (vnc_parse(opts + 1, &err) == NULL) {
                error_report_err(err);
2154
                exit(1);
J
Jes Sorensen 已提交
2155
            }
2156
        } else {
2157
            error_report("VNC requires a display argument vnc=<display>");
J
Jes Sorensen 已提交
2158 2159
            exit(1);
        }
J
Jes Sorensen 已提交
2160
#else
2161
        error_report("VNC support is disabled");
J
Jes Sorensen 已提交
2162 2163
        exit(1);
#endif
J
Jes Sorensen 已提交
2164 2165 2166 2167
    } else if (strstart(p, "curses", &opts)) {
#ifdef CONFIG_CURSES
        display = DT_CURSES;
#else
2168
        error_report("curses support is disabled");
J
Jes Sorensen 已提交
2169
        exit(1);
A
Anthony Liguori 已提交
2170 2171 2172 2173
#endif
    } else if (strstart(p, "gtk", &opts)) {
#ifdef CONFIG_GTK
        display = DT_GTK;
2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185
        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;
                }
2186 2187 2188 2189 2190 2191 2192 2193 2194
            } 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;
                }
2195 2196
            } else {
            invalid_gtk_args:
2197
                error_report("invalid GTK option string");
2198 2199 2200 2201
                exit(1);
            }
            opts = nextopt;
        }
A
Anthony Liguori 已提交
2202
#else
2203
        error_report("GTK support is disabled");
A
Anthony Liguori 已提交
2204
        exit(1);
J
Jes Sorensen 已提交
2205
#endif
J
Jes Sorensen 已提交
2206 2207
    } else if (strstart(p, "none", &opts)) {
        display = DT_NONE;
J
Jes Sorensen 已提交
2208
    } else {
2209
        error_report("unknown display type");
J
Jes Sorensen 已提交
2210 2211 2212 2213 2214 2215
        exit(1);
    }

    return display;
}

2216 2217
static int balloon_parse(const char *arg)
{
2218
    QemuOpts *opts;
2219

2220 2221 2222 2223 2224 2225 2226
    if (strcmp(arg, "none") == 0) {
        return 0;
    }

    if (!strncmp(arg, "virtio", 6)) {
        if (arg[6] == ',') {
            /* have params -> parse them */
2227 2228
            opts = qemu_opts_parse_noisily(qemu_find_opts("device"), arg + 7,
                                           false);
2229 2230 2231 2232
            if (!opts)
                return  -1;
        } else {
            /* create empty opts */
2233 2234
            opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                    &error_abort);
2235
        }
2236
        qemu_opt_set(opts, "driver", "virtio-balloon", &error_abort);
2237
        return 0;
2238
    }
2239 2240

    return -1;
2241 2242
}

P
Paul Brook 已提交
2243 2244
char *qemu_find_file(int type, const char *name)
{
2245
    int i;
P
Paul Brook 已提交
2246 2247 2248
    const char *subdir;
    char *buf;

2249 2250
    /* Try the name as a straight path first */
    if (access(name, R_OK) == 0) {
2251
        trace_load_file(name, name);
2252
        return g_strdup(name);
P
Paul Brook 已提交
2253
    }
2254

P
Paul Brook 已提交
2255 2256 2257 2258 2259 2260 2261 2262 2263 2264
    switch (type) {
    case QEMU_FILE_TYPE_BIOS:
        subdir = "";
        break;
    case QEMU_FILE_TYPE_KEYMAP:
        subdir = "keymaps/";
        break;
    default:
        abort();
    }
2265 2266 2267 2268 2269 2270 2271

    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;
        }
2272
        g_free(buf);
P
Paul Brook 已提交
2273
    }
2274
    return NULL;
P
Paul Brook 已提交
2275 2276
}

2277 2278 2279 2280 2281
static inline bool nonempty_str(const char *str)
{
    return str && *str;
}

2282 2283 2284 2285
static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
{
    gchar *buf;
    size_t size;
2286
    const char *name, *file, *str;
2287 2288 2289 2290 2291 2292 2293

    if (opaque == NULL) {
        error_report("fw_cfg device not available");
        return -1;
    }
    name = qemu_opt_get(opts, "name");
    file = qemu_opt_get(opts, "file");
2294 2295 2296 2297 2298 2299 2300 2301 2302
    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");
2303 2304 2305 2306 2307 2308 2309
        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) {
2310
        error_report("warning: externally provided fw_cfg item names "
2311
                     "should be prefixed with \"opt/\"");
2312
    }
2313 2314 2315 2316 2317 2318 2319 2320
    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;
        }
2321 2322 2323 2324 2325
    }
    fw_cfg_add_file((FWCfgState *)opaque, name, buf, size);
    return 0;
}

2326
static int device_help_func(void *opaque, QemuOpts *opts, Error **errp)
2327 2328 2329 2330
{
    return qdev_device_help(opts);
}

2331
static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
G
Gerd Hoffmann 已提交
2332
{
2333
    Error *err = NULL;
G
Gerd Hoffmann 已提交
2334 2335
    DeviceState *dev;

2336 2337 2338
    dev = qdev_device_add(opts, &err);
    if (!dev) {
        error_report_err(err);
G
Gerd Hoffmann 已提交
2339
        return -1;
2340
    }
2341
    object_unref(OBJECT(dev));
G
Gerd Hoffmann 已提交
2342 2343 2344
    return 0;
}

2345
static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
2346
{
2347
    Error *local_err = NULL;
2348

2349
    qemu_chr_new_from_opts(opts, NULL, &local_err);
2350
    if (local_err) {
2351
        error_report_err(local_err);
2352
        return -1;
2353
    }
2354 2355 2356
    return 0;
}

2357
#ifdef CONFIG_VIRTFS
2358
static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp)
2359 2360 2361 2362 2363 2364 2365 2366
{
    int ret;
    ret = qemu_fsdev_add(opts);

    return ret;
}
#endif

2367
static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382
{
    CharDriverState *chr;
    const char *chardev;
    const char *mode;
    int flags;

    mode = qemu_opt_get(opts, "mode");
    if (mode == NULL) {
        mode = "readline";
    }
    if (strcmp(mode, "readline") == 0) {
        flags = MONITOR_USE_READLINE;
    } else if (strcmp(mode, "control") == 0) {
        flags = MONITOR_USE_CONTROL;
    } else {
2383
        error_report("unknown monitor mode \"%s\"", mode);
2384 2385 2386
        exit(1);
    }

2387 2388 2389
    if (qemu_opt_get_bool(opts, "pretty", 0))
        flags |= MONITOR_USE_PRETTY;

2390 2391 2392 2393 2394 2395
    if (qemu_opt_get_bool(opts, "default", 0))
        flags |= MONITOR_IS_DEFAULT;

    chardev = qemu_opt_get(opts, "chardev");
    chr = qemu_chr_find(chardev);
    if (chr == NULL) {
2396
        error_report("chardev \"%s\" not found", chardev);
2397 2398 2399
        exit(1);
    }

2400
    qemu_chr_fe_claim_no_fail(chr);
2401 2402 2403 2404
    monitor_init(chr, flags);
    return 0;
}

M
Max Reitz 已提交
2405
static void monitor_parse(const char *optarg, const char *mode, bool pretty)
2406 2407
{
    static int monitor_device_index = 0;
2408
    Error *local_err = NULL;
2409 2410 2411 2412 2413 2414 2415 2416
    QemuOpts *opts;
    const char *p;
    char label[32];
    int def = 0;

    if (strstart(optarg, "chardev:", &p)) {
        snprintf(label, sizeof(label), "%s", p);
    } else {
2417 2418 2419
        snprintf(label, sizeof(label), "compat_monitor%d",
                 monitor_device_index);
        if (monitor_device_index == 0) {
2420 2421 2422 2423
            def = 1;
        }
        opts = qemu_chr_parse_compat(label, optarg);
        if (!opts) {
2424
            error_report("parse error: %s", optarg);
2425 2426 2427 2428
            exit(1);
        }
    }

2429
    opts = qemu_opts_create(qemu_find_opts("mon"), label, 1, &local_err);
2430
    if (!opts) {
2431
        error_report_err(local_err);
2432 2433
        exit(1);
    }
2434 2435
    qemu_opt_set(opts, "mode", mode, &error_abort);
    qemu_opt_set(opts, "chardev", label, &error_abort);
2436
    qemu_opt_set_bool(opts, "pretty", pretty, &error_abort);
2437
    if (def)
2438
        qemu_opt_set(opts, "default", "on", &error_abort);
2439 2440 2441
    monitor_device_index++;
}

2442 2443
struct device_config {
    enum {
G
Gerd Hoffmann 已提交
2444 2445 2446 2447 2448
        DEV_USB,       /* -usbdevice     */
        DEV_BT,        /* -bt            */
        DEV_SERIAL,    /* -serial        */
        DEV_PARALLEL,  /* -parallel      */
        DEV_VIRTCON,   /* -virtioconsole */
2449
        DEV_DEBUGCON,  /* -debugcon */
2450
        DEV_GDB,       /* -gdb, -s */
2451
        DEV_SCLP,      /* s390 sclp */
2452 2453
    } type;
    const char *cmdline;
2454
    Location loc;
B
Blue Swirl 已提交
2455
    QTAILQ_ENTRY(device_config) next;
2456
};
B
Blue Swirl 已提交
2457 2458 2459

static QTAILQ_HEAD(, device_config) device_configs =
    QTAILQ_HEAD_INITIALIZER(device_configs);
2460 2461 2462 2463 2464

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

2465
    conf = g_malloc0(sizeof(*conf));
2466 2467
    conf->type = type;
    conf->cmdline = cmdline;
2468
    loc_save(&conf->loc);
B
Blue Swirl 已提交
2469
    QTAILQ_INSERT_TAIL(&device_configs, conf, next);
2470 2471 2472 2473 2474 2475 2476
}

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

B
Blue Swirl 已提交
2477
    QTAILQ_FOREACH(conf, &device_configs, next) {
2478 2479
        if (conf->type != type)
            continue;
2480
        loc_push_restore(&conf->loc);
2481
        rc = func(conf->cmdline);
2482
        loc_pop(&conf->loc);
G
Gonglei 已提交
2483
        if (rc) {
2484
            return rc;
G
Gonglei 已提交
2485
        }
2486 2487 2488 2489
    }
    return 0;
}

2490 2491 2492 2493 2494 2495 2496 2497
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) {
2498
        error_report("too many serial ports");
2499 2500 2501
        exit(1);
    }
    snprintf(label, sizeof(label), "serial%d", index);
2502
    serial_hds[index] = qemu_chr_new(label, devname, NULL);
2503
    if (!serial_hds[index]) {
2504 2505
        error_report("could not connect serial device"
                     " to character backend '%s'", devname);
2506 2507 2508 2509 2510 2511
        return -1;
    }
    index++;
    return 0;
}

G
Gerd Hoffmann 已提交
2512 2513 2514 2515 2516 2517 2518 2519
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) {
2520
        error_report("too many parallel ports");
G
Gerd Hoffmann 已提交
2521 2522 2523
        exit(1);
    }
    snprintf(label, sizeof(label), "parallel%d", index);
2524
    parallel_hds[index] = qemu_chr_new(label, devname, NULL);
G
Gerd Hoffmann 已提交
2525
    if (!parallel_hds[index]) {
2526 2527
        error_report("could not connect parallel device"
                     " to character backend '%s'", devname);
G
Gerd Hoffmann 已提交
2528 2529 2530 2531 2532 2533
        return -1;
    }
    index++;
    return 0;
}

G
Gerd Hoffmann 已提交
2534 2535
static int virtcon_parse(const char *devname)
{
2536
    QemuOptsList *device = qemu_find_opts("device");
G
Gerd Hoffmann 已提交
2537 2538
    static int index = 0;
    char label[32];
2539
    QemuOpts *bus_opts, *dev_opts;
G
Gerd Hoffmann 已提交
2540 2541 2542 2543

    if (strcmp(devname, "none") == 0)
        return 0;
    if (index == MAX_VIRTIO_CONSOLES) {
2544
        error_report("too many virtio consoles");
G
Gerd Hoffmann 已提交
2545 2546
        exit(1);
    }
2547

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

2551
    dev_opts = qemu_opts_create(device, NULL, 0, &error_abort);
2552
    qemu_opt_set(dev_opts, "driver", "virtconsole", &error_abort);
2553

G
Gerd Hoffmann 已提交
2554
    snprintf(label, sizeof(label), "virtcon%d", index);
2555
    virtcon_hds[index] = qemu_chr_new(label, devname, NULL);
G
Gerd Hoffmann 已提交
2556
    if (!virtcon_hds[index]) {
2557 2558
        error_report("could not connect virtio console"
                     " to character backend '%s'", devname);
G
Gerd Hoffmann 已提交
2559 2560
        return -1;
    }
2561
    qemu_opt_set(dev_opts, "chardev", label, &error_abort);
2562

G
Gerd Hoffmann 已提交
2563 2564 2565 2566
    index++;
    return 0;
}

2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577
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) {
2578
        error_report("too many sclp consoles");
2579 2580 2581 2582 2583 2584
        exit(1);
    }

    assert(arch_type == QEMU_ARCH_S390X);

    dev_opts = qemu_opts_create(device, NULL, 0, NULL);
2585
    qemu_opt_set(dev_opts, "driver", "sclpconsole", &error_abort);
2586 2587 2588 2589

    snprintf(label, sizeof(label), "sclpcon%d", index);
    sclp_hds[index] = qemu_chr_new(label, devname, NULL);
    if (!sclp_hds[index]) {
2590 2591
        error_report("could not connect sclp console"
                     " to character backend '%s'", devname);
2592 2593
        return -1;
    }
2594
    qemu_opt_set(dev_opts, "chardev", label, &error_abort);
2595 2596 2597 2598 2599

    index++;
    return 0;
}

2600
static int debugcon_parse(const char *devname)
L
Laszlo Ersek 已提交
2601
{
2602 2603
    QemuOpts *opts;

2604
    if (!qemu_chr_new("debugcon", devname, NULL)) {
2605 2606
        exit(1);
    }
2607
    opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1, NULL);
2608
    if (!opts) {
2609
        error_report("already have a debugcon device");
2610 2611
        exit(1);
    }
2612 2613
    qemu_opt_set(opts, "driver", "isa-debugcon", &error_abort);
    qemu_opt_set(opts, "chardev", "debugcon", &error_abort);
2614 2615 2616
    return 0;
}

2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651
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)
2652
{
2653
    MachineClass *mc = NULL;
2654
    GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
2655 2656

    if (name) {
2657
        mc = find_machine(name);
2658
    }
2659
    if (mc) {
2660
        g_slist_free(machines);
2661
        return mc;
2662
    }
2663
    if (name && !is_help_option(name)) {
2664
        error_report("unsupported machine type");
2665
        error_printf("Use -machine help to list supported machines\n");
2666 2667
    } else {
        printf("Supported machines are:\n");
2668
        machines = g_slist_sort(machines, machine_class_cmp);
2669 2670
        for (el = machines; el; el = el->next) {
            MachineClass *mc = el->data;
2671 2672
            if (mc->alias) {
                printf("%-20s %s (alias of %s)\n", mc->alias, mc->desc, mc->name);
2673
            }
2674 2675
            printf("%-20s %s%s\n", mc->name, mc->desc,
                   mc->is_default ? " (default)" : "");
2676 2677
        }
    }
2678 2679

    g_slist_free(machines);
2680
    exit(!name || !is_help_option(name));
2681 2682
}

G
Gerd Hoffmann 已提交
2683 2684 2685 2686 2687 2688 2689
void qemu_add_exit_notifier(Notifier *notify)
{
    notifier_list_add(&exit_notifiers, notify);
}

void qemu_remove_exit_notifier(Notifier *notify)
{
P
Paolo Bonzini 已提交
2690
    notifier_remove(notify);
G
Gerd Hoffmann 已提交
2691 2692 2693 2694
}

static void qemu_run_exit_notifiers(void)
{
2695
    notifier_list_notify(&exit_notifiers, NULL);
G
Gerd Hoffmann 已提交
2696 2697
}

2698 2699
static bool machine_init_done;

2700 2701 2702
void qemu_add_machine_init_done_notifier(Notifier *notify)
{
    notifier_list_add(&machine_init_done_notifiers, notify);
2703 2704 2705
    if (machine_init_done) {
        notify->notify(notify, NULL);
    }
2706 2707 2708 2709
}

static void qemu_run_machine_init_done_notifiers(void)
{
2710
    notifier_list_notify(&machine_init_done_notifiers, NULL);
2711
    machine_init_done = true;
2712 2713
}

2714 2715 2716 2717 2718 2719 2720 2721
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;

2722
    loc_set_cmdline(argv, optind, 1);
2723 2724 2725 2726 2727 2728 2729
    optind++;
    /* Treat --foo the same as -foo.  */
    if (r[1] == '-')
        r++;
    popt = qemu_options;
    for(;;) {
        if (!popt->name) {
2730
            error_report("invalid option");
2731 2732 2733 2734 2735 2736 2737 2738
            exit(1);
        }
        if (!strcmp(popt->name, r + 1))
            break;
        popt++;
    }
    if (popt->flags & HAS_ARG) {
        if (optind >= argc) {
2739
            error_report("requires an argument");
2740 2741 2742
            exit(1);
        }
        optarg = argv[optind++];
2743
        loc_set_cmdline(argv, optind - 2, 2);
2744 2745 2746 2747 2748 2749 2750 2751 2752 2753
    } else {
        optarg = NULL;
    }

    *poptarg = optarg;
    *poptind = optind;

    return popt;
}

2754 2755 2756
static int machine_set_property(void *opaque,
                                const char *name, const char *value,
                                Error **errp)
2757 2758 2759
{
    Object *obj = OBJECT(opaque);
    Error *local_err = NULL;
2760
    char *c, *qom_name;
2761

2762
    if (strcmp(name, "type") == 0) {
2763 2764 2765
        return 0;
    }

2766 2767 2768 2769 2770 2771 2772 2773
    qom_name = g_strdup(name);
    c = qom_name;
    while (*c++) {
        if (*c == '_') {
            *c = '-';
        }
    }

2774
    object_property_parse(obj, value, qom_name, &local_err);
2775
    g_free(qom_name);
2776 2777

    if (local_err) {
2778
        error_report_err(local_err);
2779 2780 2781 2782 2783 2784
        return -1;
    }

    return 0;
}

2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797

/*
 * 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 已提交
2798

2799 2800 2801 2802 2803 2804
    /*
     * return false for concrete netfilters since
     * they depend on netdevs already existing
     */
    if (g_str_equal(type, "filter-buffer") ||
        g_str_equal(type, "filter-dump")) {
Y
Yang Hongyang 已提交
2805 2806 2807
        return false;
    }

2808 2809 2810 2811 2812 2813
    return true;
}


/*
 * The remainder of object creation happens after the
2814
 * creation of chardev, fsdev, net clients and device data types.
2815 2816 2817 2818 2819 2820 2821
 */
static bool object_create_delayed(const char *type)
{
    return !object_create_initial(type);
}


2822
static int object_create(void *opaque, QemuOpts *opts, Error **errp)
2823
{
P
Paolo Bonzini 已提交
2824 2825 2826 2827 2828 2829
    Error *err = NULL;
    char *type = NULL;
    char *id = NULL;
    void *dummy = NULL;
    OptsVisitor *ov;
    QDict *pdict;
2830
    bool (*type_predicate)(const char *) = opaque;
2831

P
Paolo Bonzini 已提交
2832 2833
    ov = opts_visitor_new(opts);
    pdict = qemu_opts_to_qdict(opts, NULL);
2834

P
Paolo Bonzini 已提交
2835 2836 2837
    visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0, &err);
    if (err) {
        goto out;
2838 2839
    }

P
Paolo Bonzini 已提交
2840 2841 2842 2843
    qdict_del(pdict, "qom-type");
    visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
    if (err) {
        goto out;
2844
    }
2845 2846 2847
    if (!type_predicate(type)) {
        goto out;
    }
2848

P
Paolo Bonzini 已提交
2849 2850 2851
    qdict_del(pdict, "id");
    visit_type_str(opts_get_visitor(ov), &id, "id", &err);
    if (err) {
2852 2853 2854
        goto out;
    }

P
Paolo Bonzini 已提交
2855 2856
    object_add(type, id, pdict, opts_get_visitor(ov), &err);
    if (err) {
2857 2858
        goto out;
    }
P
Paolo Bonzini 已提交
2859 2860 2861 2862 2863
    visit_end_struct(opts_get_visitor(ov), &err);
    if (err) {
        qmp_object_del(id, NULL);
    }

2864
out:
P
Paolo Bonzini 已提交
2865 2866 2867 2868 2869 2870 2871
    opts_visitor_cleanup(ov);

    QDECREF(pdict);
    g_free(id);
    g_free(type);
    g_free(dummy);
    if (err) {
2872
        error_report_err(err);
2873 2874
        return -1;
    }
2875 2876 2877
    return 0;
}

2878 2879
static void set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
                               MachineClass *mc)
2880 2881 2882 2883
{
    uint64_t sz;
    const char *mem_str;
    const char *maxmem_str, *slots_str;
2884
    const ram_addr_t default_ram_size = mc->default_ram_size;
2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921
    QemuOpts *opts = qemu_find_opts_singleton("memory");

    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 */
2922
    qemu_opt_set_number(opts, "size", ram_size, &error_abort);
2923 2924 2925 2926 2927 2928 2929 2930
    *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);
2931
        slots = qemu_opt_get_number(opts, "slots", 0);
2932
        if (sz < ram_size) {
2933 2934 2935 2936
            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);
2937
            exit(EXIT_FAILURE);
2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948
        } 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);
2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961
            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);
    }
}

M
malc 已提交
2962
int main(int argc, char **argv, char **envp)
2963
{
T
ths 已提交
2964
    int i;
2965
    int snapshot, linux_boot;
B
bellard 已提交
2966
    const char *initrd_filename;
2967
    const char *kernel_filename, *kernel_cmdline;
2968 2969
    const char *boot_order = NULL;
    const char *boot_once = NULL;
2970
    DisplayState *ds;
2971
    int cyls, heads, secs, translation;
2972
    QemuOpts *hda_opts = NULL, *opts, *machine_opts, *icount_opts = NULL;
2973
    QemuOptsList *olist;
2974
    int optind;
2975
    const char *optarg;
B
bellard 已提交
2976
    const char *loadvm = NULL;
2977
    MachineClass *machine_class;
2978
    const char *cpu_model;
2979
    const char *vga_model = NULL;
2980 2981
    const char *qtest_chrdev = NULL;
    const char *qtest_log = NULL;
2982
    const char *pid_file = NULL;
A
aliguori 已提交
2983
    const char *incoming = NULL;
J
Jes Sorensen 已提交
2984
#ifdef CONFIG_VNC
2985
    int show_vnc_port = 0;
J
Jes Sorensen 已提交
2986
#endif
2987
    bool defconfig = true;
2988
    bool userconfig = true;
2989 2990
    const char *log_mask = NULL;
    const char *log_file = NULL;
2991
    const char *trace_events = NULL;
2992
    const char *trace_file = NULL;
2993
    ram_addr_t maxram_size;
2994
    uint64_t ram_slots = 0;
2995
    FILE *vmstate_dump_file = NULL;
2996
    Error *main_loop_err = NULL;
2997
    Error *err = NULL;
2998

2999 3000 3001
    qemu_init_cpu_loop();
    qemu_mutex_lock_iothread();

G
Gerd Hoffmann 已提交
3002
    atexit(qemu_run_exit_notifiers);
3003
    error_set_progname(argv[0]);
3004
    qemu_init_exec_dir(argv[0]);
3005

3006 3007
    module_call_init(MODULE_INIT_QOM);

3008
    qemu_add_opts(&qemu_drive_opts);
3009 3010 3011
    qemu_add_drive_opts(&qemu_legacy_drive_opts);
    qemu_add_drive_opts(&qemu_common_drive_opts);
    qemu_add_drive_opts(&qemu_drive_opts);
3012 3013 3014 3015 3016 3017 3018 3019 3020 3021
    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);
I
Igor Mammedov 已提交
3022
    qemu_add_opts(&qemu_mem_opts);
3023
    qemu_add_opts(&qemu_smp_opts);
3024 3025 3026 3027
    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);
3028
    qemu_add_opts(&qemu_tpmdev_opts);
3029
    qemu_add_opts(&qemu_realtime_opts);
S
Seiji Aguchi 已提交
3030
    qemu_add_opts(&qemu_msg_opts);
3031
    qemu_add_opts(&qemu_name_opts);
3032
    qemu_add_opts(&qemu_numa_opts);
3033
    qemu_add_opts(&qemu_icount_opts);
3034
    qemu_add_opts(&qemu_semihosting_config_opts);
3035
    qemu_add_opts(&qemu_fw_cfg_opts);
3036

3037 3038
    runstate_init();

3039
    if (qcrypto_init(&err) < 0) {
3040
        error_reportf_err(err, "cannot initialize crypto: ");
3041 3042
        exit(1);
    }
3043
    rtc_clock = QEMU_CLOCK_HOST;
J
Jan Kiszka 已提交
3044

B
Blue Swirl 已提交
3045
    QLIST_INIT (&vm_change_state_head);
3046
    os_setup_early_signal_handling();
3047

3048
    module_call_init(MODULE_INIT_MACHINE);
3049
    machine_class = find_default_machine();
3050
    cpu_model = NULL;
3051
    snapshot = 0;
3052 3053
    cyls = heads = secs = 0;
    translation = BIOS_ATA_TRANSLATION_AUTO;
3054

B
bellard 已提交
3055
    nb_nics = 0;
3056

3057 3058
    bdrv_init_with_whitelist();

3059
    autostart = 1;
3060

3061 3062 3063 3064 3065
    /* first pass of option parsing */
    optind = 1;
    while (optind < argc) {
        if (argv[optind][0] != '-') {
            /* disk image */
3066
            optind++;
3067 3068 3069 3070 3071 3072
        } else {
            const QEMUOption *popt;

            popt = lookup_opt(argc, argv, &optarg, &optind);
            switch (popt->index) {
            case QEMU_OPTION_nodefconfig:
3073
                defconfig = false;
3074
                break;
3075 3076 3077
            case QEMU_OPTION_nouserconfig:
                userconfig = false;
                break;
3078 3079 3080 3081 3082
            }
        }
    }

    if (defconfig) {
3083
        int ret;
3084
        ret = qemu_read_default_config_files(userconfig);
3085
        if (ret < 0) {
3086
            exit(1);
3087 3088 3089 3090
        }
    }

    /* second pass of option parsing */
3091
    optind = 1;
3092
    for(;;) {
3093
        if (optind >= argc)
3094
            break;
3095
        if (argv[optind][0] != '-') {
3096
            hda_opts = drive_add(IF_DEFAULT, 0, argv[optind++], HD_OPTS);
3097 3098 3099
        } else {
            const QEMUOption *popt;

3100
            popt = lookup_opt(argc, argv, &optarg, &optind);
3101 3102 3103 3104
            if (!(popt->arch_mask & arch_type)) {
                printf("Option %s not supported for this target\n", popt->name);
                exit(1);
            }
3105
            switch(popt->index) {
3106 3107
            case QEMU_OPTION_no_kvm_irqchip: {
                olist = qemu_find_opts("machine");
3108
                qemu_opts_parse_noisily(olist, "kernel_irqchip=off", false);
3109 3110
                break;
            }
3111 3112
            case QEMU_OPTION_cpu:
                /* hw initialization will check this */
3113
                cpu_model = optarg;
3114
                break;
3115
            case QEMU_OPTION_hda:
3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130
                {
                    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;
                }
3131
            case QEMU_OPTION_hdb:
3132 3133
            case QEMU_OPTION_hdc:
            case QEMU_OPTION_hdd:
3134 3135
                drive_add(IF_DEFAULT, popt->index - QEMU_OPTION_hda, optarg,
                          HD_OPTS);
B
bellard 已提交
3136
                break;
T
ths 已提交
3137
            case QEMU_OPTION_drive:
3138 3139 3140
                if (drive_def(optarg) == NULL) {
                    exit(1);
                }
3141
                break;
G
Gerd Hoffmann 已提交
3142 3143 3144
            case QEMU_OPTION_set:
                if (qemu_set_option(optarg) != 0)
                    exit(1);
3145
                break;
3146 3147 3148
            case QEMU_OPTION_global:
                if (qemu_global_option(optarg) != 0)
                    exit(1);
3149
                break;
3150
            case QEMU_OPTION_mtdblock:
3151
                drive_add(IF_MTD, -1, optarg, MTD_OPTS);
3152
                break;
3153
            case QEMU_OPTION_sd:
3154
                drive_add(IF_SD, -1, optarg, SD_OPTS);
3155
                break;
3156
            case QEMU_OPTION_pflash:
3157
                drive_add(IF_PFLASH, -1, optarg, PFLASH_OPTS);
3158
                break;
3159
            case QEMU_OPTION_snapshot:
3160 3161
                snapshot = 1;
                break;
3162
            case QEMU_OPTION_hdachs:
3163 3164 3165 3166
                {
                    const char *p;
                    p = optarg;
                    cyls = strtol(p, (char **)&p, 0);
B
bellard 已提交
3167 3168
                    if (cyls < 1 || cyls > 16383)
                        goto chs_fail;
3169 3170 3171 3172
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    heads = strtol(p, (char **)&p, 0);
B
bellard 已提交
3173 3174
                    if (heads < 1 || heads > 16)
                        goto chs_fail;
3175 3176 3177 3178
                    if (*p != ',')
                        goto chs_fail;
                    p++;
                    secs = strtol(p, (char **)&p, 0);
B
bellard 已提交
3179 3180 3181 3182
                    if (secs < 1 || secs > 63)
                        goto chs_fail;
                    if (*p == ',') {
                        p++;
3183 3184 3185 3186 3187
                        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 已提交
3188
                            translation = BIOS_ATA_TRANSLATION_NONE;
3189
                        } else if (!strcmp(p, "lba")) {
B
bellard 已提交
3190
                            translation = BIOS_ATA_TRANSLATION_LBA;
3191
                        } else if (!strcmp(p, "auto")) {
B
bellard 已提交
3192
                            translation = BIOS_ATA_TRANSLATION_AUTO;
3193
                        } else {
B
bellard 已提交
3194
                            goto chs_fail;
3195
                        }
B
bellard 已提交
3196
                    } else if (*p != '\0') {
3197
                    chs_fail:
3198
                        error_report("invalid physical CHS format");
B
bellard 已提交
3199
                        exit(1);
3200
                    }
3201
                    if (hda_opts != NULL) {
3202 3203 3204 3205 3206 3207
                        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);
3208
                        if (translation == BIOS_ATA_TRANSLATION_LARGE) {
3209 3210
                            qemu_opt_set(hda_opts, "trans", "large",
                                         &error_abort);
3211
                        } else if (translation == BIOS_ATA_TRANSLATION_RECHS) {
3212 3213
                            qemu_opt_set(hda_opts, "trans", "rechs",
                                         &error_abort);
3214
                        } else if (translation == BIOS_ATA_TRANSLATION_LBA) {
3215 3216
                            qemu_opt_set(hda_opts, "trans", "lba",
                                         &error_abort);
3217
                        } else if (translation == BIOS_ATA_TRANSLATION_NONE) {
3218 3219
                            qemu_opt_set(hda_opts, "trans", "none",
                                         &error_abort);
3220
                        }
G
Gerd Hoffmann 已提交
3221
                    }
3222 3223
                }
                break;
3224
            case QEMU_OPTION_numa:
3225 3226
                opts = qemu_opts_parse_noisily(qemu_find_opts("numa"),
                                               optarg, true);
3227 3228 3229
                if (!opts) {
                    exit(1);
                }
3230
                break;
J
Jes Sorensen 已提交
3231 3232 3233
            case QEMU_OPTION_display:
                display_type = select_display(optarg);
                break;
3234
            case QEMU_OPTION_nographic:
3235
                display_type = DT_NOGRAPHIC;
3236
                break;
B
balrog 已提交
3237
            case QEMU_OPTION_curses:
3238
#ifdef CONFIG_CURSES
3239
                display_type = DT_CURSES;
3240
#else
3241
                error_report("curses support is disabled");
3242
                exit(1);
B
balrog 已提交
3243
#endif
3244
                break;
3245
            case QEMU_OPTION_portrait:
3246 3247 3248 3249 3250 3251
                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) {
3252
                    error_report("only 90, 180, 270 deg rotation is available");
3253 3254
                    exit(1);
                }
3255
                break;
3256
            case QEMU_OPTION_kernel:
3257 3258
                qemu_opts_set(qemu_find_opts("machine"), 0, "kernel", optarg,
                              &error_abort);
3259 3260
                break;
            case QEMU_OPTION_initrd:
3261 3262
                qemu_opts_set(qemu_find_opts("machine"), 0, "initrd", optarg,
                              &error_abort);
3263
                break;
3264
            case QEMU_OPTION_append:
3265 3266
                qemu_opts_set(qemu_find_opts("machine"), 0, "append", optarg,
                              &error_abort);
3267
                break;
G
Grant Likely 已提交
3268
            case QEMU_OPTION_dtb:
3269 3270
                qemu_opts_set(qemu_find_opts("machine"), 0, "dtb", optarg,
                              &error_abort);
G
Grant Likely 已提交
3271
                break;
3272
            case QEMU_OPTION_cdrom:
3273
                drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS);
3274
                break;
3275
            case QEMU_OPTION_boot:
3276 3277
                opts = qemu_opts_parse_noisily(qemu_find_opts("boot-opts"),
                                               optarg, true);
3278 3279
                if (!opts) {
                    exit(1);
3280 3281
                }
                break;
3282 3283
            case QEMU_OPTION_fda:
            case QEMU_OPTION_fdb:
3284 3285
                drive_add(IF_FLOPPY, popt->index - QEMU_OPTION_fda,
                          optarg, FD_OPTS);
3286
                break;
B
bellard 已提交
3287 3288 3289
            case QEMU_OPTION_no_fd_bootchk:
                fd_bootchk = 0;
                break;
M
Mark McLoughlin 已提交
3290
            case QEMU_OPTION_netdev:
3291
                if (net_client_parse(qemu_find_opts("netdev"), optarg) == -1) {
M
Mark McLoughlin 已提交
3292 3293 3294
                    exit(1);
                }
                break;
B
bellard 已提交
3295
            case QEMU_OPTION_net:
3296
                if (net_client_parse(qemu_find_opts("net"), optarg) == -1) {
3297 3298
                    exit(1);
                }
B
bellard 已提交
3299
                break;
3300 3301
#ifdef CONFIG_LIBISCSI
            case QEMU_OPTION_iscsi:
3302 3303
                opts = qemu_opts_parse_noisily(qemu_find_opts("iscsi"),
                                               optarg, false);
3304 3305 3306 3307 3308
                if (!opts) {
                    exit(1);
                }
                break;
#endif
B
bellard 已提交
3309 3310
#ifdef CONFIG_SLIRP
            case QEMU_OPTION_tftp:
3311
                legacy_tftp_prefix = optarg;
B
bellard 已提交
3312
                break;
3313
            case QEMU_OPTION_bootp:
3314
                legacy_bootp_filename = optarg;
3315
                break;
B
bellard 已提交
3316
            case QEMU_OPTION_redir:
M
Markus Armbruster 已提交
3317 3318
                if (net_slirp_redir(optarg) < 0)
                    exit(1);
B
bellard 已提交
3319
                break;
B
bellard 已提交
3320
#endif
3321
            case QEMU_OPTION_bt:
3322
                add_device_config(DEV_BT, optarg);
3323
                break;
3324 3325 3326 3327 3328 3329 3330
            case QEMU_OPTION_audio_help:
                AUD_help ();
                exit (0);
                break;
            case QEMU_OPTION_soundhw:
                select_soundhw (optarg);
                break;
3331
            case QEMU_OPTION_h:
3332
                help(0);
3333
                break;
P
pbrook 已提交
3334 3335 3336 3337
            case QEMU_OPTION_version:
                version();
                exit(0);
                break;
3338
            case QEMU_OPTION_m:
3339 3340
                opts = qemu_opts_parse_noisily(qemu_find_opts("memory"),
                                               optarg, true);
I
Igor Mammedov 已提交
3341 3342 3343
                if (!opts) {
                    exit(EXIT_FAILURE);
                }
3344
                break;
3345 3346 3347 3348 3349 3350 3351
#ifdef CONFIG_TPM
            case QEMU_OPTION_tpmdev:
                if (tpm_config_parse(qemu_find_opts("tpmdev"), optarg) < 0) {
                    exit(1);
                }
                break;
#endif
3352 3353 3354 3355 3356 3357
            case QEMU_OPTION_mempath:
                mem_path = optarg;
                break;
            case QEMU_OPTION_mem_prealloc:
                mem_prealloc = 1;
                break;
3358
            case QEMU_OPTION_d:
3359 3360 3361 3362
                log_mask = optarg;
                break;
            case QEMU_OPTION_D:
                log_file = optarg;
3363 3364
                break;
            case QEMU_OPTION_s:
3365
                add_device_config(DEV_GDB, "tcp::" DEFAULT_GDBSTUB_PORT);
3366
                break;
3367
            case QEMU_OPTION_gdb:
3368
                add_device_config(DEV_GDB, optarg);
3369 3370
                break;
            case QEMU_OPTION_L:
3371 3372 3373
                if (data_dir_idx < ARRAY_SIZE(data_dir)) {
                    data_dir[data_dir_idx++] = optarg;
                }
3374
                break;
3375
            case QEMU_OPTION_bios:
3376 3377
                qemu_opts_set(qemu_find_opts("machine"), 0, "firmware", optarg,
                              &error_abort);
3378
                break;
3379 3380 3381
            case QEMU_OPTION_singlestep:
                singlestep = 1;
                break;
3382
            case QEMU_OPTION_S:
3383
                autostart = 0;
3384
                break;
3385 3386 3387
            case QEMU_OPTION_k:
                keyboard_layout = optarg;
                break;
B
bellard 已提交
3388 3389 3390
            case QEMU_OPTION_localtime:
                rtc_utc = 0;
                break;
3391
            case QEMU_OPTION_vga:
B
Blue Swirl 已提交
3392
                vga_model = optarg;
3393
                default_vga = 0;
3394
                break;
3395 3396 3397 3398 3399 3400 3401 3402
            case QEMU_OPTION_g:
                {
                    const char *p;
                    int w, h, depth;
                    p = optarg;
                    w = strtol(p, (char **)&p, 10);
                    if (w <= 0) {
                    graphic_error:
3403
                        error_report("invalid resolution or depth");
3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414
                        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);
3415
                        if (depth != 8 && depth != 15 && depth != 16 &&
3416 3417 3418 3419 3420 3421 3422
                            depth != 24 && depth != 32)
                            goto graphic_error;
                    } else if (*p == '\0') {
                        depth = graphic_depth;
                    } else {
                        goto graphic_error;
                    }
3423

3424 3425 3426 3427 3428
                    graphic_width = w;
                    graphic_height = h;
                    graphic_depth = depth;
                }
                break;
T
ths 已提交
3429 3430 3431 3432 3433 3434 3435 3436
            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 已提交
3437
            case QEMU_OPTION_monitor:
G
Gerd Hoffmann 已提交
3438
                default_monitor = 0;
3439
                if (strncmp(optarg, "none", 4)) {
M
Max Reitz 已提交
3440
                    monitor_parse(optarg, "readline", false);
3441
                }
G
Gerd Hoffmann 已提交
3442 3443
                break;
            case QEMU_OPTION_qmp:
M
Max Reitz 已提交
3444 3445 3446 3447 3448
                monitor_parse(optarg, "control", false);
                default_monitor = 0;
                break;
            case QEMU_OPTION_qmp_pretty:
                monitor_parse(optarg, "control", true);
3449
                default_monitor = 0;
B
bellard 已提交
3450
                break;
G
Gerd Hoffmann 已提交
3451
            case QEMU_OPTION_mon:
3452 3453
                opts = qemu_opts_parse_noisily(qemu_find_opts("mon"), optarg,
                                               true);
G
Gerd Hoffmann 已提交
3454 3455 3456
                if (!opts) {
                    exit(1);
                }
3457
                default_monitor = 0;
G
Gerd Hoffmann 已提交
3458
                break;
3459
            case QEMU_OPTION_chardev:
3460 3461
                opts = qemu_opts_parse_noisily(qemu_find_opts("chardev"),
                                               optarg, true);
3462 3463 3464 3465
                if (!opts) {
                    exit(1);
                }
                break;
3466
            case QEMU_OPTION_fsdev:
3467 3468
                olist = qemu_find_opts("fsdev");
                if (!olist) {
3469
                    error_report("fsdev support is disabled");
3470 3471
                    exit(1);
                }
3472
                opts = qemu_opts_parse_noisily(olist, optarg, true);
3473 3474 3475 3476
                if (!opts) {
                    exit(1);
                }
                break;
3477
            case QEMU_OPTION_virtfs: {
3478 3479
                QemuOpts *fsdev;
                QemuOpts *device;
3480
                const char *writeout, *sock_fd, *socket;
3481

3482 3483
                olist = qemu_find_opts("virtfs");
                if (!olist) {
3484
                    error_report("virtfs support is disabled");
3485 3486
                    exit(1);
                }
3487
                opts = qemu_opts_parse_noisily(olist, optarg, true);
3488 3489 3490 3491
                if (!opts) {
                    exit(1);
                }

3492
                if (qemu_opt_get(opts, "fsdriver") == NULL ||
3493
                    qemu_opt_get(opts, "mount_tag") == NULL) {
3494
                    error_report("Usage: -virtfs fsdriver,mount_tag=tag");
3495 3496
                    exit(1);
                }
3497
                fsdev = qemu_opts_create(qemu_find_opts("fsdev"),
3498 3499
                                         qemu_opt_get(opts, "mount_tag"),
                                         1, NULL);
3500
                if (!fsdev) {
3501 3502
                    error_report("duplicate fsdev id: %s",
                                 qemu_opt_get(opts, "mount_tag"));
3503 3504
                    exit(1);
                }
3505 3506 3507 3508

                writeout = qemu_opt_get(opts, "writeout");
                if (writeout) {
#ifdef CONFIG_SYNC_FILE_RANGE
3509
                    qemu_opt_set(fsdev, "writeout", writeout, &error_abort);
3510
#else
3511 3512
                    error_report("writeout=immediate not supported "
                                 "on this platform");
3513 3514 3515
                    exit(1);
#endif
                }
3516 3517 3518 3519
                qemu_opt_set(fsdev, "fsdriver",
                             qemu_opt_get(opts, "fsdriver"), &error_abort);
                qemu_opt_set(fsdev, "path", qemu_opt_get(opts, "path"),
                             &error_abort);
3520
                qemu_opt_set(fsdev, "security_model",
3521 3522
                             qemu_opt_get(opts, "security_model"),
                             &error_abort);
3523 3524
                socket = qemu_opt_get(opts, "socket");
                if (socket) {
3525
                    qemu_opt_set(fsdev, "socket", socket, &error_abort);
3526
                }
3527 3528
                sock_fd = qemu_opt_get(opts, "sock_fd");
                if (sock_fd) {
3529
                    qemu_opt_set(fsdev, "sock_fd", sock_fd, &error_abort);
3530
                }
3531

3532
                qemu_opt_set_bool(fsdev, "readonly",
3533 3534
                                  qemu_opt_get_bool(opts, "readonly", 0),
                                  &error_abort);
3535 3536
                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                          &error_abort);
3537
                qemu_opt_set(device, "driver", "virtio-9p-pci", &error_abort);
3538
                qemu_opt_set(device, "fsdev",
3539
                             qemu_opt_get(opts, "mount_tag"), &error_abort);
3540
                qemu_opt_set(device, "mount_tag",
3541
                             qemu_opt_get(opts, "mount_tag"), &error_abort);
3542 3543
                break;
            }
3544 3545 3546 3547
            case QEMU_OPTION_virtfs_synth: {
                QemuOpts *fsdev;
                QemuOpts *device;

3548 3549
                fsdev = qemu_opts_create(qemu_find_opts("fsdev"), "v_synth",
                                         1, NULL);
3550
                if (!fsdev) {
3551
                    error_report("duplicate option: %s", "virtfs_synth");
3552 3553
                    exit(1);
                }
3554
                qemu_opt_set(fsdev, "fsdriver", "synth", &error_abort);
3555

3556 3557
                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
                                          &error_abort);
3558 3559 3560
                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);
3561 3562
                break;
            }
B
bellard 已提交
3563
            case QEMU_OPTION_serial:
3564 3565
                add_device_config(DEV_SERIAL, optarg);
                default_serial = 0;
3566 3567 3568
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
B
bellard 已提交
3569
                break;
R
Richard W.M. Jones 已提交
3570
            case QEMU_OPTION_watchdog:
M
Markus Armbruster 已提交
3571
                if (watchdog) {
3572
                    error_report("only one watchdog option may be given");
M
Markus Armbruster 已提交
3573 3574 3575
                    return 1;
                }
                watchdog = optarg;
R
Richard W.M. Jones 已提交
3576 3577 3578
                break;
            case QEMU_OPTION_watchdog_action:
                if (select_watchdog_action(optarg) == -1) {
3579
                    error_report("unknown -watchdog-action parameter");
R
Richard W.M. Jones 已提交
3580 3581 3582
                    exit(1);
                }
                break;
3583
            case QEMU_OPTION_virtiocon:
G
Gerd Hoffmann 已提交
3584 3585
                add_device_config(DEV_VIRTCON, optarg);
                default_virtcon = 0;
3586 3587 3588
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
3589
                break;
3590
            case QEMU_OPTION_parallel:
G
Gerd Hoffmann 已提交
3591 3592
                add_device_config(DEV_PARALLEL, optarg);
                default_parallel = 0;
3593 3594 3595
                if (strncmp(optarg, "mon:", 4) == 0) {
                    default_monitor = 0;
                }
3596
                break;
3597 3598 3599
            case QEMU_OPTION_debugcon:
                add_device_config(DEV_DEBUGCON, optarg);
                break;
3600 3601 3602
            case QEMU_OPTION_loadvm:
                loadvm = optarg;
                break;
B
bellard 已提交
3603 3604 3605
            case QEMU_OPTION_full_screen:
                full_screen = 1;
                break;
3606 3607 3608
            case QEMU_OPTION_no_frame:
                no_frame = 1;
                break;
T
ths 已提交
3609 3610 3611
            case QEMU_OPTION_alt_grab:
                alt_grab = 1;
                break;
3612 3613 3614
            case QEMU_OPTION_ctrl_grab:
                ctrl_grab = 1;
                break;
T
ths 已提交
3615 3616 3617
            case QEMU_OPTION_no_quit:
                no_quit = 1;
                break;
3618
            case QEMU_OPTION_sdl:
3619
#ifdef CONFIG_SDL
3620
                display_type = DT_SDL;
3621
                break;
3622
#else
3623
                error_report("SDL support is disabled");
3624
                exit(1);
T
ths 已提交
3625
#endif
B
bellard 已提交
3626
            case QEMU_OPTION_pidfile:
3627
                pid_file = optarg;
B
bellard 已提交
3628
                break;
3629 3630 3631
            case QEMU_OPTION_win2k_hack:
                win2k_install_hack = 1;
                break;
3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642
            case QEMU_OPTION_rtc_td_hack: {
                static GlobalProperty slew_lost_ticks[] = {
                    {
                        .driver   = "mc146818rtc",
                        .property = "lost_tick_policy",
                        .value    = "slew",
                    },
                    { /* end of list */ }
                };

                qdev_prop_register_global_list(slew_lost_ticks);
3643
                break;
3644
            }
3645
            case QEMU_OPTION_acpitable:
3646 3647
                opts = qemu_opts_parse_noisily(qemu_find_opts("acpi"),
                                               optarg, true);
3648 3649 3650
                if (!opts) {
                    exit(1);
                }
3651
                do_acpitable_option(opts);
3652
                break;
3653
            case QEMU_OPTION_smbios:
3654 3655
                opts = qemu_opts_parse_noisily(qemu_find_opts("smbios"),
                                               optarg, false);
3656 3657 3658
                if (!opts) {
                    exit(1);
                }
M
Markus Armbruster 已提交
3659
                do_smbios_option(opts);
3660
                break;
3661
            case QEMU_OPTION_fwcfg:
3662 3663
                opts = qemu_opts_parse_noisily(qemu_find_opts("fw_cfg"),
                                               optarg, true);
3664 3665 3666 3667
                if (opts == NULL) {
                    exit(1);
                }
                break;
A
aliguori 已提交
3668
            case QEMU_OPTION_enable_kvm:
3669
                olist = qemu_find_opts("machine");
3670
                qemu_opts_parse_noisily(olist, "accel=kvm", false);
3671
                break;
3672
            case QEMU_OPTION_M:
3673 3674
            case QEMU_OPTION_machine:
                olist = qemu_find_opts("machine");
3675
                opts = qemu_opts_parse_noisily(olist, optarg, true);
3676 3677 3678
                if (!opts) {
                    exit(1);
                }
A
aliguori 已提交
3679
                break;
J
Jan Kiszka 已提交
3680 3681
             case QEMU_OPTION_no_kvm:
                olist = qemu_find_opts("machine");
3682
                qemu_opts_parse_noisily(olist, "accel=tcg", false);
J
Jan Kiszka 已提交
3683
                break;
3684
            case QEMU_OPTION_no_kvm_pit: {
3685
                error_report("warning: ignoring deprecated option");
3686 3687
                break;
            }
3688 3689 3690 3691 3692 3693 3694 3695 3696 3697
            case QEMU_OPTION_no_kvm_pit_reinjection: {
                static GlobalProperty kvm_pit_lost_tick_policy[] = {
                    {
                        .driver   = "kvm-pit",
                        .property = "lost_tick_policy",
                        .value    = "discard",
                    },
                    { /* end of list */ }
                };

3698 3699
                error_report("warning: deprecated, replaced by "
                             "-global kvm-pit.lost_tick_policy=discard");
3700 3701 3702
                qdev_prop_register_global_list(kvm_pit_lost_tick_policy);
                break;
            }
B
bellard 已提交
3703
            case QEMU_OPTION_usb:
P
Peter Maydell 已提交
3704
                olist = qemu_find_opts("machine");
3705
                qemu_opts_parse_noisily(olist, "usb=on", false);
B
bellard 已提交
3706
                break;
B
bellard 已提交
3707
            case QEMU_OPTION_usbdevice:
P
Peter Maydell 已提交
3708
                olist = qemu_find_opts("machine");
3709
                qemu_opts_parse_noisily(olist, "usb=on", false);
3710 3711 3712
                add_device_config(DEV_USB, optarg);
                break;
            case QEMU_OPTION_device:
3713 3714
                if (!qemu_opts_parse_noisily(qemu_find_opts("device"),
                                             optarg, true)) {
G
Gerd Hoffmann 已提交
3715 3716
                    exit(1);
                }
B
bellard 已提交
3717
                break;
B
bellard 已提交
3718
            case QEMU_OPTION_smp:
3719 3720
                if (!qemu_opts_parse_noisily(qemu_find_opts("smp-opts"),
                                             optarg, true)) {
3721 3722
                    exit(1);
                }
B
bellard 已提交
3723
                break;
3724
            case QEMU_OPTION_vnc:
3725
            {
J
Jes Sorensen 已提交
3726
#ifdef CONFIG_VNC
3727 3728 3729 3730
                Error *local_err = NULL;

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

P
Pavel Dovgalyuk 已提交
4020 4021
    replay_configure(icount_opts);

4022 4023 4024 4025 4026 4027
    opts = qemu_get_machine_opts();
    optarg = qemu_opt_get(opts, "type");
    if (optarg) {
        machine_class = machine_parse(optarg);
    }

4028
    if (machine_class == NULL) {
4029 4030
        error_report("No machine specified, and there is no default");
        error_printf("Use -machine help to list supported machines\n");
4031 4032 4033 4034
        exit(1);
    }

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

4036
    loc_set_none();
4037

4038 4039
    os_daemonize();

4040
    if (qemu_init_main_loop(&main_loop_err)) {
4041
        error_report_err(main_loop_err);
P
Paolo Bonzini 已提交
4042 4043 4044
        exit(1);
    }

4045 4046
    if (qemu_opts_foreach(qemu_find_opts("sandbox"),
                          parse_sandbox, NULL, NULL)) {
4047 4048 4049
        exit(1);
    }

4050 4051
    if (qemu_opts_foreach(qemu_find_opts("name"),
                          parse_name, NULL, NULL)) {
4052 4053 4054
        exit(1);
    }

4055
#ifndef _WIN32
4056 4057
    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
                          parse_add_fd, NULL, NULL)) {
4058 4059 4060
        exit(1);
    }

4061 4062
    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
                          cleanup_add_fd, NULL, NULL)) {
4063 4064 4065 4066
        exit(1);
    }
#endif

4067 4068
    current_machine = MACHINE(object_new(object_class_get_name(
                          OBJECT_CLASS(machine_class))));
M
Marcel Apfelbaum 已提交
4069 4070 4071
    if (machine_help_func(qemu_get_machine_opts(), current_machine)) {
        exit(0);
    }
4072 4073
    object_property_add_child(object_get_root(), "machine",
                              OBJECT(current_machine), &error_abort);
4074
    cpu_exec_init_all();
4075

4076
    if (machine_class->hw_version) {
4077
        qemu_set_hw_version(machine_class->hw_version);
4078 4079
    }

4080 4081 4082 4083 4084 4085 4086
    /* Init CPU def lists, based on config
     * - Must be called after all the qemu_read_config_file() calls
     * - Must be called before list_cpus()
     * - Must be called before machine->init()
     */
    cpudef_init();

4087
    if (cpu_model && is_help_option(cpu_model)) {
E
Eduardo Habkost 已提交
4088
        list_cpus(stdout, &fprintf, cpu_model);
4089 4090 4091
        exit(0);
    }

4092
    /* Open the logfile at this point and set the log mask if necessary.
4093
     */
4094 4095 4096 4097
    if (log_file) {
        qemu_set_log_filename(log_file);
    }

4098
    if (log_mask) {
4099 4100 4101 4102 4103 4104 4105
        int mask;
        mask = qemu_str_to_log_mask(log_mask);
        if (!mask) {
            qemu_print_log_usage(stdout);
            exit(1);
        }
        qemu_set_log(mask);
4106
    }
4107

4108
    if (!is_daemonized()) {
L
Lluís Vilanova 已提交
4109
        if (!trace_init_backends(trace_events, trace_file)) {
4110 4111
            exit(1);
        }
4112
    }
4113

P
Paul Brook 已提交
4114 4115
    /* If no data_dir is specified then try to find it relative to the
       executable path.  */
4116
    if (data_dir_idx < ARRAY_SIZE(data_dir)) {
4117
        data_dir[data_dir_idx] = os_find_datadir();
4118 4119 4120
        if (data_dir[data_dir_idx] != NULL) {
            data_dir_idx++;
        }
P
Paul Brook 已提交
4121
    }
4122
    /* If all else fails use the install path specified when building. */
4123 4124
    if (data_dir_idx < ARRAY_SIZE(data_dir)) {
        data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR;
P
Paul Brook 已提交
4125 4126
    }

4127
    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
4128

4129
    machine_class->max_cpus = machine_class->max_cpus ?: 1; /* Default to UP */
A
Andrew Jones 已提交
4130
    if (max_cpus > machine_class->max_cpus) {
4131 4132 4133
        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);
4134 4135 4136
        exit(1);
    }

4137 4138 4139 4140
    /*
     * Get the default machine options from the machine if it is not already
     * specified either by the configuration file or by the command line.
     */
4141
    if (machine_class->default_machine_opts) {
4142
        qemu_opts_set_defaults(qemu_find_opts("machine"),
4143
                               machine_class->default_machine_opts, 0);
4144 4145
    }

4146 4147 4148 4149
    qemu_opts_foreach(qemu_find_opts("device"),
                      default_driver_check, NULL, NULL);
    qemu_opts_foreach(qemu_find_opts("global"),
                      default_driver_check, NULL, NULL);
4150

4151 4152 4153
    if (!vga_model && !default_vga) {
        vga_interface_type = VGA_DEVICE;
    }
4154
    if (!has_defaults || machine_class->no_serial) {
4155 4156
        default_serial = 0;
    }
4157
    if (!has_defaults || machine_class->no_parallel) {
4158 4159
        default_parallel = 0;
    }
4160
    if (!has_defaults || !machine_class->use_virtcon) {
4161 4162
        default_virtcon = 0;
    }
4163
    if (!has_defaults || !machine_class->use_sclp) {
4164 4165
        default_sclp = 0;
    }
4166
    if (!has_defaults || machine_class->no_floppy) {
G
Gerd Hoffmann 已提交
4167 4168
        default_floppy = 0;
    }
4169
    if (!has_defaults || machine_class->no_cdrom) {
G
Gerd Hoffmann 已提交
4170 4171
        default_cdrom = 0;
    }
4172
    if (!has_defaults || machine_class->no_sdcard) {
G
Gerd Hoffmann 已提交
4173 4174
        default_sdcard = 0;
    }
4175 4176 4177 4178 4179
    if (!has_defaults) {
        default_monitor = 0;
        default_net = 0;
        default_vga = 0;
    }
4180

4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193
    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.
         */
        if (display_type == DT_NOGRAPHIC
            && (default_parallel || default_serial
                || default_monitor || default_virtcon)) {
E
Eduardo Habkost 已提交
4194
            error_report("-nographic cannot be used with -daemonize");
4195 4196 4197 4198
            exit(1);
        }
#ifdef CONFIG_CURSES
        if (display_type == DT_CURSES) {
E
Eduardo Habkost 已提交
4199
            error_report("curses display cannot be used with -daemonize");
4200 4201 4202 4203 4204
            exit(1);
        }
#endif
    }

4205
    if (display_type == DT_NOGRAPHIC) {
G
Gerd Hoffmann 已提交
4206 4207
        if (default_parallel)
            add_device_config(DEV_PARALLEL, "null");
G
Gerd Hoffmann 已提交
4208 4209
        if (default_serial && default_monitor) {
            add_device_config(DEV_SERIAL, "mon:stdio");
4210 4211
        } else if (default_virtcon && default_monitor) {
            add_device_config(DEV_VIRTCON, "mon:stdio");
4212 4213
        } else if (default_sclp && default_monitor) {
            add_device_config(DEV_SCLP, "mon:stdio");
G
Gerd Hoffmann 已提交
4214 4215 4216
        } else {
            if (default_serial)
                add_device_config(DEV_SERIAL, "stdio");
4217 4218
            if (default_virtcon)
                add_device_config(DEV_VIRTCON, "stdio");
4219 4220 4221
            if (default_sclp) {
                add_device_config(DEV_SCLP, "stdio");
            }
G
Gerd Hoffmann 已提交
4222
            if (default_monitor)
M
Max Reitz 已提交
4223
                monitor_parse("stdio", "readline", false);
G
Gerd Hoffmann 已提交
4224
        }
4225 4226 4227
    } else {
        if (default_serial)
            add_device_config(DEV_SERIAL, "vc:80Cx24C");
G
Gerd Hoffmann 已提交
4228 4229
        if (default_parallel)
            add_device_config(DEV_PARALLEL, "vc:80Cx24C");
G
Gerd Hoffmann 已提交
4230
        if (default_monitor)
M
Max Reitz 已提交
4231
            monitor_parse("vc:80Cx24C", "readline", false);
4232 4233
        if (default_virtcon)
            add_device_config(DEV_VIRTCON, "vc:80Cx24C");
4234 4235 4236
        if (default_sclp) {
            add_device_config(DEV_SCLP, "vc:80Cx24C");
        }
4237 4238
    }

G
Gerd Hoffmann 已提交
4239 4240 4241 4242 4243
#if defined(CONFIG_VNC)
    if (!QTAILQ_EMPTY(&(qemu_find_opts("vnc")->head))) {
        display_remote++;
    }
#endif
A
Anthony Liguori 已提交
4244 4245 4246 4247 4248 4249
    if (display_type == DT_DEFAULT && !display_remote) {
#if defined(CONFIG_GTK)
        display_type = DT_GTK;
#elif defined(CONFIG_SDL) || defined(CONFIG_COCOA)
        display_type = DT_SDL;
#elif defined(CONFIG_VNC)
4250
        vnc_parse("localhost:0,to=99,id=default", &error_abort);
A
Anthony Liguori 已提交
4251 4252 4253 4254 4255 4256
        show_vnc_port = 1;
#else
        display_type = DT_NONE;
#endif
    }

4257
    if ((no_frame || alt_grab || ctrl_grab) && display_type != DT_SDL) {
4258 4259
        error_report("-no-frame, -alt-grab and -ctrl-grab are only valid "
                     "for SDL, ignoring option");
4260 4261
    }
    if (no_quit && (display_type != DT_GTK && display_type != DT_SDL)) {
4262 4263
        error_report("-no-quit is only valid for GTK and SDL, "
                     "ignoring option");
4264 4265
    }

A
Anthony Liguori 已提交
4266 4267
#if defined(CONFIG_GTK)
    if (display_type == DT_GTK) {
4268
        early_gtk_display_init(request_opengl);
A
Anthony Liguori 已提交
4269 4270
    }
#endif
4271 4272 4273 4274 4275 4276 4277
#if defined(CONFIG_SDL)
    if (display_type == DT_SDL) {
        sdl_display_early_init(request_opengl);
    }
#endif
    if (request_opengl == 1 && display_opengl == 0) {
#if defined(CONFIG_OPENGL)
4278
        error_report("OpenGL is not supported by the display");
4279
#else
4280
        error_report("OpenGL support is disabled");
4281 4282 4283
#endif
        exit(1);
    }
A
Anthony Liguori 已提交
4284

4285
    page_size_init();
T
TeLeMan 已提交
4286 4287
    socket_init();

4288 4289 4290
    if (qemu_opts_foreach(qemu_find_opts("object"),
                          object_create,
                          object_create_initial, NULL)) {
4291
        exit(1);
4292 4293
    }

4294 4295 4296 4297 4298
    if (qemu_opts_foreach(qemu_find_opts("chardev"),
                          chardev_init_func, NULL, NULL)) {
        exit(1);
    }

4299
#ifdef CONFIG_VIRTFS
4300 4301
    if (qemu_opts_foreach(qemu_find_opts("fsdev"),
                          fsdev_init_func, NULL, NULL)) {
4302 4303 4304
        exit(1);
    }
#endif
4305

4306
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
4307
        error_report("could not acquire pid file: %s", strerror(errno));
4308 4309 4310
        exit(1);
    }

4311 4312
    if (qemu_opts_foreach(qemu_find_opts("device"),
                          device_help_func, NULL, NULL)) {
4313 4314 4315
        exit(0);
    }

4316
    machine_opts = qemu_get_machine_opts();
4317 4318
    if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
                         NULL)) {
4319 4320 4321 4322
        object_unref(OBJECT(current_machine));
        exit(1);
    }

4323
    configure_accelerator(current_machine);
M
Marcelo Tosatti 已提交
4324

4325
    if (qtest_chrdev) {
4326
        qtest_init(qtest_chrdev, qtest_log, &error_fatal);
4327 4328
    }

4329 4330 4331 4332
    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 已提交
4333
    bios_name = qemu_opt_get(machine_opts, "firmware");
4334

4335 4336
    opts = qemu_opts_find(qemu_find_opts("boot-opts"), NULL);
    if (opts) {
4337 4338
        boot_order = qemu_opt_get(opts, "order");
        if (boot_order) {
4339
            validate_bootdevices(boot_order, &error_fatal);
4340 4341
        }

4342 4343
        boot_once = qemu_opt_get(opts, "once");
        if (boot_once) {
4344
            validate_bootdevices(boot_once, &error_fatal);
4345 4346 4347
        }

        boot_menu = qemu_opt_get_bool(opts, "menu", boot_menu);
4348
        boot_strict = qemu_opt_get_bool(opts, "strict", false);
4349 4350
    }

4351 4352 4353 4354
    if (!boot_order) {
        boot_order = machine_class->default_boot_order;
    }

4355 4356
    if (!kernel_cmdline) {
        kernel_cmdline = "";
4357
        current_machine->kernel_cmdline = (char *)kernel_cmdline;
4358 4359
    }

4360
    linux_boot = (kernel_filename != NULL);
B
balrog 已提交
4361

4362
    if (!linux_boot && *kernel_cmdline != '\0') {
4363
        error_report("-append only allowed with -kernel option");
4364 4365 4366 4367
        exit(1);
    }

    if (!linux_boot && initrd_filename != NULL) {
4368
        error_report("-initrd only allowed with -kernel option");
4369 4370 4371
        exit(1);
    }

4372
    if (!linux_boot && qemu_opt_get(machine_opts, "dtb")) {
4373
        error_report("-dtb only allowed with -kernel option");
G
Grant Likely 已提交
4374 4375 4376
        exit(1);
    }

4377 4378 4379 4380 4381
    if (semihosting_enabled() && !semihosting_get_argc() && kernel_filename) {
        /* fall back to the -kernel/-append */
        semihosting_arg_fallback(kernel_filename, kernel_cmdline);
    }

4382
    os_set_line_buffering();
4383

A
Alon Levy 已提交
4384 4385 4386 4387 4388
#ifdef CONFIG_SPICE
    /* spice needs the timers to be initialized by this point */
    qemu_spice_init();
#endif

4389
    cpu_ticks_init();
4390 4391
    if (icount_opts) {
        if (kvm_enabled() || xen_enabled()) {
4392
            error_report("-icount is not allowed with kvm or xen");
4393 4394 4395 4396
            exit(1);
        }
        configure_icount(icount_opts, &error_abort);
        qemu_opts_del(icount_opts);
4397
    }
4398

4399 4400 4401
    /* clean up network at qemu process termination */
    atexit(&net_cleanup);

4402 4403
    if (net_init_clients() < 0) {
        exit(1);
B
bellard 已提交
4404
    }
B
bellard 已提交
4405

4406 4407 4408 4409 4410 4411
    if (qemu_opts_foreach(qemu_find_opts("object"),
                          object_create,
                          object_create_delayed, NULL)) {
        exit(1);
    }

4412 4413 4414 4415 4416 4417
#ifdef CONFIG_TPM
    if (tpm_init() < 0) {
        exit(1);
    }
#endif

4418
    /* init the bluetooth world */
4419 4420
    if (foreach_device_config(DEV_BT, bt_parse))
        exit(1);
4421

4422 4423 4424
    if (!xen_enabled()) {
        /* On 32-bit hosts, QEMU is limited by virtual address space */
        if (ram_size > (2047 << 20) && HOST_LONG_BITS == 32) {
4425
            error_report("at most 2047 MB RAM can be simulated");
4426 4427 4428
            exit(1);
        }
    }
4429

L
lirans@il.ibm.com 已提交
4430
    blk_mig_init();
4431
    ram_mig_init();
L
lirans@il.ibm.com 已提交
4432

4433 4434 4435 4436 4437 4438 4439
    /* 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 已提交
4440
    /* open the virtual block devices */
P
Pavel Dovgalyuk 已提交
4441 4442 4443 4444
    if (snapshot || replay_mode != REPLAY_MODE_NONE) {
        qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
                          NULL, NULL);
    }
4445
    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
4446
                          &machine_class->block_default_type, NULL)) {
G
Gerd Hoffmann 已提交
4447
        exit(1);
4448
    }
4449

4450
    default_drive(default_cdrom, snapshot, machine_class->block_default_type, 2,
4451 4452 4453
                  CDROM_OPTS);
    default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS);
    default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS);
4454

4455
    parse_numa_opts(machine_class);
4456

4457 4458
    if (qemu_opts_foreach(qemu_find_opts("mon"),
                          mon_init_func, NULL, NULL)) {
4459 4460 4461
        exit(1);
    }

4462 4463
    if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
        exit(1);
G
Gerd Hoffmann 已提交
4464 4465
    if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
        exit(1);
G
Gerd Hoffmann 已提交
4466 4467
    if (foreach_device_config(DEV_VIRTCON, virtcon_parse) < 0)
        exit(1);
4468 4469 4470
    if (foreach_device_config(DEV_SCLP, sclp_parse) < 0) {
        exit(1);
    }
4471 4472
    if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)
        exit(1);
4473

4474
    /* If no default VGA is requested, the default is "none".  */
4475
    if (default_vga) {
4476 4477 4478
        if (machine_class->default_display) {
            vga_model = machine_class->default_display;
        } else if (cirrus_vga_available()) {
4479 4480 4481 4482
            vga_model = "cirrus";
        } else if (vga_available()) {
            vga_model = "std";
        }
B
Blue Swirl 已提交
4483
    }
4484 4485 4486
    if (vga_model) {
        select_vgahw(vga_model);
    }
B
Blue Swirl 已提交
4487

M
Markus Armbruster 已提交
4488 4489 4490 4491 4492 4493
    if (watchdog) {
        i = select_watchdog(watchdog);
        if (i > 0)
            exit (i == 1 ? 1 : 0);
    }

4494 4495
    if (machine_class->compat_props) {
        qdev_prop_register_global_list(machine_class->compat_props);
4496
    }
4497 4498
    qemu_add_globals();

P
Pavel Dovgalyuk 已提交
4499 4500 4501 4502
    /* 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);
4503 4504
    qdev_machine_init();

4505
    current_machine->ram_size = ram_size;
4506 4507
    current_machine->maxram_size = maxram_size;
    current_machine->ram_slots = ram_slots;
4508 4509 4510 4511
    current_machine->boot_order = boot_order;
    current_machine->cpu_model = cpu_model;

    machine_class->init(current_machine);
4512

4513 4514
    realtime_init();

4515 4516
    audio_init();

4517
    cpu_synchronize_all_post_init();
4518

4519
    numa_post_machine_init();
4520

4521 4522 4523 4524 4525
    if (qemu_opts_foreach(qemu_find_opts("fw_cfg"),
                          parse_fw_cfg, fw_cfg_find(), NULL) != 0) {
        exit(1);
    }

4526
    /* init USB devices */
4527
    if (usb_enabled()) {
M
Markus Armbruster 已提交
4528 4529
        if (foreach_device_config(DEV_USB, usb_parse) < 0)
            exit(1);
4530 4531
    }

4532 4533 4534
    /* Check if IGD GFX passthrough. */
    igd_gfx_passthru();

4535
    /* init generic devices */
4536 4537
    if (qemu_opts_foreach(qemu_find_opts("device"),
                          device_init_func, NULL, NULL)) {
4538
        exit(1);
4539
    }
4540

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

4544 4545
    net_check_clients();

4546 4547 4548 4549
    if (boot_once) {
        Error *local_err = NULL;
        qemu_boot_set(boot_once, &local_err);
        if (local_err) {
4550
            error_report_err(local_err);
4551 4552 4553 4554 4555
            exit(1);
        }
        qemu_register_reset(restore_boot_order, g_strdup(boot_order));
    }

4556
    ds = init_displaystate();
4557

4558
    /* init local displays */
4559 4560
    switch (display_type) {
    case DT_NOGRAPHIC:
4561
        (void)ds;	/* avoid warning if no display is configured */
4562
        break;
B
balrog 已提交
4563
#if defined(CONFIG_CURSES)
4564
    case DT_CURSES:
4565
        curses_display_init(ds, full_screen);
4566
        break;
B
balrog 已提交
4567
#endif
4568
#if defined(CONFIG_SDL)
4569 4570 4571
    case DT_SDL:
        sdl_display_init(ds, full_screen, no_frame);
        break;
4572
#elif defined(CONFIG_COCOA)
4573 4574 4575
    case DT_SDL:
        cocoa_display_init(ds, full_screen);
        break;
A
Anthony Liguori 已提交
4576 4577 4578
#endif
#if defined(CONFIG_GTK)
    case DT_GTK:
4579
        gtk_display_init(ds, full_screen, grab_on_hover);
A
Anthony Liguori 已提交
4580
        break;
4581
#endif
4582 4583 4584 4585
    default:
        break;
    }

4586 4587 4588
    /* must be after terminal init, SDL library changes signal handlers */
    os_setup_signal_handling();

J
Jes Sorensen 已提交
4589
#ifdef CONFIG_VNC
4590
    /* init remote displays */
4591 4592
    qemu_opts_foreach(qemu_find_opts("vnc"),
                      vnc_init_func, NULL, NULL);
4593
    if (show_vnc_port) {
4594
        char *ret = vnc_display_local_addr("default");
E
Eduardo Habkost 已提交
4595
        printf("VNC server running on '%s'\n", ret);
4596
        g_free(ret);
4597
    }
J
Jes Sorensen 已提交
4598
#endif
G
Gerd Hoffmann 已提交
4599
#ifdef CONFIG_SPICE
G
Gerd Hoffmann 已提交
4600 4601
    if (using_spice) {
        qemu_spice_display_init();
G
Gerd Hoffmann 已提交
4602 4603
    }
#endif
4604

4605
    if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
4606
        exit(1);
4607 4608
    }

4609 4610
    qdev_machine_creation_done();

4611 4612 4613
    /* 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());
4614 4615
    qemu_run_machine_init_done_notifiers();

4616
    if (rom_check_and_register_reset() != 0) {
4617
        error_report("rom check and register reset failed");
4618 4619
        exit(1);
    }
4620

4621 4622
    replay_start();

P
Pavel Dovgalyuk 已提交
4623 4624 4625 4626
    /* 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 已提交
4627
    qemu_system_reset(VMRESET_SILENT);
4628
    register_global_state();
4629
    if (loadvm) {
4630
        if (load_vmstate(loadvm) < 0) {
4631 4632 4633
            autostart = 0;
        }
    }
B
bellard 已提交
4634

4635
    qdev_prop_check_globals();
4636 4637 4638 4639 4640
    if (vmstate_dump_file) {
        /* dump and exit */
        dump_vmstate_json_to_file(vmstate_dump_file);
        return 0;
    }
4641

G
Glauber Costa 已提交
4642
    if (incoming) {
4643 4644 4645
        Error *local_err = NULL;
        qemu_start_incoming_migration(incoming, &local_err);
        if (local_err) {
4646
            error_reportf_err(local_err, "-incoming %s: ", incoming);
4647
            exit(1);
J
Juan Quintela 已提交
4648
        }
4649
    } else if (autostart) {
4650
        vm_start();
4651
    }
4652

4653
    os_setup_post();
T
ths 已提交
4654

4655
    if (is_daemonized()) {
L
Lluís Vilanova 已提交
4656
        if (!trace_init_backends(trace_events, trace_file)) {
4657 4658 4659 4660
            exit(1);
        }
    }

4661
    main_loop();
4662 4663
    replay_disable_events();

P
Paolo Bonzini 已提交
4664 4665
    bdrv_close_all();
    pause_all_vcpus();
W
wayne 已提交
4666
    res_free();
4667 4668 4669
#ifdef CONFIG_TPM
    tpm_cleanup();
#endif
T
ths 已提交
4670

4671 4672
    return 0;
}