qemu: Add virQEMUCapsSupportsGICVersion()

This utility function extracts some of the logic from
virQEMUCapsFillDomainFeatureGICCaps() so that it can be used
in a different context.
This commit is contained in:
Andrea Bolognani 2016-05-16 13:23:01 +02:00
parent f2b4609723
commit 58f0152f3b
2 changed files with 50 additions and 11 deletions

View File

@ -4233,6 +4233,44 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
} }
/**
* virQEMUCapsSupportsGICVersion:
* @qemuCaps: QEMU capabilities
* @virtType: domain type
* @version: GIC version
*
* Checks the QEMU binary with capabilities @qemuCaps supports a specific
* GIC version for a domain of type @virtType.
*
* Returns: true if the binary supports the requested GIC version, false
* otherwise
*/
bool
virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps,
virDomainVirtType virtType,
virGICVersion version)
{
size_t i;
for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
virGICCapabilityPtr cap = &(qemuCaps->gicCapabilities[i]);
if (cap->version != version)
continue;
if (virtType == VIR_DOMAIN_VIRT_KVM &&
cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL)
return true;
if (virtType == VIR_DOMAIN_VIRT_QEMU &&
cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED)
return true;
}
return false;
}
/** /**
* virQEMUCapsFillDomainFeatureGICCaps: * virQEMUCapsFillDomainFeatureGICCaps:
* @qemuCaps: QEMU capabilities * @qemuCaps: QEMU capabilities
@ -4257,7 +4295,7 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
virDomainCapsPtr domCaps) virDomainCapsPtr domCaps)
{ {
virDomainCapsFeatureGICPtr gic = &domCaps->gic; virDomainCapsFeatureGICPtr gic = &domCaps->gic;
size_t i; virGICVersion version;
if (domCaps->arch != VIR_ARCH_ARMV7L && if (domCaps->arch != VIR_ARCH_ARMV7L &&
domCaps->arch != VIR_ARCH_AARCH64) domCaps->arch != VIR_ARCH_AARCH64)
@ -4267,20 +4305,17 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
!STRPREFIX(domCaps->machine, "virt-")) !STRPREFIX(domCaps->machine, "virt-"))
return 0; return 0;
for (i = 0; i < qemuCaps->ngicCapabilities; i++) { for (version = VIR_GIC_VERSION_LAST - 1;
virGICCapabilityPtr cap = &qemuCaps->gicCapabilities[i]; version > VIR_GIC_VERSION_NONE;
version--) {
if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM && if (!virQEMUCapsSupportsGICVersion(qemuCaps,
!(cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL)) domCaps->virttype,
continue; version))
if (domCaps->virttype == VIR_DOMAIN_VIRT_QEMU &&
!(cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED))
continue; continue;
gic->supported = true; gic->supported = true;
VIR_DOMAIN_CAPS_ENUM_SET(gic->version, VIR_DOMAIN_CAPS_ENUM_SET(gic->version,
cap->version); version);
} }
return 0; return 0;

View File

@ -463,6 +463,10 @@ bool virQEMUCapsSupportsChardev(const virDomainDef *def,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
virDomainChrDefPtr chr); virDomainChrDefPtr chr);
bool virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps,
virDomainVirtType virtType,
virGICVersion version);
bool virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps, bool virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps,
const char *canonical_machine); const char *canonical_machine);