VirtualBox

Changeset 66164 in vbox


Ignore:
Timestamp:
Mar 20, 2017 10:47:58 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114073
Message:

VSCSI/MMC: Support getting only specific features when indicated in the CDB for GET CONFIGURATION instead of returning an error to the guest

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp

    r66065 r66164  
    3131
    3232#include "VSCSIInternal.h"
     33
     34/*********************************************************************************************************************************
     35*   Structures and Typedefs                                                                                                      *
     36*********************************************************************************************************************************/
    3337
    3438/**
     
    7983} VSCSILUNMMC, *PVSCSILUNMMC;
    8084
     85
     86/**
     87 * Callback to fill a feature for a GET CONFIGURATION request.
     88 *
     89 * @returns Number of bytes used for this feature in the buffer.
     90 * @param   pbBuf           The buffer to use.
     91 * @param   cbBuf           Size of the buffer.
     92 */
     93typedef DECLCALLBACK(size_t) FNVSCSILUNMMCFILLFEATURE(uint8_t *pbBuf, size_t cbBuf);
     94/** Pointer to a fill feature callback. */
     95typedef FNVSCSILUNMMCFILLFEATURE *PFNVSCSILUNMMCFILLFEATURE;
     96
     97/**
     98 * VSCSI MMC feature descriptor.
     99 */
     100typedef struct VSCSILUNMMCFEATURE
     101{
     102    /** The feature number. */
     103    uint16_t                  u16Feat;
     104    /** The callback to call for this feature. */
     105    PFNVSCSILUNMMCFILLFEATURE pfnFeatureFill;
     106} VSCSILUNMMCFEATURE;
     107/** Pointer to a VSCSI MMC feature descriptor. */
     108typedef VSCSILUNMMCFEATURE *PVSCSILUNMMCFEATURE;
     109/** Pointer to a const VSCSI MMC feature descriptor. */
     110typedef const VSCSILUNMMCFEATURE *PCVSCSILUNMMCFEATURE;
     111
     112
     113
     114/*********************************************************************************************************************************
     115*   Internal Functions                                                                                                           *
     116*********************************************************************************************************************************/
     117RT_C_DECLS_BEGIN
     118static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureListProfiles(uint8_t *pbBuf, size_t cbBuf);
     119static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCore(uint8_t *pbBuf, size_t cbBuf);
     120static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureMorphing(uint8_t *pbBuf, size_t cbBuf);
     121static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(uint8_t *pbBuf, size_t cbBuf);
     122static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRandomReadable(uint8_t *pbBuf, size_t cbBuf);
     123static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCDRead(uint8_t *pbBuf, size_t cbBuf);
     124static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeaturePowerManagement(uint8_t *pbBuf, size_t cbBuf);
     125static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureTimeout(uint8_t *pbBuf, size_t cbBuf);
     126RT_C_DECLS_END
     127
     128/**
     129 * List of supported MMC features.
     130 */
     131static const VSCSILUNMMCFEATURE g_aVScsiMmcFeatures[] =
     132{
     133    { 0x0000, vscsiLunMmcGetConfigurationFillFeatureListProfiles},
     134    { 0x0001, vscsiLunMmcGetConfigurationFillFeatureCore},
     135    { 0x0002, vscsiLunMmcGetConfigurationFillFeatureMorphing},
     136    { 0x0003, vscsiLunMmcGetConfigurationFillFeatureRemovableMedium},
     137    { 0x0010, vscsiLunMmcGetConfigurationFillFeatureRandomReadable},
     138    { 0x001e, vscsiLunMmcGetConfigurationFillFeatureCDRead},
     139    { 0x0100, vscsiLunMmcGetConfigurationFillFeaturePowerManagement},
     140    { 0x0105, vscsiLunMmcGetConfigurationFillFeatureTimeout}
     141};
    81142
    82143/* Fabricate normal TOC information. */
     
    264325}
    265326
    266 static size_t vscsiLunMmcGetConfigurationFillFeatureListProfiles(uint8_t *pbBuf, size_t cbBuf)
     327static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureListProfiles(uint8_t *pbBuf, size_t cbBuf)
    267328{
    268329    if (cbBuf < 3*4)
     
    282343}
    283344
    284 static size_t vscsiLunMmcGetConfigurationFillFeatureCore(uint8_t *pbBuf, size_t cbBuf)
     345static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCore(uint8_t *pbBuf, size_t cbBuf)
    285346{
    286347    if (cbBuf < 12)
     
    297358}
    298359
    299 static size_t vscsiLunMmcGetConfigurationFillFeatureMorphing(uint8_t *pbBuf, size_t cbBuf)
     360static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureMorphing(uint8_t *pbBuf, size_t cbBuf)
    300361{
    301362    if (cbBuf < 8)
     
    311372}
    312373
    313 static size_t vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(uint8_t *pbBuf, size_t cbBuf)
     374static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(uint8_t *pbBuf, size_t cbBuf)
    314375{
    315376    if (cbBuf < 8)
     
    326387}
    327388
    328 static size_t vscsiLunMmcGetConfigurationFillFeatureRandomReadable(uint8_t *pbBuf, size_t cbBuf)
     389static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRandomReadable(uint8_t *pbBuf, size_t cbBuf)
    329390{
    330391    if (cbBuf < 12)
     
    342403}
    343404
    344 static size_t vscsiLunMmcGetConfigurationFillFeatureCDRead(uint8_t *pbBuf, size_t cbBuf)
     405static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCDRead(uint8_t *pbBuf, size_t cbBuf)
    345406{
    346407    if (cbBuf < 8)
     
    356417}
    357418
    358 static size_t vscsiLunMmcGetConfigurationFillFeaturePowerManagement(uint8_t *pbBuf, size_t cbBuf)
     419static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeaturePowerManagement(uint8_t *pbBuf, size_t cbBuf)
    359420{
    360421    if (cbBuf < 4)
     
    368429}
    369430
    370 static size_t vscsiLunMmcGetConfigurationFillFeatureTimeout(uint8_t *pbBuf, size_t cbBuf)
     431static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureTimeout(uint8_t *pbBuf, size_t cbBuf)
    371432{
    372433    if (cbBuf < 8)
     
    395456    size_t cbBuf = sizeof(aReply);
    396457    size_t cbCopied = 0;
    397 
    398     /* Accept valid request types only, and only starting feature 0. */
    399     if ((pVScsiReq->pbCDB[1] & 0x03) == 3 || scsiBE2H_U16(&pVScsiReq->pbCDB[2]) != 0)
     458    uint16_t u16Sfn = scsiBE2H_U16(&pVScsiReq->pbCDB[2]);
     459    uint8_t u8Rt = pVScsiReq->pbCDB[1] & 0x03;
     460
     461    /* Accept valid request types only. */
     462    if (u8Rt == 3)
    400463        return vscsiLunReqSenseErrorSet(&pVScsiLunMmc->Core, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
    401464                                        SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
     
    410473    pbBuf    += 8;
    411474
    412     cbCopied = vscsiLunMmcGetConfigurationFillFeatureListProfiles(pbBuf, cbBuf);
    413     cbBuf -= cbCopied;
    414     pbBuf += cbCopied;
    415 
    416     cbCopied = vscsiLunMmcGetConfigurationFillFeatureCore(pbBuf, cbBuf);
    417     cbBuf -= cbCopied;
    418     pbBuf += cbCopied;
    419 
    420     cbCopied = vscsiLunMmcGetConfigurationFillFeatureMorphing(pbBuf, cbBuf);
    421     cbBuf -= cbCopied;
    422     pbBuf += cbCopied;
    423 
    424     cbCopied = vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(pbBuf, cbBuf);
    425     cbBuf -= cbCopied;
    426     pbBuf += cbCopied;
    427 
    428     cbCopied = vscsiLunMmcGetConfigurationFillFeatureRandomReadable(pbBuf, cbBuf);
    429     cbBuf -= cbCopied;
    430     pbBuf += cbCopied;
    431 
    432     cbCopied = vscsiLunMmcGetConfigurationFillFeatureCDRead(pbBuf, cbBuf);
    433     cbBuf -= cbCopied;
    434     pbBuf += cbCopied;
    435 
    436     cbCopied = vscsiLunMmcGetConfigurationFillFeaturePowerManagement(pbBuf, cbBuf);
    437     cbBuf -= cbCopied;
    438     pbBuf += cbCopied;
    439 
    440     cbCopied = vscsiLunMmcGetConfigurationFillFeatureTimeout(pbBuf, cbBuf);
    441     cbBuf -= cbCopied;
    442     pbBuf += cbCopied;
     475    if (u8Rt == 0x2)
     476    {
     477        for (uint32_t i = 0; i < RT_ELEMENTS(g_aVScsiMmcFeatures); i++)
     478        {
     479            if (g_aVScsiMmcFeatures[i].u16Feat == u16Sfn)
     480            {
     481                cbCopied = g_aVScsiMmcFeatures[i].pfnFeatureFill(pbBuf, cbBuf);
     482                cbBuf -= cbCopied;
     483                pbBuf += cbCopied;
     484                break;
     485            }
     486        }
     487    }
     488    else
     489    {
     490        for (uint32_t i = 0; i < RT_ELEMENTS(g_aVScsiMmcFeatures); i++)
     491        {
     492            if (g_aVScsiMmcFeatures[i].u16Feat > u16Sfn)
     493            {
     494                cbCopied = g_aVScsiMmcFeatures[i].pfnFeatureFill(pbBuf, cbBuf);
     495                cbBuf -= cbCopied;
     496                pbBuf += cbCopied;
     497            }
     498        }
     499    }
    443500
    444501    /* Set data length now. */
Note: See TracChangeset for help on using the changeset viewer.

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