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