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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-nomachine-x86_64.args b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-x86_64.args
new file mode 100644
index 0000000000..22bc4fb1cc
--- /dev/null
+++ b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-x86_64.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-x86_64 \
+-name QEMUGuest1 \
+-m 512 \
+-hda /dev/HostVG/QEMUGuest1 \
+-cdrom /root/boot.iso
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-nomachine-x86_64.xml b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-x86_64.xml
new file mode 100644
index 0000000000..71a36f0833
--- /dev/null
+++ b/tests/qemuargv2xmldata/qemuargv2xml-nomachine-x86_64.xml
@@ -0,0 +1,48 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 524288
+ 524288
+ 1
+
+ hvm
+
+
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
index 1adbcfef6e..5d261afa60 100644
--- a/tests/qemuargv2xmltest.c
+++ b/tests/qemuargv2xmltest.c
@@ -288,6 +288,10 @@ mymain(void)
DO_TEST("machine-deakeywrap-off-argv");
DO_TEST("machine-keywrap-none-argv");
+ DO_TEST("nomachine-x86_64");
+ DO_TEST("nomachine-aarch64");
+ DO_TEST("nomachine-ppc64");
+
qemuTestDriverFree(&driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;