This feature is implemented as a string that can range from "none",
"aplic" and "aplic-imsic".
If the feature isn't present in the domain XML the hypervisor default
will be used. For QEMU, at least up to 9.2, the default is "none".
Signed-off-by: Daniel Henrique Barboza <dbarboza(a)ventanamicro.com>
---
docs/formatdomain.rst | 8 +++++++
src/conf/domain_conf.c | 39 +++++++++++++++++++++++++++++++
src/conf/domain_conf.h | 11 +++++++++
src/conf/schemas/domaincommon.rng | 15 ++++++++++++
src/libvirt_private.syms | 2 ++
src/qemu/qemu_validate.c | 15 ++++++++++++
6 files changed, 90 insertions(+)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 3253a28e5a..780cea9aba 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -2028,6 +2028,7 @@ Hypervisors may allow certain CPU / machine features to be toggled
on/off.
<async-teardown enabled='yes'/>
<ras state='on'/>
<ps2 state='on'/>
+ <aia value='aplic-imsic'/>
</features>
...
@@ -2275,6 +2276,13 @@ are:
disable the emulation of a PS/2 controller used by ``ps2`` bus input devices.
If the attribute is not defined, the hypervisor default will be used.
:since:`Since 10.7.0` (QEMU only)
+``aia``
+ Configure aia (Advanced Interrupt Architecture) for RISC-V 'virt'
+ guests. Possible values for the ``value`` attribute are ``aplic`` (one
+ emulated APLIC device present per socket), ``aplic-imsic`` (one APLIC and
+ one IMSIC device present per core), or ``none`` (no support for AIA).
+ If the attribute is not defined, the hypervisor default
+ will be used. :since:`Since 10.8.0` (QEMU/KVM and RISC-V guests only)
Time keeping
------------
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6d7dee7956..1a677c47d7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -186,6 +186,7 @@ VIR_ENUM_IMPL(virDomainFeature,
"async-teardown",
"ras",
"ps2",
+ "aia",
);
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
@@ -1522,6 +1523,13 @@ VIR_ENUM_IMPL(virDomainPstoreBackend,
"acpi-erst",
);
+VIR_ENUM_IMPL(virDomainAIA,
+ VIR_DOMAIN_AIA_LAST,
+ "none",
+ "aplic",
+ "aplic-imsic",
+);
+
typedef enum {
VIR_DOMAIN_NET_VHOSTUSER_MODE_NONE,
VIR_DOMAIN_NET_VHOSTUSER_MODE_CLIENT,
@@ -17040,6 +17048,18 @@ virDomainFeaturesDefParse(virDomainDef *def,
break;
}
+ case VIR_DOMAIN_FEATURE_AIA: {
+ virDomainAIA value;
+
+ if (virXMLPropEnumDefault(nodes[i], "value",
virDomainAIATypeFromString,
+ VIR_XML_PROP_NONZERO, &value,
+ VIR_DOMAIN_AIA_NONE) < 0)
+ return -1;
+
+ def->features[val] = value;
+ break;
+ }
+
case VIR_DOMAIN_FEATURE_TCG:
if (virDomainFeaturesTCGDefParse(def, ctxt, nodes[i]) < 0)
return -1;
@@ -21007,6 +21027,17 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
}
break;
+ case VIR_DOMAIN_FEATURE_AIA:
+ if (src->features[i] != dst->features[i]) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("State of feature '%1$s' differs: source:
'%2$s=%3$s', destination: '%4$s=%5$s'"),
+ featureName,
+ "value",
virDomainAIATypeToString(src->features[i]),
+ "value",
virDomainAIATypeToString(dst->features[i]));
+ return false;
+ }
+ break;
+
case VIR_DOMAIN_FEATURE_MSRS:
case VIR_DOMAIN_FEATURE_TCG:
case VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN:
@@ -28001,6 +28032,14 @@ virDomainDefFormatFeatures(virBuffer *buf,
virTristateBoolTypeToString(def->features[i]));
break;
+ case VIR_DOMAIN_FEATURE_AIA:
+ if (def->features[i] == VIR_DOMAIN_AIA_NONE)
+ break;
+
+ virBufferAsprintf(&childBuf, "<aia
value='%s'/>\n",
+ virDomainAIATypeToString(def->features[i]));
+ break;
+
case VIR_DOMAIN_FEATURE_LAST:
break;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index a15af4fae3..3cc019eb90 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2182,6 +2182,7 @@ typedef enum {
VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN,
VIR_DOMAIN_FEATURE_RAS,
VIR_DOMAIN_FEATURE_PS2,
+ VIR_DOMAIN_FEATURE_AIA,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
@@ -2398,6 +2399,16 @@ typedef enum {
VIR_ENUM_DECL(virDomainIBS);
+typedef enum {
+ VIR_DOMAIN_AIA_NONE = 0,
+ VIR_DOMAIN_AIA_APLIC,
+ VIR_DOMAIN_AIA_APLIC_IMSIC,
+
+ VIR_DOMAIN_AIA_LAST
+} virDomainAIA;
+
+VIR_ENUM_DECL(virDomainAIA);
+
typedef struct _virDomainFeatureKVM virDomainFeatureKVM;
struct _virDomainFeatureKVM {
int features[VIR_DOMAIN_KVM_LAST];
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index efb5f00d77..203b2ca979 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -6922,6 +6922,9 @@
<ref name="featurestate"/>
</element>
</optional>
+ <optional>
+ <ref name="aia"/>
+ </optional>
</interleave>
</element>
</optional>
@@ -7220,6 +7223,18 @@
</element>
</define>
+ <define name="aia">
+ <element name="aia">
+ <attribute name="value">
+ <choice>
+ <value>none</value>
+ <value>aplic</value>
+ <value>aplic-imsic</value>
+ </choice>
+ </attribute>
+ </element>
+ </define>
+
<define name="address">
<element name="address">
<choice>
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5fb4df3513..deb4ef5ba6 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -229,6 +229,8 @@ virDiskNameParse;
virDiskNameToBusDeviceIndex;
virDiskNameToIndex;
virDomainActualNetDefFree;
+virDomainAIATypeFromString;
+virDomainAIATypeToString;
virDomainAudioDefFree;
virDomainAudioFormatTypeFromString;
virDomainAudioFormatTypeToString;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index fa23c5f973..8f44205667 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -265,6 +265,21 @@ qemuValidateDomainDefFeatures(const virDomainDef *def,
}
break;
+ case VIR_DOMAIN_FEATURE_AIA:
+ if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT &&
+ !qemuDomainIsRISCVVirt(def)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("aia feature is only supported with RISC-V Virt
machines"));
+ return -1;
+ }
+ if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_AIA)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("aia feature is not available with this QEMU
binary"));
+ return -1;
+ }
+ break;
+
case VIR_DOMAIN_FEATURE_SMM:
case VIR_DOMAIN_FEATURE_KVM:
case VIR_DOMAIN_FEATURE_XEN:
--
2.45.2