VirtualBox

Changeset 79492 in vbox


Ignore:
Timestamp:
Jul 3, 2019 11:41:12 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131756
Message:

Code runs, shows up as PCI controller

File:
1 edited

Legend:

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

    r79375 r79492  
    1717 */
    1818
    19 
    2019/*********************************************************************************************************************************
    2120*   Header Files                                                                                                                 *
     
    3029#include <VBox/log.h>
    3130#include <iprt/assert.h>
     31#include <iprt/string.h>
    3232#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"
    3442
    3543/*********************************************************************************************************************************
    3644*   Structures and Typedefs                                                                                                      *
    3745*********************************************************************************************************************************/
    38 #define VIRTIOSCSI_MAX_DEVICES  1
     46#define VIRTIOSCSI_MAX_TARGETS  1
    3947
    4048/**
    4149 * Device Instance Data.
    4250 */
    43 typedef struct VIRTIOSCSIDEV
     51typedef struct VIRTIOSCSITARGET
    4452{
    4553    /** Pointer to the owning virtioScsi device instance. - R3 pointer */
    4654    R3PTRTYPE(struct VIRTIOSCSI *)  pVirtioScsiR3;
    4755
     56    /** Pointer to the owning virtioScsi device instance. - RC pointer */
     57    RCPTRTYPE(struct VIRTIOSCSI *)  pVirtioScsiRC;
     58
    4859    /** Pointer to the attached driver's base interface. */
    4960    R3PTRTYPE(PPDMIBASE)          pDrvBase;
     
    5869    bool                          fPresent;
    5970
    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;
     78typedef VIRTIOSCSITARGET *PVIRTIOSCSITARGET;
    6279
    6380
     
    7188{
    7289
    73     VIRTIOSCSIDEV                  aDevInstances[VIRTIOSCSI_MAX_DEVICES];
     90    VIRTIOSCSITARGET                  aTargetInstances[VIRTIOSCSI_MAX_TARGETS];
    7491
    7592    /** The PCI device structure. */
     
    89106    RCPTRTYPE(PPDMQUEUE)            pNotifierQueueRC;
    90107
     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
    91115    /** The base interface.
    92116     * @todo use PDMDEVINS::IBase  */
     
    118142{
    119143    /** Device this task is assigned to. */
    120     PVIRTIOSCSIDEV                 pTargetDevice;
     144    PVIRTIOSCSITARGET              pTargetDevice;
    121145    /** The command control block from the guest. */
    122146//    CCBU                           CCBGuest;
     
    136160#define VIRTIOSCSI_SAVED_STATE_MINOR_VERSION        0x01
    137161/*********************************************************************************************************************************/
    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 */
     170static 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}
    139186
    140187/** @callback_method_impl{FNSSMDEVLIVEEXEC}  */
     
    180227    return VINF_SUCCESS;
    181228}
    182 #endif
    183 
    184229
    185230/**
     
    283328
    284329/**
    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 /**
    309330 * @callback_method_impl{FNPCIIOREGIONMAP}
    310331 */
     
    316337    int   rc = VINF_SUCCESS;
    317338
    318     Log2(("%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));
    319340
    320341    Assert(cb >= 32);
     
    329350            return rc;
    330351
    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 
    339352        if (pThis->fGCEnabled)
    340353        {
     
    354367            return rc;
    355368
    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 
    364369        if (pThis->fGCEnabled)
    365370        {
     
    405410//    pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3);
    406411
    407     for (uint32_t i = 0; i < VIRTIOSCSI_MAX_DEVICES; i++)
     412    for (uint32_t i = 0; i < VIRTIOSCSI_MAX_TARGETS; i++)
    408413    {
    409         PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[i];
    410         pDevice->pVirtioScsiR3 = pThis;;
     414        PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[i];
     415        pTarget->pVirtioScsiR3 = pThis;;
    411416
    412417  }
    413418
     419}
     420
     421/**
     422 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
     423 */
     424static 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 */
     443static 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;
    414452}
    415453
     
    486524
    487525LogFunc(("Register PCI device\n"));
    488 
    489526    rc = PDMDevHlpPCIRegister(pDevIns, &pThis->dev);
    490527    if (RT_FAILURE(rc))
    491528        return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register with PCI bus"));
    492529
     530LogFunc(("Register io region\n"));
    493531    rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0, 32, PCI_ADDRESS_SPACE_IO, devVirtioScsiR3MmioMap);
    494532    if (RT_FAILURE(rc))
    495533        return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register PCI I/O address space"));
    496 
     534LogFunc(("Register mmio region\n"));
    497535    rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1, 32, PCI_ADDRESS_SPACE_MEM, devVirtioScsiR3MmioMap);
    498536    if (RT_FAILURE(rc))
     
    512550#endif
    513551
    514 
    515 #if 0
    516552    /* Initialize task queue. */
    517553    rc = PDMDevHlpQueueCreate(pDevIns, sizeof(PDMQUEUEITEMCORE), 5, 0,
    518                               buslogicR3NotifyQueueConsumer, true, "BusLogicTask", &pThis->pNotifierQueueR3);
     554                              virtioScsiR3NotifyQueueConsumer, true, "VirtioTask", &pThis->pNotifierQueueR3);
    519555    if (RT_FAILURE(rc))
    520556        return rc;
     
    522558    pThis->pNotifierQueueR0 = PDMQueueR0Ptr(pThis->pNotifierQueueR3);
    523559    pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3);
    524 #endif
    525560
    526561    /* 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++)
    528563    {
    529         PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[i];
    530 
     564        PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[i];
    531565        char *pszName;
     566
    532567        if (RTStrAPrintf(&pszName, "Device%u", i) < 0)
    533568            AssertLogRelFailedReturn(VERR_NO_MEMORY);
    534569
    535570        /* 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));
    540587        /* 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);
    542590        if (RT_SUCCESS(rc))
    543             pDevice->fPresent = true;
     591            pTarget->fPresent = true;
    544592        else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    545593        {
    546             pDevice->fPresent    = false;
    547             pDevice->pDrvBase    = NULL;
     594            pTarget->fPresent    = false;
     595            pTarget->pDrvBase    = NULL;
    548596            rc = VINF_SUCCESS;
    549597            Log(("virtio-scsi: no driver attached to device %s\n", pszName));
     
    555603        }
    556604    }
     605
     606#if 0
    557607    /*
    558608     * Attach status driver (optional).
    559609     */
    560 #if 0
     610
    561611    PPDMIBASE pBase;
    562612    rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThis->IBase, &pBase, "Status Port");
     
    568618        return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot attach to status driver"));
    569619    }
     620#endif
    570621
    571622    rc = PDMDevHlpSSMRegisterEx(pDevIns, VIRTIOSCSI_SAVED_STATE_MINOR_VERSION, sizeof(*pThis), NULL,
     
    575626    if (RT_FAILURE(rc))
    576627        return PDMDEV_SET_ERROR(pDevIns, rc, N_("virtio-scsi cannot register save state handlers"));
    577 #endif
    578628    /*
    579629     * Register the debugger info callback.
     
    601651    RT_NOREF(fFlags);
    602652    PVIRTIOSCSI       pThis = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI);
    603     PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[iLUN];
     653    PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[iLUN];
    604654
    605655    Log(("%s:\n", __FUNCTION__));
     
    611661     * Zero some important members.
    612662     */
    613     pDevice->fPresent    = false;
    614     pDevice->pDrvBase    = NULL;
     663    pTarget->fPresent    = false;
     664    pTarget->pDrvBase    = NULL;
    615665}
    616666
     
    629679{
    630680    PVIRTIOSCSI       pThis   = PDMINS_2_DATA(pDevIns, PVIRTIOSCSI);
    631     PVIRTIOSCSIDEV pDevice = &pThis->aDevInstances[iLUN];
     681    PVIRTIOSCSITARGET pTarget = &pThis->aTargetInstances[iLUN];
    632682    int rc;
    633683
     
    639689
    640690    /* the usual paranoia */
    641     AssertRelease(!pDevice->pDrvBase);
    642     Assert(pDevice->iLUN == iLUN);
     691    AssertRelease(!pTarget->pDrvBase);
     692    Assert(pTarget->iLUN == iLUN);
    643693
    644694    /*
     
    646696     * required as well as optional.
    647697     */
    648     rc = PDMDevHlpDriverAttach(pDevIns, pDevice->iLUN, &pDevice->IBase, &pDevice->pDrvBase, NULL);
     698    rc = PDMDevHlpDriverAttach(pDevIns, pTarget->iLUN, &pTarget->IBase, &pTarget->pDrvBase, NULL);
    649699    if (RT_SUCCESS(rc))
    650         pDevice->fPresent = true;
     700        pTarget->fPresent = true;
    651701    else
    652         AssertMsgFailed(("Failed to attach LUN#%d. rc=%Rrc\n", pDevice->iLUN, rc));
     702        AssertMsgFailed(("Failed to attach LUN#%d. rc=%Rrc\n", pTarget->iLUN, rc));
    653703
    654704    if (RT_FAILURE(rc))
    655705    {
    656         pDevice->fPresent    = false;
    657         pDevice->pDrvBase    = NULL;
     706        pTarget->fPresent    = false;
     707        pTarget->pDrvBase    = NULL;
    658708    }
    659709    return rc;
     
    683733    ~0U,
    684734    /* cbInstance */
    685     sizeof(VIRTIOSCSIDEV),
     735    sizeof(VIRTIOSCSI),
    686736    /* pfnConstruct */
    687737    devVirtioScsiConstruct,
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