mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
virCPUUpdate check the CPU definition for features that were marked as removed in the specified CPU model and explicitly adds those that were not mentioned in the definition. So far such features were added with VIR_CPU_FEATURE_DISABLE policy, but the caller may want to use a different policy in some situations, which is now possible via the removedPolicy parameter. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
87 lines
2.3 KiB
C
87 lines
2.3 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,
|
|
virCPUFeaturePolicy removedPolicy G_GNUC_UNUSED)
|
|
{
|
|
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,
|
|
};
|