58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 or MIT */
 | |
| #ifndef _ASM_X86_VMWARE_H
 | |
| #define _ASM_X86_VMWARE_H
 | |
| 
 | |
| #include <asm/cpufeatures.h>
 | |
| #include <asm/alternative.h>
 | |
| #include <linux/stringify.h>
 | |
| 
 | |
| /*
 | |
|  * The hypercall definitions differ in the low word of the %edx argument
 | |
|  * in the following way: the old port base interface uses the port
 | |
|  * number to distinguish between high- and low bandwidth versions.
 | |
|  *
 | |
|  * The new vmcall interface instead uses a set of flags to select
 | |
|  * bandwidth mode and transfer direction. The flags should be loaded
 | |
|  * into %dx by any user and are automatically replaced by the port
 | |
|  * number if the VMWARE_HYPERVISOR_PORT method is used.
 | |
|  *
 | |
|  * In short, new driver code should strictly use the new definition of
 | |
|  * %dx content.
 | |
|  */
 | |
| 
 | |
| /* Old port-based version */
 | |
| #define VMWARE_HYPERVISOR_PORT    0x5658
 | |
| #define VMWARE_HYPERVISOR_PORT_HB 0x5659
 | |
| 
 | |
| /* Current vmcall / vmmcall version */
 | |
| #define VMWARE_HYPERVISOR_HB   BIT(0)
 | |
| #define VMWARE_HYPERVISOR_OUT  BIT(1)
 | |
| 
 | |
| /* The low bandwidth call. The low word of edx is presumed clear. */
 | |
| #define VMWARE_HYPERCALL						\
 | |
| 	ALTERNATIVE_2("movw $" __stringify(VMWARE_HYPERVISOR_PORT) ", %%dx; " \
 | |
| 		      "inl (%%dx), %%eax",				\
 | |
| 		      "vmcall", X86_FEATURE_VMCALL,			\
 | |
| 		      "vmmcall", X86_FEATURE_VMW_VMMCALL)
 | |
| 
 | |
| /*
 | |
|  * The high bandwidth out call. The low word of edx is presumed to have the
 | |
|  * HB and OUT bits set.
 | |
|  */
 | |
| #define VMWARE_HYPERCALL_HB_OUT						\
 | |
| 	ALTERNATIVE_2("movw $" __stringify(VMWARE_HYPERVISOR_PORT_HB) ", %%dx; " \
 | |
| 		      "rep outsb",					\
 | |
| 		      "vmcall", X86_FEATURE_VMCALL,			\
 | |
| 		      "vmmcall", X86_FEATURE_VMW_VMMCALL)
 | |
| 
 | |
| /*
 | |
|  * The high bandwidth in call. The low word of edx is presumed to have the
 | |
|  * HB bit set.
 | |
|  */
 | |
| #define VMWARE_HYPERCALL_HB_IN						\
 | |
| 	ALTERNATIVE_2("movw $" __stringify(VMWARE_HYPERVISOR_PORT_HB) ", %%dx; " \
 | |
| 		      "rep insb",					\
 | |
| 		      "vmcall", X86_FEATURE_VMCALL,			\
 | |
| 		      "vmmcall", X86_FEATURE_VMW_VMMCALL)
 | |
| #endif
 |