* Re: [Qemu-devel] [PATCH 1/1 v5] Allow machines to configure the QEMU_VERSION that's exposed via hardware
[not found] <1338348951-11845-1-git-send-email-vianac@linux.vnet.ibm.com>
@ 2012-06-20 13:07 ` Anthony Liguori
0 siblings, 0 replies; only message in thread
From: Anthony Liguori @ 2012-06-20 13:07 UTC (permalink / raw)
To: Crístian Viana; +Cc: peter.maydell, eblake, qemu-devel
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<vianac@linux.vnet.ibm.com>
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()
^ permalink raw reply [flat|nested] only message in thread