/* * VMware hypercall ABI. * * - Low bandwidth (LB) hypercalls (I/O port based, vmcall and vmmcall) * have up to 6 input and 6 output arguments passed and returned using * registers: %eax (arg0), %ebx (arg1), %ecx (arg2), %edx (arg3), * %esi (arg4), %edi (arg5). * The following input arguments must be initialized by the caller: * arg0 - VMWARE_HYPERVISOR_MAGIC * arg2 - Hypercall command * arg3 bits [15:0] - Port number, LB and direction flags * * - Low bandwidth TDX hypercalls (x86_64 only) are similar to LB * hypercalls. They also have up to 6 input and 6 output on registers * arguments, with different argument to register mapping: * %r12 (arg0), %rbx (arg1), %r13 (arg2), %rdx (arg3), * %rsi (arg4), %rdi (arg5). * * - High bandwidth (HB) hypercalls are I/O port based only. They have * up to 7 input and 7 output arguments passed and returned using * registers: %eax (arg0), %ebx (arg1), %ecx (arg2), %edx (arg3), * %esi (arg4), %edi (arg5), %ebp (arg6). * The following input arguments must be initialized by the caller: * arg0 - VMWARE_HYPERVISOR_MAGIC * arg1 - Hypercall command * arg3 bits [15:0] - Port number, HB and direction flags * * For compatibility purposes, x86_64 systems use only lower 32 bits * for input and output arguments. * * The hypercall definitions differ in the low word of the %edx (arg3) * in the following way: the old I/O port based interface uses the port * number to distinguish between high- and low bandwidth versions, and * uses IN/OUT instructions to define transfer direction. * * The new vmcall interface instead uses a set of flags to select * bandwidth mode and transfer direction. The flags should be loaded * into arg3 by any user and are automatically replaced by the port * number if the I/O port method is used.
*/
/* * The low bandwidth call. The low word of %edx is presumed to have OUT bit * set. The high word of %edx may contain input data from the caller.
*/ #define VMWARE_HYPERCALL \
ALTERNATIVE_2("movw %[port], %%dx\n\t" \ "inl (%%dx), %%eax", \ "vmcall", X86_FEATURE_VMCALL, \ "vmmcall", X86_FEATURE_VMW_VMMCALL)
/* * High bandwidth calls are not supported on encrypted memory guests. * The caller should check cc_platform_has(CC_ATTR_MEM_ENCRYPT) and use * low bandwidth hypercall if memory encryption is set. * This assumption simplifies HB hypercall implementation to just I/O port * based approach without alternative patching.
*/ staticinline unsignedlong vmware_hypercall_hb_out(unsignedlong cmd, unsignedlong in2, unsignedlong in3, unsignedlong in4, unsignedlong in5, unsignedlong in6,
u32 *out1)
{ unsignedlong out0;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.