From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47704) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yms61-0001pk-0v for qemu-devel@nongnu.org; Mon, 27 Apr 2015 19:05:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yms5u-000289-0N for qemu-devel@nongnu.org; Mon, 27 Apr 2015 19:05:48 -0400 Received: from omzsmtpe04.verizonbusiness.com ([199.249.25.207]:58131) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YmrnD-0006pm-7O for qemu-devel@nongnu.org; Mon, 27 Apr 2015 18:46:23 -0400 From: Don Slutz Date: Mon, 27 Apr 2015 18:46:03 -0400 Message-Id: <1430174764-19503-7-git-send-email-dslutz@verizon.com> In-Reply-To: <1430174764-19503-1-git-send-email-dslutz@verizon.com> References: <1430174764-19503-1-git-send-email-dslutz@verizon.com> Subject: [Qemu-devel] [PATCH v2 6/7] vmport: Add VMware all ring hack List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , Markus Armbruster , Don Slutz , Luiz Capitulino , Anthony Liguori , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Richard Henderson This is done by adding a new machine property vmware-port-ring3 that needs to be enabled to have any effect. It only effects accel=tcg mode. It is needed if you want to use VMware tools in accel=tcg mode. Signed-off-by: Don Slutz (cherry picked from commit 6d99c91fc9ae27b476e89a8cc880b4a46e237536) --- hw/i386/pc.c | 28 +++++++++++++++++++++++++++- hw/i386/pc_piix.c | 2 +- hw/i386/pc_q35.c | 2 +- include/hw/i386/pc.h | 6 +++++- target-i386/cpu.c | 4 ++++ target-i386/cpu.h | 2 ++ target-i386/seg_helper.c | 6 ++++++ 7 files changed, 46 insertions(+), 4 deletions(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index e5b7167..ec78c76 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1056,7 +1056,9 @@ void pc_hot_add_cpu(const int64_t id, Error **errp) pc_new_cpu(current_cpu_model, apic_id, icc_bridge, errp); } -void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge) +/* vmware_port_ring3 true says enable VMware port access in ring3. */ +void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge, + bool vmware_port_ring3) { int i; X86CPU *cpu = NULL; @@ -1087,6 +1089,9 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge) error_report_err(error); exit(1); } + if (vmware_port_ring3) { + cpu->env.hflags2 |= HF2_VMPORT_HACK_MASK; + } } /* map APIC MMIO area if CPU has APIC */ @@ -1824,6 +1829,21 @@ static bool pc_machine_get_aligned_dimm(Object *obj, Error **errp) return pcms->enforce_aligned_dimm; } +static bool pc_machine_get_vmware_port_ring3(Object *obj, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + + return pcms->vmware_port_ring3; +} + +static void pc_machine_set_vmware_port_ring3(Object *obj, bool value, + Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + + pcms->vmware_port_ring3 = value; +} + static void pc_machine_initfn(Object *obj) { PCMachineState *pcms = PC_MACHINE(obj); @@ -1854,6 +1874,12 @@ static void pc_machine_initfn(Object *obj) object_property_add_bool(obj, PC_MACHINE_ENFORCE_ALIGNED_DIMM, pc_machine_get_aligned_dimm, NULL, NULL); + + pcms->vmware_port_ring3 = false; + object_property_add_bool(obj, PC_MACHINE_VMWARE_PORT_RING3, + pc_machine_get_vmware_port_ring3, + pc_machine_set_vmware_port_ring3, + NULL); } static unsigned pc_cpu_index_to_socket_id(unsigned cpu_index) diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 1fe7bfb..4fa21c9 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -147,7 +147,7 @@ static void pc_init1(MachineState *machine, object_property_add_child(qdev_get_machine(), "icc-bridge", OBJECT(icc_bridge), NULL); - pc_cpus_init(machine->cpu_model, icc_bridge); + pc_cpus_init(machine->cpu_model, icc_bridge, pc_machine->vmware_port_ring3); if (kvm_enabled() && kvmclock_enabled) { kvmclock_create(); diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index dcc17c0..1e47b97 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -136,7 +136,7 @@ static void pc_q35_init(MachineState *machine) object_property_add_child(qdev_get_machine(), "icc-bridge", OBJECT(icc_bridge), NULL); - pc_cpus_init(machine->cpu_model, icc_bridge); + pc_cpus_init(machine->cpu_model, icc_bridge, pc_machine->vmware_port_ring3); pc_acpi_init("q35-acpi-dsdt.aml"); kvmclock_create(); diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 1b35168..2119d5d 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -40,6 +40,7 @@ struct PCMachineState { uint64_t max_ram_below_4g; OnOffAuto vmport; + bool vmware_port_ring3; bool enforce_aligned_dimm; }; @@ -48,6 +49,7 @@ struct PCMachineState { #define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g" #define PC_MACHINE_VMPORT "vmport" #define PC_MACHINE_ENFORCE_ALIGNED_DIMM "enforce-aligned-dimm" +#define PC_MACHINE_VMWARE_PORT_RING3 "vmware-port-ring3" /** * PCMachineClass: @@ -163,7 +165,9 @@ extern int fd_bootchk; void pc_register_ferr_irq(qemu_irq irq); void pc_acpi_smi_interrupt(void *opaque, int irq, int level); -void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge); +/* vmware_port_ring3 true says enable VMware port access in ring3. */ +void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge, + bool vmware_port_ring3); void pc_hot_add_cpu(const int64_t id, Error **errp); void pc_acpi_init(const char *default_dsdt); diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 03b33cf..7951880 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2631,6 +2631,7 @@ static void x86_cpu_reset(CPUState *s) X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu); CPUX86State *env = &cpu->env; int i; + bool save_vmware_port_ring3 = env->hflags2 & HF2_VMPORT_HACK_MASK; xcc->parent_reset(s); @@ -2646,6 +2647,9 @@ static void x86_cpu_reset(CPUState *s) env->hflags |= HF_SOFTMMU_MASK; #endif env->hflags2 |= HF2_GIF_MASK; + if (save_vmware_port_ring3) { + env->hflags2 |= HF2_VMPORT_HACK_MASK; + } cpu_x86_update_cr0(env, 0x60000010); env->a20_mask = ~0x0; diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 4ee12ca..e230b54 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -184,11 +184,13 @@ #define HF2_HIF_SHIFT 1 /* value of IF_MASK when entering SVM */ #define HF2_NMI_SHIFT 2 /* CPU serving NMI */ #define HF2_VINTR_SHIFT 3 /* value of V_INTR_MASKING bit */ +#define HF2_VMPORT_HACK_SHIFT 4 /* skip iopl checking for VMware port */ #define HF2_GIF_MASK (1 << HF2_GIF_SHIFT) #define HF2_HIF_MASK (1 << HF2_HIF_SHIFT) #define HF2_NMI_MASK (1 << HF2_NMI_SHIFT) #define HF2_VINTR_MASK (1 << HF2_VINTR_SHIFT) +#define HF2_VMPORT_HACK_MASK (1 << HF2_VMPORT_HACK_SHIFT) #define CR0_PE_SHIFT 0 #define CR0_MP_SHIFT 1 diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c index 2bc757a..3c52f28 100644 --- a/target-i386/seg_helper.c +++ b/target-i386/seg_helper.c @@ -2566,6 +2566,12 @@ static inline void check_io(CPUX86State *env, int addr, int size) { int io_offset, val, mask; + /* vmport hack: skip iopl checking for VMware port 0x5658 (see + * vmport_realizefn()) */ + if ((env->hflags2 & HF2_VMPORT_HACK_MASK) && (addr == 0x5658)) { + return; + } + /* TSS must be a valid 32 bit one */ if (!(env->tr.flags & DESC_P_MASK) || ((env->tr.flags >> DESC_TYPE_SHIFT) & 0xf) != 9 || -- 1.8.4