Commit 6abe3778 authored by Thomas Hellstrom's avatar Thomas Hellstrom Committed by Borislav Petkov

drm/vmwgfx: Update the backdoor call with support for new instructions

Use the definition provided by include/asm/vmware.h
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarDoug Covelli <dcovelli@vmware.com>
Acked-by: default avatarDave 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
parent b4dd4f6e
...@@ -46,8 +46,6 @@ ...@@ -46,8 +46,6 @@
#define RETRIES 3 #define RETRIES 3
#define VMW_HYPERVISOR_MAGIC 0x564D5868 #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_MSG 30
#define VMW_PORT_CMD_HB_MSG 0 #define VMW_PORT_CMD_HB_MSG 0
...@@ -93,7 +91,7 @@ static int vmw_open_channel(struct rpc_channel *channel, unsigned int protocol) ...@@ -93,7 +91,7 @@ static int vmw_open_channel(struct rpc_channel *channel, unsigned int protocol)
VMW_PORT(VMW_PORT_CMD_OPEN_CHANNEL, VMW_PORT(VMW_PORT_CMD_OPEN_CHANNEL,
(protocol | GUESTMSG_FLAG_COOKIE), si, di, (protocol | GUESTMSG_FLAG_COOKIE), si, di,
VMW_HYPERVISOR_PORT, 0,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -126,7 +124,7 @@ static int vmw_close_channel(struct rpc_channel *channel) ...@@ -126,7 +124,7 @@ static int vmw_close_channel(struct rpc_channel *channel)
VMW_PORT(VMW_PORT_CMD_CLOSE_CHANNEL, VMW_PORT(VMW_PORT_CMD_CLOSE_CHANNEL,
0, si, di, 0, si, di,
(VMW_HYPERVISOR_PORT | (channel->channel_id << 16)), channel->channel_id << 16,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -160,7 +158,8 @@ static unsigned long vmw_port_hb_out(struct rpc_channel *channel, ...@@ -160,7 +158,8 @@ static unsigned long vmw_port_hb_out(struct rpc_channel *channel,
VMW_PORT_HB_OUT( VMW_PORT_HB_OUT(
(MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG, (MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG,
msg_len, si, di, 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, VMW_HYPERVISOR_MAGIC, bp,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -181,7 +180,7 @@ static unsigned long vmw_port_hb_out(struct rpc_channel *channel, ...@@ -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), VMW_PORT(VMW_PORT_CMD_MSG | (MSG_TYPE_SENDPAYLOAD << 16),
word, si, di, word, si, di,
VMW_HYPERVISOR_PORT | (channel->channel_id << 16), channel->channel_id << 16,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
} }
...@@ -213,7 +212,7 @@ static unsigned long vmw_port_hb_in(struct rpc_channel *channel, char *reply, ...@@ -213,7 +212,7 @@ static unsigned long vmw_port_hb_in(struct rpc_channel *channel, char *reply,
VMW_PORT_HB_IN( VMW_PORT_HB_IN(
(MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG, (MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG,
reply_len, si, di, reply_len, si, di,
VMW_HYPERVISOR_HB_PORT | (channel->channel_id << 16), VMWARE_HYPERVISOR_HB | (channel->channel_id << 16),
VMW_HYPERVISOR_MAGIC, bp, VMW_HYPERVISOR_MAGIC, bp,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -230,7 +229,7 @@ static unsigned long vmw_port_hb_in(struct rpc_channel *channel, char *reply, ...@@ -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), VMW_PORT(VMW_PORT_CMD_MSG | (MSG_TYPE_RECVPAYLOAD << 16),
MESSAGE_STATUS_SUCCESS, si, di, MESSAGE_STATUS_SUCCESS, si, di,
VMW_HYPERVISOR_PORT | (channel->channel_id << 16), channel->channel_id << 16,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -269,7 +268,7 @@ static int vmw_send_msg(struct rpc_channel *channel, const char *msg) ...@@ -269,7 +268,7 @@ static int vmw_send_msg(struct rpc_channel *channel, const char *msg)
VMW_PORT(VMW_PORT_CMD_SENDSIZE, VMW_PORT(VMW_PORT_CMD_SENDSIZE,
msg_len, si, di, msg_len, si, di,
VMW_HYPERVISOR_PORT | (channel->channel_id << 16), channel->channel_id << 16,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -327,7 +326,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, ...@@ -327,7 +326,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg,
VMW_PORT(VMW_PORT_CMD_RECVSIZE, VMW_PORT(VMW_PORT_CMD_RECVSIZE,
0, si, di, 0, si, di,
(VMW_HYPERVISOR_PORT | (channel->channel_id << 16)), channel->channel_id << 16,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
...@@ -371,7 +370,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, ...@@ -371,7 +370,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg,
VMW_PORT(VMW_PORT_CMD_RECVSTATUS, VMW_PORT(VMW_PORT_CMD_RECVSTATUS,
MESSAGE_STATUS_SUCCESS, si, di, MESSAGE_STATUS_SUCCESS, si, di,
(VMW_HYPERVISOR_PORT | (channel->channel_id << 16)), channel->channel_id << 16,
VMW_HYPERVISOR_MAGIC, VMW_HYPERVISOR_MAGIC,
eax, ebx, ecx, edx, si, di); eax, ebx, ecx, edx, si, di);
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#ifndef _VMWGFX_MSG_H #ifndef _VMWGFX_MSG_H
#define _VMWGFX_MSG_H #define _VMWGFX_MSG_H
#include <asm/vmware.h>
/** /**
* Hypervisor-specific bi-directional communication channel. Should never * Hypervisor-specific bi-directional communication channel. Should never
...@@ -44,7 +45,7 @@ ...@@ -44,7 +45,7 @@
* @in_ebx: [IN] Message Len, through EBX * @in_ebx: [IN] Message Len, through EBX
* @in_si: [IN] Input argument through SI, set to 0 if not used * @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 * @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 * @magic: [IN] hypervisor magic value
* @eax: [OUT] value of EAX register * @eax: [OUT] value of EAX register
* @ebx: [OUT] e.g. status from an HB message status command * @ebx: [OUT] e.g. status from an HB message status command
...@@ -54,10 +55,10 @@ ...@@ -54,10 +55,10 @@
* @di: [OUT] * @di: [OUT]
*/ */
#define VMW_PORT(cmd, in_ebx, in_si, in_di, \ #define VMW_PORT(cmd, in_ebx, in_si, in_di, \
port_num, magic, \ flags, magic, \
eax, ebx, ecx, edx, si, di) \ eax, ebx, ecx, edx, si, di) \
({ \ ({ \
asm volatile ("inl %%dx, %%eax;" : \ asm volatile (VMWARE_HYPERCALL : \
"=a"(eax), \ "=a"(eax), \
"=b"(ebx), \ "=b"(ebx), \
"=c"(ecx), \ "=c"(ecx), \
...@@ -67,7 +68,7 @@ ...@@ -67,7 +68,7 @@
"a"(magic), \ "a"(magic), \
"b"(in_ebx), \ "b"(in_ebx), \
"c"(cmd), \ "c"(cmd), \
"d"(port_num), \ "d"(flags), \
"S"(in_si), \ "S"(in_si), \
"D"(in_di) : \ "D"(in_di) : \
"memory"); \ "memory"); \
...@@ -85,7 +86,7 @@ ...@@ -85,7 +86,7 @@
* @in_ecx: [IN] Message Len, through ECX * @in_ecx: [IN] Message Len, through ECX
* @in_si: [IN] Input argument through SI, set to 0 if not used * @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 * @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 * @magic: [IN] hypervisor magic value
* @bp: [IN] * @bp: [IN]
* @eax: [OUT] value of EAX register * @eax: [OUT] value of EAX register
...@@ -98,12 +99,12 @@ ...@@ -98,12 +99,12 @@
#ifdef __x86_64__ #ifdef __x86_64__
#define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di, \ #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) \ eax, ebx, ecx, edx, si, di) \
({ \ ({ \
asm volatile ("push %%rbp;" \ asm volatile ("push %%rbp;" \
"mov %12, %%rbp;" \ "mov %12, %%rbp;" \
"rep outsb;" \ VMWARE_HYPERCALL_HB_OUT \
"pop %%rbp;" : \ "pop %%rbp;" : \
"=a"(eax), \ "=a"(eax), \
"=b"(ebx), \ "=b"(ebx), \
...@@ -114,7 +115,7 @@ ...@@ -114,7 +115,7 @@
"a"(magic), \ "a"(magic), \
"b"(cmd), \ "b"(cmd), \
"c"(in_ecx), \ "c"(in_ecx), \
"d"(port_num), \ "d"(flags), \
"S"(in_si), \ "S"(in_si), \
"D"(in_di), \ "D"(in_di), \
"r"(bp) : \ "r"(bp) : \
...@@ -123,12 +124,12 @@ ...@@ -123,12 +124,12 @@
#define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di, \ #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) \ eax, ebx, ecx, edx, si, di) \
({ \ ({ \
asm volatile ("push %%rbp;" \ asm volatile ("push %%rbp;" \
"mov %12, %%rbp;" \ "mov %12, %%rbp;" \
"rep insb;" \ VMWARE_HYPERCALL_HB_IN \
"pop %%rbp" : \ "pop %%rbp" : \
"=a"(eax), \ "=a"(eax), \
"=b"(ebx), \ "=b"(ebx), \
...@@ -139,7 +140,7 @@ ...@@ -139,7 +140,7 @@
"a"(magic), \ "a"(magic), \
"b"(cmd), \ "b"(cmd), \
"c"(in_ecx), \ "c"(in_ecx), \
"d"(port_num), \ "d"(flags), \
"S"(in_si), \ "S"(in_si), \
"D"(in_di), \ "D"(in_di), \
"r"(bp) : \ "r"(bp) : \
...@@ -157,13 +158,13 @@ ...@@ -157,13 +158,13 @@
* just pushed it. * just pushed it.
*/ */
#define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di, \ #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) \ eax, ebx, ecx, edx, si, di) \
({ \ ({ \
asm volatile ("push %12;" \ asm volatile ("push %12;" \
"push %%ebp;" \ "push %%ebp;" \
"mov 0x04(%%esp), %%ebp;" \ "mov 0x04(%%esp), %%ebp;" \
"rep outsb;" \ VMWARE_HYPERCALL_HB_OUT \
"pop %%ebp;" \ "pop %%ebp;" \
"add $0x04, %%esp;" : \ "add $0x04, %%esp;" : \
"=a"(eax), \ "=a"(eax), \
...@@ -175,7 +176,7 @@ ...@@ -175,7 +176,7 @@
"a"(magic), \ "a"(magic), \
"b"(cmd), \ "b"(cmd), \
"c"(in_ecx), \ "c"(in_ecx), \
"d"(port_num), \ "d"(flags), \
"S"(in_si), \ "S"(in_si), \
"D"(in_di), \ "D"(in_di), \
"m"(bp) : \ "m"(bp) : \
...@@ -184,13 +185,13 @@ ...@@ -184,13 +185,13 @@
#define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di, \ #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) \ eax, ebx, ecx, edx, si, di) \
({ \ ({ \
asm volatile ("push %12;" \ asm volatile ("push %12;" \
"push %%ebp;" \ "push %%ebp;" \
"mov 0x04(%%esp), %%ebp;" \ "mov 0x04(%%esp), %%ebp;" \
"rep insb;" \ VMWARE_HYPERCALL_HB_IN \
"pop %%ebp;" \ "pop %%ebp;" \
"add $0x04, %%esp;" : \ "add $0x04, %%esp;" : \
"=a"(eax), \ "=a"(eax), \
...@@ -202,7 +203,7 @@ ...@@ -202,7 +203,7 @@
"a"(magic), \ "a"(magic), \
"b"(cmd), \ "b"(cmd), \
"c"(in_ecx), \ "c"(in_ecx), \
"d"(port_num), \ "d"(flags), \
"S"(in_si), \ "S"(in_si), \
"D"(in_di), \ "D"(in_di), \
"m"(bp) : \ "m"(bp) : \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment