b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 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 |