Changeset 79375 in vbox for trunk/src/VBox
- Timestamp:
- Jun 27, 2019 6:41:20 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r79336 r79375 36 36 * Structures and Typedefs * 37 37 *********************************************************************************************************************************/ 38 #define VIRTIOSCSI_MAX_DEVICES 1 638 #define VIRTIOSCSI_MAX_DEVICES 1 39 39 40 40 /** … … 54 54 /** LUN of the device. */ 55 55 RTUINT iLUN; 56 57 PDMIMEDIAPORT IMediaPort;58 /** Extended media port interface. */59 60 PDMIMEDIAEXPORT IMediaExPort;61 /** Led interface. */62 63 R3PTRTYPE(PPDMIMEDIA) pDrvMedia;64 /** Pointer to the attached driver's extended media interface. */65 66 R3PTRTYPE(PPDMIMEDIAEX) pDrvMediaEx;67 /** The status LED state for this device. */68 69 56 70 57 /** Flag whether device is present. */ … … 95 82 PPDMDEVINSRC pDevInsRC; 96 83 84 /** Queue to send tasks to R3. - HC ptr */ 85 R3PTRTYPE(PPDMQUEUE) pNotifierQueueR3; 86 /** Queue to send tasks to R3. - HC ptr */ 87 R0PTRTYPE(PPDMQUEUE) pNotifierQueueR0; 88 /** Queue to send tasks to R3. - RC ptr */ 89 RCPTRTYPE(PPDMQUEUE) pNotifierQueueRC; 90 97 91 /** The base interface. 98 92 * @todo use PDMDEVINS::IBase */ … … 112 106 RTGCPHYS MMIOBase; 113 107 108 /** Partner of ILeds. */ 109 R3PTRTYPE(PPDMILEDCONNECTORS) pLedsConnector; 110 114 111 } VIRTIOSCSI, *PVIRTIOSCSI; 115 112 … … 120 117 typedef struct VIRTIOSCSIREQ 121 118 { 122 /** PDM extended media interface I/O request hande. */123 PDMMEDIAEXIOREQ hIoReq;124 119 /** Device this task is assigned to. */ 125 PVIRTIOSCSIDEV pTargetDevice;120 PVIRTIOSCSIDEV pTargetDevice; 126 121 /** The command control block from the guest. */ 127 122 // CCBU CCBGuest; … … 140 135 141 136 #define VIRTIOSCSI_SAVED_STATE_MINOR_VERSION 0x01 142 143 137 /*********************************************************************************************************************************/ 144 138 #if 0 139 145 140 /** @callback_method_impl{FNSSMDEVLIVEEXEC} */ 146 141 static DECLCALLBACK(int) virtioScsiR3LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) … … 149 144 NOREF(pSSM); 150 145 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 146 LogFunc(("callback")); 151 147 NOREF(pThis); 152 148 return VINF_SSM_DONT_CALL_AGAIN; … … 160 156 NOREF(uVersion); 161 157 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 158 LogFunc(("callback")); 162 159 NOREF(pThis); 163 160 return VINF_SSM_DONT_CALL_AGAIN; … … 169 166 RT_NOREF(pSSM); 170 167 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 168 LogFunc(("callback")); 171 169 NOREF(pThis); 172 170 return VINF_SUCCESS; … … 178 176 RT_NOREF(pSSM); 179 177 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 178 LogFunc(("callback")); 180 179 NOREF(pThis); 181 180 return VINF_SUCCESS; … … 282 281 return rc; 283 282 } 283 284 /** 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 284 308 /** 285 309 * @callback_method_impl{FNPCIIOREGIONMAP} … … 355 379 356 380 357 358 359 360 381 /** 361 382 * @copydoc FNPDMDEVRESET … … 372 393 // { 373 394 // ASMAtomicWriteBool(&pThis->fSignalIdle, false); 374 // virtioScsiR3HwReset(pThis, true);375 395 // } 376 396 } … … 378 398 static DECLCALLBACK(void) virtioScsiR3Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta) 379 399 { 400 LogFunc(("Relocating virtio-scsci")); 380 401 RT_NOREF(offDelta); 381 402 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 382 NOREF(pThis); 383 384 // pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 403 404 pThis->pDevInsR3 = pDevIns; 385 405 // pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3); 386 // 387 // for (uint32_t i = 0; i < VIRTIOSCSI_MAX_DEVICES; i++) 388 // { 389 // PVIRTIOSCSIDEVICE pDevice = &pThis->aDevInstances[i]; 390 // 391 // pDevice->pvirtio-scsiRC = PDMINS_2_DATA_RCPTR(pDevIns); 392 // 393 // } 406 407 for (uint32_t i = 0; i < VIRTIOSCSI_MAX_DEVICES; i++) 408 { 409 PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[i]; 410 pDevice->pVirtioScsiR3 = pThis;; 411 412 } 394 413 395 414 } … … 472 491 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register with PCI bus")); 473 492 474 //rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0, 32, PCI_ADDRESS_SPACE_IO, devVirtioScsiR3MmioMap);475 //if (RT_FAILURE(rc))476 //return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register PCI I/O address space"));477 478 //rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1, 32, PCI_ADDRESS_SPACE_MEM, devVirtioScsiR3MmioMap);479 //if (RT_FAILURE(rc))480 //return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register PCI mmio address space"));481 NOREF(devVirtioScsiR3MmioMap); 493 rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0, 32, PCI_ADDRESS_SPACE_IO, devVirtioScsiR3MmioMap); 494 if (RT_FAILURE(rc)) 495 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register PCI I/O address space")); 496 497 rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1, 32, PCI_ADDRESS_SPACE_MEM, devVirtioScsiR3MmioMap); 498 if (RT_FAILURE(rc)) 499 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register PCI mmio address space")); 500 482 501 #if 0 483 502 if (fBootable) … … 491 510 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register BIOS I/O handlers")); 492 511 } 512 #endif 513 514 515 #if 0 516 /* Initialize task queue. */ 517 rc = PDMDevHlpQueueCreate(pDevIns, sizeof(PDMQUEUEITEMCORE), 5, 0, 518 buslogicR3NotifyQueueConsumer, true, "BusLogicTask", &pThis->pNotifierQueueR3); 519 if (RT_FAILURE(rc)) 520 return rc; 493 521 494 522 pThis->pNotifierQueueR0 = PDMQueueR0Ptr(pThis->pNotifierQueueR3); 495 523 pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3); 496 497 rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSectIntr, RT_SRC_POS, "virtio-scsi-Intr#%u", pDevIns->iInstance);498 if (RT_FAILURE(rc))499 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi: cannot create critical section"));500 501 /*502 * Create event semaphore and worker thread.503 */504 rc = SUPSemEventCreate(pThis->pSupDrvSession, &pThis->hEvtProcess);505 if (RT_FAILURE(rc))506 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,507 N_("virtio-scsi: Failed to create SUP event semaphore"));508 509 char szDevTag[20];510 RTStrPrintf(szDevTag, sizeof(szDevTag), "VIRTIOSCSI-%u", iInstance);511 512 rc = PDMDevHlpThreadCreate(pDevIns, &pThis->pThreadWrk, pThis, virtioScsiR3Worker,513 virtioScsiR3WorkerWakeUp, 0, RTTHREADTYPE_IO, szDevTag);514 if (RT_FAILURE(rc))515 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,516 N_("virtio-scsi: Failed to create worker thread %s"), szDevTag);517 524 #endif 518 525 … … 529 536 pDevice->iLUN = i; 530 537 pDevice->pVirtioScsiR3 = pThis; 531 LogFunc(("Attaching: Lun=%d, pszName=%s\n", pDevice->iLUN, pszName)); 538 539 LogFunc(("Attaching: Lun=%d, pszName=%s\n", pDevice->iLUN, pszName)); 532 540 /* Attach SCSI driver. */ 533 541 rc = PDMDevHlpDriverAttach(pDevIns, pDevice->iLUN, &pDevice->IBase, &pDevice->pDrvBase, pszName); 534 542 if (RT_SUCCESS(rc)) 535 {536 #if 0537 /* Query the media interface. */538 pDevice->pDrvMedia = PDMIBASE_QUERY_INTERFACE(pDevice->pDrvBase, PDMIMEDIA);539 AssertMsgReturn(VALID_PTR(pDevice->pDrvMedia),540 ("virtio-scsi configuration error: LUN#%d misses the basic media interface!\n", pDevice->iLUN),541 VERR_PDM_MISSING_INTERFACE);542 543 /* Get the extended media interface. */544 pDevice->pDrvMediaEx = PDMIBASE_QUERY_INTERFACE(pDevice->pDrvBase, PDMIMEDIAEX);545 AssertMsgReturn(VALID_PTR(pDevice->pDrvMediaEx),546 ("virtio-scsi configuration error: LUN#%d misses the extended media interface!\n", pDevice->iLUN),547 VERR_PDM_MISSING_INTERFACE);548 549 #endif550 rc = pDevice->pDrvMediaEx->pfnIoReqAllocSizeSet(pDevice->pDrvMediaEx, sizeof(VIRTIOSCSIREQ));551 if (RT_FAILURE(rc))552 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,553 N_("virtio-scsi configuration error: LUN#%u: Failed to set I/O request size!"),554 pDevice->iLUN);555 556 543 pDevice->fPresent = true; 557 }558 544 else if (rc == VERR_PDM_NO_ATTACHED_DRIVER) 559 545 { 560 546 pDevice->fPresent = false; 561 547 pDevice->pDrvBase = NULL; 562 // pDevice->pDrvMedia = NULL;563 // pDevice->pDrvMediaEx = NULL;564 548 rc = VINF_SUCCESS; 565 549 Log(("virtio-scsi: no driver attached to device %s\n", pszName)); … … 571 555 } 572 556 } 573 #if 0574 557 /* 575 558 * Attach status driver (optional). 576 559 */ 560 #if 0 577 561 PPDMIBASE pBase; 578 562 rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThis->IBase, &pBase, "Status Port"); 579 563 if (RT_SUCCESS(rc)) 580 { 581 // pThis->pLedsConnector = PDMIBASE_QUERY_INTERFACE(pBase, PDMILEDCONNECTORS); 582 // pThis->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pBase, PDMIMEDIANOTIFY); 583 } 564 pThis->pLedsConnector = PDMIBASE_QUERY_INTERFACE(pBase, PDMILEDCONNECTORS); 584 565 else if (rc != VERR_PDM_NO_ATTACHED_DRIVER) 585 566 { … … 594 575 if (RT_FAILURE(rc)) 595 576 return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register save state handlers")); 596 597 //#if 0 577 #endif 598 578 /* 599 579 * Register the debugger info callback. … … 603 583 PDMDevHlpDBGFInfoRegister(pDevIns, szTmp, "virtio-scsi HBA info", virtioScsiR3Info); 604 584 605 606 rc = virtioScsiR3HwReset(pThis, true);607 AssertMsgRC(rc, ("hardware reset of virtio-scsi host adapter failed rc=%Rrc\n", rc));608 #endif609 610 585 return rc; 586 } 587 588 589 /** 590 * Detach notification. 591 * 592 * One harddisk at one port has been unplugged. 593 * The VM is suspended at this point. 594 * 595 * @param pDevIns The device instance. 596 * @param iLUN The logical unit which is being detached. 597 * @param fFlags Flags, combination of the PDMDEVATT_FLAGS_* \#defines. 598 */ 599 static DECLCALLBACK(void) devVirtioScsiR3Detach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t fFlags) 600 { 601 RT_NOREF(fFlags); 602 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI); 603 PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[iLUN]; 604 605 Log(("%s:\n", __FUNCTION__)); 606 607 AssertMsg(fFlags & PDM_TACH_FLAGS_NOT_HOT_PLUG, 608 ("virtio-scsi: Device does not support hotplugging\n")); 609 610 /* 611 * Zero some important members. 612 */ 613 pDevice->fPresent = false; 614 pDevice->pDrvBase = NULL; 611 615 } 612 616 … … 636 640 /* the usual paranoia */ 637 641 AssertRelease(!pDevice->pDrvBase); 638 AssertRelease(!pDevice->pDrvMedia);639 AssertRelease(!pDevice->pDrvMediaEx);640 642 Assert(pDevice->iLUN == iLUN); 641 643 … … 646 648 rc = PDMDevHlpDriverAttach(pDevIns, pDevice->iLUN, &pDevice->IBase, &pDevice->pDrvBase, NULL); 647 649 if (RT_SUCCESS(rc)) 648 {649 /* Query the media interface. */650 pDevice->pDrvMedia = PDMIBASE_QUERY_INTERFACE(pDevice->pDrvBase, PDMIMEDIA);651 AssertMsgReturn(VALID_PTR(pDevice->pDrvMedia),652 ("virtio-scsi configuration error: LUN#%d misses the basic media interface!\n", pDevice->iLUN),653 VERR_PDM_MISSING_INTERFACE);654 655 /* Get the extended media interface. */656 pDevice->pDrvMediaEx = PDMIBASE_QUERY_INTERFACE(pDevice->pDrvBase, PDMIMEDIAEX);657 AssertMsgReturn(VALID_PTR(pDevice->pDrvMediaEx),658 ("virtio-scsi configuration error: LUN#%d misses the extended media interface!\n", pDevice->iLUN),659 VERR_PDM_MISSING_INTERFACE);660 661 rc = pDevice->pDrvMediaEx->pfnIoReqAllocSizeSet(pDevice->pDrvMediaEx, sizeof(VIRTIOSCSIREQ));662 AssertMsgRCReturn(rc, ("virtio-scsi configuration error: LUN#%u: Failed to set I/O request size!", pDevice->iLUN),663 rc);664 650 pDevice->fPresent = true; 665 }666 651 else 667 652 AssertMsgFailed(("Failed to attach LUN#%d. rc=%Rrc\n", pDevice->iLUN, rc)); … … 671 656 pDevice->fPresent = false; 672 657 pDevice->pDrvBase = NULL; 673 pDevice->pDrvMedia = NULL;674 pDevice->pDrvMediaEx = NULL;675 658 } 676 659 return rc; 677 }678 679 680 /**681 * Detach notification.682 *683 * One harddisk at one port has been unplugged.684 * The VM is suspended at this point.685 *686 * @param pDevIns The device instance.687 * @param iLUN The logical unit which is being detached.688 * @param fFlags Flags, combination of the PDMDEVATT_FLAGS_* \#defines.689 */690 static DECLCALLBACK(void) devVirtioScsiR3Detach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t fFlags)691 {692 RT_NOREF(fFlags);693 PVIRTIOSCSI pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI);694 PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[iLUN];695 696 Log(("%s:\n", __FUNCTION__));697 698 AssertMsg(fFlags & PDM_TACH_FLAGS_NOT_HOT_PLUG,699 ("virtio-scsi: Device does not support hotplugging\n"));700 701 /*702 * Zero some important members.703 */704 pDevice->fPresent = false;705 pDevice->pDrvBase = NULL;706 // pDevice->pDrvMedia = NULL;707 // pDevice->pDrvMediaEx = NULL;708 709 660 } 710 661
Note:
See TracChangeset
for help on using the changeset viewer.