1d9c52522SMasahiro Yamada /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR CDDL-1.0) */ 2f6ddd094SHans de Goede /* 3f6ddd094SHans de Goede * VBoxGuest - VirtualBox Guest Additions Driver Interface. 4f6ddd094SHans de Goede * 5f6ddd094SHans de Goede * Copyright (C) 2006-2016 Oracle Corporation 6f6ddd094SHans de Goede */ 7f6ddd094SHans de Goede 8f6ddd094SHans de Goede #ifndef __UAPI_VBOXGUEST_H__ 9f6ddd094SHans de Goede #define __UAPI_VBOXGUEST_H__ 10f6ddd094SHans de Goede 11f6ddd094SHans de Goede #include <asm/bitsperlong.h> 12f6ddd094SHans de Goede #include <linux/ioctl.h> 13f6ddd094SHans de Goede #include <linux/vbox_err.h> 14f6ddd094SHans de Goede #include <linux/vbox_vmmdev_types.h> 15f6ddd094SHans de Goede 16f6ddd094SHans de Goede /* Version of vbg_ioctl_hdr structure. */ 17f6ddd094SHans de Goede #define VBG_IOCTL_HDR_VERSION 0x10001 18f6ddd094SHans de Goede /* Default request type. Use this for non-VMMDev requests. */ 19f6ddd094SHans de Goede #define VBG_IOCTL_HDR_TYPE_DEFAULT 0 20f6ddd094SHans de Goede 21f6ddd094SHans de Goede /** 22f6ddd094SHans de Goede * Common ioctl header. 23f6ddd094SHans de Goede * 24f6ddd094SHans de Goede * This is a mirror of vmmdev_request_header to prevent duplicating data and 25f6ddd094SHans de Goede * needing to verify things multiple times. 26f6ddd094SHans de Goede */ 27f6ddd094SHans de Goede struct vbg_ioctl_hdr { 28f6ddd094SHans de Goede /** IN: The request input size, and output size if size_out is zero. */ 29f6ddd094SHans de Goede __u32 size_in; 30f6ddd094SHans de Goede /** IN: Structure version (VBG_IOCTL_HDR_VERSION) */ 31f6ddd094SHans de Goede __u32 version; 32f6ddd094SHans de Goede /** IN: The VMMDev request type or VBG_IOCTL_HDR_TYPE_DEFAULT. */ 33f6ddd094SHans de Goede __u32 type; 34f6ddd094SHans de Goede /** 35f6ddd094SHans de Goede * OUT: The VBox status code of the operation, out direction only. 36f6ddd094SHans de Goede * This is a VINF_ or VERR_ value as defined in vbox_err.h. 37f6ddd094SHans de Goede */ 38f6ddd094SHans de Goede __s32 rc; 39f6ddd094SHans de Goede /** IN: Output size. Set to zero to use size_in as output size. */ 40f6ddd094SHans de Goede __u32 size_out; 41f6ddd094SHans de Goede /** Reserved, MBZ. */ 42f6ddd094SHans de Goede __u32 reserved; 43f6ddd094SHans de Goede }; 44f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_hdr, 24); 45f6ddd094SHans de Goede 46f6ddd094SHans de Goede 47f6ddd094SHans de Goede /* 48f6ddd094SHans de Goede * The VBoxGuest I/O control version. 49f6ddd094SHans de Goede * 50f6ddd094SHans de Goede * As usual, the high word contains the major version and changes to it 51f6ddd094SHans de Goede * signifies incompatible changes. 52f6ddd094SHans de Goede * 53f6ddd094SHans de Goede * The lower word is the minor version number, it is increased when new 54f6ddd094SHans de Goede * functions are added or existing changed in a backwards compatible manner. 55f6ddd094SHans de Goede */ 56f6ddd094SHans de Goede #define VBG_IOC_VERSION 0x00010000u 57f6ddd094SHans de Goede 58f6ddd094SHans de Goede /** 59f6ddd094SHans de Goede * VBG_IOCTL_DRIVER_VERSION_INFO data structure 60f6ddd094SHans de Goede * 61f6ddd094SHans de Goede * Note VBG_IOCTL_DRIVER_VERSION_INFO may switch the session to a backwards 62f6ddd094SHans de Goede * compatible interface version if uClientVersion indicates older client code. 63f6ddd094SHans de Goede */ 64f6ddd094SHans de Goede struct vbg_ioctl_driver_version_info { 65f6ddd094SHans de Goede /** The header. */ 66f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 67f6ddd094SHans de Goede union { 68f6ddd094SHans de Goede struct { 69f6ddd094SHans de Goede /** Requested interface version (VBG_IOC_VERSION). */ 70f6ddd094SHans de Goede __u32 req_version; 71f6ddd094SHans de Goede /** 72f6ddd094SHans de Goede * Minimum interface version number (typically the 73f6ddd094SHans de Goede * major version part of VBG_IOC_VERSION). 74f6ddd094SHans de Goede */ 75f6ddd094SHans de Goede __u32 min_version; 76f6ddd094SHans de Goede /** Reserved, MBZ. */ 77f6ddd094SHans de Goede __u32 reserved1; 78f6ddd094SHans de Goede /** Reserved, MBZ. */ 79f6ddd094SHans de Goede __u32 reserved2; 80f6ddd094SHans de Goede } in; 81f6ddd094SHans de Goede struct { 82f6ddd094SHans de Goede /** Version for this session (typ. VBG_IOC_VERSION). */ 83f6ddd094SHans de Goede __u32 session_version; 84f6ddd094SHans de Goede /** Version of the IDC interface (VBG_IOC_VERSION). */ 85f6ddd094SHans de Goede __u32 driver_version; 86f6ddd094SHans de Goede /** The SVN revision of the driver, or 0. */ 87f6ddd094SHans de Goede __u32 driver_revision; 88f6ddd094SHans de Goede /** Reserved \#1 (zero until defined). */ 89f6ddd094SHans de Goede __u32 reserved1; 90f6ddd094SHans de Goede /** Reserved \#2 (zero until defined). */ 91f6ddd094SHans de Goede __u32 reserved2; 92f6ddd094SHans de Goede } out; 93f6ddd094SHans de Goede } u; 94f6ddd094SHans de Goede }; 95f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_driver_version_info, 24 + 20); 96f6ddd094SHans de Goede 97f6ddd094SHans de Goede #define VBG_IOCTL_DRIVER_VERSION_INFO \ 98f6ddd094SHans de Goede _IOWR('V', 0, struct vbg_ioctl_driver_version_info) 99f6ddd094SHans de Goede 100f6ddd094SHans de Goede 101f6ddd094SHans de Goede /* IOCTL to perform a VMM Device request less than 1KB in size. */ 102f6ddd094SHans de Goede #define VBG_IOCTL_VMMDEV_REQUEST(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 2, s) 103f6ddd094SHans de Goede 104f6ddd094SHans de Goede 105f6ddd094SHans de Goede /* IOCTL to perform a VMM Device request larger then 1KB. */ 106f794db68SHans de Goede #define VBG_IOCTL_VMMDEV_REQUEST_BIG _IO('V', 3) 107f6ddd094SHans de Goede 108f6ddd094SHans de Goede 109f6ddd094SHans de Goede /** VBG_IOCTL_HGCM_CONNECT data structure. */ 110f6ddd094SHans de Goede struct vbg_ioctl_hgcm_connect { 111f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 112f6ddd094SHans de Goede union { 113f6ddd094SHans de Goede struct { 114f6ddd094SHans de Goede struct vmmdev_hgcm_service_location loc; 115f6ddd094SHans de Goede } in; 116f6ddd094SHans de Goede struct { 117f6ddd094SHans de Goede __u32 client_id; 118f6ddd094SHans de Goede } out; 119f6ddd094SHans de Goede } u; 120f6ddd094SHans de Goede }; 121f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_hgcm_connect, 24 + 132); 122f6ddd094SHans de Goede 123f6ddd094SHans de Goede #define VBG_IOCTL_HGCM_CONNECT \ 124f6ddd094SHans de Goede _IOWR('V', 4, struct vbg_ioctl_hgcm_connect) 125f6ddd094SHans de Goede 126f6ddd094SHans de Goede 127f6ddd094SHans de Goede /** VBG_IOCTL_HGCM_DISCONNECT data structure. */ 128f6ddd094SHans de Goede struct vbg_ioctl_hgcm_disconnect { 129f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 130f6ddd094SHans de Goede union { 131f6ddd094SHans de Goede struct { 132f6ddd094SHans de Goede __u32 client_id; 133f6ddd094SHans de Goede } in; 134f6ddd094SHans de Goede } u; 135f6ddd094SHans de Goede }; 136f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_hgcm_disconnect, 24 + 4); 137f6ddd094SHans de Goede 138f6ddd094SHans de Goede #define VBG_IOCTL_HGCM_DISCONNECT \ 139f6ddd094SHans de Goede _IOWR('V', 5, struct vbg_ioctl_hgcm_disconnect) 140f6ddd094SHans de Goede 141f6ddd094SHans de Goede 142f6ddd094SHans de Goede /** VBG_IOCTL_HGCM_CALL data structure. */ 143f6ddd094SHans de Goede struct vbg_ioctl_hgcm_call { 144f6ddd094SHans de Goede /** The header. */ 145f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 146f6ddd094SHans de Goede /** Input: The id of the caller. */ 147f6ddd094SHans de Goede __u32 client_id; 148f6ddd094SHans de Goede /** Input: Function number. */ 149f6ddd094SHans de Goede __u32 function; 150f6ddd094SHans de Goede /** 151f6ddd094SHans de Goede * Input: How long to wait (milliseconds) for completion before 152f6ddd094SHans de Goede * cancelling the call. Set to -1 to wait indefinitely. 153f6ddd094SHans de Goede */ 154f6ddd094SHans de Goede __u32 timeout_ms; 155f6ddd094SHans de Goede /** Interruptable flag, ignored for userspace calls. */ 156f6ddd094SHans de Goede __u8 interruptible; 157f6ddd094SHans de Goede /** Explicit padding, MBZ. */ 158f6ddd094SHans de Goede __u8 reserved; 159f6ddd094SHans de Goede /** 160f6ddd094SHans de Goede * Input: How many parameters following this structure. 161f6ddd094SHans de Goede * 162f6ddd094SHans de Goede * The parameters are either HGCMFunctionParameter64 or 32, 163f6ddd094SHans de Goede * depending on whether we're receiving a 64-bit or 32-bit request. 164f6ddd094SHans de Goede * 165f6ddd094SHans de Goede * The current maximum is 61 parameters (given a 1KB max request size, 166f6ddd094SHans de Goede * and a 64-bit parameter size of 16 bytes). 167f6ddd094SHans de Goede */ 168f6ddd094SHans de Goede __u16 parm_count; 169f6ddd094SHans de Goede /* 170f6ddd094SHans de Goede * Parameters follow in form: 171f6ddd094SHans de Goede * struct hgcm_function_parameter<32|64> parms[parm_count] 172f6ddd094SHans de Goede */ 173f6ddd094SHans de Goede }; 174f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_hgcm_call, 24 + 16); 175f6ddd094SHans de Goede 176f6ddd094SHans de Goede #define VBG_IOCTL_HGCM_CALL_32(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 6, s) 177f6ddd094SHans de Goede #define VBG_IOCTL_HGCM_CALL_64(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 7, s) 178f6ddd094SHans de Goede #if __BITS_PER_LONG == 64 179f6ddd094SHans de Goede #define VBG_IOCTL_HGCM_CALL(s) VBG_IOCTL_HGCM_CALL_64(s) 180f6ddd094SHans de Goede #else 181f6ddd094SHans de Goede #define VBG_IOCTL_HGCM_CALL(s) VBG_IOCTL_HGCM_CALL_32(s) 182f6ddd094SHans de Goede #endif 183f6ddd094SHans de Goede 184f6ddd094SHans de Goede 185f6ddd094SHans de Goede /** VBG_IOCTL_LOG data structure. */ 186f6ddd094SHans de Goede struct vbg_ioctl_log { 187f6ddd094SHans de Goede /** The header. */ 188f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 189f6ddd094SHans de Goede union { 190f6ddd094SHans de Goede struct { 191f6ddd094SHans de Goede /** 192f6ddd094SHans de Goede * The log message, this may be zero terminated. If it 193f6ddd094SHans de Goede * is not zero terminated then the length is determined 194f6ddd094SHans de Goede * from the input size. 195f6ddd094SHans de Goede */ 196f6ddd094SHans de Goede char msg[1]; 197f6ddd094SHans de Goede } in; 198f6ddd094SHans de Goede } u; 199f6ddd094SHans de Goede }; 200f6ddd094SHans de Goede 201f794db68SHans de Goede #define VBG_IOCTL_LOG(s) _IO('V', 9) 202f6ddd094SHans de Goede 203f6ddd094SHans de Goede 204f6ddd094SHans de Goede /** VBG_IOCTL_WAIT_FOR_EVENTS data structure. */ 205f6ddd094SHans de Goede struct vbg_ioctl_wait_for_events { 206f6ddd094SHans de Goede /** The header. */ 207f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 208f6ddd094SHans de Goede union { 209f6ddd094SHans de Goede struct { 210f6ddd094SHans de Goede /** Timeout in milliseconds. */ 211f6ddd094SHans de Goede __u32 timeout_ms; 212f6ddd094SHans de Goede /** Events to wait for. */ 213f6ddd094SHans de Goede __u32 events; 214f6ddd094SHans de Goede } in; 215f6ddd094SHans de Goede struct { 216f6ddd094SHans de Goede /** Events that occurred. */ 217f6ddd094SHans de Goede __u32 events; 218f6ddd094SHans de Goede } out; 219f6ddd094SHans de Goede } u; 220f6ddd094SHans de Goede }; 221f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_wait_for_events, 24 + 8); 222f6ddd094SHans de Goede 223f6ddd094SHans de Goede #define VBG_IOCTL_WAIT_FOR_EVENTS \ 224f6ddd094SHans de Goede _IOWR('V', 10, struct vbg_ioctl_wait_for_events) 225f6ddd094SHans de Goede 226f6ddd094SHans de Goede 227f6ddd094SHans de Goede /* 228f6ddd094SHans de Goede * IOCTL to VBoxGuest to interrupt (cancel) any pending 229f6ddd094SHans de Goede * VBG_IOCTL_WAIT_FOR_EVENTS and return. 230f6ddd094SHans de Goede * 231f6ddd094SHans de Goede * Handled inside the vboxguest driver and not seen by the host at all. 232f6ddd094SHans de Goede * After calling this, VBG_IOCTL_WAIT_FOR_EVENTS should no longer be called in 233f6ddd094SHans de Goede * the same session. Any VBOXGUEST_IOCTL_WAITEVENT calls in the same session 234f6ddd094SHans de Goede * done after calling this will directly exit with -EINTR. 235f6ddd094SHans de Goede */ 236f6ddd094SHans de Goede #define VBG_IOCTL_INTERRUPT_ALL_WAIT_FOR_EVENTS \ 237f6ddd094SHans de Goede _IOWR('V', 11, struct vbg_ioctl_hdr) 238f6ddd094SHans de Goede 239f6ddd094SHans de Goede 240f6ddd094SHans de Goede /** VBG_IOCTL_CHANGE_FILTER_MASK data structure. */ 241f6ddd094SHans de Goede struct vbg_ioctl_change_filter { 242f6ddd094SHans de Goede /** The header. */ 243f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 244f6ddd094SHans de Goede union { 245f6ddd094SHans de Goede struct { 246f6ddd094SHans de Goede /** Flags to set. */ 247f6ddd094SHans de Goede __u32 or_mask; 248f6ddd094SHans de Goede /** Flags to remove. */ 249f6ddd094SHans de Goede __u32 not_mask; 250f6ddd094SHans de Goede } in; 251f6ddd094SHans de Goede } u; 252f6ddd094SHans de Goede }; 253f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_change_filter, 24 + 8); 254f6ddd094SHans de Goede 255f6ddd094SHans de Goede /* IOCTL to VBoxGuest to control the event filter mask. */ 256f6ddd094SHans de Goede #define VBG_IOCTL_CHANGE_FILTER_MASK \ 257f6ddd094SHans de Goede _IOWR('V', 12, struct vbg_ioctl_change_filter) 258f6ddd094SHans de Goede 259f6ddd094SHans de Goede 260*631beddcSHans de Goede /** VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES data structure. */ 261*631beddcSHans de Goede struct vbg_ioctl_acquire_guest_caps { 262*631beddcSHans de Goede /** The header. */ 263*631beddcSHans de Goede struct vbg_ioctl_hdr hdr; 264*631beddcSHans de Goede union { 265*631beddcSHans de Goede struct { 266*631beddcSHans de Goede /** Flags (VBGL_IOC_AGC_FLAGS_XXX). */ 267*631beddcSHans de Goede __u32 flags; 268*631beddcSHans de Goede /** Capabilities to set (VMMDEV_GUEST_SUPPORTS_XXX). */ 269*631beddcSHans de Goede __u32 or_mask; 270*631beddcSHans de Goede /** Capabilities to drop (VMMDEV_GUEST_SUPPORTS_XXX). */ 271*631beddcSHans de Goede __u32 not_mask; 272*631beddcSHans de Goede } in; 273*631beddcSHans de Goede } u; 274*631beddcSHans de Goede }; 275*631beddcSHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_acquire_guest_caps, 24 + 12); 276*631beddcSHans de Goede 277*631beddcSHans de Goede #define VBGL_IOC_AGC_FLAGS_CONFIG_ACQUIRE_MODE 0x00000001 278*631beddcSHans de Goede #define VBGL_IOC_AGC_FLAGS_VALID_MASK 0x00000001 279*631beddcSHans de Goede 280*631beddcSHans de Goede #define VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES \ 281*631beddcSHans de Goede _IOWR('V', 13, struct vbg_ioctl_acquire_guest_caps) 282*631beddcSHans de Goede 283*631beddcSHans de Goede 284f6ddd094SHans de Goede /** VBG_IOCTL_CHANGE_GUEST_CAPABILITIES data structure. */ 285f6ddd094SHans de Goede struct vbg_ioctl_set_guest_caps { 286f6ddd094SHans de Goede /** The header. */ 287f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 288f6ddd094SHans de Goede union { 289f6ddd094SHans de Goede struct { 290f6ddd094SHans de Goede /** Capabilities to set (VMMDEV_GUEST_SUPPORTS_XXX). */ 291f6ddd094SHans de Goede __u32 or_mask; 292f6ddd094SHans de Goede /** Capabilities to drop (VMMDEV_GUEST_SUPPORTS_XXX). */ 293f6ddd094SHans de Goede __u32 not_mask; 294f6ddd094SHans de Goede } in; 295f6ddd094SHans de Goede struct { 296f6ddd094SHans de Goede /** Capabilities held by the session after the call. */ 297f6ddd094SHans de Goede __u32 session_caps; 298f6ddd094SHans de Goede /** Capabilities for all the sessions after the call. */ 299f6ddd094SHans de Goede __u32 global_caps; 300f6ddd094SHans de Goede } out; 301f6ddd094SHans de Goede } u; 302f6ddd094SHans de Goede }; 303f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_set_guest_caps, 24 + 8); 304f6ddd094SHans de Goede 305f6ddd094SHans de Goede #define VBG_IOCTL_CHANGE_GUEST_CAPABILITIES \ 306f6ddd094SHans de Goede _IOWR('V', 14, struct vbg_ioctl_set_guest_caps) 307f6ddd094SHans de Goede 308f6ddd094SHans de Goede 309f6ddd094SHans de Goede /** VBG_IOCTL_CHECK_BALLOON data structure. */ 310f6ddd094SHans de Goede struct vbg_ioctl_check_balloon { 311f6ddd094SHans de Goede /** The header. */ 312f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 313f6ddd094SHans de Goede union { 314f6ddd094SHans de Goede struct { 315f6ddd094SHans de Goede /** The size of the balloon in chunks of 1MB. */ 316f6ddd094SHans de Goede __u32 balloon_chunks; 317f6ddd094SHans de Goede /** 318f6ddd094SHans de Goede * false = handled in R0, no further action required. 319f6ddd094SHans de Goede * true = allocate balloon memory in R3. 320f6ddd094SHans de Goede */ 321f6ddd094SHans de Goede __u8 handle_in_r3; 322f6ddd094SHans de Goede /** Explicit padding, MBZ. */ 323f6ddd094SHans de Goede __u8 padding[3]; 324f6ddd094SHans de Goede } out; 325f6ddd094SHans de Goede } u; 326f6ddd094SHans de Goede }; 327f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_check_balloon, 24 + 8); 328f6ddd094SHans de Goede 329f6ddd094SHans de Goede /* 330f6ddd094SHans de Goede * IOCTL to check memory ballooning. 331f6ddd094SHans de Goede * 332f6ddd094SHans de Goede * The guest kernel module will ask the host for the current size of the 333f6ddd094SHans de Goede * balloon and adjust the size. Or it will set handle_in_r3 = true and R3 is 334f6ddd094SHans de Goede * responsible for allocating memory and calling VBG_IOCTL_CHANGE_BALLOON. 335f6ddd094SHans de Goede */ 336f6ddd094SHans de Goede #define VBG_IOCTL_CHECK_BALLOON \ 337f6ddd094SHans de Goede _IOWR('V', 17, struct vbg_ioctl_check_balloon) 338f6ddd094SHans de Goede 339f6ddd094SHans de Goede 340f6ddd094SHans de Goede /** VBG_IOCTL_WRITE_CORE_DUMP data structure. */ 341f6ddd094SHans de Goede struct vbg_ioctl_write_coredump { 342f6ddd094SHans de Goede struct vbg_ioctl_hdr hdr; 343f6ddd094SHans de Goede union { 344f6ddd094SHans de Goede struct { 345f6ddd094SHans de Goede __u32 flags; /** Flags (reserved, MBZ). */ 346f6ddd094SHans de Goede } in; 347f6ddd094SHans de Goede } u; 348f6ddd094SHans de Goede }; 349f6ddd094SHans de Goede VMMDEV_ASSERT_SIZE(vbg_ioctl_write_coredump, 24 + 4); 350f6ddd094SHans de Goede 351f6ddd094SHans de Goede #define VBG_IOCTL_WRITE_CORE_DUMP \ 352f6ddd094SHans de Goede _IOWR('V', 19, struct vbg_ioctl_write_coredump) 353f6ddd094SHans de Goede 354f6ddd094SHans de Goede #endif 355