mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-20 06:31:28 +00:00
d4c39bad85
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>
86 lines
2.2 KiB
C
86 lines
2.2 KiB
C
/*
|
|
* cpu_riscv64.c: CPU driver for riscv64 CPUs
|
|
*
|
|
* Copyright (C) 2023, Ventana Micro
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "cpu.h"
|
|
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_CPU
|
|
|
|
static const virArch archs[] = { VIR_ARCH_RISCV64 };
|
|
|
|
static virCPUCompareResult
|
|
virCPURiscv64Compare(virCPUDef *host G_GNUC_UNUSED,
|
|
virCPUDef *cpu G_GNUC_UNUSED,
|
|
bool failMessages G_GNUC_UNUSED)
|
|
{
|
|
/*
|
|
* For now QEMU will perform all runtime checks.
|
|
*/
|
|
return VIR_CPU_COMPARE_IDENTICAL;
|
|
}
|
|
|
|
|
|
static int
|
|
virCPURiscv64ValidateFeatures(virCPUDef *cpu G_GNUC_UNUSED)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
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,
|
|
.narch = G_N_ELEMENTS(archs),
|
|
.compare = virCPURiscv64Compare,
|
|
.decode = NULL,
|
|
.encode = NULL,
|
|
.baseline = NULL,
|
|
.update = virCPURiscv64Update,
|
|
.validateFeatures = virCPURiscv64ValidateFeatures,
|
|
};
|