From 779e2d259d356ee062125fea1d620bcb406c1ecf Mon Sep 17 00:00:00 2001 From: yechao-w Date: Tue, 2 Sep 2025 16:32:54 +0800 Subject: [PATCH 1/3] qemu: add capability for RISC-V AIA feature commit 34d7f53d1b7b17c3849359e7af3bd6005e84fef2 upstream AIA (Advanced Interrupt Architecture) support was introduced in QEMU 7.0 for the 'virt' machine type. It allows the guest to choose from a more modern interrupt model than the default (CLINT - Core Logical Interrupt Controller). Signed-off-by: Daniel Henrique Barboza Reviewed-by: Martin Kletzander Reviewed-by: Andrea Bolognani Signed-off-by: yechao-w --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 1 + 3 files changed, 8 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 90fb603adf..d2f7a87b19 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -701,6 +701,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "smp-clusters", /* QEMU_CAPS_SMP_CLUSTERS */ "tmm-guest", /* QEMU_CAPS_VIRTCCA */ "rme-guest", /* QEMU_CAPS_CCA_GUEST */ + + /* 455 */ + "machine.virt.aia", /* QEMU_CAPS_MACHINE_VIRT_AIA */ ); @@ -1731,6 +1734,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsMachinePropsPSeries[] = { static struct virQEMUCapsStringFlags virQEMUCapsMachinePropsVirt[] = { { "iommu", QEMU_CAPS_MACHINE_VIRT_IOMMU }, + { "aia", QEMU_CAPS_MACHINE_VIRT_AIA }, }; static struct virQEMUCapsStringFlags virQEMUCapsMachinePropsGeneric[] = { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index e4a97bc491..b5f75edd18 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -681,6 +681,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_VIRTCCA, /* tmm-guest */ QEMU_CAPS_CCA_GUEST, /* -object rme-guest */ + /* 455 */ + QEMU_CAPS_MACHINE_VIRT_AIA, /* -machine virt,aia=(none|aplic|aplic-imsic), RISC-V only */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml index 3f2acb5018..2c909f5e0c 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml @@ -139,6 +139,7 @@ + 7002050 0 v7.2.0-333-g222059a0fc -- Gitee From e205657363be651c36d2d83a2104e3d99aaaaacd Mon Sep 17 00:00:00 2001 From: yechao-w Date: Tue, 2 Sep 2025 17:04:27 +0800 Subject: [PATCH 2/3] conf,qemu: implement RISC-V 'aia' virt domain feature commit 817eabd0ccc10f83d8d7af739e2c38fb9e668fc0 upstream 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 Reviewed-by: Martin Kletzander Reviewed-by: Andrea Bolognani Signed-off-by: yechao-w --- docs/formatdomain.rst | 8 ++++++ src/conf/domain_conf.c | 41 +++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 12 +++++++++ src/conf/schemas/domaincommon.rng | 15 +++++++++++ src/libvirt_private.syms | 2 ++ src/qemu/qemu_validate.c | 16 ++++++++++++ 6 files changed, 94 insertions(+) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 56d94bb1ba..c002505e12 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2020,6 +2020,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off. 128 + ... @@ -2254,6 +2255,13 @@ are: Depending on the ``enabled`` attribute (values ``yes``, ``no``) enable or disable QEMU asynchronous teardown to improve memory reclaiming on a guest. :since:`Since 9.6.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 11.1.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 e30ec0dca4..ee001dc4a1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -184,6 +184,7 @@ VIR_ENUM_IMPL(virDomainFeature, "ibs", "tcg", "async-teardown", + "aia", ); VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, @@ -1520,6 +1521,14 @@ VIR_ENUM_IMPL(virDomainLaunchSecurity, "cca", ); +VIR_ENUM_IMPL(virDomainAIA, + VIR_DOMAIN_AIA_LAST, + "default", + "none", + "aplic", + "aplic-imsic", +); + typedef enum { VIR_DOMAIN_NET_VHOSTUSER_MODE_NONE, VIR_DOMAIN_NET_VHOSTUSER_MODE_CLIENT, @@ -16873,6 +16882,19 @@ 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_DEFAULT) < 0) + return -1; + + def->features[val] = value; + break; + + } + case VIR_DOMAIN_FEATURE_TCG: if (virDomainFeaturesTCGDefParse(def, ctxt, nodes[i]) < 0) return -1; @@ -20945,6 +20967,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: @@ -27830,6 +27863,14 @@ virDomainDefFormatFeatures(virBuffer *buf, virTristateBoolTypeToString(def->features[i])); break; + case VIR_DOMAIN_FEATURE_AIA: + if (def->features[i] == VIR_DOMAIN_AIA_DEFAULT) + break; + + virBufferAsprintf(&childBuf, "\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 cadca33246..2c1efd5fa2 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2162,6 +2162,7 @@ typedef enum { VIR_DOMAIN_FEATURE_IBS, VIR_DOMAIN_FEATURE_TCG, VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN, + VIR_DOMAIN_FEATURE_AIA, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; @@ -2376,6 +2377,17 @@ typedef enum { VIR_ENUM_DECL(virDomainIBS); +typedef enum { + VIR_DOMAIN_AIA_DEFAULT = 0, + VIR_DOMAIN_AIA_NONE, + 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 78773f744b..93892740f0 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6820,6 +6820,9 @@ + + + @@ -7118,6 +7121,18 @@ + + + + + none + aplic + aplic-imsic + + + + + diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4cd5f0b2f3..7219196188 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -228,6 +228,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 e3ed00d9b0..ca2c97ddde 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -226,6 +226,22 @@ qemuValidateDomainDefFeatures(const virDomainDef *def, } break; + case VIR_DOMAIN_FEATURE_AIA: + if (def->features[i] != VIR_DOMAIN_AIA_DEFAULT && + !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_DOMAIN_AIA_DEFAULT && + !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: -- Gitee From 3cbb78380a86140c1a2fbbe50322fd87b015156e Mon Sep 17 00:00:00 2001 From: yechao-w Date: Tue, 2 Sep 2025 17:27:59 +0800 Subject: [PATCH 3/3] qemu: add RISC-V 'aia' command line commit 5624489251ab37f5f2aa5796457e032be631ef66 upstream The 'aia' feature is added as a machine type option for the 'virt' RISC-V machine, e.g. "-machine virt,aia=". Signed-off-by: Daniel Henrique Barboza Reviewed-by: Martin Kletzander Reviewed-by: Andrea Bolognani Signed-off-by: yechao-w --- src/qemu/qemu_command.c | 5 ++++ ...cv64-virt-features-aia.riscv64-latest.args | 30 +++++++++++++++++++ .../riscv64-virt-features-aia.xml | 24 +++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ ...scv64-virt-features-aia.riscv64-latest.xml | 24 +++++++++++++++ tests/qemuxml2xmltest.c | 2 ++ 6 files changed, 87 insertions(+) create mode 100644 tests/qemuxml2argvdata/riscv64-virt-features-aia.riscv64-latest.args create mode 100644 tests/qemuxml2argvdata/riscv64-virt-features-aia.xml create mode 100644 tests/qemuxml2xmloutdata/riscv64-virt-features-aia.riscv64-latest.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cc8ecfa9fb..cc3489784f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6885,6 +6885,11 @@ qemuAppendDomainFeaturesMachineParam(virBuffer *buf, virBufferAsprintf(buf, ",cap-ibs=%s", str); } + if (def->features[VIR_DOMAIN_FEATURE_AIA] != VIR_DOMAIN_AIA_DEFAULT) { + const char *str = virDomainAIATypeToString(def->features[VIR_DOMAIN_FEATURE_AIA]); + virBufferAsprintf(buf, ",aia=%s", str); + } + return 0; } diff --git a/tests/qemuxml2argvdata/riscv64-virt-features-aia.riscv64-latest.args b/tests/qemuxml2argvdata/riscv64-virt-features-aia.riscv64-latest.args new file mode 100644 index 0000000000..61f92d475a --- /dev/null +++ b/tests/qemuxml2argvdata/riscv64-virt-features-aia.riscv64-latest.args @@ -0,0 +1,30 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \ +/usr/bin/qemu-system-riscv64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \ +-machine virt,usb=off,aia=none,dump-guest-core=off,memory-backend=riscv_virt_board.ram \ +-accel tcg \ +-m size=4194304k \ +-object '{"qom-type":"memory-backend-ram","id":"riscv_virt_board.ram","size":4294967296}' \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/riscv64-virt-features-aia.xml b/tests/qemuxml2argvdata/riscv64-virt-features-aia.xml new file mode 100644 index 0000000000..2303f937c2 --- /dev/null +++ b/tests/qemuxml2argvdata/riscv64-virt-features-aia.xml @@ -0,0 +1,24 @@ + + guest + 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 + 4194304 + 4194304 + 4 + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-riscv64 + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b2ea2191dc..0cdc9beb3e 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2381,6 +2381,8 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64"); DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-features", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("riscv64-virt-features-aia", "riscv64"); + DO_TEST_CAPS_LATEST("virtio-9p-multidevs"); DO_TEST_CAPS_LATEST("virtio-9p-createmode"); diff --git a/tests/qemuxml2xmloutdata/riscv64-virt-features-aia.riscv64-latest.xml b/tests/qemuxml2xmloutdata/riscv64-virt-features-aia.riscv64-latest.xml new file mode 100644 index 0000000000..2303f937c2 --- /dev/null +++ b/tests/qemuxml2xmloutdata/riscv64-virt-features-aia.riscv64-latest.xml @@ -0,0 +1,24 @@ + + guest + 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 + 4194304 + 4194304 + 4 + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-riscv64 + + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 1010b68ebc..9b2d1a6736 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -947,6 +947,8 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64"); DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-features", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("riscv64-virt-features-aia", "riscv64"); + DO_TEST_CAPS_LATEST("virtio-9p-multidevs"); DO_TEST_CAPS_LATEST("virtio-9p-createmode"); DO_TEST_CAPS_LATEST("downscript"); -- Gitee