Merge tag 'hyperv-fixes-signed' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / x86 / include / asm / vmware.h
1 /* SPDX-License-Identifier: GPL-2.0 or MIT */
2 #ifndef _ASM_X86_VMWARE_H
3 #define _ASM_X86_VMWARE_H
4
5 #include <asm/cpufeatures.h>
6 #include <asm/alternative.h>
7 #include <linux/stringify.h>
8
9 /*
10  * The hypercall definitions differ in the low word of the %edx argument
11  * in the following way: the old port base interface uses the port
12  * number to distinguish between high- and low bandwidth versions.
13  *
14  * The new vmcall interface instead uses a set of flags to select
15  * bandwidth mode and transfer direction. The flags should be loaded
16  * into %dx by any user and are automatically replaced by the port
17  * number if the VMWARE_HYPERVISOR_PORT method is used.
18  *
19  * In short, new driver code should strictly use the new definition of
20  * %dx content.
21  */
22
23 /* Old port-based version */
24 #define VMWARE_HYPERVISOR_PORT    0x5658
25 #define VMWARE_HYPERVISOR_PORT_HB 0x5659
26
27 /* Current vmcall / vmmcall version */
28 #define VMWARE_HYPERVISOR_HB   BIT(0)
29 #define VMWARE_HYPERVISOR_OUT  BIT(1)
30
31 /* The low bandwidth call. The low word of edx is presumed clear. */
32 #define VMWARE_HYPERCALL                                                \
33         ALTERNATIVE_2("movw $" __stringify(VMWARE_HYPERVISOR_PORT) ", %%dx; " \
34                       "inl (%%dx), %%eax",                              \
35                       "vmcall", X86_FEATURE_VMCALL,                     \
36                       "vmmcall", X86_FEATURE_VMW_VMMCALL)
37
38 /*
39  * The high bandwidth out call. The low word of edx is presumed to have the
40  * HB and OUT bits set.
41  */
42 #define VMWARE_HYPERCALL_HB_OUT                                         \
43         ALTERNATIVE_2("movw $" __stringify(VMWARE_HYPERVISOR_PORT_HB) ", %%dx; " \
44                       "rep outsb",                                      \
45                       "vmcall", X86_FEATURE_VMCALL,                     \
46                       "vmmcall", X86_FEATURE_VMW_VMMCALL)
47
48 /*
49  * The high bandwidth in call. The low word of edx is presumed to have the
50  * HB bit set.
51  */
52 #define VMWARE_HYPERCALL_HB_IN                                          \
53         ALTERNATIVE_2("movw $" __stringify(VMWARE_HYPERVISOR_PORT_HB) ", %%dx; " \
54                       "rep insb",                                       \
55                       "vmcall", X86_FEATURE_VMCALL,                     \
56                       "vmmcall", X86_FEATURE_VMW_VMMCALL)
57 #endif