Changeset 81658 in vbox for trunk/src/VBox/Devices/Storage
- Timestamp:
- Nov 4, 2019 8:31:12 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134418
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r81645 r81658 56 56 57 57 58 /********************************************************************************************************************************* 59 * Defined Constants And Macros * 60 *********************************************************************************************************************************/ 61 /** The current saved state version. */ 62 #define VIRTIOSCSI_SAVED_STATE_VERSION UINT32_C(1) 63 64 58 65 #define LUN0 0 59 66 /** @name VirtIO 1.0 SCSI Host feature bits (See VirtIO 1.0 specification, Section 5.6.3) … … 113 120 ((pMediaExTxDirEnumValue) == PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE) 114 121 122 123 /********************************************************************************************************************************* 124 * Structures and Typedefs * 125 *********************************************************************************************************************************/ 115 126 /** 116 127 * VirtIO SCSI Host Device device-specific configuration (see VirtIO 1.0, section 5.6.4) … … 390 401 typedef struct VIRTIOSCSI 391 402 { 392 /* Opaque handle to VirtIO common framework (must be first item 393 * in this struct so PDMDEVINS_2_DATA macro's casting works) */ 394 VIRTIOHANDLE hVirtio; 403 /** The virtio state. */ 404 VIRTIOSTATE Virtio; 395 405 396 406 /** Number of targets detected */ … … 645 655 } 646 656 647 if (virtioQueueIsEmpty( pThis->hVirtio, EVENTQ_IDX))657 if (virtioQueueIsEmpty(&pThis->Virtio, EVENTQ_IDX)) 648 658 { 649 659 LogFunc(("eventq is empty, events missed (driver didn't preload queue)!\n")); … … 653 663 654 664 PVIRTIO_DESC_CHAIN_T pDescChain; 655 virtioQueueGet( pThis->hVirtio, EVENTQ_IDX, &pDescChain, true);665 virtioQueueGet(&pThis->Virtio, EVENTQ_IDX, &pDescChain, true); 656 666 657 667 RTSGBUF reqSegBuf; … … 659 669 RTSgBufInit(&reqSegBuf, aReqSegs, RT_ELEMENTS(aReqSegs)); 660 670 661 virtioQueuePut( pThis->hVirtio, EVENTQ_IDX, &reqSegBuf, pDescChain, true);662 virtioQueueSync( pThis->hVirtio, EVENTQ_IDX);671 virtioQueuePut( &pThis->Virtio, EVENTQ_IDX, &reqSegBuf, pDescChain, true); 672 virtioQueueSync(&pThis->Virtio, EVENTQ_IDX); 663 673 664 674 return VINF_SUCCESS; … … 709 719 pRespHdr->uResponse = VIRTIOSCSI_S_RESET; 710 720 711 virtioQueuePut( pThis->hVirtio, qIdx, &reqSegBuf, pDescChain, true /* fFence */);712 virtioQueueSync( pThis->hVirtio, qIdx);721 virtioQueuePut(&pThis->Virtio, qIdx, &reqSegBuf, pDescChain, true /* fFence */); 722 virtioQueueSync(&pThis->Virtio, qIdx); 713 723 714 724 RTMemFree(pabSenseBuf); … … 865 875 866 876 867 virtioQueuePut( pThis->hVirtio, pReq->qIdx, &reqSegBuf, pReq->pDescChain, true /* fFence TBD */);868 virtioQueueSync( pThis->hVirtio, pReq->qIdx);877 virtioQueuePut(&pThis->Virtio, pReq->qIdx, &reqSegBuf, pReq->pDescChain, true /* fFence TBD */); 878 virtioQueueSync(&pThis->Virtio, pReq->qIdx); 869 879 870 880 … … 1407 1417 1408 1418 LogFunc(("Response code: %s\n", virtioGetReqRespText(bResponse))); 1409 virtioQueuePut( pThis->hVirtio, qIdx, &reqSegBuf, pDescChain, true);1410 virtioQueueSync( pThis->hVirtio, qIdx);1419 virtioQueuePut( &pThis->Virtio, qIdx, &reqSegBuf, pDescChain, true); 1420 virtioQueueSync(&pThis->Virtio, qIdx); 1411 1421 1412 1422 return VINF_SUCCESS; … … 1438 1448 while (pThread->enmState == PDMTHREADSTATE_RUNNING) 1439 1449 { 1440 if (virtioQueueIsEmpty( pThis->hVirtio, qIdx))1450 if (virtioQueueIsEmpty(&pThis->Virtio, qIdx)) 1441 1451 { 1442 1452 /* Atomic interlocks avoid missing alarm while going to sleep & notifier waking the awoken */ … … 1466 1476 Log6Func(("fetching next descriptor chain from %s\n", QUEUENAME(qIdx))); 1467 1477 PVIRTIO_DESC_CHAIN_T pDescChain; 1468 int rc = virtioQueueGet( pThis->hVirtio, qIdx, &pDescChain, true);1478 int rc = virtioQueueGet(&pThis->Virtio, qIdx, &pDescChain, true); 1469 1479 if (rc == VERR_NOT_AVAILABLE) 1470 1480 { … … 1572 1582 * @callback_method_impl{FNVIRTIOQUEUENOTIFIED} 1573 1583 */ 1574 static DECLCALLBACK(void) virtioScsiR3Notified(VIRTIOHANDLE hVirtio, void *pClient, uint16_t qIdx) 1575 { 1576 RT_NOREF(hVirtio); 1577 1584 static DECLCALLBACK(void) virtioScsiR3Notified(PVIRTIOSTATE pVirtio, uint16_t qIdx) 1585 { 1578 1586 AssertReturnVoid(qIdx < VIRTIOSCSI_QUEUE_CNT); 1579 PVIRTIOSCSI pThis = (PVIRTIOSCSI)pClient;1587 PVIRTIOSCSI pThis = RT_FROM_MEMBER(pVirtio, VIRTIOSCSI, Virtio); 1580 1588 PVIRTIOSCSIWORKER pWorker = &pThis->aWorkers[qIdx]; 1581 1589 … … 1609 1617 * @callback_method_impl{FNVIRTIOSTATUSCHANGED} 1610 1618 */ 1611 static DECLCALLBACK(void) virtioScsiR3StatusChanged(VIRTIOHANDLE hVirtio, void *pClient, uint32_t fVirtioReady) 1612 { 1613 RT_NOREF(hVirtio); 1614 PVIRTIOSCSI pThis = (PVIRTIOSCSI)pClient; 1619 static DECLCALLBACK(void) virtioScsiR3StatusChanged(PVIRTIOSTATE pVirtio, uint32_t fVirtioReady) 1620 { 1621 PVIRTIOSCSI pThis = RT_FROM_MEMBER(pVirtio, VIRTIOSCSI, Virtio); 1615 1622 1616 1623 pThis->fVirtioReady = fVirtioReady; … … 1619 1626 { 1620 1627 LogFunc(("VirtIO ready\n-----------------------------------------------------------------------------------------\n")); 1621 uint64_t f eatures = virtioGetNegotiatedFeatures(hVirtio);1622 pThis->fHasT10pi = f eatures & VIRTIO_SCSI_F_T10_PI;1623 pThis->fHasHotplug = f eatures & VIRTIO_SCSI_F_HOTPLUG;1624 pThis->fHasInOutBufs = f eatures & VIRTIO_SCSI_F_INOUT;1625 pThis->fHasLunChange = f eatures & VIRTIO_SCSI_F_CHANGE;1628 uint64_t fFeatures = virtioGetNegotiatedFeatures(&pThis->Virtio); 1629 pThis->fHasT10pi = fFeatures & VIRTIO_SCSI_F_T10_PI; 1630 pThis->fHasHotplug = fFeatures & VIRTIO_SCSI_F_HOTPLUG; 1631 pThis->fHasInOutBufs = fFeatures & VIRTIO_SCSI_F_INOUT; 1632 pThis->fHasLunChange = fFeatures & VIRTIO_SCSI_F_CHANGE; 1626 1633 pThis->fQuiescing = false; 1627 1634 pThis->fResetting = false; … … 1896 1903 1897 1904 /** 1898 * @callback_method_impl{FNSSMDEVLIVEEXEC} 1899 */ 1900 static DECLCALLBACK(int) virtioScsiR3LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) 1901 { 1902 LogFunc(("LIVE EXEC!!\n")); 1905 * @callback_method_impl{FNSSMDEVLOADEXEC} 1906 */ 1907 static DECLCALLBACK(int) virtioScsiR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 1908 { 1903 1909 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1904 RT_NOREF(pThis);1905 RT_NOREF(uPass);1906 RT_NOREF(pSSM);1907 return VINF_SSM_DONT_CALL_AGAIN;1908 }1909 1910 /**1911 * @callback_method_impl{FNSSMDEVLOADEXEC}1912 */1913 static DECLCALLBACK(int) virtioScsiR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)1914 {1915 1910 LogFunc(("LOAD EXEC!!\n")); 1916 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1911 1912 AssertReturn(uPass == SSM_PASS_FINAL, VERR_SSM_UNEXPECTED_PASS); 1913 AssertLogRelMsgReturn(uVersion == VIRTIOSCSI_SAVED_STATE_VERSION, 1914 ("uVersion=%u\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION); 1915 1917 1916 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uNumQueues); 1918 1917 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uSegMax); … … 1934 1933 SSMR3GetU32(pSSM, &pThis->fHasLunChange); 1935 1934 SSMR3GetU32(pSSM, &pThis->fResetting); 1936 SSMR3GetU32(pSSM, &pThis->fQuiescing); 1937 RT_NOREF(uPass); 1938 RT_NOREF(uVersion); 1939 return VINF_SUCCESS; 1935 int rc = SSMR3GetU32(pSSM, &pThis->fQuiescing); 1936 AssertRCReturn(rc, rc); 1937 1938 /* 1939 * Call the virtio core to let it load its state. 1940 */ 1941 return virtioR3LoadExec(&pThis->Virtio, pDevIns->pHlpR3, pSSM); 1940 1942 } 1941 1943 … … 1945 1947 static DECLCALLBACK(int) virtioScsiR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1946 1948 { 1949 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1947 1950 LogFunc(("SAVE EXEC!!\n")); 1948 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);1949 1951 1950 1952 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uNumQueues); … … 1972 1974 SSMR3PutU32(pSSM, pThis->fQuiescing); /** @todo r=bird: This shall always be false, as the VM is suspended when saving, so no need to save this */ 1973 1975 1974 return VINF_SUCCESS; 1975 } 1976 1977 /** 1978 * @callback_method_impl{FNSSMDEVLOADDONE} 1979 */ 1980 static DECLCALLBACK(int) virtioScsiR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1981 { 1982 LogFunc(("callback")); 1983 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1984 RT_NOREF(pThis); 1985 RT_NOREF(pSSM); 1986 return VINF_SUCCESS; 1976 /* 1977 * Call the virtio core to let it save its state. 1978 */ 1979 return virtioR3SaveExec(&pThis->Virtio, pDevIns->pHlpR3, pSSM); 1987 1980 } 1988 1981 … … 2116 2109 2117 2110 /* Ensure guest is working the queues too. */ 2118 virtioPropagateResumeNotification( pThis->hVirtio);2111 virtioPropagateResumeNotification(&pThis->Virtio); 2119 2112 } 2120 2113 … … 2260 2253 pThis->virtioScsiConfig.uMaxLun = VIRTIOSCSI_MAX_LUN; 2261 2254 2262 rc = virtioConstruct(pDevIns, pThis, &pThis->hVirtio, pVirtioPciParams, pThis->szInstance, 2263 VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED, 2264 virtioScsiR3DevCapRead, 2265 virtioScsiR3DevCapWrite, 2266 virtioScsiR3StatusChanged, 2267 virtioScsiR3Notified, 2268 virtioScsiR3LiveExec, 2269 virtioScsiR3SaveExec, 2270 virtioScsiR3LoadExec, 2271 virtioScsiR3LoadDone, 2272 sizeof(VIRTIOSCSI_CONFIG_T) /* cbDevSpecificCap */, 2273 (void *)&pThis->virtioScsiConfig /* pDevSpecificCap */); 2255 /* Initialize the generic Virtio core: */ 2256 pThis->Virtio.Callbacks.pfnStatusChanged = virtioScsiR3StatusChanged; 2257 pThis->Virtio.Callbacks.pfnQueueNotified = virtioScsiR3Notified; 2258 pThis->Virtio.Callbacks.pfnDevCapRead = virtioScsiR3DevCapRead; 2259 pThis->Virtio.Callbacks.pfnDevCapWrite = virtioScsiR3DevCapWrite; 2260 2261 rc = virtioR3Init(&pThis->Virtio, pDevIns, pVirtioPciParams, pThis->szInstance, VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED, 2262 &pThis->virtioScsiConfig /*pvDevSpecificCap*/, sizeof(pThis->virtioScsiConfig)); 2274 2263 2275 2264 if (RT_FAILURE(rc)) … … 2284 2273 for (uint16_t qIdx = 0; qIdx < VIRTIOSCSI_QUEUE_CNT; qIdx++) 2285 2274 { 2286 rc = virtioQueueAttach( pThis->hVirtio, qIdx, QUEUENAME(qIdx));2275 rc = virtioQueueAttach(&pThis->Virtio, qIdx, QUEUENAME(qIdx)); 2287 2276 pThis->afQueueAttached[qIdx] = (rc == VINF_SUCCESS); 2288 2277 … … 2394 2383 return PDMDEV_SET_ERROR(pDevIns, rc, N_("Failed to attach the status LUN")); 2395 2384 2385 2396 2386 /* 2397 * Register the debugger info callback. 2387 * Register saved state. 2388 */ 2389 rc = PDMDevHlpSSMRegister(pDevIns, VIRTIOSCSI_SAVED_STATE_VERSION, sizeof(*pThis), 2390 virtioScsiR3SaveExec, virtioScsiR3LoadExec); 2391 AssertRCReturn(rc, rc); 2392 2393 /* 2394 * Register the debugger info callback (ignore errors). 2398 2395 */ 2399 2396 char szTmp[128];
Note:
See TracChangeset
for help on using the changeset viewer.