mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 21:34:54 +03:00
cpu_riscv64.c: add update() implementation
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> Reviewed-by: Andrea Bolognani <abologna@redhat.com>
This commit is contained in:
parent
2f197ab695
commit
d4c39bad85
@ -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
|
||||
|
@ -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,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user