root/drivers/virt/vboxguest/vboxguest_core.c

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

DEFINITIONS

This source file includes following definitions.
  1. vbg_guest_mappings_init
  2. vbg_guest_mappings_exit
  3. vbg_report_guest_info
  4. vbg_report_driver_status
  5. vbg_balloon_inflate
  6. vbg_balloon_deflate
  7. vbg_balloon_work
  8. vbg_heartbeat_timer
  9. vbg_heartbeat_host_config
  10. vbg_heartbeat_init
  11. vbg_heartbeat_exit
  12. vbg_track_bit_usage
  13. vbg_reset_host_event_filter
  14. vbg_set_session_event_filter
  15. vbg_reset_host_capabilities
  16. vbg_set_session_capabilities
  17. vbg_query_host_version
  18. vbg_core_init
  19. vbg_core_exit
  20. vbg_core_open_session
  21. vbg_core_close_session
  22. vbg_ioctl_chk
  23. vbg_ioctl_driver_version_info
  24. vbg_wait_event_cond
  25. vbg_consume_events_locked
  26. vbg_ioctl_wait_for_events
  27. vbg_ioctl_interrupt_all_wait_events
  28. vbg_req_allowed
  29. vbg_ioctl_vmmrequest
  30. vbg_ioctl_hgcm_connect
  31. vbg_ioctl_hgcm_disconnect
  32. vbg_param_valid
  33. vbg_ioctl_hgcm_call
  34. vbg_ioctl_log
  35. vbg_ioctl_change_filter_mask
  36. vbg_ioctl_change_guest_capabilities
  37. vbg_ioctl_check_balloon
  38. vbg_ioctl_write_core_dump
  39. vbg_core_ioctl
  40. vbg_core_set_mouse_status
  41. vbg_core_isr

   1 /* SPDX-License-Identifier: (GPL-2.0 OR CDDL-1.0) */
   2 /*
   3  * vboxguest core guest-device handling code, VBoxGuest.cpp in upstream svn.
   4  *
   5  * Copyright (C) 2007-2016 Oracle Corporation
   6  */
   7 
   8 #include <linux/device.h>
   9 #include <linux/mm.h>
  10 #include <linux/sched.h>
  11 #include <linux/sizes.h>
  12 #include <linux/slab.h>
  13 #include <linux/vbox_err.h>
  14 #include <linux/vbox_utils.h>
  15 #include <linux/vmalloc.h>
  16 #include "vboxguest_core.h"
  17 #include "vboxguest_version.h"
  18 
  19 /* Get the pointer to the first HGCM parameter. */
  20 #define VBG_IOCTL_HGCM_CALL_PARMS(a) \
  21         ((struct vmmdev_hgcm_function_parameter *)( \
  22                 (u8 *)(a) + sizeof(struct vbg_ioctl_hgcm_call)))
  23 /* Get the pointer to the first HGCM parameter in a 32-bit request. */
  24 #define VBG_IOCTL_HGCM_CALL_PARMS32(a) \
  25         ((struct vmmdev_hgcm_function_parameter32 *)( \
  26                 (u8 *)(a) + sizeof(struct vbg_ioctl_hgcm_call)))
  27 
  28 #define GUEST_MAPPINGS_TRIES    5
  29 
  30 #define VBG_KERNEL_REQUEST \
  31         (VMMDEV_REQUESTOR_KERNEL | VMMDEV_REQUESTOR_USR_DRV | \
  32          VMMDEV_REQUESTOR_CON_DONT_KNOW | VMMDEV_REQUESTOR_TRUST_NOT_GIVEN)
  33 
  34 /**
  35  * Reserves memory in which the VMM can relocate any guest mappings
  36  * that are floating around.
  37  *
  38  * This operation is a little bit tricky since the VMM might not accept
  39  * just any address because of address clashes between the three contexts
  40  * it operates in, so we try several times.
  41  *
  42  * Failure to reserve the guest mappings is ignored.
  43  *
  44  * @gdev:               The Guest extension device.
  45  */
  46 static void vbg_guest_mappings_init(struct vbg_dev *gdev)
  47 {
  48         struct vmmdev_hypervisorinfo *req;
  49         void *guest_mappings[GUEST_MAPPINGS_TRIES];
  50         struct page **pages = NULL;
  51         u32 size, hypervisor_size;
  52         int i, rc;
  53 
  54         /* Query the required space. */
  55         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HYPERVISOR_INFO,
  56                             VBG_KERNEL_REQUEST);
  57         if (!req)
  58                 return;
  59 
  60         req->hypervisor_start = 0;
  61         req->hypervisor_size = 0;
  62         rc = vbg_req_perform(gdev, req);
  63         if (rc < 0)
  64                 goto out;
  65 
  66         /*
  67          * The VMM will report back if there is nothing it wants to map, like
  68          * for instance in VT-x and AMD-V mode.
  69          */
  70         if (req->hypervisor_size == 0)
  71                 goto out;
  72 
  73         hypervisor_size = req->hypervisor_size;
  74         /* Add 4M so that we can align the vmap to 4MiB as the host requires. */
  75         size = PAGE_ALIGN(req->hypervisor_size) + SZ_4M;
  76 
  77         pages = kmalloc_array(size >> PAGE_SHIFT, sizeof(*pages), GFP_KERNEL);
  78         if (!pages)
  79                 goto out;
  80 
  81         gdev->guest_mappings_dummy_page = alloc_page(GFP_HIGHUSER);
  82         if (!gdev->guest_mappings_dummy_page)
  83                 goto out;
  84 
  85         for (i = 0; i < (size >> PAGE_SHIFT); i++)
  86                 pages[i] = gdev->guest_mappings_dummy_page;
  87 
  88         /*
  89          * Try several times, the VMM might not accept some addresses because
  90          * of address clashes between the three contexts.
  91          */
  92         for (i = 0; i < GUEST_MAPPINGS_TRIES; i++) {
  93                 guest_mappings[i] = vmap(pages, (size >> PAGE_SHIFT),
  94                                          VM_MAP, PAGE_KERNEL_RO);
  95                 if (!guest_mappings[i])
  96                         break;
  97 
  98                 req->header.request_type = VMMDEVREQ_SET_HYPERVISOR_INFO;
  99                 req->header.rc = VERR_INTERNAL_ERROR;
 100                 req->hypervisor_size = hypervisor_size;
 101                 req->hypervisor_start =
 102                         (unsigned long)PTR_ALIGN(guest_mappings[i], SZ_4M);
 103 
 104                 rc = vbg_req_perform(gdev, req);
 105                 if (rc >= 0) {
 106                         gdev->guest_mappings = guest_mappings[i];
 107                         break;
 108                 }
 109         }
 110 
 111         /* Free vmap's from failed attempts. */
 112         while (--i >= 0)
 113                 vunmap(guest_mappings[i]);
 114 
 115         /* On failure free the dummy-page backing the vmap */
 116         if (!gdev->guest_mappings) {
 117                 __free_page(gdev->guest_mappings_dummy_page);
 118                 gdev->guest_mappings_dummy_page = NULL;
 119         }
 120 
 121 out:
 122         vbg_req_free(req, sizeof(*req));
 123         kfree(pages);
 124 }
 125 
 126 /**
 127  * Undo what vbg_guest_mappings_init did.
 128  *
 129  * @gdev:               The Guest extension device.
 130  */
 131 static void vbg_guest_mappings_exit(struct vbg_dev *gdev)
 132 {
 133         struct vmmdev_hypervisorinfo *req;
 134         int rc;
 135 
 136         if (!gdev->guest_mappings)
 137                 return;
 138 
 139         /*
 140          * Tell the host that we're going to free the memory we reserved for
 141          * it, the free it up. (Leak the memory if anything goes wrong here.)
 142          */
 143         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_HYPERVISOR_INFO,
 144                             VBG_KERNEL_REQUEST);
 145         if (!req)
 146                 return;
 147 
 148         req->hypervisor_start = 0;
 149         req->hypervisor_size = 0;
 150 
 151         rc = vbg_req_perform(gdev, req);
 152 
 153         vbg_req_free(req, sizeof(*req));
 154 
 155         if (rc < 0) {
 156                 vbg_err("%s error: %d\n", __func__, rc);
 157                 return;
 158         }
 159 
 160         vunmap(gdev->guest_mappings);
 161         gdev->guest_mappings = NULL;
 162 
 163         __free_page(gdev->guest_mappings_dummy_page);
 164         gdev->guest_mappings_dummy_page = NULL;
 165 }
 166 
 167 /**
 168  * Report the guest information to the host.
 169  * Return: 0 or negative errno value.
 170  * @gdev:               The Guest extension device.
 171  */
 172 static int vbg_report_guest_info(struct vbg_dev *gdev)
 173 {
 174         /*
 175          * Allocate and fill in the two guest info reports.
 176          */
 177         struct vmmdev_guest_info *req1 = NULL;
 178         struct vmmdev_guest_info2 *req2 = NULL;
 179         int rc, ret = -ENOMEM;
 180 
 181         req1 = vbg_req_alloc(sizeof(*req1), VMMDEVREQ_REPORT_GUEST_INFO,
 182                              VBG_KERNEL_REQUEST);
 183         req2 = vbg_req_alloc(sizeof(*req2), VMMDEVREQ_REPORT_GUEST_INFO2,
 184                              VBG_KERNEL_REQUEST);
 185         if (!req1 || !req2)
 186                 goto out_free;
 187 
 188         req1->interface_version = VMMDEV_VERSION;
 189         req1->os_type = VMMDEV_OSTYPE_LINUX26;
 190 #if __BITS_PER_LONG == 64
 191         req1->os_type |= VMMDEV_OSTYPE_X64;
 192 #endif
 193 
 194         req2->additions_major = VBG_VERSION_MAJOR;
 195         req2->additions_minor = VBG_VERSION_MINOR;
 196         req2->additions_build = VBG_VERSION_BUILD;
 197         req2->additions_revision = VBG_SVN_REV;
 198         req2->additions_features =
 199                 VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO;
 200         strlcpy(req2->name, VBG_VERSION_STRING,
 201                 sizeof(req2->name));
 202 
 203         /*
 204          * There are two protocols here:
 205          *      1. INFO2 + INFO1. Supported by >=3.2.51.
 206          *      2. INFO1 and optionally INFO2. The old protocol.
 207          *
 208          * We try protocol 2 first.  It will fail with VERR_NOT_SUPPORTED
 209          * if not supported by the VMMDev (message ordering requirement).
 210          */
 211         rc = vbg_req_perform(gdev, req2);
 212         if (rc >= 0) {
 213                 rc = vbg_req_perform(gdev, req1);
 214         } else if (rc == VERR_NOT_SUPPORTED || rc == VERR_NOT_IMPLEMENTED) {
 215                 rc = vbg_req_perform(gdev, req1);
 216                 if (rc >= 0) {
 217                         rc = vbg_req_perform(gdev, req2);
 218                         if (rc == VERR_NOT_IMPLEMENTED)
 219                                 rc = VINF_SUCCESS;
 220                 }
 221         }
 222         ret = vbg_status_code_to_errno(rc);
 223 
 224 out_free:
 225         vbg_req_free(req2, sizeof(*req2));
 226         vbg_req_free(req1, sizeof(*req1));
 227         return ret;
 228 }
 229 
 230 /**
 231  * Report the guest driver status to the host.
 232  * Return: 0 or negative errno value.
 233  * @gdev:               The Guest extension device.
 234  * @active:             Flag whether the driver is now active or not.
 235  */
 236 static int vbg_report_driver_status(struct vbg_dev *gdev, bool active)
 237 {
 238         struct vmmdev_guest_status *req;
 239         int rc;
 240 
 241         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_REPORT_GUEST_STATUS,
 242                             VBG_KERNEL_REQUEST);
 243         if (!req)
 244                 return -ENOMEM;
 245 
 246         req->facility = VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER;
 247         if (active)
 248                 req->status = VBOXGUEST_FACILITY_STATUS_ACTIVE;
 249         else
 250                 req->status = VBOXGUEST_FACILITY_STATUS_INACTIVE;
 251         req->flags = 0;
 252 
 253         rc = vbg_req_perform(gdev, req);
 254         if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
 255                 rc = VINF_SUCCESS;
 256 
 257         vbg_req_free(req, sizeof(*req));
 258 
 259         return vbg_status_code_to_errno(rc);
 260 }
 261 
 262 /**
 263  * Inflate the balloon by one chunk. The caller owns the balloon mutex.
 264  * Return: 0 or negative errno value.
 265  * @gdev:               The Guest extension device.
 266  * @chunk_idx:          Index of the chunk.
 267  */
 268 static int vbg_balloon_inflate(struct vbg_dev *gdev, u32 chunk_idx)
 269 {
 270         struct vmmdev_memballoon_change *req = gdev->mem_balloon.change_req;
 271         struct page **pages;
 272         int i, rc, ret;
 273 
 274         pages = kmalloc_array(VMMDEV_MEMORY_BALLOON_CHUNK_PAGES,
 275                               sizeof(*pages),
 276                               GFP_KERNEL | __GFP_NOWARN);
 277         if (!pages)
 278                 return -ENOMEM;
 279 
 280         req->header.size = sizeof(*req);
 281         req->inflate = true;
 282         req->pages = VMMDEV_MEMORY_BALLOON_CHUNK_PAGES;
 283 
 284         for (i = 0; i < VMMDEV_MEMORY_BALLOON_CHUNK_PAGES; i++) {
 285                 pages[i] = alloc_page(GFP_KERNEL | __GFP_NOWARN);
 286                 if (!pages[i]) {
 287                         ret = -ENOMEM;
 288                         goto out_error;
 289                 }
 290 
 291                 req->phys_page[i] = page_to_phys(pages[i]);
 292         }
 293 
 294         rc = vbg_req_perform(gdev, req);
 295         if (rc < 0) {
 296                 vbg_err("%s error, rc: %d\n", __func__, rc);
 297                 ret = vbg_status_code_to_errno(rc);
 298                 goto out_error;
 299         }
 300 
 301         gdev->mem_balloon.pages[chunk_idx] = pages;
 302 
 303         return 0;
 304 
 305 out_error:
 306         while (--i >= 0)
 307                 __free_page(pages[i]);
 308         kfree(pages);
 309 
 310         return ret;
 311 }
 312 
 313 /**
 314  * Deflate the balloon by one chunk. The caller owns the balloon mutex.
 315  * Return: 0 or negative errno value.
 316  * @gdev:               The Guest extension device.
 317  * @chunk_idx:          Index of the chunk.
 318  */
 319 static int vbg_balloon_deflate(struct vbg_dev *gdev, u32 chunk_idx)
 320 {
 321         struct vmmdev_memballoon_change *req = gdev->mem_balloon.change_req;
 322         struct page **pages = gdev->mem_balloon.pages[chunk_idx];
 323         int i, rc;
 324 
 325         req->header.size = sizeof(*req);
 326         req->inflate = false;
 327         req->pages = VMMDEV_MEMORY_BALLOON_CHUNK_PAGES;
 328 
 329         for (i = 0; i < VMMDEV_MEMORY_BALLOON_CHUNK_PAGES; i++)
 330                 req->phys_page[i] = page_to_phys(pages[i]);
 331 
 332         rc = vbg_req_perform(gdev, req);
 333         if (rc < 0) {
 334                 vbg_err("%s error, rc: %d\n", __func__, rc);
 335                 return vbg_status_code_to_errno(rc);
 336         }
 337 
 338         for (i = 0; i < VMMDEV_MEMORY_BALLOON_CHUNK_PAGES; i++)
 339                 __free_page(pages[i]);
 340         kfree(pages);
 341         gdev->mem_balloon.pages[chunk_idx] = NULL;
 342 
 343         return 0;
 344 }
 345 
 346 /**
 347  * Respond to VMMDEV_EVENT_BALLOON_CHANGE_REQUEST events, query the size
 348  * the host wants the balloon to be and adjust accordingly.
 349  */
 350 static void vbg_balloon_work(struct work_struct *work)
 351 {
 352         struct vbg_dev *gdev =
 353                 container_of(work, struct vbg_dev, mem_balloon.work);
 354         struct vmmdev_memballoon_info *req = gdev->mem_balloon.get_req;
 355         u32 i, chunks;
 356         int rc, ret;
 357 
 358         /*
 359          * Setting this bit means that we request the value from the host and
 360          * change the guest memory balloon according to the returned value.
 361          */
 362         req->event_ack = VMMDEV_EVENT_BALLOON_CHANGE_REQUEST;
 363         rc = vbg_req_perform(gdev, req);
 364         if (rc < 0) {
 365                 vbg_err("%s error, rc: %d)\n", __func__, rc);
 366                 return;
 367         }
 368 
 369         /*
 370          * The host always returns the same maximum amount of chunks, so
 371          * we do this once.
 372          */
 373         if (!gdev->mem_balloon.max_chunks) {
 374                 gdev->mem_balloon.pages =
 375                         devm_kcalloc(gdev->dev, req->phys_mem_chunks,
 376                                      sizeof(struct page **), GFP_KERNEL);
 377                 if (!gdev->mem_balloon.pages)
 378                         return;
 379 
 380                 gdev->mem_balloon.max_chunks = req->phys_mem_chunks;
 381         }
 382 
 383         chunks = req->balloon_chunks;
 384         if (chunks > gdev->mem_balloon.max_chunks) {
 385                 vbg_err("%s: illegal balloon size %u (max=%u)\n",
 386                         __func__, chunks, gdev->mem_balloon.max_chunks);
 387                 return;
 388         }
 389 
 390         if (chunks > gdev->mem_balloon.chunks) {
 391                 /* inflate */
 392                 for (i = gdev->mem_balloon.chunks; i < chunks; i++) {
 393                         ret = vbg_balloon_inflate(gdev, i);
 394                         if (ret < 0)
 395                                 return;
 396 
 397                         gdev->mem_balloon.chunks++;
 398                 }
 399         } else {
 400                 /* deflate */
 401                 for (i = gdev->mem_balloon.chunks; i-- > chunks;) {
 402                         ret = vbg_balloon_deflate(gdev, i);
 403                         if (ret < 0)
 404                                 return;
 405 
 406                         gdev->mem_balloon.chunks--;
 407                 }
 408         }
 409 }
 410 
 411 /**
 412  * Callback for heartbeat timer.
 413  */
 414 static void vbg_heartbeat_timer(struct timer_list *t)
 415 {
 416         struct vbg_dev *gdev = from_timer(gdev, t, heartbeat_timer);
 417 
 418         vbg_req_perform(gdev, gdev->guest_heartbeat_req);
 419         mod_timer(&gdev->heartbeat_timer,
 420                   msecs_to_jiffies(gdev->heartbeat_interval_ms));
 421 }
 422 
 423 /**
 424  * Configure the host to check guest's heartbeat
 425  * and get heartbeat interval from the host.
 426  * Return: 0 or negative errno value.
 427  * @gdev:               The Guest extension device.
 428  * @enabled:            Set true to enable guest heartbeat checks on host.
 429  */
 430 static int vbg_heartbeat_host_config(struct vbg_dev *gdev, bool enabled)
 431 {
 432         struct vmmdev_heartbeat *req;
 433         int rc;
 434 
 435         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_HEARTBEAT_CONFIGURE,
 436                             VBG_KERNEL_REQUEST);
 437         if (!req)
 438                 return -ENOMEM;
 439 
 440         req->enabled = enabled;
 441         req->interval_ns = 0;
 442         rc = vbg_req_perform(gdev, req);
 443         do_div(req->interval_ns, 1000000); /* ns -> ms */
 444         gdev->heartbeat_interval_ms = req->interval_ns;
 445         vbg_req_free(req, sizeof(*req));
 446 
 447         return vbg_status_code_to_errno(rc);
 448 }
 449 
 450 /**
 451  * Initializes the heartbeat timer. This feature may be disabled by the host.
 452  * Return: 0 or negative errno value.
 453  * @gdev:               The Guest extension device.
 454  */
 455 static int vbg_heartbeat_init(struct vbg_dev *gdev)
 456 {
 457         int ret;
 458 
 459         /* Make sure that heartbeat checking is disabled if we fail. */
 460         ret = vbg_heartbeat_host_config(gdev, false);
 461         if (ret < 0)
 462                 return ret;
 463 
 464         ret = vbg_heartbeat_host_config(gdev, true);
 465         if (ret < 0)
 466                 return ret;
 467 
 468         gdev->guest_heartbeat_req = vbg_req_alloc(
 469                                         sizeof(*gdev->guest_heartbeat_req),
 470                                         VMMDEVREQ_GUEST_HEARTBEAT,
 471                                         VBG_KERNEL_REQUEST);
 472         if (!gdev->guest_heartbeat_req)
 473                 return -ENOMEM;
 474 
 475         vbg_info("%s: Setting up heartbeat to trigger every %d milliseconds\n",
 476                  __func__, gdev->heartbeat_interval_ms);
 477         mod_timer(&gdev->heartbeat_timer, 0);
 478 
 479         return 0;
 480 }
 481 
 482 /**
 483  * Cleanup hearbeat code, stop HB timer and disable host heartbeat checking.
 484  * @gdev:               The Guest extension device.
 485  */
 486 static void vbg_heartbeat_exit(struct vbg_dev *gdev)
 487 {
 488         del_timer_sync(&gdev->heartbeat_timer);
 489         vbg_heartbeat_host_config(gdev, false);
 490         vbg_req_free(gdev->guest_heartbeat_req,
 491                      sizeof(*gdev->guest_heartbeat_req));
 492 }
 493 
 494 /**
 495  * Applies a change to the bit usage tracker.
 496  * Return: true if the mask changed, false if not.
 497  * @tracker:            The bit usage tracker.
 498  * @changed:            The bits to change.
 499  * @previous:           The previous value of the bits.
 500  */
 501 static bool vbg_track_bit_usage(struct vbg_bit_usage_tracker *tracker,
 502                                 u32 changed, u32 previous)
 503 {
 504         bool global_change = false;
 505 
 506         while (changed) {
 507                 u32 bit = ffs(changed) - 1;
 508                 u32 bitmask = BIT(bit);
 509 
 510                 if (bitmask & previous) {
 511                         tracker->per_bit_usage[bit] -= 1;
 512                         if (tracker->per_bit_usage[bit] == 0) {
 513                                 global_change = true;
 514                                 tracker->mask &= ~bitmask;
 515                         }
 516                 } else {
 517                         tracker->per_bit_usage[bit] += 1;
 518                         if (tracker->per_bit_usage[bit] == 1) {
 519                                 global_change = true;
 520                                 tracker->mask |= bitmask;
 521                         }
 522                 }
 523 
 524                 changed &= ~bitmask;
 525         }
 526 
 527         return global_change;
 528 }
 529 
 530 /**
 531  * Init and termination worker for resetting the (host) event filter on the host
 532  * Return: 0 or negative errno value.
 533  * @gdev:                  The Guest extension device.
 534  * @fixed_events:          Fixed events (init time).
 535  */
 536 static int vbg_reset_host_event_filter(struct vbg_dev *gdev,
 537                                        u32 fixed_events)
 538 {
 539         struct vmmdev_mask *req;
 540         int rc;
 541 
 542         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK,
 543                             VBG_KERNEL_REQUEST);
 544         if (!req)
 545                 return -ENOMEM;
 546 
 547         req->not_mask = U32_MAX & ~fixed_events;
 548         req->or_mask = fixed_events;
 549         rc = vbg_req_perform(gdev, req);
 550         if (rc < 0)
 551                 vbg_err("%s error, rc: %d\n", __func__, rc);
 552 
 553         vbg_req_free(req, sizeof(*req));
 554         return vbg_status_code_to_errno(rc);
 555 }
 556 
 557 /**
 558  * Changes the event filter mask for the given session.
 559  *
 560  * This is called in response to VBG_IOCTL_CHANGE_FILTER_MASK as well as to
 561  * do session cleanup. Takes the session spinlock.
 562  *
 563  * Return: 0 or negative errno value.
 564  * @gdev:                       The Guest extension device.
 565  * @session:                    The session.
 566  * @or_mask:                    The events to add.
 567  * @not_mask:                   The events to remove.
 568  * @session_termination:        Set if we're called by the session cleanup code.
 569  *                              This tweaks the error handling so we perform
 570  *                              proper session cleanup even if the host
 571  *                              misbehaves.
 572  */
 573 static int vbg_set_session_event_filter(struct vbg_dev *gdev,
 574                                         struct vbg_session *session,
 575                                         u32 or_mask, u32 not_mask,
 576                                         bool session_termination)
 577 {
 578         struct vmmdev_mask *req;
 579         u32 changed, previous;
 580         int rc, ret = 0;
 581 
 582         /*
 583          * Allocate a request buffer before taking the spinlock, when
 584          * the session is being terminated the requestor is the kernel,
 585          * as we're cleaning up.
 586          */
 587         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK,
 588                             session_termination ? VBG_KERNEL_REQUEST :
 589                                                   session->requestor);
 590         if (!req) {
 591                 if (!session_termination)
 592                         return -ENOMEM;
 593                 /* Ignore allocation failure, we must do session cleanup. */
 594         }
 595 
 596         mutex_lock(&gdev->session_mutex);
 597 
 598         /* Apply the changes to the session mask. */
 599         previous = session->event_filter;
 600         session->event_filter |= or_mask;
 601         session->event_filter &= ~not_mask;
 602 
 603         /* If anything actually changed, update the global usage counters. */
 604         changed = previous ^ session->event_filter;
 605         if (!changed)
 606                 goto out;
 607 
 608         vbg_track_bit_usage(&gdev->event_filter_tracker, changed, previous);
 609         or_mask = gdev->fixed_events | gdev->event_filter_tracker.mask;
 610 
 611         if (gdev->event_filter_host == or_mask || !req)
 612                 goto out;
 613 
 614         gdev->event_filter_host = or_mask;
 615         req->or_mask = or_mask;
 616         req->not_mask = ~or_mask;
 617         rc = vbg_req_perform(gdev, req);
 618         if (rc < 0) {
 619                 ret = vbg_status_code_to_errno(rc);
 620 
 621                 /* Failed, roll back (unless it's session termination time). */
 622                 gdev->event_filter_host = U32_MAX;
 623                 if (session_termination)
 624                         goto out;
 625 
 626                 vbg_track_bit_usage(&gdev->event_filter_tracker, changed,
 627                                     session->event_filter);
 628                 session->event_filter = previous;
 629         }
 630 
 631 out:
 632         mutex_unlock(&gdev->session_mutex);
 633         vbg_req_free(req, sizeof(*req));
 634 
 635         return ret;
 636 }
 637 
 638 /**
 639  * Init and termination worker for set guest capabilities to zero on the host.
 640  * Return: 0 or negative errno value.
 641  * @gdev:               The Guest extension device.
 642  */
 643 static int vbg_reset_host_capabilities(struct vbg_dev *gdev)
 644 {
 645         struct vmmdev_mask *req;
 646         int rc;
 647 
 648         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
 649                             VBG_KERNEL_REQUEST);
 650         if (!req)
 651                 return -ENOMEM;
 652 
 653         req->not_mask = U32_MAX;
 654         req->or_mask = 0;
 655         rc = vbg_req_perform(gdev, req);
 656         if (rc < 0)
 657                 vbg_err("%s error, rc: %d\n", __func__, rc);
 658 
 659         vbg_req_free(req, sizeof(*req));
 660         return vbg_status_code_to_errno(rc);
 661 }
 662 
 663 /**
 664  * Sets the guest capabilities for a session. Takes the session spinlock.
 665  * Return: 0 or negative errno value.
 666  * @gdev:                       The Guest extension device.
 667  * @session:                    The session.
 668  * @or_mask:                    The capabilities to add.
 669  * @not_mask:                   The capabilities to remove.
 670  * @session_termination:        Set if we're called by the session cleanup code.
 671  *                              This tweaks the error handling so we perform
 672  *                              proper session cleanup even if the host
 673  *                              misbehaves.
 674  */
 675 static int vbg_set_session_capabilities(struct vbg_dev *gdev,
 676                                         struct vbg_session *session,
 677                                         u32 or_mask, u32 not_mask,
 678                                         bool session_termination)
 679 {
 680         struct vmmdev_mask *req;
 681         u32 changed, previous;
 682         int rc, ret = 0;
 683 
 684         /*
 685          * Allocate a request buffer before taking the spinlock, when
 686          * the session is being terminated the requestor is the kernel,
 687          * as we're cleaning up.
 688          */
 689         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
 690                             session_termination ? VBG_KERNEL_REQUEST :
 691                                                   session->requestor);
 692         if (!req) {
 693                 if (!session_termination)
 694                         return -ENOMEM;
 695                 /* Ignore allocation failure, we must do session cleanup. */
 696         }
 697 
 698         mutex_lock(&gdev->session_mutex);
 699 
 700         /* Apply the changes to the session mask. */
 701         previous = session->guest_caps;
 702         session->guest_caps |= or_mask;
 703         session->guest_caps &= ~not_mask;
 704 
 705         /* If anything actually changed, update the global usage counters. */
 706         changed = previous ^ session->guest_caps;
 707         if (!changed)
 708                 goto out;
 709 
 710         vbg_track_bit_usage(&gdev->guest_caps_tracker, changed, previous);
 711         or_mask = gdev->guest_caps_tracker.mask;
 712 
 713         if (gdev->guest_caps_host == or_mask || !req)
 714                 goto out;
 715 
 716         gdev->guest_caps_host = or_mask;
 717         req->or_mask = or_mask;
 718         req->not_mask = ~or_mask;
 719         rc = vbg_req_perform(gdev, req);
 720         if (rc < 0) {
 721                 ret = vbg_status_code_to_errno(rc);
 722 
 723                 /* Failed, roll back (unless it's session termination time). */
 724                 gdev->guest_caps_host = U32_MAX;
 725                 if (session_termination)
 726                         goto out;
 727 
 728                 vbg_track_bit_usage(&gdev->guest_caps_tracker, changed,
 729                                     session->guest_caps);
 730                 session->guest_caps = previous;
 731         }
 732 
 733 out:
 734         mutex_unlock(&gdev->session_mutex);
 735         vbg_req_free(req, sizeof(*req));
 736 
 737         return ret;
 738 }
 739 
 740 /**
 741  * vbg_query_host_version get the host feature mask and version information.
 742  * Return: 0 or negative errno value.
 743  * @gdev:               The Guest extension device.
 744  */
 745 static int vbg_query_host_version(struct vbg_dev *gdev)
 746 {
 747         struct vmmdev_host_version *req;
 748         int rc, ret;
 749 
 750         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HOST_VERSION,
 751                             VBG_KERNEL_REQUEST);
 752         if (!req)
 753                 return -ENOMEM;
 754 
 755         rc = vbg_req_perform(gdev, req);
 756         ret = vbg_status_code_to_errno(rc);
 757         if (ret) {
 758                 vbg_err("%s error: %d\n", __func__, rc);
 759                 goto out;
 760         }
 761 
 762         snprintf(gdev->host_version, sizeof(gdev->host_version), "%u.%u.%ur%u",
 763                  req->major, req->minor, req->build, req->revision);
 764         gdev->host_features = req->features;
 765 
 766         vbg_info("vboxguest: host-version: %s %#x\n", gdev->host_version,
 767                  gdev->host_features);
 768 
 769         if (!(req->features & VMMDEV_HVF_HGCM_PHYS_PAGE_LIST)) {
 770                 vbg_err("vboxguest: Error host too old (does not support page-lists)\n");
 771                 ret = -ENODEV;
 772         }
 773 
 774 out:
 775         vbg_req_free(req, sizeof(*req));
 776         return ret;
 777 }
 778 
 779 /**
 780  * Initializes the VBoxGuest device extension when the
 781  * device driver is loaded.
 782  *
 783  * The native code locates the VMMDev on the PCI bus and retrieve
 784  * the MMIO and I/O port ranges, this function will take care of
 785  * mapping the MMIO memory (if present). Upon successful return
 786  * the native code should set up the interrupt handler.
 787  *
 788  * Return: 0 or negative errno value.
 789  *
 790  * @gdev:               The Guest extension device.
 791  * @fixed_events:       Events that will be enabled upon init and no client
 792  *                      will ever be allowed to mask.
 793  */
 794 int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events)
 795 {
 796         int ret = -ENOMEM;
 797 
 798         gdev->fixed_events = fixed_events | VMMDEV_EVENT_HGCM;
 799         gdev->event_filter_host = U32_MAX;      /* forces a report */
 800         gdev->guest_caps_host = U32_MAX;        /* forces a report */
 801 
 802         init_waitqueue_head(&gdev->event_wq);
 803         init_waitqueue_head(&gdev->hgcm_wq);
 804         spin_lock_init(&gdev->event_spinlock);
 805         mutex_init(&gdev->session_mutex);
 806         mutex_init(&gdev->cancel_req_mutex);
 807         timer_setup(&gdev->heartbeat_timer, vbg_heartbeat_timer, 0);
 808         INIT_WORK(&gdev->mem_balloon.work, vbg_balloon_work);
 809 
 810         gdev->mem_balloon.get_req =
 811                 vbg_req_alloc(sizeof(*gdev->mem_balloon.get_req),
 812                               VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ,
 813                               VBG_KERNEL_REQUEST);
 814         gdev->mem_balloon.change_req =
 815                 vbg_req_alloc(sizeof(*gdev->mem_balloon.change_req),
 816                               VMMDEVREQ_CHANGE_MEMBALLOON,
 817                               VBG_KERNEL_REQUEST);
 818         gdev->cancel_req =
 819                 vbg_req_alloc(sizeof(*(gdev->cancel_req)),
 820                               VMMDEVREQ_HGCM_CANCEL2,
 821                               VBG_KERNEL_REQUEST);
 822         gdev->ack_events_req =
 823                 vbg_req_alloc(sizeof(*gdev->ack_events_req),
 824                               VMMDEVREQ_ACKNOWLEDGE_EVENTS,
 825                               VBG_KERNEL_REQUEST);
 826         gdev->mouse_status_req =
 827                 vbg_req_alloc(sizeof(*gdev->mouse_status_req),
 828                               VMMDEVREQ_GET_MOUSE_STATUS,
 829                               VBG_KERNEL_REQUEST);
 830 
 831         if (!gdev->mem_balloon.get_req || !gdev->mem_balloon.change_req ||
 832             !gdev->cancel_req || !gdev->ack_events_req ||
 833             !gdev->mouse_status_req)
 834                 goto err_free_reqs;
 835 
 836         ret = vbg_query_host_version(gdev);
 837         if (ret)
 838                 goto err_free_reqs;
 839 
 840         ret = vbg_report_guest_info(gdev);
 841         if (ret) {
 842                 vbg_err("vboxguest: vbg_report_guest_info error: %d\n", ret);
 843                 goto err_free_reqs;
 844         }
 845 
 846         ret = vbg_reset_host_event_filter(gdev, gdev->fixed_events);
 847         if (ret) {
 848                 vbg_err("vboxguest: Error setting fixed event filter: %d\n",
 849                         ret);
 850                 goto err_free_reqs;
 851         }
 852 
 853         ret = vbg_reset_host_capabilities(gdev);
 854         if (ret) {
 855                 vbg_err("vboxguest: Error clearing guest capabilities: %d\n",
 856                         ret);
 857                 goto err_free_reqs;
 858         }
 859 
 860         ret = vbg_core_set_mouse_status(gdev, 0);
 861         if (ret) {
 862                 vbg_err("vboxguest: Error clearing mouse status: %d\n", ret);
 863                 goto err_free_reqs;
 864         }
 865 
 866         /* These may fail without requiring the driver init to fail. */
 867         vbg_guest_mappings_init(gdev);
 868         vbg_heartbeat_init(gdev);
 869 
 870         /* All Done! */
 871         ret = vbg_report_driver_status(gdev, true);
 872         if (ret < 0)
 873                 vbg_err("vboxguest: Error reporting driver status: %d\n", ret);
 874 
 875         return 0;
 876 
 877 err_free_reqs:
 878         vbg_req_free(gdev->mouse_status_req,
 879                      sizeof(*gdev->mouse_status_req));
 880         vbg_req_free(gdev->ack_events_req,
 881                      sizeof(*gdev->ack_events_req));
 882         vbg_req_free(gdev->cancel_req,
 883                      sizeof(*gdev->cancel_req));
 884         vbg_req_free(gdev->mem_balloon.change_req,
 885                      sizeof(*gdev->mem_balloon.change_req));
 886         vbg_req_free(gdev->mem_balloon.get_req,
 887                      sizeof(*gdev->mem_balloon.get_req));
 888         return ret;
 889 }
 890 
 891 /**
 892  * Call this on exit to clean-up vboxguest-core managed resources.
 893  *
 894  * The native code should call this before the driver is loaded,
 895  * but don't call this on shutdown.
 896  * @gdev:               The Guest extension device.
 897  */
 898 void vbg_core_exit(struct vbg_dev *gdev)
 899 {
 900         vbg_heartbeat_exit(gdev);
 901         vbg_guest_mappings_exit(gdev);
 902 
 903         /* Clear the host flags (mouse status etc). */
 904         vbg_reset_host_event_filter(gdev, 0);
 905         vbg_reset_host_capabilities(gdev);
 906         vbg_core_set_mouse_status(gdev, 0);
 907 
 908         vbg_req_free(gdev->mouse_status_req,
 909                      sizeof(*gdev->mouse_status_req));
 910         vbg_req_free(gdev->ack_events_req,
 911                      sizeof(*gdev->ack_events_req));
 912         vbg_req_free(gdev->cancel_req,
 913                      sizeof(*gdev->cancel_req));
 914         vbg_req_free(gdev->mem_balloon.change_req,
 915                      sizeof(*gdev->mem_balloon.change_req));
 916         vbg_req_free(gdev->mem_balloon.get_req,
 917                      sizeof(*gdev->mem_balloon.get_req));
 918 }
 919 
 920 /**
 921  * Creates a VBoxGuest user session.
 922  *
 923  * vboxguest_linux.c calls this when userspace opens the char-device.
 924  * Return: A pointer to the new session or an ERR_PTR on error.
 925  * @gdev:               The Guest extension device.
 926  * @requestor:          VMMDEV_REQUESTOR_* flags
 927  */
 928 struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, u32 requestor)
 929 {
 930         struct vbg_session *session;
 931 
 932         session = kzalloc(sizeof(*session), GFP_KERNEL);
 933         if (!session)
 934                 return ERR_PTR(-ENOMEM);
 935 
 936         session->gdev = gdev;
 937         session->requestor = requestor;
 938 
 939         return session;
 940 }
 941 
 942 /**
 943  * Closes a VBoxGuest session.
 944  * @session:            The session to close (and free).
 945  */
 946 void vbg_core_close_session(struct vbg_session *session)
 947 {
 948         struct vbg_dev *gdev = session->gdev;
 949         int i, rc;
 950 
 951         vbg_set_session_capabilities(gdev, session, 0, U32_MAX, true);
 952         vbg_set_session_event_filter(gdev, session, 0, U32_MAX, true);
 953 
 954         for (i = 0; i < ARRAY_SIZE(session->hgcm_client_ids); i++) {
 955                 if (!session->hgcm_client_ids[i])
 956                         continue;
 957 
 958                 /* requestor is kernel here, as we're cleaning up. */
 959                 vbg_hgcm_disconnect(gdev, VBG_KERNEL_REQUEST,
 960                                     session->hgcm_client_ids[i], &rc);
 961         }
 962 
 963         kfree(session);
 964 }
 965 
 966 static int vbg_ioctl_chk(struct vbg_ioctl_hdr *hdr, size_t in_size,
 967                          size_t out_size)
 968 {
 969         if (hdr->size_in  != (sizeof(*hdr) + in_size) ||
 970             hdr->size_out != (sizeof(*hdr) + out_size))
 971                 return -EINVAL;
 972 
 973         return 0;
 974 }
 975 
 976 static int vbg_ioctl_driver_version_info(
 977         struct vbg_ioctl_driver_version_info *info)
 978 {
 979         const u16 vbg_maj_version = VBG_IOC_VERSION >> 16;
 980         u16 min_maj_version, req_maj_version;
 981 
 982         if (vbg_ioctl_chk(&info->hdr, sizeof(info->u.in), sizeof(info->u.out)))
 983                 return -EINVAL;
 984 
 985         req_maj_version = info->u.in.req_version >> 16;
 986         min_maj_version = info->u.in.min_version >> 16;
 987 
 988         if (info->u.in.min_version > info->u.in.req_version ||
 989             min_maj_version != req_maj_version)
 990                 return -EINVAL;
 991 
 992         if (info->u.in.min_version <= VBG_IOC_VERSION &&
 993             min_maj_version == vbg_maj_version) {
 994                 info->u.out.session_version = VBG_IOC_VERSION;
 995         } else {
 996                 info->u.out.session_version = U32_MAX;
 997                 info->hdr.rc = VERR_VERSION_MISMATCH;
 998         }
 999 
1000         info->u.out.driver_version  = VBG_IOC_VERSION;
1001         info->u.out.driver_revision = 0;
1002         info->u.out.reserved1      = 0;
1003         info->u.out.reserved2      = 0;
1004 
1005         return 0;
1006 }
1007 
1008 static bool vbg_wait_event_cond(struct vbg_dev *gdev,
1009                                 struct vbg_session *session,
1010                                 u32 event_mask)
1011 {
1012         unsigned long flags;
1013         bool wakeup;
1014         u32 events;
1015 
1016         spin_lock_irqsave(&gdev->event_spinlock, flags);
1017 
1018         events = gdev->pending_events & event_mask;
1019         wakeup = events || session->cancel_waiters;
1020 
1021         spin_unlock_irqrestore(&gdev->event_spinlock, flags);
1022 
1023         return wakeup;
1024 }
1025 
1026 /* Must be called with the event_lock held */
1027 static u32 vbg_consume_events_locked(struct vbg_dev *gdev,
1028                                      struct vbg_session *session,
1029                                      u32 event_mask)
1030 {
1031         u32 events = gdev->pending_events & event_mask;
1032 
1033         gdev->pending_events &= ~events;
1034         return events;
1035 }
1036 
1037 static int vbg_ioctl_wait_for_events(struct vbg_dev *gdev,
1038                                      struct vbg_session *session,
1039                                      struct vbg_ioctl_wait_for_events *wait)
1040 {
1041         u32 timeout_ms = wait->u.in.timeout_ms;
1042         u32 event_mask = wait->u.in.events;
1043         unsigned long flags;
1044         long timeout;
1045         int ret = 0;
1046 
1047         if (vbg_ioctl_chk(&wait->hdr, sizeof(wait->u.in), sizeof(wait->u.out)))
1048                 return -EINVAL;
1049 
1050         if (timeout_ms == U32_MAX)
1051                 timeout = MAX_SCHEDULE_TIMEOUT;
1052         else
1053                 timeout = msecs_to_jiffies(timeout_ms);
1054 
1055         wait->u.out.events = 0;
1056         do {
1057                 timeout = wait_event_interruptible_timeout(
1058                                 gdev->event_wq,
1059                                 vbg_wait_event_cond(gdev, session, event_mask),
1060                                 timeout);
1061 
1062                 spin_lock_irqsave(&gdev->event_spinlock, flags);
1063 
1064                 if (timeout < 0 || session->cancel_waiters) {
1065                         ret = -EINTR;
1066                 } else if (timeout == 0) {
1067                         ret = -ETIMEDOUT;
1068                 } else {
1069                         wait->u.out.events =
1070                            vbg_consume_events_locked(gdev, session, event_mask);
1071                 }
1072 
1073                 spin_unlock_irqrestore(&gdev->event_spinlock, flags);
1074 
1075                 /*
1076                  * Someone else may have consumed the event(s) first, in
1077                  * which case we go back to waiting.
1078                  */
1079         } while (ret == 0 && wait->u.out.events == 0);
1080 
1081         return ret;
1082 }
1083 
1084 static int vbg_ioctl_interrupt_all_wait_events(struct vbg_dev *gdev,
1085                                                struct vbg_session *session,
1086                                                struct vbg_ioctl_hdr *hdr)
1087 {
1088         unsigned long flags;
1089 
1090         if (hdr->size_in != sizeof(*hdr) || hdr->size_out != sizeof(*hdr))
1091                 return -EINVAL;
1092 
1093         spin_lock_irqsave(&gdev->event_spinlock, flags);
1094         session->cancel_waiters = true;
1095         spin_unlock_irqrestore(&gdev->event_spinlock, flags);
1096 
1097         wake_up(&gdev->event_wq);
1098 
1099         return 0;
1100 }
1101 
1102 /**
1103  * Checks if the VMM request is allowed in the context of the given session.
1104  * Return: 0 or negative errno value.
1105  * @gdev:               The Guest extension device.
1106  * @session:            The calling session.
1107  * @req:                The request.
1108  */
1109 static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session,
1110                            const struct vmmdev_request_header *req)
1111 {
1112         const struct vmmdev_guest_status *guest_status;
1113         bool trusted_apps_only;
1114 
1115         switch (req->request_type) {
1116         /* Trusted users apps only. */
1117         case VMMDEVREQ_QUERY_CREDENTIALS:
1118         case VMMDEVREQ_REPORT_CREDENTIALS_JUDGEMENT:
1119         case VMMDEVREQ_REGISTER_SHARED_MODULE:
1120         case VMMDEVREQ_UNREGISTER_SHARED_MODULE:
1121         case VMMDEVREQ_WRITE_COREDUMP:
1122         case VMMDEVREQ_GET_CPU_HOTPLUG_REQ:
1123         case VMMDEVREQ_SET_CPU_HOTPLUG_STATUS:
1124         case VMMDEVREQ_CHECK_SHARED_MODULES:
1125         case VMMDEVREQ_GET_PAGE_SHARING_STATUS:
1126         case VMMDEVREQ_DEBUG_IS_PAGE_SHARED:
1127         case VMMDEVREQ_REPORT_GUEST_STATS:
1128         case VMMDEVREQ_REPORT_GUEST_USER_STATE:
1129         case VMMDEVREQ_GET_STATISTICS_CHANGE_REQ:
1130                 trusted_apps_only = true;
1131                 break;
1132 
1133         /* Anyone. */
1134         case VMMDEVREQ_GET_MOUSE_STATUS:
1135         case VMMDEVREQ_SET_MOUSE_STATUS:
1136         case VMMDEVREQ_SET_POINTER_SHAPE:
1137         case VMMDEVREQ_GET_HOST_VERSION:
1138         case VMMDEVREQ_IDLE:
1139         case VMMDEVREQ_GET_HOST_TIME:
1140         case VMMDEVREQ_SET_POWER_STATUS:
1141         case VMMDEVREQ_ACKNOWLEDGE_EVENTS:
1142         case VMMDEVREQ_CTL_GUEST_FILTER_MASK:
1143         case VMMDEVREQ_REPORT_GUEST_STATUS:
1144         case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ:
1145         case VMMDEVREQ_VIDEMODE_SUPPORTED:
1146         case VMMDEVREQ_GET_HEIGHT_REDUCTION:
1147         case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ2:
1148         case VMMDEVREQ_VIDEMODE_SUPPORTED2:
1149         case VMMDEVREQ_VIDEO_ACCEL_ENABLE:
1150         case VMMDEVREQ_VIDEO_ACCEL_FLUSH:
1151         case VMMDEVREQ_VIDEO_SET_VISIBLE_REGION:
1152         case VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX:
1153         case VMMDEVREQ_GET_SEAMLESS_CHANGE_REQ:
1154         case VMMDEVREQ_GET_VRDPCHANGE_REQ:
1155         case VMMDEVREQ_LOG_STRING:
1156         case VMMDEVREQ_GET_SESSION_ID:
1157                 trusted_apps_only = false;
1158                 break;
1159 
1160         /* Depends on the request parameters... */
1161         case VMMDEVREQ_REPORT_GUEST_CAPABILITIES:
1162                 guest_status = (const struct vmmdev_guest_status *)req;
1163                 switch (guest_status->facility) {
1164                 case VBOXGUEST_FACILITY_TYPE_ALL:
1165                 case VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER:
1166                         vbg_err("Denying userspace vmm report guest cap. call facility %#08x\n",
1167                                 guest_status->facility);
1168                         return -EPERM;
1169                 case VBOXGUEST_FACILITY_TYPE_VBOX_SERVICE:
1170                         trusted_apps_only = true;
1171                         break;
1172                 case VBOXGUEST_FACILITY_TYPE_VBOX_TRAY_CLIENT:
1173                 case VBOXGUEST_FACILITY_TYPE_SEAMLESS:
1174                 case VBOXGUEST_FACILITY_TYPE_GRAPHICS:
1175                 default:
1176                         trusted_apps_only = false;
1177                         break;
1178                 }
1179                 break;
1180 
1181         /* Anything else is not allowed. */
1182         default:
1183                 vbg_err("Denying userspace vmm call type %#08x\n",
1184                         req->request_type);
1185                 return -EPERM;
1186         }
1187 
1188         if (trusted_apps_only &&
1189             (session->requestor & VMMDEV_REQUESTOR_USER_DEVICE)) {
1190                 vbg_err("Denying userspace vmm call type %#08x through vboxuser device node\n",
1191                         req->request_type);
1192                 return -EPERM;
1193         }
1194 
1195         return 0;
1196 }
1197 
1198 static int vbg_ioctl_vmmrequest(struct vbg_dev *gdev,
1199                                 struct vbg_session *session, void *data)
1200 {
1201         struct vbg_ioctl_hdr *hdr = data;
1202         int ret;
1203 
1204         if (hdr->size_in != hdr->size_out)
1205                 return -EINVAL;
1206 
1207         if (hdr->size_in > VMMDEV_MAX_VMMDEVREQ_SIZE)
1208                 return -E2BIG;
1209 
1210         if (hdr->type == VBG_IOCTL_HDR_TYPE_DEFAULT)
1211                 return -EINVAL;
1212 
1213         ret = vbg_req_allowed(gdev, session, data);
1214         if (ret < 0)
1215                 return ret;
1216 
1217         vbg_req_perform(gdev, data);
1218         WARN_ON(hdr->rc == VINF_HGCM_ASYNC_EXECUTE);
1219 
1220         return 0;
1221 }
1222 
1223 static int vbg_ioctl_hgcm_connect(struct vbg_dev *gdev,
1224                                   struct vbg_session *session,
1225                                   struct vbg_ioctl_hgcm_connect *conn)
1226 {
1227         u32 client_id;
1228         int i, ret;
1229 
1230         if (vbg_ioctl_chk(&conn->hdr, sizeof(conn->u.in), sizeof(conn->u.out)))
1231                 return -EINVAL;
1232 
1233         /* Find a free place in the sessions clients array and claim it */
1234         mutex_lock(&gdev->session_mutex);
1235         for (i = 0; i < ARRAY_SIZE(session->hgcm_client_ids); i++) {
1236                 if (!session->hgcm_client_ids[i]) {
1237                         session->hgcm_client_ids[i] = U32_MAX;
1238                         break;
1239                 }
1240         }
1241         mutex_unlock(&gdev->session_mutex);
1242 
1243         if (i >= ARRAY_SIZE(session->hgcm_client_ids))
1244                 return -EMFILE;
1245 
1246         ret = vbg_hgcm_connect(gdev, session->requestor, &conn->u.in.loc,
1247                                &client_id, &conn->hdr.rc);
1248 
1249         mutex_lock(&gdev->session_mutex);
1250         if (ret == 0 && conn->hdr.rc >= 0) {
1251                 conn->u.out.client_id = client_id;
1252                 session->hgcm_client_ids[i] = client_id;
1253         } else {
1254                 conn->u.out.client_id = 0;
1255                 session->hgcm_client_ids[i] = 0;
1256         }
1257         mutex_unlock(&gdev->session_mutex);
1258 
1259         return ret;
1260 }
1261 
1262 static int vbg_ioctl_hgcm_disconnect(struct vbg_dev *gdev,
1263                                      struct vbg_session *session,
1264                                      struct vbg_ioctl_hgcm_disconnect *disconn)
1265 {
1266         u32 client_id;
1267         int i, ret;
1268 
1269         if (vbg_ioctl_chk(&disconn->hdr, sizeof(disconn->u.in), 0))
1270                 return -EINVAL;
1271 
1272         client_id = disconn->u.in.client_id;
1273         if (client_id == 0 || client_id == U32_MAX)
1274                 return -EINVAL;
1275 
1276         mutex_lock(&gdev->session_mutex);
1277         for (i = 0; i < ARRAY_SIZE(session->hgcm_client_ids); i++) {
1278                 if (session->hgcm_client_ids[i] == client_id) {
1279                         session->hgcm_client_ids[i] = U32_MAX;
1280                         break;
1281                 }
1282         }
1283         mutex_unlock(&gdev->session_mutex);
1284 
1285         if (i >= ARRAY_SIZE(session->hgcm_client_ids))
1286                 return -EINVAL;
1287 
1288         ret = vbg_hgcm_disconnect(gdev, session->requestor, client_id,
1289                                   &disconn->hdr.rc);
1290 
1291         mutex_lock(&gdev->session_mutex);
1292         if (ret == 0 && disconn->hdr.rc >= 0)
1293                 session->hgcm_client_ids[i] = 0;
1294         else
1295                 session->hgcm_client_ids[i] = client_id;
1296         mutex_unlock(&gdev->session_mutex);
1297 
1298         return ret;
1299 }
1300 
1301 static bool vbg_param_valid(enum vmmdev_hgcm_function_parameter_type type)
1302 {
1303         switch (type) {
1304         case VMMDEV_HGCM_PARM_TYPE_32BIT:
1305         case VMMDEV_HGCM_PARM_TYPE_64BIT:
1306         case VMMDEV_HGCM_PARM_TYPE_LINADDR:
1307         case VMMDEV_HGCM_PARM_TYPE_LINADDR_IN:
1308         case VMMDEV_HGCM_PARM_TYPE_LINADDR_OUT:
1309                 return true;
1310         default:
1311                 return false;
1312         }
1313 }
1314 
1315 static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev,
1316                                struct vbg_session *session, bool f32bit,
1317                                struct vbg_ioctl_hgcm_call *call)
1318 {
1319         size_t actual_size;
1320         u32 client_id;
1321         int i, ret;
1322 
1323         if (call->hdr.size_in < sizeof(*call))
1324                 return -EINVAL;
1325 
1326         if (call->hdr.size_in != call->hdr.size_out)
1327                 return -EINVAL;
1328 
1329         if (call->parm_count > VMMDEV_HGCM_MAX_PARMS)
1330                 return -E2BIG;
1331 
1332         client_id = call->client_id;
1333         if (client_id == 0 || client_id == U32_MAX)
1334                 return -EINVAL;
1335 
1336         actual_size = sizeof(*call);
1337         if (f32bit)
1338                 actual_size += call->parm_count *
1339                                sizeof(struct vmmdev_hgcm_function_parameter32);
1340         else
1341                 actual_size += call->parm_count *
1342                                sizeof(struct vmmdev_hgcm_function_parameter);
1343         if (call->hdr.size_in < actual_size) {
1344                 vbg_debug("VBG_IOCTL_HGCM_CALL: hdr.size_in %d required size is %zd\n",
1345                           call->hdr.size_in, actual_size);
1346                 return -EINVAL;
1347         }
1348         call->hdr.size_out = actual_size;
1349 
1350         /* Validate parameter types */
1351         if (f32bit) {
1352                 struct vmmdev_hgcm_function_parameter32 *parm =
1353                         VBG_IOCTL_HGCM_CALL_PARMS32(call);
1354 
1355                 for (i = 0; i < call->parm_count; i++)
1356                         if (!vbg_param_valid(parm[i].type))
1357                                 return -EINVAL;
1358         } else {
1359                 struct vmmdev_hgcm_function_parameter *parm =
1360                         VBG_IOCTL_HGCM_CALL_PARMS(call);
1361 
1362                 for (i = 0; i < call->parm_count; i++)
1363                         if (!vbg_param_valid(parm[i].type))
1364                                 return -EINVAL;
1365         }
1366 
1367         /*
1368          * Validate the client id.
1369          */
1370         mutex_lock(&gdev->session_mutex);
1371         for (i = 0; i < ARRAY_SIZE(session->hgcm_client_ids); i++)
1372                 if (session->hgcm_client_ids[i] == client_id)
1373                         break;
1374         mutex_unlock(&gdev->session_mutex);
1375         if (i >= ARRAY_SIZE(session->hgcm_client_ids)) {
1376                 vbg_debug("VBG_IOCTL_HGCM_CALL: INVALID handle. u32Client=%#08x\n",
1377                           client_id);
1378                 return -EINVAL;
1379         }
1380 
1381         if (IS_ENABLED(CONFIG_COMPAT) && f32bit)
1382                 ret = vbg_hgcm_call32(gdev, session->requestor, client_id,
1383                                       call->function, call->timeout_ms,
1384                                       VBG_IOCTL_HGCM_CALL_PARMS32(call),
1385                                       call->parm_count, &call->hdr.rc);
1386         else
1387                 ret = vbg_hgcm_call(gdev, session->requestor, client_id,
1388                                     call->function, call->timeout_ms,
1389                                     VBG_IOCTL_HGCM_CALL_PARMS(call),
1390                                     call->parm_count, &call->hdr.rc);
1391 
1392         if (ret == -E2BIG) {
1393                 /* E2BIG needs to be reported through the hdr.rc field. */
1394                 call->hdr.rc = VERR_OUT_OF_RANGE;
1395                 ret = 0;
1396         }
1397 
1398         if (ret && ret != -EINTR && ret != -ETIMEDOUT)
1399                 vbg_err("VBG_IOCTL_HGCM_CALL error: %d\n", ret);
1400 
1401         return ret;
1402 }
1403 
1404 static int vbg_ioctl_log(struct vbg_ioctl_log *log)
1405 {
1406         if (log->hdr.size_out != sizeof(log->hdr))
1407                 return -EINVAL;
1408 
1409         vbg_info("%.*s", (int)(log->hdr.size_in - sizeof(log->hdr)),
1410                  log->u.in.msg);
1411 
1412         return 0;
1413 }
1414 
1415 static int vbg_ioctl_change_filter_mask(struct vbg_dev *gdev,
1416                                         struct vbg_session *session,
1417                                         struct vbg_ioctl_change_filter *filter)
1418 {
1419         u32 or_mask, not_mask;
1420 
1421         if (vbg_ioctl_chk(&filter->hdr, sizeof(filter->u.in), 0))
1422                 return -EINVAL;
1423 
1424         or_mask = filter->u.in.or_mask;
1425         not_mask = filter->u.in.not_mask;
1426 
1427         if ((or_mask | not_mask) & ~VMMDEV_EVENT_VALID_EVENT_MASK)
1428                 return -EINVAL;
1429 
1430         return vbg_set_session_event_filter(gdev, session, or_mask, not_mask,
1431                                             false);
1432 }
1433 
1434 static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev,
1435              struct vbg_session *session, struct vbg_ioctl_set_guest_caps *caps)
1436 {
1437         u32 or_mask, not_mask;
1438         int ret;
1439 
1440         if (vbg_ioctl_chk(&caps->hdr, sizeof(caps->u.in), sizeof(caps->u.out)))
1441                 return -EINVAL;
1442 
1443         or_mask = caps->u.in.or_mask;
1444         not_mask = caps->u.in.not_mask;
1445 
1446         if ((or_mask | not_mask) & ~VMMDEV_EVENT_VALID_EVENT_MASK)
1447                 return -EINVAL;
1448 
1449         ret = vbg_set_session_capabilities(gdev, session, or_mask, not_mask,
1450                                            false);
1451         if (ret)
1452                 return ret;
1453 
1454         caps->u.out.session_caps = session->guest_caps;
1455         caps->u.out.global_caps = gdev->guest_caps_host;
1456 
1457         return 0;
1458 }
1459 
1460 static int vbg_ioctl_check_balloon(struct vbg_dev *gdev,
1461                                    struct vbg_ioctl_check_balloon *balloon_info)
1462 {
1463         if (vbg_ioctl_chk(&balloon_info->hdr, 0, sizeof(balloon_info->u.out)))
1464                 return -EINVAL;
1465 
1466         balloon_info->u.out.balloon_chunks = gdev->mem_balloon.chunks;
1467         /*
1468          * Under Linux we handle VMMDEV_EVENT_BALLOON_CHANGE_REQUEST
1469          * events entirely in the kernel, see vbg_core_isr().
1470          */
1471         balloon_info->u.out.handle_in_r3 = false;
1472 
1473         return 0;
1474 }
1475 
1476 static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev,
1477                                      struct vbg_session *session,
1478                                      struct vbg_ioctl_write_coredump *dump)
1479 {
1480         struct vmmdev_write_core_dump *req;
1481 
1482         if (vbg_ioctl_chk(&dump->hdr, sizeof(dump->u.in), 0))
1483                 return -EINVAL;
1484 
1485         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_WRITE_COREDUMP,
1486                             session->requestor);
1487         if (!req)
1488                 return -ENOMEM;
1489 
1490         req->flags = dump->u.in.flags;
1491         dump->hdr.rc = vbg_req_perform(gdev, req);
1492 
1493         vbg_req_free(req, sizeof(*req));
1494         return 0;
1495 }
1496 
1497 /**
1498  * Common IOCtl for user to kernel communication.
1499  * Return: 0 or negative errno value.
1500  * @session:    The client session.
1501  * @req:        The requested function.
1502  * @data:       The i/o data buffer, minimum size sizeof(struct vbg_ioctl_hdr).
1503  */
1504 int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
1505 {
1506         unsigned int req_no_size = req & ~IOCSIZE_MASK;
1507         struct vbg_dev *gdev = session->gdev;
1508         struct vbg_ioctl_hdr *hdr = data;
1509         bool f32bit = false;
1510 
1511         hdr->rc = VINF_SUCCESS;
1512         if (!hdr->size_out)
1513                 hdr->size_out = hdr->size_in;
1514 
1515         /*
1516          * hdr->version and hdr->size_in / hdr->size_out minimum size are
1517          * already checked by vbg_misc_device_ioctl().
1518          */
1519 
1520         /* For VMMDEV_REQUEST hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT */
1521         if (req_no_size == VBG_IOCTL_VMMDEV_REQUEST(0) ||
1522             req == VBG_IOCTL_VMMDEV_REQUEST_BIG)
1523                 return vbg_ioctl_vmmrequest(gdev, session, data);
1524 
1525         if (hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT)
1526                 return -EINVAL;
1527 
1528         /* Fixed size requests. */
1529         switch (req) {
1530         case VBG_IOCTL_DRIVER_VERSION_INFO:
1531                 return vbg_ioctl_driver_version_info(data);
1532         case VBG_IOCTL_HGCM_CONNECT:
1533                 return vbg_ioctl_hgcm_connect(gdev, session, data);
1534         case VBG_IOCTL_HGCM_DISCONNECT:
1535                 return vbg_ioctl_hgcm_disconnect(gdev, session, data);
1536         case VBG_IOCTL_WAIT_FOR_EVENTS:
1537                 return vbg_ioctl_wait_for_events(gdev, session, data);
1538         case VBG_IOCTL_INTERRUPT_ALL_WAIT_FOR_EVENTS:
1539                 return vbg_ioctl_interrupt_all_wait_events(gdev, session, data);
1540         case VBG_IOCTL_CHANGE_FILTER_MASK:
1541                 return vbg_ioctl_change_filter_mask(gdev, session, data);
1542         case VBG_IOCTL_CHANGE_GUEST_CAPABILITIES:
1543                 return vbg_ioctl_change_guest_capabilities(gdev, session, data);
1544         case VBG_IOCTL_CHECK_BALLOON:
1545                 return vbg_ioctl_check_balloon(gdev, data);
1546         case VBG_IOCTL_WRITE_CORE_DUMP:
1547                 return vbg_ioctl_write_core_dump(gdev, session, data);
1548         }
1549 
1550         /* Variable sized requests. */
1551         switch (req_no_size) {
1552 #ifdef CONFIG_COMPAT
1553         case VBG_IOCTL_HGCM_CALL_32(0):
1554                 f32bit = true;
1555 #endif
1556                 /* Fall through */
1557         case VBG_IOCTL_HGCM_CALL(0):
1558                 return vbg_ioctl_hgcm_call(gdev, session, f32bit, data);
1559         case VBG_IOCTL_LOG(0):
1560                 return vbg_ioctl_log(data);
1561         }
1562 
1563         vbg_debug("VGDrvCommonIoCtl: Unknown req %#08x\n", req);
1564         return -ENOTTY;
1565 }
1566 
1567 /**
1568  * Report guest supported mouse-features to the host.
1569  *
1570  * Return: 0 or negative errno value.
1571  * @gdev:               The Guest extension device.
1572  * @features:           The set of features to report to the host.
1573  */
1574 int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features)
1575 {
1576         struct vmmdev_mouse_status *req;
1577         int rc;
1578 
1579         req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_MOUSE_STATUS,
1580                             VBG_KERNEL_REQUEST);
1581         if (!req)
1582                 return -ENOMEM;
1583 
1584         req->mouse_features = features;
1585         req->pointer_pos_x = 0;
1586         req->pointer_pos_y = 0;
1587 
1588         rc = vbg_req_perform(gdev, req);
1589         if (rc < 0)
1590                 vbg_err("%s error, rc: %d\n", __func__, rc);
1591 
1592         vbg_req_free(req, sizeof(*req));
1593         return vbg_status_code_to_errno(rc);
1594 }
1595 
1596 /** Core interrupt service routine. */
1597 irqreturn_t vbg_core_isr(int irq, void *dev_id)
1598 {
1599         struct vbg_dev *gdev = dev_id;
1600         struct vmmdev_events *req = gdev->ack_events_req;
1601         bool mouse_position_changed = false;
1602         unsigned long flags;
1603         u32 events = 0;
1604         int rc;
1605 
1606         if (!gdev->mmio->V.V1_04.have_events)
1607                 return IRQ_NONE;
1608 
1609         /* Get and acknowlegde events. */
1610         req->header.rc = VERR_INTERNAL_ERROR;
1611         req->events = 0;
1612         rc = vbg_req_perform(gdev, req);
1613         if (rc < 0) {
1614                 vbg_err("Error performing events req, rc: %d\n", rc);
1615                 return IRQ_NONE;
1616         }
1617 
1618         events = req->events;
1619 
1620         if (events & VMMDEV_EVENT_MOUSE_POSITION_CHANGED) {
1621                 mouse_position_changed = true;
1622                 events &= ~VMMDEV_EVENT_MOUSE_POSITION_CHANGED;
1623         }
1624 
1625         if (events & VMMDEV_EVENT_HGCM) {
1626                 wake_up(&gdev->hgcm_wq);
1627                 events &= ~VMMDEV_EVENT_HGCM;
1628         }
1629 
1630         if (events & VMMDEV_EVENT_BALLOON_CHANGE_REQUEST) {
1631                 schedule_work(&gdev->mem_balloon.work);
1632                 events &= ~VMMDEV_EVENT_BALLOON_CHANGE_REQUEST;
1633         }
1634 
1635         if (events) {
1636                 spin_lock_irqsave(&gdev->event_spinlock, flags);
1637                 gdev->pending_events |= events;
1638                 spin_unlock_irqrestore(&gdev->event_spinlock, flags);
1639 
1640                 wake_up(&gdev->event_wq);
1641         }
1642 
1643         if (mouse_position_changed)
1644                 vbg_linux_mouse_event(gdev);
1645 
1646         return IRQ_HANDLED;
1647 }

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