KVM: x86: Always allow access to VMware backdoor I/O ports
authorLiran Alon <liran.alon@oracle.com>
Mon, 12 Mar 2018 11:12:48 +0000 (13:12 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 16 Mar 2018 21:01:40 +0000 (22:01 +0100)
VMware allows access to these ports even if denied
by TSS I/O permission bitmap. Mimic behavior.

Signed-off-by: Liran Alon <liran.alon@oracle.com>
Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
Reviewed-by: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/emulate.c

index d91eaeb..821f633 100644 (file)
@@ -2887,6 +2887,9 @@ static bool emulator_bad_iopl(struct x86_emulate_ctxt *ctxt)
        return ctxt->ops->cpl(ctxt) > iopl;
 }
 
+#define VMWARE_PORT_VMPORT     (0x5658)
+#define VMWARE_PORT_VMRPC      (0x5659)
+
 static bool emulator_io_port_access_allowed(struct x86_emulate_ctxt *ctxt,
                                            u16 port, u16 len)
 {
@@ -2898,6 +2901,14 @@ static bool emulator_io_port_access_allowed(struct x86_emulate_ctxt *ctxt,
        unsigned mask = (1 << len) - 1;
        unsigned long base;
 
+       /*
+        * VMware allows access to these ports even if denied
+        * by TSS I/O permission bitmap. Mimic behavior.
+        */
+       if (enable_vmware_backdoor &&
+           ((port == VMWARE_PORT_VMPORT) || (port == VMWARE_PORT_VMRPC)))
+               return true;
+
        ops->get_segment(ctxt, &tr, &tr_seg, &base3, VCPU_SREG_TR);
        if (!tr_seg.p)
                return false;