From 921c52b0db3ac898d5cc4eda19fb861ad58d9a9e Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Mon, 27 Apr 2015 14:03:19 +0200 Subject: [PATCH] Introduce GIC feature Some platforms, like aarch64, don't have APIC but GIC. So there's no reason to have feature turned on. However, we are still missing feature. This commit introduces the feature to XML parser and formatter, adds documentation and updates RNG schema. Signed-off-by: Michal Privoznik --- docs/formatdomain.html.in | 10 ++++++++++ docs/schemas/domaincommon.rng | 11 ++++++++++- src/conf/domain_conf.c | 37 ++++++++++++++++++++++++++++++++++- src/conf/domain_conf.h | 2 ++ 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index d484152934..fe7f9c559c 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1439,6 +1439,7 @@ <hidden state='on'/> </kvm> <pvspinlock/> + <gic version='2'/> </features> ... @@ -1545,6 +1546,15 @@ the emulation of VMWare IO port, for vmmouse etc. Since 1.2.16 +
gic
+
Enable for architectures using a General Interrupt + Controller instead of APIC in order to handle interrupts. + For example, the 'aarch64' architecture uses + gic instead of apic. The optional + attribute version specifies the GIC version; + however, it may not be supported by all hypervisors. Since 1.2.16 +

Time keeping

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 64d22eaf22..c151e92974 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3965,7 +3965,7 @@ @@ -4035,6 +4035,15 @@ + + + + + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fe8b8caac7..4cd36a1066 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, "pvspinlock", "capabilities", "pmu", - "vmport") + "vmport", + "gic") VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, "default", @@ -14511,6 +14512,22 @@ 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_uip(tmp, NULL, 10, &def->gic_version) < 0 || + def->gic_version == 0) { + virReportError(VIR_ERR_XML_ERROR, + _("malformed gic version: %s"), tmp); + goto error; + } + VIR_FREE(tmp); + } + def->features[val] = VIR_TRISTATE_SWITCH_ON; + ctxt->node = node; + break; + /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: break; @@ -16593,6 +16610,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++) { @@ -21232,6 +21257,16 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAddLit(buf, "\n"); break; + case VIR_DOMAIN_FEATURE_GIC: + if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { + virBufferAddLit(buf, "gic_version) + virBufferAsprintf(buf, " version='%u'", + def->gic_version); + virBufferAddLit(buf, "/>\n"); + } + 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 d2e3534b95..087d282e28 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1649,6 +1649,7 @@ typedef enum { VIR_DOMAIN_FEATURE_CAPABILITIES, VIR_DOMAIN_FEATURE_PMU, VIR_DOMAIN_FEATURE_VMPORT, + VIR_DOMAIN_FEATURE_GIC, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; @@ -2179,6 +2180,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; /* These options are of type virTristateSwitch: ON = keep, OFF = drop */ int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST];