VirtualBox

Changeset 64239 in vbox


Ignore:
Timestamp:
Oct 13, 2016 12:07:59 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
111248
Message:

Devices/Storage/DrvHost*: Start separating host dependent code into separate files to get rid of the #ifdef maze and make future changes easier

Location:
trunk/src/VBox/Devices
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Makefile.kmk

    r64062 r64239  
    194194 endif
    195195
    196  VBoxDD_SOURCES.darwin += Storage/HBDMgmt-darwin.cpp
     196 VBoxDD_SOURCES.darwin += \
     197        Storage/HBDMgmt-darwin.cpp \
     198        Storage/DrvHostBase-darwin.cpp
     199
     200 VBoxDD_SOURCES.freebsd += \
     201        Storage/DrvHostBase-freebsd.cpp
     202
    197203 #VBoxDD_SOURCES.win += Storage/HBDMgmt-win.cpp #Disabled until remaining issues are sorted out
    198204
  • trunk/src/VBox/Devices/Storage/DrvHostBase.cpp

    r64093 r64239  
    176176                0, 0, 0, 0, 0
    177177            };
    178             rc = DRVHostBaseScsiCmd(pThis, abCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, &cbRead32, NULL, 0, 0);
     178            rc = drvHostBaseScsiCmdOs(pThis, abCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, &cbRead32, NULL, 0, 0);
    179179
    180180            off    += cbRead32;
     
    677677                    0,0,0,0,0,0,0,0,0,0
    678678                };
    679                 DRVHostBaseScsiCmd(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     679                drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
    680680            }
    681681            return VINF_SUCCESS;
     
    11481148        0,0,0,0,0,0,0,0,0
    11491149    };
    1150     int rc = DRVHostBaseScsiCmd(pThis, abCmd, 6, PDMMEDIATXDIR_FROM_DEVICE, &Buf, &cbBuf, NULL, 0, 0);
     1150    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_FROM_DEVICE, &Buf, &cbBuf, NULL, 0, 0);
    11511151    if (RT_SUCCESS(rc))
    11521152    {
     
    12091209#endif
    12101210}
    1211 
    1212 
    1213 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    1214 /**
    1215  * Execute a SCSI command.
    1216  *
    1217  * @param pThis             The instance data.
    1218  * @param pbCmd             Pointer to the SCSI command.
    1219  * @param cbCmd             The size of the SCSI command.
    1220  * @param enmTxDir          The transfer direction.
    1221  * @param pvBuf             The buffer. Can be NULL if enmTxDir is PDMMEDIATXDIR_NONE.
    1222  * @param pcbBuf            Where to get the buffer size from and put the actual transfer size. Can be NULL.
    1223  * @param pbSense           Where to put the sense data. Can be NULL.
    1224  * @param cbSense           Size of the sense data buffer.
    1225  * @param cTimeoutMillies   The timeout. 0 mean the default timeout.
    1226  *
    1227  * @returns VINF_SUCCESS on success (no sense code).
    1228  * @returns VERR_UNRESOLVED_ERROR if sense code is present.
    1229  * @returns Some other VBox status code on failures without sense code.
    1230  *
    1231  * @todo Fix VERR_UNRESOLVED_ERROR abuse.
    1232  */
    1233 DECLCALLBACK(int) DRVHostBaseScsiCmd(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
    1234                                      void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies)
    1235 {
    1236     /*
    1237      * Minimal input validation.
    1238      */
    1239     Assert(enmTxDir == PDMMEDIATXDIR_NONE || enmTxDir == PDMMEDIATXDIR_FROM_DEVICE || enmTxDir == PDMMEDIATXDIR_TO_DEVICE);
    1240     Assert(!pvBuf || pcbBuf);
    1241     Assert(pvBuf || enmTxDir == PDMMEDIATXDIR_NONE);
    1242     Assert(pbSense || !cbSense);
    1243     AssertPtr(pbCmd);
    1244     Assert(cbCmd <= 16 && cbCmd >= 1);
    1245     const uint32_t cbBuf = pcbBuf ? *pcbBuf : 0;
    1246     if (pcbBuf)
    1247         *pcbBuf = 0;
    1248 
    1249 # ifdef RT_OS_DARWIN
    1250     Assert(pThis->ppScsiTaskDI);
    1251 
    1252     int rc = VERR_GENERAL_FAILURE;
    1253     SCSITaskInterface **ppScsiTaskI = (*pThis->ppScsiTaskDI)->CreateSCSITask(pThis->ppScsiTaskDI);
    1254     if (!ppScsiTaskI)
    1255         return VERR_NO_MEMORY;
    1256     do
    1257     {
    1258         /* Setup the scsi command. */
    1259         SCSICommandDescriptorBlock cdb = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    1260         memcpy(&cdb[0], pbCmd, cbCmd);
    1261         IOReturn irc = (*ppScsiTaskI)->SetCommandDescriptorBlock(ppScsiTaskI, cdb, cbCmd);
    1262         AssertBreak(irc == kIOReturnSuccess);
    1263 
    1264         /* Setup the buffer. */
    1265         if (enmTxDir == PDMMEDIATXDIR_NONE)
    1266             irc = (*ppScsiTaskI)->SetScatterGatherEntries(ppScsiTaskI, NULL, 0, 0, kSCSIDataTransfer_NoDataTransfer);
    1267         else
    1268         {
    1269             IOVirtualRange Range = { (IOVirtualAddress)pvBuf, cbBuf };
    1270             irc = (*ppScsiTaskI)->SetScatterGatherEntries(ppScsiTaskI, &Range, 1, cbBuf,
    1271                                                           enmTxDir == PDMMEDIATXDIR_FROM_DEVICE
    1272                                                           ? kSCSIDataTransfer_FromTargetToInitiator
    1273                                                           : kSCSIDataTransfer_FromInitiatorToTarget);
    1274         }
    1275         AssertBreak(irc == kIOReturnSuccess);
    1276 
    1277         /* Set the timeout. */
    1278         irc = (*ppScsiTaskI)->SetTimeoutDuration(ppScsiTaskI, cTimeoutMillies ? cTimeoutMillies : 30000 /*ms*/);
    1279         AssertBreak(irc == kIOReturnSuccess);
    1280 
    1281         /* Execute the command and get the response. */
    1282         SCSI_Sense_Data SenseData = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    1283         SCSIServiceResponse     ServiceResponse = kSCSIServiceResponse_Request_In_Process;
    1284         SCSITaskStatus TaskStatus = kSCSITaskStatus_GOOD;
    1285         UInt64 cbReturned = 0;
    1286         irc = (*ppScsiTaskI)->ExecuteTaskSync(ppScsiTaskI, &SenseData, &TaskStatus, &cbReturned);
    1287         AssertBreak(irc == kIOReturnSuccess);
    1288         if (pcbBuf)
    1289             *pcbBuf = (int32_t)cbReturned;
    1290 
    1291         irc = (*ppScsiTaskI)->GetSCSIServiceResponse(ppScsiTaskI, &ServiceResponse);
    1292         AssertBreak(irc == kIOReturnSuccess);
    1293         AssertBreak(ServiceResponse == kSCSIServiceResponse_TASK_COMPLETE);
    1294 
    1295         if (TaskStatus == kSCSITaskStatus_GOOD)
    1296             rc = VINF_SUCCESS;
    1297         else if (   TaskStatus == kSCSITaskStatus_CHECK_CONDITION
    1298                  && pbSense)
    1299         {
    1300             memset(pbSense, 0, cbSense); /* lazy */
    1301             memcpy(pbSense, &SenseData, RT_MIN(sizeof(SenseData), cbSense));
    1302             rc = VERR_UNRESOLVED_ERROR;
    1303         }
    1304         /** @todo convert sense codes when caller doesn't wish to do this himself. */
    1305         /*else if (   TaskStatus == kSCSITaskStatus_CHECK_CONDITION
    1306                  && SenseData.ADDITIONAL_SENSE_CODE == 0x3A)
    1307             rc = VERR_MEDIA_NOT_PRESENT; */
    1308         else
    1309         {
    1310             rc = enmTxDir == PDMMEDIATXDIR_NONE
    1311                ? VERR_DEV_IO_ERROR
    1312                : enmTxDir == PDMMEDIATXDIR_FROM_DEVICE
    1313                ? VERR_READ_ERROR
    1314                : VERR_WRITE_ERROR;
    1315             if (pThis->cLogRelErrors++ < 10)
    1316                 LogRel(("DVD scsi error: cmd={%.*Rhxs} TaskStatus=%#x key=%#x ASC=%#x ASCQ=%#x (%Rrc)\n",
    1317                         cbCmd, pbCmd, TaskStatus, SenseData.SENSE_KEY, SenseData.ADDITIONAL_SENSE_CODE,
    1318                         SenseData.ADDITIONAL_SENSE_CODE_QUALIFIER, rc));
    1319         }
    1320     } while (0);
    1321 
    1322     (*ppScsiTaskI)->Release(ppScsiTaskI);
    1323 
    1324 # elif defined(RT_OS_FREEBSD)
    1325     int rc = VINF_SUCCESS;
    1326     int rcBSD = 0;
    1327     union ccb DeviceCCB;
    1328     union ccb *pDeviceCCB = &DeviceCCB;
    1329     u_int32_t fFlags;
    1330 
    1331     memset(pDeviceCCB, 0, sizeof(DeviceCCB));
    1332     pDeviceCCB->ccb_h.path_id   = pThis->ScsiBus;
    1333     pDeviceCCB->ccb_h.target_id = pThis->ScsiTargetID;
    1334     pDeviceCCB->ccb_h.target_lun = pThis->ScsiLunID;
    1335 
    1336     /* The SCSI INQUIRY command can't be passed through directly. */
    1337     if (pbCmd[0] == SCSI_INQUIRY)
    1338     {
    1339         pDeviceCCB->ccb_h.func_code = XPT_GDEV_TYPE;
    1340 
    1341         rcBSD = ioctl(RTFileToNative(pThis->hFileDevice), CAMIOCOMMAND, pDeviceCCB);
    1342         if (!rcBSD)
    1343         {
    1344             uint32_t cbCopy =   cbBuf < sizeof(struct scsi_inquiry_data)
    1345                               ? cbBuf
    1346                               : sizeof(struct scsi_inquiry_data);;
    1347             memcpy(pvBuf, &pDeviceCCB->cgd.inq_data, cbCopy);
    1348             memset(pbSense, 0, cbSense);
    1349 
    1350             if (pcbBuf)
    1351                 *pcbBuf = cbCopy;
    1352         }
    1353         else
    1354             rc = RTErrConvertFromErrno(errno);
    1355     }
    1356     else
    1357     {
    1358         /* Copy the CDB. */
    1359         memcpy(&pDeviceCCB->csio.cdb_io.cdb_bytes, pbCmd, cbCmd);
    1360 
    1361         /* Set direction. */
    1362         if (enmTxDir == PDMMEDIATXDIR_NONE)
    1363             fFlags = CAM_DIR_NONE;
    1364         else if (enmTxDir == PDMMEDIATXDIR_FROM_DEVICE)
    1365             fFlags = CAM_DIR_IN;
    1366         else
    1367             fFlags = CAM_DIR_OUT;
    1368 
    1369         fFlags |= CAM_DEV_QFRZDIS;
    1370 
    1371         cam_fill_csio(&pDeviceCCB->csio, 1, NULL, fFlags, MSG_SIMPLE_Q_TAG,
    1372                       (u_int8_t *)pvBuf, cbBuf, cbSense, cbCmd,
    1373                       cTimeoutMillies ? cTimeoutMillies : 30000/* timeout */);
    1374 
    1375         /* Send command */
    1376         rcBSD = ioctl(RTFileToNative(pThis->hFileDevice), CAMIOCOMMAND, pDeviceCCB);
    1377         if (!rcBSD)
    1378         {
    1379             switch (pDeviceCCB->ccb_h.status & CAM_STATUS_MASK)
    1380             {
    1381                 case CAM_REQ_CMP:
    1382                     rc = VINF_SUCCESS;
    1383                     break;
    1384                 case CAM_SEL_TIMEOUT:
    1385                     rc = VERR_DEV_IO_ERROR;
    1386                     break;
    1387                 case CAM_CMD_TIMEOUT:
    1388                     rc = VERR_TIMEOUT;
    1389                     break;
    1390                 default:
    1391                     rc = VERR_DEV_IO_ERROR;
    1392             }
    1393 
    1394             if (pcbBuf)
    1395                 *pcbBuf = cbBuf - pDeviceCCB->csio.resid;
    1396 
    1397             if (pbSense)
    1398                 memcpy(pbSense, &pDeviceCCB->csio.sense_data,
    1399                        cbSense - pDeviceCCB->csio.sense_resid);
    1400         }
    1401         else
    1402             rc = RTErrConvertFromErrno(errno);
    1403     }
    1404 # endif
    1405 
    1406     return rc;
    1407 }
    1408 #endif
    14091211
    14101212
  • trunk/src/VBox/Devices/Storage/DrvHostBase.h

    r64138 r64239  
    1919#define __HostDrvBase_h__
    2020
     21#include <iprt/assert.h>
     22#include <iprt/err.h>
     23#include <iprt/critsect.h>
     24#include <iprt/log.h>
    2125#include <VBox/cdefs.h>
     26#include <VBox/vmm/pdmdrv.h>
     27#include <VBox/vmm/pdmstorageifs.h>
    2228
    2329RT_C_DECLS_BEGIN
     
    184190DECLCALLBACK(void) DRVHostBaseDestruct(PPDMDRVINS pDrvIns);
    185191#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    186 DECLCALLBACK(int) DRVHostBaseScsiCmd(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
     192DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
    187193                                     void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies);
    188194#endif
  • trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp

    r63369 r64239  
    152152                0,0,0,0,0,0,0,0,0,0
    153153            };
    154             rc = DRVHostBaseScsiCmd(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     154            rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
    155155
    156156#elif defined(RT_OS_LINUX)
     
    242242        0,0,0,0,0,0,0,0,0,0
    243243    };
    244     int rc = DRVHostBaseScsiCmd(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     244    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
    245245
    246246#elif defined(RT_OS_LINUX)
     
    336336    uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    337337    uint8_t abSense[32];
    338     int rc2 = DRVHostBaseScsiCmd(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
     338    int rc2 = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
    339339    if (RT_SUCCESS(rc2))
    340340        fMediaPresent = true;
     
    357357#elif defined(RT_OS_LINUX)
    358358    bool fMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;
     359    bool fMediaChanged = false;
     360    if (pThis->fMediaPresent != fMediaPresent)
     361        fMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;
    359362
    360363#elif defined(RT_OS_SOLARIS)
     
    394397         * Poll for media change.
    395398         */
    396 #if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD)
    397         /* taken care of above. */
    398 #elif defined(RT_OS_LINUX)
    399         bool fMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;
    400 #else
    401 # error "Unsupported platform."
    402 #endif
    403399        if (fMediaChanged)
    404400        {
     
    432428    if (enmTxDir == PDMMEDIATXDIR_FROM_DEVICE)
    433429        memset(pvBuf, '\0', *pcbBuf); /* we got read size, but zero it anyway. */
    434     rc = DRVHostBaseScsiCmd(pThis, pbCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, pcbBuf, pabSense, cbSense, cTimeoutMillies);
     430    rc = drvHostBaseScsiCmdOs(pThis, pbCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, pcbBuf, pabSense, cbSense, cTimeoutMillies);
    435431    if (rc == VERR_UNRESOLVED_ERROR)
    436432        /* sense information set */
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