diff options
-rw-r--r-- | drivers/virt/vboxguest/vboxguest_core.c | 106 | ||||
-rw-r--r-- | drivers/virt/vboxguest/vboxguest_core.h | 15 | ||||
-rw-r--r-- | drivers/virt/vboxguest/vboxguest_linux.c | 26 | ||||
-rw-r--r-- | drivers/virt/vboxguest/vboxguest_utils.c | 32 | ||||
-rw-r--r-- | drivers/virt/vboxguest/vboxguest_version.h | 9 | ||||
-rw-r--r-- | drivers/virt/vboxguest/vmmdev.h | 8 | ||||
-rw-r--r-- | include/linux/vbox_utils.h | 12 | ||||
-rw-r--r-- | include/uapi/linux/vbox_vmmdev_types.h | 60 |
8 files changed, 197 insertions, 71 deletions
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c index df7d09409efe..8ca333f21292 100644 --- a/drivers/virt/vboxguest/vboxguest_core.c +++ b/drivers/virt/vboxguest/vboxguest_core.c | |||
@@ -27,6 +27,10 @@ | |||
27 | 27 | ||
28 | #define GUEST_MAPPINGS_TRIES 5 | 28 | #define GUEST_MAPPINGS_TRIES 5 |
29 | 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 | |||
30 | /** | 34 | /** |
31 | * Reserves memory in which the VMM can relocate any guest mappings | 35 | * Reserves memory in which the VMM can relocate any guest mappings |
32 | * that are floating around. | 36 | * that are floating around. |
@@ -48,7 +52,8 @@ static void vbg_guest_mappings_init(struct vbg_dev *gdev) | |||
48 | int i, rc; | 52 | int i, rc; |
49 | 53 | ||
50 | /* Query the required space. */ | 54 | /* Query the required space. */ |
51 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HYPERVISOR_INFO); | 55 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HYPERVISOR_INFO, |
56 | VBG_KERNEL_REQUEST); | ||
52 | if (!req) | 57 | if (!req) |
53 | return; | 58 | return; |
54 | 59 | ||
@@ -135,7 +140,8 @@ static void vbg_guest_mappings_exit(struct vbg_dev *gdev) | |||
135 | * Tell the host that we're going to free the memory we reserved for | 140 | * Tell the host that we're going to free the memory we reserved for |
136 | * it, the free it up. (Leak the memory if anything goes wrong here.) | 141 | * it, the free it up. (Leak the memory if anything goes wrong here.) |
137 | */ | 142 | */ |
138 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_HYPERVISOR_INFO); | 143 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_HYPERVISOR_INFO, |
144 | VBG_KERNEL_REQUEST); | ||
139 | if (!req) | 145 | if (!req) |
140 | return; | 146 | return; |
141 | 147 | ||
@@ -172,8 +178,10 @@ static int vbg_report_guest_info(struct vbg_dev *gdev) | |||
172 | struct vmmdev_guest_info2 *req2 = NULL; | 178 | struct vmmdev_guest_info2 *req2 = NULL; |
173 | int rc, ret = -ENOMEM; | 179 | int rc, ret = -ENOMEM; |
174 | 180 | ||
175 | req1 = vbg_req_alloc(sizeof(*req1), VMMDEVREQ_REPORT_GUEST_INFO); | 181 | req1 = vbg_req_alloc(sizeof(*req1), VMMDEVREQ_REPORT_GUEST_INFO, |
176 | req2 = vbg_req_alloc(sizeof(*req2), VMMDEVREQ_REPORT_GUEST_INFO2); | 182 | VBG_KERNEL_REQUEST); |
183 | req2 = vbg_req_alloc(sizeof(*req2), VMMDEVREQ_REPORT_GUEST_INFO2, | ||
184 | VBG_KERNEL_REQUEST); | ||
177 | if (!req1 || !req2) | 185 | if (!req1 || !req2) |
178 | goto out_free; | 186 | goto out_free; |
179 | 187 | ||
@@ -187,8 +195,8 @@ static int vbg_report_guest_info(struct vbg_dev *gdev) | |||
187 | req2->additions_minor = VBG_VERSION_MINOR; | 195 | req2->additions_minor = VBG_VERSION_MINOR; |
188 | req2->additions_build = VBG_VERSION_BUILD; | 196 | req2->additions_build = VBG_VERSION_BUILD; |
189 | req2->additions_revision = VBG_SVN_REV; | 197 | req2->additions_revision = VBG_SVN_REV; |
190 | /* (no features defined yet) */ | 198 | req2->additions_features = |
191 | req2->additions_features = 0; | 199 | VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO; |
192 | strlcpy(req2->name, VBG_VERSION_STRING, | 200 | strlcpy(req2->name, VBG_VERSION_STRING, |
193 | sizeof(req2->name)); | 201 | sizeof(req2->name)); |
194 | 202 | ||
@@ -230,7 +238,8 @@ static int vbg_report_driver_status(struct vbg_dev *gdev, bool active) | |||
230 | struct vmmdev_guest_status *req; | 238 | struct vmmdev_guest_status *req; |
231 | int rc; | 239 | int rc; |
232 | 240 | ||
233 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_REPORT_GUEST_STATUS); | 241 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_REPORT_GUEST_STATUS, |
242 | VBG_KERNEL_REQUEST); | ||
234 | if (!req) | 243 | if (!req) |
235 | return -ENOMEM; | 244 | return -ENOMEM; |
236 | 245 | ||
@@ -423,7 +432,8 @@ static int vbg_heartbeat_host_config(struct vbg_dev *gdev, bool enabled) | |||
423 | struct vmmdev_heartbeat *req; | 432 | struct vmmdev_heartbeat *req; |
424 | int rc; | 433 | int rc; |
425 | 434 | ||
426 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_HEARTBEAT_CONFIGURE); | 435 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_HEARTBEAT_CONFIGURE, |
436 | VBG_KERNEL_REQUEST); | ||
427 | if (!req) | 437 | if (!req) |
428 | return -ENOMEM; | 438 | return -ENOMEM; |
429 | 439 | ||
@@ -457,7 +467,8 @@ static int vbg_heartbeat_init(struct vbg_dev *gdev) | |||
457 | 467 | ||
458 | gdev->guest_heartbeat_req = vbg_req_alloc( | 468 | gdev->guest_heartbeat_req = vbg_req_alloc( |
459 | sizeof(*gdev->guest_heartbeat_req), | 469 | sizeof(*gdev->guest_heartbeat_req), |
460 | VMMDEVREQ_GUEST_HEARTBEAT); | 470 | VMMDEVREQ_GUEST_HEARTBEAT, |
471 | VBG_KERNEL_REQUEST); | ||
461 | if (!gdev->guest_heartbeat_req) | 472 | if (!gdev->guest_heartbeat_req) |
462 | return -ENOMEM; | 473 | return -ENOMEM; |
463 | 474 | ||
@@ -528,7 +539,8 @@ static int vbg_reset_host_event_filter(struct vbg_dev *gdev, | |||
528 | struct vmmdev_mask *req; | 539 | struct vmmdev_mask *req; |
529 | int rc; | 540 | int rc; |
530 | 541 | ||
531 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK); | 542 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK, |
543 | VBG_KERNEL_REQUEST); | ||
532 | if (!req) | 544 | if (!req) |
533 | return -ENOMEM; | 545 | return -ENOMEM; |
534 | 546 | ||
@@ -567,8 +579,14 @@ static int vbg_set_session_event_filter(struct vbg_dev *gdev, | |||
567 | u32 changed, previous; | 579 | u32 changed, previous; |
568 | int rc, ret = 0; | 580 | int rc, ret = 0; |
569 | 581 | ||
570 | /* Allocate a request buffer before taking the spinlock */ | 582 | /* |
571 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK); | 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); | ||
572 | if (!req) { | 590 | if (!req) { |
573 | if (!session_termination) | 591 | if (!session_termination) |
574 | return -ENOMEM; | 592 | return -ENOMEM; |
@@ -627,7 +645,8 @@ static int vbg_reset_host_capabilities(struct vbg_dev *gdev) | |||
627 | struct vmmdev_mask *req; | 645 | struct vmmdev_mask *req; |
628 | int rc; | 646 | int rc; |
629 | 647 | ||
630 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES); | 648 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES, |
649 | VBG_KERNEL_REQUEST); | ||
631 | if (!req) | 650 | if (!req) |
632 | return -ENOMEM; | 651 | return -ENOMEM; |
633 | 652 | ||
@@ -662,8 +681,14 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev, | |||
662 | u32 changed, previous; | 681 | u32 changed, previous; |
663 | int rc, ret = 0; | 682 | int rc, ret = 0; |
664 | 683 | ||
665 | /* Allocate a request buffer before taking the spinlock */ | 684 | /* |
666 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES); | 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); | ||
667 | if (!req) { | 692 | if (!req) { |
668 | if (!session_termination) | 693 | if (!session_termination) |
669 | return -ENOMEM; | 694 | return -ENOMEM; |
@@ -722,7 +747,8 @@ static int vbg_query_host_version(struct vbg_dev *gdev) | |||
722 | struct vmmdev_host_version *req; | 747 | struct vmmdev_host_version *req; |
723 | int rc, ret; | 748 | int rc, ret; |
724 | 749 | ||
725 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HOST_VERSION); | 750 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HOST_VERSION, |
751 | VBG_KERNEL_REQUEST); | ||
726 | if (!req) | 752 | if (!req) |
727 | return -ENOMEM; | 753 | return -ENOMEM; |
728 | 754 | ||
@@ -783,19 +809,24 @@ int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events) | |||
783 | 809 | ||
784 | gdev->mem_balloon.get_req = | 810 | gdev->mem_balloon.get_req = |
785 | vbg_req_alloc(sizeof(*gdev->mem_balloon.get_req), | 811 | vbg_req_alloc(sizeof(*gdev->mem_balloon.get_req), |
786 | VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ); | 812 | VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ, |
813 | VBG_KERNEL_REQUEST); | ||
787 | gdev->mem_balloon.change_req = | 814 | gdev->mem_balloon.change_req = |
788 | vbg_req_alloc(sizeof(*gdev->mem_balloon.change_req), | 815 | vbg_req_alloc(sizeof(*gdev->mem_balloon.change_req), |
789 | VMMDEVREQ_CHANGE_MEMBALLOON); | 816 | VMMDEVREQ_CHANGE_MEMBALLOON, |
817 | VBG_KERNEL_REQUEST); | ||
790 | gdev->cancel_req = | 818 | gdev->cancel_req = |
791 | vbg_req_alloc(sizeof(*(gdev->cancel_req)), | 819 | vbg_req_alloc(sizeof(*(gdev->cancel_req)), |
792 | VMMDEVREQ_HGCM_CANCEL2); | 820 | VMMDEVREQ_HGCM_CANCEL2, |
821 | VBG_KERNEL_REQUEST); | ||
793 | gdev->ack_events_req = | 822 | gdev->ack_events_req = |
794 | vbg_req_alloc(sizeof(*gdev->ack_events_req), | 823 | vbg_req_alloc(sizeof(*gdev->ack_events_req), |
795 | VMMDEVREQ_ACKNOWLEDGE_EVENTS); | 824 | VMMDEVREQ_ACKNOWLEDGE_EVENTS, |
825 | VBG_KERNEL_REQUEST); | ||
796 | gdev->mouse_status_req = | 826 | gdev->mouse_status_req = |
797 | vbg_req_alloc(sizeof(*gdev->mouse_status_req), | 827 | vbg_req_alloc(sizeof(*gdev->mouse_status_req), |
798 | VMMDEVREQ_GET_MOUSE_STATUS); | 828 | VMMDEVREQ_GET_MOUSE_STATUS, |
829 | VBG_KERNEL_REQUEST); | ||
799 | 830 | ||
800 | if (!gdev->mem_balloon.get_req || !gdev->mem_balloon.change_req || | 831 | if (!gdev->mem_balloon.get_req || !gdev->mem_balloon.change_req || |
801 | !gdev->cancel_req || !gdev->ack_events_req || | 832 | !gdev->cancel_req || !gdev->ack_events_req || |
@@ -892,9 +923,9 @@ void vbg_core_exit(struct vbg_dev *gdev) | |||
892 | * vboxguest_linux.c calls this when userspace opens the char-device. | 923 | * vboxguest_linux.c calls this when userspace opens the char-device. |
893 | * Return: A pointer to the new session or an ERR_PTR on error. | 924 | * Return: A pointer to the new session or an ERR_PTR on error. |
894 | * @gdev: The Guest extension device. | 925 | * @gdev: The Guest extension device. |
895 | * @user: Set if this is a session for the vboxuser device. | 926 | * @requestor: VMMDEV_REQUESTOR_* flags |
896 | */ | 927 | */ |
897 | struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user) | 928 | struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, u32 requestor) |
898 | { | 929 | { |
899 | struct vbg_session *session; | 930 | struct vbg_session *session; |
900 | 931 | ||
@@ -903,7 +934,7 @@ struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user) | |||
903 | return ERR_PTR(-ENOMEM); | 934 | return ERR_PTR(-ENOMEM); |
904 | 935 | ||
905 | session->gdev = gdev; | 936 | session->gdev = gdev; |
906 | session->user_session = user; | 937 | session->requestor = requestor; |
907 | 938 | ||
908 | return session; | 939 | return session; |
909 | } | 940 | } |
@@ -924,7 +955,9 @@ void vbg_core_close_session(struct vbg_session *session) | |||
924 | if (!session->hgcm_client_ids[i]) | 955 | if (!session->hgcm_client_ids[i]) |
925 | continue; | 956 | continue; |
926 | 957 | ||
927 | vbg_hgcm_disconnect(gdev, session->hgcm_client_ids[i], &rc); | 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); | ||
928 | } | 961 | } |
929 | 962 | ||
930 | kfree(session); | 963 | kfree(session); |
@@ -1152,7 +1185,8 @@ static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session, | |||
1152 | return -EPERM; | 1185 | return -EPERM; |
1153 | } | 1186 | } |
1154 | 1187 | ||
1155 | if (trusted_apps_only && session->user_session) { | 1188 | if (trusted_apps_only && |
1189 | (session->requestor & VMMDEV_REQUESTOR_USER_DEVICE)) { | ||
1156 | vbg_err("Denying userspace vmm call type %#08x through vboxuser device node\n", | 1190 | vbg_err("Denying userspace vmm call type %#08x through vboxuser device node\n", |
1157 | req->request_type); | 1191 | req->request_type); |
1158 | return -EPERM; | 1192 | return -EPERM; |
@@ -1209,8 +1243,8 @@ static int vbg_ioctl_hgcm_connect(struct vbg_dev *gdev, | |||
1209 | if (i >= ARRAY_SIZE(session->hgcm_client_ids)) | 1243 | if (i >= ARRAY_SIZE(session->hgcm_client_ids)) |
1210 | return -EMFILE; | 1244 | return -EMFILE; |
1211 | 1245 | ||
1212 | ret = vbg_hgcm_connect(gdev, &conn->u.in.loc, &client_id, | 1246 | ret = vbg_hgcm_connect(gdev, session->requestor, &conn->u.in.loc, |
1213 | &conn->hdr.rc); | 1247 | &client_id, &conn->hdr.rc); |
1214 | 1248 | ||
1215 | mutex_lock(&gdev->session_mutex); | 1249 | mutex_lock(&gdev->session_mutex); |
1216 | if (ret == 0 && conn->hdr.rc >= 0) { | 1250 | if (ret == 0 && conn->hdr.rc >= 0) { |
@@ -1251,7 +1285,8 @@ static int vbg_ioctl_hgcm_disconnect(struct vbg_dev *gdev, | |||
1251 | if (i >= ARRAY_SIZE(session->hgcm_client_ids)) | 1285 | if (i >= ARRAY_SIZE(session->hgcm_client_ids)) |
1252 | return -EINVAL; | 1286 | return -EINVAL; |
1253 | 1287 | ||
1254 | ret = vbg_hgcm_disconnect(gdev, client_id, &disconn->hdr.rc); | 1288 | ret = vbg_hgcm_disconnect(gdev, session->requestor, client_id, |
1289 | &disconn->hdr.rc); | ||
1255 | 1290 | ||
1256 | mutex_lock(&gdev->session_mutex); | 1291 | mutex_lock(&gdev->session_mutex); |
1257 | if (ret == 0 && disconn->hdr.rc >= 0) | 1292 | if (ret == 0 && disconn->hdr.rc >= 0) |
@@ -1313,12 +1348,12 @@ static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev, | |||
1313 | } | 1348 | } |
1314 | 1349 | ||
1315 | if (IS_ENABLED(CONFIG_COMPAT) && f32bit) | 1350 | if (IS_ENABLED(CONFIG_COMPAT) && f32bit) |
1316 | ret = vbg_hgcm_call32(gdev, client_id, | 1351 | ret = vbg_hgcm_call32(gdev, session->requestor, client_id, |
1317 | call->function, call->timeout_ms, | 1352 | call->function, call->timeout_ms, |
1318 | VBG_IOCTL_HGCM_CALL_PARMS32(call), | 1353 | VBG_IOCTL_HGCM_CALL_PARMS32(call), |
1319 | call->parm_count, &call->hdr.rc); | 1354 | call->parm_count, &call->hdr.rc); |
1320 | else | 1355 | else |
1321 | ret = vbg_hgcm_call(gdev, client_id, | 1356 | ret = vbg_hgcm_call(gdev, session->requestor, client_id, |
1322 | call->function, call->timeout_ms, | 1357 | call->function, call->timeout_ms, |
1323 | VBG_IOCTL_HGCM_CALL_PARMS(call), | 1358 | VBG_IOCTL_HGCM_CALL_PARMS(call), |
1324 | call->parm_count, &call->hdr.rc); | 1359 | call->parm_count, &call->hdr.rc); |
@@ -1408,6 +1443,7 @@ static int vbg_ioctl_check_balloon(struct vbg_dev *gdev, | |||
1408 | } | 1443 | } |
1409 | 1444 | ||
1410 | static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev, | 1445 | static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev, |
1446 | struct vbg_session *session, | ||
1411 | struct vbg_ioctl_write_coredump *dump) | 1447 | struct vbg_ioctl_write_coredump *dump) |
1412 | { | 1448 | { |
1413 | struct vmmdev_write_core_dump *req; | 1449 | struct vmmdev_write_core_dump *req; |
@@ -1415,7 +1451,8 @@ static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev, | |||
1415 | if (vbg_ioctl_chk(&dump->hdr, sizeof(dump->u.in), 0)) | 1451 | if (vbg_ioctl_chk(&dump->hdr, sizeof(dump->u.in), 0)) |
1416 | return -EINVAL; | 1452 | return -EINVAL; |
1417 | 1453 | ||
1418 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_WRITE_COREDUMP); | 1454 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_WRITE_COREDUMP, |
1455 | session->requestor); | ||
1419 | if (!req) | 1456 | if (!req) |
1420 | return -ENOMEM; | 1457 | return -ENOMEM; |
1421 | 1458 | ||
@@ -1476,7 +1513,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data) | |||
1476 | case VBG_IOCTL_CHECK_BALLOON: | 1513 | case VBG_IOCTL_CHECK_BALLOON: |
1477 | return vbg_ioctl_check_balloon(gdev, data); | 1514 | return vbg_ioctl_check_balloon(gdev, data); |
1478 | case VBG_IOCTL_WRITE_CORE_DUMP: | 1515 | case VBG_IOCTL_WRITE_CORE_DUMP: |
1479 | return vbg_ioctl_write_core_dump(gdev, data); | 1516 | return vbg_ioctl_write_core_dump(gdev, session, data); |
1480 | } | 1517 | } |
1481 | 1518 | ||
1482 | /* Variable sized requests. */ | 1519 | /* Variable sized requests. */ |
@@ -1508,7 +1545,8 @@ int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features) | |||
1508 | struct vmmdev_mouse_status *req; | 1545 | struct vmmdev_mouse_status *req; |
1509 | int rc; | 1546 | int rc; |
1510 | 1547 | ||
1511 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_MOUSE_STATUS); | 1548 | req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_MOUSE_STATUS, |
1549 | VBG_KERNEL_REQUEST); | ||
1512 | if (!req) | 1550 | if (!req) |
1513 | return -ENOMEM; | 1551 | return -ENOMEM; |
1514 | 1552 | ||
diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h index 7ad9ec45bfa9..4188c12b839f 100644 --- a/drivers/virt/vboxguest/vboxguest_core.h +++ b/drivers/virt/vboxguest/vboxguest_core.h | |||
@@ -154,15 +154,15 @@ struct vbg_session { | |||
154 | * host. Protected by vbg_gdev.session_mutex. | 154 | * host. Protected by vbg_gdev.session_mutex. |
155 | */ | 155 | */ |
156 | u32 guest_caps; | 156 | u32 guest_caps; |
157 | /** Does this session belong to a root process or a user one? */ | 157 | /** VMMDEV_REQUESTOR_* flags */ |
158 | bool user_session; | 158 | u32 requestor; |
159 | /** Set on CANCEL_ALL_WAITEVENTS, protected by vbg_devevent_spinlock. */ | 159 | /** Set on CANCEL_ALL_WAITEVENTS, protected by vbg_devevent_spinlock. */ |
160 | bool cancel_waiters; | 160 | bool cancel_waiters; |
161 | }; | 161 | }; |
162 | 162 | ||
163 | int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events); | 163 | int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events); |
164 | void vbg_core_exit(struct vbg_dev *gdev); | 164 | void vbg_core_exit(struct vbg_dev *gdev); |
165 | struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user); | 165 | struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, u32 requestor); |
166 | void vbg_core_close_session(struct vbg_session *session); | 166 | void vbg_core_close_session(struct vbg_session *session); |
167 | int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data); | 167 | int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data); |
168 | int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features); | 168 | int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features); |
@@ -172,12 +172,13 @@ irqreturn_t vbg_core_isr(int irq, void *dev_id); | |||
172 | void vbg_linux_mouse_event(struct vbg_dev *gdev); | 172 | void vbg_linux_mouse_event(struct vbg_dev *gdev); |
173 | 173 | ||
174 | /* Private (non exported) functions form vboxguest_utils.c */ | 174 | /* Private (non exported) functions form vboxguest_utils.c */ |
175 | void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type); | 175 | void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type, |
176 | u32 requestor); | ||
176 | void vbg_req_free(void *req, size_t len); | 177 | void vbg_req_free(void *req, size_t len); |
177 | int vbg_req_perform(struct vbg_dev *gdev, void *req); | 178 | int vbg_req_perform(struct vbg_dev *gdev, void *req); |
178 | int vbg_hgcm_call32( | 179 | int vbg_hgcm_call32( |
179 | struct vbg_dev *gdev, u32 client_id, u32 function, u32 timeout_ms, | 180 | struct vbg_dev *gdev, u32 requestor, u32 client_id, u32 function, |
180 | struct vmmdev_hgcm_function_parameter32 *parm32, u32 parm_count, | 181 | u32 timeout_ms, struct vmmdev_hgcm_function_parameter32 *parm32, |
181 | int *vbox_status); | 182 | u32 parm_count, int *vbox_status); |
182 | 183 | ||
183 | #endif | 184 | #endif |
diff --git a/drivers/virt/vboxguest/vboxguest_linux.c b/drivers/virt/vboxguest/vboxguest_linux.c index 6e2a9619192d..6e8c0f1c1056 100644 --- a/drivers/virt/vboxguest/vboxguest_linux.c +++ b/drivers/virt/vboxguest/vboxguest_linux.c | |||
@@ -5,6 +5,7 @@ | |||
5 | * Copyright (C) 2006-2016 Oracle Corporation | 5 | * Copyright (C) 2006-2016 Oracle Corporation |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <linux/cred.h> | ||
8 | #include <linux/input.h> | 9 | #include <linux/input.h> |
9 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
10 | #include <linux/miscdevice.h> | 11 | #include <linux/miscdevice.h> |
@@ -28,6 +29,23 @@ static DEFINE_MUTEX(vbg_gdev_mutex); | |||
28 | /** Global vbg_gdev pointer used by vbg_get/put_gdev. */ | 29 | /** Global vbg_gdev pointer used by vbg_get/put_gdev. */ |
29 | static struct vbg_dev *vbg_gdev; | 30 | static struct vbg_dev *vbg_gdev; |
30 | 31 | ||
32 | static u32 vbg_misc_device_requestor(struct inode *inode) | ||
33 | { | ||
34 | u32 requestor = VMMDEV_REQUESTOR_USERMODE | | ||
35 | VMMDEV_REQUESTOR_CON_DONT_KNOW | | ||
36 | VMMDEV_REQUESTOR_TRUST_NOT_GIVEN; | ||
37 | |||
38 | if (from_kuid(current_user_ns(), current->cred->uid) == 0) | ||
39 | requestor |= VMMDEV_REQUESTOR_USR_ROOT; | ||
40 | else | ||
41 | requestor |= VMMDEV_REQUESTOR_USR_USER; | ||
42 | |||
43 | if (in_egroup_p(inode->i_gid)) | ||
44 | requestor |= VMMDEV_REQUESTOR_GRP_VBOX; | ||
45 | |||
46 | return requestor; | ||
47 | } | ||
48 | |||
31 | static int vbg_misc_device_open(struct inode *inode, struct file *filp) | 49 | static int vbg_misc_device_open(struct inode *inode, struct file *filp) |
32 | { | 50 | { |
33 | struct vbg_session *session; | 51 | struct vbg_session *session; |
@@ -36,7 +54,7 @@ static int vbg_misc_device_open(struct inode *inode, struct file *filp) | |||
36 | /* misc_open sets filp->private_data to our misc device */ | 54 | /* misc_open sets filp->private_data to our misc device */ |
37 | gdev = container_of(filp->private_data, struct vbg_dev, misc_device); | 55 | gdev = container_of(filp->private_data, struct vbg_dev, misc_device); |
38 | 56 | ||
39 | session = vbg_core_open_session(gdev, false); | 57 | session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode)); |
40 | if (IS_ERR(session)) | 58 | if (IS_ERR(session)) |
41 | return PTR_ERR(session); | 59 | return PTR_ERR(session); |
42 | 60 | ||
@@ -53,7 +71,8 @@ static int vbg_misc_device_user_open(struct inode *inode, struct file *filp) | |||
53 | gdev = container_of(filp->private_data, struct vbg_dev, | 71 | gdev = container_of(filp->private_data, struct vbg_dev, |
54 | misc_device_user); | 72 | misc_device_user); |
55 | 73 | ||
56 | session = vbg_core_open_session(gdev, false); | 74 | session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode) | |
75 | VMMDEV_REQUESTOR_USER_DEVICE); | ||
57 | if (IS_ERR(session)) | 76 | if (IS_ERR(session)) |
58 | return PTR_ERR(session); | 77 | return PTR_ERR(session); |
59 | 78 | ||
@@ -115,7 +134,8 @@ static long vbg_misc_device_ioctl(struct file *filp, unsigned int req, | |||
115 | req == VBG_IOCTL_VMMDEV_REQUEST_BIG; | 134 | req == VBG_IOCTL_VMMDEV_REQUEST_BIG; |
116 | 135 | ||
117 | if (is_vmmdev_req) | 136 | if (is_vmmdev_req) |
118 | buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT); | 137 | buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT, |
138 | session->requestor); | ||
119 | else | 139 | else |
120 | buf = kmalloc(size, GFP_KERNEL); | 140 | buf = kmalloc(size, GFP_KERNEL); |
121 | if (!buf) | 141 | if (!buf) |
diff --git a/drivers/virt/vboxguest/vboxguest_utils.c b/drivers/virt/vboxguest/vboxguest_utils.c index bf4474214b4d..75fd140b02ff 100644 --- a/drivers/virt/vboxguest/vboxguest_utils.c +++ b/drivers/virt/vboxguest/vboxguest_utils.c | |||
@@ -62,7 +62,8 @@ VBG_LOG(vbg_err, pr_err); | |||
62 | VBG_LOG(vbg_debug, pr_debug); | 62 | VBG_LOG(vbg_debug, pr_debug); |
63 | #endif | 63 | #endif |
64 | 64 | ||
65 | void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type) | 65 | void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type, |
66 | u32 requestor) | ||
66 | { | 67 | { |
67 | struct vmmdev_request_header *req; | 68 | struct vmmdev_request_header *req; |
68 | int order = get_order(PAGE_ALIGN(len)); | 69 | int order = get_order(PAGE_ALIGN(len)); |
@@ -78,7 +79,7 @@ void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type) | |||
78 | req->request_type = req_type; | 79 | req->request_type = req_type; |
79 | req->rc = VERR_GENERAL_FAILURE; | 80 | req->rc = VERR_GENERAL_FAILURE; |
80 | req->reserved1 = 0; | 81 | req->reserved1 = 0; |
81 | req->reserved2 = 0; | 82 | req->requestor = requestor; |
82 | 83 | ||
83 | return req; | 84 | return req; |
84 | } | 85 | } |
@@ -119,7 +120,7 @@ static bool hgcm_req_done(struct vbg_dev *gdev, | |||
119 | return done; | 120 | return done; |
120 | } | 121 | } |
121 | 122 | ||
122 | int vbg_hgcm_connect(struct vbg_dev *gdev, | 123 | int vbg_hgcm_connect(struct vbg_dev *gdev, u32 requestor, |
123 | struct vmmdev_hgcm_service_location *loc, | 124 | struct vmmdev_hgcm_service_location *loc, |
124 | u32 *client_id, int *vbox_status) | 125 | u32 *client_id, int *vbox_status) |
125 | { | 126 | { |
@@ -127,7 +128,7 @@ int vbg_hgcm_connect(struct vbg_dev *gdev, | |||
127 | int rc; | 128 | int rc; |
128 | 129 | ||
129 | hgcm_connect = vbg_req_alloc(sizeof(*hgcm_connect), | 130 | hgcm_connect = vbg_req_alloc(sizeof(*hgcm_connect), |
130 | VMMDEVREQ_HGCM_CONNECT); | 131 | VMMDEVREQ_HGCM_CONNECT, requestor); |
131 | if (!hgcm_connect) | 132 | if (!hgcm_connect) |
132 | return -ENOMEM; | 133 | return -ENOMEM; |
133 | 134 | ||
@@ -153,13 +154,15 @@ int vbg_hgcm_connect(struct vbg_dev *gdev, | |||
153 | } | 154 | } |
154 | EXPORT_SYMBOL(vbg_hgcm_connect); | 155 | EXPORT_SYMBOL(vbg_hgcm_connect); |
155 | 156 | ||
156 | int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 client_id, int *vbox_status) | 157 | int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 requestor, |
158 | u32 client_id, int *vbox_status) | ||
157 | { | 159 | { |
158 | struct vmmdev_hgcm_disconnect *hgcm_disconnect = NULL; | 160 | struct vmmdev_hgcm_disconnect *hgcm_disconnect = NULL; |
159 | int rc; | 161 | int rc; |
160 | 162 | ||
161 | hgcm_disconnect = vbg_req_alloc(sizeof(*hgcm_disconnect), | 163 | hgcm_disconnect = vbg_req_alloc(sizeof(*hgcm_disconnect), |
162 | VMMDEVREQ_HGCM_DISCONNECT); | 164 | VMMDEVREQ_HGCM_DISCONNECT, |
165 | requestor); | ||
163 | if (!hgcm_disconnect) | 166 | if (!hgcm_disconnect) |
164 | return -ENOMEM; | 167 | return -ENOMEM; |
165 | 168 | ||
@@ -593,9 +596,10 @@ static int hgcm_call_copy_back_result( | |||
593 | return 0; | 596 | return 0; |
594 | } | 597 | } |
595 | 598 | ||
596 | int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function, | 599 | int vbg_hgcm_call(struct vbg_dev *gdev, u32 requestor, u32 client_id, |
597 | u32 timeout_ms, struct vmmdev_hgcm_function_parameter *parms, | 600 | u32 function, u32 timeout_ms, |
598 | u32 parm_count, int *vbox_status) | 601 | struct vmmdev_hgcm_function_parameter *parms, u32 parm_count, |
602 | int *vbox_status) | ||
599 | { | 603 | { |
600 | struct vmmdev_hgcm_call *call; | 604 | struct vmmdev_hgcm_call *call; |
601 | void **bounce_bufs = NULL; | 605 | void **bounce_bufs = NULL; |
@@ -615,7 +619,7 @@ int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function, | |||
615 | goto free_bounce_bufs; | 619 | goto free_bounce_bufs; |
616 | } | 620 | } |
617 | 621 | ||
618 | call = vbg_req_alloc(size, VMMDEVREQ_HGCM_CALL); | 622 | call = vbg_req_alloc(size, VMMDEVREQ_HGCM_CALL, requestor); |
619 | if (!call) { | 623 | if (!call) { |
620 | ret = -ENOMEM; | 624 | ret = -ENOMEM; |
621 | goto free_bounce_bufs; | 625 | goto free_bounce_bufs; |
@@ -647,9 +651,9 @@ EXPORT_SYMBOL(vbg_hgcm_call); | |||
647 | 651 | ||
648 | #ifdef CONFIG_COMPAT | 652 | #ifdef CONFIG_COMPAT |
649 | int vbg_hgcm_call32( | 653 | int vbg_hgcm_call32( |
650 | struct vbg_dev *gdev, u32 client_id, u32 function, u32 timeout_ms, | 654 | struct vbg_dev *gdev, u32 requestor, u32 client_id, u32 function, |
651 | struct vmmdev_hgcm_function_parameter32 *parm32, u32 parm_count, | 655 | u32 timeout_ms, struct vmmdev_hgcm_function_parameter32 *parm32, |
652 | int *vbox_status) | 656 | u32 parm_count, int *vbox_status) |
653 | { | 657 | { |
654 | struct vmmdev_hgcm_function_parameter *parm64 = NULL; | 658 | struct vmmdev_hgcm_function_parameter *parm64 = NULL; |
655 | u32 i, size; | 659 | u32 i, size; |
@@ -689,7 +693,7 @@ int vbg_hgcm_call32( | |||
689 | goto out_free; | 693 | goto out_free; |
690 | } | 694 | } |
691 | 695 | ||
692 | ret = vbg_hgcm_call(gdev, client_id, function, timeout_ms, | 696 | ret = vbg_hgcm_call(gdev, requestor, client_id, function, timeout_ms, |
693 | parm64, parm_count, vbox_status); | 697 | parm64, parm_count, vbox_status); |
694 | if (ret < 0) | 698 | if (ret < 0) |
695 | goto out_free; | 699 | goto out_free; |
diff --git a/drivers/virt/vboxguest/vboxguest_version.h b/drivers/virt/vboxguest/vboxguest_version.h index 77f0c8f8a231..84834dad38d5 100644 --- a/drivers/virt/vboxguest/vboxguest_version.h +++ b/drivers/virt/vboxguest/vboxguest_version.h | |||
@@ -9,11 +9,10 @@ | |||
9 | #ifndef __VBOX_VERSION_H__ | 9 | #ifndef __VBOX_VERSION_H__ |
10 | #define __VBOX_VERSION_H__ | 10 | #define __VBOX_VERSION_H__ |
11 | 11 | ||
12 | /* Last synced October 4th 2017 */ | 12 | #define VBG_VERSION_MAJOR 6 |
13 | #define VBG_VERSION_MAJOR 5 | 13 | #define VBG_VERSION_MINOR 0 |
14 | #define VBG_VERSION_MINOR 2 | ||
15 | #define VBG_VERSION_BUILD 0 | 14 | #define VBG_VERSION_BUILD 0 |
16 | #define VBG_SVN_REV 68940 | 15 | #define VBG_SVN_REV 127566 |
17 | #define VBG_VERSION_STRING "5.2.0" | 16 | #define VBG_VERSION_STRING "6.0.0" |
18 | 17 | ||
19 | #endif | 18 | #endif |
diff --git a/drivers/virt/vboxguest/vmmdev.h b/drivers/virt/vboxguest/vmmdev.h index 5e2ae978935d..6337b8d75d96 100644 --- a/drivers/virt/vboxguest/vmmdev.h +++ b/drivers/virt/vboxguest/vmmdev.h | |||
@@ -98,8 +98,8 @@ struct vmmdev_request_header { | |||
98 | s32 rc; | 98 | s32 rc; |
99 | /** Reserved field no.1. MBZ. */ | 99 | /** Reserved field no.1. MBZ. */ |
100 | u32 reserved1; | 100 | u32 reserved1; |
101 | /** Reserved field no.2. MBZ. */ | 101 | /** IN: Requestor information (VMMDEV_REQUESTOR_*) */ |
102 | u32 reserved2; | 102 | u32 requestor; |
103 | }; | 103 | }; |
104 | VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24); | 104 | VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24); |
105 | 105 | ||
@@ -247,6 +247,8 @@ struct vmmdev_guest_info { | |||
247 | }; | 247 | }; |
248 | VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8); | 248 | VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8); |
249 | 249 | ||
250 | #define VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO BIT(0) | ||
251 | |||
250 | /** struct vmmdev_guestinfo2 - Guest information report, version 2. */ | 252 | /** struct vmmdev_guestinfo2 - Guest information report, version 2. */ |
251 | struct vmmdev_guest_info2 { | 253 | struct vmmdev_guest_info2 { |
252 | /** Header. */ | 254 | /** Header. */ |
@@ -259,7 +261,7 @@ struct vmmdev_guest_info2 { | |||
259 | u32 additions_build; | 261 | u32 additions_build; |
260 | /** SVN revision. */ | 262 | /** SVN revision. */ |
261 | u32 additions_revision; | 263 | u32 additions_revision; |
262 | /** Feature mask, currently unused. */ | 264 | /** Feature mask. */ |
263 | u32 additions_features; | 265 | u32 additions_features; |
264 | /** | 266 | /** |
265 | * The intentional meaning of this field was: | 267 | * The intentional meaning of this field was: |
diff --git a/include/linux/vbox_utils.h b/include/linux/vbox_utils.h index a240ed2a0372..ff56c443180c 100644 --- a/include/linux/vbox_utils.h +++ b/include/linux/vbox_utils.h | |||
@@ -24,15 +24,17 @@ __printf(1, 2) void vbg_debug(const char *fmt, ...); | |||
24 | #define vbg_debug pr_debug | 24 | #define vbg_debug pr_debug |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | int vbg_hgcm_connect(struct vbg_dev *gdev, | 27 | int vbg_hgcm_connect(struct vbg_dev *gdev, u32 requestor, |
28 | struct vmmdev_hgcm_service_location *loc, | 28 | struct vmmdev_hgcm_service_location *loc, |
29 | u32 *client_id, int *vbox_status); | 29 | u32 *client_id, int *vbox_status); |
30 | 30 | ||
31 | int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 client_id, int *vbox_status); | 31 | int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 requestor, |
32 | u32 client_id, int *vbox_status); | ||
32 | 33 | ||
33 | int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function, | 34 | int vbg_hgcm_call(struct vbg_dev *gdev, u32 requestor, u32 client_id, |
34 | u32 timeout_ms, struct vmmdev_hgcm_function_parameter *parms, | 35 | u32 function, u32 timeout_ms, |
35 | u32 parm_count, int *vbox_status); | 36 | struct vmmdev_hgcm_function_parameter *parms, u32 parm_count, |
37 | int *vbox_status); | ||
36 | 38 | ||
37 | /** | 39 | /** |
38 | * Convert a VirtualBox status code to a standard Linux kernel return value. | 40 | * Convert a VirtualBox status code to a standard Linux kernel return value. |
diff --git a/include/uapi/linux/vbox_vmmdev_types.h b/include/uapi/linux/vbox_vmmdev_types.h index 0e68024f36c7..26f39816af14 100644 --- a/include/uapi/linux/vbox_vmmdev_types.h +++ b/include/uapi/linux/vbox_vmmdev_types.h | |||
@@ -102,6 +102,66 @@ enum vmmdev_request_type { | |||
102 | #define VMMDEVREQ_HGCM_CALL VMMDEVREQ_HGCM_CALL32 | 102 | #define VMMDEVREQ_HGCM_CALL VMMDEVREQ_HGCM_CALL32 |
103 | #endif | 103 | #endif |
104 | 104 | ||
105 | /* vmmdev_request_header.requestor defines */ | ||
106 | |||
107 | /* Requestor user not given. */ | ||
108 | #define VMMDEV_REQUESTOR_USR_NOT_GIVEN 0x00000000 | ||
109 | /* The kernel driver (vboxguest) is the requestor. */ | ||
110 | #define VMMDEV_REQUESTOR_USR_DRV 0x00000001 | ||
111 | /* Some other kernel driver is the requestor. */ | ||
112 | #define VMMDEV_REQUESTOR_USR_DRV_OTHER 0x00000002 | ||
113 | /* The root or a admin user is the requestor. */ | ||
114 | #define VMMDEV_REQUESTOR_USR_ROOT 0x00000003 | ||
115 | /* Regular joe user is making the request. */ | ||
116 | #define VMMDEV_REQUESTOR_USR_USER 0x00000006 | ||
117 | /* User classification mask. */ | ||
118 | #define VMMDEV_REQUESTOR_USR_MASK 0x00000007 | ||
119 | |||
120 | /* Kernel mode request. Note this is 0, check for !USERMODE instead. */ | ||
121 | #define VMMDEV_REQUESTOR_KERNEL 0x00000000 | ||
122 | /* User mode request. */ | ||
123 | #define VMMDEV_REQUESTOR_USERMODE 0x00000008 | ||
124 | /* User or kernel mode classification mask. */ | ||
125 | #define VMMDEV_REQUESTOR_MODE_MASK 0x00000008 | ||
126 | |||
127 | /* Don't know the physical console association of the requestor. */ | ||
128 | #define VMMDEV_REQUESTOR_CON_DONT_KNOW 0x00000000 | ||
129 | /* | ||
130 | * The request originates with a process that is NOT associated with the | ||
131 | * physical console. | ||
132 | */ | ||
133 | #define VMMDEV_REQUESTOR_CON_NO 0x00000010 | ||
134 | /* Requestor process is associated with the physical console. */ | ||
135 | #define VMMDEV_REQUESTOR_CON_YES 0x00000020 | ||
136 | /* Console classification mask. */ | ||
137 | #define VMMDEV_REQUESTOR_CON_MASK 0x00000030 | ||
138 | |||
139 | /* Requestor is member of special VirtualBox user group. */ | ||
140 | #define VMMDEV_REQUESTOR_GRP_VBOX 0x00000080 | ||
141 | |||
142 | /* Note: trust level is for windows guests only, linux always uses not-given */ | ||
143 | /* Requestor trust level: Unspecified */ | ||
144 | #define VMMDEV_REQUESTOR_TRUST_NOT_GIVEN 0x00000000 | ||
145 | /* Requestor trust level: Untrusted (SID S-1-16-0) */ | ||
146 | #define VMMDEV_REQUESTOR_TRUST_UNTRUSTED 0x00001000 | ||
147 | /* Requestor trust level: Untrusted (SID S-1-16-4096) */ | ||
148 | #define VMMDEV_REQUESTOR_TRUST_LOW 0x00002000 | ||
149 | /* Requestor trust level: Medium (SID S-1-16-8192) */ | ||
150 | #define VMMDEV_REQUESTOR_TRUST_MEDIUM 0x00003000 | ||
151 | /* Requestor trust level: Medium plus (SID S-1-16-8448) */ | ||
152 | #define VMMDEV_REQUESTOR_TRUST_MEDIUM_PLUS 0x00004000 | ||
153 | /* Requestor trust level: High (SID S-1-16-12288) */ | ||
154 | #define VMMDEV_REQUESTOR_TRUST_HIGH 0x00005000 | ||
155 | /* Requestor trust level: System (SID S-1-16-16384) */ | ||
156 | #define VMMDEV_REQUESTOR_TRUST_SYSTEM 0x00006000 | ||
157 | /* Requestor trust level >= Protected (SID S-1-16-20480, S-1-16-28672) */ | ||
158 | #define VMMDEV_REQUESTOR_TRUST_PROTECTED 0x00007000 | ||
159 | /* Requestor trust level mask */ | ||
160 | #define VMMDEV_REQUESTOR_TRUST_MASK 0x00007000 | ||
161 | |||
162 | /* Requestor is using the less trusted user device node (/dev/vboxuser) */ | ||
163 | #define VMMDEV_REQUESTOR_USER_DEVICE 0x00008000 | ||
164 | |||
105 | /** HGCM service location types. */ | 165 | /** HGCM service location types. */ |
106 | enum vmmdev_hgcm_service_location_type { | 166 | enum vmmdev_hgcm_service_location_type { |
107 | VMMDEV_HGCM_LOC_INVALID = 0, | 167 | VMMDEV_HGCM_LOC_INVALID = 0, |