0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __VBOX_VMMDEV_H__
0009 #define __VBOX_VMMDEV_H__
0010
0011 #include <asm/bitsperlong.h>
0012 #include <linux/sizes.h>
0013 #include <linux/types.h>
0014 #include <linux/vbox_vmmdev_types.h>
0015
0016
0017 #define VMMDEV_PORT_OFF_REQUEST 0
0018
0019
0020 struct vmmdev_memory {
0021
0022 u32 size;
0023
0024 u32 version;
0025
0026 union {
0027 struct {
0028
0029 u8 have_events;
0030
0031 u8 padding[3];
0032 } V1_04;
0033
0034 struct {
0035
0036 u32 host_events;
0037
0038 u32 guest_event_mask;
0039 } V1_03;
0040 } V;
0041
0042
0043 };
0044 VMMDEV_ASSERT_SIZE(vmmdev_memory, 8 + 8);
0045
0046
0047 #define VMMDEV_MEMORY_VERSION (1)
0048
0049
0050 #define VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED BIT(0)
0051
0052 #define VMMDEV_EVENT_HGCM BIT(1)
0053
0054 #define VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST BIT(2)
0055
0056 #define VMMDEV_EVENT_JUDGE_CREDENTIALS BIT(3)
0057
0058 #define VMMDEV_EVENT_RESTORED BIT(4)
0059
0060 #define VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST BIT(5)
0061
0062 #define VMMDEV_EVENT_BALLOON_CHANGE_REQUEST BIT(6)
0063
0064 #define VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST BIT(7)
0065
0066 #define VMMDEV_EVENT_VRDP BIT(8)
0067
0068 #define VMMDEV_EVENT_MOUSE_POSITION_CHANGED BIT(9)
0069
0070 #define VMMDEV_EVENT_CPU_HOTPLUG BIT(10)
0071
0072 #define VMMDEV_EVENT_VALID_EVENT_MASK 0x000007ffU
0073
0074
0075
0076
0077
0078
0079 #define VMMDEV_VERSION 0x00010004
0080 #define VMMDEV_VERSION_MAJOR (VMMDEV_VERSION >> 16)
0081 #define VMMDEV_VERSION_MINOR (VMMDEV_VERSION & 0xffff)
0082
0083
0084 #define VMMDEV_MAX_VMMDEVREQ_SIZE 1048576
0085
0086
0087 #define VMMDEV_REQUEST_HEADER_VERSION 0x10001
0088
0089
0090 struct vmmdev_request_header {
0091
0092 u32 size;
0093
0094 u32 version;
0095
0096 enum vmmdev_request_type request_type;
0097
0098 s32 rc;
0099
0100 u32 reserved1;
0101
0102 u32 requestor;
0103 };
0104 VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24);
0105
0106
0107
0108
0109
0110
0111 struct vmmdev_mouse_status {
0112
0113 struct vmmdev_request_header header;
0114
0115 u32 mouse_features;
0116
0117 s32 pointer_pos_x;
0118
0119 s32 pointer_pos_y;
0120 };
0121 VMMDEV_ASSERT_SIZE(vmmdev_mouse_status, 24 + 12);
0122
0123
0124 #define VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE BIT(0)
0125
0126
0127
0128
0129 #define VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE BIT(1)
0130
0131
0132
0133
0134
0135
0136
0137
0138 #define VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR BIT(2)
0139
0140 #define VMMDEV_MOUSE_HOST_CANNOT_HWPOINTER BIT(3)
0141
0142 #define VMMDEV_MOUSE_NEW_PROTOCOL BIT(4)
0143
0144
0145
0146
0147 #define VMMDEV_MOUSE_HOST_RECHECKS_NEEDS_HOST_CURSOR BIT(5)
0148
0149
0150
0151
0152 #define VMMDEV_MOUSE_HOST_HAS_ABS_DEV BIT(6)
0153
0154
0155 #define VMMDEV_MOUSE_RANGE_MIN 0
0156
0157 #define VMMDEV_MOUSE_RANGE_MAX 0xFFFF
0158
0159
0160
0161
0162
0163
0164 struct vmmdev_host_version {
0165
0166 struct vmmdev_request_header header;
0167
0168 u16 major;
0169
0170 u16 minor;
0171
0172 u32 build;
0173
0174 u32 revision;
0175
0176 u32 features;
0177 };
0178 VMMDEV_ASSERT_SIZE(vmmdev_host_version, 24 + 16);
0179
0180
0181 #define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST BIT(0)
0182
0183
0184
0185
0186
0187 struct vmmdev_mask {
0188
0189 struct vmmdev_request_header header;
0190
0191 u32 or_mask;
0192
0193 u32 not_mask;
0194 };
0195 VMMDEV_ASSERT_SIZE(vmmdev_mask, 24 + 8);
0196
0197
0198 #define VMMDEV_GUEST_SUPPORTS_SEAMLESS BIT(0)
0199
0200 #define VMMDEV_GUEST_SUPPORTS_GUEST_HOST_WINDOW_MAPPING BIT(1)
0201
0202
0203
0204
0205
0206
0207
0208 #define VMMDEV_GUEST_SUPPORTS_GRAPHICS BIT(2)
0209
0210 #define VMMDEV_GUEST_CAPABILITIES_MASK 0x00000007U
0211
0212
0213 struct vmmdev_hypervisorinfo {
0214
0215 struct vmmdev_request_header header;
0216
0217
0218
0219
0220 u32 hypervisor_start;
0221
0222 u32 hypervisor_size;
0223 };
0224 VMMDEV_ASSERT_SIZE(vmmdev_hypervisorinfo, 24 + 8);
0225
0226
0227 struct vmmdev_events {
0228
0229 struct vmmdev_request_header header;
0230
0231 u32 events;
0232 };
0233 VMMDEV_ASSERT_SIZE(vmmdev_events, 24 + 4);
0234
0235 #define VMMDEV_OSTYPE_LINUX26 0x53000
0236 #define VMMDEV_OSTYPE_X64 BIT(8)
0237
0238
0239 struct vmmdev_guest_info {
0240
0241 struct vmmdev_request_header header;
0242
0243
0244
0245
0246 u32 interface_version;
0247
0248 u32 os_type;
0249 };
0250 VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8);
0251
0252 #define VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO BIT(0)
0253
0254
0255 struct vmmdev_guest_info2 {
0256
0257 struct vmmdev_request_header header;
0258
0259 u16 additions_major;
0260
0261 u16 additions_minor;
0262
0263 u32 additions_build;
0264
0265 u32 additions_revision;
0266
0267 u32 additions_features;
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 char name[128];
0281 };
0282 VMMDEV_ASSERT_SIZE(vmmdev_guest_info2, 24 + 144);
0283
0284 enum vmmdev_guest_facility_type {
0285 VBOXGUEST_FACILITY_TYPE_UNKNOWN = 0,
0286 VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER = 20,
0287
0288 VBOXGUEST_FACILITY_TYPE_AUTO_LOGON = 90,
0289 VBOXGUEST_FACILITY_TYPE_VBOX_SERVICE = 100,
0290
0291 VBOXGUEST_FACILITY_TYPE_VBOX_TRAY_CLIENT = 101,
0292 VBOXGUEST_FACILITY_TYPE_SEAMLESS = 1000,
0293 VBOXGUEST_FACILITY_TYPE_GRAPHICS = 1100,
0294 VBOXGUEST_FACILITY_TYPE_ALL = 0x7ffffffe,
0295
0296 VBOXGUEST_FACILITY_TYPE_SIZEHACK = 0x7fffffff
0297 };
0298
0299 enum vmmdev_guest_facility_status {
0300 VBOXGUEST_FACILITY_STATUS_INACTIVE = 0,
0301 VBOXGUEST_FACILITY_STATUS_PAUSED = 1,
0302 VBOXGUEST_FACILITY_STATUS_PRE_INIT = 20,
0303 VBOXGUEST_FACILITY_STATUS_INIT = 30,
0304 VBOXGUEST_FACILITY_STATUS_ACTIVE = 50,
0305 VBOXGUEST_FACILITY_STATUS_TERMINATING = 100,
0306 VBOXGUEST_FACILITY_STATUS_TERMINATED = 101,
0307 VBOXGUEST_FACILITY_STATUS_FAILED = 800,
0308 VBOXGUEST_FACILITY_STATUS_UNKNOWN = 999,
0309
0310 VBOXGUEST_FACILITY_STATUS_SIZEHACK = 0x7fffffff
0311 };
0312
0313
0314 struct vmmdev_guest_status {
0315
0316 struct vmmdev_request_header header;
0317
0318 enum vmmdev_guest_facility_type facility;
0319
0320 enum vmmdev_guest_facility_status status;
0321
0322 u32 flags;
0323 };
0324 VMMDEV_ASSERT_SIZE(vmmdev_guest_status, 24 + 12);
0325
0326 #define VMMDEV_MEMORY_BALLOON_CHUNK_SIZE (1048576)
0327 #define VMMDEV_MEMORY_BALLOON_CHUNK_PAGES (1048576 / 4096)
0328
0329
0330 struct vmmdev_memballoon_info {
0331
0332 struct vmmdev_request_header header;
0333
0334 u32 balloon_chunks;
0335
0336 u32 phys_mem_chunks;
0337
0338
0339
0340
0341
0342 u32 event_ack;
0343 };
0344 VMMDEV_ASSERT_SIZE(vmmdev_memballoon_info, 24 + 12);
0345
0346
0347 struct vmmdev_memballoon_change {
0348
0349 struct vmmdev_request_header header;
0350
0351 u32 pages;
0352
0353 u32 inflate;
0354
0355 u64 phys_page[VMMDEV_MEMORY_BALLOON_CHUNK_PAGES];
0356 };
0357
0358
0359 struct vmmdev_write_core_dump {
0360
0361 struct vmmdev_request_header header;
0362
0363 u32 flags;
0364 };
0365 VMMDEV_ASSERT_SIZE(vmmdev_write_core_dump, 24 + 4);
0366
0367
0368 struct vmmdev_heartbeat {
0369
0370 struct vmmdev_request_header header;
0371
0372 u64 interval_ns;
0373
0374 u8 enabled;
0375
0376 u8 padding[3];
0377 } __packed;
0378 VMMDEV_ASSERT_SIZE(vmmdev_heartbeat, 24 + 12);
0379
0380 #define VMMDEV_HGCM_REQ_DONE BIT(0)
0381 #define VMMDEV_HGCM_REQ_CANCELLED BIT(1)
0382
0383
0384 struct vmmdev_hgcmreq_header {
0385
0386 struct vmmdev_request_header header;
0387
0388
0389 u32 flags;
0390
0391
0392 s32 result;
0393 };
0394 VMMDEV_ASSERT_SIZE(vmmdev_hgcmreq_header, 24 + 8);
0395
0396
0397 struct vmmdev_hgcm_connect {
0398
0399 struct vmmdev_hgcmreq_header header;
0400
0401
0402 struct vmmdev_hgcm_service_location loc;
0403
0404
0405 u32 client_id;
0406 };
0407 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_connect, 32 + 132 + 4);
0408
0409
0410 struct vmmdev_hgcm_disconnect {
0411
0412 struct vmmdev_hgcmreq_header header;
0413
0414
0415 u32 client_id;
0416 };
0417 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_disconnect, 32 + 4);
0418
0419 #define VMMDEV_HGCM_MAX_PARMS 32
0420
0421
0422 struct vmmdev_hgcm_call {
0423
0424 struct vmmdev_hgcmreq_header header;
0425
0426
0427 u32 client_id;
0428
0429 u32 function;
0430
0431 u32 parm_count;
0432
0433 };
0434 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_call, 32 + 12);
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445 struct vmmdev_hgcm_cancel2 {
0446
0447 struct vmmdev_request_header header;
0448
0449 u32 phys_req_to_cancel;
0450 };
0451 VMMDEV_ASSERT_SIZE(vmmdev_hgcm_cancel2, 24 + 4);
0452
0453 #endif