From nobody Sun Sep 7 23:55:12 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1755526557434680.2492870204285; Mon, 18 Aug 2025 07:15:57 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5BC6DA4E; Mon, 18 Aug 2025 10:15:56 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 19CFACE3; Mon, 18 Aug 2025 10:12:19 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 114AFA1F; Fri, 15 Aug 2025 08:41:35 -0400 (EDT) Received: from mx1.osci.io (polly.osci.io [8.43.85.229]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 06A179D1 for ; Fri, 15 Aug 2025 08:41:30 -0400 (EDT) Received: by mx1.osci.io (Postfix, from userid 995) id AFAA327E9A; Fri, 15 Aug 2025 08:41:30 -0400 (EDT) Received: from mx2.osci.io (francine.osci.io [8.43.85.230]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mx1.osci.io (Postfix) with ESMTPS id 4719E27E96 for ; Fri, 15 Aug 2025 08:41:29 -0400 (EDT) Received: by mx2.osci.io (Postfix, from userid 995) id 2DFD63FEBB; Fri, 15 Aug 2025 08:41:28 -0400 (EDT) Received: from sg-1-23.ptr.blmpb.com (sg-1-23.ptr.blmpb.com [118.26.132.23]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mx2.osci.io (Postfix) with ESMTPS id AB07C3FEBB for ; Fri, 15 Aug 2025 08:41:23 -0400 (EDT) Received: from localhost.localdomain ([222.128.9.250]) by smtp.feishu.cn with ESMTP; Fri, 15 Aug 2025 19:45:08 +0800 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 X-Greylist: delayed 913 seconds by postgrey-1.37 at francine.osci.io; Fri, 15 Aug 2025 08:41:23 EDT DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=s1; d=lanxincomputing-com.20200927.dkim.feishu.cn; t=1755258310; h=from:subject:mime-version:from:date:message-id:subject:to:cc: reply-to:content-type:mime-version:in-reply-to:message-id; bh=Q6SQ6Rn99pgJvfrDYgSsxqS7bp6j9mz+4ecFkn8gq0Y=; b=yxOuMnB9l74KpRNDBOZ/Fj98PMkbmmzliwdkifYxurl0TjYQUo6EGbaGFlgt7vGIgwPwTo Vfp5Ji5ESU0IxjxVErmYlmQ12tc7bDBHOx+i5z4HUwR1e8F/Snw+3UOYMcHAEEgscW/u88 7y24YzFWfR6vI6EfuI8HL3ib1hXF2BPrmpQe6qHRn9vo4BH8zjVK10giecSjT/+AH4i07U Oo6I6gNTP0joZlsMC8OZnbZpSmJ/O3YY4XHucN0ILWCPvWHqXY2Brfpwh7no76Pk9fiBIV Zk+MScAToqbq3u3d2UlvxrKp12bbttBsw1+sWnPPHThN9kG8lQScIHrHafl3XA== Date: Fri, 15 Aug 2025 19:44:15 +0800 From: "BillXiang" Content-Transfer-Encoding: quoted-printable X-Original-From: BillXiang X-Lms-Return-Path: X-Mailer: git-send-email 2.46.2.windows.1 To: Subject: [PATCH] qemu: support riscv-aia feature for RISC-V KVM Message-Id: <20250815114450.850-1-xiangwencheng@lanxincomputing.com> Mime-Version: 1.0 X-MailFrom: SRS0=z2rC=23=lanxincomputing.com=xiangwencheng@osci.io X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 Message-ID-Hash: XBDTP6C5T2RIVHGEI3X7WTDMHSXZMGKL X-Message-ID-Hash: XBDTP6C5T2RIVHGEI3X7WTDMHSXZMGKL X-Mailman-Approved-At: Mon, 18 Aug 2025 14:12:10 -0400 CC: BillXiang X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1755526559265116600 Content-Type: text/plain; charset="utf-8" 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=3Demul": IMSIC is emulated by hypervisor 2) "riscv-aia=3Dhwaccel": use hardware guest IMSIC 3) "riscv-aia=3Dauto": 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 --- NEWS.rst | 10 ++++++++ docs/formatdomain.rst | 2 ++ src/conf/domain_conf.c | 29 ++++++++++++++++++++++ src/conf/domain_conf.h | 2 ++ src/conf/schemas/domaincommon.rng | 12 +++++++++ src/qemu/qemu_command.c | 13 +++++++--- tests/qemuxmlconfdata/kvm-features-off.xml | 1 + tests/qemuxmlconfdata/kvm-features.xml | 1 + 8 files changed, 67 insertions(+), 3 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 435760e797..7e91f81d64 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,16 @@ v11.7.0 (unreleased) =20 * **New features** =20 + * Support riscv-aia feature for RISC-V KVM + + 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=3Demul": IMSIC is emulated by hypervisor + 2) "riscv-aia=3Dhwaccel": use hardware guest IMSIC + 3) "riscv-aia=3Dauto": use the hardware guest IMSICs whenever available + otherwise we fallback to software emulation. + * **Improvements** =20 * **Bug fixes** diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 9f7311b6d5..2ccbb1bfb9 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2085,6 +2085,7 @@ Hypervisors may allow certain CPU / machine features = to be toggled on/off. + @@ -2206,6 +2207,7 @@ are: poll-control Decrease IO completion latency by introducing a grace pe= riod of busy waiting on, off = :since:`6.10.0 (QEMU 4.2)` pv-ipi Paravirtualized send IPIs = on, off = :since:`7.10.0 (QEMU 3.1)` dirty-ring Enable dirty ring feature = on, off; size - must be power of 2, range [1024,65536]= :since:`8.0.0 (QEMU 6.1)` + riscv-aia Set riscv KVM AIA mode. Defaults to 'auto'. = on, off; mode - optional string emul, hwaccel or auto = :since:`11.7.0 (QEMU 8.2)` =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D =20 ``xen`` diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7766e302ec..8ed65d1794 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -224,6 +224,7 @@ VIR_ENUM_IMPL(virDomainKVM, "poll-control", "pv-ipi", "dirty-ring", + "riscv-aia", ); =20 VIR_ENUM_IMPL(virDomainXen, @@ -17183,6 +17184,20 @@ virDomainFeaturesKVMDefParse(virDomainDef *def, return -1; } } + + if (feature =3D=3D VIR_DOMAIN_KVM_RISCV_AIA && + value =3D=3D VIR_TRISTATE_SWITCH_ON) { + def->kvm_features->riscv_aia_mode =3D virXMLPropString(feat, "= mode"); + + if (strcmp(def->kvm_features->riscv_aia_mode, "emul") && + strcmp(def->kvm_features->riscv_aia_mode, "hwaccel") && + strcmp(def->kvm_features->riscv_aia_mode, "auto")) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("riscv aia must be emul, hwaccel or auto"= )); + + return -1; + } + } } =20 def->features[VIR_DOMAIN_FEATURE_KVM] =3D VIR_TRISTATE_SWITCH_ON; @@ -21697,6 +21712,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] !=3D dst->kvm_features-= >features[i]) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("State of KVM feature '%1$s' differs:= source: '%2$s', destination: '%3$s'"), @@ -28752,6 +28768,19 @@ virDomainDefFormatFeatures(virBuffer *buf, } } break; + case VIR_DOMAIN_KVM_RISCV_AIA: + if (def->kvm_features->features[j] !=3D VIR_TRISTATE_S= WITCH_ABSENT) { + virBufferAsprintf(&childBuf, "<%s state=3D'%s'", + virDomainKVMTypeToString(j), + virTristateSwitchTypeToString(de= f->kvm_features->features[j])); + if (def->kvm_features->riscv_aia_mode !=3D NULL) { + virBufferAsprintf(&childBuf, " mode=3D'%s'/>\n= ", + def->kvm_features->riscv_aia= _mode); + } else { + virBufferAddLit(&childBuf, "/>\n"); + } + } + break; =20 case VIR_DOMAIN_KVM_LAST: break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index eca820892e..0d749c0f3c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2270,6 +2270,7 @@ typedef enum { VIR_DOMAIN_KVM_POLLCONTROL, VIR_DOMAIN_KVM_PVIPI, VIR_DOMAIN_KVM_DIRTY_RING, + VIR_DOMAIN_KVM_RISCV_AIA, =20 VIR_DOMAIN_KVM_LAST } virDomainKVM; @@ -2476,6 +2477,7 @@ struct _virDomainFeatureKVM { int features[VIR_DOMAIN_KVM_LAST]; =20 unsigned int dirty_ring_size; /* size of dirty ring for each vCPU, no = units */ + char *riscv_aia_mode; }; =20 typedef struct _virDomainFeatureTCG virDomainFeatureTCG; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index e369fb6e81..3de5807b1e 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -8192,6 +8192,18 @@ + + + + + + + (emul|hwaccel|auto) + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e8de386f30..6db283ef29 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6679,6 +6679,9 @@ qemuBuildCpuCommandLine(virCommand *cmd, =20 case VIR_DOMAIN_KVM_DIRTY_RING: break; + =20 + case VIR_DOMAIN_KVM_RISCV_AIA: + break; =20 case VIR_DOMAIN_KVM_LAST: break; @@ -7314,9 +7317,13 @@ qemuBuildAccelCommandLine(virCommand *cmd, * not that either kvm or tcg can be specified by libvirt * so do not worry about the conflict of specifying both * */ - if (def->features[VIR_DOMAIN_FEATURE_KVM] =3D=3D VIR_TRISTATE_SWIT= CH_ON && - def->kvm_features->features[VIR_DOMAIN_KVM_DIRTY_RING] =3D=3D = VIR_TRISTATE_SWITCH_ON) { - virBufferAsprintf(&buf, ",dirty-ring-size=3D%d", def->kvm_feat= ures->dirty_ring_size); + if (def->features[VIR_DOMAIN_FEATURE_KVM] =3D=3D VIR_TRISTATE_SWIT= CH_ON) { + if (def->kvm_features->features[VIR_DOMAIN_KVM_DIRTY_RING] =3D= =3D VIR_TRISTATE_SWITCH_ON) { + virBufferAsprintf(&buf, ",dirty-ring-size=3D%d", def->kvm_= features->dirty_ring_size); + } + if (def->kvm_features->features[VIR_DOMAIN_KVM_RISCV_AIA] =3D= =3D VIR_TRISTATE_SWITCH_ON) { + virBufferAsprintf(&buf, ",riscv-aia=3D%s", def->kvm_featur= es->riscv_aia_mode); + } } break; =20 diff --git a/tests/qemuxmlconfdata/kvm-features-off.xml b/tests/qemuxmlconf= data/kvm-features-off.xml index 3cd4ff18f2..2340a93ce5 100644 --- a/tests/qemuxmlconfdata/kvm-features-off.xml +++ b/tests/qemuxmlconfdata/kvm-features-off.xml @@ -16,6 +16,7 @@ + diff --git a/tests/qemuxmlconfdata/kvm-features.xml b/tests/qemuxmlconfdata= /kvm-features.xml index 78091064b1..c06b0aa58b 100644 --- a/tests/qemuxmlconfdata/kvm-features.xml +++ b/tests/qemuxmlconfdata/kvm-features.xml @@ -16,6 +16,7 @@ + --=20 2.46.2.windows.1