- Timestamp:
- Nov 25, 2019 4:14:32 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134961
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r82145 r82151 334 334 | VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY ) 335 335 336 #define SUPPORTED_EVENTS 0 /* TBD */ 337 336 338 /** 337 339 * Worker thread context, shared state. … … 372 374 373 375 /** Target number (PDM LUN) */ 374 uint32_t iTarget;376 uint32_t uTarget; 375 377 376 378 /** Target Description */ … … 391 393 PDMIMEDIAEXPORT IMediaExPort; 392 394 393 PPDMIMEDIANOTIFY pMediaNotify;394 395 395 /** Pointer to the attached driver's extended media interface. */ 396 396 R3PTRTYPE(PPDMIMEDIAEX) pDrvMediaEx; … … 443 443 /** Total number of requests active across all targets */ 444 444 volatile uint32_t cActiveReqs; 445 446 /** Events the guest has subscribed to get notifications of */447 uint32_t fSubscribedEvents;448 445 449 446 /** VirtIO Host SCSI device runtime configuration parameters */ … … 734 731 AssertReturn(paReqSegs, VERR_NO_MEMORY); 735 732 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)); 738 737 739 738 RTSgBufInit(pReqSegBuf, paReqSegs, 1); … … 742 741 virtioCoreQueueSync(pDevIns, &pThis->Virtio, EVENTQ_IDX); 743 742 743 RTMemFree(paReqSegs[0].pvSeg); 744 744 RTMemFree(paReqSegs); 745 745 RTMemFree(pReqSegBuf); … … 793 793 pRespHdr->cbSenseLen = 0; 794 794 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 795 804 RTSgBufInit(pReqSegBuf, paReqSegs, 2); 796 805 … … 801 810 virtioCoreQueueSync(pDevIns, &pThis->Virtio, qIdx); 802 811 803 RTMemFree(pabSenseBuf); 812 for (int i = 0; i < 2; i++) 813 RTMemFree(paReqSegs[i].pvSeg); 814 804 815 RTMemFree(paReqSegs); 805 816 RTMemFree(pReqSegBuf); 817 RTMemFree(pabSenseBuf); 806 818 807 819 if (!ASMAtomicDecU32(&pThis->cActiveReqs) && pThisCC->fQuiescing) … … 951 963 paReqSegs[cSegs++].cbSeg = pReq->cbSenseAlloc; /* VirtIO 1.0 spec 5.6.4/5.6.6.1 */ 952 964 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 953 974 RTSgBufInit(pReqSegBuf, paReqSegs, cSegs); 954 975 … … 961 982 virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, pReq->qIdx, pReqSegBuf, pReq->pDescChain, true /* fFence TBD */); 962 983 virtioCoreQueueSync(pDevIns, &pThis->Virtio, pReq->qIdx); 984 985 for (int i = 0; i < cSegs; i++) 986 RTMemFree(paReqSegs[i].pvSeg); 963 987 964 988 RTMemFree(paReqSegs); … … 1299 1323 { 1300 1324 uint8_t bResponse = VIRTIOSCSI_S_OK; 1301 uint8_t cSegs = 1;1325 uint8_t cSegs = 0; 1302 1326 1303 1327 AssertReturn(pDescChain->cbPhysSend >= RT_MIN(sizeof(VIRTIOSCSI_CTRL_AN_T), … … 1325 1349 || pScsiCtrlUnion->scsiCtrl.uType == VIRTIOSCSI_T_AN_SUBSCRIBE) 1326 1350 && pDescChain->cbPhysSend >= sizeof(VIRTIOSCSI_CTRL_AN_T)), 0); 1327 1328 /*1329 * Mask of events to tell guest driver this device supports1330 * See VirtIO 1.0 specification section 5.6.6.21331 */1332 uint32_t fSubscribedEvents = VIRTIOSCSI_EVT_ASYNC_POWER_MGMT1333 | VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST1334 | VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE1335 | VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY;1336 1351 1337 1352 PRTSGSEG paReqSegs = (PRTSGSEG)RTMemAllocZ(sizeof(RTSGSEG) * 2); … … 1387 1402 RTSGSEG aSegs[] = { { &bResponse, sizeof(bResponse) } }; 1388 1403 memcpy(paReqSegs, aSegs, sizeof(aSegs)); 1389 1404 cSegs = RT_ELEMENTS(aSegs); 1390 1405 break; 1391 1406 } … … 1394 1409 1395 1410 PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnQuery = &pScsiCtrlUnion->scsiCtrlAsyncNotify; 1396 1397 fSubscribedEvents &= pScsiCtrlAnQuery->fEventsRequested;1398 1411 1399 1412 uint8_t uTarget = pScsiCtrlAnQuery->abScsiLun[1]; … … 1417 1430 } 1418 1431 #endif 1419 RTSGSEG aSegs[] = { { &fSubscribedEvents, sizeof(fSubscribedEvents) }, 1432 uint32_t fSupportedEvents = SUPPORTED_EVENTS; 1433 RTSGSEG aSegs[] = { { &fSupportedEvents, sizeof(fSupportedEvents) }, 1420 1434 { &bResponse, sizeof(bResponse) } }; 1421 cSegs = 2;1422 1435 memcpy(paReqSegs, aSegs, sizeof(aSegs)); 1423 1436 cSegs = RT_ELEMENTS(aSegs); 1424 1437 break; 1425 1438 } 1426 1439 case VIRTIOSCSI_T_AN_SUBSCRIBE: /* Guest SCSI driver is subscribing to async event notification(s) */ 1427 1440 { 1428 1429 1441 PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnSubscribe = &pScsiCtrlUnion->scsiCtrlAsyncNotify; 1430 1442 1431 1443 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)); 1436 1446 1437 1447 uint8_t uTarget = pScsiCtrlAnSubscribe->abScsiLun[1]; … … 1455 1465 else 1456 1466 { 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; 1465 1469 } 1466 RTSGSEG aSegs[] = { { &fSubscribedEvents, sizeof(fSubscribedEvents) }, 1470 1471 RTSGSEG aSegs[] = { { &pThis->fAsyncEvtsEnabled, sizeof(pThis->fAsyncEvtsEnabled) }, 1467 1472 { &bResponse, sizeof(bResponse) } }; 1468 cSegs = 2;1469 1473 memcpy(paReqSegs, aSegs, sizeof(aSegs)); 1470 1474 cSegs = RT_ELEMENTS(aSegs); 1471 1475 break; 1472 1476 } … … 1478 1482 RTSGSEG aSegs[] = { { &bResponse, sizeof(bResponse) } }; 1479 1483 memcpy(paReqSegs, aSegs, sizeof(aSegs)); 1480 1484 cSegs = RT_ELEMENTS(aSegs); 1481 1485 } 1482 1486 } … … 1486 1490 AssertReturn(pReqSegBuf, VERR_NO_MEMORY); 1487 1491 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 1488 1501 RTSgBufInit(pReqSegBuf, paReqSegs, cSegs); 1489 1502 1490 1503 virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, qIdx, pReqSegBuf, pDescChain, true); 1491 1504 virtioCoreQueueSync(pDevIns, &pThis->Virtio, qIdx); 1505 1506 for (int i = 0; i < cSegs; i++) 1507 RTMemFree(paReqSegs[i].pvSeg); 1492 1508 1493 1509 RTMemFree(paReqSegs); … … 1596 1612 } 1597 1613 1614 1598 1615 #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 */ 1618 DECLINLINE(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 1626 DECLINLINE(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 1631 DECLINLINE(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 1639 DECLINLINE(void) virtioScsiR3ReportTargetRemoved(PDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget) 1604 1640 { 1605 1641 if (pThis->fHasHotplug) … … 1607 1643 } 1608 1644 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) 1645 DECLINLINE(void) virtioScsiR3ReportTargetAdded(PDMDEVINS pDevInsPVIRTIOSCSI pThis, uint16_t uTarget) 1613 1646 { 1614 1647 if (pThis->fHasHotplug) 1615 1648 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 1665 1649 } 1666 1650 … … 1758 1742 return VERR_PDM_LUN_NOT_FOUND; 1759 1743 } 1760 1761 1744 /** 1762 1745 * @interface_method_impl{PDMILEDPORTS,pfnQueryStatusLed, Device level.} … … 1795 1778 *ppcszController = pDevIns->pReg->szName; 1796 1779 *piInstance = pDevIns->iInstance; 1797 *piLUN = pTarget-> iTarget;1780 *piLUN = pTarget->uTarget; 1798 1781 1799 1782 return VINF_SUCCESS; … … 1861 1844 AssertReturn(pv && cb <= sizeof(uint32_t), fWrite ? VINF_SUCCESS : VINF_IOM_MMIO_UNUSED_00); 1862 1845 1863 if (MATCH_SCSI_CONFIG( 1846 if (MATCH_SCSI_CONFIG(uNumQueues)) 1864 1847 SCSI_CONFIG_ACCESSOR_READONLY(uNumQueues); 1865 else if (MATCH_SCSI_CONFIG( uSegMax)) 1848 else 1849 if (MATCH_SCSI_CONFIG(uSegMax)) 1866 1850 SCSI_CONFIG_ACCESSOR_READONLY(uSegMax); 1867 else if (MATCH_SCSI_CONFIG( uMaxSectors)) 1851 else 1852 if (MATCH_SCSI_CONFIG(uMaxSectors)) 1868 1853 SCSI_CONFIG_ACCESSOR_READONLY(uMaxSectors); 1869 else if (MATCH_SCSI_CONFIG( uCmdPerLun)) 1854 else 1855 if (MATCH_SCSI_CONFIG(uCmdPerLun)) 1870 1856 SCSI_CONFIG_ACCESSOR_READONLY(uCmdPerLun); 1871 else if (MATCH_SCSI_CONFIG( uEventInfoSize)) 1857 else 1858 if (MATCH_SCSI_CONFIG(uEventInfoSize)) 1872 1859 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)) 1878 1868 SCSI_CONFIG_ACCESSOR_READONLY(uMaxChannel); 1879 else if (MATCH_SCSI_CONFIG( uMaxTarget)) 1869 else 1870 if (MATCH_SCSI_CONFIG(uMaxTarget)) 1880 1871 SCSI_CONFIG_ACCESSOR_READONLY(uMaxTarget); 1881 else if (MATCH_SCSI_CONFIG( uMaxLun)) 1872 else 1873 if (MATCH_SCSI_CONFIG(uMaxLun)) 1882 1874 SCSI_CONFIG_ACCESSOR_READONLY(uMaxLun); 1883 1875 else … … 2143 2135 * The VM is suspended at this point. 2144 2136 */ 2145 static DECLCALLBACK(void) virtioScsiR3Detach(PPDMDEVINS pDevIns, unsigned iTarget, uint32_t fFlags)2137 static DECLCALLBACK(void) virtioScsiR3Detach(PPDMDEVINS pDevIns, unsigned uTarget, uint32_t fFlags) 2146 2138 { 2147 2139 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 2148 2140 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]; 2151 2143 2152 2144 LogFunc(("")); … … 2163 2155 pTarget->pDrvMedia = NULL; 2164 2156 pTarget->pDrvMediaEx = NULL; 2165 pTarget->pMediaNotify = NULL;2166 2157 } 2167 2158 … … 2171 2162 * This is called when we change block driver. 2172 2163 */ 2173 static DECLCALLBACK(int) virtioScsiR3Attach(PPDMDEVINS pDevIns, unsigned iTarget, uint32_t fFlags)2164 static DECLCALLBACK(int) virtioScsiR3Attach(PPDMDEVINS pDevIns, unsigned uTarget, uint32_t fFlags) 2174 2165 { 2175 2166 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 2176 2167 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]; 2179 2170 2180 2171 Assert(pTarget->pDevIns == pDevIns); … … 2183 2174 VERR_INVALID_PARAMETER); 2184 2175 2185 /* the usual paranoia */2186 2176 AssertRelease(!pTarget->pDrvBase); 2187 Assert(pTarget-> iTarget == iTarget);2177 Assert(pTarget->uTarget == uTarget); 2188 2178 2189 2179 /* 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. 2192 2181 */ 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); 2194 2183 if (RT_SUCCESS(rc)) 2195 2184 { … … 2197 2186 pTarget->pDrvMedia = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIA); 2198 2187 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), 2200 2189 VERR_PDM_MISSING_INTERFACE); 2201 2190 … … 2203 2192 pTarget->pDrvMediaEx = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIAEX); 2204 2193 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), 2206 2195 VERR_PDM_MISSING_INTERFACE); 2207 2196 2208 2197 rc = pTarget->pDrvMediaEx->pfnIoReqAllocSizeSet(pTarget->pDrvMediaEx, sizeof(VIRTIOSCSIREQ)); 2209 2198 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), 2211 2200 rc); 2212 /*2213 pTarget->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIANOTIFY);2214 */2215 2216 2201 } 2217 2202 else … … 2224 2209 pTarget->pDrvMedia = NULL; 2225 2210 pTarget->pDrvMediaEx = NULL; 2226 pT arget->pMediaNotify = NULL;2211 pThisCC->pMediaNotify = NULL; 2227 2212 } 2228 2213 return rc; … … 2362 2347 PVIRTIOSCSICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIOSCSICC); 2363 2348 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 2365 2353 if (pThisCC->pMediaNotify) 2366 2354 { 2367 2355 int rc = VMR3ReqCallNoWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY, 2368 2356 (PFNRT)pThisCC->pMediaNotify->pfnEjected, 2, 2369 pThisCC->pMediaNotify, pTarget-> iTarget);2357 pThisCC->pMediaNotify, pTarget->uTarget); 2370 2358 AssertRC(rc); 2371 2359 } … … 2412 2400 RTMemFree(pThisCC->paTargetInstances); 2413 2401 pThisCC->paTargetInstances = NULL; 2402 pThisCC->pMediaNotify = NULL; 2414 2403 2415 2404 for (unsigned qIdx = 0; qIdx < VIRTIOSCSI_QUEUE_CNT; qIdx++) … … 2540 2529 * Initialize per device instances (targets). 2541 2530 */ 2542 2543 2531 Log2Func(("Probing %d targets ...\n", pThis->cTargets)); 2544 2532 … … 2547 2535 return PDMDEV_SET_ERROR(pDevIns, rc, N_("Failed to allocate memory for target states")); 2548 2536 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) 2554 2542 AssertLogRelFailedReturn(VERR_NO_MEMORY); 2555 2543 2556 2544 /* Initialize static parts of the device. */ 2557 2545 pTarget->pDevIns = pDevIns; 2558 pTarget-> iTarget = iTarget;2546 pTarget->uTarget = uTarget; 2559 2547 pTarget->led.u32Magic = PDMLED_MAGIC; 2560 2548 … … 2572 2560 pTarget->IMediaExPort.pfnIoReqQueryDiscardRanges = NULL; 2573 2561 2574 2575 2562 pTarget->IBase.pfnQueryInterface = virtioScsiR3TargetQueryInterface; 2576 2563 pTarget->ILed.pfnQueryStatusLed = virtioScsiR3TargetQueryStatusLed; … … 2579 2566 LogFunc(("Attaching LUN: %s\n", pTarget->pszTargetName)); 2580 2567 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); 2583 2570 if (RT_SUCCESS(rc)) 2584 2571 { … … 2587 2574 pTarget->pDrvMedia = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIA); 2588 2575 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), 2590 2577 VERR_PDM_MISSING_INTERFACE); 2591 2578 /* Get the extended media interface. */ 2592 2579 pTarget->pDrvMediaEx = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIAEX); 2593 2580 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), 2595 2582 VERR_PDM_MISSING_INTERFACE); 2596 2583 2597 2584 rc = pTarget->pDrvMediaEx->pfnIoReqAllocSizeSet(pTarget->pDrvMediaEx, sizeof(VIRTIOSCSIREQ)); 2598 2585 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), 2600 2587 rc); 2601 /*2602 pTarget->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pTarget->pDrvBase, PDMIMEDIANOTIFY);2603 */2604 2588 } 2605 2589 else if (rc == VERR_PDM_NO_ATTACHED_DRIVER) … … 2625 2609 if (RT_FAILURE(rc) && rc != VERR_PDM_NO_ATTACHED_DRIVER) 2626 2610 return PDMDEV_SET_ERROR(pDevIns, rc, N_("Failed to attach the status LUN")); 2611 pThisCC->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pUpBase, PDMIMEDIANOTIFY); 2627 2612 2628 2613 -
trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp
r82145 r82151 136 136 uint32_t idxDesc, PVIRTQ_DESC_T pDesc) 137 137 { 138 //Log(("%s virtioQueueReadDesc: ring=%p idx=%u\n", INSTANCE(pState), pVirtQ, idx));139 138 AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n")); 140 139 uint16_t const cQueueItems = RT_MAX(pVirtio->uQueueSize[idxQueue], 1); /* Make sure to avoid div-by-zero. */ … … 846 845 847 846 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)); 854 849 RT_NOREF(uNotifyIdx); 855 850 … … 938 933 939 934 /** 940 * Lower interrupt . (Called when guest reads ISR)935 * Lower interrupt (Called when guest reads ISR and when resetting) 941 936 * 942 937 * @param pDevIns The device instance. … … 960 955 pVirtio->uQueueSize[idxQueue] = VIRTQ_MAX_SIZE; 961 956 pVirtio->uQueueNotifyOff[idxQueue] = idxQueue; 962 963 957 pVirtio->uQueueMsixVector[idxQueue] = idxQueue + 2; 958 964 959 if (!pVirtio->fMsiSupport) /* VirtIO 1.0, 4.1.4.3 and 4.1.5.1.2 */ 965 960 pVirtio->uQueueMsixVector[idxQueue] = VIRTIO_MSI_NO_VECTOR; 961 962 virtioLowerInterrupt(pVirtio->pDevIns, pVirtio->uQueueMsixVector[idxQueue]); 966 963 } 967 964 … … 1793 1790 * Notify capability (VirtIO 1.0 spec, section 4.1.4.4). Note: uLength is based the choice 1794 1791 * 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 */ 1796 1794 pCfg = (PVIRTIO_PCI_CAP_T)&pPciDev->abConfig[pCfg->uCapNext]; 1797 1795 pCfg->uCfgType = VIRTIO_PCI_CAP_NOTIFY_CFG; … … 1833 1831 * by trapping PCI configuration I/O and get modulated by consumers to locate fetch and read/write 1834 1832 * 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 is1836 * 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 */ 1838 1836 pVirtio->uPciCfgDataOff = pCfg->uCapNext + RT_OFFSETOF(VIRTIO_PCI_CFG_CAP_T, uPciCfgData); 1839 1837 pCfg = (PVIRTIO_PCI_CAP_T)&pPciDev->abConfig[pCfg->uCapNext]; … … 1890 1888 LogFunc(("MSI-X not available for VBox, using INTx notification\n")); 1891 1889 1892 1893 1890 /* Set offset to first capability and enable PCI dev capabilities */ 1894 1891 PDMPciDevSetCapabilityList(pPciDev, 0x40); … … 1897 1894 /* Linux drivers/virtio/virtio_pci_modern.c tries to map at least a page for the 1898 1895 * '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 */ 1901 1898 rc = PDMDevHlpPCIIORegionCreateMmio(pDevIns, VIRTIO_REGION_PCI_CAP, RT_ALIGN_32(cbRegion + PAGE_SIZE, PAGE_SIZE), 1902 1899 PCI_ADDRESS_SPACE_MEM, virtioMmioWrite, virtioMmioRead, pVirtio, -
trunk/src/VBox/Devices/VirtIO/Virtio_1_0.h
r82145 r82151 450 450 } 451 451 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 */ 452 457 DECLINLINE(size_t) virtioCoreSgBufCalcTotalLength(PCVIRTIOSGBUF pGcSgBuf) 453 458 {
Note:
See TracChangeset
for help on using the changeset viewer.