From 4eebaa4ca3b99e069453c24e6ccfafd17b8d1059 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Tue, 15 May 2018 22:03:19 +0200 Subject: [PATCH] qemu_capabilities: Introduce virQEMUCapsGetCPUFeatures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The function creates a list of all (or migratable only) CPU features supported by QEMU. It works by looking at the CPU model info returned by query-cpu-model-expansion QMP command. Signed-off-by: Jiri Denemark Reviewed-by: Ján Tomko Reviewed-by: Collin Walling --- src/qemu/qemu_capabilities.c | 52 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_capabilities.h | 4 +++ 2 files changed, 56 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index f1771522e5..4f2aa666a7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2375,6 +2375,58 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps, return ret; } + +/** + * Get NULL terminated list of features supported by QEMU. + * + * Returns -1 on error, + * 0 on success (@features will be NULL if QEMU does not support this), + * 1 when @features is filled in, but migratability info is not available. + */ +int +virQEMUCapsGetCPUFeatures(virQEMUCapsPtr qemuCaps, + virDomainVirtType virtType, + bool migratable, + char ***features) +{ + virQEMUCapsHostCPUDataPtr data; + char **list; + size_t i; + size_t n; + int ret = -1; + + *features = NULL; + data = virQEMUCapsGetHostCPUData(qemuCaps, virtType); + + if (!data->info) + return 0; + + if (VIR_ALLOC_N(list, data->info->nprops + 1) < 0) + return -1; + + n = 0; + for (i = 0; i < data->info->nprops; i++) { + qemuMonitorCPUPropertyPtr prop = data->info->props + i; + + if (migratable && prop->migratable == VIR_TRISTATE_BOOL_NO) + continue; + + if (VIR_STRDUP(list[n++], prop->name) < 0) + goto cleanup; + } + + VIR_STEAL_PTR(*features, list); + if (migratable && !data->info->migratability) + ret = 1; + else + ret = 0; + + cleanup: + virStringListFree(list); + return ret; +} + + struct tpmTypeToCaps { int type; virQEMUCapsFlags caps; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index fa4d241d7b..a624d4da30 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -533,6 +533,10 @@ typedef enum { virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps, virDomainVirtType type, virQEMUCapsHostCPUType cpuType); +int virQEMUCapsGetCPUFeatures(virQEMUCapsPtr qemuCaps, + virDomainVirtType virtType, + bool migratable, + char ***features); bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, virCapsPtr caps,