Changeset 64239 in vbox
- Timestamp:
- Oct 13, 2016 12:07:59 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 111248
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Makefile.kmk
r64062 r64239 194 194 endif 195 195 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 197 203 #VBoxDD_SOURCES.win += Storage/HBDMgmt-win.cpp #Disabled until remaining issues are sorted out 198 204 -
trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
r64093 r64239 176 176 0, 0, 0, 0, 0 177 177 }; 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); 179 179 180 180 off += cbRead32; … … 677 677 0,0,0,0,0,0,0,0,0,0 678 678 }; 679 DRVHostBaseScsiCmd(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);679 drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 680 680 } 681 681 return VINF_SUCCESS; … … 1148 1148 0,0,0,0,0,0,0,0,0 1149 1149 }; 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); 1151 1151 if (RT_SUCCESS(rc)) 1152 1152 { … … 1209 1209 #endif 1210 1210 } 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_DARWIN1250 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 do1257 {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 else1268 {1269 IOVirtualRange Range = { (IOVirtualAddress)pvBuf, cbBuf };1270 irc = (*ppScsiTaskI)->SetScatterGatherEntries(ppScsiTaskI, &Range, 1, cbBuf,1271 enmTxDir == PDMMEDIATXDIR_FROM_DEVICE1272 ? kSCSIDataTransfer_FromTargetToInitiator1273 : 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_CONDITION1298 && 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_CONDITION1306 && SenseData.ADDITIONAL_SENSE_CODE == 0x3A)1307 rc = VERR_MEDIA_NOT_PRESENT; */1308 else1309 {1310 rc = enmTxDir == PDMMEDIATXDIR_NONE1311 ? VERR_DEV_IO_ERROR1312 : enmTxDir == PDMMEDIATXDIR_FROM_DEVICE1313 ? VERR_READ_ERROR1314 : 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 ? cbBuf1346 : 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 else1354 rc = RTErrConvertFromErrno(errno);1355 }1356 else1357 {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 else1367 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 else1402 rc = RTErrConvertFromErrno(errno);1403 }1404 # endif1405 1406 return rc;1407 }1408 #endif1409 1211 1410 1212 -
trunk/src/VBox/Devices/Storage/DrvHostBase.h
r64138 r64239 19 19 #define __HostDrvBase_h__ 20 20 21 #include <iprt/assert.h> 22 #include <iprt/err.h> 23 #include <iprt/critsect.h> 24 #include <iprt/log.h> 21 25 #include <VBox/cdefs.h> 26 #include <VBox/vmm/pdmdrv.h> 27 #include <VBox/vmm/pdmstorageifs.h> 22 28 23 29 RT_C_DECLS_BEGIN … … 184 190 DECLCALLBACK(void) DRVHostBaseDestruct(PPDMDRVINS pDrvIns); 185 191 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) 186 DECL CALLBACK(int) DRVHostBaseScsiCmd(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,192 DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir, 187 193 void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies); 188 194 #endif -
trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
r63369 r64239 152 152 0,0,0,0,0,0,0,0,0,0 153 153 }; 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); 155 155 156 156 #elif defined(RT_OS_LINUX) … … 242 242 0,0,0,0,0,0,0,0,0,0 243 243 }; 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); 245 245 246 246 #elif defined(RT_OS_LINUX) … … 336 336 uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; 337 337 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); 339 339 if (RT_SUCCESS(rc2)) 340 340 fMediaPresent = true; … … 357 357 #elif defined(RT_OS_LINUX) 358 358 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; 359 362 360 363 #elif defined(RT_OS_SOLARIS) … … 394 397 * Poll for media change. 395 398 */ 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 #else401 # error "Unsupported platform."402 #endif403 399 if (fMediaChanged) 404 400 { … … 432 428 if (enmTxDir == PDMMEDIATXDIR_FROM_DEVICE) 433 429 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); 435 431 if (rc == VERR_UNRESOLVED_ERROR) 436 432 /* sense information set */
Note:
See TracChangeset
for help on using the changeset viewer.