Allow machines to configure the QEMU_VERSION that's exposed via hardware

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>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Crístian Viana 2012-05-30 00:35:51 -03:00 committed by Anthony Liguori
parent 459ae5ea5a
commit 93bfef4c6e
19 changed files with 62 additions and 25 deletions

View File

@ -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);

View File

@ -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))

View File

@ -1995,7 +1995,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);

View File

@ -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";

View File

@ -390,6 +390,7 @@ static QEMUMachine pc_machine_v1_0 = {
PC_COMPAT_1_0,
{ /* end of list */ }
},
.hw_version = "1.0",
};
#define PC_COMPAT_0_15 \
@ -404,6 +405,7 @@ static QEMUMachine pc_machine_v0_15 = {
PC_COMPAT_0_15,
{ /* end of list */ }
},
.hw_version = "0.15",
};
#define PC_COMPAT_0_14 \
@ -444,6 +446,7 @@ static QEMUMachine pc_machine_v0_14 = {
},
{ /* end of list */ }
},
.hw_version = "0.14",
};
#define PC_COMPAT_0_13 \
@ -480,6 +483,7 @@ static QEMUMachine pc_machine_v0_13 = {
},
{ /* end of list */ }
},
.hw_version = "0.13",
};
#define PC_COMPAT_0_12 \
@ -511,7 +515,8 @@ static QEMUMachine pc_machine_v0_12 = {
.value = stringify(0),
},
{ /* end of list */ }
}
},
.hw_version = "0.12",
};
#define PC_COMPAT_0_11 \
@ -543,7 +548,8 @@ static QEMUMachine pc_machine_v0_11 = {
.value = "0.11",
},
{ /* end of list */ }
}
},
.hw_version = "0.11",
};
static QEMUMachine pc_machine_v0_10 = {
@ -576,6 +582,7 @@ static QEMUMachine pc_machine_v0_10 = {
},
{ /* end of list */ }
},
.hw_version = "0.10",
};
static QEMUMachine isapc_machine = {

View File

@ -417,7 +417,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;
}

View File

@ -1715,7 +1715,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)) {

View File

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

View File

@ -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",

View File

@ -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",
};

View File

@ -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",

View File

@ -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",

View File

@ -81,7 +81,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)",

View File

@ -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",
};

View File

@ -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);
}
}

11
osdep.c
View File

@ -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;
}

View File

@ -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

View File

@ -305,7 +305,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",
@ -388,7 +387,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",
@ -467,8 +465,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",
@ -1299,11 +1295,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)

4
vl.c
View File

@ -3206,6 +3206,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()