Changeset 79492 in vbox
- Timestamp:
- Jul 3, 2019 11:41:12 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131756
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r79375 r79492 17 17 */ 18 18 19 20 19 /********************************************************************************************************************************* 21 20 * Header Files * … … 30 29 #include <VBox/log.h> 31 30 #include <iprt/assert.h> 31 #include <iprt/string.h> 32 32 #include "../build/VBoxDD.h" 33 33 #include <VBox/scsi.h> 34 #ifdef IN_RING3 35 # include <iprt/alloc.h> 36 # include <iprt/memcache.h> 37 # include <iprt/param.h> 38 # include <iprt/uuid.h> 39 #endif 40 #include "VBoxSCSI.h" 41 #include "VBoxDD.h" 34 42 35 43 /********************************************************************************************************************************* 36 44 * Structures and Typedefs * 37 45 *********************************************************************************************************************************/ 38 #define VIRTIOSCSI_MAX_ DEVICES 146 #define VIRTIOSCSI_MAX_TARGETS 1 39 47 40 48 /** 41 49 * Device Instance Data. 42 50 */ 43 typedef struct VIRTIOSCSI DEV51 typedef struct VIRTIOSCSITARGET 44 52 { 45 53 /** Pointer to the owning virtioScsi device instance. - R3 pointer */ 46 54 R3PTRTYPE(struct VIRTIOSCSI *) pVirtioScsiR3; 47 55 56 /** Pointer to the owning virtioScsi device instance. - RC pointer */ 57 RCPTRTYPE(struct VIRTIOSCSI *) pVirtioScsiRC; 58 48 59 /** Pointer to the attached driver's base interface. */ 49 60 R3PTRTYPE(PPDMIBASE) pDrvBase; … … 58 69 bool fPresent; 59 70 60 } VIRTIOSCSIDEV; 61 typedef VIRTIOSCSIDEV *PVIRTIOSCSIDEV; 71 /** Led interface. */ 72 PDMILEDPORTS ILed; 73 74 /** The status LED state for this device. */ 75 PDMLED Led; 76 77 } VIRTIOSCSITARGET; 78 typedef VIRTIOSCSITARGET *PVIRTIOSCSITARGET; 62 79 63 80 … … 71 88 { 72 89 73 VIRTIOSCSI DEV aDevInstances[VIRTIOSCSI_MAX_DEVICES];90 VIRTIOSCSITARGET aTargetInstances[VIRTIOSCSI_MAX_TARGETS]; 74 91 75 92 /** The PCI device structure. */ … … 89 106 RCPTRTYPE(PPDMQUEUE) pNotifierQueueRC; 90 107 108 /** The support driver session handle. */ 109 R3R0PTRTYPE(PSUPDRVSESSION) pSupDrvSession; 110 /** Worker thread. */ 111 R3PTRTYPE(PPDMTHREAD) pThreadWrk; 112 /** The event semaphore the processing thread waits on. */ 113 SUPSEMEVENT hEvtProcess; 114 91 115 /** The base interface. 92 116 * @todo use PDMDEVINS::IBase */ … … 118 142 { 119 143 /** Device this task is assigned to. */ 120 PVIRTIOSCSI DEVpTargetDevice;144 PVIRTIOSCSITARGET pTargetDevice; 121 145 /** The command control block from the guest. */ 122 146 // CCBU CCBGuest; … … 136 160 #define VIRTIOSCSI_SAVED_STATE_MINOR_VERSION 0x01 137 161 /*********************************************************************************************************************************/ 138 #if 0 162 163 /** 164 * virtio-scsi debugger info callback. 165 * 166 * @param pDevIns The device instance. 167 * @param pHlp The output helpers. 168 * @param pszArgs The arguments. 169 */ 170 static DECLCALLBACK(void) virtioScsiR3Info(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 171 { 172 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 173 bool fVerbose = false; 174 175 /* Parse arguments. */ 176 if (pszArgs) 177 fVerbose = strstr(pszArgs, "verbose") != NULL; 178 179 /* Show basic information. */ 180 pHlp->pfnPrintf(pHlp, "%s#%d: virtio-scsci ", 181 pDevIns->pReg->szName, 182 pDevIns->iInstance); 183 pHlp->pfnPrintf(pHlp, "GC=%RTbool R0=%RTbool\n", 184 !!pThis->fGCEnabled, !!pThis->fR0Enabled); 185 } 139 186 140 187 /** @callback_method_impl{FNSSMDEVLIVEEXEC} */ … … 180 227 return VINF_SUCCESS; 181 228 } 182 #endif183 184 229 185 230 /** … … 283 328 284 329 /** 285 * BusLogic debugger info callback.286 *287 * @param pDevIns The device instance.288 * @param pHlp The output helpers.289 * @param pszArgs The arguments.290 */291 static DECLCALLBACK(void) virtioScsiR3Info(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)292 {293 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI);294 bool fVerbose = false;295 296 /* Parse arguments. */297 if (pszArgs)298 fVerbose = strstr(pszArgs, "verbose") != NULL;299 300 /* Show basic information. */301 pHlp->pfnPrintf(pHlp, "%s#%d: virtio-scsci ",302 pDevIns->pReg->szName,303 pDevIns->iInstance);304 pHlp->pfnPrintf(pHlp, "GC=%RTbool R0=%RTbool\n",305 !!pThis->fGCEnabled, !!pThis->fR0Enabled);306 }307 308 /**309 330 * @callback_method_impl{FNPCIIOREGIONMAP} 310 331 */ … … 316 337 int rc = VINF_SUCCESS; 317 338 318 Log 2(("%s: registering MMIO area at GCPhysAddr=%RGp cb=%RGp\n", __FUNCTION__, GCPhysAddress, cb));339 LogFunc(("Register MMIO area at GCPhysAddr=%RGp cb=%RGp\n", GCPhysAddress, cb)); 319 340 320 341 Assert(cb >= 32); … … 329 350 return rc; 330 351 331 if (pThis->fR0Enabled)332 {333 rc = PDMDevHlpMMIORegisterR0(pDevIns, GCPhysAddress, cb, NIL_RTR0PTR /*pvUser*/,334 "virtioScsiMMIOWrite", "virtioScsiMMIORead");335 if (RT_FAILURE(rc))336 return rc;337 }338 339 352 if (pThis->fGCEnabled) 340 353 { … … 354 367 return rc; 355 368 356 if (pThis->fR0Enabled)357 {358 rc = PDMDevHlpIOPortRegisterR0(pDevIns, (RTIOPORT)GCPhysAddress, 32,359 0, "virtioScsiIOPortWrite", "virtioScsiIOPortRead", NULL, NULL, "virtio-scsi PCI");360 if (RT_FAILURE(rc))361 return rc;362 }363 364 369 if (pThis->fGCEnabled) 365 370 { … … 405 410 // pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3); 406 411 407 for (uint32_t i = 0; i < VIRTIOSCSI_MAX_ DEVICES; i++)412 for (uint32_t i = 0; i < VIRTIOSCSI_MAX_TARGETS; i++) 408 413 { 409 PVIRTIOSCSI DEV pDevice = &pThis->aDevInstances[i];410 p Device->pVirtioScsiR3 = pThis;;414 PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[i]; 415 pTarget->pVirtioScsiR3 = pThis;; 411 416 412 417 } 413 418 419 } 420 421 /** 422 * @interface_method_impl{PDMIBASE,pfnQueryInterface} 423 */ 424 static DECLCALLBACK(void *) virtioScsiR3DeviceQueryInterface(PPDMIBASE pInterface, const char *pszIID) 425 { 426 PVIRTIOSCSITARGET pTarget = RT_FROM_MEMBER(pInterface, VIRTIOSCSITARGET, IBase); 427 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pTarget->IBase); 428 // PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAPORT, &pTarget->IMediaPort); 429 // PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAEXPORT, &pTarget->IMediaExPort); 430 PDMIBASE_RETURN_INTERFACE(pszIID, PDMILEDPORTS, &pTarget->ILed); 431 return NULL; 432 } 433 434 /** 435 * Transmit queue consumer 436 * Queue a new async task. 437 * 438 * @returns Success indicator. 439 * If false the item will not be removed and the flushing will stop. 440 * @param pDevIns The device instance. 441 * @param pItem The item to consume. Upon return this item will be freed. 442 */ 443 static DECLCALLBACK(bool) virtioScsiR3NotifyQueueConsumer(PPDMDEVINS pDevIns, PPDMQUEUEITEMCORE pItem) 444 { 445 RT_NOREF(pItem); 446 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 447 448 int rc = SUPSemEventSignal(pThis->pSupDrvSession, pThis->hEvtProcess); 449 AssertRC(rc); 450 451 return true; 414 452 } 415 453 … … 486 524 487 525 LogFunc(("Register PCI device\n")); 488 489 526 rc = PDMDevHlpPCIRegister(pDevIns, &pThis->dev); 490 527 if (RT_FAILURE(rc)) 491 528 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register with PCI bus")); 492 529 530 LogFunc(("Register io region\n")); 493 531 rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0, 32, PCI_ADDRESS_SPACE_IO, devVirtioScsiR3MmioMap); 494 532 if (RT_FAILURE(rc)) 495 533 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register PCI I/O address space")); 496 534 LogFunc(("Register mmio region\n")); 497 535 rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1, 32, PCI_ADDRESS_SPACE_MEM, devVirtioScsiR3MmioMap); 498 536 if (RT_FAILURE(rc)) … … 512 550 #endif 513 551 514 515 #if 0516 552 /* Initialize task queue. */ 517 553 rc = PDMDevHlpQueueCreate(pDevIns, sizeof(PDMQUEUEITEMCORE), 5, 0, 518 buslogicR3NotifyQueueConsumer, true, "BusLogicTask", &pThis->pNotifierQueueR3);554 virtioScsiR3NotifyQueueConsumer, true, "VirtioTask", &pThis->pNotifierQueueR3); 519 555 if (RT_FAILURE(rc)) 520 556 return rc; … … 522 558 pThis->pNotifierQueueR0 = PDMQueueR0Ptr(pThis->pNotifierQueueR3); 523 559 pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3); 524 #endif525 560 526 561 /* Initialize per device instance. */ 527 for (unsigned i = 0; i < RT_ELEMENTS(pThis->aDevInstances); i++)562 for (unsigned i = 0; i < VIRTIOSCSI_MAX_TARGETS; i++) 528 563 { 529 PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[i]; 530 564 PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[i]; 531 565 char *pszName; 566 532 567 if (RTStrAPrintf(&pszName, "Device%u", i) < 0) 533 568 AssertLogRelFailedReturn(VERR_NO_MEMORY); 534 569 535 570 /* Initialize static parts of the device. */ 536 pDevice->iLUN = i; 537 pDevice->pVirtioScsiR3 = pThis; 538 539 LogFunc(("Attaching: Lun=%d, pszName=%s\n", pDevice->iLUN, pszName)); 571 pTarget->iLUN = i; 572 pTarget->pVirtioScsiR3 = pThis; 573 pTarget->pVirtioScsiRC = PDMINS_2_DATA_RCPTR(pDevIns); 574 pTarget->Led.u32Magic = PDMLED_MAGIC; 575 pTarget->IBase.pfnQueryInterface = virtioScsiR3DeviceQueryInterface; 576 /* pTarget->IMediaPort.pfnQueryDeviceLocation = virtioScsiR3QueryDeviceLocation; 577 pTarget->IMediaExPort.pfnIoReqCompleteNotify = virtioScsiR3IoReqCompleteNotify; 578 pTarget->IMediaExPort.pfnIoReqCopyFromBuf = virtioScsiR3IoReqCopyFromBuf; 579 pTarget->IMediaExPort.pfnIoReqCopyToBuf = virtioScsiR3IoReqCopyToBuf; 580 pTarget->IMediaExPort.pfnIoReqQueryBuf = NULL; 581 pTarget->IMediaExPort.pfnIoReqQueryDiscardRanges = NULL; 582 pTarget->IMediaExPort.pfnIoReqStateChanged = virtioScsiR3IoReqStateChanged; 583 pTarget->IMediaExPort.pfnMediumEjected = virtioScsiR3MediumEjected; 584 pTarget->ILed.pfnQueryStatusLed = virtioScsiR3DeviceQueryStatusLed; 585 */ 586 LogFunc(("Attaching: Lun=%d, pszName=%s\n", pTarget->iLUN, pszName)); 540 587 /* Attach SCSI driver. */ 541 rc = PDMDevHlpDriverAttach(pDevIns, pDevice->iLUN, &pDevice->IBase, &pDevice->pDrvBase, pszName); 588 AssertReturn(pTarget->iLUN < RT_ELEMENTS(pThis->aTargetInstances), VERR_PDM_NO_SUCH_LUN); 589 rc = PDMDevHlpDriverAttach(pDevIns, pTarget->iLUN, &pTarget->IBase, &pTarget->pDrvBase, pszName); 542 590 if (RT_SUCCESS(rc)) 543 p Device->fPresent = true;591 pTarget->fPresent = true; 544 592 else if (rc == VERR_PDM_NO_ATTACHED_DRIVER) 545 593 { 546 p Device->fPresent = false;547 p Device->pDrvBase = NULL;594 pTarget->fPresent = false; 595 pTarget->pDrvBase = NULL; 548 596 rc = VINF_SUCCESS; 549 597 Log(("virtio-scsi: no driver attached to device %s\n", pszName)); … … 555 603 } 556 604 } 605 606 #if 0 557 607 /* 558 608 * Attach status driver (optional). 559 609 */ 560 #if 0 610 561 611 PPDMIBASE pBase; 562 612 rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThis->IBase, &pBase, "Status Port"); … … 568 618 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot attach to status driver")); 569 619 } 620 #endif 570 621 571 622 rc = PDMDevHlpSSMRegisterEx(pDevIns, VIRTIOSCSI_SAVED_STATE_MINOR_VERSION, sizeof(*pThis), NULL, … … 575 626 if (RT_FAILURE(rc)) 576 627 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register save state handlers")); 577 #endif578 628 /* 579 629 * Register the debugger info callback. … … 601 651 RT_NOREF(fFlags); 602 652 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 603 PVIRTIOSCSI DEV pDevice = &pThis->aDevInstances[iLUN];653 PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[iLUN]; 604 654 605 655 Log(("%s:\n", __FUNCTION__)); … … 611 661 * Zero some important members. 612 662 */ 613 p Device->fPresent = false;614 p Device->pDrvBase = NULL;663 pTarget->fPresent = false; 664 pTarget->pDrvBase = NULL; 615 665 } 616 666 … … 629 679 { 630 680 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 631 PVIRTIOSCSI DEV pDevice = &pThis->aDevInstances[iLUN];681 PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[iLUN]; 632 682 int rc; 633 683 … … 639 689 640 690 /* the usual paranoia */ 641 AssertRelease(!p Device->pDrvBase);642 Assert(p Device->iLUN == iLUN);691 AssertRelease(!pTarget->pDrvBase); 692 Assert(pTarget->iLUN == iLUN); 643 693 644 694 /* … … 646 696 * required as well as optional. 647 697 */ 648 rc = PDMDevHlpDriverAttach(pDevIns, p Device->iLUN, &pDevice->IBase, &pDevice->pDrvBase, NULL);698 rc = PDMDevHlpDriverAttach(pDevIns, pTarget->iLUN, &pTarget->IBase, &pTarget->pDrvBase, NULL); 649 699 if (RT_SUCCESS(rc)) 650 p Device->fPresent = true;700 pTarget->fPresent = true; 651 701 else 652 AssertMsgFailed(("Failed to attach LUN#%d. rc=%Rrc\n", p Device->iLUN, rc));702 AssertMsgFailed(("Failed to attach LUN#%d. rc=%Rrc\n", pTarget->iLUN, rc)); 653 703 654 704 if (RT_FAILURE(rc)) 655 705 { 656 p Device->fPresent = false;657 p Device->pDrvBase = NULL;706 pTarget->fPresent = false; 707 pTarget->pDrvBase = NULL; 658 708 } 659 709 return rc; … … 683 733 ~0U, 684 734 /* cbInstance */ 685 sizeof(VIRTIOSCSI DEV),735 sizeof(VIRTIOSCSI), 686 736 /* pfnConstruct */ 687 737 devVirtioScsiConstruct,
Note:
See TracChangeset
for help on using the changeset viewer.