提交 921c52b0 编写于 作者: M Michal Privoznik

Introduce GIC feature

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: NMichal Privoznik <mprivozn@redhat.com>
上级 fc3601a3
......@@ -1439,6 +1439,7 @@
&lt;hidden state='on'/&gt;
&lt;/kvm&gt;
&lt;pvspinlock/&gt;
&lt;gic version='2'/&gt;
&lt;/features&gt;
...</pre>
......@@ -1545,6 +1546,15 @@
the emulation of VMWare IO port, for vmmouse etc.
<span class="since">Since 1.2.16</span>
</dd>
<dt><code>gic</code></dt>
<dd>Enable for architectures using a General Interrupt
Controller instead of APIC in order to handle interrupts.
For example, the 'aarch64' architecture uses
<code>gic</code> instead of <code>apic</code>. The optional
attribute <code>version</code> specifies the GIC version;
however, it may not be supported by all hypervisors. <span
class="since">Since 1.2.16</span>
</dd>
</dl>
<h3><a name="elementsTime">Time keeping</a></h3>
......
......@@ -3965,7 +3965,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">
......@@ -4035,6 +4035,15 @@
</optional>
</element>
</optional>
<optional>
<element name="gic">
<optional>
<attribute name="version">
<ref name="positiveInteger"/>
</attribute>
</optional>
</element>
</optional>
</interleave>
</element>
</optional>
......
......@@ -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, "</capabilities>\n");
break;
case VIR_DOMAIN_FEATURE_GIC:
if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
virBufferAddLit(buf, "<gic");
if (def->gic_version)
virBufferAsprintf(buf, " version='%u'",
def->gic_version);
virBufferAddLit(buf, "/>\n");
}
break;
/* coverity[dead_error_begin] */
case VIR_DOMAIN_FEATURE_LAST:
break;
......
......@@ -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];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册