Changeset 80539 in vbox
- Timestamp:
- Sep 2, 2019 7:22:42 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
include/VBox/scsi.h (modified) (1 diff)
-
src/VBox/Devices/Storage/Debug.cpp (modified) (2 diffs)
-
src/VBox/Devices/Storage/DevVirtioSCSI.cpp (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/scsi.h
r80528 r80539 317 317 #if defined(IN_RING3) && (defined(LOG_ENABLED) || defined(RT_STRICT)) 318 318 const char * SCSICmdText(uint8_t uCmd); 319 const char * SCSIStatusText(uint8_t uStatus); 319 320 const char * SCSISenseText(uint8_t uSense); 320 321 const char * SCSISenseExtText(uint8_t uASC, uint8_t uASCQ); -
trunk/src/VBox/Devices/Storage/Debug.cpp
r76553 r80539 575 575 "MISCOMPARE", 576 576 "(reserved)" 577 }; 578 579 static struct 580 { 581 uint8_t uStatus; 582 const char * const pszStatusText; 583 } g_aSCSIStatusText[] 584 = 585 { 586 { 0x00, "GOOD" }, 587 { 0x02, "CHECK CONDITION" }, 588 { 0x04, "CONDITION MET" }, 589 { 0x08, "BUSY" }, 590 { 0x10, "INTERMEDIATE"}, 591 { 0x14, "CONDITION MET" }, 592 { 0x18, "RESERVATION CONFLICT" }, 593 { 0x22, "COMMAND TERMINATED" }, 594 { 0x28, "TASK SET FULL" }, 595 { 0x30, "ACA ACTIVE" }, 596 { 0x40, "TASK ABORTED" }, 577 597 }; 578 598 … … 937 957 } 938 958 959 const char * SCSIStatusText(uint8_t uStatus) 960 { 961 unsigned iIdx; 962 963 /* Linear search. Doesn't hurt as we don't call this function very frequently */ 964 for (iIdx = 0; iIdx < RT_ELEMENTS(g_aSCSISenseText); iIdx++) 965 { 966 if (g_aSCSIStatusText[iIdx].uStatus == uStatus) 967 return g_aSCSIStatusText[iIdx].pszStatusText; 968 } 969 return "(Unknown extended status code)"; 970 } 971 939 972 /** 940 973 * Return the plain text of an extended SCSI sense key. -
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r80538 r80539 471 471 size_t cbPiOut; /**< Size of T10 pi in buffer */ 472 472 uint8_t *pbPiOut; /**< Address of pi out buffer */ 473 uint8_t *pbDataOut; /**< dataout */473 uint8_t *pbDataOut; /**< dataout */ 474 474 size_t cbPiIn; /**< Size of T10 pi buffer */ 475 475 uint8_t *pbPiIn; /**< Address of pi in buffer */ … … 480 480 uint8_t uStatus; /**< SCSI status code */ 481 481 PRTSGBUF pInSgBuf; /**< Buf vector to return PDM result to VirtIO Guest */ 482 PVIRTIOSCSI_REQ_CMD_T pVirtqReq; /**< Allocated to receive translated queued req */ 482 483 } VIRTIOSCSIREQ; 483 484 … … 524 525 default: return "<unknown>"; 525 526 } 526 }527 528 DECLINLINE(void) virtioGetControlAsyncMaskText(char *pszOutput, size_t cbOutput, uint32_t uAsyncTypesMask)529 {530 RTStrPrintf(pszOutput, cbOutput, "%s%s%s%s%s%s",531 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_OPERATIONAL_CHANGE) ? "CHANGE_OPERATION " : "",532 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_POWER_MGMT) ? "POWER_MGMT " : "",533 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST) ? "EXTERNAL_REQ " : "",534 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE) ? "MEDIA_CHANGE " : "",535 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MULTI_HOST) ? "MULTI_HOST " : "",536 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY) ? "DEVICE_BUSY " : "");537 527 } 538 528 … … 571 561 } 572 562 573 DECLINLINE(const char *) virtioGetScsiStatusText(uint8_t uScsiStatusCode) 574 { 575 switch (uScsiStatusCode) 576 { 577 case 0x00: return "GOOD"; 578 case 0x02: return "CHECK CONDITION"; 579 case 0x04: return "CONDITION MET"; 580 case 0x08: return "BUSY"; 581 case 0x10: return "INTERMEDIATE"; 582 case 0x14: return "CONDITION MET"; 583 case 0x18: return "RESERVATION CONFLICT"; 584 case 0x22: return "COMMAND TERMINATED"; 585 case 0x28: return "TASK SET FULL"; 586 case 0x30: return "ACA ACTIVE"; 587 case 0x40: return "TASK ABORTED"; 588 default: return "<UNKNOWN CODE>"; 589 } 563 DECLINLINE(void) virtioGetControlAsyncMaskText(char *pszOutput, size_t cbOutput, uint32_t uAsyncTypesMask) 564 { 565 RTStrPrintf(pszOutput, cbOutput, "%s%s%s%s%s%s", 566 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_OPERATIONAL_CHANGE) ? "CHANGE_OPERATION " : "", 567 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_POWER_MGMT) ? "POWER_MGMT " : "", 568 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST) ? "EXTERNAL_REQ " : "", 569 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE) ? "MEDIA_CHANGE " : "", 570 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MULTI_HOST) ? "MULTI_HOST " : "", 571 (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY) ? "DEVICE_BUSY " : ""); 590 572 } 591 573 … … 837 819 838 820 LogFunc(("status: %s response: %s 0x%x%x/0x%x%x cbXfer=%d, cbResidual: %u\n", 839 virtioGetScsiStatusText(pReq->uStatus), virtioGetReqRespText(respHdr.uResponse),821 SCSIStatusText(pReq->uStatus), virtioGetReqRespText(respHdr.uResponse), 840 822 pReq->uStatus >> 4 & 0xf, pReq->uStatus & 0xf, 841 823 respHdr.uResponse >> 4 & 0xf, respHdr.uResponse & 0xf, … … 898 880 virtioQueueSync(pThis->hVirtio, pReq->qIdx); 899 881 882 RTMemFree(pReq->pVirtqReq); 900 883 RTMemFree(pReq->pbSense); 901 884 RTMemFree(pReq->pbDataIn); … … 1051 1034 respHdr.uStatusQualifier = 0; 1052 1035 virtioScsiReqFinish(pThis, qIdx, &respHdr, pbSense); 1036 RTMemFree(pVirtqReq); 1053 1037 return VINF_SUCCESS; 1054 1038 } … … 1070 1054 pReq->pbDataOut = pbDataOut; 1071 1055 pReq->cbPiIn = cbPiIn; 1056 pReq->pVirtqReq = pVirtqReq; 1072 1057 1073 1058 if (cbPiIn) … … 1120 1105 uint8_t pbSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED, 0, SCSI_SENSE_VENDOR_SPECIFIC, 1121 1106 0, 0, 0, 0, 10, uASC, uASCQ, 0 }; 1122 respHdr.cbSense = sizeof(pbSense);1107 respHdr.cbSense = sizeof(pbSense); 1123 1108 respHdr.uResidual = cbDataIn + cbDataOut; 1124 1109 respHdr.uStatus = SCSI_STATUS_CHECK_CONDITION; … … 1126 1111 respHdr.uStatusQualifier = 0; 1127 1112 virtioScsiReqFinish(pThis, qIdx, &respHdr, NULL /* pbSense */); 1113 RTMemFree(pVirtqReq); 1114 RTMemFree(pReq->pbSense); 1115 RTMemFree(pReq->pbDataIn); 1116 RTMemFree(pReq->pbPiIn); 1117 pIMediaEx->pfnIoReqFree(pIMediaEx, pReq->hIoReq); 1128 1118 return VINF_SUCCESS; 1129 1119 } … … 1132 1122 uint8_t pbSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED, 0, SCSI_SENSE_NOT_READY, 1133 1123 0, 0, 0, 0, 10, 0, 0, 0 }; 1134 respHdr.cbSense = sizeof(pbSense);1124 respHdr.cbSense = sizeof(pbSense); 1135 1125 respHdr.uResidual = cbDataIn + cbDataOut; 1136 1126 respHdr.uStatus = SCSI_STATUS_CHECK_CONDITION;
Note:
See TracChangeset
for help on using the changeset viewer.

