diff mbox

[1/1,v2] Allow machines to configure the QEMU_VERSION that's exposed via hardware

Message ID 1334089012-21118-1-git-send-email-vianac@linux.vnet.ibm.com
State New
Headers show

Commit Message

Crístian Viana April 10, 2012, 8:16 p.m. UTC
Based on the following conversation:

http://mid.gmane.org/4F69F05B.5010500@codemonkey.ws

> Which reminds me - qemu sticks the release version in
> guest visible places like CPU version.
> This is wrong and causes windows guests to print messages
> about driver updates when you switch.
> We should find all these places and stop doing this.

There is a new field 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 virtual
machine.

Signed-off-by: Crístian Viana <vianac@linux.vnet.ibm.com>
---
 bsd-user/main.c               |    3 ++-
 darwin-user/main.c            |    3 ++-
 hw/boards.h                   |    1 +
 hw/bt-sdp.c                   |    6 +++---
 hw/ide/core.c                 |    2 +-
 hw/nseries.c                  |    2 +-
 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             |    7 ++++---
 linux-user/main.c             |    4 ++--
 monitor.c                     |    2 +-
 osdep.c                       |   11 +++++++++++
 osdep.h                       |    3 +++
 qemu-img.c                    |    9 ++++-----
 qmp.c                         |    2 +-
 target-i386/cpuid.c           |   19 ++++++++++++++-----
 vl.c                          |    4 ++++
 25 files changed, 73 insertions(+), 36 deletions(-)

Comments

Peter Maydell April 10, 2012, 9:24 p.m. UTC | #1
On 10 April 2012 21:16, Crístian Viana <vianac@linux.vnet.ibm.com> wrote:
> Based on the following conversation:
>
> http://mid.gmane.org/4F69F05B.5010500@codemonkey.ws
>
>> Which reminds me - qemu sticks the release version in
>> guest visible places like CPU version.
>> This is wrong and causes windows guests to print messages
>> about driver updates when you switch.
>> We should find all these places and stop doing this.
>
> There is a new field 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 virtual
> machine.

This is still changing the version printed in a bunch of user
facing usage and help messages. Please drop those.

-- PMM
Anthony Liguori April 11, 2012, 1:50 a.m. UTC | #2
On 04/10/2012 04:24 PM, Peter Maydell wrote:
> On 10 April 2012 21:16, Crístian Viana<vianac@linux.vnet.ibm.com>  wrote:
>> Based on the following conversation:
>>
>> http://mid.gmane.org/4F69F05B.5010500@codemonkey.ws
>>
>>> Which reminds me - qemu sticks the release version in
>>> guest visible places like CPU version.
>>> This is wrong and causes windows guests to print messages
>>> about driver updates when you switch.
>>> We should find all these places and stop doing this.
>>
>> There is a new field 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 virtual
>> machine.
>
> This is still changing the version printed in a bunch of user
> facing usage and help messages. Please drop those.

Why? Changing the help messages is not necessary or useful.  We just need to 
make sure the guest ABI remains stable.

libvirt extracts the version info from the help message so if we change it, it's 
going to break libvirt.

Regards,

Anthony Liguori

>
> -- PMM
>
Peter Maydell April 11, 2012, 7:14 a.m. UTC | #3
On 11 April 2012 02:50, Anthony Liguori <anthony@codemonkey.ws> wrote:
> On 04/10/2012 04:24 PM, Peter Maydell wrote:
>> This is still changing the version printed in a bunch of user
>> facing usage and help messages. Please drop those.
>
>
> Why? Changing the help messages is not necessary or useful.  We just need to
> make sure the guest ABI remains stable.

Er, you seem to be furiously agreeing with me? This
patch includes hunks that change how we handle eg
usage messages for bsd-user and qemu-img. I agree with
you that we should not be changing those, so why are
they in the patch?

I'm also suspicious about lying about the version string
in the monitor interface, but I'm not a monitor expert
so you'll have to tell me whether that one's right.

Oh, and osdep.c is definitely the wrong place to define
qemu_{set,get}_version().

-- PMM
Anthony Liguori April 11, 2012, 2:38 p.m. UTC | #4
On 04/11/2012 02:14 AM, Peter Maydell wrote:
> On 11 April 2012 02:50, Anthony Liguori<anthony@codemonkey.ws>  wrote:
>> On 04/10/2012 04:24 PM, Peter Maydell wrote:
>>> This is still changing the version printed in a bunch of user
>>> facing usage and help messages. Please drop those.
>>
>>
>> Why? Changing the help messages is not necessary or useful.  We just need to
>> make sure the guest ABI remains stable.
>
> Er, you seem to be furiously agreeing with me? This
> patch includes hunks that change how we handle eg
> usage messages for bsd-user and qemu-img. I agree with
> you that we should not be changing those, so why are
> they in the patch?

Sorry, I misread your note.  I agree with you completely.

Regards,

Anthony Liguori

>
> I'm also suspicious about lying about the version string
> in the monitor interface, but I'm not a monitor expert
> so you'll have to tell me whether that one's right.
>
> Oh, and osdep.c is definitely the wrong place to define
> qemu_{set,get}_version().
>
> -- PMM
diff mbox

Patch

diff --git a/bsd-user/main.c b/bsd-user/main.c
index 48cb715..5bf7685 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -671,7 +671,7 @@  void cpu_loop(CPUSPARCState *env)
 
 static void usage(void)
 {
-    printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
+    printf("qemu-" TARGET_ARCH " version %s, Copyright (c) 2003-2008 Fabrice Bellard\n"
            "usage: qemu-" TARGET_ARCH " [options] program [arguments...]\n"
            "BSD CPU emulator (compiled for %s emulation)\n"
            "\n"
@@ -706,6 +706,7 @@  static void usage(void)
            "Note that if you provide several changes to single variable\n"
            "last change will stay in effect.\n"
            ,
+           qemu_get_version(),
            TARGET_ARCH,
            interp_prefix,
            x86_stack_size,
diff --git a/darwin-user/main.c b/darwin-user/main.c
index 544e219..2280b59 100644
--- a/darwin-user/main.c
+++ b/darwin-user/main.c
@@ -707,7 +707,7 @@  void cpu_loop(CPUX86State *env)
 
 static void usage(void)
 {
-    printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2004 Fabrice Bellard\n"
+    printf("qemu-" TARGET_ARCH " version %s, Copyright (c) 2003-2004 Fabrice Bellard\n"
            "usage: qemu-" TARGET_ARCH " [-h] [-d opts] [-L path] [-s size] program [arguments...]\n"
            "Darwin CPU emulator (compiled for %s emulation)\n"
            "\n"
@@ -720,6 +720,7 @@  static void usage(void)
            "-g wait for gdb on port 1234\n"
            "-p pagesize  set the host page size to 'pagesize'\n",
            "-singlestep  always run in singlestep mode\n"
+           qemu_get_version(),
            TARGET_ARCH,
            TARGET_ARCH,
            interp_prefix,
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 35723fd..f6926cd 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1921,7 +1921,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..9d07cb8 100644
--- a/hw/nseries.c
+++ b/hw/nseries.c
@@ -1247,7 +1247,7 @@  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] */
+    sprintf((void *) w, "QEMU %s", 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 fadca4c..d6b5ff9 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -376,6 +376,7 @@  static QEMUMachine pc_machine_v1_0 = {
         },
         { /* end of list */ }
     },
+    .hw_version = "1.0",
 };
 
 static QEMUMachine pc_machine_v0_15 = {
@@ -395,6 +396,7 @@  static QEMUMachine pc_machine_v0_15 = {
         },
         { /* end of list */ }
     },
+    .hw_version = "0.15",
 };
 
 static QEMUMachine pc_machine_v0_14 = {
@@ -439,6 +441,7 @@  static QEMUMachine pc_machine_v0_14 = {
         },
         { /* end of list */ }
     },
+    .hw_version = "0.14",
 };
 
 static QEMUMachine pc_machine_v0_13 = {
@@ -495,6 +498,7 @@  static QEMUMachine pc_machine_v0_13 = {
         },
         { /* end of list */ }
     },
+    .hw_version = "0.13",
 };
 
 static QEMUMachine pc_machine_v0_12 = {
@@ -554,7 +558,8 @@  static QEMUMachine pc_machine_v0_12 = {
             .value    = stringify(1),
         },
         { /* end of list */ }
-    }
+    },
+    .hw_version = "0.12",
 };
 
 static QEMUMachine pc_machine_v0_11 = {
@@ -622,7 +627,8 @@  static QEMUMachine pc_machine_v0_11 = {
             .value    = stringify(1),
         },
         { /* end of list */ }
-    }
+    },
+    .hw_version = "0.11",
 };
 
 static QEMUMachine pc_machine_v0_10 = {
@@ -703,6 +709,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 8e76c5d..1bdfa2d 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -402,7 +402,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);
+        strncpy((char *) &r->buf[32], qemu_get_version(), 4);
     }
     return true;
 }
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 9949786..3e6cecc 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1611,7 +1611,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 195370c..f24b196 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 eb4e711..5c8ace6 100644
--- a/hw/usb/dev-hub.c
+++ b/hw/usb/dev-hub.c
@@ -91,7 +91,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 8dcac8b..e405c01 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 8e66675..6fe9359 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 d865a5e..d2c243b 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 c1cfd74..5380d17 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 8e9f175..3980d96 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -141,8 +141,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
  */
