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