Message ID | 20200312165431.82118-6-liran.alon@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | : hw/i386/vmport: Bug fixes and improvements | expand |
On 3/12/20 5:54 PM, Liran Alon wrote: > vmware-vmx-version is a number returned from CMD_GETVERSION which specifies > to guest VMware Tools the the host VMX version. If the host reports a number > that is different than what the guest VMware Tools expects, it may force > guest to upgrade VMware Tools. (See comment above VERSION_MAGIC and > VmCheck_IsVirtualWorld() function in open-vm-tools open-source code). > > For better readability and allow maintaining compatability for guests > which may expect different vmware-vmx-version, make vmware-vmx-version a > VMPort object property. This would allow user to control it's value via > "-global vmport.vmware-vmx-version=X". > > Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com> > Signed-off-by: Liran Alon <liran.alon@oracle.com> > --- > hw/i386/vmport.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/hw/i386/vmport.c b/hw/i386/vmport.c > index e67c7bb2afea..8e662303d5d3 100644 > --- a/hw/i386/vmport.c > +++ b/hw/i386/vmport.c > @@ -60,6 +60,8 @@ typedef struct VMPortState { > VMPortReadFunc *func[VMPORT_ENTRIES]; > void *opaque[VMPORT_ENTRIES]; > > + uint32_t vmware_vmx_version; > + > uint32_t compat_flags; > } VMPortState; > > @@ -138,7 +140,7 @@ static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr) > X86CPU *cpu = X86_CPU(current_cpu); > > cpu->env.regs[R_EBX] = VMPORT_MAGIC; > - return 6; > + return port_state->vmware_vmx_version; > } > > static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr) > @@ -200,6 +202,11 @@ static Property vmport_properties[] = { > VMPORT_COMPAT_READ_SET_EAX_BIT, true), > DEFINE_PROP_BIT("x-signal-unsupported-cmd", VMPortState, compat_flags, > VMPORT_COMPAT_SIGNAL_UNSUPPORTED_CMD_BIT, true), > + > + /* Default value taken from open-vm-tools code VERSION_MAGIC definition */ > + DEFINE_PROP_UINT32("vmware-vmx-version", VMPortState, > + vmware_vmx_version, 6), > + > DEFINE_PROP_END_OF_LIST(), > }; > > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
diff --git a/hw/i386/vmport.c b/hw/i386/vmport.c index e67c7bb2afea..8e662303d5d3 100644 --- a/hw/i386/vmport.c +++ b/hw/i386/vmport.c @@ -60,6 +60,8 @@ typedef struct VMPortState { VMPortReadFunc *func[VMPORT_ENTRIES]; void *opaque[VMPORT_ENTRIES]; + uint32_t vmware_vmx_version; + uint32_t compat_flags; } VMPortState; @@ -138,7 +140,7 @@ static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr) X86CPU *cpu = X86_CPU(current_cpu); cpu->env.regs[R_EBX] = VMPORT_MAGIC; - return 6; + return port_state->vmware_vmx_version; } static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr) @@ -200,6 +202,11 @@ static Property vmport_properties[] = { VMPORT_COMPAT_READ_SET_EAX_BIT, true), DEFINE_PROP_BIT("x-signal-unsupported-cmd", VMPortState, compat_flags, VMPORT_COMPAT_SIGNAL_UNSUPPORTED_CMD_BIT, true), + + /* Default value taken from open-vm-tools code VERSION_MAGIC definition */ + DEFINE_PROP_UINT32("vmware-vmx-version", VMPortState, + vmware_vmx_version, 6), + DEFINE_PROP_END_OF_LIST(), };