From: Yonggang Luo <luoyonggang@gmail.com>
To: qemu-devel@nongnu.org
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
"Philippe Mathieu-Daudé" <philmd@oss.qualcomm.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
"Pierrick Bouvier" <pierrick.bouvier@oss.qualcomm.com>,
"Fabiano Rosas" <farosas@suse.de>,
"Laurent Vivier" <lvivier@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Alistair Francis" <alistair@alistair23.me>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
qemu-arm@nongnu.org, kvm@vger.kernel.org
Subject: [PATCH v4 08/55] tests/qtest: prepare machine-list-test for combined qemu-system
Date: Sat, 26 Sep 2026 15:00:07 +0800 [thread overview]
Message-ID: <20260926070057.1234-9-luoyonggang@gmail.com> (raw)
In-Reply-To: <20260926070057.1234-1-luoyonggang@gmail.com>
Each built qemu-system target checks its query-target arch and
query-machines names, including the none machine and omitting the
abstract pegasos parent. xen, vmapple, nitro, and x-remote appear
only when that host build has them. The lists in
machine-list-test.inc.h are shared for a later combined
qemu-system test.
Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
tests/qtest/machine-list-test.c | 94 +++
tests/qtest/machine-list-test.inc.h | 876 ++++++++++++++++++++++++++++
tests/qtest/meson.build | 1 +
3 files changed, 971 insertions(+)
create mode 100644 tests/qtest/machine-list-test.c
create mode 100644 tests/qtest/machine-list-test.inc.h
diff --git a/tests/qtest/machine-list-test.c b/tests/qtest/machine-list-test.c
new file mode 100644
index 00000000000..35fb365197d
--- /dev/null
+++ b/tests/qtest/machine-list-test.c
@@ -0,0 +1,94 @@
+/*
+ * Per-target machine list tests.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+
+#include "libqtest.h"
+#include "qobject/qdict.h"
+#include "qobject/qlist.h"
+#include "qobject/qstring.h"
+
+/* query-target "arch" is SysEmuTarget, not always TARGET_NAME. */
+static const char *query_arch_for_target(const char *target_info)
+{
+ static const struct {
+ const char *target_name;
+ const char *arch;
+ } map[] = {
+ { "armeb", "arm" },
+ { "microblazeel", "microblaze" },
+ { "mips64el", "mips64" },
+ { "mipsel", "mips" },
+ { "ppc64le", "ppc64" },
+ { "sh4eb", "sh4" },
+ { "xtensaeb", "xtensa" },
+ };
+ size_t i;
+
+ for (i = 0; i < G_N_ELEMENTS(map); i++) {
+ if (!strcmp(target_info, map[i].target_name)) {
+ return map[i].arch;
+ }
+ }
+ return target_info;
+}
+
+#include "machine-list-test.inc.h"
+
+static QList *query_machine_names(QTestState *qts)
+{
+ QDict *resp;
+ QList *machines;
+ QList *names;
+ const QListEntry *e;
+
+ resp = qtest_qmp(qts, "{'execute': 'query-machines'}");
+ g_assert(qdict_haskey(resp, "return"));
+ machines = qdict_get_qlist(resp, "return");
+ g_assert_nonnull(machines);
+ names = qlist_new();
+ for (e = qlist_first(machines); e; e = qlist_next(e)) {
+ QDict *m = qobject_to(QDict, qlist_entry_obj(e));
+ const char *name;
+
+ g_assert_nonnull(m);
+ name = qdict_get_str(m, "name");
+ qlist_append_str(names, name);
+ }
+ qobject_unref(resp);
+ return names;
+}
+
+static void test_historic_machine_list(void)
+{
+ const char *target = qtest_get_arch();
+ const struct ShippedTarget *t = lookup_shipped_target(target);
+ QTestState *qts;
+ QDict *resp;
+ QDict *ret;
+ g_autoptr(QList) names = NULL;
+
+ qts = qtest_init("-nodefaults -M none");
+ read_accel_flags(qts);
+ resp = qtest_qmp(qts, "{'execute': 'query-target'}");
+ g_assert(qdict_haskey(resp, "return"));
+ ret = qdict_get_qdict(resp, "return");
+ g_assert_cmpstr(qdict_get_str(ret, "arch"), ==,
+ query_arch_for_target(target));
+ qobject_unref(resp);
+ names = query_machine_names(qts);
+ if (t) {
+ assert_name_list(names, t->name, t->machines, t->n_machines);
+ }
+ qtest_quit(qts);
+}
+
+int main(int argc, char **argv)
+{
+ g_test_init(&argc, &argv, NULL);
+ qtest_add_func("machine-list", test_historic_machine_list);
+ return g_test_run();
+}
diff --git a/tests/qtest/machine-list-test.inc.h b/tests/qtest/machine-list-test.inc.h
new file mode 100644
index 00000000000..e6e6f3ea7cd
--- /dev/null
+++ b/tests/qtest/machine-list-test.inc.h
@@ -0,0 +1,876 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/* Normal machine lists for every softmmu target. */
+/* Xen, vmapple, nitro, and x-remote stay in special_machine_map. */
+
+static const char * const aarch64_machines[] = {
+ "amd-versal-virt",
+ "amd-versal2-virt",
+ "anacapa-bmc",
+ "ast1030-evb",
+ "ast1040-evb",
+ "ast1060-evb",
+ "ast2500-evb",
+ "ast2600-evb",
+ "ast2700a1-evb",
+ "ast2700a2-evb",
+ "ast2700fc",
+ "axiado-scm3003",
+ "b-l475e-iot01a",
+ "bletchley-bmc",
+ "bpim2u",
+ "canon-a1100",
+ "catalina-bmc",
+ "collie",
+ "cubieboard",
+ "emcraft-sf2",
+ "fby35-bmc",
+ "fuji-bmc",
+ "g220a-bmc",
+ "gb200nvl-bmc",
+ "imx25-pdk",
+ "imx8mm-evk",
+ "imx8mp-evk",
+ "integratorcp",
+ "kudo-bmc",
+ "kzm",
+ "lm3s6965evb",
+ "lm3s811evb",
+ "max78000fthr",
+ "mcimx6ul-evk",
+ "mcimx7d-sabre",
+ "microbit",
+ "mori-bmc",
+ "mps2-an385",
+ "mps2-an386",
+ "mps2-an500",
+ "mps2-an505",
+ "mps2-an511",
+ "mps2-an521",
+ "mps3-an524",
+ "mps3-an536",
+ "mps3-an547",
+ "mps3-an555",
+ "musca-a",
+ "musca-b1",
+ "netduino2",
+ "netduinoplus2",
+ "none",
+ "npcm750-evb",
+ "npcm845-evb",
+ "nuri",
+ "olimex-stm32-h405",
+ "orangepi-pc",
+ "palmetto-bmc",
+ "quanta-gbs-bmc",
+ "quanta-gsj",
+ "quanta-q71l-bmc",
+ "rainier-bmc",
+ "raspi0",
+ "raspi1ap",
+ "raspi2b",
+ "raspi3ap",
+ "raspi3b",
+ "raspi4b",
+ "realview-eb",
+ "realview-eb-mpcore",
+ "realview-pb-a8",
+ "realview-pbx-a9",
+ "romulus-bmc",
+ "sabrelite",
+ "sanmiguel-bmc",
+ "sbsa-ref",
+ "smdkc210",
+ "stm32vldiscovery",
+ "supermicro-x11spi-bmc",
+ "supermicrox11-bmc",
+ "sx1",
+ "sx1-v1",
+ "tiogapass-bmc",
+ "versatileab",
+ "versatilepb",
+ "vexpress-a15",
+ "vexpress-a9",
+ "virt-10.0",
+ "virt-10.1",
+ "virt-10.2",
+ "virt-11.0",
+ "virt-11.1",
+ "virt-11.2",
+ "virt-6.0",
+ "virt-6.1",
+ "virt-6.2",
+ "virt-7.0",
+ "virt-7.1",
+ "virt-7.2",
+ "virt-8.0",
+ "virt-8.1",
+ "virt-8.2",
+ "virt-9.0",
+ "virt-9.1",
+ "virt-9.2",
+ "witherspoon-bmc",
+ "xilinx-zynq-a9",
+ "xlnx-zcu102",
+ "yosemitev2-bmc",
+};
+
+static const char * const alpha_machines[] = {
+ "clipper",
+ "none",
+};
+
+static const char * const arm_machines[] = {
+ "anacapa-bmc",
+ "ast1030-evb",
+ "ast1040-evb",
+ "ast1060-evb",
+ "ast2500-evb",
+ "ast2600-evb",
+ "b-l475e-iot01a",
+ "bletchley-bmc",
+ "bpim2u",
+ "canon-a1100",
+ "catalina-bmc",
+ "collie",
+ "cubieboard",
+ "emcraft-sf2",
+ "fby35-bmc",
+ "fuji-bmc",
+ "g220a-bmc",
+ "gb200nvl-bmc",
+ "imx25-pdk",
+ "integratorcp",
+ "kudo-bmc",
+ "kzm",
+ "lm3s6965evb",
+ "lm3s811evb",
+ "max78000fthr",
+ "mcimx6ul-evk",
+ "mcimx7d-sabre",
+ "microbit",
+ "mori-bmc",
+ "mps2-an385",
+ "mps2-an386",
+ "mps2-an500",
+ "mps2-an505",
+ "mps2-an511",
+ "mps2-an521",
+ "mps3-an524",
+ "mps3-an536",
+ "mps3-an547",
+ "mps3-an555",
+ "musca-a",
+ "musca-b1",
+ "netduino2",
+ "netduinoplus2",
+ "none",
+ "npcm750-evb",
+ "nuri",
+ "olimex-stm32-h405",
+ "orangepi-pc",
+ "palmetto-bmc",
+ "quanta-gbs-bmc",
+ "quanta-gsj",
+ "quanta-q71l-bmc",
+ "rainier-bmc",
+ "raspi0",
+ "raspi1ap",
+ "raspi2b",
+ "realview-eb",
+ "realview-eb-mpcore",
+ "realview-pb-a8",
+ "realview-pbx-a9",
+ "romulus-bmc",
+ "sabrelite",
+ "sanmiguel-bmc",
+ "smdkc210",
+ "stm32vldiscovery",
+ "supermicro-x11spi-bmc",
+ "supermicrox11-bmc",
+ "sx1",
+ "sx1-v1",
+ "tiogapass-bmc",
+ "versatileab",
+ "versatilepb",
+ "vexpress-a15",
+ "vexpress-a9",
+ "virt-10.0",
+ "virt-10.1",
+ "virt-10.2",
+ "virt-11.0",
+ "virt-11.1",
+ "virt-11.2",
+ "virt-6.0",
+ "virt-6.1",
+ "virt-6.2",
+ "virt-7.0",
+ "virt-7.1",
+ "virt-7.2",
+ "virt-8.0",
+ "virt-8.1",
+ "virt-8.2",
+ "virt-9.0",
+ "virt-9.1",
+ "virt-9.2",
+ "witherspoon-bmc",
+ "xilinx-zynq-a9",
+ "yosemitev2-bmc",
+};
+
+static const char * const avr_machines[] = {
+ "arduino-duemilanove",
+ "arduino-mega",
+ "arduino-mega-2560-v3",
+ "arduino-uno",
+ "none",
+};
+
+static const char * const hexagon_machines[] = {
+ "V66G_1024",
+ "V68N_1024",
+ "V81DGB_1",
+ "V81QA_1",
+ "none",
+ "virt",
+};
+
+static const char * const hppa_machines[] = {
+ "715",
+ "A400",
+ "B160L",
+ "C3700",
+ "none",
+};
+
+static const char * const i386_machines[] = {
+ "isapc",
+ "microvm",
+ "none",
+ "pc-i440fx-10.0",
+ "pc-i440fx-10.1",
+ "pc-i440fx-10.2",
+ "pc-i440fx-11.0",
+ "pc-i440fx-11.1",
+ "pc-i440fx-11.2",
+ "pc-i440fx-6.0",
+ "pc-i440fx-6.1",
+ "pc-i440fx-6.2",
+ "pc-i440fx-7.0",
+ "pc-i440fx-7.1",
+ "pc-i440fx-7.2",
+ "pc-i440fx-8.0",
+ "pc-i440fx-8.1",
+ "pc-i440fx-8.2",
+ "pc-i440fx-9.0",
+ "pc-i440fx-9.1",
+ "pc-i440fx-9.2",
+ "pc-q35-10.0",
+ "pc-q35-10.1",
+ "pc-q35-10.2",
+ "pc-q35-11.0",
+ "pc-q35-11.1",
+ "pc-q35-11.2",
+ "pc-q35-6.0",
+ "pc-q35-6.1",
+ "pc-q35-6.2",
+ "pc-q35-7.0",
+ "pc-q35-7.1",
+ "pc-q35-7.2",
+ "pc-q35-8.0",
+ "pc-q35-8.1",
+ "pc-q35-8.2",
+ "pc-q35-9.0",
+ "pc-q35-9.1",
+ "pc-q35-9.2",
+};
+
+static const char * const loongarch64_machines[] = {
+ "none",
+ "virt-11.1",
+ "virt-11.2",
+};
+
+static const char * const m68k_machines[] = {
+ "an5206",
+ "mcf5208evb",
+ "next-cube",
+ "none",
+ "q800",
+ "virt-10.0",
+ "virt-10.1",
+ "virt-10.2",
+ "virt-11.0",
+ "virt-11.1",
+ "virt-11.2",
+ "virt-6.0",
+ "virt-6.1",
+ "virt-6.2",
+ "virt-7.0",
+ "virt-7.1",
+ "virt-7.2",
+ "virt-8.0",
+ "virt-8.1",
+ "virt-8.2",
+ "virt-9.0",
+ "virt-9.1",
+ "virt-9.2",
+};
+
+static const char * const microblaze_machines[] = {
+ "none",
+ "petalogix-ml605",
+ "petalogix-s3adsp1800",
+ "xlnx-zynqmp-pmu",
+};
+
+static const char * const mips_machines[] = {
+ "malta",
+ "none",
+};
+
+static const char * const mips64_machines[] = {
+ "magnum",
+ "malta",
+ "none",
+ "pica61",
+};
+
+static const char * const mips64el_machines[] = {
+ "boston",
+ "fuloong2e",
+ "loongson3-virt",
+ "magnum",
+ "malta",
+ "none",
+ "pica61",
+};
+
+static const char * const mipsel_machines[] = {
+ "malta",
+ "none",
+};
+
+static const char * const or1k_machines[] = {
+ "none",
+ "or1k-sim",
+ "virt",
+};
+
+static const char * const ppc_machines[] = {
+ "40p",
+ "amigaone",
+ "bamboo",
+ "g3beige",
+ "mac99",
+ "mpc8544ds",
+ "none",
+ "pegasos1",
+ "pegasos2",
+ "ppce500",
+ "ppe42_machine",
+ "sam460ex",
+ "virtex-ml507",
+};
+
+static const char * const ppc64_machines[] = {
+ "40p",
+ "amigaone",
+ "bamboo",
+ "g3beige",
+ "mac99",
+ "mpc8544ds",
+ "none",
+ "pegasos1",
+ "pegasos2",
+ "powernv10",
+ "powernv10-rainier",
+ "powernv11",
+ "powernv8",
+ "powernv9",
+ "ppce500",
+ "ppe42_machine",
+ "pseries-10.0",
+ "pseries-10.1",
+ "pseries-10.2",
+ "pseries-11.0",
+ "pseries-11.1",
+ "pseries-11.2",
+ "pseries-6.0",
+ "pseries-6.1",
+ "pseries-6.2",
+ "pseries-7.0",
+ "pseries-7.1",
+ "pseries-7.2",
+ "pseries-8.0",
+ "pseries-8.1",
+ "pseries-8.2",
+ "pseries-9.0",
+ "pseries-9.1",
+ "pseries-9.2",
+ "sam460ex",
+ "virtex-ml507",
+};
+
+static const char * const riscv32_machines[] = {
+ "amd-microblaze-v-generic",
+ "none",
+ "opentitan",
+ "sifive_e",
+ "sifive_u",
+ "spike",
+ "virt",
+};
+
+static const char * const riscv64_machines[] = {
+ "amd-microblaze-v-generic",
+ "boston-aia",
+ "k230",
+ "microchip-icicle-kit",
+ "none",
+ "shakti_c",
+ "sifive_e",
+ "sifive_u",
+ "spike",
+ "tt-atlantis",
+ "virt",
+ "xiangshan-kunminghu",
+};
+
+static const char * const rx_machines[] = {
+ "gdbsim-r5f562n7",
+ "gdbsim-r5f562n8",
+ "none",
+};
+
+static const char * const s390x_machines[] = {
+ "none",
+ "s390-ccw-virtio-10.0",
+ "s390-ccw-virtio-10.1",
+ "s390-ccw-virtio-10.2",
+ "s390-ccw-virtio-11.0",
+ "s390-ccw-virtio-11.1",
+ "s390-ccw-virtio-11.2",
+ "s390-ccw-virtio-6.0",
+ "s390-ccw-virtio-6.1",
+ "s390-ccw-virtio-6.2",
+ "s390-ccw-virtio-7.0",
+ "s390-ccw-virtio-7.1",
+ "s390-ccw-virtio-7.2",
+ "s390-ccw-virtio-8.0",
+ "s390-ccw-virtio-8.1",
+ "s390-ccw-virtio-8.2",
+ "s390-ccw-virtio-9.0",
+ "s390-ccw-virtio-9.1",
+ "s390-ccw-virtio-9.2",
+};
+
+static const char * const sh4_machines[] = {
+ "none",
+ "r2d",
+};
+
+static const char * const sh4eb_machines[] = {
+ "none",
+ "r2d",
+};
+
+static const char * const sparc_machines[] = {
+ "LX",
+ "SPARCClassic",
+ "SPARCbook",
+ "SS-10",
+ "SS-20",
+ "SS-4",
+ "SS-5",
+ "SS-600MP",
+ "Voyager",
+ "leon3_generic",
+ "none",
+};
+
+static const char * const sparc64_machines[] = {
+ "niagara",
+ "none",
+ "sun4u",
+ "sun4v",
+};
+
+static const char * const tricore_machines[] = {
+ "KIT_AURIX_TC277_TRB",
+ "none",
+ "tricore_testboard",
+};
+
+static const char * const x86_64_machines[] = {
+ "isapc",
+ "microvm",
+ "none",
+ "pc-i440fx-10.0",
+ "pc-i440fx-10.1",
+ "pc-i440fx-10.2",
+ "pc-i440fx-11.0",
+ "pc-i440fx-11.1",
+ "pc-i440fx-11.2",
+ "pc-i440fx-6.0",
+ "pc-i440fx-6.1",
+ "pc-i440fx-6.2",
+ "pc-i440fx-7.0",
+ "pc-i440fx-7.1",
+ "pc-i440fx-7.2",
+ "pc-i440fx-8.0",
+ "pc-i440fx-8.1",
+ "pc-i440fx-8.2",
+ "pc-i440fx-9.0",
+ "pc-i440fx-9.1",
+ "pc-i440fx-9.2",
+ "pc-q35-10.0",
+ "pc-q35-10.1",
+ "pc-q35-10.2",
+ "pc-q35-11.0",
+ "pc-q35-11.1",
+ "pc-q35-11.2",
+ "pc-q35-6.0",
+ "pc-q35-6.1",
+ "pc-q35-6.2",
+ "pc-q35-7.0",
+ "pc-q35-7.1",
+ "pc-q35-7.2",
+ "pc-q35-8.0",
+ "pc-q35-8.1",
+ "pc-q35-8.2",
+ "pc-q35-9.0",
+ "pc-q35-9.1",
+ "pc-q35-9.2",
+};
+
+static const char * const xtensa_machines[] = {
+ "kc705",
+ "kc705-nommu",
+ "lx200",
+ "lx200-nommu",
+ "lx60",
+ "lx60-nommu",
+ "ml605",
+ "ml605-nommu",
+ "none",
+ "sim",
+ "virt",
+};
+
+static const char * const xtensaeb_machines[] = {
+ "kc705",
+ "kc705-nommu",
+ "lx200",
+ "lx200-nommu",
+ "lx60",
+ "lx60-nommu",
+ "ml605",
+ "ml605-nommu",
+ "none",
+ "sim",
+ "virt",
+};
+
+static const struct ShippedTarget {
+ const char *name;
+ const char *arch;
+ const char *endianness;
+ const char * const *machines;
+ size_t n_machines;
+} shipped_targets[] = {
+ { "aarch64", "aarch64", "little",
+ aarch64_machines, G_N_ELEMENTS(aarch64_machines) },
+ { "alpha", "alpha", "little",
+ alpha_machines, G_N_ELEMENTS(alpha_machines) },
+ { "arm", "arm", "little",
+ arm_machines, G_N_ELEMENTS(arm_machines) },
+ { "avr", "avr", "little",
+ avr_machines, G_N_ELEMENTS(avr_machines) },
+ { "hexagon", "hexagon", "little",
+ hexagon_machines, G_N_ELEMENTS(hexagon_machines) },
+ { "hppa", "hppa", "big",
+ hppa_machines, G_N_ELEMENTS(hppa_machines) },
+ { "i386", "i386", "little",
+ i386_machines, G_N_ELEMENTS(i386_machines) },
+ { "loongarch64", "loongarch64", "little",
+ loongarch64_machines, G_N_ELEMENTS(loongarch64_machines) },
+ { "m68k", "m68k", "big",
+ m68k_machines, G_N_ELEMENTS(m68k_machines) },
+ { "microblaze", "microblaze", "big",
+ microblaze_machines, G_N_ELEMENTS(microblaze_machines) },
+ { "mips", "mips", "big",
+ mips_machines, G_N_ELEMENTS(mips_machines) },
+ { "mips64", "mips64", "big",
+ mips64_machines, G_N_ELEMENTS(mips64_machines) },
+ { "mips64el", "mips64", "little",
+ mips64el_machines, G_N_ELEMENTS(mips64el_machines) },
+ { "mipsel", "mips", "little",
+ mipsel_machines, G_N_ELEMENTS(mipsel_machines) },
+ { "or1k", "or1k", "big",
+ or1k_machines, G_N_ELEMENTS(or1k_machines) },
+ { "ppc", "ppc", "big",
+ ppc_machines, G_N_ELEMENTS(ppc_machines) },
+ { "ppc64", "ppc64", "big",
+ ppc64_machines, G_N_ELEMENTS(ppc64_machines) },
+ { "riscv32", "riscv32", "little",
+ riscv32_machines, G_N_ELEMENTS(riscv32_machines) },
+ { "riscv64", "riscv64", "little",
+ riscv64_machines, G_N_ELEMENTS(riscv64_machines) },
+ { "rx", "rx", "little",
+ rx_machines, G_N_ELEMENTS(rx_machines) },
+ { "s390x", "s390x", "big",
+ s390x_machines, G_N_ELEMENTS(s390x_machines) },
+ { "sh4", "sh4", "little",
+ sh4_machines, G_N_ELEMENTS(sh4_machines) },
+ { "sh4eb", "sh4", "big",
+ sh4eb_machines, G_N_ELEMENTS(sh4eb_machines) },
+ { "sparc", "sparc", "big",
+ sparc_machines, G_N_ELEMENTS(sparc_machines) },
+ { "sparc64", "sparc64", "big",
+ sparc64_machines, G_N_ELEMENTS(sparc64_machines) },
+ { "tricore", "tricore", "little",
+ tricore_machines, G_N_ELEMENTS(tricore_machines) },
+ { "x86_64", "x86_64", "little",
+ x86_64_machines, G_N_ELEMENTS(x86_64_machines) },
+ { "xtensa", "xtensa", "little",
+ xtensa_machines, G_N_ELEMENTS(xtensa_machines) },
+ { "xtensaeb", "xtensa", "big",
+ xtensaeb_machines, G_N_ELEMENTS(xtensaeb_machines) },
+};
+
+/*
+ * Machines omitted from the normal lists. Merged in when @accel is
+ * present (NULL means no accel check) and the host matches (NULL
+ * host_os or host_cpu means any). xenfv is an alias of xenfv-4.2.
+ * aarch64 HVF (vmapple) is built only on an aarch64 Darwin host.
+ * nitro is Linux-only, on x86_64-softmmu for an x86_64 host and
+ * aarch64-softmmu for an aarch64 host. x-remote follows KVM on Linux
+ * when host_cpu is the host that builds KVM for that target.
+ */
+static const char * const xen_pc_machines[] = {
+ "xenpv",
+ "xenpvh",
+ "xenfv-4.2",
+};
+
+static const char * const xen_aarch64_machines[] = {
+ "xenpvh",
+};
+
+static const char * const hvf_aarch64_machines[] = {
+ "vmapple",
+};
+
+static const char * const nitro_machines[] = {
+ "nitro",
+};
+
+static const char * const x_remote_machines[] = {
+ "x-remote",
+};
+
+static const struct SpecialMachineMap {
+ const char *target;
+ const char *accel;
+ const char *host_os;
+ const char *host_cpu;
+ const char * const *machines;
+ size_t n_machines;
+} special_machine_map[] = {
+ { "i386", "xen", NULL, "x86_64",
+ xen_pc_machines, G_N_ELEMENTS(xen_pc_machines) },
+ { "i386", "xen", NULL, "aarch64",
+ xen_pc_machines, G_N_ELEMENTS(xen_pc_machines) },
+ { "x86_64", "xen", NULL, "x86_64",
+ xen_pc_machines, G_N_ELEMENTS(xen_pc_machines) },
+ { "x86_64", "xen", NULL, "aarch64",
+ xen_pc_machines, G_N_ELEMENTS(xen_pc_machines) },
+ { "aarch64", "xen", NULL, "aarch64",
+ xen_aarch64_machines, G_N_ELEMENTS(xen_aarch64_machines) },
+ { "aarch64", "hvf", "darwin", "aarch64",
+ hvf_aarch64_machines, G_N_ELEMENTS(hvf_aarch64_machines) },
+ { "x86_64", NULL, "linux", "x86_64",
+ nitro_machines, G_N_ELEMENTS(nitro_machines) },
+ { "aarch64", NULL, "linux", "aarch64",
+ nitro_machines, G_N_ELEMENTS(nitro_machines) },
+ { "i386", "kvm", "linux", "x86_64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "x86_64", "kvm", "linux", "x86_64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "aarch64", "kvm", "linux", "aarch64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "ppc", "kvm", "linux", "ppc64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "ppc64", "kvm", "linux", "ppc64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "s390x", "kvm", "linux", "s390x",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "riscv64", "kvm", "linux", "riscv64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+ { "loongarch64", "kvm", "linux", "loongarch64",
+ x_remote_machines, G_N_ELEMENTS(x_remote_machines) },
+};
+
+static const struct ShippedTarget *lookup_shipped_target(const char *name)
+{
+ size_t i;
+
+ for (i = 0; i < G_N_ELEMENTS(shipped_targets); i++) {
+ if (!strcmp(shipped_targets[i].name, name)) {
+ return &shipped_targets[i];
+ }
+ }
+ return NULL;
+}
+
+static bool have_xen;
+static bool have_hvf;
+static bool have_kvm;
+
+static const char *host_cpu(void)
+{
+#if defined(__aarch64__) || defined(_M_ARM64)
+ return "aarch64";
+#elif defined(__x86_64__) || defined(_M_X64)
+ return "x86_64";
+#elif defined(__powerpc64__)
+ return "ppc64";
+#elif defined(__s390x__)
+ return "s390x";
+#elif defined(__riscv) && __riscv_xlen == 64
+ return "riscv64";
+#elif defined(__loongarch64)
+ return "loongarch64";
+#else
+ return "other";
+#endif
+}
+
+static bool host_os_matches(const char *host_os)
+{
+ if (!host_os) {
+ return true;
+ }
+#if defined(CONFIG_LINUX)
+ return !strcmp(host_os, "linux");
+#elif defined(CONFIG_DARWIN)
+ return !strcmp(host_os, "darwin");
+#else
+ return false;
+#endif
+}
+
+static bool accel_present(const char *accel)
+{
+ if (!accel) {
+ return true;
+ }
+ if (!strcmp(accel, "xen")) {
+ return have_xen;
+ }
+ if (!strcmp(accel, "hvf")) {
+ return have_hvf;
+ }
+ if (!strcmp(accel, "kvm")) {
+ return have_kvm;
+ }
+ return false;
+}
+
+static bool host_cpu_matches(const char *want)
+{
+ if (!want) {
+ return true;
+ }
+ return !strcmp(want, host_cpu());
+}
+
+static bool special_applies(const struct SpecialMachineMap *s,
+ const char *target)
+{
+ return !strcmp(s->target, target) &&
+ accel_present(s->accel) &&
+ host_os_matches(s->host_os) &&
+ host_cpu_matches(s->host_cpu);
+}
+
+static void assert_name_list(QList *names, const char *target,
+ const char * const *expect, size_t n_expect)
+{
+ GHashTable *got = g_hash_table_new(g_str_hash, g_str_equal);
+ GHashTable *want = g_hash_table_new(g_str_hash, g_str_equal);
+ const QListEntry *e;
+ GHashTableIter iter;
+ gpointer key;
+ size_t i;
+
+ g_assert_nonnull(names);
+ for (e = qlist_first(names); e; e = qlist_next(e)) {
+ QString *qs = qobject_to(QString, qlist_entry_obj(e));
+
+ g_assert_nonnull(qs);
+ g_hash_table_add(got, (gpointer)qstring_get_str(qs));
+ }
+ for (i = 0; i < n_expect; i++) {
+ g_hash_table_add(want, (gpointer)expect[i]);
+ }
+ for (i = 0; i < G_N_ELEMENTS(special_machine_map); i++) {
+ const struct SpecialMachineMap *s = &special_machine_map[i];
+ size_t j;
+
+ if (!special_applies(s, target)) {
+ continue;
+ }
+ for (j = 0; j < s->n_machines; j++) {
+ g_hash_table_add(want, (gpointer)s->machines[j]);
+ }
+ }
+ g_hash_table_iter_init(&iter, got);
+ while (g_hash_table_iter_next(&iter, &key, NULL)) {
+ if (!g_hash_table_contains(want, key)) {
+ g_printerr("unexpected machine: %s\n", (const char *)key);
+ }
+ }
+ g_hash_table_iter_init(&iter, want);
+ while (g_hash_table_iter_next(&iter, &key, NULL)) {
+ if (!g_hash_table_contains(got, key)) {
+ g_printerr("missing machine: %s\n", (const char *)key);
+ }
+ }
+ g_assert_cmpuint(g_hash_table_size(got), ==, g_hash_table_size(want));
+ g_hash_table_unref(got);
+ g_hash_table_unref(want);
+}
+
+static void read_accel_flags(QTestState *qts)
+{
+ QDict *resp;
+ QDict *ret;
+ QList *present;
+ const QListEntry *e;
+
+ have_xen = false;
+ have_hvf = false;
+ have_kvm = false;
+ resp = qtest_qmp(qts, "{'execute': 'query-accelerators'}");
+ g_assert(qdict_haskey(resp, "return"));
+ ret = qdict_get_qdict(resp, "return");
+ present = qdict_get_qlist(ret, "present");
+ g_assert_nonnull(present);
+ for (e = qlist_first(present); e; e = qlist_next(e)) {
+ QString *qs = qobject_to(QString, qlist_entry_obj(e));
+ const char *name;
+
+ g_assert_nonnull(qs);
+ name = qstring_get_str(qs);
+ if (!strcmp(name, "xen")) {
+ have_xen = true;
+ } else if (!strcmp(name, "hvf")) {
+ have_hvf = true;
+ } else if (!strcmp(name, "kvm")) {
+ have_kvm = true;
+ }
+ }
+ qobject_unref(resp);
+}
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 33f58b0e95c..8c53bb2e30e 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -23,6 +23,7 @@ qtests_generic = [
'cdrom-test',
'device-introspect-test',
'machine-none-test',
+ 'machine-list-test',
'qmp-test',
'qmp-cmd-test',
'qom-test',
--
2.52.0.windows.1
next prev parent reply other threads:[~2026-09-26 7:01 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-26 6:59 [PATCH v4 00/55] single-binary: link multi-targets into qemu-system Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 01/55] target-info: Introduce target_riscv32 Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 02/55] configs/targets: remove target info definitions Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 03/55] target-info: rename target-info-stub.c in target-info-def.c Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 04/55] target-info: rename target-info-impl.h to target-info-def.h Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 05/55] vl: parse early options before target-info init Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 06/55] target-info: replace QOM registration with a constructor list Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 07/55] tests/unit: add test-target-info Yonggang Luo
2026-09-28 9:07 ` Markus Armbruster
[not found] ` <CAE2XoE9_R13NsUWu-s12QA9RBJykR87TEMh3VmndNEXQsCkNtg@mail.gmail.com>
2026-09-28 9:43 ` Daniel P. Berrangé
2026-09-28 9:48 ` Markus Armbruster
2026-09-26 7:00 ` Yonggang Luo [this message]
2026-09-26 7:00 ` [PATCH v4 09/55] kconfig: rename REGISTER to HW_REGISTER Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 10/55] target-info: add TargetKconfig Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 11/55] target-info: add target_is_* helpers for each architecture Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 12/55] target-info: add target_is_any() Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 13/55] qom: pass TargetInfo to is_available for latter use Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 14/55] target/arm: move kvm_arm_set_cpreg_mig_tolerances to kvm.c Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 15/55] target/arm: allow -cpu host with Nitro Yonggang Luo
2026-09-28 10:06 ` Philippe Mathieu-Daudé
2026-09-26 7:00 ` [PATCH v4 16/55] target/arm: gate -cpu host with TypeIsAvailable Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 17/55] target/arm: replace target_long in A64 translate Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 18/55] target/arm: use vaddr for the A64 insn_start pc Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 19/55] tests/qtest: raise aspeed_smc-test timeout to 12 minutes Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 20/55] target-info: add tl_is_64() and target_is_tl32/64 helpers Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 21/55] tcg: declare TCGv in tcg.h Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 22/55] tcg: dispatch TL memory helpers from tcg-op-mem.h Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 23/55] tcg: dispatch tcg_gen_*_tl without TARGET_LONG_BITS Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 24/55] tcg: dispatch tcg_gen_gvec_dup_tl at runtime Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 25/55] tcg: give common-system helper tl an i64 slot Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 26/55] accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 27/55] tcg: move dup_const into tcg.c Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 28/55] tcg: move goto_tb helpers into tcg-op-ldst.c Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 29/55] accel/tcg: move gvec helpers into tcg-runtime-gvec.h Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 30/55] accel/tcg: move helper_lookup_tb_ptr into cpu-exec.h Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 31/55] accel/tcg: move memory helpers out of tcg-runtime.h Yonggang Luo
2026-09-28 10:40 ` Markus Armbruster
2026-09-26 7:00 ` [PATCH v4 32/55] tests/unit: cover common-system tl dispatch and calls Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 33/55] target/arm: fix A64 guest address width at 64 Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 34/55] target/arm: pass tl temps into SVE and SME helpers Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 35/55] exec: provide target_ulong for softmmu common code Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 36/55] exec: compile abi_ptr.h without per-target cpu-param.h Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 37/55] accel/tcg: keep cpu-ldst endian aliases per-target Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 38/55] target/arm: fold arm_ss into common source sets Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 39/55] target/microblaze: fold system sources " Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 40/55] meson: link shared objects into qemu-system Yonggang Luo
2026-09-28 11:41 ` Markus Armbruster
2026-09-28 11:47 ` Daniel P. Berrangé
2026-09-28 12:23 ` Markus Armbruster
2026-09-26 7:00 ` [PATCH v4 41/55] target-info: add SysEmuTarget none Yonggang Luo
2026-09-28 11:47 ` Markus Armbruster
[not found] ` <CAE2XoE_QozVhBix251nyUQkFMi6p_4idGXpVOT0LSP7VYK8ddw@mail.gmail.com>
2026-09-28 12:17 ` Markus Armbruster
[not found] ` <CAE2XoE88wDu5dYzqVd4gvwNV=bf8qcztLos0xx3iMFnWB+=Nvw@mail.gmail.com>
2026-09-28 12:24 ` Markus Armbruster
2026-09-26 7:00 ` [PATCH v4 42/55] module: load every arch-tagged module when target is none Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 43/55] accel/tcg: tolerate NULL target_cpu_type for -M none Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 44/55] target-info: select combined qemu-system target by name Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 45/55] vl: parse arch: machine types on combined qemu-system Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 46/55] qapi: add query-targets Yonggang Luo
2026-09-28 10:13 ` Daniel P. Berrangé
2026-09-28 10:39 ` Philippe Mathieu-Daudé
[not found] ` <CAE2XoE9qsZZ+AnfGQ797SQj5yXP8SDOZyxYoKP=oh57UPFqq0Q@mail.gmail.com>
2026-09-28 10:57 ` Daniel P. Berrangé
2026-09-28 11:29 ` Philippe Mathieu-Daudé
2026-09-28 11:36 ` Daniel P. Berrangé
2026-09-28 11:34 ` Philippe Mathieu-Daudé
2026-09-28 18:50 ` Yonggang Luo
[not found] ` <CAE2XoE8Fp8w4m0WBjEXF3LceFXUqKDcXhdSmhCThgkAM3wRVaQ@mail.gmail.com>
2026-09-28 19:11 ` Philippe Mathieu-Daudé
2026-09-28 19:18 ` Yonggang Luo
2026-09-29 1:36 ` Yonggang Luo
2026-09-28 12:03 ` Markus Armbruster
2026-09-28 12:08 ` Daniel P. Berrangé
2026-09-28 14:24 ` Yonggang Luo
2026-09-28 14:37 ` Daniel P. Berrangé
2026-09-28 16:05 ` Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 47/55] target-info: add target_is_microblaze Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 48/55] hw/microblaze: set petalogix-s3adsp1800 TypeInfo.is_available Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 49/55] hw/microblaze: expand petalogix-ml605 and xlnx-zynqmp-pmu to TypeInfo Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 50/55] hw/arm: expand leftover 32-bit DEFINE_MACHINE " Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 51/55] hw/arm: expand imx8mm-evk " Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 52/55] hw/arm: set virt TypeInfo.is_available Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 53/55] hw/arm: set remaining 32-bit machine TypeInfo.is_available Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 54/55] hw/arm: set aarch64-only " Yonggang Luo
2026-09-26 7:00 ` [PATCH v4 55/55] tests/qtest: cover combined qemu-system machines Yonggang Luo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260926070057.1234-9-luoyonggang@gmail.com \
--to=luoyonggang@gmail.com \
--cc=alistair@alistair23.me \
--cc=berrange@redhat.com \
--cc=edgar.iglesias@gmail.com \
--cc=farosas@suse.de \
--cc=kvm@vger.kernel.org \
--cc=lvivier@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@oss.qualcomm.com \
--cc=pierrick.bouvier@oss.qualcomm.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox