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