qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/1 v5] Allow machines to configure the QEMU_VER


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 1/1 v5] Allow machines to configure the QEMU_VERSION that's exposed via hardware
Date: Wed, 20 Jun 2012 08:07:36 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120329 Thunderbird/11.0.1

On 05/29/2012 10:35 PM, Crístian Viana wrote:
QEMU exposes its version to the guest's hardware and in some cases that is wrong
(e.g. Windows prints messages about driver updates when you switch
the QEMU version).
There is a new field now on the struct QEmuMachine, hw_version, which may
contain the version that the specific machine should report. If that field is
set, then that machine will report that version to the guest.

Signed-off-by: Crístian Viana<address@hidden>

Applied.  Thanks.

Regards,

Anthony Liguori

---

Changes since v4:
- Rewrite commit message
- Replace snprintf calls by pstrcpy/pstrcat.

  hw/boards.h                   |    1 +
  hw/bt-sdp.c                   |    6 +++---
  hw/ide/core.c                 |    2 +-
  hw/nseries.c                  |    3 ++-
  hw/pc_piix.c                  |   11 +++++++++--
  hw/scsi-bus.c                 |    2 +-
  hw/scsi-disk.c                |    2 +-
  hw/usb/dev-bluetooth.c        |    2 +-
  hw/usb/dev-hid.c              |    2 +-
  hw/usb/dev-hub.c              |    2 +-
  hw/usb/dev-serial.c           |    2 +-
  hw/usb/dev-smartcard-reader.c |    4 ++--
  hw/usb/dev-storage.c          |    2 +-
  hw/usb/dev-wacom.c            |    2 +-
  hw/usb/redirect.c             |    8 +++++---
  osdep.c                       |   11 +++++++++++
  osdep.h                       |    3 +++
  target-i386/cpu.c             |   18 +++++++++++++-----
  vl.c                          |    4 ++++
  19 files changed, 62 insertions(+), 25 deletions(-)

diff --git a/hw/boards.h b/hw/boards.h
index 667177d..59c01d0 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -29,6 +29,7 @@ typedef struct QEMUMachine {
      const char *default_machine_opts;
      GlobalProperty *compat_props;
      struct QEMUMachine *next;
+    const char *hw_version;
  } QEMUMachine;

  int qemu_register_machine(QEMUMachine *m);
diff --git a/hw/bt-sdp.c b/hw/bt-sdp.c
index 3e390ab..c0431d1 100644
--- a/hw/bt-sdp.c
+++ b/hw/bt-sdp.c
@@ -834,7 +834,7 @@ SERVICE(hid,
      ATTRIBUTE(DOC_URL,         URL("http://bellard.org/qemu/user-doc.html";))
      ATTRIBUTE(SVCNAME_PRIMARY, STRING("QEMU Bluetooth HID"))
      ATTRIBUTE(SVCDESC_PRIMARY, STRING("QEMU Keyboard/Mouse"))
-    ATTRIBUTE(SVCPROV_PRIMARY, STRING("QEMU " QEMU_VERSION))
+    ATTRIBUTE(SVCPROV_PRIMARY, STRING("QEMU"))

      /* Profile specific */
      ATTRIBUTE(DEVICE_RELEASE_NUMBER,  UINT16(0x0091)) /* Deprecated, remove */
@@ -908,7 +908,7 @@ SERVICE(sdp,
          LIST(UUID128(SDP_SERVER_PROFILE_ID) UINT16(0x0100))
      ))
      ATTRIBUTE(DOC_URL,         URL("http://bellard.org/qemu/user-doc.html";))
-    ATTRIBUTE(SVCPROV_PRIMARY, STRING("QEMU " QEMU_VERSION))
+    ATTRIBUTE(SVCPROV_PRIMARY, STRING("QEMU"))

      /* Profile specific */
      ATTRIBUTE(VERSION_NUM_LIST, LIST(UINT16(0x0100)))
@@ -931,7 +931,7 @@ SERVICE(pnp,
          LIST(UUID128(PNP_INFO_PROFILE_ID) UINT16(0x0100))
      ))
      ATTRIBUTE(DOC_URL,         URL("http://bellard.org/qemu/user-doc.html";))
