mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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:
parent
459ae5ea5a
commit
93bfef4c6e
19 changed files with 62 additions and 25 deletions
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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";
|
||||
|
|
11
hw/pc_piix.c
11
hw/pc_piix.c
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -57,7 +57,7 @@ enum {
|
|||
};
|
||||
|
||||
static const USBDescStrings desc_strings = {
|
||||
[STR_MANUFACTURER] = "QEMU " QEMU_VERSION,
|
||||
[STR_MANUFACTURER] = "QEMU",
|
||||
[STR_SERIALNUMBER] = "1",
|
||||
};
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
};
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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)",
|
||||
|
|
|
@ -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",
|
||||
};
|
||||
|
|
|
@ -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
11
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;
|
||||
}
|
||||
|
|
3
osdep.h
3
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
|
||||
|
|
|
@ -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
4
vl.c
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue