1*41ec0267Sriastradh /* $NetBSD: vmwgfx_msg.h,v 1.2 2021/12/18 23:45:45 riastradh Exp $ */ 24e390cabSriastradh 34e390cabSriastradh /* SPDX-License-Identifier: GPL-2.0+ OR MIT */ 44e390cabSriastradh /************************************************************************** 54e390cabSriastradh * 64e390cabSriastradh * Copyright 2016 VMware, Inc., Palo Alto, CA., USA 74e390cabSriastradh * 84e390cabSriastradh * Permission is hereby granted, free of charge, to any person obtaining a 94e390cabSriastradh * copy of this software and associated documentation files (the 104e390cabSriastradh * "Software"), to deal in the Software without restriction, including 114e390cabSriastradh * without limitation the rights to use, copy, modify, merge, publish, 124e390cabSriastradh * distribute, sub license, and/or sell copies of the Software, and to 134e390cabSriastradh * permit persons to whom the Software is furnished to do so, subject to 144e390cabSriastradh * the following conditions: 154e390cabSriastradh * 164e390cabSriastradh * The above copyright notice and this permission notice (including the 174e390cabSriastradh * next paragraph) shall be included in all copies or substantial portions 184e390cabSriastradh * of the Software. 194e390cabSriastradh * 204e390cabSriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 214e390cabSriastradh * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 224e390cabSriastradh * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 234e390cabSriastradh * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 244e390cabSriastradh * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 254e390cabSriastradh * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 264e390cabSriastradh * USE OR OTHER DEALINGS IN THE SOFTWARE. 274e390cabSriastradh * 284e390cabSriastradh ************************************************************************** 294e390cabSriastradh * 304e390cabSriastradh * Based on code from vmware.c and vmmouse.c. 314e390cabSriastradh * Author: 324e390cabSriastradh * Sinclair Yeh <syeh@vmware.com> 334e390cabSriastradh */ 344e390cabSriastradh #ifndef _VMWGFX_MSG_H 354e390cabSriastradh #define _VMWGFX_MSG_H 364e390cabSriastradh 374e390cabSriastradh #include <asm/vmware.h> 384e390cabSriastradh 394e390cabSriastradh /** 404e390cabSriastradh * Hypervisor-specific bi-directional communication channel. Should never 414e390cabSriastradh * execute on bare metal hardware. The caller must make sure to check for 424e390cabSriastradh * supported hypervisor before using these macros. 434e390cabSriastradh * 444e390cabSriastradh * The last two parameters are both input and output and must be initialized. 454e390cabSriastradh * 464e390cabSriastradh * @cmd: [IN] Message Cmd 474e390cabSriastradh * @in_ebx: [IN] Message Len, through EBX 484e390cabSriastradh * @in_si: [IN] Input argument through SI, set to 0 if not used 494e390cabSriastradh * @in_di: [IN] Input argument through DI, set ot 0 if not used 504e390cabSriastradh * @flags: [IN] hypercall flags + [channel id] 514e390cabSriastradh * @magic: [IN] hypervisor magic value 524e390cabSriastradh * @eax: [OUT] value of EAX register 534e390cabSriastradh * @ebx: [OUT] e.g. status from an HB message status command 544e390cabSriastradh * @ecx: [OUT] e.g. status from a non-HB message status command 554e390cabSriastradh * @edx: [OUT] e.g. channel id 564e390cabSriastradh * @si: [OUT] 574e390cabSriastradh * @di: [OUT] 584e390cabSriastradh */ 594e390cabSriastradh #define VMW_PORT(cmd, in_ebx, in_si, in_di, \ 604e390cabSriastradh flags, magic, \ 614e390cabSriastradh eax, ebx, ecx, edx, si, di) \ 624e390cabSriastradh ({ \ 634e390cabSriastradh asm volatile (VMWARE_HYPERCALL : \ 644e390cabSriastradh "=a"(eax), \ 654e390cabSriastradh "=b"(ebx), \ 664e390cabSriastradh "=c"(ecx), \ 674e390cabSriastradh "=d"(edx), \ 684e390cabSriastradh "=S"(si), \ 694e390cabSriastradh "=D"(di) : \ 704e390cabSriastradh "a"(magic), \ 714e390cabSriastradh "b"(in_ebx), \ 724e390cabSriastradh "c"(cmd), \ 734e390cabSriastradh "d"(flags), \ 744e390cabSriastradh "S"(in_si), \ 754e390cabSriastradh "D"(in_di) : \ 764e390cabSriastradh "memory"); \ 774e390cabSriastradh }) 784e390cabSriastradh 794e390cabSriastradh 804e390cabSriastradh /** 814e390cabSriastradh * Hypervisor-specific bi-directional communication channel. Should never 824e390cabSriastradh * execute on bare metal hardware. The caller must make sure to check for 834e390cabSriastradh * supported hypervisor before using these macros. 844e390cabSriastradh * 854e390cabSriastradh * The last 3 parameters are both input and output and must be initialized. 864e390cabSriastradh * 874e390cabSriastradh * @cmd: [IN] Message Cmd 884e390cabSriastradh * @in_ecx: [IN] Message Len, through ECX 894e390cabSriastradh * @in_si: [IN] Input argument through SI, set to 0 if not used 904e390cabSriastradh * @in_di: [IN] Input argument through DI, set to 0 if not used 914e390cabSriastradh * @flags: [IN] hypercall flags + [channel id] 924e390cabSriastradh * @magic: [IN] hypervisor magic value 934e390cabSriastradh * @bp: [IN] 944e390cabSriastradh * @eax: [OUT] value of EAX register 954e390cabSriastradh * @ebx: [OUT] e.g. status from an HB message status command 964e390cabSriastradh * @ecx: [OUT] e.g. status from a non-HB message status command 974e390cabSriastradh * @edx: [OUT] e.g. channel id 984e390cabSriastradh * @si: [OUT] 994e390cabSriastradh * @di: [OUT] 1004e390cabSriastradh */ 1014e390cabSriastradh #ifdef __x86_64__ 1024e390cabSriastradh 1034e390cabSriastradh #define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di, \ 1044e390cabSriastradh flags, magic, bp, \ 1054e390cabSriastradh eax, ebx, ecx, edx, si, di) \ 1064e390cabSriastradh ({ \ 1074e390cabSriastradh asm volatile ("push %%rbp;" \ 1084e390cabSriastradh "mov %12, %%rbp;" \ 1094e390cabSriastradh VMWARE_HYPERCALL_HB_OUT \ 1104e390cabSriastradh "pop %%rbp;" : \ 1114e390cabSriastradh "=a"(eax), \ 1124e390cabSriastradh "=b"(ebx), \ 1134e390cabSriastradh "=c"(ecx), \ 1144e390cabSriastradh "=d"(edx), \ 1154e390cabSriastradh "=S"(si), \ 1164e390cabSriastradh "=D"(di) : \ 1174e390cabSriastradh "a"(magic), \ 1184e390cabSriastradh "b"(cmd), \ 1194e390cabSriastradh "c"(in_ecx), \ 1204e390cabSriastradh "d"(flags), \ 1214e390cabSriastradh "S"(in_si), \ 1224e390cabSriastradh "D"(in_di), \ 1234e390cabSriastradh "r"(bp) : \ 1244e390cabSriastradh "memory", "cc"); \ 1254e390cabSriastradh }) 1264e390cabSriastradh 1274e390cabSriastradh 1284e390cabSriastradh #define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di, \ 1294e390cabSriastradh flags, magic, bp, \ 1304e390cabSriastradh eax, ebx, ecx, edx, si, di) \ 1314e390cabSriastradh ({ \ 1324e390cabSriastradh asm volatile ("push %%rbp;" \ 1334e390cabSriastradh "mov %12, %%rbp;" \ 1344e390cabSriastradh VMWARE_HYPERCALL_HB_IN \ 1354e390cabSriastradh "pop %%rbp" : \ 1364e390cabSriastradh "=a"(eax), \ 1374e390cabSriastradh "=b"(ebx), \ 1384e390cabSriastradh "=c"(ecx), \ 1394e390cabSriastradh "=d"(edx), \ 1404e390cabSriastradh "=S"(si), \ 1414e390cabSriastradh "=D"(di) : \ 1424e390cabSriastradh "a"(magic), \ 1434e390cabSriastradh "b"(cmd), \ 1444e390cabSriastradh "c"(in_ecx), \ 1454e390cabSriastradh "d"(flags), \ 1464e390cabSriastradh "S"(in_si), \ 1474e390cabSriastradh "D"(in_di), \ 1484e390cabSriastradh "r"(bp) : \ 1494e390cabSriastradh "memory", "cc"); \ 1504e390cabSriastradh }) 1514e390cabSriastradh 1524e390cabSriastradh #else 1534e390cabSriastradh 1544e390cabSriastradh /* 1554e390cabSriastradh * In the 32-bit version of this macro, we store bp in a memory location 1564e390cabSriastradh * because we've ran out of registers. 1574e390cabSriastradh * Now we can't reference that memory location while we've modified 1584e390cabSriastradh * %esp or %ebp, so we first push it on the stack, just before we push 1594e390cabSriastradh * %ebp, and then when we need it we read it from the stack where we 1604e390cabSriastradh * just pushed it. 1614e390cabSriastradh */ 1624e390cabSriastradh #define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di, \ 1634e390cabSriastradh flags, magic, bp, \ 1644e390cabSriastradh eax, ebx, ecx, edx, si, di) \ 1654e390cabSriastradh ({ \ 1664e390cabSriastradh asm volatile ("push %12;" \ 1674e390cabSriastradh "push %%ebp;" \ 1684e390cabSriastradh "mov 0x04(%%esp), %%ebp;" \ 1694e390cabSriastradh VMWARE_HYPERCALL_HB_OUT \ 1704e390cabSriastradh "pop %%ebp;" \ 1714e390cabSriastradh "add $0x04, %%esp;" : \ 1724e390cabSriastradh "=a"(eax), \ 1734e390cabSriastradh "=b"(ebx), \ 1744e390cabSriastradh "=c"(ecx), \ 1754e390cabSriastradh "=d"(edx), \ 1764e390cabSriastradh "=S"(si), \ 1774e390cabSriastradh "=D"(di) : \ 1784e390cabSriastradh "a"(magic), \ 1794e390cabSriastradh "b"(cmd), \ 1804e390cabSriastradh "c"(in_ecx), \ 1814e390cabSriastradh "d"(flags), \ 1824e390cabSriastradh "S"(in_si), \ 1834e390cabSriastradh "D"(in_di), \ 1844e390cabSriastradh "m"(bp) : \ 1854e390cabSriastradh "memory", "cc"); \ 1864e390cabSriastradh }) 1874e390cabSriastradh 1884e390cabSriastradh 1894e390cabSriastradh #define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di, \ 1904e390cabSriastradh flags, magic, bp, \ 1914e390cabSriastradh eax, ebx, ecx, edx, si, di) \ 1924e390cabSriastradh ({ \ 1934e390cabSriastradh asm volatile ("push %12;" \ 1944e390cabSriastradh "push %%ebp;" \ 1954e390cabSriastradh "mov 0x04(%%esp), %%ebp;" \ 1964e390cabSriastradh VMWARE_HYPERCALL_HB_IN \ 1974e390cabSriastradh "pop %%ebp;" \ 1984e390cabSriastradh "add $0x04, %%esp;" : \ 1994e390cabSriastradh "=a"(eax), \ 2004e390cabSriastradh "=b"(ebx), \ 2014e390cabSriastradh "=c"(ecx), \ 2024e390cabSriastradh "=d"(edx), \ 2034e390cabSriastradh "=S"(si), \ 2044e390cabSriastradh "=D"(di) : \ 2054e390cabSriastradh "a"(magic), \ 2064e390cabSriastradh "b"(cmd), \ 2074e390cabSriastradh "c"(in_ecx), \ 2084e390cabSriastradh "d"(flags), \ 2094e390cabSriastradh "S"(in_si), \ 2104e390cabSriastradh "D"(in_di), \ 2114e390cabSriastradh "m"(bp) : \ 2124e390cabSriastradh "memory", "cc"); \ 2134e390cabSriastradh }) 2144e390cabSriastradh #endif /* #if __x86_64__ */ 2154e390cabSriastradh 2164e390cabSriastradh #endif 217