diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 7c409b03a9..4896f2afb9 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -1884,6 +1884,98 @@ qemuParseCommandLine(virCapsPtr caps, } } + /* Detect machine type before processing any other arguments, + * because they might depend on it */ + for (i = 1; progargv[i]; i++) { + const char *arg = progargv[i]; + + /* Make sure we have a single - for all options to + simplify next logic */ + if (STRPREFIX(arg, "--")) + arg++; + + if (STREQ(arg, "-M") || + STREQ(arg, "-machine")) { + char *param; + size_t j = 0; + + /* -machine [type=]name[,prop[=value][,...]] + * Set os.machine only if first parameter lacks '=' or + * contains explicit type='...' */ + WANT_VALUE(); + if (!(list = virStringSplit(val, ",", 0))) + goto error; + param = list[0]; + + if (STRPREFIX(param, "type=")) + param += strlen("type="); + if (!strchr(param, '=')) { + if (VIR_STRDUP(def->os.machine, param) < 0) + goto error; + j++; + } + + /* handle all remaining "-machine" parameters */ + while ((param = list[j++])) { + if (STRPREFIX(param, "dump-guest-core=")) { + param += strlen("dump-guest-core="); + def->mem.dump_core = virTristateSwitchTypeFromString(param); + if (def->mem.dump_core <= 0) + def->mem.dump_core = VIR_TRISTATE_SWITCH_ABSENT; + } else if (STRPREFIX(param, "mem-merge=off")) { + def->mem.nosharepages = true; + } else if (STRPREFIX(param, "accel=kvm")) { + def->virtType = VIR_DOMAIN_VIRT_KVM; + def->features[VIR_DOMAIN_FEATURE_PAE] = VIR_TRISTATE_SWITCH_ON; + } else if (STRPREFIX(param, "aes-key-wrap=")) { + if (STREQ(arg, "-M")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("aes-key-wrap is not supported with " + "this QEMU binary")); + goto error; + } + param += strlen("aes-key-wrap="); + if (!def->keywrap && VIR_ALLOC(def->keywrap) < 0) + goto error; + def->keywrap->aes = virTristateSwitchTypeFromString(param); + if (def->keywrap->aes < 0) + def->keywrap->aes = VIR_TRISTATE_SWITCH_ABSENT; + } else if (STRPREFIX(param, "dea-key-wrap=")) { + if (STREQ(arg, "-M")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("dea-key-wrap is not supported with " + "this QEMU binary")); + goto error; + } + param += strlen("dea-key-wrap="); + if (!def->keywrap && VIR_ALLOC(def->keywrap) < 0) + goto error; + def->keywrap->dea = virTristateSwitchTypeFromString(param); + if (def->keywrap->dea < 0) + def->keywrap->dea = VIR_TRISTATE_SWITCH_ABSENT; + } + } + virStringListFree(list); + list = NULL; + } + } + + /* If no machine type has been found among the arguments, then figure + * out a reasonable value by using capabilities */ + if (!def->os.machine) { + virCapsDomainDataPtr capsdata; + + if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type, + def->os.arch, def->virtType, NULL, NULL))) + goto error; + + if (VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0) { + VIR_FREE(capsdata); + goto error; + } + VIR_FREE(capsdata); + } + /* Now the real processing loop */ for (i = 1; progargv[i]; i++) { const char *arg = progargv[i]; @@ -2137,69 +2229,6 @@ qemuParseCommandLine(virCapsPtr caps, } if (STREQ(def->name, "")) VIR_FREE(def->name); - } else if (STREQ(arg, "-M") || - STREQ(arg, "-machine")) { - char *param; - size_t j = 0; - - /* -machine [type=]name[,prop[=value][,...]] - * Set os.machine only if first parameter lacks '=' or - * contains explicit type='...' */ - WANT_VALUE(); - if (!(list = virStringSplit(val, ",", 0))) - goto error; - param = list[0]; - - if (STRPREFIX(param, "type=")) - param += strlen("type="); - if (!strchr(param, '=')) { - if (VIR_STRDUP(def->os.machine, param) < 0) - goto error; - j++; - } - - /* handle all remaining "-machine" parameters */ - while ((param = list[j++])) { - if (STRPREFIX(param, "dump-guest-core=")) { - param += strlen("dump-guest-core="); - def->mem.dump_core = virTristateSwitchTypeFromString(param); - if (def->mem.dump_core <= 0) - def->mem.dump_core = VIR_TRISTATE_SWITCH_ABSENT; - } else if (STRPREFIX(param, "mem-merge=off")) { - def->mem.nosharepages = true; - } else if (STRPREFIX(param, "accel=kvm")) { - def->virtType = VIR_DOMAIN_VIRT_KVM; - def->features[VIR_DOMAIN_FEATURE_PAE] = VIR_TRISTATE_SWITCH_ON; - } else if (STRPREFIX(param, "aes-key-wrap=")) { - if (STREQ(arg, "-M")) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("aes-key-wrap is not supported with " - "this QEMU binary")); - goto error; - } - param += strlen("aes-key-wrap="); - if (!def->keywrap && VIR_ALLOC(def->keywrap) < 0) - goto error; - def->keywrap->aes = virTristateSwitchTypeFromString(param); - if (def->keywrap->aes < 0) - def->keywrap->aes = VIR_TRISTATE_SWITCH_ABSENT; - } else if (STRPREFIX(param, "dea-key-wrap=")) { - if (STREQ(arg, "-M")) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("dea-key-wrap is not supported with " - "this QEMU binary")); - goto error; - } - param += strlen("dea-key-wrap="); - if (!def->keywrap && VIR_ALLOC(def->keywrap) < 0) - goto error; - def->keywrap->dea = virTristateSwitchTypeFromString(param); - if (def->keywrap->dea < 0) - def->keywrap->dea = VIR_TRISTATE_SWITCH_ABSENT; - } - } - virStringListFree(list); - list = NULL; } else if (STREQ(arg, "-serial")) { WANT_VALUE(); if (STRNEQ(val, "none")) { @@ -2489,6 +2518,11 @@ qemuParseCommandLine(virCapsPtr caps, argRecognized = false; } + } else if (STREQ(arg, "-M") || + STREQ(arg, "-machine")) { + /* This option has already been processed before entering this + * loop, so we just need to skip its argument and move along */ + WANT_VALUE(); } else { argRecognized = false; } @@ -2571,20 +2605,6 @@ qemuParseCommandLine(virCapsPtr caps, } } - if (!def->os.machine) { - virCapsDomainDataPtr capsdata; - - if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type, - def->os.arch, def->virtType, NULL, NULL))) - goto error; - - if (VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0) { - VIR_FREE(capsdata); - goto error; - } - VIR_FREE(capsdata); - } - if (!nographics && (def->ngraphics == 0 || have_sdl)) { virDomainGraphicsDefPtr sdl; const char *display = qemuFindEnv(progenv, "DISPLAY"); diff --git a/tests/qemuargv2xmldata/qemuargv2xml-nomachine-aarch64.args b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-aarch64.args new file mode 100644 index 0000000000..b17c0d0c23 --- /dev/null +++ b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-aarch64.args @@ -0,0 +1,11 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-aarch64 \ +-name QEMUGuest1 \ +-m 512 \ +-hda /dev/HostVG/QEMUGuest1 \ +-cdrom /root/boot.iso diff --git a/tests/qemuargv2xmldata/qemuargv2xml-nomachine-aarch64.xml b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-aarch64.xml new file mode 100644 index 0000000000..eb8f9db803 --- /dev/null +++ b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-aarch64.xml @@ -0,0 +1,39 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 524288 + 524288 + 1 + + hvm + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-aarch64 + + + + +
+ + + + + + +
+ + + + + + + diff --git a/tests/qemuargv2xmldata/qemuargv2xml-nomachine-ppc64.args b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-ppc64.args new file mode 100644 index 0000000000..ac618775e2 --- /dev/null +++ b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-ppc64.args @@ -0,0 +1,11 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name QEMUGuest1 \ +-m 512 \ +-hda /dev/HostVG/QEMUGuest1 \ +-cdrom /root/boot.iso diff --git a/tests/qemuargv2xmldata/qemuargv2xml-nomachine-ppc64.xml b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-ppc64.xml new file mode 100644 index 0000000000..fa41070cb4 --- /dev/null +++ b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-ppc64.xml @@ -0,0 +1,49 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 524288 + 524288 + 1 + + hvm + + + destroy + restart + destroy + + /usr/bin/qemu-system-ppc64 + + + + +
+ + + + + + +
+ + +
+ + + + + + +
+ + + + +