VirtualBox

Changeset 80539 in vbox


Ignore:
Timestamp:
Sep 2, 2019 7:22:42 AM (5 years ago)
Author:
vboxsync
Message:

Storage/DevVirtioSCSI.cpp: Added code to properly free some allocated entities when done. Also gave the request completion command access to the OUT components of the request (CDB) in case it needs to determine the command type. Also moved SCSI status text lookup into Storage/Debug.cpp

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/scsi.h

    r80528 r80539  
    317317#if defined(IN_RING3) && (defined(LOG_ENABLED) || defined(RT_STRICT))
    318318const char * SCSICmdText(uint8_t uCmd);
     319const char * SCSIStatusText(uint8_t uStatus);
    319320const char * SCSISenseText(uint8_t uSense);
    320321const char * SCSISenseExtText(uint8_t uASC, uint8_t uASCQ);
  • trunk/src/VBox/Devices/Storage/Debug.cpp

    r76553 r80539  
    575575    "MISCOMPARE",
    576576    "(reserved)"
     577};
     578
     579static 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" },
    577597};
    578598
     
    937957}
    938958
     959const 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
    939972/**
    940973 * Return the plain text of an extended SCSI sense key.
  • trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp

    r80538 r80539  
    471471    size_t                         cbPiOut;                  /**< Size of T10 pi in buffer                          */
    472472    uint8_t                       *pbPiOut;                  /**< Address of pi out buffer                          */
    473     uint8_t                       *pbDataOut;                /**< dataout */
     473    uint8_t                       *pbDataOut;                /**< dataout                                           */
    474474    size_t                         cbPiIn;                   /**< Size of T10 pi buffer                             */
    475475    uint8_t                       *pbPiIn;                   /**< Address of pi in buffer                           */
     
    480480    uint8_t                        uStatus;                  /**< SCSI status code                                  */
    481481    PRTSGBUF                       pInSgBuf;                 /**< Buf vector to return PDM result to VirtIO Guest   */
     482    PVIRTIOSCSI_REQ_CMD_T          pVirtqReq;                /**< Allocated to receive translated queued req        */
    482483} VIRTIOSCSIREQ;
    483484
     
    524525        default:                                        return "<unknown>";
    525526    }
    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  "        : "");
    537527}
    538528
     
    571561}
    572562
    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     }
     563DECLINLINE(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  "        : "");
    590572}
    591573
     
    837819
    838820    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),
    840822                pReq->uStatus >> 4 & 0xf, pReq->uStatus & 0xf,
    841823                respHdr.uResponse >> 4 & 0xf, respHdr.uResponse & 0xf,
     
    898880    virtioQueueSync(pThis->hVirtio, pReq->qIdx);
    899881
     882    RTMemFree(pReq->pVirtqReq);
    900883    RTMemFree(pReq->pbSense);
    901884    RTMemFree(pReq->pbDataIn);
     
    10511034        respHdr.uStatusQualifier = 0;
    10521035        virtioScsiReqFinish(pThis, qIdx, &respHdr, pbSense);
     1036        RTMemFree(pVirtqReq);
    10531037        return VINF_SUCCESS;
    10541038    }
     
    10701054        pReq->pbDataOut = pbDataOut;
    10711055        pReq->cbPiIn    = cbPiIn;
     1056        pReq->pVirtqReq = pVirtqReq;
    10721057
    10731058        if (cbPiIn)
     
    11201105            uint8_t pbSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED, 0, SCSI_SENSE_VENDOR_SPECIFIC,
    11211106                                  0, 0, 0, 0, 10, uASC, uASCQ, 0 };
    1122             respHdr.cbSense = sizeof(pbSense);
     1107            respHdr.cbSense   = sizeof(pbSense);
    11231108            respHdr.uResidual = cbDataIn + cbDataOut;
    11241109            respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
     
    11261111            respHdr.uStatusQualifier = 0;
    11271112            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);
    11281118            return VINF_SUCCESS;
    11291119        }
     
    11321122        uint8_t pbSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED, 0, SCSI_SENSE_NOT_READY,
    11331123                              0, 0, 0, 0, 10, 0, 0, 0 };
    1134         respHdr.cbSense = sizeof(pbSense);
     1124        respHdr.cbSense   = sizeof(pbSense);
    11351125        respHdr.uResidual = cbDataIn + cbDataOut;
    11361126        respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette