-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/vmware: Add a header file for hypercall definitions
The new header is intended to be used by drivers using the backdoor. Follow the KVM example using alternatives self-patching to choose between vmcall, vmmcall and io instructions. Also define two new CPU feature flags to indicate hypervisor support for vmcall- and vmmcall instructions. The new XF86_FEATURE_VMW_VMMCALL flag is needed because using XF86_FEATURE_VMMCALL might break QEMU/KVM setups using the vmmouse driver. They rely on XF86_FEATURE_VMMCALL on AMD to get the kvm_hypercall() right. But they do not yet implement vmmcall for the VMware hypercall used by the vmmouse driver. [ bp: reflow hypercall %edx usage explanation comment. ] Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Doug Covelli <dcovelli@vmware.com> Cc: Aaron Lewis <aaronlewis@google.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: linux-graphics-maintainer@vmware.com Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> Cc: Nicolas Ferre <nicolas.ferre@microchip.com> Cc: Robert Hoo <robert.hu@linux.intel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: virtualization@lists.linux-foundation.org Cc: <pv-drivers@vmware.com> Cc: x86-ml <x86@kernel.org> Link: https://lkml.kernel.org/r/20190828080353.12658-3-thomas_os@shipmail.org
- Loading branch information
Thomas Hellstrom
authored and
Borislav Petkov
committed
Aug 28, 2019
1 parent
bac7b4e
commit b4dd4f6
Showing
4 changed files
with
61 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/* 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> | ||
|
||
/* | ||
* 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 $" VMWARE_HYPERVISOR_PORT ", %%dx; inl (%%dx)", \ | ||
"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 $" 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 $" VMWARE_HYPERVISOR_PORT_HB ", %%dx; rep insb", \ | ||
"vmcall", X86_FEATURE_VMCALL, \ | ||
"vmmcall", X86_FEATURE_VMW_VMMCALL) | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters