At this moment it is not possible to launch a 'riscv64' domain if a CPU
definition is presented in the domain. For example, adding this CPU
definition:
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>rv64</model>
</cpu>
Will trigger the following error:
$ sudo ./run tools/virsh start riscv-virt1
error: Failed to start domain 'riscv-virt1'
error: this function is not supported by the connection driver:
cannot update guest CPU for riscv64 architecture
The error comes from virCPUUpdate(), via qemuProcessUpdateGuestCPU(),
and it's caused by the absence of the 'update' API in the existing
RISC-V driver.
Add an 'update' API impl to the RISC-V driver to allow for CPU
definitions to be declared in RISC-V domains. This API was copied from
the ARM driver (virCPUarmUpdate()) since it's a good enough
implementation to get us going.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
---
po/POTFILES | 1 +
src/cpu/cpu_riscv64.c | 28 +++++++++++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/po/POTFILES b/po/POTFILES
index b122f02818..5d6ec195b4 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -70,6 +70,7 @@ src/cpu/cpu.c
src/cpu/cpu_arm.c
src/cpu/cpu_map.c
src/cpu/cpu_ppc64.c
+src/cpu/cpu_riscv64.c
src/cpu/cpu_s390.c
src/cpu/cpu_x86.c
src/datatypes.c
diff --git a/src/cpu/cpu_riscv64.c b/src/cpu/cpu_riscv64.c
index c44bdeb291..4cb795f849 100644
--- a/src/cpu/cpu_riscv64.c
+++ b/src/cpu/cpu_riscv64.c
@@ -46,6 +46,32 @@ virCPURiscv64ValidateFeatures(virCPUDef *cpu G_GNUC_UNUSED)
}
+static int
+virCPURiscv64Update(virCPUDef *guest,
+ const virCPUDef *host,
+ bool relative)
+{
+ g_autoptr(virCPUDef) updated = virCPUDefCopyWithoutModel(guest);
+
+ if (!relative || guest->mode != VIR_CPU_MODE_HOST_MODEL)
+ return 0;
+
+ if (!host) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("unknown host CPU model"));
+ return -1;
+ }
+
+ updated->mode = VIR_CPU_MODE_CUSTOM;
+ virCPUDefCopyModel(updated, host, true);
+
+ virCPUDefStealModel(guest, updated, false);
+ guest->mode = VIR_CPU_MODE_CUSTOM;
+ guest->match = VIR_CPU_MATCH_EXACT;
+
+ return 0;
+}
+
struct cpuArchDriver cpuDriverRiscv64 = {
.name = "riscv64",
.arch = archs,
@@ -54,6 +80,6 @@ struct cpuArchDriver cpuDriverRiscv64 = {
.decode = NULL,
.encode = NULL,
.baseline = NULL,
- .update = NULL,
+ .update = virCPURiscv64Update,
.validateFeatures = virCPURiscv64ValidateFeatures,
};
--
2.40.0
On Wed, Jan 22, 2025 at 12:16:59PM -0300, Daniel Henrique Barboza wrote: >At this moment it is not possible to launch a 'riscv64' domain if a CPU >definition is presented in the domain. For example, adding this CPU >definition: > > <cpu mode='custom' match='exact' check='none'> > <model fallback='forbid'>rv64</model> > </cpu> > >Will trigger the following error: > >$ sudo ./run tools/virsh start riscv-virt1 >error: Failed to start domain 'riscv-virt1' >error: this function is not supported by the connection driver: > cannot update guest CPU for riscv64 architecture > >The error comes from virCPUUpdate(), via qemuProcessUpdateGuestCPU(), >and it's caused by the absence of the 'update' API in the existing >RISC-V driver. > >Add an 'update' API impl to the RISC-V driver to allow for CPU >definitions to be declared in RISC-V domains. This API was copied from >the ARM driver (virCPUarmUpdate()) since it's a good enough >implementation to get us going. > >Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> I presume this patch was left formatted in your repo and accidentally sent with something like `git send-email *patch`, since it's already merged for quite some time =) Anyway, thanks to it I noticed the change in your e-mail address, so you might want to update .mailmap to your satisfaction. Martin
On 1/23/25 6:18 AM, Martin Kletzander wrote: > On Wed, Jan 22, 2025 at 12:16:59PM -0300, Daniel Henrique Barboza wrote: >> At this moment it is not possible to launch a 'riscv64' domain if a CPU >> definition is presented in the domain. For example, adding this CPU >> definition: >> >> <cpu mode='custom' match='exact' check='none'> >> <model fallback='forbid'>rv64</model> >> </cpu> >> >> Will trigger the following error: >> >> $ sudo ./run tools/virsh start riscv-virt1 >> error: Failed to start domain 'riscv-virt1' >> error: this function is not supported by the connection driver: >> cannot update guest CPU for riscv64 architecture >> >> The error comes from virCPUUpdate(), via qemuProcessUpdateGuestCPU(), >> and it's caused by the absence of the 'update' API in the existing >> RISC-V driver. >> >> Add an 'update' API impl to the RISC-V driver to allow for CPU >> definitions to be declared in RISC-V domains. This API was copied from >> the ARM driver (virCPUarmUpdate()) since it's a good enough >> implementation to get us going. >> >> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > > I presume this patch was left formatted in your repo and accidentally > sent with something like `git send-email *patch`, since it's already > merged for quite some time =) Oooops :( > > Anyway, thanks to it I noticed the change in your e-mail address, so you > might want to update .mailmap to your satisfaction. I wasn't aware of this file. I'll take a look and update as needed. Thanks, Daniel > > Martin
© 2016 - 2025 Red Hat, Inc.