-    ATTRIBUTE(SVCPROV_PRIMARY, STRING("QEMU " QEMU_VERSION))
+    ATTRIBUTE(SVCPROV_PRIMARY, STRING("QEMU"))

      /* Profile specific */
      ATTRIBUTE(SPECIFICATION_ID, UINT16(0x0100))
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 9785d5f..c6de8a2 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1983,7 +1983,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, 
IDEDriveKind kind,
      if (version) {
          pstrcpy(s->version, sizeof(s->version), version);
      } else {
-        pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
+        pstrcpy(s->version, sizeof(s->version), qemu_get_version());
      }

      ide_reset(s);
diff --git a/hw/nseries.c b/hw/nseries.c
index a5cfa8c..b70aa40 100644
--- a/hw/nseries.c
+++ b/hw/nseries.c
@@ -1247,7 +1247,8 @@ static int n8x0_atag_setup(void *p, int model)
      stw_raw(w ++, 24);                                /* u16 len */
      strcpy((void *) w, "hw-build");         /* char component[12] */
      w += 6;
-    strcpy((void *) w, "QEMU " QEMU_VERSION);        /* char version[12] */
+    strcpy((void *) w, "QEMU ");
+    pstrcat((void *) w, 12, qemu_get_version()); /* char version[12] */
      w += 6;

      tag = (model == 810) ? "1.1.10-qemu" : "1.1.6-qemu";
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index a7aad4b..67aa10d 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -392,6 +392,7 @@ static QEMUMachine pc_machine_v1_0 = {
          PC_COMPAT_1_0,
          { /* end of list */ }
      },
+    .hw_version = "1.0",
  };

  #define PC_COMPAT_0_15 \
@@ -406,6 +407,7 @@ static QEMUMachine pc_machine_v0_15 = {
          PC_COMPAT_0_15,
          { /* end of list */ }
      },
+    .hw_version = "0.15",
  };

  #define PC_COMPAT_0_14 \
@@ -446,6 +448,7 @@ static QEMUMachine pc_machine_v0_14 = {
          },
          { /* end of list */ }
      },
+    .hw_version = "0.14",
  };

  #define PC_COMPAT_0_13 \
@@ -482,6 +485,7 @@ static QEMUMachine pc_machine_v0_13 = {
          },
          { /* end of list */ }
      },
+    .hw_version = "0.13",
  };

  #define PC_COMPAT_0_12 \
@@ -513,7 +517,8 @@ static QEMUMachine pc_machine_v0_12 = {
              .value    = stringify(0),
          },
          { /* end of list */ }
-    }
+    },
+    .hw_version = "0.12",
  };

  #define PC_COMPAT_0_11 \
@@ -545,7 +550,8 @@ static QEMUMachine pc_machine_v0_11 = {
              .value    = "0.11",
          },
          { /* end of list */ }
-    }
+    },
+    .hw_version = "0.11",
  };

  static QEMUMachine pc_machine_v0_10 = {
@@ -578,6 +584,7 @@ static QEMUMachine pc_machine_v0_10 = {
          },
          { /* end of list */ }
      },
+    .hw_version = "0.10",
  };

  static QEMUMachine isapc_machine = {
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index f10f3ec..688f6ac 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -406,7 +406,7 @@ static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
          r->buf[7] = 0x10 | (r->req.bus->info->tcq ? 0x02 : 0); /* Sync, TCQ.  
*/
          memcpy(&r->buf[8], "QEMU    ", 8);
          memcpy(&r->buf[16], "QEMU TARGET     ", 16);
-        strncpy((char *)&r->buf[32], QEMU_VERSION, 4);
+        pstrcpy((char *)&r->buf[32], 4, qemu_get_version());
      }
      return true;
  }
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 045c764..19bc4ac 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1704,7 +1704,7 @@ static int scsi_initfn(SCSIDevice *dev)
      }

      if (!s->version) {
-        s->version = g_strdup(QEMU_VERSION);
+        s->version = g_strdup(qemu_get_version());
      }

      if (bdrv_is_sg(s->qdev.conf.bs)) {
diff --git a/hw/usb/dev-bluetooth.c b/hw/usb/dev-bluetooth.c
index 6b74eff..55bc191 100644
--- a/hw/usb/dev-bluetooth.c
+++ b/hw/usb/dev-bluetooth.c
@@ -57,7 +57,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER]     = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER]     = "QEMU",
      [STR_SERIALNUMBER]     = "1",
  };

diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c
index f29544d..b3dcd23 100644
--- a/hw/usb/dev-hid.c
+++ b/hw/usb/dev-hid.c
@@ -60,7 +60,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER]     = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER]     = "QEMU",
      [STR_PRODUCT_MOUSE]    = "QEMU USB Mouse",
      [STR_PRODUCT_TABLET]   = "QEMU USB Tablet",
      [STR_PRODUCT_KEYBOARD] = "QEMU USB Keyboard",
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c
index b5962da..8fd30df 100644
--- a/hw/usb/dev-hub.c
+++ b/hw/usb/dev-hub.c
@@ -90,7 +90,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER] = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER] = "QEMU",
      [STR_PRODUCT]      = "QEMU USB Hub",
      [STR_SERIALNUMBER] = "314159",
  };
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index 56743ee..8aa6552 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -111,7 +111,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER]    = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER]    = "QEMU",
      [STR_PRODUCT_SERIAL]  = "QEMU USB SERIAL",
      [STR_PRODUCT_BRAILLE] = "QEMU USB BRAILLE",
      [STR_SERIALNUMBER]    = "1",
diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c
index 3b7604e..b0e70b0 100644
--- a/hw/usb/dev-smartcard-reader.c
+++ b/hw/usb/dev-smartcard-reader.c
@@ -81,7 +81,7 @@ do { \
  #define CCID_CONTROL_GET_DATA_RATES         0x3

  #define CCID_PRODUCT_DESCRIPTION        "QEMU USB CCID"
-#define CCID_VENDOR_DESCRIPTION         "QEMU " QEMU_VERSION
+#define CCID_VENDOR_DESCRIPTION         "QEMU"
  #define CCID_INTERFACE_NAME             "CCID Interface"
  #define CCID_SERIAL_NUMBER_STRING       "1"
  /*
@@ -401,7 +401,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER]  = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER]  = "QEMU",
      [STR_PRODUCT]       = "QEMU USB CCID",
      [STR_SERIALNUMBER]  = "1",
      [STR_INTERFACE]     = "CCID Interface",
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index ae22fb1..f863dfc 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -82,7 +82,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER] = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER] = "QEMU",
      [STR_PRODUCT]      = "QEMU USB HARDDRIVE",
      [STR_SERIALNUMBER] = "1",
      [STR_CONFIG_FULL]  = "Full speed config (usb 1.1)",
diff --git a/hw/usb/dev-wacom.c b/hw/usb/dev-wacom.c
index 3b51d45..ed9a5ee 100644
--- a/hw/usb/dev-wacom.c
+++ b/hw/usb/dev-wacom.c
@@ -62,7 +62,7 @@ enum {
  };

  static const USBDescStrings desc_strings = {
-    [STR_MANUFACTURER]     = "QEMU " QEMU_VERSION,
+    [STR_MANUFACTURER]     = "QEMU",
      [STR_PRODUCT]          = "Wacom PenPartner",
      [STR_SERIALNUMBER]     = "1",
  };
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index 51c27b4..d949f04 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -143,8 +143,6 @@ static void usbredir_interrupt_packet(void *priv, uint32_t 
id,
  static int usbredir_handle_status(USBRedirDevice *dev,
                                         int status, int actual_len);

-#define VERSION "qemu usb-redir guest " QEMU_VERSION
-
  /*
   * Logging stuff
   */
@@ -794,6 +792,10 @@ static void usbredir_open_close_bh(void *opaque)
  {
      USBRedirDevice *dev = opaque;
      uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, };
+    char version[32];
+
+    strcpy(version, "qemu usb-redir guest ");
+    pstrcat(version, sizeof(version), qemu_get_version());

      usbredir_device_disconnect(dev);

@@ -828,7 +830,7 @@ static void usbredir_open_close_bh(void *opaque)

          usbredirparser_caps_set_cap(caps, 
usb_redir_cap_connect_device_version);
          usbredirparser_caps_set_cap(caps, usb_redir_cap_filter);
-        usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 
0);
+        usbredirparser_init(dev->parser, version, caps, USB_REDIR_CAPS_SIZE, 
0);
          usbredirparser_do_write(dev->parser);
      }
  }
diff --git a/osdep.c b/osdep.c
index 3e6bada..03817f0 100644
--- a/osdep.c
+++ b/osdep.c
@@ -48,6 +48,8 @@ extern int madvise(caddr_t, size_t, int);
  #include "trace.h"
  #include "qemu_socket.h"

+static const char *qemu_version = QEMU_VERSION;
+
  int socket_set_cork(int fd, int v)
  {
  #if defined(SOL_TCP)&&  defined(TCP_CORK)
@@ -242,3 +244,12 @@ ssize_t qemu_recv_full(int fd, void *buf, size_t count, 
int flags)
      return total;
  }

+void qemu_set_version(const char *version)
+{
+    qemu_version = version;
+}
+
+const char *qemu_get_version(void)
+{
+    return qemu_version;
+}
diff --git a/osdep.h b/osdep.h
index 9db8766..3ea4af0 100644
--- a/osdep.h
+++ b/osdep.h
@@ -149,4 +149,7 @@ static inline void qemu_timersub(const struct timeval *val1,

  void qemu_set_cloexec(int fd);

+void qemu_set_version(const char *);
+const char *qemu_get_version(void);
+
  #endif
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 89b4ac7..b44c166 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -303,7 +303,6 @@ static x86_def_t builtin_x86_defs[] = {
          .ext3_features = CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
              CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
          .xlevel = 0x8000000A,
-        .model_id = "QEMU Virtual CPU version " QEMU_VERSION,
      },
      {
          .name = "phenom",
@@ -386,7 +385,6 @@ static x86_def_t builtin_x86_defs[] = {
          .features = PPRO_FEATURES,
          .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_POPCNT,
          .xlevel = 0x80000004,
-        .model_id = "QEMU Virtual CPU version " QEMU_VERSION,
      },
      {
          .name = "kvm32",
@@ -465,8 +463,6 @@ static x86_def_t builtin_x86_defs[] = {
          .features = PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | 
CPUID_MCA,
          .ext2_features = (PPRO_FEATURES&  EXT2_FEATURE_MASK) | 
CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
          .xlevel = 0x80000008,
-        /* XXX: put another string ? */
-        .model_id = "QEMU Virtual CPU version " QEMU_VERSION,
      },
      {
          .name = "n270",
@@ -1324,11 +1320,23 @@ void cpu_clear_apic_feature(CPUX86State *env)
   */
  void x86_cpudef_setup(void)
  {
-    int i;
+    int i, j;
+    static const char *model_with_versions[] = { "qemu32", "qemu64", "athlon" 
};

      for (i = 0; i<  ARRAY_SIZE(builtin_x86_defs); ++i) {
          builtin_x86_defs[i].next = x86_defs;
          builtin_x86_defs[i].flags = 1;
+
+        /* Look for specific "cpudef" models that */
+        /* have the QEmu version in .model_id */
+        for (j = 0; j<  ARRAY_SIZE(model_with_versions); j++) {
+            if (strcmp(model_with_versions[j], builtin_x86_defs[i].name) == 0) 
{
+                pstrcpy(builtin_x86_defs[i].model_id, 
sizeof(builtin_x86_defs[i].model_id), "QEMU Virtual CPU version ");
+                pstrcat(builtin_x86_defs[i].model_id, 
sizeof(builtin_x86_defs[i].model_id), qemu_get_version());
+                break;
+            }
+        }
+
          x86_defs =&builtin_x86_defs[i];
      }
  #if !defined(CONFIG_USER_ONLY)
diff --git a/vl.c b/vl.c
index 23ab3a3..668917c 100644
--- a/vl.c
+++ b/vl.c
@@ -3208,6 +3208,10 @@ int main(int argc, char **argv, char **envp)
      }
      loc_set_none();

+    if (machine->hw_version) {
+        qemu_set_version(machine->hw_version);
+    }
+
      /* Init CPU def lists, based on config
       * - Must be called after all the qemu_read_config_file() calls
       * - Must be called before list_cpus()




reply via email to

[Prev in Thread] Current Thread [Next in Thread]