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 |
58 | |