Changeset 75547 in vbox for trunk/src/VBox/Additions/common
- Timestamp:
- Nov 18, 2018 4:50:34 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 126706
- Location:
- trunk/src/VBox/Additions/common/VBoxGuest
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
r73097 r75547 2729 2729 * Some more validations. 2730 2730 */ 2731 if (pInfo->cParms > 4096) /* (Just make sure it doesn't overflow the next check.) */ 2731 if (RT_LIKELY(pInfo->cParms <= VMMDEV_MAX_HGCM_PARMS)) /* (Just make sure it doesn't overflow the next check.) */ 2732 { /* likely */} 2733 else 2732 2734 { 2733 2735 LogRel(("VBOXGUEST_IOCTL_HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms)); … … 2742 2744 #endif 2743 2745 cbActual += pInfo->cParms * sizeof(HGCMFunctionParameter); 2744 if (cbData < cbActual) 2746 if (RT_LIKELY(cbData >= cbActual)) 2747 { /* likely */} 2748 else 2745 2749 { 2746 2750 LogRel(("VBOXGUEST_IOCTL_HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n", … … 2758 2762 break; 2759 2763 RTSpinlockRelease(pDevExt->SessionSpinlock); 2760 if (RT_UNLIKELY(i >= RT_ELEMENTS(pSession->aHGCMClientIds))) 2764 if (RT_LIKELY(i < RT_ELEMENTS(pSession->aHGCMClientIds))) 2765 { /* likely */} 2766 else 2761 2767 { 2762 2768 LogRelMax(32, ("VBOXGUEST_IOCTL_HGCM_CALL: Invalid handle. u32Client=%RX32\n", u32ClientId)); … … 2818 2824 } 2819 2825 2826 2827 /** 2828 * Handles a fast HGCM call from another driver. 2829 * 2830 * The driver has provided a fully assembled HGCM call request and all we need 2831 * to do is send it to the host and do the wait processing. 2832 * 2833 * @returns VBox status code of the request submission part. 2834 * @param pDevExt The device extension. 2835 * @param pCallReq The call request. 2836 */ 2837 static int vgdrvIoCtl_HGCMFastCall(PVBOXGUESTDEVEXT pDevExt, VBGLIOCIDCHGCMFASTCALL volatile *pCallReq) 2838 { 2839 VMMDevHGCMCall volatile *pHgcmCall = (VMMDevHGCMCall volatile *)(pCallReq + 1); 2840 int rc; 2841 2842 /* 2843 * Check out the physical address. 2844 */ 2845 Assert((pCallReq->GCPhysReq & PAGE_OFFSET_MASK) == ((uintptr_t)pHgcmCall & PAGE_OFFSET_MASK)); 2846 2847 AssertReturn(!pCallReq->fInterruptible, VERR_NOT_IMPLEMENTED); 2848 2849 /* 2850 * Submit the request. 2851 */ 2852 Log(("vgdrvIoCtl_HGCMFastCall -> host\n")); 2853 ASMOutU32(pDevExt->IOPortBase + VMMDEV_PORT_OFF_REQUEST, (uint32_t)pCallReq->GCPhysReq); 2854 2855 /* Make the compiler aware that the host has changed memory. */ 2856 ASMCompilerBarrier(); 2857 2858 pCallReq->Hdr.rc = rc = pHgcmCall->header.header.rc; 2859 Log(("vgdrvIoCtl_HGCMFastCall -> %Rrc (header rc=%Rrc)\n", rc, pHgcmCall->header.result)); 2860 2861 /* 2862 * The host is likely to engage in asynchronous execution of HGCM, unless it fails. 2863 */ 2864 if (rc == VINF_HGCM_ASYNC_EXECUTE) 2865 { 2866 rc = vgdrvHgcmAsyncWaitCallbackWorker(&pHgcmCall->header, pDevExt, false /* fInterruptible */, RT_INDEFINITE_WAIT); 2867 if (pHgcmCall->header.fu32Flags & VBOX_HGCM_REQ_DONE) 2868 { 2869 Assert(!(pHgcmCall->header.fu32Flags & VBOX_HGCM_REQ_CANCELLED)); 2870 rc = VINF_SUCCESS; 2871 } 2872 else 2873 { 2874 /* 2875 * Timeout and interrupt scenarios are messy and requires 2876 * cancelation, so implement later. 2877 */ 2878 AssertReleaseMsgFailed(("rc=%Rrc\n", rc)); 2879 } 2880 } 2881 else 2882 Assert((pHgcmCall->header.fu32Flags & VBOX_HGCM_REQ_DONE) || RT_FAILURE_NP(rc)); 2883 2884 Log(("vgdrvIoCtl_HGCMFastCall: rc=%Rrc result=%Rrc fu32Flags=%#x\n", rc, pHgcmCall->header.result, pHgcmCall->header.fu32Flags)); 2885 return rc; 2886 2887 } 2820 2888 2821 2889 #endif /* VBOX_WITH_HGCM */ … … 4060 4128 } 4061 4129 #ifdef VBOX_WITH_HGCM 4130 else if (iFunction == VBGL_IOCTL_IDC_HGCM_FAST_CALL) /* (is variable size, but we don't bother encoding it) */ 4131 { 4132 REQ_CHECK_RING0("VBGL_IOCTL_IDC_HGCM_FAST_CALL"); 4133 REQ_CHECK_EXPR(VBGL_IOCTL_IDC_HGCM_FAST_CALL, cbReq >= sizeof(VBGLIOCIDCHGCMFASTCALL) + sizeof(VMMDevHGCMCall)); 4134 vgdrvIoCtl_HGCMFastCall(pDevExt, (VBGLIOCIDCHGCMFASTCALL volatile *)pReqHdr); 4135 } 4062 4136 else if ( iFunctionStripped == VBGL_IOCTL_CODE_STRIPPED(VBGL_IOCTL_HGCM_CALL(0)) 4063 4137 # if ARCH_BITS == 64 -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibHGCM.cpp
r72627 r75547 231 231 } 232 232 233 234 DECLR0VBGL(int) VbglR0HGCMFastCall(VBGLHGCMHANDLE hHandle, PVBGLIOCIDCHGCMFASTCALL pCallReq, uint32_t cbCallReq) 235 { 236 /* pCallReq->Hdr.rc and pCallReq->HgcmCallReq.header.header.rc; are not used by this IDC. */ 237 return VbglR0IdcCallRaw(&hHandle->IdcHandle, VBGL_IOCTL_IDC_HGCM_FAST_CALL, &pCallReq->Hdr, cbCallReq); 238 } 239 -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibInternal.h
r72627 r75547 107 107 typedef struct _VBGLPHYSHEAPCHUNK VBGLPHYSHEAPCHUNK; 108 108 109 #ifndef VBGL_VBOXGUEST110 struct VBGLHGCMHANDLEDATA111 {112 uint32_t fAllocated;113 VBGLIDCHANDLE IdcHandle;114 };115 #endif116 117 109 enum VbglLibStatus 118 110 {
Note:
See TracChangeset
for help on using the changeset viewer.