- Timestamp:
- Nov 2, 2019 7:40:09 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134385
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r81591 r81628 33 33 #include <iprt/assert.h> 34 34 #include <iprt/string.h> 35 #include <VBox/sup.h> 35 36 #include "../build/VBoxDD.h" 36 37 #include <VBox/scsi.h> … … 76 77 VIRTIOSCSI_HOST_SCSI_FEATURES_NONE 77 78 78 /* 79 * TEMPORARY NOTE: following parameter is set to 1 for early development. Will be increased later 80 */ 81 //#define VIRTIOSCSI_REQ_QUEUE_CNT 2 /**< Number of req queues exposed by dev. */ 82 //#define VIRTIOSCSI_QUEUE_CNT VIRTIOSCSI_REQ_QUEUE_CNT + 2 83 //#define VIRTIOSCSI_MAX_LUN 256 /* < VirtIO specification, section 5.6.4 */ 84 //#define VIRTIOSCSI_MAX_COMMANDS_PER_LUN 1 /* < T.B.D. What is a good value for this? */ 85 //#define VIRTIOSCSI_MAX_SEG_COUNT 1024 /* < T.B.D. What is a good value for this? */ 86 //#define VIRTIOSCSI_MAX_SECTORS_HINT 0x10000 /* < VirtIO specification, section 5.6.4 */ 87 //#define VIRTIOSCSI_MAX_CHANNEL_HINT 0 /* < VirtIO specification, section 5.6.4 should be 0 */ 88 //#define VIRTIOSCSI_SAVED_STATE_MINOR_VERSION 0x01 /**< SSM version # */ 89 90 91 #define VIRTIOSCSI_REQ_QUEUE_CNT 1 /**< Number of req queues exposed by dev. */ 79 #define VIRTIOSCSI_REQ_QUEUE_CNT 1 /**< T.B.D. Consider increasing */ 92 80 #define VIRTIOSCSI_QUEUE_CNT VIRTIOSCSI_REQ_QUEUE_CNT + 2 93 81 #define VIRTIOSCSI_MAX_LUN 256 /* < VirtIO specification, section 5.6.4 */ 94 #define VIRTIOSCSI_MAX_COMMANDS_PER_LUN 128 95 #define VIRTIOSCSI_MAX_SEG_COUNT 126 /* < T.B.D. What is a good value for this? */82 #define VIRTIOSCSI_MAX_COMMANDS_PER_LUN 128 /* < T.B.D. What is a good value for this? */ 83 #define VIRTIOSCSI_MAX_SEG_COUNT 126 /* < T.B.D. What is a good value for this? */ 96 84 #define VIRTIOSCSI_MAX_SECTORS_HINT 0x10000 /* < VirtIO specification, section 5.6.4 */ 97 85 #define VIRTIOSCSI_MAX_CHANNEL_HINT 0 /* < VirtIO specification, section 5.6.4 should be 0 */ … … 111 99 112 100 /** 113 * VirtIO SCSI Host Device device-specific queue indicies 114 * 115 * Virtqs (and their indices) are specified for a SCSI Host Device as described in the VirtIO 1.0 specification 116 * section 5.6. Thus there is no need to explicitly indicate the number of queues needed by this device. The number 117 * of req queues is variable and determined by virtio_scsi_config.num_queues. See VirtIO 1.0 spec section 5.6.4 101 * VirtIO SCSI Host Device device-specific queue indicies. 102 * (Note: # of request queues is determined by virtio_scsi_config.num_queues. VirtIO 1.0, 5.6.4) 118 103 */ 119 104 #define CONTROLQ_IDX 0 /**< Spec-defined Index of control queue */ … … 124 109 #define CBQUEUENAME(qIdx) RTStrNLen(QUEUENAME(qIdx), sizeof(QUEUENAME(qIdx))) 125 110 126 127 111 #define IS_REQ_QUEUE(qIdx) (qIdx >= VIRTQ_REQ_BASE && qIdx < VIRTIOSCSI_QUEUE_CNT) 128 112 … … 130 114 * Resolves to boolean true if uOffset matches a field offset and size exactly, 131 115 * (or if 64-bit field, if it accesses either 32-bit part as a 32-bit access) 132 * It is *assumed* this critereon is mandated by section 4.1.3.1 of the VirtIO 1.0 spec)133 * This macro can be re-written to allow unaligned access to a field (within bounds).116 * Assumption is this critereon is mandated by VirtIO 1.0, Section 4.1.3.1) 117 * (Easily re-written to allow unaligned bounded access to a field). 134 118 * 135 119 * @param member - Member of VIRTIO_PCI_COMMON_CFG_T … … 178 162 pMediaExTxDirEnumValue == PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE 179 163 /** 180 * The following struct is the VirtIO SCSI Host Device device-specific configuration described 181 * in section 5.6.4 of the VirtIO 1.0 spec. The VBox VirtIO framework calls back to this driver 182 * to handle MMIO accesses to the device-specific configuration parameters whenever any bytes in the 183 * device-specific region areaccessed, since which the generic portion shouldn't know anything about 184 * the device-specific VirtIO cfg data. 164 * VirtIO SCSI Host Device device-specific configuration (see VirtIO 1.0, section 5.6.4) 165 * VBox VirtIO framework issues callback to this client (device) to handle MMIO accesses 166 * to the device-specific configuration parameters. 185 167 */ 186 168 typedef struct virtio_scsi_config … … 510 492 511 493 /** Set if events missed due to lack of bufs avail on eventq */ 512 bool 494 bool fEventsMissed; 513 495 514 496 /** VirtIO Host SCSI device runtime configuration parameters */ … … 516 498 517 499 /** True if the guest/driver and VirtIO framework are in the ready state */ 518 u nsignedfVirtioReady;500 uint32_t fVirtioReady; 519 501 520 502 /** True if VIRTIO_SCSI_F_T10_PI was negotiated */ 521 u nsignedfHasT10pi;503 uint32_t fHasT10pi; 522 504 523 505 /** True if VIRTIO_SCSI_F_T10_PI was negotiated */ 524 u nsignedfHasHotplug;506 uint32_t fHasHotplug; 525 507 526 508 /** True if VIRTIO_SCSI_F_T10_PI was negotiated */ 527 u nsignedfHasInOutBufs;509 uint32_t fHasInOutBufs; 528 510 529 511 /** True if VIRTIO_SCSI_F_T10_PI was negotiated */ 530 u nsignedfHasLunChange;512 uint32_t fHasLunChange; 531 513 532 514 /** True if in the process of resetting */ 533 u nsignedfResetting;515 uint32_t fResetting; 534 516 535 517 /** True if in the process of quiescing I/O */ 536 u nsignedfQuiescing;518 uint32_t fQuiescing; 537 519 538 520 } VIRTIOSCSI, *PVIRTIOSCSI; … … 591 573 switch (vboxRc) 592 574 { 593 case VIRTIOSCSI_S_OK: return "OK ";575 case VIRTIOSCSI_S_OK: return "OK/COMPLETE"; 594 576 case VIRTIOSCSI_S_OVERRUN: return "OVERRRUN"; 595 577 case VIRTIOSCSI_S_ABORTED: return "ABORTED"; … … 600 582 case VIRTIOSCSI_S_NEXUS_FAILURE: return "NEXUS FAILURE"; 601 583 case VIRTIOSCSI_S_BUSY: return "BUSY"; 602 case VIRTIOSCSI_S_FAILURE: return "FAILURE";603 default: return "<unknown>";604 }605 }606 607 DECLINLINE(const char *) virtioGetCtrlRespText(uint32_t vboxRc)608 {609 switch (vboxRc)610 {611 case VIRTIOSCSI_S_OK: return "OK/COMPLETE";612 case VIRTIOSCSI_S_BAD_TARGET: return "BAD TARGET";613 case VIRTIOSCSI_S_BUSY: return "BUSY";614 case VIRTIOSCSI_S_NEXUS_FAILURE: return "NEXUS FAILURE";615 case VIRTIOSCSI_S_TRANSPORT_FAILURE: return "TRANSPORT FAILURE";616 case VIRTIOSCSI_S_TARGET_FAILURE: return "TARGET FAILURE";617 584 case VIRTIOSCSI_S_FAILURE: return "FAILURE"; 618 585 case VIRTIOSCSI_S_INCORRECT_LUN: return "INCORRECT LUN"; … … 651 618 652 619 typedef struct VIRTIOSCSIREQ *PVIRTIOSCSIREQ; 653 654 #ifdef BOOTABLE_SUPPORT_TBD655 /** @callback_method_impl{FNIOMIOPORTIN} */656 static DECLCALLBACK(int) virtioScsiBiosIoPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint8_t *pbDst,657 uint32_t *pcTransfers, unsigned cb);658 {659 }660 /** @callback_method_impl{FNIOMIOPORTOUT} */661 static DECLCALLBACK(int) virtioScsiBiosIoPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t u32, unsigned cb);662 {663 }664 /** @callback_method_impl{FNIOMIOPORTOUTSTRING} */665 static DECLCALLBACK(int) virtioScsiBiosIoPortWriteStr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, const uint8_t *pbSrc,666 uint32_t *pcTransfers, unsigned cb);667 {668 }669 /** @callback_method_impl{FNIOMIOPORTINSTRING} */670 static DECLCALLBACK(int) virtioScsiBiosIoPortReadStr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint8_t *pbDst,671 uint32_t *pcTransfers, unsigned cb);672 {673 }674 #endif675 620 676 621 static int virtioScsiSendEvent(PVIRTIOSCSI pThis, uint16_t uTarget, uint32_t uEventType, uint32_t uReason) … … 768 713 AssertReturn(abSenseBuf, VERR_NO_MEMORY); 769 714 770 const char *pszCtrlRespText = virtioGet CtrlRespText(pRespHdr->uResponse);715 const char *pszCtrlRespText = virtioGetReqRespText(pRespHdr->uResponse); 771 716 Log2Func((" status: %s response: %s\n", 772 717 SCSIStatusText(pRespHdr->uStatus), pszCtrlRespText)); … … 803 748 } 804 749 750 static void virtioSenseKeyToVirtioResp(struct REQ_RESP_HDR *respHdr, uint8_t uSenseKey) 751 { 752 switch (uSenseKey) 753 { 754 case SCSI_SENSE_ABORTED_COMMAND: 755 respHdr->uResponse = VIRTIOSCSI_S_ABORTED; 756 break; 757 case SCSI_SENSE_COPY_ABORTED: 758 respHdr->uResponse = VIRTIOSCSI_S_ABORTED; 759 break; 760 case SCSI_SENSE_UNIT_ATTENTION: 761 respHdr->uResponse = VIRTIOSCSI_S_TARGET_FAILURE; 762 break; 763 case SCSI_SENSE_HARDWARE_ERROR: 764 respHdr->uResponse = VIRTIOSCSI_S_TARGET_FAILURE; 765 break; 766 case SCSI_SENSE_NOT_READY: 767 respHdr->uResponse = VIRTIOSCSI_S_BUSY; /* e.g. re-tryable */ 768 break; 769 default: 770 respHdr->uResponse = VIRTIOSCSI_S_FAILURE; 771 break; 772 } 773 } 805 774 /** 806 775 * @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqCompleteNotify} … … 847 816 { 848 817 if (pReq->uStatus != SCSI_STATUS_CHECK_CONDITION) 849 {850 818 respHdr.uResponse = VIRTIOSCSI_S_OK; 851 break; 852 } 853 uint8_t uSenseKey = pReq->pbSense[2]; 854 switch (uSenseKey) 855 { 856 case SCSI_SENSE_ABORTED_COMMAND: 857 respHdr.uResponse = VIRTIOSCSI_S_ABORTED; 858 break; 859 case SCSI_SENSE_COPY_ABORTED: 860 respHdr.uResponse = VIRTIOSCSI_S_ABORTED; 861 break; 862 case SCSI_SENSE_UNIT_ATTENTION: 863 respHdr.uResponse = VIRTIOSCSI_S_TARGET_FAILURE; 864 break; 865 case SCSI_SENSE_HARDWARE_ERROR: 866 respHdr.uResponse = VIRTIOSCSI_S_TARGET_FAILURE; 867 break; 868 case SCSI_SENSE_NOT_READY: 869 respHdr.uResponse = VIRTIOSCSI_S_BUSY; /* e.g. re-tryable */ 870 break; 871 default: 872 respHdr.uResponse = VIRTIOSCSI_S_FAILURE; 873 break; 874 } 819 else 820 virtioSenseKeyToVirtioResp(&respHdr, pReq->pbSense[2]); 875 821 break; 876 822 } 877 823 case SCSI_STATUS_CHECK_CONDITION: 878 { 879 uint8_t uSenseKey = pReq->pbSense[2]; 880 switch (uSenseKey) 881 { 882 case SCSI_SENSE_ABORTED_COMMAND: 883 respHdr.uResponse = VIRTIOSCSI_S_ABORTED; 884 break; 885 case SCSI_SENSE_COPY_ABORTED: 886 respHdr.uResponse = VIRTIOSCSI_S_ABORTED; 887 break; 888 case SCSI_SENSE_UNIT_ATTENTION: 889 respHdr.uResponse = VIRTIOSCSI_S_TARGET_FAILURE; 890 break; 891 case SCSI_SENSE_HARDWARE_ERROR: 892 respHdr.uResponse = VIRTIOSCSI_S_TARGET_FAILURE; 893 break; 894 case SCSI_SENSE_NOT_READY: 895 respHdr.uResponse = VIRTIOSCSI_S_BUSY; /* e.g. re-tryable */ 896 break; 897 default: 898 respHdr.uResponse = VIRTIOSCSI_S_FAILURE; 899 break; 900 } 901 } 824 virtioSenseKeyToVirtioResp(&respHdr, pReq->pbSense[2]); 902 825 break; 903 826 … … 948 871 949 872 virtioScsiReqErr(pThis, pReq->qIdx, pReq->pDescChain, &respHdr, abSense); 950 return VINF_SUCCESS;951 873 } 952 874 else … … 1134 1056 respHdr.uResidual = cbDataIn + cbDataOut; 1135 1057 virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr, NULL); 1058 RTMemFree(pVirtqReq); 1136 1059 return VINF_SUCCESS; 1137 1060 } … … 1149 1072 respHdr.uResidual = cbDataOut + cbDataIn; 1150 1073 virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr, abSense); 1074 RTMemFree(pVirtqReq); 1151 1075 return VINF_SUCCESS; 1152 1076 } … … 1163 1087 respHdr.uResidual = cbDataIn + cbDataOut; 1164 1088 virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr , abSense); 1089 RTMemFree(pVirtqReq); 1165 1090 return VINF_SUCCESS; 1166 1091 } … … 1177 1102 respHdr.uResidual = cbDataIn + cbDataOut; 1178 1103 virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr , abSense); 1104 RTMemFree(pVirtqReq); 1179 1105 return VINF_SUCCESS; 1180 1106 } … … 1190 1116 PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR); 1191 1117 1192 AssertMsgRCReturn(rc, ("Failed to allocate I/O request, rc=%Rrc\n", rc), rc); 1118 if (RT_FAILURE(rc)) 1119 { 1120 RTMemFree(pVirtqReq); 1121 virtioScsiFreeReq(pTarget, NULL); 1122 AssertMsgRCReturn(rc, ("Failed to allocate I/O request, rc=%Rrc\n", rc), rc); 1123 } 1193 1124 1194 1125 pReq->hIoReq = hIoReq; … … 1240 1171 virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr, abSense); 1241 1172 virtioScsiFreeReq(pTarget, pReq); 1242 return VINF_SUCCESS;1243 } 1244 1173 } 1174 1175 RTMemFree(pVirtqReq); 1245 1176 return VINF_SUCCESS; 1246 1177 } … … 1325 1256 case VIRTIOSCSI_T_TMF_QUERY_TASK: 1326 1257 uResponse = VIRTIOSCSI_S_FUNCTION_REJECTED; 1327 //uResponse = VIRTIOSCSI_S_FUNCTION_SUCCEEDED;1328 1258 break; 1329 1259 case VIRTIOSCSI_T_TMF_QUERY_TASK_SET: 1330 1260 uResponse = VIRTIOSCSI_S_FUNCTION_REJECTED; 1331 //uResponse = VIRTIOSCSI_S_FUNCTION_SUCCEEDED;1332 1261 break; 1333 1262 default: … … 1439 1368 } 1440 1369 1441 const char *pszCtrlRespText = virtioGet CtrlRespText(uResponse);1370 const char *pszCtrlRespText = virtioGetReqRespText(uResponse); 1442 1371 LogFunc(("Response code: %s\n", pszCtrlRespText)); 1443 1372 RT_NOREF(pszCtrlRespText); … … 1487 1416 AssertLogRelMsgReturn(RT_SUCCESS(rc) || rc == VERR_INTERRUPTED, ("%Rrc\n", rc), rc); 1488 1417 if (RT_UNLIKELY(pThread->enmState != PDMTHREADSTATE_RUNNING)) 1489 break;1418 return VINF_SUCCESS; 1490 1419 Log6Func(("%s worker woken\n", QUEUENAME(qIdx))); 1491 1420 ASMAtomicWriteBool(&pWorker->fNotified, false); … … 1716 1645 static DECLCALLBACK(int) virtioScsiLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) 1717 1646 { 1718 LogFunc(("callback"));1647 LogFunc(("LIVE EXEC!!\n")); 1719 1648 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1720 1649 RT_NOREF(pThis); … … 1727 1656 static DECLCALLBACK(int) virtioScsiLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 1728 1657 { 1729 LogFunc(("callback"));1658 LogFunc(("LOAD EXEC!!\n")); 1730 1659 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1731 RT_NOREF(pThis); 1660 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uNumQueues); 1661 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uSegMax); 1662 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uMaxSectors); 1663 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uCmdPerLun); 1664 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uEventInfoSize); 1665 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uSenseSize); 1666 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uCdbSize); 1667 SSMR3GetU16(pSSM, &pThis->virtioScsiConfig.uMaxChannel); 1668 SSMR3GetU16(pSSM, &pThis->virtioScsiConfig.uMaxTarget); 1669 SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uMaxLun); 1670 SSMR3GetU32(pSSM, &pThis->uAsyncEvtsEnabled); 1671 SSMR3GetU32(pSSM, (uint32_t *)&pThis->cActiveReqs); 1672 SSMR3GetBool(pSSM, &pThis->fEventsMissed); 1673 SSMR3GetU32(pSSM, &pThis->fVirtioReady); 1674 SSMR3GetU32(pSSM, &pThis->fHasT10pi); 1675 SSMR3GetU32(pSSM, &pThis->fHasHotplug); 1676 SSMR3GetU32(pSSM, &pThis->fHasInOutBufs); 1677 SSMR3GetU32(pSSM, &pThis->fHasLunChange); 1678 SSMR3GetU32(pSSM, &pThis->fResetting); 1679 SSMR3GetU32(pSSM, &pThis->fQuiescing); 1732 1680 RT_NOREF(uPass); 1733 RT_NOREF(pSSM);1734 1681 RT_NOREF(uVersion); 1735 1682 return VINF_SSM_DONT_CALL_AGAIN; … … 1739 1686 static DECLCALLBACK(int) virtioScsiSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1740 1687 { 1741 LogFunc(("callback"));1688 LogFunc(("SAVE EXEC!!\n")); 1742 1689 PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI); 1743 1690 1744 RT_NOREF(pThis); 1745 RT_NOREF(pSSM); 1691 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uNumQueues); 1692 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uSegMax); 1693 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uMaxSectors); 1694 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uCmdPerLun); 1695 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uEventInfoSize); 1696 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uSenseSize); 1697 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uCdbSize); 1698 SSMR3PutU16(pSSM, pThis->virtioScsiConfig.uMaxChannel); 1699 SSMR3PutU16(pSSM, pThis->virtioScsiConfig.uMaxTarget); 1700 SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uMaxLun); 1701 SSMR3PutU32(pSSM, pThis->uAsyncEvtsEnabled); 1702 SSMR3PutU32(pSSM, (uint32_t)pThis->cActiveReqs); 1703 SSMR3PutBool(pSSM, pThis->fEventsMissed); 1704 SSMR3PutU32(pSSM, pThis->fVirtioReady); 1705 SSMR3PutU32(pSSM, pThis->fHasT10pi); 1706 SSMR3PutU32(pSSM, pThis->fHasHotplug); 1707 SSMR3PutU32(pSSM, pThis->fHasInOutBufs); 1708 SSMR3PutU32(pSSM, pThis->fHasLunChange); 1709 SSMR3PutU32(pSSM, pThis->fResetting); 1710 SSMR3PutU32(pSSM, pThis->fQuiescing); 1711 1746 1712 return VINF_SUCCESS; 1747 1713 } … … 2316 2282 { 2317 2283 rc = virtioQueueAttach(pThis->hVirtio, qIdx, QUEUENAME(qIdx)); 2318 AssertMsgReturn(rc == VINF_SUCCESS, ("Failed to attach queue %s\n", QUEUENAME(qIdx)), rc);2319 2284 pThis->fQueueAttached[qIdx] = (rc == VINF_SUCCESS); 2320 2285 … … 2336 2301 } 2337 2302 } 2338 2339 #ifdef BOOTABLE_SUPPORT_TBD2340 if (fBootable)2341 {2342 /* Register I/O port space for BIOS access. */2343 rc = PDMDevHlpIOPortRegister(pDevIns, VIRTIOSCSI_BIOS_IO_PORT, 4, NULL,2344 virtioScsiBiosIoPortWrite, virtioScsiBiosIoPortRead,2345 virtioScsiBiosIoPortWriteStr, virtioScsiBiosIoPortReadStr,2346 "virtio-scsi BIOS");2347 if (RT_FAILURE(rc))2348 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register BIOS I/O handlers"));2349 }2350 #endif2351 2303 2352 2304 /* Initialize per device instance. */ … … 2456 2408 /* .uReserved0 = */ 0, 2457 2409 /* .szName = */ "virtio-scsi", 2410 2458 2411 #ifdef VIRTIOSCSI_GC_SUPPORT 2459 2412 /* .fFlags = */ PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ -
trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp
r81402 r81628 278 278 pVirtq->uUsedIdx, QUEUENAME(qIdx), uUsedIdx)); 279 279 280 RTMemFree((void *)pDescChain->pSgPhysSend->paSegs); 281 RTMemFree(pDescChain->pSgPhysSend); 280 282 RTMemFree((void *)pSgPhysReturn->paSegs); 281 283 RTMemFree(pSgPhysReturn); … … 314 316 static void virtioQueueNotified(PVIRTIOSTATE pVirtio, uint16_t qIdx, uint16_t uNotifyIdx) 315 317 { 316 Assert(uNotifyIdx == qIdx); 317 (void)uNotifyIdx; 318 /* See VirtIO 1.0, section 4.1.5.2 It implies that qIdx and uNotifyIdx should match. 319 * Disregarding this notification may cause throughput to stop, however there's no way to know 320 * which was queue was intended for wake-up if the two parameters disagree. */ 321 322 AssertMsg(uNotifyIdx == qIdx, 323 ("Notification param disagreement. Guest kicked virtq %d's notify addr w/non-corresponding virtq idx %d\n", 324 qIdx, uNotifyIdx)); 325 326 // AssertMsgReturn(uNotifyIdx == qIdx, 327 // ("Notification param disagreement. Guest kicked virtq %d's notify addr w/non-corresponding virtq idx %d\n", 328 // qIdx, uNotifyIdx)); 329 RT_NOREF(uNotifyIdx); 318 330 319 331 PVIRTQSTATE pVirtq = &pVirtio->virtqState[qIdx]; 320 332 Log6Func(("%s\n", pVirtq->szVirtqName)); 321 (void)pVirtq;333 RT_NOREF(pVirtq); 322 334 323 335 /** Inform client */ … … 470 482 pVirtio->uISR = 0; 471 483 484 virtioLowerInterrupt(pVirtio); 472 485 473 486 if (!pVirtio->fMsiSupport) /* VirtIO 1.0, 4.1.4.3 and 4.1.5.1.2 */ … … 827 840 uint16_t qIdx = uNotifyBaseOffset / VIRTIO_NOTIFY_OFFSET_MULTIPLIER; 828 841 uint16_t uAvailDescIdx = *(uint16_t *)pv; 842 829 843 virtioQueueNotified(pVirtio, qIdx, uAvailDescIdx); 830 844 } … … 1260 1274 rc = SSMR3PutU32(pSSM, pVirtio->uDriverFeaturesSelect); 1261 1275 rc = SSMR3PutU32(pSSM, pVirtio->uNumQueues); 1262 rc = SSMR3PutU32(pSSM, pVirtio->cbDevSpecificCfg);1263 rc = SSMR3PutU64(pSSM, pVirtio->uDeviceFeatures);1264 1276 rc = SSMR3PutU64(pSSM, pVirtio->uDriverFeatures); 1265 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->pDevSpecificCfg);1266 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnVirtioStatusChanged);1267 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnVirtioQueueNotified);1268 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnVirtioDevCapRead);1269 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnVirtioDevCapWrite);1270 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnSSMDevLiveExec);1271 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnSSMDevSaveExec);1272 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnSSMDevLoadExec);1273 rc = SSMR3PutU64(pSSM, (uint64_t)pVirtio->virtioCallbacks.pfnSSMDevLoadDone);1274 rc = SSMR3PutGCPhys(pSSM, pVirtio->pGcPhysCommonCfg);1275 rc = SSMR3PutGCPhys(pSSM, pVirtio->pGcPhysNotifyCap);1276 rc = SSMR3PutGCPhys(pSSM, pVirtio->pGcPhysIsrCap);1277 rc = SSMR3PutGCPhys(pSSM, pVirtio->pGcPhysDeviceCap);1278 rc = SSMR3PutGCPhys(pSSM, pVirtio->pGcPhysPciCapBase);1279 1277 1280 1278 for (uint16_t i = 0; i < pVirtio->uNumQueues; i++) … … 1316 1314 rc = SSMR3GetU32(pSSM, &pVirtio->uDriverFeaturesSelect); 1317 1315 rc = SSMR3GetU32(pSSM, &pVirtio->uNumQueues); 1318 rc = SSMR3GetU32(pSSM, &pVirtio->cbDevSpecificCfg);1319 rc = SSMR3GetU64(pSSM, &pVirtio->uDeviceFeatures);1320 1316 rc = SSMR3GetU64(pSSM, &pVirtio->uDriverFeatures); 1321 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->pDevSpecificCfg); 1322 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnVirtioStatusChanged); 1323 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnVirtioQueueNotified); 1324 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnVirtioDevCapRead); 1325 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnVirtioDevCapWrite); 1326 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnSSMDevLiveExec); 1327 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnSSMDevSaveExec); 1328 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnSSMDevLoadExec); 1329 rc = SSMR3GetU64(pSSM, (uint64_t *)&pVirtio->virtioCallbacks.pfnSSMDevLoadDone); 1330 rc = SSMR3GetGCPhys(pSSM, &pVirtio->pGcPhysCommonCfg); 1331 rc = SSMR3GetGCPhys(pSSM, &pVirtio->pGcPhysNotifyCap); 1332 rc = SSMR3GetGCPhys(pSSM, &pVirtio->pGcPhysIsrCap); 1333 rc = SSMR3GetGCPhys(pSSM, &pVirtio->pGcPhysDeviceCap); 1334 rc = SSMR3GetGCPhys(pSSM, &pVirtio->pGcPhysPciCapBase); 1317 1335 1318 1336 1319 for (uint16_t i = 0; i < pVirtio->uNumQueues; i++) -
trunk/src/VBox/Devices/VirtIO/Virtio_1_0_impl.h
r81122 r81628 465 465 { 466 466 AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n")); 467 RT_UNTRUSTED_VALIDATED_FENCE(); /* VirtIO 1.0, Section 3.2.1.4.1 */ 467 468 PDMDevHlpPCIPhysWrite(pVirtio->CTX_SUFF(pDevIns), 468 469 pVirtio->pGcPhysQueueUsed[qIdx] + RT_UOFFSETOF(VIRTQ_USED_T, fFlags), … … 473 474 { 474 475 uint16_t uAvailEventIdx; 476 RT_UNTRUSTED_VALIDATED_FENCE(); /* VirtIO 1.0, Section 3.2.1.4.1 */ 475 477 /** VirtIO 1.0 uAvailEventIdx (avail_event) immediately follows ring */ 476 478 AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
Note:
See TracChangeset
for help on using the changeset viewer.