4 # include "testutilsqemu.h"
5 # include "testutilshostcpus.h"
6 # include "testutils.h"
9 # include "qemu/qemu_driver.h"
10 # include "qemu/qemu_domain.h"
11 # define LIBVIRT_QEMU_CAPSPRIV_H_ALLOW
12 # include "qemu/qemu_capspriv.h"
13 # include "virstring.h"
14 # include "virfilecache.h"
16 # define VIR_FROM_THIS VIR_FROM_QEMU
18 virCPUDefPtr cpuDefault
;
19 virCPUDefPtr cpuHaswell
;
20 virCPUDefPtr cpuPower8
;
21 virCPUDefPtr cpuPower9
;
24 TEST_UTILS_QEMU_BIN_I686
,
25 TEST_UTILS_QEMU_BIN_X86_64
,
26 TEST_UTILS_QEMU_BIN_AARCH64
,
27 TEST_UTILS_QEMU_BIN_ARM
,
28 TEST_UTILS_QEMU_BIN_PPC64
,
29 TEST_UTILS_QEMU_BIN_PPC
,
30 TEST_UTILS_QEMU_BIN_RISCV32
,
31 TEST_UTILS_QEMU_BIN_RISCV64
,
32 TEST_UTILS_QEMU_BIN_S390X
35 static const char *QEMUBinList
[] = {
36 "/usr/bin/qemu-system-i686",
37 "/usr/bin/qemu-system-x86_64",
38 "/usr/bin/qemu-system-aarch64",
39 "/usr/bin/qemu-system-arm",
40 "/usr/bin/qemu-system-ppc64",
41 "/usr/bin/qemu-system-ppc",
42 "/usr/bin/qemu-system-riscv32",
43 "/usr/bin/qemu-system-riscv64",
44 "/usr/bin/qemu-system-s390x"
48 static virCapsGuestMachinePtr
*testQemuAllocMachines(int *nmachines
)
50 virCapsGuestMachinePtr
*machines
;
51 static const char *const x86_machines
[] = {
55 machines
= virCapabilitiesAllocMachines(x86_machines
,
56 ARRAY_CARDINALITY(x86_machines
));
60 *nmachines
= ARRAY_CARDINALITY(x86_machines
);
65 /* Newer versions of qemu have versioned machine types to allow
66 * compatibility with older releases.
67 * The 'pc' machine type is an alias of the newest machine type.
69 static virCapsGuestMachinePtr
*testQemuAllocNewerMachines(int *nmachines
)
71 virCapsGuestMachinePtr
*machines
;
73 static const char *const x86_machines
[] = {
74 "pc-0.11", "pc", "pc-0.10", "isapc"
77 if (VIR_STRDUP(canonical
, x86_machines
[0]) < 0)
80 machines
= virCapabilitiesAllocMachines(x86_machines
,
81 ARRAY_CARDINALITY(x86_machines
));
82 if (machines
== NULL
) {
87 machines
[1]->canonical
= canonical
;
89 *nmachines
= ARRAY_CARDINALITY(x86_machines
);
96 testQemuAddI686Guest(virCapsPtr caps
)
99 virCapsGuestMachinePtr
*machines
= NULL
;
100 virCapsGuestPtr guest
;
102 if (!(machines
= testQemuAllocMachines(&nmachines
)))
105 if (!(guest
= virCapabilitiesAddGuest(caps
,
106 VIR_DOMAIN_OSTYPE_HVM
,
108 QEMUBinList
[TEST_UTILS_QEMU_BIN_I686
],
114 if (!virCapabilitiesAddGuestFeature(guest
, "cpuselection", true, false))
119 if (!virCapabilitiesAddGuestDomain(guest
,
120 VIR_DOMAIN_VIRT_QEMU
,
127 if (!(machines
= testQemuAllocMachines(&nmachines
)))
130 if (!virCapabilitiesAddGuestDomain(guest
,
132 QEMUBinList
[TEST_UTILS_QEMU_BIN_I686
],
141 virCapabilitiesFreeMachines(machines
, nmachines
);
147 testQemuAddX86_64Guest(virCapsPtr caps
)
150 virCapsGuestMachinePtr
*machines
= NULL
;
151 virCapsGuestPtr guest
;
153 if (!(machines
= testQemuAllocNewerMachines(&nmachines
)))
156 if (!(guest
= virCapabilitiesAddGuest(caps
,
157 VIR_DOMAIN_OSTYPE_HVM
,
159 QEMUBinList
[TEST_UTILS_QEMU_BIN_X86_64
],
165 if (!virCapabilitiesAddGuestFeature(guest
, "cpuselection", true, false))
170 if (!virCapabilitiesAddGuestDomain(guest
,
171 VIR_DOMAIN_VIRT_QEMU
,
178 if (!(machines
= testQemuAllocMachines(&nmachines
)))
181 if (!virCapabilitiesAddGuestDomain(guest
,
183 QEMUBinList
[TEST_UTILS_QEMU_BIN_X86_64
],
191 if (!virCapabilitiesAddGuestDomain(guest
,
193 QEMUBinList
[TEST_UTILS_QEMU_BIN_X86_64
],
202 virCapabilitiesFreeMachines(machines
, nmachines
);
207 static int testQemuAddPPC64Guest(virCapsPtr caps
)
209 static const char *machine
[] = { "pseries" };
210 virCapsGuestMachinePtr
*machines
= NULL
;
211 virCapsGuestPtr guest
;
213 machines
= virCapabilitiesAllocMachines(machine
, 1);
217 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_PPC64
,
218 QEMUBinList
[TEST_UTILS_QEMU_BIN_PPC64
],
223 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
225 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
226 NULL
, NULL
, 0, NULL
))
232 /* No way to free a guest? */
233 virCapabilitiesFreeMachines(machines
, 1);
237 static int testQemuAddPPC64LEGuest(virCapsPtr caps
)
239 static const char *machine
[] = { "pseries" };
240 virCapsGuestMachinePtr
*machines
= NULL
;
241 virCapsGuestPtr guest
;
243 machines
= virCapabilitiesAllocMachines(machine
, 1);
247 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_PPC64LE
,
248 QEMUBinList
[TEST_UTILS_QEMU_BIN_PPC64
],
253 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
255 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
256 NULL
, NULL
, 0, NULL
))
262 /* No way to free a guest? */
263 virCapabilitiesFreeMachines(machines
, 1);
267 static int testQemuAddPPCGuest(virCapsPtr caps
)
269 static const char *machine
[] = { "g3beige",
273 virCapsGuestMachinePtr
*machines
= NULL
;
274 virCapsGuestPtr guest
;
276 machines
= virCapabilitiesAllocMachines(machine
, 1);
280 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_PPC
,
281 QEMUBinList
[TEST_UTILS_QEMU_BIN_PPC
],
286 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
288 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
289 NULL
, NULL
, 0, NULL
))
295 /* No way to free a guest? */
296 virCapabilitiesFreeMachines(machines
, 1);
300 static int testQemuAddRISCV32Guest(virCapsPtr caps
)
302 static const char *names
[] = { "spike_v1.10",
307 static const int nmachines
= ARRAY_CARDINALITY(names
);
308 virCapsGuestMachinePtr
*machines
= NULL
;
309 virCapsGuestPtr guest
;
311 machines
= virCapabilitiesAllocMachines(names
, nmachines
);
315 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_RISCV32
,
316 QEMUBinList
[TEST_UTILS_QEMU_BIN_RISCV32
],
317 NULL
, nmachines
, machines
);
321 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
327 virCapabilitiesFreeMachines(machines
, nmachines
);
331 static int testQemuAddRISCV64Guest(virCapsPtr caps
)
333 static const char *names
[] = { "spike_v1.10",
338 static const int nmachines
= ARRAY_CARDINALITY(names
);
339 virCapsGuestMachinePtr
*machines
= NULL
;
340 virCapsGuestPtr guest
;
342 machines
= virCapabilitiesAllocMachines(names
, nmachines
);
346 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_RISCV64
,
347 QEMUBinList
[TEST_UTILS_QEMU_BIN_RISCV64
],
348 NULL
, nmachines
, machines
);
352 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
358 virCapabilitiesFreeMachines(machines
, nmachines
);
362 static int testQemuAddS390Guest(virCapsPtr caps
)
364 static const char *s390_machines
[] = { "s390-virtio",
366 virCapsGuestMachinePtr
*machines
= NULL
;
367 virCapsGuestPtr guest
;
369 machines
= virCapabilitiesAllocMachines(s390_machines
,
370 ARRAY_CARDINALITY(s390_machines
));
374 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_S390X
,
375 QEMUBinList
[TEST_UTILS_QEMU_BIN_S390X
],
377 ARRAY_CARDINALITY(s390_machines
),
382 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
384 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
385 NULL
, NULL
, 0, NULL
))
391 virCapabilitiesFreeMachines(machines
, ARRAY_CARDINALITY(s390_machines
));
395 static int testQemuAddArm6Guest(virCapsPtr caps
)
397 static const char *machines
[] = { "versatilepb" };
398 virCapsGuestMachinePtr
*capsmachines
= NULL
;
399 virCapsGuestPtr guest
;
401 capsmachines
= virCapabilitiesAllocMachines(machines
,
402 ARRAY_CARDINALITY(machines
));
406 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_ARMV6L
,
407 QEMUBinList
[TEST_UTILS_QEMU_BIN_ARM
],
409 ARRAY_CARDINALITY(machines
),
414 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
416 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
417 NULL
, NULL
, 0, NULL
))
423 virCapabilitiesFreeMachines(capsmachines
, ARRAY_CARDINALITY(machines
));
427 static int testQemuAddArm7Guest(virCapsPtr caps
)
429 static const char *machines
[] = { "vexpress-a9",
432 virCapsGuestMachinePtr
*capsmachines
= NULL
;
433 virCapsGuestPtr guest
;
435 capsmachines
= virCapabilitiesAllocMachines(machines
,
436 ARRAY_CARDINALITY(machines
));
440 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_ARMV7L
,
441 QEMUBinList
[TEST_UTILS_QEMU_BIN_ARM
],
443 ARRAY_CARDINALITY(machines
),
448 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
450 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
451 NULL
, NULL
, 0, NULL
))
457 virCapabilitiesFreeMachines(capsmachines
, ARRAY_CARDINALITY(machines
));
461 static int testQemuAddAARCH64Guest(virCapsPtr caps
)
463 static const char *machines
[] = { "virt"};
464 virCapsGuestMachinePtr
*capsmachines
= NULL
;
465 virCapsGuestPtr guest
;
467 capsmachines
= virCapabilitiesAllocMachines(machines
,
468 ARRAY_CARDINALITY(machines
));
472 guest
= virCapabilitiesAddGuest(caps
, VIR_DOMAIN_OSTYPE_HVM
, VIR_ARCH_AARCH64
,
473 QEMUBinList
[TEST_UTILS_QEMU_BIN_AARCH64
],
475 ARRAY_CARDINALITY(machines
),
480 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_QEMU
, NULL
, NULL
, 0, NULL
))
482 if (!virCapabilitiesAddGuestDomain(guest
, VIR_DOMAIN_VIRT_KVM
,
483 NULL
, NULL
, 0, NULL
))
489 virCapabilitiesFreeMachines(capsmachines
, ARRAY_CARDINALITY(machines
));
493 virCapsPtr
testQemuCapsInit(void)
497 if (!(caps
= virCapabilitiesNew(VIR_ARCH_X86_64
, false, false)))
500 /* Add dummy 'none' security_driver. This is equal to setting
501 * security_driver = "none" in qemu.conf. */
502 if (VIR_ALLOC_N(caps
->host
.secModels
, 1) < 0)
504 caps
->host
.nsecModels
= 1;
506 if (VIR_STRDUP(caps
->host
.secModels
[0].model
, "none") < 0 ||
507 VIR_STRDUP(caps
->host
.secModels
[0].doi
, "0") < 0)
510 if (!(cpuDefault
= virCPUDefCopy(&cpuDefaultData
)) ||
511 !(cpuHaswell
= virCPUDefCopy(&cpuHaswellData
)) ||
512 !(cpuPower8
= virCPUDefCopy(&cpuPower8Data
)) ||
513 !(cpuPower9
= virCPUDefCopy(&cpuPower9Data
)))
516 qemuTestSetHostCPU(caps
, NULL
);
519 * Build a NUMA topology with cell_id (NUMA node id
520 * being 3(0 + 3),4(1 + 3), 5 and 6
522 if (virTestCapsBuildNUMATopology(caps
, 3) < 0)
525 if (testQemuAddI686Guest(caps
) < 0)
528 if (testQemuAddX86_64Guest(caps
) < 0)
531 if (testQemuAddPPC64Guest(caps
))
534 if (testQemuAddPPC64LEGuest(caps
))
537 if (testQemuAddPPCGuest(caps
))
540 if (testQemuAddRISCV32Guest(caps
) < 0)
543 if (testQemuAddRISCV64Guest(caps
) < 0)
546 if (testQemuAddS390Guest(caps
))
549 if (testQemuAddArm6Guest(caps
))
552 if (testQemuAddArm7Guest(caps
))
555 if (testQemuAddAARCH64Guest(caps
))
558 if (virTestGetDebug()) {
561 caps_str
= virCapabilitiesFormatXML(caps
);
565 VIR_TEST_DEBUG("QEMU driver capabilities:\n%s", caps_str
);
573 caps
->host
.cpu
= NULL
;
574 virCPUDefFree(cpuDefault
);
575 virCPUDefFree(cpuHaswell
);
576 virCPUDefFree(cpuPower8
);
577 virObjectUnref(caps
);
583 qemuTestSetHostArch(virCapsPtr caps
,
586 if (arch
== VIR_ARCH_NONE
)
587 arch
= VIR_ARCH_X86_64
;
588 caps
->host
.arch
= arch
;
589 qemuTestSetHostCPU(caps
, NULL
);
594 qemuTestSetHostCPU(virCapsPtr caps
,
597 virArch arch
= caps
->host
.arch
;
600 if (ARCH_IS_X86(arch
))
602 else if (ARCH_IS_PPC64(arch
))
606 unsetenv("VIR_TEST_MOCK_FAKE_HOST_CPU");
608 caps
->host
.arch
= cpu
->arch
;
610 setenv("VIR_TEST_MOCK_FAKE_HOST_CPU", cpu
->model
, 1);
612 caps
->host
.cpu
= cpu
;
617 qemuTestParseCapabilitiesArch(virArch arch
,
618 const char *capsFile
)
620 virQEMUCapsPtr qemuCaps
= NULL
;
622 if (!(qemuCaps
= virQEMUCapsNew()) ||
623 virQEMUCapsLoadCache(arch
, qemuCaps
, capsFile
) < 0)
629 virObjectUnref(qemuCaps
);
635 qemuTestParseCapabilities(virCapsPtr caps
,
636 const char *capsFile
)
641 return qemuTestParseCapabilitiesArch(caps
->host
.arch
, capsFile
);
645 void qemuTestDriverFree(virQEMUDriver
*driver
)
647 virMutexDestroy(&driver
->lock
);
648 if (driver
->config
) {
649 virFileDeleteTree(driver
->config
->stateDir
);
650 virFileDeleteTree(driver
->config
->configDir
);
652 virObjectUnref(driver
->qemuCapsCache
);
653 virObjectUnref(driver
->xmlopt
);
654 virObjectUnref(driver
->caps
);
655 virObjectUnref(driver
->config
);
656 virObjectUnref(driver
->securityManager
);
659 int qemuTestCapsCacheInsert(virFileCachePtr cache
,
663 virQEMUCapsPtr tmpCaps
;
668 if (!(tmpCaps
= virQEMUCapsNew()))
672 for (i
= 0; i
< ARRAY_CARDINALITY(QEMUBinList
); i
++) {
673 virObjectRef(tmpCaps
);
674 if (virFileCacheInsertData(cache
, QEMUBinList
[i
], tmpCaps
) < 0) {
675 virObjectUnref(tmpCaps
);
681 virObjectUnref(tmpCaps
);
687 # define STATEDIRTEMPLATE abs_builddir "/qemustatedir-XXXXXX"
688 # define CONFIGDIRTEMPLATE abs_builddir "/qemuconfigdir-XXXXXX"
690 int qemuTestDriverInit(virQEMUDriver
*driver
)
692 virSecurityManagerPtr mgr
= NULL
;
693 char statedir
[] = STATEDIRTEMPLATE
;
694 char configdir
[] = CONFIGDIRTEMPLATE
;
696 memset(driver
, 0, sizeof(*driver
));
698 if (virMutexInit(&driver
->lock
) < 0)
701 driver
->config
= virQEMUDriverConfigNew(false);
705 /* Do this early so that qemuTestDriverFree() doesn't see (unlink) the real
707 VIR_FREE(driver
->config
->stateDir
);
708 VIR_FREE(driver
->config
->configDir
);
710 /* Overwrite some default paths so it's consistent for tests. */
711 VIR_FREE(driver
->config
->libDir
);
712 VIR_FREE(driver
->config
->channelTargetDir
);
713 if (VIR_STRDUP(driver
->config
->libDir
, "/tmp/lib") < 0 ||
714 VIR_STRDUP(driver
->config
->channelTargetDir
, "/tmp/channel") < 0)
717 if (!mkdtemp(statedir
)) {
718 virFilePrintf(stderr
, "Cannot create fake stateDir");
722 if (VIR_STRDUP(driver
->config
->stateDir
, statedir
) < 0) {
727 if (!mkdtemp(configdir
)) {
728 virFilePrintf(stderr
, "Cannot create fake configDir");
732 if (VIR_STRDUP(driver
->config
->configDir
, configdir
) < 0) {
737 driver
->caps
= testQemuCapsInit();
741 /* Using /dev/null for libDir and cacheDir automatically produces errors
742 * upon attempt to use any of them */
743 driver
->qemuCapsCache
= virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0);
744 if (!driver
->qemuCapsCache
)
747 driver
->xmlopt
= virQEMUDriverCreateXMLConf(driver
);
751 if (qemuTestCapsCacheInsert(driver
->qemuCapsCache
, NULL
) < 0)
754 if (!(mgr
= virSecurityManagerNew("none", "qemu",
755 VIR_SECURITY_MANAGER_PRIVILEGED
)))
757 if (!(driver
->securityManager
= virSecurityManagerNewStack(mgr
)))
764 qemuTestDriverFree(driver
);
769 testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps
,
772 virGICCapability
*gicCapabilities
= NULL
;
773 size_t ngicCapabilities
= 0;
776 if (VIR_ALLOC_N(gicCapabilities
, 2) < 0)
780 VIR_GIC_IMPLEMENTATION_KERNEL|VIR_GIC_IMPLEMENTATION_EMULATED
783 gicCapabilities
[ngicCapabilities
].version
= VIR_GIC_VERSION_2
;
784 gicCapabilities
[ngicCapabilities
].implementation
= IMPL_BOTH
;
788 gicCapabilities
[ngicCapabilities
].version
= VIR_GIC_VERSION_3
;
789 gicCapabilities
[ngicCapabilities
].implementation
= IMPL_BOTH
;
795 virQEMUCapsSetGICCapabilities(qemuCaps
,
796 gicCapabilities
, ngicCapabilities
);
808 testQemuGetLatestCapsForArch(const char *arch
,
814 char *fullsuffix
= NULL
;
816 unsigned long maxver
= 0;
818 const char *maxname
= NULL
;
821 if (virAsprintf(&fullsuffix
, "%s.%s", arch
, suffix
) < 0)
824 if (virDirOpen(&dir
, TEST_QEMU_CAPS_PATH
) < 0)
827 while ((rc
= virDirRead(dir
, &ent
, TEST_QEMU_CAPS_PATH
)) > 0) {
830 if ((rc
= VIR_STRDUP(tmp
, STRSKIP(ent
->d_name
, "caps_"))) < 0)
836 if (!virStringStripSuffix(tmp
, fullsuffix
))
839 if (virParseVersionString(tmp
, &ver
, false) < 0) {
840 VIR_TEST_DEBUG("skipping caps file '%s'\n", ent
->d_name
);
845 maxname
= ent
->d_name
;
854 VIR_TEST_VERBOSE("failed to find capabilities for '%s' in '%s'\n",
855 arch
, TEST_QEMU_CAPS_PATH
);
859 ignore_value(virAsprintf(&ret
, "%s/%s", TEST_QEMU_CAPS_PATH
, maxname
));
863 VIR_FREE(fullsuffix
);
870 testQemuGetLatestCaps(void)
872 const char *archs
[] = {
879 virHashTablePtr capslatest
;
882 if (!(capslatest
= virHashCreate(4, virHashValueFree
)))
885 VIR_TEST_VERBOSE("\n");
887 for (i
= 0; i
< ARRAY_CARDINALITY(archs
); ++i
) {
888 char *cap
= testQemuGetLatestCapsForArch(archs
[i
], "xml");
890 if (!cap
|| virHashAddEntry(capslatest
, archs
[i
], cap
) < 0)
893 VIR_TEST_VERBOSE("latest caps for %s: %s\n", archs
[i
], cap
);
896 VIR_TEST_VERBOSE("\n");
900 virHashFree(capslatest
);
906 testQemuCapsIterate(const char *suffix
,
907 testQemuCapsIterateCallback callback
,
918 if (virDirOpen(&dir
, TEST_QEMU_CAPS_PATH
) < 0)
921 while ((rc
= virDirRead(dir
, &ent
, TEST_QEMU_CAPS_PATH
)) > 0) {
922 char *tmp
= ent
->d_name
;
924 char *archName
= NULL
;
926 /* Strip the trailing suffix, moving on if it's not present */
927 if (!virStringStripSuffix(tmp
, suffix
))
930 /* Find the last dot, moving on if none is present */
931 if (!(archName
= strrchr(tmp
, '.')))
934 /* The base name is everything before the last dot, and
935 * the architecture name everything after it */
940 /* Run the user-provided callback */
941 if (callback(base
, archName
, opaque
) < 0)
958 testQemuInfoSetArgs(struct testQemuInfo
*info
,
959 virHashTablePtr capslatest
, ...)
962 testQemuInfoArgName argname
;
963 virQEMUCapsPtr qemuCaps
= NULL
;
965 char *capsarch
= NULL
;
966 char *capsver
= NULL
;
967 VIR_AUTOFREE(char *) capsfile
= NULL
;
971 va_start(argptr
, capslatest
);
972 argname
= va_arg(argptr
, testQemuInfoArgName
);
973 while (argname
!= ARG_END
) {
976 if (qemuCaps
|| !(qemuCaps
= virQEMUCapsNew()))
979 while ((flag
= va_arg(argptr
, int)) < QEMU_CAPS_LAST
)
980 virQEMUCapsSet(qemuCaps
, flag
);
982 /* Some tests are run with NONE capabilities, which is just
983 * another name for QEMU_CAPS_LAST. If that is the case the
984 * arguments look like this :
986 * ARG_QEMU_CAPS, NONE, QEMU_CAPS_LAST, ARG_END
988 * Fetch one argument more and if it is QEMU_CAPS_LAST then
989 * break from the switch() to force getting next argument
990 * in the line. If it is not QEMU_CAPS_LAST then we've
991 * fetched real ARG_* and we must process it.
993 if ((flag
= va_arg(argptr
, int)) != QEMU_CAPS_LAST
) {
1001 gic
= va_arg(argptr
, int);
1004 case ARG_MIGRATE_FROM
:
1005 info
->migrateFrom
= va_arg(argptr
, char *);
1008 case ARG_MIGRATE_FD
:
1009 info
->migrateFd
= va_arg(argptr
, int);
1013 info
->flags
= va_arg(argptr
, int);
1016 case ARG_PARSEFLAGS
:
1017 info
->parseFlags
= va_arg(argptr
, int);
1021 capsarch
= va_arg(argptr
, char *);
1025 capsver
= va_arg(argptr
, char *);
1030 fprintf(stderr
, "Unexpected test info argument");
1034 argname
= va_arg(argptr
, testQemuInfoArgName
);
1037 if (!!capsarch
^ !!capsver
) {
1038 fprintf(stderr
, "ARG_CAPS_ARCH and ARG_CAPS_VER "
1039 "must be specified together.\n");
1043 if (qemuCaps
&& (capsarch
|| capsver
)) {
1044 fprintf(stderr
, "ARG_QEMU_CAPS can not be combined with ARG_CAPS_ARCH "
1045 "or ARG_CAPS_VER\n");
1049 if (!qemuCaps
&& capsarch
&& capsver
) {
1050 bool stripmachinealiases
= false;
1052 if (STREQ(capsver
, "latest")) {
1053 if (VIR_STRDUP(capsfile
, virHashLookup(capslatest
, capsarch
)) < 0)
1055 stripmachinealiases
= true;
1056 } else if (virAsprintf(&capsfile
, "%s/caps_%s.%s.xml",
1057 TEST_QEMU_CAPS_PATH
, capsver
, capsarch
) < 0) {
1061 if (!(qemuCaps
= qemuTestParseCapabilitiesArch(virArchFromString(capsarch
),
1066 if (stripmachinealiases
)
1067 virQEMUCapsStripMachineAliases(qemuCaps
);
1068 info
->flags
|= FLAG_REAL_CAPS
;
1072 fprintf(stderr
, "No qemuCaps generated\n");
1075 VIR_STEAL_PTR(info
->qemuCaps
, qemuCaps
);
1077 if (gic
!= GIC_NONE
&& testQemuCapsSetGIC(info
->qemuCaps
, gic
) < 0)
1083 virObjectUnref(qemuCaps
);
1091 testQemuInfoClear(struct testQemuInfo
*info
)
1093 VIR_FREE(info
->infile
);
1094 VIR_FREE(info
->outfile
);
1095 virObjectUnref(info
->qemuCaps
);