From 7d629e6c0991925e1d8a70d9ec80dd1f106bb190 Mon Sep 17 00:00:00 2001 From: Daniel Henrique Barboza Date: Wed, 23 Oct 2024 14:54:33 -0300 Subject: [PATCH 1/3] qemu: add capability for RISC-V AIA feature 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 --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 1 + 3 files changed, 4 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c21f0e55dc..c69625e49b 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -698,6 +698,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 450 */ "run-with.async-teardown", /* QEMU_CAPS_RUN_WITH_ASYNC_TEARDOWN */ "virtio-blk-vhost-vdpa", /* QEMU_CAPS_DEVICE_VIRTIO_BLK_VHOST_VDPA */ + "machine.virt.aia", /* QEMU_CAPS_MACHINE_VIRT_AIA */ ); @@ -1721,6 +1722,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 3c4f7f625b..e6d4aef2a7 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -677,6 +677,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 450 */ QEMU_CAPS_RUN_WITH_ASYNC_TEARDOWN, /* asynchronous teardown -run-with async-teardown=on|off */ QEMU_CAPS_DEVICE_VIRTIO_BLK_VHOST_VDPA, /* virtio-blk-vhost-vdpa block driver */ + 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 31300d3d31..13f85eb447 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml @@ -138,6 +138,7 @@ + 7002050 0 v7.2.0-333-g222059a0fc -- Gitee From 4d94d0bcea1235ede672b9cdae5f139a909ebf8c Mon Sep 17 00:00:00 2001 From: Daniel Henrique Barboza Date: Wed, 23 Oct 2024 17:40:58 -0300 Subject: [PATCH 2/3] conf,qemu: implement RISC-V 'aia' virt domain feature 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 --- 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 | 15 +++++++++++ 6 files changed, 93 insertions(+) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 310d2bc427..c5c069e6df 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2014,6 +2014,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off. 128 + ... @@ -2248,6 +2249,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 dd0cb9d548..dd0a8d87a1 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, @@ -1516,6 +1517,14 @@ VIR_ENUM_IMPL(virDomainLaunchSecurity, "s390-pv", ); +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, @@ -16744,6 +16753,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; @@ -20734,6 +20756,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: @@ -27565,6 +27598,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 6681eb37b4..fbc224e1ee 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2148,6 +2148,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; @@ -2362,6 +2363,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 b98a2ae602..8d2213416f 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6769,6 +6769,9 @@ + + + @@ -7067,6 +7070,18 @@ + + + + + none + aplic + aplic-imsic + + + + + diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 553b01b8c0..9aade3b31d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -226,6 +226,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 d32b20a423..1c6b4aa1c1 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -226,6 +226,21 @@ 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; + } + case VIR_DOMAIN_FEATURE_SMM: case VIR_DOMAIN_FEATURE_KVM: case VIR_DOMAIN_FEATURE_XEN: -- Gitee From 0bef54ffc1a7f1ab258722228f78f7a19e38f531 Mon Sep 17 00:00:00 2001 From: Daniel Henrique Barboza Date: Wed, 23 Oct 2024 18:27:42 -0300 Subject: [PATCH 3/3] qemu: add RISC-V 'aia' command line 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 --- 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 579774a8c0..8360cdb52f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6822,6 +6822,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 68e2ef3bf6..67a2823317 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2384,6 +2384,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 49722322ac..f48ca7c269 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -950,6 +950,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