Some platforms, like aarch64, don't have APIC but GIC. So there's
no reason to have <apic/> feature turned on. However, we are
still missing <gic/> feature. This commit introduces the feature
to XML parser and formatter, adds documentation and updates RNG
schema.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
docs/formatdomain.html.in | 9 +++++++++
docs/schemas/domaincommon.rng | 11 ++++++++++-
src/conf/domain_conf.c | 34 +++++++++++++++++++++++++++++++++-
src/conf/domain_conf.h | 2 ++
4 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index e921749..27883fe 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1401,6 +1401,7 @@
<hidden state='on'/>
</kvm>
<pvspinlock/>
+ <gic version='2'/>
</features>
...</pre>
@@ -1501,6 +1502,14 @@
performance monitoring unit for the guest.
<span class="since">Since 1.2.12</span>
</dd>
+ <dt><code>gic</code></dt>
+ <dd>Some architectures don't have <code>APIC</code> but have
+ <code>GIC</code> <i>(Generic Interrupt Controller)</i>.
For example
+ aarch64 is one of those architectures. If the guest belongs to the
+ set, you may want to turn on this feature instead of
+ <code>APIC</code>. Optional attribute
<code>version</code> specifies
+ version of the controller, however may not be supported by all
+ hypervisors.</dd>
</dl>
<h3><a name="elementsTime">Time keeping</a></h3>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 19461f5..b1d6f6b 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3953,7 +3953,7 @@
</element>
</define>
<!--
- A set of optional features: PAE, APIC, ACPI,
+ A set of optional features: PAE, APIC, ACPI, GIC,
HyperV Enlightenment, KVM features, paravirtual spinlocks and HAP support
-->
<define name="features">
@@ -4014,6 +4014,15 @@
<optional>
<ref name="pmu"/>
</optional>
+ <optional>
+ <element name="gic">
+ <optional>
+ <attribute name="version">
+ <ref name="positiveInteger"/>
+ </attribute>
+ </optional>
+ </element>
+ </optional>
</interleave>
</element>
</optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 03710cb..466163e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -144,7 +144,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
"kvm",
"pvspinlock",
"capabilities",
- "pmu")
+ "pmu",
+ "gic")
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
"default",
@@ -14361,6 +14362,23 @@ virDomainDefParseXML(xmlDocPtr xml,
ctxt->node = node;
break;
+ case VIR_DOMAIN_FEATURE_GIC:
+ node = ctxt->node;
+ ctxt->node = nodes[i];
+ if ((tmp = virXPathString("string(./@version)", ctxt))) {
+ if (virStrToLong_ui(tmp, NULL, 10, &def->gic_version) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("malformed gic version: %s"), tmp);
+ goto error;
+ }
+ VIR_FREE(tmp);
+ } else {
+ def->gic_version = 2; /* By default, GIC version is 2 */
+ }
+ def->features[val] = VIR_TRISTATE_SWITCH_ON;
+ ctxt->node = node;
+ break;
+
/* coverity[dead_error_begin] */
case VIR_DOMAIN_FEATURE_LAST:
break;
@@ -16443,6 +16461,14 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
return false;
}
+ /* GIC version */
+ if (src->gic_version != dst->gic_version) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Source GIC version '%u' does not match destination
'%u'"),
+ src->gic_version, dst->gic_version);
+ return false;
+ }
+
/* hyperv */
if (src->features[VIR_DOMAIN_FEATURE_HYPERV] == VIR_TRISTATE_SWITCH_ON) {
for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) {
@@ -20996,6 +21022,12 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virBufferAddLit(buf, "</capabilities>\n");
break;
+ case VIR_DOMAIN_FEATURE_GIC:
+ if (def->features[i] == VIR_TRISTATE_SWITCH_ON)
+ virBufferAsprintf(buf, "<gic
version='%u'/>\n",
+ def->gic_version);
+ break;
+
/* coverity[dead_error_begin] */
case VIR_DOMAIN_FEATURE_LAST:
break;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 9955052..a79f0b8 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1649,6 +1649,7 @@ typedef enum {
VIR_DOMAIN_FEATURE_PVSPINLOCK,
VIR_DOMAIN_FEATURE_CAPABILITIES,
VIR_DOMAIN_FEATURE_PMU,
+ VIR_DOMAIN_FEATURE_GIC,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
@@ -2171,6 +2172,7 @@ struct _virDomainDef {
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
int kvm_features[VIR_DOMAIN_KVM_LAST];
unsigned int hyperv_spinlocks;
+ unsigned int gic_version; /* by default 2 */
/* These options are of type virTristateSwitch: ON = keep, OFF = drop */
int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST];
--
2.0.5