drm/vmwgfx: Update the backdoor call with support for new instructions
authorThomas Hellstrom <thellstrom@vmware.com>
Wed, 28 Aug 2019 08:03:52 +0000 (10:03 +0200)
committerBorislav Petkov <bp@suse.de>
Wed, 28 Aug 2019 11:36:46 +0000 (13:36 +0200)
Use the definition provided by include/asm/vmware.h

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Doug Covelli <dcovelli@vmware.com>
Acked-by: Dave Airlie <airlied@redhat.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: dri-devel@lists.freedesktop.org
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: pv-drivers@vmware.com
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: VMware Graphics <linux-graphics-maintainer@vmware.com>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/20190828080353.12658-4-thomas_os@shipmail.org
drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
drivers/gpu/drm/vmwgfx/vmwgfx_msg.h

index 59e9d05..b1df3e3 100644 (file)
@@ -46,8 +46,6 @@
 #define RETRIES                 3
 
 #define VMW_HYPERVISOR_MAGIC    0x564D5868
-#define VMW_HYPERVISOR_PORT     0x5658
-#define VMW_HYPERVISOR_HB_PORT  0x5659
 
 #define VMW_PORT_CMD_MSG        30
 #define VMW_PORT_CMD_HB_MSG     0
@@ -93,7 +91,7 @@ static int vmw_open_channel(struct rpc_channel *channel, unsigned int protocol)
 
        VMW_PORT(VMW_PORT_CMD_OPEN_CHANNEL,
                (protocol | GUESTMSG_FLAG_COOKIE), si, di,
-               VMW_HYPERVISOR_PORT,
+               0,
                VMW_HYPERVISOR_MAGIC,
                eax, ebx, ecx, edx, si, di);
 
@@ -126,7 +124,7 @@ static int vmw_close_channel(struct rpc_channel *channel)
 
        VMW_PORT(VMW_PORT_CMD_CLOSE_CHANNEL,
                0, si, di,
-               (VMW_HYPERVISOR_PORT | (channel->channel_id << 16)),
+               channel->channel_id << 16,
                VMW_HYPERVISOR_MAGIC,
                eax, ebx, ecx, edx, si, di);
 
