diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 100338ea1c..3ccc2dcb6e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3516,6 +3516,42 @@ bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps) } +struct virQEMUCapsMachineTypeFilter { + const char *machineType; + virQEMUCapsFlags *flags; + size_t nflags; +}; + +static const struct virQEMUCapsMachineTypeFilter virQEMUCapsMachineFilter[] = { + /* { "blah", virQEMUCapsMachineBLAHFilter, + ARRAY_CARDINALITY(virQEMUCapsMachineBLAHFilter) }, */ + { "", NULL, 0 }, +}; + + +void +virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps, + const char *machineType) +{ + size_t i; + + if (!machineType) + return; + + for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsMachineFilter); i++) { + const struct virQEMUCapsMachineTypeFilter *filter = &virQEMUCapsMachineFilter[i]; + size_t j; + + if (STRNEQ(filter->machineType, machineType)) + continue; + + for (j = 0; j < filter->nflags; j++) + virQEMUCapsClear(qemuCaps, filter->flags[j]); + } + +} + + virQEMUCapsCachePtr virQEMUCapsCacheNew(const char *libDir, const char *cacheDir, @@ -3590,7 +3626,7 @@ virQEMUCapsCacheLookup(virQEMUCapsCachePtr cache, const char *binary) virQEMUCapsPtr virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache, const char *binary, - const char *machineType ATTRIBUTE_UNUSED) + const char *machineType) { virQEMUCapsPtr qemuCaps = virQEMUCapsCacheLookup(cache, binary); virQEMUCapsPtr ret; @@ -3600,6 +3636,7 @@ virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache, ret = virQEMUCapsNewCopy(qemuCaps); virObjectUnref(qemuCaps); + virQEMUCapsFilterByMachineType(ret, machineType); return ret; } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 242a33d6cc..5d87c1885f 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -284,6 +284,8 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps, bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps); +void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps, + const char *machineType); virQEMUCapsCachePtr virQEMUCapsCacheNew(const char *libDir, const char *cacheDir, diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 39ed66b2e4..16f325e2bd 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -312,6 +312,8 @@ static int testCompareXMLToArgvFiles(const char *xml, goto out; } + virQEMUCapsFilterByMachineType(extraFlags, vmdef->os.machine); + if (virQEMUCapsGet(extraFlags, QEMU_CAPS_DEVICE)) { if (qemuDomainAssignAddresses(vmdef, extraFlags, NULL)) { if (flags & FLAG_EXPECT_ERROR)