diff options
Diffstat (limited to 'vl.c')
-rw-r--r-- | vl.c | 480 |
1 files changed, 265 insertions, 215 deletions
@@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include "qemu/osdep.h" -#include "qemu-version.h" #include "qemu/cutils.h" #include "qemu/help_option.h" @@ -52,6 +51,7 @@ int main(int argc, char **argv) #define main qemu_main #endif /* CONFIG_COCOA */ +#include <glib.h> #include "qemu/error-report.h" #include "qemu/sockets.h" @@ -80,7 +80,6 @@ int main(int argc, char **argv) #include "qemu/timer.h" #include "sysemu/char.h" #include "qemu/bitmap.h" -#include "qemu/log.h" #include "sysemu/blockdev.h" #include "hw/block/block.h" #include "migration/block.h" @@ -88,7 +87,6 @@ int main(int argc, char **argv) #include "sysemu/dma.h" #include "audio/audio.h" #include "migration/migration.h" -#include "sysemu/cpus.h" #include "sysemu/kvm.h" #include "qapi/qmp/qjson.h" #include "qemu/option.h" @@ -129,8 +127,10 @@ static const char *data_dir[16]; static int data_dir_idx; const char *bios_name = NULL; enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; +DisplayType display_type = DT_DEFAULT; int request_opengl = -1; int display_opengl; +static int display_remote; const char* keyboard_layout = NULL; ram_addr_t ram_size; const char *mem_path = NULL; @@ -146,7 +146,9 @@ int vga_interface_type = VGA_NONE; static int full_screen = 0; static int no_frame = 0; int no_quit = 0; +#ifdef CONFIG_GTK static bool grab_on_hover; +#endif CharDriverState *serial_hds[MAX_SERIAL_PORTS]; CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES]; @@ -154,7 +156,7 @@ CharDriverState *sclp_hds[MAX_SCLP_CONSOLES]; int win2k_install_hack = 0; int singlestep = 0; int smp_cpus = 1; -int max_cpus = 1; +int max_cpus = 0; int smp_cores = 1; int smp_threads = 1; int acpi_enabled = 1; @@ -207,7 +209,6 @@ static int default_floppy = 1; static int default_cdrom = 1; static int default_sdcard = 1; static int default_vga = 1; -static int default_net = 1; static struct { const char *driver; @@ -262,6 +263,26 @@ static QemuOptsList qemu_sandbox_opts = { }, }; +static QemuOptsList qemu_trace_opts = { + .name = "trace", + .implied_opt_name = "enable", + .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head), + .desc = { + { + .name = "enable", + .type = QEMU_OPT_STRING, + }, + { + .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", @@ -873,13 +894,16 @@ static void configure_rtc(QemuOpts *opts) value = qemu_opt_get(opts, "driftfix"); if (value) { if (!strcmp(value, "slew")) { - static GlobalProperty slew_lost_ticks = { - .driver = "mc146818rtc", - .property = "lost_tick_policy", - .value = "slew", + static GlobalProperty slew_lost_ticks[] = { + { + .driver = "mc146818rtc", + .property = "lost_tick_policy", + .value = "slew", + }, + { /* end of list */ } }; - qdev_prop_register_global(&slew_lost_ticks); + qdev_prop_register_global_list(slew_lost_ticks); } else if (!strcmp(value, "none")) { /* discard is default */ } else { @@ -1052,6 +1076,11 @@ bool defaults_enabled(void) return has_defaults; } +bool usb_enabled(void) +{ + return machine_usb(current_machine); +} + #ifndef _WIN32 static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp) { @@ -1198,6 +1227,7 @@ static QemuOptsList qemu_smp_opts = { static void smp_parse(QemuOpts *opts) { if (opts) { + unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); unsigned cores = qemu_opt_get_number(opts, "cores", 0); @@ -1214,10 +1244,8 @@ static void smp_parse(QemuOpts *opts) } else if (cores == 0) { threads = threads > 0 ? threads : 1; cores = cpus / (sockets * threads); - cores = cores > 0 ? cores : 1; } else if (threads == 0) { threads = cpus / (cores * sockets); - threads = threads > 0 ? threads : 1; } else if (sockets * cores * threads < cpus) { error_report("cpu topology: " "sockets (%u) * cores (%u) * threads (%u) < " @@ -1227,17 +1255,6 @@ static void smp_parse(QemuOpts *opts) } max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus); - - if (max_cpus > MAX_CPUMASK_BITS) { - error_report("unsupported number of maxcpus"); - exit(1); - } - - if (max_cpus < cpus) { - error_report("maxcpus must be equal to or greater than smp"); - exit(1); - } - if (sockets * cores * threads > max_cpus) { error_report("cpu topology: " "sockets (%u) * cores (%u) * threads (%u) > " @@ -1247,11 +1264,25 @@ static void smp_parse(QemuOpts *opts) } smp_cpus = cpus; - smp_cores = cores; - smp_threads = threads; + smp_cores = cores > 0 ? cores : 1; + smp_threads = threads > 0 ? threads : 1; + } - if (smp_cpus > 1) { + if (max_cpus == 0) { + max_cpus = smp_cpus; + } + + if (max_cpus > MAX_CPUMASK_BITS) { + error_report("unsupported number of maxcpus"); + exit(1); + } + if (max_cpus < smp_cpus) { + error_report("maxcpus must be equal to or greater than smp"); + exit(1); + } + + 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); @@ -1366,7 +1397,7 @@ static int usb_device_add(const char *devname) const char *p; #endif - if (!machine_usb(current_machine)) { + if (!usb_enabled()) { return -1; } @@ -1398,7 +1429,7 @@ static int usb_device_del(const char *devname) return -1; } - if (!machine_usb(current_machine)) { + if (!usb_enabled()) { return -1; } @@ -1506,7 +1537,6 @@ MachineInfoList *qmp_query_machines(Error **errp) info->name = g_strdup(mc->name); info->cpu_max = !mc->max_cpus ? 1 : mc->max_cpus; - info->hotpluggable_cpus = !!mc->query_hotpluggable_cpus; entry = g_malloc0(sizeof(*entry)); entry->value = info; @@ -1914,8 +1944,7 @@ static void main_loop(void) static void version(void) { - printf("QEMU emulator version " QEMU_VERSION QEMU_PKGVERSION ", " - QEMU_COPYRIGHT "\n"); + printf("QEMU emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"); } static void help(int exitcode) @@ -1954,86 +1983,99 @@ static const QEMUOption qemu_options[] = { { NULL }, }; -typedef struct VGAInterfaceInfo { - const char *opt_name; /* option name */ - const char *name; /* human-readable name */ - /* Class names indicating that support is available. - * If no class is specified, the interface is always available */ - const char *class_names[2]; -} VGAInterfaceInfo; - -static VGAInterfaceInfo vga_interfaces[VGA_TYPE_MAX] = { - [VGA_NONE] = { - .opt_name = "none", - }, - [VGA_STD] = { - .opt_name = "std", - .name = "standard VGA", - .class_names = { "VGA", "isa-vga" }, - }, - [VGA_CIRRUS] = { - .opt_name = "cirrus", - .name = "Cirrus VGA", - .class_names = { "cirrus-vga", "isa-cirrus-vga" }, - }, - [VGA_VMWARE] = { - .opt_name = "vmware", - .name = "VMWare SVGA", - .class_names = { "vmware-svga" }, - }, - [VGA_VIRTIO] = { - .opt_name = "virtio", - .name = "Virtio VGA", - .class_names = { "virtio-vga" }, - }, - [VGA_QXL] = { - .opt_name = "qxl", - .name = "QXL VGA", - .class_names = { "qxl-vga" }, - }, - [VGA_TCX] = { - .opt_name = "tcx", - .name = "TCX framebuffer", - .class_names = { "SUNW,tcx" }, - }, - [VGA_CG3] = { - .opt_name = "cg3", - .name = "CG3 framebuffer", - .class_names = { "cgthree" }, - }, - [VGA_XENFB] = { - .opt_name = "xenfb", - }, -}; +static bool vga_available(void) +{ + return object_class_by_name("VGA") || object_class_by_name("isa-vga"); +} + +static bool cirrus_vga_available(void) +{ + return object_class_by_name("cirrus-vga") + || object_class_by_name("isa-cirrus-vga"); +} -static bool vga_interface_available(VGAInterfaceType t) +static bool vmware_vga_available(void) { - VGAInterfaceInfo *ti = &vga_interfaces[t]; + return object_class_by_name("vmware-svga"); +} - assert(t < VGA_TYPE_MAX); - return !ti->class_names[0] || - object_class_by_name(ti->class_names[0]) || - object_class_by_name(ti->class_names[1]); +static bool qxl_vga_available(void) +{ + return object_class_by_name("qxl-vga"); } -static void select_vgahw(const char *p) +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"); +} + +static bool virtio_vga_available(void) +{ + return object_class_by_name("virtio-vga"); +} + +static void select_vgahw (const char *p) { const char *opts; - int t; assert(vga_interface_type == VGA_NONE); - for (t = 0; t < VGA_TYPE_MAX; t++) { - VGAInterfaceInfo *ti = &vga_interfaces[t]; - if (ti->opt_name && strstart(p, ti->opt_name, &opts)) { - if (!vga_interface_available(t)) { - error_report("%s not available", ti->name); - exit(1); - } - vga_interface_type = t; - break; + if (strstart(p, "std", &opts)) { + if (vga_available()) { + vga_interface_type = VGA_STD; + } else { + error_report("standard VGA not available"); + exit(0); } - } - if (t == VGA_TYPE_MAX) { + } else if (strstart(p, "cirrus", &opts)) { + if (cirrus_vga_available()) { + vga_interface_type = VGA_CIRRUS; + } else { + error_report("Cirrus VGA not available"); + exit(0); + } + } else if (strstart(p, "vmware", &opts)) { + if (vmware_vga_available()) { + vga_interface_type = VGA_VMWARE; + } else { + error_report("VMWare SVGA not available"); + exit(0); + } + } else if (strstart(p, "virtio", &opts)) { + if (virtio_vga_available()) { + vga_interface_type = VGA_VIRTIO; + } else { + error_report("Virtio VGA not available"); + exit(0); + } + } else if (strstart(p, "xenfb", &opts)) { + vga_interface_type = VGA_XENFB; + } else if (strstart(p, "qxl", &opts)) { + if (qxl_vga_available()) { + vga_interface_type = VGA_QXL; + } else { + error_report("QXL VGA not available"); + exit(0); + } + } else if (strstart(p, "tcx", &opts)) { + if (tcx_vga_available()) { + vga_interface_type = VGA_TCX; + } else { + error_report("TCX framebuffer not available"); + exit(0); + } + } else if (strstart(p, "cg3", &opts)) { + if (cg3_vga_available()) { + vga_interface_type = VGA_CG3; + } else { + error_report("CG3 framebuffer not available"); + exit(0); + } + } else if (!strstart(p, "none", &opts)) { invalid_vga: error_report("unknown vga type: %s", p); exit(1); @@ -2053,15 +2095,6 @@ static void select_vgahw(const char *p) } } -typedef enum DisplayType { - DT_DEFAULT, - DT_CURSES, - DT_SDL, - DT_COCOA, - DT_GTK, - DT_NONE, -} DisplayType; - static DisplayType select_display(const char *p) { const char *opts; @@ -2130,12 +2163,21 @@ static DisplayType select_display(const char *p) exit(1); #endif } else if (strstart(p, "vnc", &opts)) { +#ifdef CONFIG_VNC if (*opts == '=') { - vnc_parse(opts + 1, &error_fatal); + Error *err = NULL; + if (vnc_parse(opts + 1, &err) == NULL) { + error_report_err(err); + exit(1); + } } else { error_report("VNC requires a display argument vnc=<display>"); exit(1); } +#else + error_report("VNC support is disabled"); + exit(1); +#endif } else if (strstart(p, "curses", &opts)) { #ifdef CONFIG_CURSES display = DT_CURSES; @@ -2336,7 +2378,10 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp) #ifdef CONFIG_VIRTFS static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp) { - return qemu_fsdev_add(opts); + int ret; + ret = qemu_fsdev_add(opts); + + return ret; } #endif @@ -2381,6 +2426,7 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp) static void monitor_parse(const char *optarg, const char *mode, bool pretty) { static int monitor_device_index = 0; + Error *local_err = NULL; QemuOpts *opts; const char *p; char label[32]; @@ -2401,7 +2447,11 @@ static void monitor_parse(const char *optarg, const char *mode, bool pretty) } } - opts = qemu_opts_create(qemu_find_opts("mon"), label, 1, &error_fatal); + opts = qemu_opts_create(qemu_find_opts("mon"), label, 1, &local_err); + if (!opts) { + error_report_err(local_err); + exit(1); + } qemu_opt_set(opts, "mode", mode, &error_abort); qemu_opt_set(opts, "chardev", label, &error_abort); qemu_opt_set_bool(opts, "pretty", pretty, &error_abort); @@ -2676,11 +2726,6 @@ void qemu_add_machine_init_done_notifier(Notifier *notify) } } -void qemu_remove_machine_init_done_notifier(Notifier *notify) -{ - notifier_remove(notify); -} - static void qemu_run_machine_init_done_notifiers(void) { notifier_list_notify(&machine_init_done_notifiers, NULL); @@ -2914,20 +2959,6 @@ static void set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size, loc_pop(&loc); } -static int global_init_func(void *opaque, QemuOpts *opts, Error **errp) -{ - GlobalProperty *g; - - g = g_malloc0(sizeof(*g)); - g->driver = qemu_opt_get(opts, "driver"); - g->property = qemu_opt_get(opts, "property"); - g->value = qemu_opt_get(opts, "value"); - g->user_provided = true; - g->errp = &error_fatal; - qdev_prop_register_global(g); - return 0; -} - int main(int argc, char **argv, char **envp) { int i; @@ -2950,11 +2981,11 @@ int main(int argc, char **argv, char **envp) const char *qtest_log = NULL; const char *pid_file = NULL; const char *incoming = NULL; +#ifdef CONFIG_VNC + int show_vnc_port = 0; +#endif bool defconfig = true; bool userconfig = true; - bool nographic = false; - DisplayType display_type = DT_DEFAULT; - int display_remote = 0; const char *log_mask = NULL; const char *log_file = NULL; char *trace_file = NULL; @@ -2963,7 +2994,6 @@ int main(int argc, char **argv, char **envp) FILE *vmstate_dump_file = NULL; Error *main_loop_err = NULL; Error *err = NULL; - bool list_data_dirs = false; qemu_init_cpu_loop(); qemu_mutex_lock_iothread(); @@ -3067,7 +3097,7 @@ int main(int argc, char **argv, char **envp) popt = lookup_opt(argc, argv, &optarg, &optind); if (!(popt->arch_mask & arch_type)) { - error_report("Option not supported for this target"); + printf("Option %s not supported for this target\n", popt->name); exit(1); } switch(popt->index) { @@ -3200,10 +3230,7 @@ int main(int argc, char **argv, char **envp) display_type = select_display(optarg); break; case QEMU_OPTION_nographic: - olist = qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "graphics=off", false); - nographic = true; - display_type = DT_NONE; + display_type = DT_NOGRAPHIC; break; case QEMU_OPTION_curses: #ifdef CONFIG_CURSES @@ -3259,13 +3286,11 @@ int main(int argc, char **argv, char **envp) fd_bootchk = 0; break; case QEMU_OPTION_netdev: - default_net = 0; if (net_client_parse(qemu_find_opts("netdev"), optarg) == -1) { exit(1); } break; case QEMU_OPTION_net: - default_net = 0; if (net_client_parse(qemu_find_opts("net"), optarg) == -1) { exit(1); } @@ -3341,7 +3366,7 @@ int main(int argc, char **argv, char **envp) log_file = optarg; break; case QEMU_OPTION_DFILTER: - qemu_set_dfilter_ranges(optarg, &error_fatal); + qemu_set_dfilter_ranges(optarg); break; case QEMU_OPTION_s: add_device_config(DEV_GDB, "tcp::" DEFAULT_GDBSTUB_PORT); @@ -3350,9 +3375,7 @@ int main(int argc, char **argv, char **envp) add_device_config(DEV_GDB, optarg); break; case QEMU_OPTION_L: - if (is_help_option(optarg)) { - list_data_dirs = true; - } else if (data_dir_idx < ARRAY_SIZE(data_dir)) { + if (data_dir_idx < ARRAY_SIZE(data_dir)) { data_dir[data_dir_idx++] = optarg; } break; @@ -3614,13 +3637,16 @@ int main(int argc, char **argv, char **envp) win2k_install_hack = 1; break; case QEMU_OPTION_rtc_td_hack: { - static GlobalProperty slew_lost_ticks = { - .driver = "mc146818rtc", - .property = "lost_tick_policy", - .value = "slew", + static GlobalProperty slew_lost_ticks[] = { + { + .driver = "mc146818rtc", + .property = "lost_tick_policy", + .value = "slew", + }, + { /* end of list */ } }; - qdev_prop_register_global(&slew_lost_ticks); + qdev_prop_register_global_list(slew_lost_ticks); break; } case QEMU_OPTION_acpitable: @@ -3667,15 +3693,18 @@ int main(int argc, char **argv, char **envp) break; } case QEMU_OPTION_no_kvm_pit_reinjection: { - static GlobalProperty kvm_pit_lost_tick_policy = { - .driver = "kvm-pit", - .property = "lost_tick_policy", - .value = "discard", + static GlobalProperty kvm_pit_lost_tick_policy[] = { + { + .driver = "kvm-pit", + .property = "lost_tick_policy", + .value = "discard", + }, + { /* end of list */ } }; error_report("warning: deprecated, replaced by " "-global kvm-pit.lost_tick_policy=discard"); - qdev_prop_register_global(&kvm_pit_lost_tick_policy); + qdev_prop_register_global_list(kvm_pit_lost_tick_policy); break; } case QEMU_OPTION_usb: @@ -3700,8 +3729,20 @@ int main(int argc, char **argv, char **envp) } break; case QEMU_OPTION_vnc: - vnc_parse(optarg, &error_fatal); + { +#ifdef CONFIG_VNC + Error *local_err = NULL; + + if (vnc_parse(optarg, &local_err) == NULL) { + error_report_err(local_err); + exit(1); + } +#else + error_report("VNC support is disabled"); + exit(1); +#endif break; + } case QEMU_OPTION_no_acpi: acpi_enabled = 0; break; @@ -3845,29 +3886,43 @@ int main(int argc, char **argv, char **envp) break; case QEMU_OPTION_xen_domid: if (!(xen_available())) { - error_report("Option not supported for this target"); + printf("Option %s not supported for this target\n", popt->name); exit(1); } xen_domid = atoi(optarg); break; case QEMU_OPTION_xen_create: if (!(xen_available())) { - error_report("Option not supported for this target"); + printf("Option %s not supported for this target\n", popt->name); exit(1); } xen_mode = XEN_CREATE; break; case QEMU_OPTION_xen_attach: if (!(xen_available())) { - error_report("Option not supported for this target"); + printf("Option %s not supported for this target\n", popt->name); exit(1); } xen_mode = XEN_ATTACH; break; case QEMU_OPTION_trace: - g_free(trace_file); - trace_file = trace_opt_parse(optarg); + { + opts = qemu_opts_parse_noisily(qemu_find_opts("trace"), + optarg, true); + if (!opts) { + exit(1); + } + if (qemu_opt_get(opts, "enable")) { + trace_enable_events(qemu_opt_get(opts, "enable")); + } + trace_init_events(qemu_opt_get(opts, "events")); + if (trace_file) { + g_free(trace_file); + } + trace_file = g_strdup(qemu_opt_get(opts, "file")); + qemu_opts_del(opts); break; + } case QEMU_OPTION_readconfig: { int ret = qemu_read_config_file(optarg); @@ -4029,6 +4084,13 @@ int main(int argc, char **argv, char **envp) qemu_set_hw_version(machine_class->hw_version); } + /* 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(); + if (cpu_model && is_help_option(cpu_model)) { list_cpus(stdout, &fprintf, cpu_model); exit(0); @@ -4042,7 +4104,7 @@ int main(int argc, char **argv, char **envp) /* Open the logfile at this point and set the log mask if necessary. */ if (log_file) { - qemu_set_log_filename(log_file, &error_fatal); + qemu_set_log_filename(log_file); } if (log_mask) { @@ -4070,14 +4132,6 @@ int main(int argc, char **argv, char **envp) data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR; } - /* -L help lists the data directories and exits. */ - if (list_data_dirs) { - for (i = 0; i < data_dir_idx; i++) { - printf("%s\n", data_dir[i]); - } - exit(0); - } - smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL)); machine_class->max_cpus = machine_class->max_cpus ?: 1; /* Default to UP */ @@ -4142,7 +4196,7 @@ int main(int argc, char **argv, char **envp) * -nographic _and_ redirects all ports explicitly - this is valid * usage, -nographic is just a no-op in this case. */ - if (nographic + if (display_type == DT_NOGRAPHIC && (default_parallel || default_serial || default_monitor || default_virtcon)) { error_report("-nographic cannot be used with -daemonize"); @@ -4156,7 +4210,7 @@ int main(int argc, char **argv, char **envp) #endif } - if (nographic) { + if (display_type == DT_NOGRAPHIC) { if (default_parallel) add_device_config(DEV_PARALLEL, "null"); if (default_serial && default_monitor) { @@ -4198,12 +4252,11 @@ int main(int argc, char **argv, char **envp) if (display_type == DT_DEFAULT && !display_remote) { #if defined(CONFIG_GTK) display_type = DT_GTK; -#elif defined(CONFIG_SDL) +#elif defined(CONFIG_SDL) || defined(CONFIG_COCOA) display_type = DT_SDL; -#elif defined(CONFIG_COCOA) - display_type = DT_COCOA; #elif defined(CONFIG_VNC) vnc_parse("localhost:0,to=99,id=default", &error_abort); + show_vnc_port = 1; #else display_type = DT_NONE; #endif @@ -4218,14 +4271,16 @@ int main(int argc, char **argv, char **envp) "ignoring option"); } +#if defined(CONFIG_GTK) if (display_type == DT_GTK) { early_gtk_display_init(request_opengl); } - +#endif +#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) error_report("OpenGL is not supported by the display"); @@ -4334,8 +4389,10 @@ int main(int argc, char **argv, char **envp) os_set_line_buffering(); +#ifdef CONFIG_SPICE /* spice needs the timers to be initialized by this point */ qemu_spice_init(); +#endif cpu_ticks_init(); if (icount_opts) { @@ -4347,13 +4404,8 @@ int main(int argc, char **argv, char **envp) qemu_opts_del(icount_opts); } - if (default_net) { - QemuOptsList *net = qemu_find_opts("net"); - qemu_opts_set(net, NULL, "type", "nic", &error_abort); -#ifdef CONFIG_SLIRP - qemu_opts_set(net, NULL, "type", "user", &error_abort); -#endif - } + /* clean up network at qemu process termination */ + atexit(&net_cleanup); if (net_init_clients() < 0) { exit(1); @@ -4431,9 +4483,9 @@ int main(int argc, char **argv, char **envp) if (default_vga) { if (machine_class->default_display) { vga_model = machine_class->default_display; - } else if (vga_interface_available(VGA_CIRRUS)) { + } else if (cirrus_vga_available()) { vga_model = "cirrus"; - } else if (vga_interface_available(VGA_STD)) { + } else if (vga_available()) { vga_model = "std"; } } @@ -4447,10 +4499,10 @@ int main(int argc, char **argv, char **envp) exit (i == 1 ? 1 : 0); } - machine_register_compat_props(current_machine); - - qemu_opts_foreach(qemu_find_opts("global"), - global_init_func, NULL, NULL); + if (machine_class->compat_props) { + qdev_prop_register_global_list(machine_class->compat_props); + } + qemu_add_globals(); /* This checkpoint is required by replay to separate prior clock reading from the other reads, because timer polling functions query @@ -4480,7 +4532,7 @@ int main(int argc, char **argv, char **envp) } /* init USB devices */ - if (machine_usb(current_machine)) { + if (usb_enabled()) { if (foreach_device_config(DEV_USB, usb_parse) < 0) exit(1); } @@ -4499,18 +4551,7 @@ int main(int argc, char **argv, char **envp) /* Did we create any drives that we failed to create a device for? */ drive_check_orphaned(); - /* Don't warn about the default network setup that you get if - * no command line -net or -netdev options are specified. There - * are two cases that we would otherwise complain about: - * (1) board doesn't support a NIC but the implicit "-net nic" - * requested one - * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic" - * sets up a nic that isn't connected to anything. - */ - if (!default_net) { - net_check_clients(); - } - + net_check_clients(); if (boot_once) { qemu_boot_set(boot_once, &error_fatal); @@ -4521,18 +4562,28 @@ int main(int argc, char **argv, char **envp) /* init local displays */ switch (display_type) { + case DT_NOGRAPHIC: + (void)ds; /* avoid warning if no display is configured */ + break; +#if defined(CONFIG_CURSES) case DT_CURSES: curses_display_init(ds, full_screen); break; +#endif +#if defined(CONFIG_SDL) case DT_SDL: sdl_display_init(ds, full_screen, no_frame); break; - case DT_COCOA: +#elif defined(CONFIG_COCOA) + case DT_SDL: cocoa_display_init(ds, full_screen); break; +#endif +#if defined(CONFIG_GTK) case DT_GTK: gtk_display_init(ds, full_screen, grab_on_hover); break; +#endif default: break; } @@ -4540,15 +4591,21 @@ int main(int argc, char **argv, char **envp) /* must be after terminal init, SDL library changes signal handlers */ os_setup_signal_handling(); - /* init remote displays */ #ifdef CONFIG_VNC + /* init remote displays */ qemu_opts_foreach(qemu_find_opts("vnc"), vnc_init_func, NULL, NULL); + if (show_vnc_port) { + char *ret = vnc_display_local_addr("default"); + printf("VNC server running on '%s'\n", ret); + g_free(ret); + } #endif - +#ifdef CONFIG_SPICE if (using_spice) { qemu_spice_display_init(); } +#endif if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { exit(1); @@ -4600,7 +4657,6 @@ int main(int argc, char **argv, char **envp) os_setup_post(); - trace_init_vcpu_events(); main_loop(); replay_disable_events(); @@ -4611,11 +4667,5 @@ int main(int argc, char **argv, char **envp) tpm_cleanup(); #endif - /* vhost-user must be cleaned up before chardevs. */ - net_cleanup(); - audio_cleanup(); - monitor_cleanup(); - qemu_chr_cleanup(); - return 0; } |