1d9c52522SMasahiro Yamada /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR CDDL-1.0) */ 2f6ddd094SHans de Goede /* 3f6ddd094SHans de Goede * Virtual Device for Guest <-> VMM/Host communication, type definitions 4f6ddd094SHans de Goede * which are also used for the vboxguest ioctl interface / by vboxsf 5f6ddd094SHans de Goede * 6f6ddd094SHans de Goede * Copyright (C) 2006-2016 Oracle Corporation 7f6ddd094SHans de Goede */ 8f6ddd094SHans de Goede 9f6ddd094SHans de Goede #ifndef __UAPI_VBOX_VMMDEV_TYPES_H__ 10f6ddd094SHans de Goede #define __UAPI_VBOX_VMMDEV_TYPES_H__ 11f6ddd094SHans de Goede 12f6ddd094SHans de Goede #include <asm/bitsperlong.h> 13f6ddd094SHans de Goede #include <linux/types.h> 14f6ddd094SHans de Goede 15f6ddd094SHans de Goede /* 16f6ddd094SHans de Goede * We cannot use linux' compiletime_assert here because it expects to be used 17f6ddd094SHans de Goede * inside a function only. Use a typedef to a char array with a negative size. 18f6ddd094SHans de Goede */ 19f6ddd094SHans de Goede #define VMMDEV_ASSERT_SIZE(type, size) \ 20f6ddd094SHans de Goede typedef char type ## _asrt_size[1 - 2*!!(sizeof(struct type) != (size))] 21f6ddd094SHans de Goede 22f6ddd094SHans de Goede /** enum vmmdev_request_type - VMMDev request types. */ 23f6ddd094SHans de Goede enum vmmdev_request_type { 24f6ddd094SHans de Goede VMMDEVREQ_INVALID_REQUEST = 0, 25f6ddd094SHans de Goede VMMDEVREQ_GET_MOUSE_STATUS = 1, 26f6ddd094SHans de Goede VMMDEVREQ_SET_MOUSE_STATUS = 2, 27f6ddd094SHans de Goede VMMDEVREQ_SET_POINTER_SHAPE = 3, 28f6ddd094SHans de Goede VMMDEVREQ_GET_HOST_VERSION = 4, 29f6ddd094SHans de Goede VMMDEVREQ_IDLE = 5, 30f6ddd094SHans de Goede VMMDEVREQ_GET_HOST_TIME = 10, 31f6ddd094SHans de Goede VMMDEVREQ_GET_HYPERVISOR_INFO = 20, 32f6ddd094SHans de Goede VMMDEVREQ_SET_HYPERVISOR_INFO = 21, 33f6ddd094SHans de Goede VMMDEVREQ_REGISTER_PATCH_MEMORY = 22, /* since version 3.0.6 */ 34f6ddd094SHans de Goede VMMDEVREQ_DEREGISTER_PATCH_MEMORY = 23, /* since version 3.0.6 */ 35f6ddd094SHans de Goede VMMDEVREQ_SET_POWER_STATUS = 30, 36f6ddd094SHans de Goede VMMDEVREQ_ACKNOWLEDGE_EVENTS = 41, 37f6ddd094SHans de Goede VMMDEVREQ_CTL_GUEST_FILTER_MASK = 42, 38f6ddd094SHans de Goede VMMDEVREQ_REPORT_GUEST_INFO = 50, 39f6ddd094SHans de Goede VMMDEVREQ_REPORT_GUEST_INFO2 = 58, /* since version 3.2.0 */ 40f6ddd094SHans de Goede VMMDEVREQ_REPORT_GUEST_STATUS = 59, /* since version 3.2.8 */ 41f6ddd094SHans de Goede VMMDEVREQ_REPORT_GUEST_USER_STATE = 74, /* since version 4.3 */ 42f6ddd094SHans de Goede /* Retrieve a display resize request sent by the host, deprecated. */ 43f6ddd094SHans de Goede VMMDEVREQ_GET_DISPLAY_CHANGE_REQ = 51, 44f6ddd094SHans de Goede VMMDEVREQ_VIDEMODE_SUPPORTED = 52, 45f6ddd094SHans de Goede VMMDEVREQ_GET_HEIGHT_REDUCTION = 53, 46f6ddd094SHans de Goede /** 47f6ddd094SHans de Goede * @VMMDEVREQ_GET_DISPLAY_CHANGE_REQ2: 48f6ddd094SHans de Goede * Retrieve a display resize request sent by the host. 49f6ddd094SHans de Goede * 50f6ddd094SHans de Goede * Queries a display resize request sent from the host. If the 51f6ddd094SHans de Goede * event_ack member is sent to true and there is an unqueried request 52f6ddd094SHans de Goede * available for one of the virtual display then that request will 53f6ddd094SHans de Goede * be returned. If several displays have unqueried requests the lowest 54f6ddd094SHans de Goede * numbered display will be chosen first. Only the most recent unseen 55f6ddd094SHans de Goede * request for each display is remembered. 56f6ddd094SHans de Goede * If event_ack is set to false, the last host request queried with 57f6ddd094SHans de Goede * event_ack set is resent, or failing that the most recent received 58f6ddd094SHans de Goede * from the host. If no host request was ever received then all zeros 59f6ddd094SHans de Goede * are returned. 60f6ddd094SHans de Goede */ 61f6ddd094SHans de Goede VMMDEVREQ_GET_DISPLAY_CHANGE_REQ2 = 54, 62f6ddd094SHans de Goede VMMDEVREQ_REPORT_GUEST_CAPABILITIES = 55, 63f6ddd094SHans de Goede VMMDEVREQ_SET_GUEST_CAPABILITIES = 56, 64f6ddd094SHans de Goede VMMDEVREQ_VIDEMODE_SUPPORTED2 = 57, /* since version 3.2.0 */ 65f6ddd094SHans de Goede VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX = 80, /* since version 4.2.4 */ 66*316b0035SHans de Goede VMMDEVREQ_GET_DISPLAY_CHANGE_REQ_MULTI = 81, 67f6ddd094SHans de Goede VMMDEVREQ_HGCM_CONNECT = 60, 68f6ddd094SHans de Goede VMMDEVREQ_HGCM_DISCONNECT = 61, 69f6ddd094SHans de Goede VMMDEVREQ_HGCM_CALL32 = 62, 70f6ddd094SHans de Goede VMMDEVREQ_HGCM_CALL64 = 63, 71f6ddd094SHans de Goede VMMDEVREQ_HGCM_CANCEL = 64, 72f6ddd094SHans de Goede VMMDEVREQ_HGCM_CANCEL2 = 65, 73f6ddd094SHans de Goede VMMDEVREQ_VIDEO_ACCEL_ENABLE = 70, 74f6ddd094SHans de Goede VMMDEVREQ_VIDEO_ACCEL_FLUSH = 71, 75f6ddd094SHans de Goede VMMDEVREQ_VIDEO_SET_VISIBLE_REGION = 72, 76f6ddd094SHans de Goede VMMDEVREQ_GET_SEAMLESS_CHANGE_REQ = 73, 77f6ddd094SHans de Goede VMMDEVREQ_QUERY_CREDENTIALS = 100, 78f6ddd094SHans de Goede VMMDEVREQ_REPORT_CREDENTIALS_JUDGEMENT = 101, 79f6ddd094SHans de Goede VMMDEVREQ_REPORT_GUEST_STATS = 110, 80f6ddd094SHans de Goede VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ = 111, 81f6ddd094SHans de Goede VMMDEVREQ_GET_STATISTICS_CHANGE_REQ = 112, 82f6ddd094SHans de Goede VMMDEVREQ_CHANGE_MEMBALLOON = 113, 83f6ddd094SHans de Goede VMMDEVREQ_GET_VRDPCHANGE_REQ = 150, 84f6ddd094SHans de Goede VMMDEVREQ_LOG_STRING = 200, 85f6ddd094SHans de Goede VMMDEVREQ_GET_CPU_HOTPLUG_REQ = 210, 86f6ddd094SHans de Goede VMMDEVREQ_SET_CPU_HOTPLUG_STATUS = 211, 87f6ddd094SHans de Goede VMMDEVREQ_REGISTER_SHARED_MODULE = 212, 88f6ddd094SHans de Goede VMMDEVREQ_UNREGISTER_SHARED_MODULE = 213, 89f6ddd094SHans de Goede VMMDEVREQ_CHECK_SHARED_MODULES = 214, 90f6ddd094SHans de Goede VMMDEVREQ_GET_PAGE_SHARING_STATUS = 215, 91f6ddd094SHans de Goede VMMDEVREQ_DEBUG_IS_PAGE_SHARED = 216, 92f6ddd094SHans de Goede VMMDEVREQ_GET_SESSION_ID = 217, /* since version 3.2.8 */ 93f6ddd094SHans de Goede VMMDEVREQ_WRITE_COREDUMP = 218, 94f6ddd094SHans de Goede VMMDEVREQ_GUEST_HEARTBEAT = 219, 95f6ddd094SHans de Goede VMMDEVREQ_HEARTBEAT_CONFIGURE = 220, 96*316b0035SHans de Goede VMMDEVREQ_NT_BUG_CHECK = 221, 97*316b0035SHans de Goede VMMDEVREQ_VIDEO_UPDATE_MONITOR_POSITIONS = 222, 98f6ddd094SHans de Goede /* Ensure the enum is a 32 bit data-type */ 99f6ddd094SHans de Goede VMMDEVREQ_SIZEHACK = 0x7fffffff 100f6ddd094SHans de Goede }; 101f6ddd094SHans de Goede 102f6ddd094SHans de Goede #if __BITS_PER_LONG == 64 103f6ddd094SHans de Goede #define VMMDEVREQ_HGCM_CALL VMMDEVREQ_HGCM_CALL64 104f6ddd094SHans de Goede #else 105f6ddd094SHans de Goede #define VMMDEVREQ_HGCM_CALL VMMDEVREQ_HGCM_CALL32 106f6ddd094SHans de Goede #endif 107f6ddd094SHans de Goede 1080532a1b0SHans de Goede /* vmmdev_request_header.requestor defines */ 1090532a1b0SHans de Goede 1100532a1b0SHans de Goede /* Requestor user not given. */ 1110532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USR_NOT_GIVEN 0x00000000 1120532a1b0SHans de Goede /* The kernel driver (vboxguest) is the requestor. */ 1130532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USR_DRV 0x00000001 1140532a1b0SHans de Goede /* Some other kernel driver is the requestor. */ 1150532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USR_DRV_OTHER 0x00000002 1160532a1b0SHans de Goede /* The root or a admin user is the requestor. */ 1170532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USR_ROOT 0x00000003 1180532a1b0SHans de Goede /* Regular joe user is making the request. */ 1190532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USR_USER 0x00000006 1200532a1b0SHans de Goede /* User classification mask. */ 1210532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USR_MASK 0x00000007 1220532a1b0SHans de Goede 1230532a1b0SHans de Goede /* Kernel mode request. Note this is 0, check for !USERMODE instead. */ 1240532a1b0SHans de Goede #define VMMDEV_REQUESTOR_KERNEL 0x00000000 1250532a1b0SHans de Goede /* User mode request. */ 1260532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USERMODE 0x00000008 1270532a1b0SHans de Goede /* User or kernel mode classification mask. */ 1280532a1b0SHans de Goede #define VMMDEV_REQUESTOR_MODE_MASK 0x00000008 1290532a1b0SHans de Goede 1300532a1b0SHans de Goede /* Don't know the physical console association of the requestor. */ 1310532a1b0SHans de Goede #define VMMDEV_REQUESTOR_CON_DONT_KNOW 0x00000000 1320532a1b0SHans de Goede /* 1330532a1b0SHans de Goede * The request originates with a process that is NOT associated with the 1340532a1b0SHans de Goede * physical console. 1350532a1b0SHans de Goede */ 1360532a1b0SHans de Goede #define VMMDEV_REQUESTOR_CON_NO 0x00000010 1370532a1b0SHans de Goede /* Requestor process is associated with the physical console. */ 1380532a1b0SHans de Goede #define VMMDEV_REQUESTOR_CON_YES 0x00000020 1390532a1b0SHans de Goede /* Console classification mask. */ 1400532a1b0SHans de Goede #define VMMDEV_REQUESTOR_CON_MASK 0x00000030 1410532a1b0SHans de Goede 1420532a1b0SHans de Goede /* Requestor is member of special VirtualBox user group. */ 1430532a1b0SHans de Goede #define VMMDEV_REQUESTOR_GRP_VBOX 0x00000080 1440532a1b0SHans de Goede 1450532a1b0SHans de Goede /* Note: trust level is for windows guests only, linux always uses not-given */ 1460532a1b0SHans de Goede /* Requestor trust level: Unspecified */ 1470532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_NOT_GIVEN 0x00000000 1480532a1b0SHans de Goede /* Requestor trust level: Untrusted (SID S-1-16-0) */ 1490532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_UNTRUSTED 0x00001000 1500532a1b0SHans de Goede /* Requestor trust level: Untrusted (SID S-1-16-4096) */ 1510532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_LOW 0x00002000 1520532a1b0SHans de Goede /* Requestor trust level: Medium (SID S-1-16-8192) */ 1530532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_MEDIUM 0x00003000 1540532a1b0SHans de Goede /* Requestor trust level: Medium plus (SID S-1-16-8448) */ 1550532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_MEDIUM_PLUS 0x00004000 1560532a1b0SHans de Goede /* Requestor trust level: High (SID S-1-16-12288) */ 1570532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_HIGH 0x00005000 1580532a1b0SHans de Goede /* Requestor trust level: System (SID S-1-16-16384) */ 1590532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_SYSTEM 0x00006000 1600532a1b0SHans de Goede /* Requestor trust level >= Protected (SID S-1-16-20480, S-1-16-28672) */ 1610532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_PROTECTED 0x00007000 1620532a1b0SHans de Goede /* Requestor trust level mask */ 1630532a1b0SHans de Goede #define VMMDEV_REQUESTOR_TRUST_MASK 0x00007000 1640532a1b0SHans de Goede 1650532a1b0SHans de Goede /* Requestor is using the less trusted user device node (/dev/vboxuser) */ 1660532a1b0SHans de Goede #define VMMDEV_REQUESTOR_USER_DEVICE 0x00008000 1670532a1b0SHans de Goede 168f6ddd094SHans de Goede /** HGCM service location types. */ 169f6ddd094SHans de Goede enum vmmdev_hgcm_service_location_type { 170f6ddd094SHans de Goede VMMDEV_HGCM_LOC_INVALID = 0, 171f6ddd094SHans de Goede VMMDEV_HGCM_LOC_LOCALHOST = 1, 172f6ddd094SHans de Goede VMMDEV_HGCM_LOC_LOCALHOST_EXISTING = 2, 173f6ddd094SHans de Goede /* Ensure the enum is a 32 bit data-type */ 174f6ddd094SHans de Goede VMMDEV_HGCM_LOC_SIZEHACK = 0x7fffffff 175f6ddd094SHans de Goede }; 176f6ddd094SHans de Goede 177f6ddd094SHans de Goede /** HGCM host service location. */ 178f6ddd094SHans de Goede struct vmmdev_hgcm_service_location_localhost { 179f6ddd094SHans de Goede /** Service name */ 180f6ddd094SHans de Goede char service_name[128]; 181f6ddd094SHans de Goede }; 182f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_service_location_localhost, 128); 183f6ddd094SHans de Goede 184f6ddd094SHans de Goede /** HGCM service location. */ 185f6ddd094SHans de Goede struct vmmdev_hgcm_service_location { 186f6ddd094SHans de Goede /** Type of the location. */ 187f6ddd094SHans de Goede enum vmmdev_hgcm_service_location_type type; 188f6ddd094SHans de Goede 189f6ddd094SHans de Goede union { 190f6ddd094SHans de Goede struct vmmdev_hgcm_service_location_localhost localhost; 191f6ddd094SHans de Goede } u; 192f6ddd094SHans de Goede }; 193f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_service_location, 128 + 4); 194f6ddd094SHans de Goede 195f6ddd094SHans de Goede /** HGCM function parameter type. */ 196f6ddd094SHans de Goede enum vmmdev_hgcm_function_parameter_type { 197f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_INVALID = 0, 198f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_32BIT = 1, 199f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_64BIT = 2, 200f6ddd094SHans de Goede /** Deprecated Doesn't work, use PAGELIST. */ 201f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_PHYSADDR = 3, 202f6ddd094SHans de Goede /** In and Out, user-memory */ 203f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_LINADDR = 4, 204f6ddd094SHans de Goede /** In, user-memory (read; host<-guest) */ 205f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_LINADDR_IN = 5, 206f6ddd094SHans de Goede /** Out, user-memory (write; host->guest) */ 207f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_LINADDR_OUT = 6, 208f6ddd094SHans de Goede /** In and Out, kernel-memory */ 209f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_LINADDR_KERNEL = 7, 210f6ddd094SHans de Goede /** In, kernel-memory (read; host<-guest) */ 211f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_LINADDR_KERNEL_IN = 8, 212f6ddd094SHans de Goede /** Out, kernel-memory (write; host->guest) */ 213f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_LINADDR_KERNEL_OUT = 9, 214f6ddd094SHans de Goede /** Physical addresses of locked pages for a buffer. */ 215f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_PAGELIST = 10, 216f6ddd094SHans de Goede /* Ensure the enum is a 32 bit data-type */ 217f6ddd094SHans de Goede VMMDEV_HGCM_PARM_TYPE_SIZEHACK = 0x7fffffff 218f6ddd094SHans de Goede }; 219f6ddd094SHans de Goede 220f6ddd094SHans de Goede /** HGCM function parameter, 32-bit client. */ 221f6ddd094SHans de Goede struct vmmdev_hgcm_function_parameter32 { 222f6ddd094SHans de Goede enum vmmdev_hgcm_function_parameter_type type; 223f6ddd094SHans de Goede union { 224f6ddd094SHans de Goede __u32 value32; 225f6ddd094SHans de Goede __u64 value64; 226f6ddd094SHans de Goede struct { 227f6ddd094SHans de Goede __u32 size; 228f6ddd094SHans de Goede union { 229f6ddd094SHans de Goede __u32 phys_addr; 230f6ddd094SHans de Goede __u32 linear_addr; 231f6ddd094SHans de Goede } u; 232f6ddd094SHans de Goede } pointer; 233f6ddd094SHans de Goede struct { 234f6ddd094SHans de Goede /** Size of the buffer described by the page list. */ 235f6ddd094SHans de Goede __u32 size; 236f6ddd094SHans de Goede /** Relative to the request header. */ 237f6ddd094SHans de Goede __u32 offset; 238f6ddd094SHans de Goede } page_list; 239f6ddd094SHans de Goede } u; 240f6ddd094SHans de Goede } __packed; 241f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_function_parameter32, 4 + 8); 242f6ddd094SHans de Goede 243f6ddd094SHans de Goede /** HGCM function parameter, 64-bit client. */ 244f6ddd094SHans de Goede struct vmmdev_hgcm_function_parameter64 { 245f6ddd094SHans de Goede enum vmmdev_hgcm_function_parameter_type type; 246f6ddd094SHans de Goede union { 247f6ddd094SHans de Goede __u32 value32; 248f6ddd094SHans de Goede __u64 value64; 249f6ddd094SHans de Goede struct { 250f6ddd094SHans de Goede __u32 size; 251f6ddd094SHans de Goede union { 252f6ddd094SHans de Goede __u64 phys_addr; 253f6ddd094SHans de Goede __u64 linear_addr; 254f6ddd094SHans de Goede } u; 255f6ddd094SHans de Goede } __packed pointer; 256f6ddd094SHans de Goede struct { 257f6ddd094SHans de Goede /** Size of the buffer described by the page list. */ 258f6ddd094SHans de Goede __u32 size; 259f6ddd094SHans de Goede /** Relative to the request header. */ 260f6ddd094SHans de Goede __u32 offset; 261f6ddd094SHans de Goede } page_list; 262f6ddd094SHans de Goede } __packed u; 263f6ddd094SHans de Goede } __packed; 264f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_function_parameter64, 4 + 12); 265f6ddd094SHans de Goede 266f6ddd094SHans de Goede #if __BITS_PER_LONG == 64 267f6ddd094SHans de Goede #define vmmdev_hgcm_function_parameter vmmdev_hgcm_function_parameter64 268f6ddd094SHans de Goede #else 269f6ddd094SHans de Goede #define vmmdev_hgcm_function_parameter vmmdev_hgcm_function_parameter32 270f6ddd094SHans de Goede #endif 271f6ddd094SHans de Goede 272f6ddd094SHans de Goede #define VMMDEV_HGCM_F_PARM_DIRECTION_NONE 0x00000000U 273f6ddd094SHans de Goede #define VMMDEV_HGCM_F_PARM_DIRECTION_TO_HOST 0x00000001U 274f6ddd094SHans de Goede #define VMMDEV_HGCM_F_PARM_DIRECTION_FROM_HOST 0x00000002U 275f6ddd094SHans de Goede #define VMMDEV_HGCM_F_PARM_DIRECTION_BOTH 0x00000003U 276f6ddd094SHans de Goede 277f6ddd094SHans de Goede /** 278f6ddd094SHans de Goede * struct vmmdev_hgcm_pagelist - VMMDEV_HGCM_PARM_TYPE_PAGELIST parameters 279f6ddd094SHans de Goede * point to this structure to actually describe the buffer. 280f6ddd094SHans de Goede */ 281f6ddd094SHans de Goede struct vmmdev_hgcm_pagelist { 282f6ddd094SHans de Goede __u32 flags; /** VMMDEV_HGCM_F_PARM_*. */ 283f6ddd094SHans de Goede __u16 offset_first_page; /** Data offset in the first page. */ 284f6ddd094SHans de Goede __u16 page_count; /** Number of pages. */ 285f6ddd094SHans de Goede __u64 pages[1]; /** Page addresses. */ 286f6ddd094SHans de Goede }; 287f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_pagelist, 4 + 2 + 2 + 8); 288f6ddd094SHans de Goede 289f6ddd094SHans de Goede #endif 290