From: Don Slutz <dslutz@verizon.com>
To: qemu-devel@nongnu.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Don Slutz" <dslutz@verizon.com>,
"Luiz Capitulino" <lcapitulino@redhat.com>,
"Anthony Liguori" <aliguori@amazon.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Andreas Färber" <afaerber@suse.de>,
"Richard Henderson" <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH v2 6/7] vmport: Add VMware all ring hack
Date: Mon, 16 Mar 2015 19:21:03 -0400 [thread overview]
Message-ID: <1426548064-21182-7-git-send-email-dslutz@verizon.com> (raw)
In-Reply-To: <1426548064-21182-1-git-send-email-dslutz@verizon.com>
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 <dslutz@verizon.com>
(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 204f4a9..a636c8f 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1048,7 +1048,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;
@@ -1079,6 +1081,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 */
@@ -1816,6 +1821,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);
@@ -1846,6 +1866,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 void pc_machine_class_init(ObjectClass *oc, void *data)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 36c69d7..8559860 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 bc40537..7dcde5f 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 ed7e5d5..c1d513c 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2571,6 +2571,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);
@@ -2586,6 +2587,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 e4c27b1..a366944 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -186,11 +186,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
next prev parent reply other threads:[~2015-03-16 23:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-16 23:20 [Qemu-devel] [PATCH v2 0/7] Add limited support of VMware's hyper-call rpc Don Slutz
2015-03-16 23:20 ` [Qemu-devel] [PATCH v2 1/7] vmport.c: Fix vmport_cmd_ram_size Don Slutz
2015-03-16 23:20 ` [Qemu-devel] [PATCH v2 2/7] vmport_rpc: Add the object vmport_rpc Don Slutz
2015-03-16 23:21 ` [Qemu-devel] [PATCH v2 3/7] vmport_rpc: Add limited support of VMware's hyper-call rpc Don Slutz
2015-03-16 23:21 ` [Qemu-devel] [PATCH v2 4/7] vmport_rpc: Add QMP access to vmport_rpc object Don Slutz
2015-03-16 23:21 ` [Qemu-devel] [PATCH v2 5/7] vmport_rpc: Add migration Don Slutz
2015-03-16 23:21 ` Don Slutz [this message]
2015-03-16 23:21 ` [Qemu-devel] [PATCH v2 7/7] MAINTAINERS: add VMware port Don Slutz
-- strict thread matches above, loose matches on Subject: below --
2015-04-27 22:45 [Qemu-devel] [PATCH v2 0/7] Add limited support of VMware's hyper-call rpc Don Slutz
2015-04-27 22:46 ` [Qemu-devel] [PATCH v2 6/7] vmport: Add VMware all ring hack Don Slutz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1426548064-21182-7-git-send-email-dslutz@verizon.com \
--to=dslutz@verizon.com \
--cc=afaerber@suse.de \
--cc=aliguori@amazon.com \
--cc=armbru@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).