
On Thu, Sep 04, 2025 at 17:04:49 +0800, BillXiang wrote:
From: xiangwencheng <xiangwencheng@lanxincomputing.com>
riscv-aia feature was introduced in qemu-8.2 to specify the KVM AIA mode. The "riscv-aia" parameter is passed along with -accel in QEMU command-line. 1) "riscv-aia=emul": IMSIC is emulated by hypervisor 2) "riscv-aia=hwaccel": use hardware guest IMSIC 3) "riscv-aia=auto": use the hardware guest IMSICs whenever available otherwise we fallback to software emulation.
This patch add the corresponding feature named 'riscv-aia'.
Signed-off-by: BillXiang <xiangwencheng@lanxincomputing.com> --- src/conf/domain_conf.c | 28 +++++++++++++++++++++++++++- src/conf/domain_conf.h | 11 +++++++++++ src/conf/schemas/domaincommon.rng | 12 ++++++++++++
For anything adding XML schema we require that test XMLs excercise it. Both for the parser and also that some bindings projects take the XMLs to excercise their XML infra.
src/libvirt_private.syms | 2 ++ src/qemu/qemu_command.c | 13 ++++++++++--- 5 files changed, 62 insertions(+), 4 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7766e302ec..a9f1161133 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -224,6 +224,14 @@ VIR_ENUM_IMPL(virDomainKVM, "poll-control", "pv-ipi", "dirty-ring", + "riscv-aia", +); + +VIR_ENUM_IMPL(virDomainKVMRiscvAIAMode, + VIR_DOMAIN_KVM_TISCV_AIA_MODE_LAST, + "auto", + "emul", + "hwaccel", );
VIR_ENUM_IMPL(virDomainXen, @@ -17183,6 +17191,15 @@ virDomainFeaturesKVMDefParse(virDomainDef *def, return -1; } } + + if (feature == VIR_DOMAIN_KVM_RISCV_AIA && + value == VIR_TRISTATE_SWITCH_ON) { + if (virXMLPropEnum(feat, "mode", + virDomainKVMRiscvAIAModeTypeFromString, + VIR_XML_PROP_REQUIRED,
[1] declared as REQUIRED here ...
+ &def->kvm_features->kvm_riscv_aia_mode) < 0)
Broken indentation.
+ return -1; + } }
def->features[VIR_DOMAIN_FEATURE_KVM] = VIR_TRISTATE_SWITCH_ON; @@ -21697,6 +21714,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src, case VIR_DOMAIN_KVM_POLLCONTROL: case VIR_DOMAIN_KVM_PVIPI: case VIR_DOMAIN_KVM_DIRTY_RING: + case VIR_DOMAIN_KVM_RISCV_AIA: if (src->kvm_features->features[i] != dst->kvm_features->features[i]) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("State of KVM feature '%1$s' differs: source: '%2$s', destination: '%3$s'"), @@ -28752,7 +28770,15 @@ virDomainDefFormatFeatures(virBuffer *buf, } } break; - + case VIR_DOMAIN_KVM_RISCV_AIA: + if (def->kvm_features->features[j] != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&childBuf, "<%s state='%s'", + virDomainKVMTypeToString(j), + virTristateSwitchTypeToString(def->kvm_features->features[j])); + virBufferAsprintf(&childBuf, " mode='%s'/>\n", + virDomainKVMRiscvAIAModeTypeToString(def->kvm_features->kvm_riscv_aia_mode));
broken indent.
+ } + break; case VIR_DOMAIN_KVM_LAST: break; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index eca820892e..0250b3db49 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2270,10 +2270,20 @@ typedef enum { VIR_DOMAIN_KVM_POLLCONTROL, VIR_DOMAIN_KVM_PVIPI, VIR_DOMAIN_KVM_DIRTY_RING, + VIR_DOMAIN_KVM_RISCV_AIA,
VIR_DOMAIN_KVM_LAST } virDomainKVM;
+typedef enum { + VIR_DOMAIN_KVM_TISCV_AIA_MODE_AUTO = 0, + VIR_DOMAIN_KVM_TISCV_AIA_MODE_EMUL, + VIR_DOMAIN_KVM_TISCV_AIA_MODE_HWACCEL, + + VIR_DOMAIN_KVM_TISCV_AIA_MODE_LAST +} virDomainKVMRiscvAIAMode; +VIR_ENUM_DECL(virDomainKVMRiscvAIAMode); + typedef enum { VIR_DOMAIN_MSRS_UNKNOWN = 0,
@@ -2476,6 +2486,7 @@ struct _virDomainFeatureKVM { int features[VIR_DOMAIN_KVM_LAST];
unsigned int dirty_ring_size; /* size of dirty ring for each vCPU, no units */ + virDomainKVMRiscvAIAMode kvm_riscv_aia_mode; };
typedef struct _virDomainFeatureTCG virDomainFeatureTCG; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index e369fb6e81..02771a6b7b 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -8192,6 +8192,18 @@ </optional> </element> </optional> + <optional> + <element name="riscv-aia"> + <ref name="featurestate"/> + <optional>
[1] but XML schema marks it as optional.
+ <attribute name="mode"> + <data type="string"> + <param name="pattern">(auto|emul|hwaccel)</param> + </data> + </attribute> + </optional> + </element> + </optional> </interleave> </element> </define>