@@ -160,7 +158,8 @@ static unsigned long vmw_port_hb_out(struct rpc_channel *channel,
                VMW_PORT_HB_OUT(
                        (MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG,
                        msg_len, si, di,
-                       VMW_HYPERVISOR_HB_PORT | (channel->channel_id << 16),
+                       VMWARE_HYPERVISOR_HB | (channel->channel_id << 16) |
+                       VMWARE_HYPERVISOR_OUT,
                        VMW_HYPERVISOR_MAGIC, bp,
                        eax, ebx, ecx, edx, si, di);
 
@@ -181,7 +180,7 @@ static unsigned long vmw_port_hb_out(struct rpc_channel *channel,
 
                VMW_PORT(VMW_PORT_CMD_MSG | (MSG_TYPE_SENDPAYLOAD << 16),
                         word, si, di,
-                        VMW_HYPERVISOR_PORT | (channel->channel_id << 16),
+                        channel->channel_id << 16,
                         VMW_HYPERVISOR_MAGIC,
                         eax, ebx, ecx, edx, si, di);
        }
@@ -213,7 +212,7 @@ static unsigned long vmw_port_hb_in(struct rpc_channel *channel, char *reply,
                VMW_PORT_HB_IN(
                        (MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG,
                        reply_len, si, di,
-                       VMW_HYPERVISOR_HB_PORT | (channel->channel_id << 16),
+                       VMWARE_HYPERVISOR_HB | (channel->channel_id << 16),
                        VMW_HYPERVISOR_MAGIC, bp,
                        eax, ebx, ecx, edx, si, di);
 
@@ -230,7 +229,7 @@ static unsigned long vmw_port_hb_in(struct rpc_channel *channel, char *reply,
 
                VMW_PORT(VMW_PORT_CMD_MSG | (MSG_TYPE_RECVPAYLOAD << 16),
                         MESSAGE_STATUS_SUCCESS, si, di,
-                        VMW_HYPERVISOR_PORT | (channel->channel_id << 16),
+                        channel->channel_id << 16,
                         VMW_HYPERVISOR_MAGIC,
                         eax, ebx, ecx, edx, si, di);
 
@@ -269,7 +268,7 @@ static int vmw_send_msg(struct rpc_channel *channel, const char *msg)
 
                VMW_PORT(VMW_PORT_CMD_SENDSIZE,
                        msg_len, si, di,
-                       VMW_HYPERVISOR_PORT | (channel->channel_id << 16),
+                       channel->channel_id << 16,
                        VMW_HYPERVISOR_MAGIC,
                        eax, ebx, ecx, edx, si, di);
 
@@ -327,7 +326,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg,
 
                VMW_PORT(VMW_PORT_CMD_RECVSIZE,
                        0, si, di,
-                       (VMW_HYPERVISOR_PORT | (channel->channel_id << 16)),
+                       channel->channel_id << 16,
                        VMW_HYPERVISOR_MAGIC,
                        eax, ebx, ecx, edx, si, di);
 
@@ -371,7 +370,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg,
 
                VMW_PORT(VMW_PORT_CMD_RECVSTATUS,
                        MESSAGE_STATUS_SUCCESS, si, di,
-                       (VMW_HYPERVISOR_PORT | (channel->channel_id << 16)),
+                       channel->channel_id << 16,
                        VMW_HYPERVISOR_MAGIC,
                        eax, ebx, ecx, edx, si, di);
 
index 4907e50..f685c70 100644 (file)
@@ -32,6 +32,7 @@
 #ifndef _VMWGFX_MSG_H
 #define _VMWGFX_MSG_H
 
+#include <asm/vmware.h>
 
 /**
  * Hypervisor-specific bi-directional communication channel.  Should never
@@ -44,7 +45,7 @@
  * @in_ebx: [IN] Message Len, through EBX
  * @in_si: [IN] Input argument through SI, set to 0 if not used
  * @in_di: [IN] Input argument through DI, set ot 0 if not used
- * @port_num: [IN] port number + [channel id]
+ * @flags: [IN] hypercall flags + [channel id]
  * @magic: [IN] hypervisor magic value
  * @eax: [OUT] value of EAX register
  * @ebx: [OUT] e.g. status from an HB message status command
  * @di:  [OUT]
  */
 #define VMW_PORT(cmd, in_ebx, in_si, in_di,    \
-                port_num, magic,               \
+                flags, magic,          \
                 eax, ebx, ecx, edx, si, di)    \
 ({                                             \
-       asm volatile ("inl %%dx, %%eax;" :      \
+       asm volatile (VMWARE_HYPERCALL :        \
                "=a"(eax),                      \
                "=b"(ebx),                      \
                "=c"(ecx),                      \
@@ -67,7 +68,7 @@
                "a"(magic),                     \
                "b"(in_ebx),                    \
                "c"(cmd),                       \
-               "d"(port_num),                  \
+               "d"(flags),                     \
                "S"(in_si),                     \
                "D"(in_di) :                    \
                "memory");                      \
@@ -85,7 +86,7 @@
  * @in_ecx: [IN] Message Len, through ECX
  * @in_si: [IN] Input argument through SI, set to 0 if not used
  * @in_di: [IN] Input argument through DI, set to 0 if not used
- * @port_num: [IN] port number + [channel id]
+ * @flags: [IN] hypercall flags + [channel id]
  * @magic: [IN] hypervisor magic value
  * @bp:  [IN]
  * @eax: [OUT] value of EAX register
 #ifdef __x86_64__
 
 #define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di,     \
-                       port_num, magic, bp,            \
+                       flags, magic, bp,               \
                        eax, ebx, ecx, edx, si, di)     \
 ({                                                     \
        asm volatile ("push %%rbp;"                     \
                "mov %12, %%rbp;"                       \
-               "rep outsb;"                            \
+               VMWARE_HYPERCALL_HB_OUT                 \
                "pop %%rbp;" :                          \
                "=a"(eax),                              \
                "=b"(ebx),                              \
                "a"(magic),                             \
                "b"(cmd),                               \
                "c"(in_ecx),                            \
-               "d"(port_num),                          \
+               "d"(flags),                             \
                "S"(in_si),                             \
                "D"(in_di),                             \
                "r"(bp) :                               \
 
 
 #define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di,      \
-                      port_num, magic, bp,             \
+                      flags, magic, bp,                \
                       eax, ebx, ecx, edx, si, di)      \
 ({                                                     \
        asm volatile ("push %%rbp;"                     \
                "mov %12, %%rbp;"                       \
-               "rep insb;"                             \
+               VMWARE_HYPERCALL_HB_IN                  \
                "pop %%rbp" :                           \
                "=a"(eax),                              \
                "=b"(ebx),                              \
                "a"(magic),                             \
                "b"(cmd),                               \
                "c"(in_ecx),                            \
-               "d"(port_num),                          \
+               "d"(flags),                             \
                "S"(in_si),                             \
                "D"(in_di),                             \
                "r"(bp) :                               \
  * just pushed it.
  */
 #define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di,     \
-                       port_num, magic, bp,            \
+                       flags, magic, bp,               \
                        eax, ebx, ecx, edx, si, di)     \
 ({                                                     \
        asm volatile ("push %12;"                       \
                "push %%ebp;"                           \
                "mov 0x04(%%esp), %%ebp;"               \
-               "rep outsb;"                            \
+               VMWARE_HYPERCALL_HB_OUT                 \
                "pop %%ebp;"                            \
                "add $0x04, %%esp;" :                   \
                "=a"(eax),                              \
                "a"(magic),                             \
                "b"(cmd),                               \
                "c"(in_ecx),                            \
-               "d"(port_num),                          \
+               "d"(flags),                             \
                "S"(in_si),                             \
                "D"(in_di),                             \
                "m"(bp) :                               \
 
 
 #define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di,      \
-                      port_num, magic, bp,             \
+                      flags, magic, bp,                \
                       eax, ebx, ecx, edx, si, di)      \
 ({                                                     \
        asm volatile ("push %12;"                       \
                "push %%ebp;"                           \
                "mov 0x04(%%esp), %%ebp;"               \
-               "rep insb;"                             \
+               VMWARE_HYPERCALL_HB_IN                  \
                "pop %%ebp;"                            \
                "add $0x04, %%esp;" :                   \
                "=a"(eax),                              \
                "a"(magic),                             \
                "b"(cmd),                               \
                "c"(in_ecx),                            \
-               "d"(port_num),                          \
+               "d"(flags),                             \
                "S"(in_si),                             \
                "D"(in_di),                             \
                "m"(bp) :                               \