root/drivers/virt/vboxguest/vmmdev.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: (GPL-2.0 OR CDDL-1.0) */
   2 /*
   3  * Virtual Device for Guest <-> VMM/Host communication interface
   4  *
   5  * Copyright (C) 2006-2016 Oracle Corporation
   6  */
   7 
   8 #ifndef __VBOX_VMMDEV_H__
   9 #define __VBOX_VMMDEV_H__
  10 
  11 #include <asm/bitsperlong.h>
  12 #include <linux/sizes.h>
  13 #include <linux/types.h>
  14 #include <linux/vbox_vmmdev_types.h>
  15 
  16 /* Port for generic request interface (relative offset). */
  17 #define VMMDEV_PORT_OFF_REQUEST                             0
  18 
  19 /** Layout of VMMDEV RAM region that contains information for guest. */
  20 struct vmmdev_memory {
  21         /** The size of this structure. */
  22         u32 size;
  23         /** The structure version. (VMMDEV_MEMORY_VERSION) */
  24         u32 version;
  25 
  26         union {
  27                 struct {
  28                         /** Flag telling that VMMDev has events pending. */
  29                         u8 have_events;
  30                         /** Explicit padding, MBZ. */
  31                         u8 padding[3];
  32                 } V1_04;
  33 
  34                 struct {
  35                         /** Pending events flags, set by host. */
  36                         u32 host_events;
  37                         /** Mask of events the guest wants, set by guest. */
  38                         u32 guest_event_mask;
  39                 } V1_03;
  40         } V;
  41 
  42         /* struct vbva_memory, not used */
  43 };
  44 VMMDEV_ASSERT_SIZE(vmmdev_memory, 8 + 8);
  45 
  46 /** Version of vmmdev_memory structure (vmmdev_memory::version). */
  47 #define VMMDEV_MEMORY_VERSION   (1)
  48 
  49 /* Host mouse capabilities has been changed. */
  50 #define VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED             BIT(0)
  51 /* HGCM event. */
  52 #define VMMDEV_EVENT_HGCM                                   BIT(1)
  53 /* A display change request has been issued. */
  54 #define VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST                 BIT(2)
  55 /* Credentials are available for judgement. */
  56 #define VMMDEV_EVENT_JUDGE_CREDENTIALS                      BIT(3)
  57 /* The guest has been restored. */
  58 #define VMMDEV_EVENT_RESTORED                               BIT(4)
  59 /* Seamless mode state changed. */
  60 #define VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST           BIT(5)
  61 /* Memory balloon size changed. */
  62 #define VMMDEV_EVENT_BALLOON_CHANGE_REQUEST                 BIT(6)
  63 /* Statistics interval changed. */
  64 #define VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST     BIT(7)
  65 /* VRDP status changed. */
  66 #define VMMDEV_EVENT_VRDP                                   BIT(8)
  67 /* New mouse position data available. */
  68 #define VMMDEV_EVENT_MOUSE_POSITION_CHANGED                 BIT(9)
  69 /* CPU hotplug event occurred. */
  70 #define VMMDEV_EVENT_CPU_HOTPLUG                            BIT(10)
  71 /* The mask of valid events, for sanity checking. */
  72 #define VMMDEV_EVENT_VALID_EVENT_MASK                       0x000007ffU
  73 
  74 /*
  75  * Additions are allowed to work only if additions_major == vmmdev_current &&
  76  * additions_minor <= vmmdev_current. Additions version is reported to host
  77  * (VMMDev) by VMMDEVREQ_REPORT_GUEST_INFO.
  78  */
  79 #define VMMDEV_VERSION                      0x00010004
  80 #define VMMDEV_VERSION_MAJOR                (VMMDEV_VERSION >> 16)
  81 #define VMMDEV_VERSION_MINOR                (VMMDEV_VERSION & 0xffff)
  82 
  83 /* Maximum request packet size. */
  84 #define VMMDEV_MAX_VMMDEVREQ_SIZE           1048576
  85 
  86 /* Version of vmmdev_request_header structure. */
  87 #define VMMDEV_REQUEST_HEADER_VERSION       0x10001
  88 
  89 /** struct vmmdev_request_header - Generic VMMDev request header. */
  90 struct vmmdev_request_header {
  91         /** IN: Size of the structure in bytes (including body). */
  92         u32 size;
  93         /** IN: Version of the structure.  */
  94         u32 version;
  95         /** IN: Type of the request. */
  96         enum vmmdev_request_type request_type;
  97         /** OUT: Return code. */
  98         s32 rc;
  99         /** Reserved field no.1. MBZ. */
 100         u32 reserved1;
 101         /** IN: Requestor information (VMMDEV_REQUESTOR_*) */
 102         u32 requestor;
 103 };
 104 VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24);
 105 
 106 /**
 107  * struct vmmdev_mouse_status - Mouse status request structure.
 108  *
 109  * Used by VMMDEVREQ_GET_MOUSE_STATUS and VMMDEVREQ_SET_MOUSE_STATUS.
 110  */
 111 struct vmmdev_mouse_status {
 112         /** header */
 113         struct vmmdev_request_header header;
 114         /** Mouse feature mask. See VMMDEV_MOUSE_*. */
 115         u32 mouse_features;
 116         /** Mouse x position. */
 117         s32 pointer_pos_x;
 118         /** Mouse y position. */
 119         s32 pointer_pos_y;
 120 };
 121 VMMDEV_ASSERT_SIZE(vmmdev_mouse_status, 24 + 12);
 122 
 123 /* The guest can (== wants to) handle absolute coordinates.  */
 124 #define VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE                     BIT(0)
 125 /*
 126  * The host can (== wants to) send absolute coordinates.
 127  * (Input not captured.)
 128  */
 129 #define VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE                    BIT(1)
 130 /*
 131  * The guest can *NOT* switch to software cursor and therefore depends on the
 132  * host cursor.
 133  *
 134  * When guest additions are installed and the host has promised to display the
 135  * cursor itself, the guest installs a hardware mouse driver. Don't ask the
 136  * guest to switch to a software cursor then.
 137  */
 138 #define VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR                BIT(2)
 139 /* The host does NOT provide support for drawing the cursor itself. */
 140 #define VMMDEV_MOUSE_HOST_CANNOT_HWPOINTER                  BIT(3)
 141 /* The guest can read VMMDev events to find out about pointer movement */
 142 #define VMMDEV_MOUSE_NEW_PROTOCOL                           BIT(4)
 143 /*
 144  * If the guest changes the status of the VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR
 145  * bit, the host will honour this.
 146  */
 147 #define VMMDEV_MOUSE_HOST_RECHECKS_NEEDS_HOST_CURSOR        BIT(5)
 148 /*
 149  * The host supplies an absolute pointing device.  The Guest Additions may
 150  * wish to use this to decide whether to install their own driver.
 151  */
 152 #define VMMDEV_MOUSE_HOST_HAS_ABS_DEV                       BIT(6)
 153 
 154 /* The minimum value our pointing device can return. */
 155 #define VMMDEV_MOUSE_RANGE_MIN 0
 156 /* The maximum value our pointing device can return. */
 157 #define VMMDEV_MOUSE_RANGE_MAX 0xFFFF
 158 
 159 /**
 160  * struct vmmdev_host_version - VirtualBox host version request structure.
 161  *
 162  * VBG uses this to detect the precense of new features in the interface.
 163  */
 164 struct vmmdev_host_version {
 165         /** Header. */
 166         struct vmmdev_request_header header;
 167         /** Major version. */
 168         u16 major;
 169         /** Minor version. */
 170         u16 minor;
 171         /** Build number. */
 172         u32 build;
 173         /** SVN revision. */
 174         u32 revision;
 175         /** Feature mask. */
 176         u32 features;
 177 };
 178 VMMDEV_ASSERT_SIZE(vmmdev_host_version, 24 + 16);
 179 
 180 /* Physical page lists are supported by HGCM. */
 181 #define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST  BIT(0)
 182 
 183 /**
 184  * struct vmmdev_mask - Structure to set / clear bits in a mask used for
 185  * VMMDEVREQ_SET_GUEST_CAPABILITIES and VMMDEVREQ_CTL_GUEST_FILTER_MASK.
 186  */
 187 struct vmmdev_mask {
 188         /** Header. */
 189         struct vmmdev_request_header header;
 190         /** Mask of bits to be set. */
 191         u32 or_mask;
 192         /** Mask of bits to be cleared. */
 193         u32 not_mask;
 194 };
 195 VMMDEV_ASSERT_SIZE(vmmdev_mask, 24 + 8);
 196 
 197 /* The guest supports seamless display rendering. */
 198 #define VMMDEV_GUEST_SUPPORTS_SEAMLESS                      BIT(0)
 199 /* The guest supports mapping guest to host windows. */
 200 #define VMMDEV_GUEST_SUPPORTS_GUEST_HOST_WINDOW_MAPPING     BIT(1)
 201 /*
 202  * The guest graphical additions are active.
 203  * Used for fast activation and deactivation of certain graphical operations
 204  * (e.g. resizing & seamless). The legacy VMMDEVREQ_REPORT_GUEST_CAPABILITIES
 205  * request sets this automatically, but VMMDEVREQ_SET_GUEST_CAPABILITIES does
 206  * not.
 207  */
 208 #define VMMDEV_GUEST_SUPPORTS_GRAPHICS                      BIT(2)
 209 
 210 /** struct vmmdev_hypervisorinfo - Hypervisor info structure. */
 211 struct vmmdev_hypervisorinfo {
 212         /** Header. */
 213         struct vmmdev_request_header header;
 214         /**
 215          * Guest virtual address of proposed hypervisor start.
 216          * Not used by VMMDEVREQ_GET_HYPERVISOR_INFO.
 217          */
 218         u32 hypervisor_start;
 219         /** Hypervisor size in bytes. */
 220         u32 hypervisor_size;
 221 };
 222 VMMDEV_ASSERT_SIZE(vmmdev_hypervisorinfo, 24 + 8);
 223 
 224 /** struct vmmdev_events - Pending events structure. */
 225 struct vmmdev_events {
 226         /** Header. */
 227         struct vmmdev_request_header header;
 228         /** OUT: Pending event mask. */
 229         u32 events;
 230 };
 231 VMMDEV_ASSERT_SIZE(vmmdev_events, 24 + 4);
 232 
 233 #define VMMDEV_OSTYPE_LINUX26           0x53000
 234 #define VMMDEV_OSTYPE_X64               BIT(8)
 235 
 236 /** struct vmmdev_guestinfo - Guest information report. */
 237 struct vmmdev_guest_info {
 238         /** Header. */
 239         struct vmmdev_request_header header;
 240         /**
 241          * The VMMDev interface version expected by additions.
 242          * *Deprecated*, do not use anymore! Will be removed.
 243          */
 244         u32 interface_version;
 245         /** Guest OS type. */
 246         u32 os_type;
 247 };
 248 VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8);
 249 
 250 #define VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO    BIT(0)
 251 
 252 /** struct vmmdev_guestinfo2 - Guest information report, version 2. */
 253 struct vmmdev_guest_info2 {
 254         /** Header. */
 255         struct vmmdev_request_header header;
 256         /** Major version. */
 257         u16 additions_major;
 258         /** Minor version. */
 259         u16 additions_minor;
 260         /** Build number. */
 261         u32 additions_build;
 262         /** SVN revision. */
 263         u32 additions_revision;
 264         /** Feature mask. */
 265         u32 additions_features;
 266         /**
 267          * The intentional meaning of this field was:
 268          * Some additional information, for example 'Beta 1' or something like
 269          * that.
 270          *
 271          * The way it was implemented was implemented: VBG_VERSION_STRING.
 272          *
 273          * This means the first three members are duplicated in this field (if
 274          * the guest build config is sane). So, the user must check this and
 275          * chop it off before usage. There is, because of the Main code's blind
 276          * trust in the field's content, no way back.
 277          */
 278         char name[128];
 279 };
 280 VMMDEV_ASSERT_SIZE(vmmdev_guest_info2, 24 + 144);
 281 
 282 enum vmmdev_guest_facility_type {
 283         VBOXGUEST_FACILITY_TYPE_UNKNOWN          = 0,
 284         VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER = 20,
 285         /* VBoxGINA / VBoxCredProv / pam_vbox. */
 286         VBOXGUEST_FACILITY_TYPE_AUTO_LOGON       = 90,
 287         VBOXGUEST_FACILITY_TYPE_VBOX_SERVICE     = 100,
 288         /* VBoxTray (Windows), VBoxClient (Linux, Unix). */
 289         VBOXGUEST_FACILITY_TYPE_VBOX_TRAY_CLIENT = 101,
 290         VBOXGUEST_FACILITY_TYPE_SEAMLESS         = 1000,
 291         VBOXGUEST_FACILITY_TYPE_GRAPHICS         = 1100,
 292         VBOXGUEST_FACILITY_TYPE_ALL              = 0x7ffffffe,
 293         /* Ensure the enum is a 32 bit data-type */
 294         VBOXGUEST_FACILITY_TYPE_SIZEHACK         = 0x7fffffff
 295 };
 296 
 297 enum vmmdev_guest_facility_status {
 298         VBOXGUEST_FACILITY_STATUS_INACTIVE    = 0,
 299         VBOXGUEST_FACILITY_STATUS_PAUSED      = 1,
 300         VBOXGUEST_FACILITY_STATUS_PRE_INIT    = 20,
 301         VBOXGUEST_FACILITY_STATUS_INIT        = 30,
 302         VBOXGUEST_FACILITY_STATUS_ACTIVE      = 50,
 303         VBOXGUEST_FACILITY_STATUS_TERMINATING = 100,
 304         VBOXGUEST_FACILITY_STATUS_TERMINATED  = 101,
 305         VBOXGUEST_FACILITY_STATUS_FAILED      = 800,
 306         VBOXGUEST_FACILITY_STATUS_UNKNOWN     = 999,
 307         /* Ensure the enum is a 32 bit data-type */
 308         VBOXGUEST_FACILITY_STATUS_SIZEHACK    = 0x7fffffff
 309 };
 310 
 311 /** struct vmmdev_guest_status - Guest Additions status structure. */
 312 struct vmmdev_guest_status {
 313         /** Header. */
 314         struct vmmdev_request_header header;
 315         /** Facility the status is indicated for. */
 316         enum vmmdev_guest_facility_type facility;
 317         /** Current guest status. */
 318         enum vmmdev_guest_facility_status status;
 319         /** Flags, not used at the moment. */
 320         u32 flags;
 321 };
 322 VMMDEV_ASSERT_SIZE(vmmdev_guest_status, 24 + 12);
 323 
 324 #define VMMDEV_MEMORY_BALLOON_CHUNK_SIZE             (1048576)
 325 #define VMMDEV_MEMORY_BALLOON_CHUNK_PAGES            (1048576 / 4096)
 326 
 327 /** struct vmmdev_memballoon_info - Memory-balloon info structure. */
 328 struct vmmdev_memballoon_info {
 329         /** Header. */
 330         struct vmmdev_request_header header;
 331         /** Balloon size in megabytes. */
 332         u32 balloon_chunks;
 333         /** Guest ram size in megabytes. */
 334         u32 phys_mem_chunks;
 335         /**
 336          * Setting this to VMMDEV_EVENT_BALLOON_CHANGE_REQUEST indicates that
 337          * the request is a response to that event.
 338          * (Don't confuse this with VMMDEVREQ_ACKNOWLEDGE_EVENTS.)
 339          */
 340         u32 event_ack;
 341 };
 342 VMMDEV_ASSERT_SIZE(vmmdev_memballoon_info, 24 + 12);
 343 
 344 /** struct vmmdev_memballoon_change - Change the size of the balloon. */
 345 struct vmmdev_memballoon_change {
 346         /** Header. */
 347         struct vmmdev_request_header header;
 348         /** The number of pages in the array. */
 349         u32 pages;
 350         /** true = inflate, false = deflate.  */
 351         u32 inflate;
 352         /** Physical address (u64) of each page. */
 353         u64 phys_page[VMMDEV_MEMORY_BALLOON_CHUNK_PAGES];
 354 };
 355 
 356 /** struct vmmdev_write_core_dump - Write Core Dump request data. */
 357 struct vmmdev_write_core_dump {
 358         /** Header. */
 359         struct vmmdev_request_header header;
 360         /** Flags (reserved, MBZ). */
 361         u32 flags;
 362 };
 363 VMMDEV_ASSERT_SIZE(vmmdev_write_core_dump, 24 + 4);
 364 
 365 /** struct vmmdev_heartbeat - Heart beat check state structure. */
 366 struct vmmdev_heartbeat {
 367         /** Header. */
 368         struct vmmdev_request_header header;
 369         /** OUT: Guest heartbeat interval in nanosec. */
 370         u64 interval_ns;
 371         /** Heartbeat check flag. */
 372         u8 enabled;
 373         /** Explicit padding, MBZ. */
 374         u8 padding[3];
 375 } __packed;
 376 VMMDEV_ASSERT_SIZE(vmmdev_heartbeat, 24 + 12);
 377 
 378 #define VMMDEV_HGCM_REQ_DONE      BIT(0)
 379 #define VMMDEV_HGCM_REQ_CANCELLED BIT(1)
 380 
 381 /** struct vmmdev_hgcmreq_header - vmmdev HGCM requests header. */
 382 struct vmmdev_hgcmreq_header {
 383         /** Request header. */
 384         struct vmmdev_request_header header;
 385 
 386         /** HGCM flags. */
 387         u32 flags;
 388 
 389         /** Result code. */
 390         s32 result;
 391 };
 392 VMMDEV_ASSERT_SIZE(vmmdev_hgcmreq_header, 24 + 8);
 393 
 394 /** struct vmmdev_hgcm_connect - HGCM connect request structure. */
 395 struct vmmdev_hgcm_connect {
 396         /** HGCM request header. */
 397         struct vmmdev_hgcmreq_header header;
 398 
 399         /** IN: Description of service to connect to. */
 400         struct vmmdev_hgcm_service_location loc;
 401 
 402         /** OUT: Client identifier assigned by local instance of HGCM. */
 403         u32 client_id;
 404 };
 405 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_connect, 32 + 132 + 4);
 406 
 407 /** struct vmmdev_hgcm_disconnect - HGCM disconnect request structure. */
 408 struct vmmdev_hgcm_disconnect {
 409         /** HGCM request header. */
 410         struct vmmdev_hgcmreq_header header;
 411 
 412         /** IN: Client identifier. */
 413         u32 client_id;
 414 };
 415 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_disconnect, 32 + 4);
 416 
 417 #define VMMDEV_HGCM_MAX_PARMS 32
 418 
 419 /** struct vmmdev_hgcm_call - HGCM call request structure. */
 420 struct vmmdev_hgcm_call {
 421         /* request header */
 422         struct vmmdev_hgcmreq_header header;
 423 
 424         /** IN: Client identifier. */
 425         u32 client_id;
 426         /** IN: Service function number. */
 427         u32 function;
 428         /** IN: Number of parameters. */
 429         u32 parm_count;
 430         /** Parameters follow in form: HGCMFunctionParameter32|64 parms[X]; */
 431 };
 432 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_call, 32 + 12);
 433 
 434 /**
 435  * struct vmmdev_hgcm_cancel2 - HGCM cancel request structure, version 2.
 436  *
 437  * After the request header.rc will be:
 438  *
 439  * VINF_SUCCESS when cancelled.
 440  * VERR_NOT_FOUND if the specified request cannot be found.
 441  * VERR_INVALID_PARAMETER if the address is invalid valid.
 442  */
 443 struct vmmdev_hgcm_cancel2 {
 444         /** Header. */
 445         struct vmmdev_request_header header;
 446         /** The physical address of the request to cancel. */
 447         u32 phys_req_to_cancel;
 448 };
 449 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_cancel2, 24 + 4);
 450 
 451 #endif

/* [<][>][^][v][top][bottom][index][help] */