Based on the following conversation: http://mid.gmane.org/4f69f05b.5010...@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 <via...@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 | 7 ++++++- 25 files changed, 75 insertions(+), 37 deletions(-) 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 4d568ac..dde0ad2 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1888,7 +1888,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 bdbe7bd..97d3529 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 962677e..f6005fd 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -3089,8 +3089,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 0e48b35..619914b 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..7fea263 100644 --- a/vl.c +++ b/vl.c @@ -1561,7 +1561,8 @@ static void main_loop(void) static void version(void) { - printf("QEMU emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"); + printf("QEMU emulator version %s" QEMU_PKGVERSION ", " + "Copyright (c) 2003-2008 Fabrice Bellard\n", qemu_get_version()); } static void help(int exitcode) @@ -3198,6 +3199,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() -- 1.7.8.5