VirtualBox

Changeset 84042 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Apr 28, 2020 11:32:07 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
137615
Message:

VUSB: Simplified control message extra data layout (WIP).

Location:
trunk/src/VBox/Devices/USB
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/VUSBInternal.h

    r82968 r84042  
    147147     * accommodate any larger request (unlikely). */
    148148    uint32_t            cbMax;
     149    /** VUSB internal data for the extra URB. */
     150    VUSBURBVUSBINT      vUsbExtra;
    149151    /** The message URB. */
    150152    VUSBURB             Urb;
  • trunk/src/VBox/Devices/USB/VUSBUrb.cpp

    r83617 r84042  
    611611/** @todo reuse these? */
    612612    PVUSBCTRLEXTRA pExtra;
    613     const size_t cbMax = sizeof(VUSBURBVUSBINT) + sizeof(pExtra->Urb.abData) + sizeof(VUSBSETUP);
     613#if 0
     614    const size_t cbMax = sizeof(pExtra->Urb.abData) + sizeof(VUSBSETUP);
     615#else
     616    const size_t cbMax = sizeof(VUSBSETUP);
     617#endif
    614618    pExtra = (PVUSBCTRLEXTRA)RTMemAllocZ(RT_UOFFSETOF_DYN(VUSBCTRLEXTRA, Urb.abData[cbMax]));
    615619    if (pExtra)
     
    629633        RTStrAPrintf(&pExtra->Urb.pszDesc, "URB %p msg->%p", &pExtra->Urb, pUrb);
    630634#endif
    631         pExtra->Urb.pVUsb = (PVUSBURBVUSB)&pExtra->Urb.abData[sizeof(pExtra->Urb.abData) + sizeof(VUSBSETUP)];
     635        pExtra->Urb.pVUsb = (PVUSBURBVUSB)&pExtra->vUsbExtra;
    632636        //pExtra->Urb.pVUsb->pCtrlUrb = NULL;
    633637        //pExtra->Urb.pVUsb->pNext = NULL;
     
    701705     * Check that we've got sufficient space in the message URB.
    702706     */
    703     if (pExtra->cbMax < cbBuf + pSetupIn->wLength + sizeof(VUSBURBVUSBINT))
    704     {
    705 #if 1
    706         LogRelMax(10, ("VUSB: Control URB too large (wLength=%u)!\n", pSetupIn->wLength));
    707         return false;
    708 #else
    709         uint32_t cbReq = RT_ALIGN_32(cbBuf + pSetupIn->wLength + sizeof(VUSBURBVUSBINT), 1024);
     707    if (pExtra->cbMax < cbBuf + pSetupIn->wLength)
     708    {
     709        uint32_t cbReq = RT_ALIGN_32(cbBuf + pSetupIn->wLength, 64);
    710710        PVUSBCTRLEXTRA pNew = (PVUSBCTRLEXTRA)RTMemRealloc(pExtra, RT_UOFFSETOF_DYN(VUSBCTRLEXTRA, Urb.abData[cbReq]));
    711711        if (!pNew)
     
    717717        if (pExtra != pNew)
    718718        {
     719            LogFunc(("Reallocated %u -> %u\n", pExtra->cbMax, cbReq));
    719720            pNew->pMsg = (PVUSBSETUP)pNew->Urb.abData;
    720721            pExtra = pNew;
    721722            pPipe->pCtrl = pExtra;
     723            pExtra->Urb.pVUsb = (PVUSBURBVUSB)&pExtra->vUsbExtra;
     724            pExtra->Urb.pVUsb->pUrb = &pExtra->Urb;
     725            pExtra->Urb.pVUsb->pvFreeCtx = &pExtra->Urb;
    722726        }
    723727
    724         PVUSBURBVUSB pOldVUsb = (PVUSBURBVUSB)&pExtra->Urb.abData[pExtra->cbMax - sizeof(VUSBURBVUSBINT)];
    725         pExtra->Urb.pVUsb = (PVUSBURBVUSB)&pExtra->Urb.abData[cbBuf + pSetupIn->wLength];
    726         memmove(pExtra->Urb.pVUsb, pOldVUsb, sizeof(VUSBURBVUSBINT));
    727         memset(pOldVUsb, 0, (uint8_t *)pExtra->Urb.pVUsb - (uint8_t *)pOldVUsb);
    728         pExtra->Urb.pVUsb->pUrb = &pExtra->Urb;
    729         pExtra->Urb.pVUsb->pvFreeCtx = &pExtra->Urb;
    730728        pExtra->cbMax = cbReq;
    731 
    732 #endif
    733729    }
    734730    Assert(pExtra->Urb.enmState == VUSBURBSTATE_ALLOCATED);
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