VirtualBox

Changeset 82151 in vbox for trunk/src


Ignore:
Timestamp:
Nov 25, 2019 4:14:32 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134961
Message:

Storage/DevVirtioSCSI.cpp: Did some work on virtio async event subscription logic. Fixed medium eject detection. Added one more layer of mallocs to virtual address S/G buffer handling to prevent stack out of scope errors undetected by the Sanitizer.

Location:
trunk/src/VBox/Devices
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp

    r82145 r82151  
    334334     | VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY )
    335335
     336#define SUPPORTED_EVENTS            0                           /* TBD */
     337
    336338/**
    337339 * Worker thread context, shared state.
     
    372374
    373375    /** Target number (PDM LUN) */
    374     uint32_t                        iTarget;
     376    uint32_t                        uTarget;
    375377
    376378    /** Target Description */
     
    391393    PDMIMEDIAEXPORT                 IMediaExPort;
    392394
    393     PPDMIMEDIANOTIFY                pMediaNotify;
    394 
    395395    /** Pointer to the attached driver's extended media interface. */
    396396    R3PTRTYPE(PPDMIMEDIAEX)         pDrvMediaEx;
     
    443443    /** Total number of requests active across all targets */
    444444    volatile uint32_t               cActiveReqs;
    445 
    446     /** Events the guest has subscribed to get notifications of */
    447     uint32_t                        fSubscribedEvents;
    448445
    449446    /** VirtIO Host SCSI device runtime configuration parameters */
     
    734731    AssertReturn(paReqSegs, VERR_NO_MEMORY);
    735732
    736     paReqSegs[0].pvSeg = &event;
    737     paReqSegs[0].cbSeg = sizeof(sizeof(event));
     733    /* Copy segment data to malloc'd memory to avoid stack out-of-scope errors sanitizer doesn't detect */
     734    paReqSegs[0].pvSeg = RTMemAlloc(sizeof(event));
     735    AssertReturn(paReqSegs[0].pvSeg, VERR_NO_MEMORY);
     736    memcpy(paReqSegs[0].pvSeg, &event, sizeof(event));
    738737
    739738    RTSgBufInit(pReqSegBuf, paReqSegs, 1);
     
    742741    virtioCoreQueueSync(pDevIns, &pThis->Virtio, EVENTQ_IDX);
    743742
     743    RTMemFree(paReqSegs[0].pvSeg);
    744744    RTMemFree(paReqSegs);
    745745    RTMemFree(pReqSegBuf);
     
    793793        pRespHdr->cbSenseLen = 0;
    794794
     795    /* Copy segment data to malloc'd memory to avoid stack out-of-scope errors sanitizer doesn't detect */
     796    for (int i = 0; i < 2; i++)
     797    {
     798        void *pv = paReqSegs[i].pvSeg;
     799        paReqSegs[i].pvSeg = RTMemAlloc(paReqSegs[i].cbSeg);
     800        AssertReturn(paReqSegs[i].pvSeg, VERR_NO_MEMORY);
     801        memcpy(paReqSegs[i].pvSeg, pv, paReqSegs[i].cbSeg);
     802    }
     803
    795804    RTSgBufInit(pReqSegBuf, paReqSegs, 2);
    796805
     
    801810    virtioCoreQueueSync(pDevIns, &pThis->Virtio, qIdx);
    802811
    803     RTMemFree(pabSenseBuf);
     812    for (int i = 0; i < 2; i++)
     813        RTMemFree(paReqSegs[i].pvSeg);
     814
    804815    RTMemFree(paReqSegs);
    805816    RTMemFree(pReqSegBuf);
     817    RTMemFree(pabSenseBuf);
    806818
    807819    if (!ASMAtomicDecU32(&pThis->cActiveReqs) && pThisCC->fQuiescing)
     
    951963        paReqSegs[cSegs++].cbSeg = pReq->cbSenseAlloc; /* VirtIO 1.0 spec 5.6.4/5.6.6.1 */
    952964
     965        /* Copy segment data to malloc'd memory to avoid stack out-of-scope errors sanitizer doesn't detect */
     966        for (int i = 0; i < cSegs; i++)
     967        {
     968            void *pv = paReqSegs[i].pvSeg;
     969            paReqSegs[i].pvSeg = RTMemAlloc(paReqSegs[i].cbSeg);
     970            AssertReturn(paReqSegs[i].pvSeg, VERR_NO_MEMORY);
     971            memcpy(paReqSegs[i].pvSeg, pv, paReqSegs[i].cbSeg);
     972        }
     973
    953974        RTSgBufInit(pReqSegBuf, paReqSegs, cSegs);
    954975
     
    961982        virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, pReq->qIdx, pReqSegBuf, pReq->pDescChain, true /* fFence TBD */);
    962983        virtioCoreQueueSync(pDevIns, &pThis->Virtio, pReq->qIdx);
     984
     985        for (int i = 0; i < cSegs; i++)
     986            RTMemFree(paReqSegs[i].pvSeg);
    963987
    964988        RTMemFree(paReqSegs);
     
    12991323{
    13001324    uint8_t bResponse = VIRTIOSCSI_S_OK;
    1301     uint8_t cSegs = 1;
     1325    uint8_t cSegs = 0;
    13021326
    13031327    AssertReturn(pDescChain->cbPhysSend >= RT_MIN(sizeof(VIRTIOSCSI_CTRL_AN_T),
     
    13251349                       || pScsiCtrlUnion->scsiCtrl.uType == VIRTIOSCSI_T_AN_SUBSCRIBE)
    13261350                     && pDescChain->cbPhysSend >= sizeof(VIRTIOSCSI_CTRL_AN_T)), 0);
    1327 
    1328     /*
    1329      * Mask of events to tell guest driver this device supports
    1330      * See VirtIO 1.0 specification section 5.6.6.2
    1331      */
    1332     uint32_t fSubscribedEvents  = VIRTIOSCSI_EVT_ASYNC_POWER_MGMT
    1333                                 | VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST
    1334                                 | VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE
    1335                                 | VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY;
    13361351
    13371352    PRTSGSEG paReqSegs = (PRTSGSEG)RTMemAllocZ(sizeof(RTSGSEG) * 2);
     
    13871402            RTSGSEG aSegs[] = { { &bResponse,  sizeof(bResponse) } };
    13881403            memcpy(paReqSegs, aSegs, sizeof(aSegs));
    1389 
     1404            cSegs = RT_ELEMENTS(aSegs);
    13901405            break;
    13911406        }
     
    13941409
    13951410            PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnQuery = &pScsiCtrlUnion->scsiCtrlAsyncNotify;
    1396 
    1397             fSubscribedEvents &= pScsiCtrlAnQuery->fEventsRequested;
    13981411
    13991412            uint8_t  uTarget  = pScsiCtrlAnQuery->abScsiLun[1];
     
    14171430            }
    14181431#endif
    1419             RTSGSEG aSegs[] = { { &fSubscribedEvents, sizeof(fSubscribedEvents) },
     1432            uint32_t fSupportedEvents = SUPPORTED_EVENTS;
     1433            RTSGSEG aSegs[] = { { &fSupportedEvents, sizeof(fSupportedEvents) },
    14201434                                { &bResponse, sizeof(bResponse) } };
    1421             cSegs = 2;
    14221435            memcpy(paReqSegs, aSegs, sizeof(aSegs));
    1423 
     1436            cSegs = RT_ELEMENTS(aSegs);
    14241437            break;
    14251438        }
    14261439        case VIRTIOSCSI_T_AN_SUBSCRIBE: /* Guest SCSI driver is subscribing to async event notification(s) */
    14271440        {
    1428 
    14291441            PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnSubscribe = &pScsiCtrlUnion->scsiCtrlAsyncNotify;
    14301442
    14311443            if (pScsiCtrlAnSubscribe->fEventsRequested & ~SUBSCRIBABLE_EVENTS)
    1432                 LogFunc(("Unsupported bits in event subscription event mask: %#x\n", pScsiCtrlAnSubscribe->fEventsRequested));
    1433 
    1434             fSubscribedEvents &= pScsiCtrlAnSubscribe->fEventsRequested;
    1435             pThis->fAsyncEvtsEnabled = fSubscribedEvents;
     1444                LogFunc(("Unsupported bits in event subscription event mask: %#x\n",
     1445                         pScsiCtrlAnSubscribe->fEventsRequested));
    14361446
    14371447            uint8_t  uTarget  = pScsiCtrlAnSubscribe->abScsiLun[1];
     
    14551465            else
    14561466            {
    1457                 /*
    1458                  * TBD: Verify correct status code if request mask is only partially fulfillable
    1459                  *      and confirm when to use 'complete' vs. 'succeeded' See VirtIO 1.0 spec section 5.6.6.2
    1460                  *      and read SAM docs*/
    1461                 if (fSubscribedEvents == pScsiCtrlAnSubscribe->fEventsRequested)
    1462                     bResponse = VIRTIOSCSI_S_FUNCTION_SUCCEEDED;
    1463                 else
    1464                     bResponse = VIRTIOSCSI_S_FUNCTION_COMPLETE;
     1467                bResponse = VIRTIOSCSI_S_FUNCTION_SUCCEEDED; /* or VIRTIOSCSI_S_FUNCTION_COMPLETE? */
     1468                pThis->fAsyncEvtsEnabled = SUPPORTED_EVENTS & pScsiCtrlAnSubscribe->fEventsRequested;
    14651469            }
    1466             RTSGSEG aSegs[] = { { &fSubscribedEvents, sizeof(fSubscribedEvents) },
     1470
     1471            RTSGSEG aSegs[] = { { &pThis->fAsyncEvtsEnabled, sizeof(pThis->fAsyncEvtsEnabled) },
    14671472                                { &bResponse, sizeof(bResponse) } };
    1468             cSegs = 2;
    14691473            memcpy(paReqSegs, aSegs, sizeof(aSegs));
    1470 
     1474            cSegs = RT_ELEMENTS(aSegs);
    14711475            break;
    14721476        }
     
    14781482            RTSGSEG aSegs[] = { { &bResponse, sizeof(bResponse) } };
    14791483            memcpy(paReqSegs, aSegs, sizeof(aSegs));
    1480 
     1484            cSegs = RT_ELEMENTS(aSegs);
    14811485        }
    14821486    }
     
    14861490    AssertReturn(pReqSegBuf, VERR_NO_MEMORY);
    14871491
     1492    /* Copy segment data to malloc'd memory to avoid stack out-of-scope errors sanitizer doesn't detect */
     1493    for (int i = 0; i < cSegs; i++)
     1494    {
     1495        void *pv = paReqSegs[i].pvSeg;
     1496        paReqSegs[i].pvSeg = RTMemAlloc(paReqSegs[i].cbSeg);
     1497        AssertReturn(paReqSegs[i].pvSeg, VERR_NO_MEMORY);
     1498        memcpy(paReqSegs[i].pvSeg, pv, paReqSegs[i].cbSeg);
     1499    }
     1500
    14881501    RTSgBufInit(pReqSegBuf, paReqSegs, cSegs);
    14891502
    14901503    virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, qIdx, pReqSegBuf, pDescChain, true);
    14911504    virtioCoreQueueSync(pDevIns, &pThis->Virtio, qIdx);
     1505
     1506    for (int i = 0; i < cSegs; i++)
     1507        RTMemFree(paReqSegs[i].pvSeg);
    14921508
    14931509    RTMemFree(paReqSegs);
     
    15961612}
    15971613
     1614
    15981615#if 0
    1599 
    1600 /** Only invoke this if VIRTIOSCSI_F_HOTPLUG is negotiated during intiailization
    1601  * This effectively removes the SCSI Target/LUN on the guest side
    1602  */
    1603 DECLINLINE(void) virtioScsiR3ReportTargetRemoved(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
     1616/* SUBSCRIBABLE EVENT - not sure when to call this or how to detect when media is added or removed
     1617 *                      via the VBox GUI */
     1618DECLINLINE(void) virtioScsiR3ReportMediaChange(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
     1619{
     1620    if (pThis->fAsyncEvtsEnabled & VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE)
     1621        virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE);
     1622}
     1623
     1624/* ESSENTIAL (NON-SUBSCRIBABLE) EVENT TYPES (most guest virtio-scsi drivers ignore?)  */
     1625
     1626DECLINLINE(void) virtioScsiR3ReportTransportReset(PDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
     1627{
     1628    virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_TRANSPORT_RESET, VIRTIOSCSI_EVT_RESET_HARD);
     1629}
     1630
     1631DECLINLINE(void) virtioScsiR3ReportParamChange(PDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget,
     1632                                               uint32_t uSenseCode, uint32_t uSenseQualifier)
     1633{
     1634    uint32_t uReason = uSenseQualifier << 8 | uSenseCode;
     1635    virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_PARAM_CHANGE, uReason);
     1636
     1637}
     1638
     1639DECLINLINE(void) virtioScsiR3ReportTargetRemoved(PDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    16041640{
    16051641    if (pThis->fHasHotplug)
     
    16071643}
    16081644
    1609 /** Only invoke this if VIRTIOSCSI_F_HOTPLUG is negotiated during intiailization
    1610  * This effectively adds the SCSI Target/LUN on the guest side
    1611  */
    1612 DECLINLINE(void) virtioScsiR3ReportTargetAdded(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
     1645DECLINLINE(void) virtioScsiR3ReportTargetAdded(PDMDEVINS pDevInsPVIRTIOSCSI pThis, uint16_t uTarget)
    16131646{
    16141647    if (pThis->fHasHotplug)
    16151648        virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_TRANSPORT_RESET, VIRTIOSCSI_EVT_RESET_RESCAN);
    1616 }
    1617 
    1618 DECLINLINE(void) virtioScsiR3ReportTargetReset(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    1619 {
    1620     virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_TRANSPORT_RESET, VIRTIOSCSI_EVT_RESET_HARD);
    1621 }
    1622 
    1623 DECLINLINE(void) virtioScsiR3ReportOperChange(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    1624 {
    1625     if (pThis->fSubscribedEvents & VIRTIOSCSI_EVT_ASYNC_OPERATIONAL_CHANGE)
    1626         virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_OPERATIONAL_CHANGE);
    1627 }
    1628 
    1629 DECLINLINE(void) virtioScsiR3ReportPowerMsg(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    1630 {
    1631     if (pThis->fSubscribedEvents & VIRTIOSCSI_EVT_ASYNC_POWER_MGMT)
    1632         virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_POWER_MGMT);
    1633 }
    1634 
    1635 DECLINLINE(void) virtioScsiR3ReportExtReq(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    1636 {
    1637     if (pThis->fSubscribedEvents & VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST)
    1638         virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST);
    1639 }
    1640 
    1641 DECLINLINE(void) virtioScsiR3ReportMediaChange(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    1642 {
    1643     if (pThis->fSubscribedEvents & VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE)
    1644         virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE);
    1645 }
    1646 
    1647 DECLINLINE(void) virtioScsiR3ReportMultiHost(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget)
    1648 {
    1649     if (pThis->fSubscribedEvents & VIRTIOSCSI_EVT_ASYNC_MULTI_HOST)
    1650         virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_MULTI_HOST);
    1651 }
    1652 
    1653 DECLINLINE(void) virtioScsiR3ReportDeviceBusy(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSI pThis, uint16_t uTarget)
    1654 {
    1655     if (pThis->fSubscribedEvents & VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY)
    1656         virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_ASYNC_NOTIFY, VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY);
    1657 }
    1658 
    1659 DECLINLINE(void) virtioScsiR3ReportParamChange(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget,
    1660                                                uint32_t uSenseCode, uint32_t uSenseQualifier)
    1661 {
    1662     uint32_t uReason = uSenseQualifier << 8 | uSenseCode;
    1663     virtioScsiR3SendEvent(pDevIns, pThis, uTarget, VIRTIOSCSI_T_PARAM_CHANGE, uReason);
    1664 
    16651649}
    16661650
     
    17581742    return VERR_PDM_LUN_NOT_FOUND;
    17591743}
    1760 
    17611744/**
    17621745 * @interface_method_impl{PDMILEDPORTS,pfnQueryStatusLed, Device level.}
     
    17951778    *ppcszController = pDevIns->pReg->szName;
    17961779    *piInstance = pDevIns->iInstance;
    1797     *piLUN = pTarget->iTarget;
     1780    *piLUN = pTarget->uTarget;
    17981781
    17991782    return VINF_SUCCESS;
     
    18611844    AssertReturn(pv && cb <= sizeof(uint32_t), fWrite ? VINF_SUCCESS : VINF_IOM_MMIO_UNUSED_00);
    18621845
    1863     if (MATCH_SCSI_CONFIG(            uNumQueues))
     1846    if (MATCH_SCSI_CONFIG(uNumQueues))
    18641847        SCSI_CONFIG_ACCESSOR_READONLY(uNumQueues);
    1865     else if (MATCH_SCSI_CONFIG(       uSegMax))
     1848    else
     1849    if (MATCH_SCSI_CONFIG(uSegMax))
    18661850        SCSI_CONFIG_ACCESSOR_READONLY(uSegMax);
    1867     else if (MATCH_SCSI_CONFIG(       uMaxSectors))
     1851    else
     1852    if (MATCH_SCSI_CONFIG(uMaxSectors))
    18681853        SCSI_CONFIG_ACCESSOR_READONLY(uMaxSectors);
    1869     else if (MATCH_SCSI_CONFIG(       uCmdPerLun))
     1854    else
     1855    if (MATCH_SCSI_CONFIG(uCmdPerLun))
    18701856        SCSI_CONFIG_ACCESSOR_READONLY(uCmdPerLun);
    1871     else if (MATCH_SCSI_CONFIG(       uEventInfoSize))
     1857    else
     1858    if (MATCH_SCSI_CONFIG(uEventInfoSize))
    18721859        SCSI_CONFIG_ACCESSOR_READONLY(uEventInfoSize);
    1873     else if (MATCH_SCSI_CONFIG(       uSenseSize))
    1874         SCSI_CONFIG_ACCESSOR(         uSenseSize);
    1875     else if (MATCH_SCSI_CONFIG(       uCdbSize))
    1876         SCSI_CONFIG_ACCESSOR(         uCdbSize);
    1877     else if (MATCH_SCSI_CONFIG(       uMaxChannel))
     1860    else
     1861    if (MATCH_SCSI_CONFIG(uSenseSize))
     1862        SCSI_CONFIG_ACCESSOR(uSenseSize);
     1863    else
     1864    if (MATCH_SCSI_CONFIG(uCdbSize))
     1865        SCSI_CONFIG_ACCESSOR(uCdbSize);
     1866    else
     1867    if (MATCH_SCSI_CONFIG(uMaxChannel))
    18781868        SCSI_CONFIG_ACCESSOR_READONLY(uMaxChannel);
    1879     else if (MATCH_SCSI_CONFIG(       uMaxTarget))
     1869    else
     1870    if (MATCH_SCSI_CONFIG(uMaxTarget))
    18801871        SCSI_CONFIG_ACCESSOR_READONLY(uMaxTarget);
    1881     else if (MATCH_SCSI_CONFIG(       uMaxLun))
     1872    else
     1873    if (MATCH_SCSI_CONFIG(uMaxLun))
    18821874        SCSI_CONFIG_ACCESSOR_READONLY(uMaxLun);
    18831875    else
     
    21432135 * The VM is suspended at this point.
    21442136 */
    2145 static DECLCALLBACK(void) virtioScsiR3Detach(PPDMDEVINS pDevIns, unsigned iTarget, uint32_t fFlags)
     2137static DECLCALLBACK(void) virtioScsiR3Detach(PPDMDEVINS pDevIns, unsigned uTarget, uint32_t fFlags)
    21462138{
    21472139    PVIRTIOSCSI       pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    21482140    PVIRTIOSCSICC     pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIOSCSICC);
    2149     AssertReturnVoid(iTarget < pThis->cTargets);
    2150     PVIRTIOSCSITARGET pTarget = &pThisCC->paTargetInstances[iTarget];
     2141    AssertReturnVoid(uTarget < pThis->cTargets);
     2142    PVIRTIOSCSITARGET pTarget = &pThisCC->paTargetInstances[uTarget];
    21512143
    21522144    LogFunc((""));
     
    21632155    pTarget->pDrvMedia      = NULL;
    21642156    pTarget->pDrvMediaEx    = NULL;
    2165     pTarget->pMediaNotify   = NULL;
    21662157}
    21672158
     
    21712162 * This is called when we change block driver.
    21722163 */
    2173 static DECLCALLBACK(int) virtioScsiR3Attach(PPDMDEVINS pDevIns, unsigned iTarget, uint32_t fFlags)
     2164static DECLCALLBACK(int) virtioScsiR3Attach(PPDMDEVINS pDevIns, unsigned uTarget, uint32_t fFlags)
    21742165{
    21752166    PVIRTIOSCSI       pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    21762167    PVIRTIOSCSICC     pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIOSCSICC);
    2177     AssertReturn(iTarget < pThis->cTargets, VERR_PDM_LUN_NOT_FOUND);
    2178     PVIRTIOSCSITARGET pTarget = &pThisCC->paTargetInstances[iTarget];
     2168    AssertReturn(uTarget < pThis->cTargets, VERR_PDM_LUN_NOT_FOUND);
     2169    PVIRTIOSCSITARGET pTarget = &pThisCC->paTargetInstances[uTarget];
    21792170
    21802171    Assert(pTarget->pDevIns == pDevIns);
     
    21832174                    VERR_INVALID_PARAMETER);
    21842175
    2185     /* the usual paranoia */
    21862176    AssertRelease(!pTarget->pDrvBase);
    2187     Assert(pTarget->iTarget == iTarget);
     2177    Assert(pTarget->uTarget == uTarget);
    21882178
    21892179    /*
    2190      * Try attach the SCSI driver and get the interfaces,
    2191      * required as well as optional.
     2180     * Try attach the SCSI driver and get the interfaces, required as well as optional.
    21922181     */
    2193     int rc = PDMDevHlpDriverAttach(pDevIns, pTarget->iTarget, &pDevIns->IBase, &pTarget->pDrvBase, pTarget->pszTargetName);
     2182    int rc = PDMDevHlpDriverAttach(pDevIns, pTarget->uTarget, &pDevIns->IBase, &pTarget->pDrvBase, pTarget->pszTargetName);
    21942183    if (RT_SUCCESS(rc))
    21952184    {
     
    21972186        pTarget->pDrvMedia = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIA);
    21982187        AssertMsgReturn(VALID_PTR(pTarget->pDrvMedia),
    2199                         ("virtio-scsi configuration error: LUN#%d missing basic media interface!\n", iTarget),
     2188                        ("virtio-scsi configuration error: LUN#%d missing basic media interface!\n", uTarget),
    22002189                        VERR_PDM_MISSING_INTERFACE);
    22012190
     
    22032192        pTarget->pDrvMediaEx = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIAEX);
    22042193        AssertMsgReturn(VALID_PTR(pTarget->pDrvMediaEx),
    2205                         ("virtio-scsi configuration error: LUN#%d missing extended media interface!\n", iTarget),
     2194                        ("virtio-scsi configuration error: LUN#%d missing extended media interface!\n", uTarget),
    22062195                        VERR_PDM_MISSING_INTERFACE);
    22072196
    22082197        rc = pTarget->pDrvMediaEx->pfnIoReqAllocSizeSet(pTarget->pDrvMediaEx, sizeof(VIRTIOSCSIREQ));
    22092198        AssertMsgReturn(VALID_PTR(pTarget->pDrvMediaEx),
    2210                         ("virtio-scsi configuration error: LUN#%u: Failed to set I/O request size!\n", iTarget),
     2199                        ("virtio-scsi configuration error: LUN#%u: Failed to set I/O request size!\n", uTarget),
    22112200                        rc);
    2212 /*
    2213             pTarget->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIANOTIFY);
    2214 */
    2215 
    22162201    }
    22172202    else
     
    22242209        pTarget->pDrvMedia      = NULL;
    22252210        pTarget->pDrvMediaEx    = NULL;
    2226         pTarget->pMediaNotify   = NULL;
     2211        pThisCC->pMediaNotify   = NULL;
    22272212    }
    22282213    return rc;
     
    23622347    PVIRTIOSCSICC       pThisCC   = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIOSCSICC);
    23632348
    2364     LogFunc(("LUN %d Ejected!\n", pTarget->iTarget));
     2349#if 0 /* need more info about how to use this event */
     2350    virtioScsiR3ReportMediaChange(pDevIns, pThis, pTarget->uTarget);
     2351#endif
     2352
    23652353    if (pThisCC->pMediaNotify)
    23662354    {
    23672355        int rc = VMR3ReqCallNoWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
    23682356                                   (PFNRT)pThisCC->pMediaNotify->pfnEjected, 2,
    2369                                    pThisCC->pMediaNotify, pTarget->iTarget);
     2357                                   pThisCC->pMediaNotify, pTarget->uTarget);
    23702358        AssertRC(rc);
    23712359    }
     
    24122400    RTMemFree(pThisCC->paTargetInstances);
    24132401    pThisCC->paTargetInstances = NULL;
     2402    pThisCC->pMediaNotify = NULL;
    24142403
    24152404    for (unsigned qIdx = 0; qIdx < VIRTIOSCSI_QUEUE_CNT; qIdx++)
     
    25402529     * Initialize per device instances (targets).
    25412530     */
    2542 
    25432531    Log2Func(("Probing %d targets ...\n", pThis->cTargets));
    25442532
     
    25472535        return PDMDEV_SET_ERROR(pDevIns, rc, N_("Failed to allocate memory for target states"));
    25482536
    2549     for (uint32_t iTarget = 0; iTarget < pThis->cTargets; iTarget++)
    2550     {
    2551         PVIRTIOSCSITARGET pTarget = &pThisCC->paTargetInstances[iTarget];
    2552 
    2553         if (RTStrAPrintf(&pTarget->pszTargetName, "VSCSI%u", iTarget) < 0)
     2537    for (uint32_t uTarget = 0; uTarget < pThis->cTargets; uTarget++)
     2538    {
     2539        PVIRTIOSCSITARGET pTarget = &pThisCC->paTargetInstances[uTarget];
     2540
     2541        if (RTStrAPrintf(&pTarget->pszTargetName, "VSCSI%u", uTarget) < 0)
    25542542            AssertLogRelFailedReturn(VERR_NO_MEMORY);
    25552543
    25562544        /* Initialize static parts of the device. */
    25572545        pTarget->pDevIns = pDevIns;
    2558         pTarget->iTarget = iTarget;
     2546        pTarget->uTarget = uTarget;
    25592547        pTarget->led.u32Magic = PDMLED_MAGIC;
    25602548
     
    25722560        pTarget->IMediaExPort.pfnIoReqQueryDiscardRanges = NULL;
    25732561
    2574 
    25752562        pTarget->IBase.pfnQueryInterface                 = virtioScsiR3TargetQueryInterface;
    25762563        pTarget->ILed.pfnQueryStatusLed                  = virtioScsiR3TargetQueryStatusLed;
     
    25792566        LogFunc(("Attaching LUN: %s\n", pTarget->pszTargetName));
    25802567
    2581         AssertReturn(iTarget < pThis->cTargets, VERR_PDM_NO_SUCH_LUN);
    2582         rc = PDMDevHlpDriverAttach(pDevIns, iTarget, &pTarget->IBase, &pTarget->pDrvBase, pTarget->pszTargetName);
     2568        AssertReturn(uTarget < pThis->cTargets, VERR_PDM_NO_SUCH_LUN);
     2569        rc = PDMDevHlpDriverAttach(pDevIns, uTarget, &pTarget->IBase, &pTarget->pDrvBase, pTarget->pszTargetName);
    25832570        if (RT_SUCCESS(rc))
    25842571        {
     
    25872574            pTarget->pDrvMedia = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIA);
    25882575            AssertMsgReturn(VALID_PTR(pTarget->pDrvMedia),
    2589                             ("virtio-scsi configuration error: LUN#%d missing basic media interface!\n", iTarget),
     2576                            ("virtio-scsi configuration error: LUN#%d missing basic media interface!\n", uTarget),
    25902577                            VERR_PDM_MISSING_INTERFACE);
    25912578            /* Get the extended media interface. */
    25922579            pTarget->pDrvMediaEx = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIAEX);
    25932580            AssertMsgReturn(VALID_PTR(pTarget->pDrvMediaEx),
    2594                             ("virtio-scsi configuration error: LUN#%d missing extended media interface!\n", iTarget),
     2581                            ("virtio-scsi configuration error: LUN#%d missing extended media interface!\n", uTarget),
    25952582                            VERR_PDM_MISSING_INTERFACE);
    25962583
    25972584            rc = pTarget->pDrvMediaEx->pfnIoReqAllocSizeSet(pTarget->pDrvMediaEx, sizeof(VIRTIOSCSIREQ));
    25982585            AssertMsgReturn(VALID_PTR(pTarget->pDrvMediaEx),
    2599                             ("virtio-scsi configuration error: LUN#%u: Failed to set I/O request size!\n", iTarget),
     2586                            ("virtio-scsi configuration error: LUN#%u: Failed to set I/O request size!\n", uTarget),
    26002587                            rc);
    2601 /*
    2602             pTarget->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIANOTIFY);
    2603 */
    26042588        }
    26052589        else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     
    26252609    if (RT_FAILURE(rc) && rc != VERR_PDM_NO_ATTACHED_DRIVER)
    26262610        return PDMDEV_SET_ERROR(pDevIns, rc, N_("Failed to attach the status LUN"));
     2611    pThisCC->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pUpBase, PDMIMEDIANOTIFY);
    26272612
    26282613
  • trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp

    r82145 r82151  
    136136                                uint32_t idxDesc, PVIRTQ_DESC_T pDesc)
    137137{
    138     //Log(("%s virtioQueueReadDesc: ring=%p idx=%u\n", INSTANCE(pState), pVirtQ, idx));
    139138    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    140139    uint16_t const cQueueItems = RT_MAX(pVirtio->uQueueSize[idxQueue], 1); /* Make sure to avoid div-by-zero. */
     
    846845
    847846    AssertMsg(uNotifyIdx == idxQueue,
    848               ("Notification param disagreement. Guest kicked virtq %d's notify addr w/non-corresponding virtq idx %d\n",
    849                idxQueue, uNotifyIdx));
    850 
    851 //    AssertMsgReturn(uNotifyIdx == idxQueue,
    852 //                    ("Notification param disagreement. Guest kicked virtq %d's notify addr w/non-corresponding virtq idx %d\n",
    853 //                     idxQueue, uNotifyIdx));
     847                    ("Guest kicked virtq %d's notify addr w/non-corresponding virtq idx %d\n",
     848                     idxQueue, uNotifyIdx));
    854849    RT_NOREF(uNotifyIdx);
    855850
     
    938933
    939934/**
    940  * Lower interrupt. (Called when guest reads ISR)
     935 * Lower interrupt (Called when guest reads ISR and when resetting)
    941936 *
    942937 * @param   pDevIns     The device instance.
     
    960955    pVirtio->uQueueSize[idxQueue] = VIRTQ_MAX_SIZE;
    961956    pVirtio->uQueueNotifyOff[idxQueue] = idxQueue;
    962 
    963957    pVirtio->uQueueMsixVector[idxQueue] = idxQueue + 2;
     958
    964959    if (!pVirtio->fMsiSupport) /* VirtIO 1.0, 4.1.4.3 and 4.1.5.1.2 */
    965960        pVirtio->uQueueMsixVector[idxQueue] = VIRTIO_MSI_NO_VECTOR;
     961
     962    virtioLowerInterrupt(pVirtio->pDevIns, pVirtio->uQueueMsixVector[idxQueue]);
    966963}
    967964
     
    17931790     * Notify capability (VirtIO 1.0 spec, section 4.1.4.4). Note: uLength is based the choice
    17941791     * of this implementation that each queue's uQueueNotifyOff is set equal to (QueueSelect) ordinal
    1795      * value of the queue */
     1792     * value of the queue
     1793     */
    17961794    pCfg = (PVIRTIO_PCI_CAP_T)&pPciDev->abConfig[pCfg->uCapNext];
    17971795    pCfg->uCfgType = VIRTIO_PCI_CAP_NOTIFY_CFG;
     
    18331831     *  by trapping PCI configuration I/O and get modulated by consumers to locate fetch and read/write
    18341832     *  values from any region. NOTE: The linux driver not only doesn't use this feature, it will not
    1835      *  even list it as present if uLength isn't non-zero and 4-byte-aligned as the linux driver is
    1836      *  initializing. */
    1837 
     1833     *  even list it as present if uLength isn't non-zero and also 4-byte-aligned as the linux driver is
     1834     *  initializing.
     1835     */
    18381836    pVirtio->uPciCfgDataOff = pCfg->uCapNext + RT_OFFSETOF(VIRTIO_PCI_CFG_CAP_T, uPciCfgData);
    18391837    pCfg = (PVIRTIO_PCI_CAP_T)&pPciDev->abConfig[pCfg->uCapNext];
     
    18901888        LogFunc(("MSI-X not available for VBox, using INTx notification\n"));
    18911889
    1892 
    18931890    /* Set offset to first capability and enable PCI dev capabilities */
    18941891    PDMPciDevSetCapabilityList(pPciDev, 0x40);
     
    18971894    /* Linux drivers/virtio/virtio_pci_modern.c tries to map at least a page for the
    18981895     * 'unknown' device-specific capability without querying the capability to figure
    1899      *  out size, so pad with an extra page */
    1900 
     1896     *  out size, so pad with an extra page
     1897     */
    19011898    rc = PDMDevHlpPCIIORegionCreateMmio(pDevIns, VIRTIO_REGION_PCI_CAP, RT_ALIGN_32(cbRegion + PAGE_SIZE, PAGE_SIZE),
    19021899                                        PCI_ADDRESS_SPACE_MEM, virtioMmioWrite, virtioMmioRead, pVirtio,
  • trunk/src/VBox/Devices/VirtIO/Virtio_1_0.h

    r82145 r82151  
    450450}
    451451
     452/**
     453 * Calculate the length of a GCPhys s/g buffer by tallying the size of each segment.
     454 *
     455 * @param   pGcSgBuf        GC S/G buffer to calculate length of
     456 */
    452457DECLINLINE(size_t) virtioCoreSgBufCalcTotalLength(PCVIRTIOSGBUF pGcSgBuf)
    453458{
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