@@ -792,6 +790,9 @@  static void usbredir_open_close_bh(void *opaque)
 {
     USBRedirDevice *dev = opaque;
     uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, };
+    char version[32];
+
+    snprintf(version, 32, "qemu usb-redir guest %s", qemu_get_version());
 
     usbredir_device_disconnect(dev);
 
@@ -826,7 +827,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/linux-user/main.c b/linux-user/main.c
index 191b750..33804c7 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -3119,8 +3119,8 @@  static void handle_arg_strace(const char *arg)
 
 static void handle_arg_version(const char *arg)
 {
-    printf("qemu-" TARGET_ARCH " version " QEMU_VERSION QEMU_PKGVERSION
-           ", Copyright (c) 2003-2008 Fabrice Bellard\n");
+    printf("qemu-" TARGET_ARCH " version %s " QEMU_PKGVERSION
+           ", Copyright (c) 2003-2008 Fabrice Bellard\n", qemu_get_version());
     exit(0);
 }
 
diff --git a/monitor.c b/monitor.c
index 8946a10..08452ba 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4535,7 +4535,7 @@  static void monitor_event(void *opaque, int event)
 
     case CHR_EVENT_OPENED:
         monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
-                       "information\n", QEMU_VERSION);
+                       "information\n", qemu_get_version());
         if (!mon->mux_out) {
             readline_show_prompt(mon->rs);
         }
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 428285c..858c7f1 100644
--- a/osdep.h
+++ b/osdep.h
@@ -142,4 +142,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/qemu-img.c b/qemu-img.c
index 6a61ca8..25743d8 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -50,8 +50,7 @@  static void format_print(void *opaque, const char *name)
 /* Please keep in synch with qemu-img.texi */
 static void help(void)
 {
-    const char *help_msg =
-           "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
+    printf("qemu-img version %s, Copyright (c) 2004-2008 Fabrice Bellard\n"
            "usage: qemu-img command [command options]\n"
            "QEMU disk image utility\n"
            "\n"
@@ -90,9 +89,9 @@  static void help(void)
            "  '-a' applies a snapshot (revert disk to saved state)\n"
            "  '-c' creates a snapshot\n"
            "  '-d' deletes a snapshot\n"
-           "  '-l' lists all snapshots in the given image\n";
-
-    printf("%s\nSupported formats:", help_msg);
+           "  '-l' lists all snapshots in the given image\n"
+           "\n"
+           "Supported formats:", qemu_get_version());
     bdrv_iterate_format(format_print, NULL);
     printf("\n");
     exit(1);
diff --git a/qmp.c b/qmp.c
index a182b51..5a7ddb4 100644
--- a/qmp.c
+++ b/qmp.c
@@ -39,7 +39,7 @@  NameInfo *qmp_query_name(Error **errp)
 VersionInfo *qmp_query_version(Error **err)
 {
     VersionInfo *info = g_malloc0(sizeof(*info));
-    const char *version = QEMU_VERSION;
+    const char *version = qemu_get_version();
     char *tmp;
 
     info->qemu.major = strtol(version, &tmp, 10);
diff --git a/target-i386/cpuid.c b/target-i386/cpuid.c
index 465ea15..a8b6d54 100644
--- a/target-i386/cpuid.c
+++ b/target-i386/cpuid.c
@@ -301,7 +301,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",
@@ -384,7 +383,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",
@@ -463,8 +461,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",
@@ -1068,11 +1064,24 @@  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) {
+                snprintf(builtin_x86_defs[i].model_id,
+                         sizeof(builtin_x86_defs[i].model_id),
+                         "QEMU Virtual CPU version %s", qemu_get_version());
+                break;
+            }
+        }
+
         x86_defs = &builtin_x86_defs[i];
     }
 #if !defined(CONFIG_USER_ONLY)
diff --git a/vl.c b/vl.c
index ae91a8a..8cf67e3 100644
--- a/vl.c
+++ b/vl.c
@@ -3198,6 +3198,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()