On Thu, Sep 04, 2025 at 17:04:49 +0800, BillXiang wrote: > From: xiangwencheng <xiangwench...@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 <xiangwench...@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>