From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Mon, 6 Apr 2020 12:16:55 +0200 Subject: [PATCH] PVE: Allow version code in machine type E.g. pc-i440fx-4.0+pve3 would print 'pve3' as version code while selecting pc-i440fx-4.0 as machine type. Version is made available as 'pve-version' in query-machines (same as, and only if 'is-current'). Signed-off-by: Stefan Reiter Signed-off-by: Thomas Lamprecht --- hw/core/machine-qmp-cmds.c | 6 ++++++ include/hw/boards.h | 2 ++ qapi/machine.json | 4 +++- softmmu/vl.c | 25 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c index 8f8d5d5276..370e66d9cc 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c @@ -102,6 +102,12 @@ MachineInfoList *qmp_query_machines(Error **errp) if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) { info->has_is_current = true; info->is_current = true; + + // PVE version string only exists for current machine + if (mc->pve_version) { + info->has_pve_version = true; + info->pve_version = g_strdup(mc->pve_version); + } } if (mc->default_cpu_type) { diff --git a/include/hw/boards.h b/include/hw/boards.h index accd6eff35..1b16728389 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -205,6 +205,8 @@ struct MachineClass { const char *desc; const char *deprecation_reason; + const char *pve_version; + void (*init)(MachineState *state); void (*reset)(MachineState *state); void (*wakeup)(MachineState *state); diff --git a/qapi/machine.json b/qapi/machine.json index cf120ac343..a6f483af4f 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -160,6 +160,8 @@ # # @default-ram-id: the default ID of initial RAM memory backend (since 5.2) # +# @pve-version: custom PVE version suffix specified as 'machine+pveN' +# # Since: 1.2 ## { 'struct': 'MachineInfo', @@ -167,7 +169,7 @@ '*is-default': 'bool', '*is-current': 'bool', 'cpu-max': 'int', 'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool', 'deprecated': 'bool', '*default-cpu-type': 'str', - '*default-ram-id': 'str' } } + '*default-ram-id': 'str', '*pve-version': 'str' } } ## # @query-machines: diff --git a/softmmu/vl.c b/softmmu/vl.c index d87cf6e103..e9d40065bc 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -1621,6 +1621,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv, static MachineClass *select_machine(QDict *qdict, Error **errp) { const char *optarg = qdict_get_try_str(qdict, "type"); + const char *pvever = qdict_get_try_str(qdict, "pvever"); GSList *machines = object_class_get_list(TYPE_MACHINE, false); MachineClass *machine_class; Error *local_err = NULL; @@ -1638,6 +1639,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp) } } + if (machine_class) { + machine_class->pve_version = g_strdup(pvever); + qdict_del(qdict, "pvever"); + } + g_slist_free(machines); if (local_err) { error_append_hint(&local_err, "Use -machine help to list supported machines\n"); @@ -3312,12 +3318,31 @@ void qemu_init(int argc, char **argv, char **envp) case QEMU_OPTION_machine: { bool help; + size_t pvever_index, name_len; + const gchar *name; + gchar *name_clean, *pvever; keyval_parse_into(machine_opts_dict, optarg, "type", &help, &error_fatal); if (help) { machine_help_func(machine_opts_dict); exit(EXIT_SUCCESS); } + + // PVE version is specified with '+' as seperator, e.g. pc-i440fx+pvever + name = qdict_get_try_str(machine_opts_dict, "type"); + if (name != NULL) { + name_len = strlen(name); + pvever_index = strcspn(name, "+"); + if (pvever_index < name_len) { + name_clean = g_strndup(name, pvever_index); + pvever = g_strndup(name + pvever_index + 1, name_len - pvever_index - 1); + qdict_put_str(machine_opts_dict, "pvever", pvever); + qdict_put_str(machine_opts_dict, "type", name_clean); + g_free(name_clean); + g_free(pvever); + } + } + break; } case QEMU_OPTION_accel: