Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37715272
en ru br
ALT Linux repos
S:7.2.0-alt3

Group :: Emulators
RPM: pve-qemu

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: 0024-PVE-Allow-version-code-in-machine-type.patch
Download


From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
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 <s.reiter@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
---
 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:
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin