VirtualBox

Changeset 75547 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Nov 18, 2018 4:50:34 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
126706
Message:

VBoxGuest: Added an IDC interface for faster HGCM calls (VBGL_IOCTL_IDC_HGCM_FAST_CALL, VbglR0HGCMFastCall). This expects the caller to construct a valid call and only concerns itself with issuing it to the host and waiting for the result to arrive. bugref:9172

Location:
trunk/src/VBox/Additions/common/VBoxGuest
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp

    r73097 r75547  
    27292729     * Some more validations.
    27302730     */
    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
    27322734    {
    27332735        LogRel(("VBOXGUEST_IOCTL_HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms));
     
    27422744#endif
    27432745        cbActual += pInfo->cParms * sizeof(HGCMFunctionParameter);
    2744     if (cbData < cbActual)
     2746    if (RT_LIKELY(cbData >= cbActual))
     2747    { /* likely */}
     2748    else
    27452749    {
    27462750        LogRel(("VBOXGUEST_IOCTL_HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",
     
    27582762            break;
    27592763    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
    27612767    {
    27622768        LogRelMax(32, ("VBOXGUEST_IOCTL_HGCM_CALL: Invalid handle. u32Client=%RX32\n", u32ClientId));
     
    28182824}
    28192825
     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 */
     2837static 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}
    28202888
    28212889#endif /* VBOX_WITH_HGCM */
     
    40604128        }
    40614129#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        }
    40624136        else if (   iFunctionStripped == VBGL_IOCTL_CODE_STRIPPED(VBGL_IOCTL_HGCM_CALL(0))
    40634137# if ARCH_BITS == 64
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibHGCM.cpp

    r72627 r75547  
    231231}
    232232
     233
     234DECLR0VBGL(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  
    107107typedef struct _VBGLPHYSHEAPCHUNK VBGLPHYSHEAPCHUNK;
    108108
    109 #ifndef VBGL_VBOXGUEST
    110 struct VBGLHGCMHANDLEDATA
    111 {
    112     uint32_t fAllocated;
    113     VBGLIDCHANDLE IdcHandle;
    114 };
    115 #endif
    116 
    117109enum VbglLibStatus
    118110{
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette