VirtualBox

Changeset 84803 in vbox for trunk


Ignore:
Timestamp:
Jun 12, 2020 6:17:35 AM (5 years ago)
Author:
vboxsync
Message:

Network/DevVirtioNet_1_0.cpp: Rename API functions to refer to Virtq instead of Queue to be more Virtio like and disambiguate from other queue types. Temporarily enable build in Config.kmk to let the build machines catch errors

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Config.kmk

    r84771 r84803  
    465465# Enable the Virtio SCSI device.
    466466VBOX_WITH_VIRTIO_SCSI = 1
     467#TODO: PAUL! REMOVE THIS !
     468VBOX_WITH_VIRTIO_NET_1_0 = 1
    467469# HDA emulation is Intel HDA by default.
    468470VBOX_WITH_INTEL_HDA = 1
  • trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp

    r84775 r84803  
    6161#define VIRTIONET_SAVED_STATE_VERSION          UINT32_C(1)
    6262#define VIRTIONET_MAX_QPAIRS                   1
    63 #define VIRTIONET_MAX_QUEUES                   (VIRTIONET_MAX_QPAIRS * 2 + 1)
     63#define VIRTIONET_MAX_VIRTQS                   (VIRTIONET_MAX_QPAIRS * 2 + 1)
    6464#define VIRTIONET_MAX_FRAME_SIZE               65535 + 18     /**< Max IP pkt size + Ethernet header with VLAN tag  */
    6565#define VIRTIONET_MAC_FILTER_LEN               32
     
    6767#define VIRTIONET_PREALLOCATE_RX_SEG_COUNT     32
    6868
    69 #define VIRTQNAME(idxQueue)       (pThis->aQueues[idxQueue]->szName)
    70 #define CBVIRTQNAME(idxQueue)     RTStrNLen(VIRTQNAME(idxQueue), sizeof(VIRTQNAME(idxQueue)))
     69#define VIRTQNAME(idxVirtq)       (pThis->aVirtqs[idxVirtq]->szName)
     70#define CBVIRTQNAME(idxVirtq)     RTStrNLen(VIRTQNAME(idxVirtq), sizeof(VIRTQNAME(idxVirtq)))
    7171#define FEATURE_ENABLED(feature)  RT_BOOL(pThis->fNegotiatedFeatures & VIRTIONET_F_##feature)
    7272#define FEATURE_DISABLED(feature) (!FEATURE_ENABLED(feature))
    7373#define FEATURE_OFFERED(feature)  VIRTIONET_HOST_FEATURES_OFFERED & VIRTIONET_F_##feature
    7474
    75 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxQueue) \
    76             (virtioCoreQueueAvailCount(pDevIns, pVirtio, idxQueue) == 0)
     75#define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxVirtq) \
     76            (virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq) == 0)
    7777
    7878#define SET_LINK_UP(pState) \
     
    9090
    9191/* Macros to calculate queue specific index number VirtIO 1.0, 5.1.2 */
    92 #define IS_TX_QUEUE(n)    ((n) != CTRLQIDX && ((n) & 1))
    93 #define IS_RX_QUEUE(n)    ((n) != CTRLQIDX && !IS_TX_QUEUE(n))
    94 #define IS_CTRL_QUEUE(n)  ((n) == CTRLQIDX)
     92#define IS_TX_VIRTQ(n)    ((n) != CTRLQIDX && ((n) & 1))
     93#define IS_RX_VIRTQ(n)    ((n) != CTRLQIDX && !IS_TX_VIRTQ(n))
     94#define IS_CTRL_VIRTQ(n)  ((n) == CTRLQIDX)
    9595#define RXQIDX(qPairIdx)  (qPairIdx * 2)
    9696#define TXQIDX(qPairIdx)  (qPairIdx * 2 + 1)
     
    306306struct VIRTIONETWORKERR3;
    307307
    308 typedef struct VIRTIONETQUEUE
     308typedef struct VIRTIONETVIRTQ
    309309{
    310310    struct VIRTIONETWORKER         *pWorker;                    /**< Pointer to R0 worker struct                      */
     
    312312    uint16_t                       idx;                         /**< Index of this queue                              */
    313313    uint16_t                       align;
    314     char                           szName[VIRTIO_MAX_QUEUE_NAME_SIZE]; /**< Queue name                                */
    315     bool                           fCtlQueue;                   /**< If set this queue is the control queue           */
     314    char                           szName[VIRTIO_MAX_VIRTQ_NAME_SIZE]; /**< Virtq name                                */
     315    bool                           fCtlVirtq;                   /**< If set this queue is the control queue           */
    316316    bool                           fHasWorker;                  /**< If set this queue has an associated worker       */
    317317    bool                           fAttachedToVirtioCore;       /**< Set if queue attached to virtio core             */
    318318    uint8_t                        pad;
    319 } VIRTIONETQUEUE, *PVIRTIONETQUEUE;
     319} VIRTIONETVIRTQ, *PVIRTIONETVIRTQ;
    320320
    321321/**
     
    325325{
    326326    SUPSEMEVENT                     hEvtProcess;                /**< handle of associated sleep/wake-up semaphore      */
    327     PVIRTIONETQUEUE                 pQueue;                     /**< pointer to queue                                  */
     327    PVIRTIONETVIRTQ                 pVirtq;                     /**< pointer to queue                                  */
    328328    uint16_t                        idx;                        /**< Index of this worker                              */
    329329    bool volatile                   fSleeping;                  /**< Flags whether worker thread is sleeping or not    */
     
    341341{
    342342    R3PTRTYPE(PPDMTHREAD)           pThread;                    /**< pointer to worker thread's handle                 */
    343     PVIRTIONETQUEUE                 pQueue;                     /**< pointer to queue                                  */
     343    PVIRTIONETVIRTQ                 pVirtq;                     /**< pointer to queue                                  */
    344344    uint16_t                        idx;                        /**< Index of this worker                              */
    345345    uint16_t                        pad;
     
    362362
    363363    /** Per device-bound virtq worker-thread contexts (eventq slot unused) */
    364     VIRTIONETWORKER         aWorkers[VIRTIONET_MAX_QUEUES];
     364    VIRTIONETWORKER         aWorkers[VIRTIONET_MAX_VIRTQS];
    365365
    366366    /** Track which VirtIO queues we've attached to */
    367     VIRTIONETQUEUE          aQueues[VIRTIONET_MAX_QUEUES];
     367    VIRTIONETVIRTQ          aVirtqs[VIRTIONET_MAX_VIRTQS];
    368368
    369369    /** PDM device Instance name */
     
    377377
    378378    /** Number of virtqueues total (which includes each queue of each pair plus one control queue */
    379     uint16_t                cVirtQueues;
     379    uint16_t                cVirtVirtqs;
    380380
    381381    /** Number of worker threads (one for the control queue and one for each Tx queue) */
     
    485485
    486486    /** Per device-bound virtq worker-thread contexts (eventq slot unused) */
    487     VIRTIONETWORKERR3               aWorkers[VIRTIONET_MAX_QUEUES];
     487    VIRTIONETWORKERR3               aWorkers[VIRTIONET_MAX_VIRTQS];
    488488
    489489    /** The device instance.
     
    613613
    614614/**
    615  * @callback_method_impl{VIRTIOCORER0,pfnQueueNotified}
    616  */
    617 static DECLCALLBACK(void) virtioNetQueueNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     615 * @callback_method_impl{VIRTIOCORER0,pfnVirtqNotified}
     616 */
     617static DECLCALLBACK(void) virtioNetVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    618618{
    619619    RT_NOREF(pVirtio);
    620620    PVIRTIONET pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    621621
    622     PVIRTIONETQUEUE  pQueue = &pThis->aQueues[idxQueue];
    623     PVIRTIONETWORKER pWorker = pQueue->pWorker;
     622    PVIRTIONETVIRTQ  pVirtq = &pThis->aVirtqs[idxVirtq];
     623    PVIRTIONETWORKER pWorker = pVirtq->pWorker;
    624624
    625625#if defined (IN_RING3) && defined (LOG_ENABLED)
     
    627627#endif
    628628
    629     if (IS_RX_QUEUE(idxQueue))
    630     {
    631         uint16_t cBufsAvailable = virtioCoreQueueAvailCount(pDevIns, pVirtio, idxQueue);
     629    if (IS_RX_VIRTQ(idxVirtq))
     630    {
     631        uint16_t cBufsAvailable = virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq);
    632632
    633633        if (cBufsAvailable)
    634634        {
    635635            Log10Func(("%s %u empty bufs added to %s by guest (notifying leaf device)\n",
    636                         pThis->szInst, cBufsAvailable, pQueue->szName));
     636                        pThis->szInst, cBufsAvailable, pVirtq->szName));
    637637            virtioNetWakeupRxBufWaiter(pDevIns);
    638638        }
    639639        else
    640640            LogRel(("%s \n\n***WARNING: %s notified but no empty bufs added by guest! (skip notifying of leaf device)\n\n",
    641                     pThis->szInst, pQueue->szName));
    642     }
    643     else if (IS_TX_QUEUE(idxQueue) || IS_CTRL_QUEUE(idxQueue))
     641                    pThis->szInst, pVirtq->szName));
     642    }
     643    else if (IS_TX_VIRTQ(idxVirtq) || IS_CTRL_VIRTQ(idxVirtq))
    644644    {
    645645        /* Wake queue's worker thread up if sleeping (e.g. a Tx queue, or the control queue */
     
    648648            if (ASMAtomicReadBool(&pWorker->fSleeping))
    649649            {
    650                 Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pQueue->szName));
     650                Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pVirtq->szName));
    651651                int rc = PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
    652652                AssertRC(rc);
     
    654654            else
    655655            {
    656                 Log10Func(("%s %s has available buffers - worker already awake\n", pThis->szInst, pQueue->szName));
     656                Log10Func(("%s %s has available buffers - worker already awake\n", pThis->szInst, pVirtq->szName));
    657657            }
    658658        }
    659659        else
    660660        {
    661             Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pQueue->szName));
     661            Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pVirtq->szName));
    662662        }
    663663    }
    664664    else
    665         LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pQueue->szName, idxQueue));
     665        LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pVirtq->szName, idxVirtq));
    666666}
    667667
     
    677677
    678678    Log10Func(("%s\n", pThis->szInst));
     679    RT_NOREF(pThis);
    679680
    680681    return PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
     
    684685DECLINLINE(void) virtioNetR3SetVirtqNames(PVIRTIONET pThis)
    685686{
    686     RTStrCopy(pThis->aQueues[CTRLQIDX].szName, VIRTIO_MAX_QUEUE_NAME_SIZE, "controlq");
     687    RTStrCopy(pThis->aVirtqs[CTRLQIDX].szName, VIRTIO_MAX_VIRTQ_NAME_SIZE, "controlq");
    687688    for (uint16_t qPairIdx = 0; qPairIdx < pThis->cVirtqPairs; qPairIdx++)
    688689    {
    689         RTStrPrintf(pThis->aQueues[RXQIDX(qPairIdx)].szName, VIRTIO_MAX_QUEUE_NAME_SIZE, "receiveq<%d>",  qPairIdx);
    690         RTStrPrintf(pThis->aQueues[TXQIDX(qPairIdx)].szName, VIRTIO_MAX_QUEUE_NAME_SIZE, "transmitq<%d>", qPairIdx);
     690        RTStrPrintf(pThis->aVirtqs[RXQIDX(qPairIdx)].szName, VIRTIO_MAX_VIRTQ_NAME_SIZE, "receiveq<%d>",  qPairIdx);
     691        RTStrPrintf(pThis->aVirtqs[TXQIDX(qPairIdx)].szName, VIRTIO_MAX_VIRTQ_NAME_SIZE, "transmitq<%d>", qPairIdx);
    691692    }
    692693}
     
    813814    bool fState    = pszArgs && (*pszArgs == 's' || *pszArgs == 'S'); /* "state"    */
    814815    bool fPointers = pszArgs && (*pszArgs == 'p' || *pszArgs == 'P'); /* "pointers" */
    815     bool fQueues   = pszArgs && (*pszArgs == 'q' || *pszArgs == 'Q'); /* "queues    */
     816    bool fVirtqs   = pszArgs && (*pszArgs == 'q' || *pszArgs == 'Q'); /* "queues    */
    816817
    817818    /* Show basic information. */
     
    836837
    837838    /* Show queues (and associate worker info if applicable) */
    838     if (fAll || fQueues)
    839     {
    840         pHlp->pfnPrintf(pHlp, "Queue information:\n\n");
    841 
    842         for (int idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
     839    if (fAll || fVirtqs)
     840    {
     841        pHlp->pfnPrintf(pHlp, "Virtq information:\n\n");
     842
     843        for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    843844        {
    844             PVIRTIONETQUEUE pQueue = &pThis->aQueues[idxQueue];
    845 
    846             if (pQueue->fHasWorker)
     845            PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];
     846
     847            if (pVirtq->fHasWorker)
    847848            {
    848                 PVIRTIONETWORKER pWorker = pQueue->pWorker;
    849                 PVIRTIONETWORKERR3 pWorkerR3 = pQueue->pWorkerR3;
     849                PVIRTIONETWORKER pWorker = pVirtq->pWorker;
     850                PVIRTIONETWORKERR3 pWorkerR3 = pVirtq->pWorkerR3;
    850851
    851852                if (pWorker->fAssigned)
    852853                {
    853854                    pHlp->pfnPrintf(pHlp, "    %-15s (pThread: %p %s) ",
    854                         pQueue->szName,
     855                        pVirtq->szName,
    855856                        pWorkerR3->pThread,
    856857                        virtioNetThreadStateName(pWorkerR3->pThread));
    857                     if (pQueue->fAttachedToVirtioCore)
     858                    if (pVirtq->fAttachedToVirtioCore)
    858859                    {
    859860                        pHlp->pfnPrintf(pHlp, "worker: ");
     
    868869            else
    869870            {
    870                 pHlp->pfnPrintf(pHlp, "    %-15s (INetworkDown's thread) %s", pQueue->szName,
    871                     pQueue->fAttachedToVirtioCore  ? "" : "not attached to virtio core");
     871                pHlp->pfnPrintf(pHlp, "    %-15s (INetworkDown's thread) %s", pVirtq->szName,
     872                    pVirtq->fAttachedToVirtioCore  ? "" : "not attached to virtio core");
    872873            }
    873874            pHlp->pfnPrintf(pHlp, "\n");
    874             virtioCoreR3QueueInfo(pDevIns, pHlp, pszArgs, idxQueue);
     875            virtioCoreR3VirtqInfo(pDevIns, pHlp, pszArgs, idxVirtq);
    875876            pHlp->pfnPrintf(pHlp, "    ---------------------------------------------------------------------\n");
    876877            pHlp->pfnPrintf(pHlp, "\n");
     
    900901        pHlp->pfnPrintf(pHlp, "    uDeviceStatus ............. 0x%x\n", pThis->Virtio.uDeviceStatus);
    901902        pHlp->pfnPrintf(pHlp, "    cVirtqPairs .,............. %d\n",  pThis->cVirtqPairs);
    902         pHlp->pfnPrintf(pHlp, "    cVirtQueues .,............. %d\n",  pThis->cVirtQueues);
     903        pHlp->pfnPrintf(pHlp, "    cVirtVirtqs .,............. %d\n",  pThis->cVirtVirtqs);
    903904        pHlp->pfnPrintf(pHlp, "    cWorkers .................. %d\n",  pThis->cWorkers);
    904905        pHlp->pfnPrintf(pHlp, "    MMIO mapping name ......... %d\n",  pThisCC->Virtio.pcszMmioName);
     
    11351136    pHlp->pfnSSMGetU64(     pSSM, &pThis->fNegotiatedFeatures);
    11361137
    1137     pHlp->pfnSSMGetU16(     pSSM, &pThis->cVirtQueues);
     1138    pHlp->pfnSSMGetU16(     pSSM, &pThis->cVirtVirtqs);
    11381139    pHlp->pfnSSMGetU16(     pSSM, &pThis->cWorkers);
    11391140
    1140     for (int idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
    1141         pHlp->pfnSSMGetBool(pSSM, &pThis->aQueues[idxQueue].fAttachedToVirtioCore);
     1141    for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     1142        pHlp->pfnSSMGetBool(pSSM, &pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore);
    11421143
    11431144    int rc;
     
    11991200    {
    12001201        PVIRTIONETWORKER pWorker = &pThis->aWorkers[idxWorker];
    1201         PVIRTIONETQUEUE  pQueue  = pWorker->pQueue;
    1202         if (pQueue->fAttachedToVirtioCore)
     1202        PVIRTIONETVIRTQ  pVirtq  = pWorker->pVirtq;
     1203        if (pVirtq->fAttachedToVirtioCore)
    12031204        {
    1204             Log7Func(("%s Waking %s worker.\n", pThis->szInst, pQueue->szName));
     1205            Log7Func(("%s Waking %s worker.\n", pThis->szInst, pVirtq->szName));
    12051206            rc = PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
    12061207            AssertRCReturn(rc, rc);
     
    12241225    pHlp->pfnSSMPutU64(     pSSM, pThis->fNegotiatedFeatures);
    12251226
    1226     pHlp->pfnSSMPutU16(     pSSM, pThis->cVirtQueues);
     1227    pHlp->pfnSSMPutU16(     pSSM, pThis->cVirtVirtqs);
    12271228    pHlp->pfnSSMPutU16(     pSSM, pThis->cWorkers);
    12281229
    1229     for (int idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
    1230         pHlp->pfnSSMPutBool(pSSM, pThis->aQueues[idxQueue].fAttachedToVirtioCore);
     1230    for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     1231        pHlp->pfnSSMPutBool(pSSM, pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore);
    12311232
    12321233    /* Save config area */
     
    14701471 * @thread  RX
    14711472 */
    1472 static int virtioNetR3CheckRxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETQUEUE pRxQueue)
     1473static int virtioNetR3CheckRxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETVIRTQ pRxVirtq)
    14731474{
    14741475    int rc = VERR_INVALID_STATE;
     
    14771478        Log8Func(("%s No Rx bufs available. (VirtIO core not ready)\n", pThis->szInst));
    14781479
    1479     else if (!virtioCoreIsQueueEnabled(&pThis->Virtio, pRxQueue->idx))
    1480         Log8Func(("%s No Rx bufs available. (%s not enabled)\n",  pThis->szInst, pRxQueue->szName));
    1481 
    1482     else if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pRxQueue->idx))
    1483         Log8Func(("%s No Rx bufs available. (%s empty)\n",  pThis->szInst, pRxQueue->szName));
     1480    else if (!virtioCoreIsVirtqEnabled(&pThis->Virtio, pRxVirtq->idx))
     1481        Log8Func(("%s No Rx bufs available. (%s not enabled)\n",  pThis->szInst, pRxVirtq->szName));
     1482
     1483    else if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pRxVirtq->idx))
     1484        Log8Func(("%s No Rx bufs available. (%s empty)\n",  pThis->szInst, pRxVirtq->szName));
    14841485
    14851486    else
    14861487    {
    1487         Log8Func(("%s Empty guest buffers available in %s\n",  pThis->szInst,pRxQueue->szName));
     1488        Log8Func(("%s Empty guest buffers available in %s\n",  pThis->szInst,pRxVirtq->szName));
    14881489        rc = VINF_SUCCESS;
    14891490    }
    1490     virtioCoreQueueNotifyEnable(&pThis->Virtio, pRxQueue->idx, rc == VERR_INVALID_STATE /* fEnable */);
     1491    virtioCoreVirtqNotifyEnable(&pThis->Virtio, pRxVirtq->idx, rc == VERR_INVALID_STATE /* fEnable */);
    14911492    return rc;
    14921493}
    14931494
    1494 static bool virtioNetR3RxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETQUEUE *pRxQueue)
    1495 {
    1496     for (int idxQueuePair = 0; idxQueuePair < pThis->cVirtqPairs; idxQueuePair++)
    1497     {
    1498         PVIRTIONETQUEUE pThisRxQueue = &pThis->aQueues[RXQIDX(idxQueuePair)];
    1499         if (RT_SUCCESS(virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pThisRxQueue)))
     1495static bool virtioNetR3RxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETVIRTQ *pRxVirtq)
     1496{
     1497    for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)
     1498    {
     1499        PVIRTIONETVIRTQ pThisRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     1500        if (RT_SUCCESS(virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pThisRxVirtq)))
    15001501        {
    1501             if (pRxQueue)
    1502                 *pRxQueue = pThisRxQueue;
     1502            if (pRxVirtq)
     1503                *pRxVirtq = pThisRxVirtq;
    15031504            return true;
    15041505        }
     
    15161517    PVIRTIONET   pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    15171518
    1518     if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxQueue */))
     1519    if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxVirtq */))
    15191520    {
    15201521        Log10Func(("%s Rx bufs now available, releasing waiter...\n", pThis->szInst));
     
    15301531
    15311532    do {
    1532         if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxQueue */))
     1533        if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxVirtq */))
    15331534        {
    15341535            Log10Func(("%s Rx bufs now available, releasing waiter...\n", pThis->szInst));
     
    17301731                                       VIRTIONET_PKT_HDR_T *rxPktHdr, uint16_t cSegsAllocated,
    17311732                                       PRTSGBUF pVirtSegBufToGuest, PRTSGSEG paVirtSegsToGuest,
    1732                                        PVIRTIONETQUEUE pRxQueue)
     1733                                       PVIRTIONETVIRTQ pRxVirtq)
    17331734{
    17341735    uint8_t fAddPktHdr = true;
     
    17401741        PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    17411742
    1742         int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, pRxQueue->idx, &pDescChain, true);
     1743        int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, pRxVirtq->idx, &pDescChain, true);
    17431744        AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc);
    17441745
     
    18011802            Log7Func(("Send Rx pkt to guest...\n"));
    18021803            STAM_PROFILE_START(&pThis->StatReceiveStore, a);
    1803             virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, pRxQueue->idx,
     1804            virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, pRxVirtq->idx,
    18041805                                 pVirtSegBufToGuest, pDescChain, true /* fFence */);
    18051806            STAM_PROFILE_STOP(&pThis->StatReceiveStore, a);
     
    18251826                  rc);
    18261827
    1827     virtioCoreQueueSync(pDevIns, &pThis->Virtio, pRxQueue->idx);
     1828    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, pRxVirtq->idx);
    18281829
    18291830    return VINF_SUCCESS;
     
    18431844 * @param   cb              Number of bytes available in the buffer.
    18441845 * @param   pGso            Pointer to Global Segmentation Offload structure
    1845  * @param   idxRxQueue      Rx queue to work with
     1846 * @param   idxRxVirtq      Rx queue to work with
    18461847 * @thread  RX
    18471848 */
    18481849static int virtioNetR3HandleRxPacket(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    1849                                 const void *pvBuf, size_t cb, PCPDMNETWORKGSO pGso, PVIRTIONETQUEUE pRxQueue)
     1850                                const void *pvBuf, size_t cb, PCPDMNETWORKGSO pGso, PVIRTIONETVIRTQ pRxVirtq)
    18501851{
    18511852    RT_NOREF(pThisCC);
     
    18981899
    18991900    int rc = virtioNetR3CopyRxPktToGuest(pDevIns, pThis, pvBuf, cb, &rxPktHdr, cSegsAllocated,
    1900                                         pVirtSegBufToGuest, paVirtSegsToGuest, pRxQueue);
     1901                                        pVirtSegBufToGuest, paVirtSegsToGuest, pRxVirtq);
    19011902
    19021903    RTMemFree(paVirtSegsToGuest);
     
    19601961              selection algorithm feasible or even necessary to prevent starvation? */
    19611962
    1962     for (int idxQueuePair = 0; idxQueuePair < pThis->cVirtqPairs; idxQueuePair++)
    1963     {
    1964 
    1965         PVIRTIONETQUEUE pRxQueue = &pThis->aQueues[RXQIDX(idxQueuePair)];
    1966         if (RT_SUCCESS(!virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pRxQueue)))
     1963    for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)
     1964    {
     1965
     1966        PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     1967        if (RT_SUCCESS(!virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pRxVirtq)))
    19671968        {
    19681969            /* Drop packets if VM is not running or cable is disconnected. */
     
    19761977            if (virtioNetR3AddressFilter(pThis, pvBuf, cb))
    19771978            {
    1978                 rc = virtioNetR3HandleRxPacket(pDevIns, pThis, pThisCC, pvBuf, cb, pGso, pRxQueue);
     1979                rc = virtioNetR3HandleRxPacket(pDevIns, pThis, pThisCC, pvBuf, cb, pGso, pRxVirtq);
    19791980                STAM_REL_COUNTER_ADD(&pThis->StatReceiveBytes, cb);
    19801981            }
     
    22822283    RTSgBufInit(pReturnSegBuf, paReturnSegs, cSegs);
    22832284
    2284     virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pDescChain, true /* fFence */);
    2285     virtioCoreQueueSync(pDevIns, &pThis->Virtio, CTRLQIDX);
     2285    virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pDescChain, true /* fFence */);
     2286    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, CTRLQIDX);
    22862287
    22872288    for (int i = 0; i < cSegs; i++)
     
    23942395
    23952396static void virtioNetR3TransmitPendingPackets(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    2396                                          PVIRTIONETQUEUE pTxQueue, bool fOnWorkerThread)
     2397                                         PVIRTIONETVIRTQ pTxVirtq, bool fOnWorkerThread)
    23972398{
    23982399
     
    24322433    }
    24332434
    2434     int cPkts = virtioCoreQueueAvailCount(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx);
     2435    int cPkts = virtioCoreVirtqAvailCount(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx);
    24352436    if (!cPkts)
    24362437    {
    2437         LogFunc(("%s No packets to send found on %s\n", pThis->szInst, pTxQueue->szName));
     2438        LogFunc(("%s No packets to send found on %s\n", pThis->szInst, pTxVirtq->szName));
    24382439
    24392440        if (pDrv)
     
    24492450    int rc;
    24502451    PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    2451     while ((rc = virtioCoreR3QueuePeek(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx, &pDescChain)) == VINF_SUCCESS)
    2452     {
    2453         Log10Func(("%s fetched descriptor chain from %s\n", pThis->szInst, pTxQueue->szName));
     2452    while ((rc = virtioCoreR3VirtqPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, &pDescChain)) == VINF_SUCCESS)
     2453    {
     2454        Log10Func(("%s fetched descriptor chain from %s\n", pThis->szInst, pTxVirtq->szName));
    24542455
    24552456        PVIRTIOSGBUF pSgPhysSend = pDescChain->pSgPhysSend;
     
    25352536
    25362537            /* Remove this descriptor chain from the available ring */
    2537             virtioCoreR3QueueSkip(pVirtio, pTxQueue->idx);
     2538            virtioCoreR3VirtqSkip(pVirtio, pTxVirtq->idx);
    25382539
    25392540            /* No data to return to guest, but call is needed put elem (e.g. desc chain) on used ring */
    2540             virtioCoreR3QueuePut(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx, NULL, pDescChain, true /* fFence */);
     2541            virtioCoreR3VirtqPut(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, NULL, pDescChain, true /* fFence */);
    25412542
    25422543            /* Update used ring idx and notify guest that we've transmitted the data it sent */
    2543             virtioCoreQueueSync(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx);
     2544            virtioCoreVirtqSync(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx);
    25442545        }
    25452546
     
    25642565    PPDMDEVINS      pDevIns = pThisCC->pDevIns;
    25652566    PVIRTIONET      pThis   = PDMDEVINS_2_DATA(pThisCC->pDevIns, PVIRTIONET);
    2566     PVIRTIONETQUEUE pTxQueue  = &pThis->aQueues[TXQIDX(0)];
     2567    PVIRTIONETVIRTQ pTxVirtq  = &pThis->aVirtqs[TXQIDX(0)];
    25672568    STAM_COUNTER_INC(&pThis->StatTransmitByNetwork);
    25682569
    25692570    /** @todo If we ever start using more than one Rx/Tx queue pair, is a random queue
    25702571          selection algorithm feasible or even necessary */
    2571     virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pTxQueue, true /*fOnWorkerThread*/);
     2572    virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pTxVirtq, true /*fOnWorkerThread*/);
    25722573}
    25732574
     
    27452746static int virtioNetR3CreateOneWorkerThread(PPDMDEVINS pDevIns, PVIRTIONET pThis, uint16_t idxWorker,
    27462747                                            PVIRTIONETWORKER pWorker, PVIRTIONETWORKERR3 pWorkerR3,
    2747                                             PVIRTIONETQUEUE pQueue)
     2748                                            PVIRTIONETVIRTQ pVirtq)
    27482749{
    27492750    Log10Func(("%s\n", pThis->szInst));
     2751    RT_NOREF(pThis);
    27502752
    27512753    int rc = PDMDevHlpSUPSemEventCreate(pDevIns, &pWorker->hEvtProcess);
     
    27552757                                   N_("DevVirtioNET: Failed to create SUP event semaphore"));
    27562758
    2757     LogFunc(("creating thread for queue %s\n", pQueue->szName));
     2759    LogFunc(("creating thread for queue %s\n", pVirtq->szName));
    27582760
    27592761    rc = PDMDevHlpThreadCreate(pDevIns, &pWorkerR3->pThread,
    27602762                               (void *)pWorker, virtioNetR3WorkerThread,
    2761                                virtioNetR3WakeupWorker, 0, RTTHREADTYPE_IO, pQueue->szName);
     2763                               virtioNetR3WakeupWorker, 0, RTTHREADTYPE_IO, pVirtq->szName);
    27622764    if (RT_FAILURE(rc))
    27632765        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
    2764                                    N_("Error creating thread for Virtual Queue %s\n"), pQueue->idx);
    2765 
    2766     pWorker->pQueue    = pWorkerR3->pQueue = pQueue;
    2767     pWorker->idx       = pWorkerR3->idx    = idxWorker;
    2768     pQueue->pWorker    = pWorker;
    2769     pQueue->pWorkerR3  = pWorkerR3;
     2766                                   N_("Error creating thread for Virtual Virtq %s\n"), pVirtq->idx);
     2767
     2768    pWorker->pVirtq    = pWorkerR3->pVirtq   = pVirtq;
     2769    pWorker->idx       = pWorkerR3->idx      = idxWorker;
     2770    pVirtq->pWorker    = pWorker;
     2771    pVirtq->pWorkerR3  = pWorkerR3;
    27702772    pWorker->fAssigned = true;
    27712773
    2772     LogFunc(("%s pThread: %p\n", pQueue->szName, pWorkerR3->pThread));
     2774    LogFunc(("%s pThread: %p\n", pVirtq->szName, pWorkerR3->pThread));
    27732775
    27742776    return rc;
     
    27822784    Log10Func(("%s\n", pThis->szInst));
    27832785
    2784     PVIRTIONETQUEUE pCtlQueue = &pThis->aQueues[CTRLQIDX];
     2786    PVIRTIONETVIRTQ pCtlVirtq = &pThis->aVirtqs[CTRLQIDX];
    27852787    int rc = virtioNetR3CreateOneWorkerThread(pDevIns, pThis, CTRLQIDX /* idxWorker */,
    2786                                               &pThis->aWorkers[CTRLWIDX], &pThisCC->aWorkers[CTRLWIDX], pCtlQueue);
     2788                                              &pThis->aWorkers[CTRLWIDX], &pThisCC->aWorkers[CTRLWIDX], pCtlVirtq);
    27872789    AssertRCReturn(rc, rc);
    27882790
    2789     pCtlQueue->fHasWorker = true;
     2791    pCtlVirtq->fHasWorker = true;
    27902792
    27912793    uint16_t idxWorker = CTRLWIDX + 1;
    2792     for (uint16_t idxQueuePair = 0; idxQueuePair < pThis->cVirtqPairs; idxQueuePair++, idxWorker++)
    2793     {
    2794         PVIRTIONETQUEUE pTxQueue = &pThis->aQueues[TXQIDX(idxQueuePair)];
    2795         PVIRTIONETQUEUE pRxQueue = &pThis->aQueues[RXQIDX(idxQueuePair)];
     2794    for (uint16_t idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++, idxWorker++)
     2795    {
     2796        PVIRTIONETVIRTQ pTxVirtq = &pThis->aVirtqs[TXQIDX(idxVirtqPair)];
     2797        PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
    27962798
    27972799        rc = virtioNetR3CreateOneWorkerThread(pDevIns, pThis, idxWorker, &pThis->aWorkers[idxWorker],
    2798                                               &pThisCC->aWorkers[idxWorker], pTxQueue);
     2800                                              &pThisCC->aWorkers[idxWorker], pTxVirtq);
    27992801        AssertRCReturn(rc, rc);
    28002802
    2801         pTxQueue->fHasWorker = true;
    2802         pRxQueue->fHasWorker = false;
    2803     }
    2804     pThis->cWorkers = pThis->cVirtqPairs + 1;
     2803        pTxVirtq->fHasWorker = true;
     2804        pRxVirtq->fHasWorker = false;
     2805    }
     2806    pThis->cWorkers = pThis->cVirtqPairs + 1 /* Control virtq */;
    28052807    return rc;
    28062808}
     
    28142816    PVIRTIONETCC       pThisCC   = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIONETCC);
    28152817    PVIRTIONETWORKER   pWorker   = (PVIRTIONETWORKER)pThread->pvUser;
    2816     PVIRTIONETQUEUE    pQueue    = pWorker->pQueue;
     2818    PVIRTIONETVIRTQ    pVirtq    = pWorker->pVirtq;
    28172819
    28182820    if (pThread->enmState == PDMTHREADSTATE_INITIALIZING)
    28192821        return VINF_SUCCESS;
    28202822
    2821     LogFunc(("%s worker thread started for %s\n", pThis->szInst, pQueue->szName));
    2822 
    2823  /** @todo Race w/guest enabling/disabling guest notifications cyclically.
    2824            See BugRef #8651, Comment #82 */
    2825 
    2826     virtioCoreQueueNotifyEnable(&pThis->Virtio, pQueue->idx, true /* fEnable */);
     2823    LogFunc(("%s worker thread started for %s\n", pThis->szInst, pVirtq->szName));
     2824
     2825    /** @todo Race w/guest enabling/disabling guest notifications cyclically.
     2826              See BugRef #8651, Comment #82 */
     2827    virtioCoreVirtqNotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
    28272828
    28282829    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    28292830    {
    2830         if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pQueue->idx))
     2831        if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pVirtq->idx))
    28312832        {
    28322833            /* Atomic interlocks avoid missing alarm while going to sleep & notifier waking the awoken */
     
    28352836            if (!fNotificationSent)
    28362837            {
    2837                 Log10Func(("%s %s worker sleeping...\n\n", pThis->szInst, pQueue->szName));
     2838                Log10Func(("%s %s worker sleeping...\n\n", pThis->szInst, pVirtq->szName));
    28382839                Assert(ASMAtomicReadBool(&pWorker->fSleeping));
    28392840                int rc = PDMDevHlpSUPSemEventWaitNoResume(pDevIns, pWorker->hEvtProcess, RT_INDEFINITE_WAIT);
     
    28532854        if (!pThisCC->fQuiescing)
    28542855        {
    2855              if (pQueue->fCtlQueue)
     2856             if (pVirtq->fCtlVirtq)
    28562857             {
    2857                  Log10Func(("%s %s worker woken. Fetching desc chain\n", pThis->szInst, pQueue->szName));
     2858                 Log10Func(("%s %s worker woken. Fetching desc chain\n", pThis->szInst, pVirtq->szName));
    28582859                 PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    2859                  int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, pQueue->idx, &pDescChain, true);
     2860                 int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, pVirtq->idx, &pDescChain, true);
    28602861                 if (rc == VERR_NOT_AVAILABLE)
    28612862                 {
    2862                     Log10Func(("%s %s worker woken. Nothing found in queue/n", pThis->szInst, pQueue->szName));
     2863                    Log10Func(("%s %s worker woken. Nothing found in queue/n", pThis->szInst, pVirtq->szName));
    28632864                    continue;
    28642865                 }
     
    28682869             else /* Must be Tx queue */
    28692870             {
    2870                  Log10Func(("%s %s worker woken. Queue has data to transmit\n",  pThis->szInst, pQueue->szName));
    2871                  virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pQueue, false /* fOnWorkerThread */);
     2871                 Log10Func(("%s %s worker woken. Virtq has data to transmit\n",  pThis->szInst, pVirtq->szName));
     2872                 virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pVirtq, false /* fOnWorkerThread */);
    28722873             }
    28732874
    28742875             /* Rx queues aren't handled by our worker threads. Instead, the PDM network
    28752876              * leaf driver invokes PDMINETWORKDOWN.pfnWaitReceiveAvail() callback,
    2876               * which waits until notified directly by virtioNetQueueNotified()
     2877              * which waits until notified directly by virtioNetVirtqNotified()
    28772878              * that guest IN buffers have been added to receive virt queue.
    28782879              */
    28792880        }
    28802881    }
    2881     Log10(("%s %s worker thread exiting\n", pThis->szInst, pQueue->szName));
     2882    Log10(("%s %s worker thread exiting\n", pThis->szInst, pVirtq->szName));
    28822883    return VINF_SUCCESS;
    28832884}
     
    28982899                 pThis->szInst));
    28992900
    2900         pThis->fNegotiatedFeatures = virtioCoreGetAcceptedFeatures(pVirtio);
     2901        pThis->fNegotiatedFeatures = virtioCoreGetNegotiatedFeatures(pVirtio);
    29012902
    29022903#ifdef LOG_ENABLED
     
    29102911        pThisCC->fQuiescing = false;
    29112912
    2912         for (unsigned idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
     2913        for (unsigned idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    29132914        {
    2914             PVIRTIONETQUEUE pQueue = &pThis->aQueues[idxQueue];
    2915             pQueue->idx = idxQueue;
    2916             (void) virtioCoreR3QueueAttach(&pThis->Virtio, pQueue->idx, pQueue->szName);
    2917             pQueue->fAttachedToVirtioCore = true;
    2918             if (IS_VIRTQ_EMPTY(pThisCC->pDevIns, &pThis->Virtio, pQueue->idx))
    2919                 virtioCoreQueueNotifyEnable(&pThis->Virtio, pQueue->idx, true /* fEnable */);
     2915            PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];
     2916            pVirtq->idx = idxVirtq;
     2917            (void) virtioCoreR3VirtqAttach(&pThis->Virtio, pVirtq->idx, pVirtq->szName);
     2918            pVirtq->fAttachedToVirtioCore = true;
     2919            if (IS_VIRTQ_EMPTY(pThisCC->pDevIns, &pThis->Virtio, pVirtq->idx))
     2920                virtioCoreVirtqNotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
    29202921        }
    29212922    }
     
    29432944        pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, true);
    29442945
    2945         for (uint16_t idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
    2946             pThis->aQueues[idxQueue].fAttachedToVirtioCore = false;
     2946        for (uint16_t idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     2947            pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore = false;
    29472948    }
    29482949}
     
    31533154
    31543155    /* Initialize the generic Virtio core: */
    3155     pThisCC->Virtio.pfnQueueNotified        = virtioNetQueueNotified;
     3156    pThisCC->Virtio.pfnVirtqNotified        = virtioNetVirtqNotified;
    31563157    pThisCC->Virtio.pfnStatusChanged        = virtioNetR3StatusChanged;
    31573158    pThisCC->Virtio.pfnDevCapRead           = virtioNetR3DevCapRead;
     
    31923193                         ? pThis->virtioNetConfig.uMaxVirtqPairs  :  1;
    31933194
    3194     pThis->cVirtQueues += pThis->cVirtqPairs * 2 + 1;
     3195    pThis->cVirtVirtqs += pThis->cVirtqPairs * 2 + 1;
    31953196
    31963197    /* Create Link Up Timer */
     
    32023203     */
    32033204    virtioNetR3SetVirtqNames(pThis);
    3204     pThis->aQueues[CTRLQIDX].fCtlQueue = true;
     3205    pThis->aVirtqs[CTRLQIDX].fCtlVirtq = true;
    32053206
    32063207    /*
     
    32903291    PVIRTIONET   pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    32913292    PVIRTIONETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIONETCC);
    3292     pThisCC->Virtio.pfnQueueNotified = virtioNetQueueNotified;
     3293    pThisCC->Virtio.pfnVirtqNotified = virtioNetVirtqNotified;
    32933294    return virtioCoreRZInit(pDevIns, &pThis->Virtio);
    32943295}
  • trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp

    r84786 r84803  
    8181#define VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED       VIRTIOSCSI_HOST_SCSI_FEATURES_NONE
    8282
    83 #define VIRTIOSCSI_REQ_QUEUE_CNT                    4           /**< T.B.D. Consider increasing                      */
    84 #define VIRTIOSCSI_QUEUE_CNT                        (VIRTIOSCSI_REQ_QUEUE_CNT + 2)
     83#define VIRTIOSCSI_REQ_VIRTQ_CNT                    4           /**< T.B.D. Consider increasing                      */
     84#define VIRTIOSCSI_VIRTQ_CNT                        (VIRTIOSCSI_REQ_VIRTQ_CNT + 2)
    8585#define VIRTIOSCSI_MAX_TARGETS                      256         /**< T.B.D. Figure out a a good value for this.      */
    8686#define VIRTIOSCSI_MAX_LUN                          256         /**< VirtIO specification, section 5.6.4             */
     
    112112#define VIRTQ_REQ_BASE                              2           /**< Spec-defined base index of request queues       */
    113113
    114 #define VIRTQNAME(idxQueue) (pThis->aszVirtqNames[idxQueue])            /**< Macro to get queue name from its index          */
    115 #define CBVIRTQNAME(idxQueue) RTStrNLen(VIRTQNAME(idxQueue), sizeof(VIRTQNAME(idxQueue)))
    116 
    117 #define IS_REQ_QUEUE(idxQueue) (idxQueue >= VIRTQ_REQ_BASE && idxQueue < VIRTIOSCSI_QUEUE_CNT)
     114#define VIRTQNAME(idxVirtq) (pThis->aszVirtqNames[idxVirtq])            /**< Macro to get queue name from its index          */
     115#define CBVIRTQNAME(idxVirtq) RTStrNLen(VIRTQNAME(idxVirtq), sizeof(VIRTQNAME(idxVirtq)))
     116
     117#define IS_REQ_VIRTQ(idxVirtq) (idxVirtq >= VIRTQ_REQ_BASE && idxVirtq < VIRTIOSCSI_VIRTQ_CNT)
    118118
    119119#define VIRTIO_IS_IN_DIRECTION(pMediaExTxDirEnumValue) \
     
    123123    ((pMediaExTxDirEnumValue) == PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE)
    124124
    125 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxQueue) \
    126             (virtioCoreQueueAvailCount(pDevIns, pVirtio, idxQueue) == 0)
     125#define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxVirtq) \
     126            (virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq) == 0)
    127127
    128128
     
    137137typedef struct virtio_scsi_config
    138138{
    139     uint32_t uNumQueues;                                        /**< num_queues       \# of req q's exposed by dev   */
     139    uint32_t uNumVirtqs;                                        /**< num_queues       \# of req q's exposed by dev   */
    140140    uint32_t uSegMax;                                           /**< seg_max          Max \# of segs allowed in cmd  */
    141141    uint32_t uMaxSectors;                                       /**< max_sectors      Hint to guest max xfer to use  */
     
    427427
    428428    /** Per device-bound virtq worker-thread contexts (eventq slot unused) */
    429     VIRTIOSCSIWORKER                aWorkers[VIRTIOSCSI_QUEUE_CNT];
     429    VIRTIOSCSIWORKER                aWorkers[VIRTIOSCSI_VIRTQ_CNT];
    430430
    431431    /** Instance name */
     
    433433
    434434    /** Device-specific spec-based VirtIO VIRTQNAMEs */
    435     char                            aszVirtqNames[VIRTIOSCSI_QUEUE_CNT][VIRTIO_MAX_QUEUE_NAME_SIZE];
     435    char                            aszVirtqNames[VIRTIOSCSI_VIRTQ_CNT][VIRTIO_MAX_VIRTQ_NAME_SIZE];
    436436
    437437    /** Track which VirtIO queues we've attached to */
    438     bool                            afQueueAttached[VIRTIOSCSI_QUEUE_CNT];
     438    bool                            afVirtqAttached[VIRTIOSCSI_VIRTQ_CNT];
    439439
    440440    /** Set if events missed due to lack of bufs avail on eventq */
     
    488488
    489489    /** Per device-bound virtq worker-thread contexts (eventq slot unused) */
    490     VIRTIOSCSIWORKERR3              aWorkers[VIRTIOSCSI_QUEUE_CNT];
     490    VIRTIOSCSIWORKERR3              aWorkers[VIRTIOSCSI_VIRTQ_CNT];
    491491
    492492    /** Device base interface. */
     
    503503    R3PTRTYPE(PPDMIMEDIANOTIFY)     pMediaNotify;
    504504
    505     /** Queue to send tasks to R3. - HC ptr */
    506     R3PTRTYPE(PPDMQUEUE)            pNotifierQueueR3;
     505    /** Virtq to send tasks to R3. - HC ptr */
     506    R3PTRTYPE(PPDMQUEUE)            pNotifierVirtqR3;
    507507
    508508    /** True if in the process of quiescing I/O */
     
    557557    PDMMEDIAEXIOREQ                hIoReq;                      /**< Handle of I/O request                             */
    558558    PVIRTIOSCSITARGET              pTarget;                     /**< Target                                            */
    559     uint16_t                       idxQueue;                        /**< Index of queue this request arrived on            */
     559    uint16_t                       idxVirtq;                        /**< Index of queue this request arrived on            */
    560560    PVIRTIO_DESC_CHAIN_T           pDescChain;                  /**< Prepared desc chain pulled from virtq avail ring  */
    561561    size_t                         cbDataIn;                    /**< size of dataout buffer                            */
     
    573573
    574574/**
    575  * callback_method_impl{VIRTIOCORER0,pfnQueueNotified}
     575 * callback_method_impl{VIRTIOCORER0,pfnVirtqNotified}
    576576 * @todo this causes burn if I prefix with at-sign. This callback is in VIRTIOCORER0 and VIRTIOCORER3
    577577 */
    578 static DECLCALLBACK(void) virtioScsiNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     578static DECLCALLBACK(void) virtioScsiNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    579579{
    580580
     
    582582    PVIRTIOSCSI pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    583583
    584     AssertReturnVoid(idxQueue < VIRTIOSCSI_QUEUE_CNT);
    585     PVIRTIOSCSIWORKER pWorker = &pThis->aWorkers[idxQueue];
     584    AssertReturnVoid(idxVirtq < VIRTIOSCSI_VIRTQ_CNT);
     585    PVIRTIOSCSIWORKER pWorker = &pThis->aWorkers[idxVirtq];
    586586
    587587#if defined (IN_RING3) && defined (LOG_ENABLED)
     
    589589#endif
    590590
    591     if (idxQueue == CONTROLQ_IDX || IS_REQ_QUEUE(idxQueue))
    592     {
    593         Log6Func(("%s has available data\n", VIRTQNAME(idxQueue)));
     591    if (idxVirtq == CONTROLQ_IDX || IS_REQ_VIRTQ(idxVirtq))
     592    {
     593        Log6Func(("%s has available data\n", VIRTQNAME(idxVirtq)));
    594594        /* Wake queue's worker thread up if sleeping */
    595595        if (!ASMAtomicXchgBool(&pWorker->fNotified, true))
     
    597597            if (ASMAtomicReadBool(&pWorker->fSleeping))
    598598            {
    599                 Log6Func(("waking %s worker.\n", VIRTQNAME(idxQueue)));
     599                Log6Func(("waking %s worker.\n", VIRTQNAME(idxVirtq)));
    600600                int rc = PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
    601601                AssertRC(rc);
     
    603603        }
    604604    }
    605     else if (idxQueue == EVENTQ_IDX)
    606     {
    607         Log3Func(("Driver queued buffer(s) to %s\n", VIRTQNAME(idxQueue)));
     605    else if (idxVirtq == EVENTQ_IDX)
     606    {
     607        Log3Func(("Driver queued buffer(s) to %s\n", VIRTQNAME(idxVirtq)));
    608608//        if (ASMAtomicXchgBool(&pThis->fEventsMissed, false))
    609609//            virtioScsiR3ReportEventsMissed(pDevIns, pThis, 0);
    610610    }
    611611    else
    612         LogFunc(("Unexpected queue idx (ignoring): %d\n", idxQueue));
     612        LogFunc(("Unexpected queue idx (ignoring): %d\n", idxVirtq));
    613613}
    614614
     
    619619DECLINLINE(void) virtioScsiSetVirtqNames(PVIRTIOSCSI pThis)
    620620{
    621     RTStrCopy(pThis->aszVirtqNames[CONTROLQ_IDX], VIRTIO_MAX_QUEUE_NAME_SIZE, "controlq");
    622     RTStrCopy(pThis->aszVirtqNames[EVENTQ_IDX],   VIRTIO_MAX_QUEUE_NAME_SIZE, "eventq");
    623     for (uint16_t idxQueue = VIRTQ_REQ_BASE; idxQueue < VIRTQ_REQ_BASE + VIRTIOSCSI_REQ_QUEUE_CNT; idxQueue++)
    624         RTStrPrintf(pThis->aszVirtqNames[idxQueue], VIRTIO_MAX_QUEUE_NAME_SIZE,
    625                     "requestq<%d>", idxQueue - VIRTQ_REQ_BASE);
     621    RTStrCopy(pThis->aszVirtqNames[CONTROLQ_IDX], VIRTIO_MAX_VIRTQ_NAME_SIZE, "controlq");
     622    RTStrCopy(pThis->aszVirtqNames[EVENTQ_IDX],   VIRTIO_MAX_VIRTQ_NAME_SIZE, "eventq");
     623    for (uint16_t idxVirtq = VIRTQ_REQ_BASE; idxVirtq < VIRTQ_REQ_BASE + VIRTIOSCSI_REQ_VIRTQ_CNT; idxVirtq++)
     624        RTStrPrintf(pThis->aszVirtqNames[idxVirtq], VIRTIO_MAX_VIRTQ_NAME_SIZE,
     625                    "requestq<%d>", idxVirtq - VIRTQ_REQ_BASE);
    626626}
    627627
     
    755755
    756756    PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    757     int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, EVENTQ_IDX, &pDescChain, true);
     757    int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, EVENTQ_IDX, &pDescChain, true);
    758758    if (rc == VERR_NOT_AVAILABLE)
    759759    {
     
    783783    RTSgBufInit(&ReqSgBuf, aReqSegs, RT_ELEMENTS(aReqSegs));
    784784
    785     rc = virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, EVENTQ_IDX, &ReqSgBuf, pDescChain, true /*fFence*/);
     785    rc = virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, EVENTQ_IDX, &ReqSgBuf, pDescChain, true /*fFence*/);
    786786    if (rc == VINF_SUCCESS)
    787         virtioCoreQueueSync(pDevIns, &pThis->Virtio, EVENTQ_IDX, false);
     787        virtioCoreVirtqSync(pDevIns, &pThis->Virtio, EVENTQ_IDX, false);
    788788    else
    789789        LogRel(("Error writing control message to guest\n"));
     
    811811 * @param   pThis       VirtIO SCSI shared instance data.
    812812 * @param   pThisCC     VirtIO SCSI ring-3 instance data.
    813  * @param   idxQueue        Queue index
     813 * @param   idxVirtq        Virtq index
    814814 * @param   pDescChain  Pointer to pre-processed descriptor chain pulled from virtq
    815815 * @param   pRespHdr    Response header
     
    819819 * @returns VINF_SUCCESS
    820820 */
    821 static int virtioScsiR3ReqErr(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSICC pThisCC, uint16_t idxQueue,
     821static int virtioScsiR3ReqErr(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSICC pThisCC, uint16_t idxVirtq,
    822822                              PVIRTIO_DESC_CHAIN_T pDescChain, REQ_RESP_HDR_T *pRespHdr, uint8_t *pbSense,
    823823                              size_t cbSenseCfg)
     
    853853        pRespHdr->uResponse = VIRTIOSCSI_S_RESET;
    854854
    855     virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, idxQueue, &ReqSgBuf, pDescChain, true /* fFence */);
    856     virtioCoreQueueSync(pDevIns, &pThis->Virtio, idxQueue);
     855    virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, idxVirtq, &ReqSgBuf, pDescChain, true /* fFence */);
     856    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, idxVirtq);
    857857
    858858    if (!ASMAtomicDecU32(&pThis->cActiveReqs) && pThisCC->fQuiescing)
     
    872872 * @param   pThis       VirtIO SCSI shared instance data.
    873873 * @param   pThisCC     VirtIO SCSI ring-3 instance data.
    874  * @param   idxQueue        Queue index
     874 * @param   idxVirtq        Virtq index
    875875 * @param   pDescChain  Pointer to pre-processed descriptor chain pulled from virtq
    876876 * @param   cbResidual  The number of residual bytes or something like that.
     
    883883 * @returns VINF_SUCCESS
    884884 */
    885 static int virtioScsiR3ReqErr4(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSICC pThisCC, uint16_t idxQueue,
     885static int virtioScsiR3ReqErr4(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSICC pThisCC, uint16_t idxVirtq,
    886886                               PVIRTIO_DESC_CHAIN_T pDescChain, size_t cbResidual, uint8_t bStatus, uint8_t bResponse,
    887887                               uint8_t *pbSense, size_t cbSense, size_t cbSenseCfg)
     
    894894    RespHdr.uResponse        = bResponse;
    895895
    896     return virtioScsiR3ReqErr(pDevIns, pThis, pThisCC, idxQueue, pDescChain, &RespHdr, pbSense, cbSenseCfg);
     896    return virtioScsiR3ReqErr(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, &RespHdr, pbSense, cbSenseCfg);
    897897}
    898898
     
    10161016        respHdr.uResidual  = pReq->cbDataIn & UINT32_MAX;
    10171017
    1018         virtioScsiR3ReqErr(pDevIns, pThis, pThisCC, pReq->idxQueue, pReq->pDescChain, &respHdr, abSense,
     1018        virtioScsiR3ReqErr(pDevIns, pThis, pThisCC, pReq->idxVirtq, pReq->pDescChain, &respHdr, abSense,
    10191019                           RT_MIN(pThis->virtioScsiConfig.uSenseSize, VIRTIOSCSI_SENSE_SIZE_MAX));
    10201020    }
     
    10421042                        VERR_BUFFER_OVERFLOW);
    10431043
    1044         virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, pReq->idxQueue, &ReqSgBuf, pReq->pDescChain, true /* fFence TBD */);
    1045         virtioCoreQueueSync(pDevIns, &pThis->Virtio, pReq->idxQueue);
     1044        virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, pReq->idxVirtq, &ReqSgBuf, pReq->pDescChain, true /* fFence TBD */);
     1045        virtioCoreVirtqSync(pDevIns, &pThis->Virtio, pReq->idxVirtq);
    10461046
    10471047        Log2(("-----------------------------------------------------------------------------------------\n"));
     
    10581058/**
    10591059 * @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqCopyFromBuf}
    1060  *
     1060
    10611061 * Copy virtual memory from VSCSI layer to guest physical memory
    10621062 */
     
    11441144 */
    11451145static int virtioScsiR3ReqSubmit(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSICC pThisCC,
    1146                                  uint16_t idxQueue, PVIRTIO_DESC_CHAIN_T pDescChain)
     1146                                 uint16_t idxVirtq, PVIRTIO_DESC_CHAIN_T pDescChain)
    11471147{
    11481148
     
    11941194    if (uType == 0xc1 && uTarget == 0x01)
    11951195    {
    1196         LogRel(("* * * REPORT LUNS LU ACCESSED * * * "));
     1196        LogRel(("* * * WARNING: REPORT LUNS LU ACCESSED. FEATURE NOT IMPLEMENTED SEE DevVirtioScsi.cpp * * * "));
    11971197        /* Force rejection. */ /** @todo figure out right way to handle. Note this is a very
    11981198         * vague and confusing part of the VirtIO spec (which deviates from the SCSI standard).
    11991199         * I have not been able to determine how to implement this properly.  I've checked the
    1200          * source code of Guest drivers, and so far none seem to use it. If logs show
    1201          * this warning, implementing it can be re-visited */
     1200         * source code of Guest drivers, and so far none seem to use it. If this message is logged,
     1201         * meaning a guest expects this feature, implementing it can be re-visited */
    12021202        uScsiLun = 0xff;
    12031203    }
     
    12321232    {
    12331233        Log2Func(("Error submitting request, bad LUN format\n"));
    1234         return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxQueue, pDescChain, cbDataIn + cbDataOut, 0 /*bStatus*/,
     1234        return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, cbDataIn + cbDataOut, 0 /*bStatus*/,
    12351235                                   VIRTIOSCSI_S_FAILURE, NULL /*pbSense*/, 0 /*cbSense*/, cbSenseCfg);
    12361236    }
     
    12471247                              0, SCSI_SENSE_ILLEGAL_REQUEST,
    12481248                              0, 0, 0, 0, 10, SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED, 0, 0 };
    1249         return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxQueue, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_CHECK_CONDITION,
     1249        return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_CHECK_CONDITION,
    12501250                                   VIRTIOSCSI_S_BAD_TARGET, abSense, sizeof(abSense), cbSenseCfg);
    12511251    }
     
    12581258                              0, SCSI_SENSE_ILLEGAL_REQUEST,
    12591259                              0, 0, 0, 0, 10, SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED, 0, 0 };
    1260         return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxQueue, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_CHECK_CONDITION,
     1260        return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_CHECK_CONDITION,
    12611261                                   VIRTIOSCSI_S_OK, abSense, sizeof(abSense), cbSenseCfg);
    12621262    }
     
    12661266    {
    12671267        Log2Func(("Aborting req submission because reset is in progress\n"));
    1268         return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxQueue, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_OK,
     1268        return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_OK,
    12691269                                   VIRTIOSCSI_S_RESET, NULL /*pbSense*/, 0 /*cbSense*/, cbSenseCfg);
    12701270    }
     
    12771277        uint8_t abSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED,
    12781278                              0, SCSI_SENSE_ILLEGAL_REQUEST, 0, 0, 0, 0, 10, 0, 0, 0 };
    1279         return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxQueue, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_CHECK_CONDITION,
     1279        return virtioScsiR3ReqErr4(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, cbDataIn + cbDataOut, SCSI_STATUS_CHECK_CONDITION,
    12801280                                   VIRTIOSCSI_S_FAILURE, abSense, sizeof(abSense), cbSenseCfg);
    12811281    }
     
    12951295    pReq->hIoReq      = hIoReq;
    12961296    pReq->pTarget     = pTarget;
    1297     pReq->idxQueue        = idxQueue;
     1297    pReq->idxVirtq    = idxVirtq;
    12981298    pReq->cbDataIn    = cbDataIn;
    12991299    pReq->cbDataOut   = cbDataOut;
     
    13231323         */
    13241324        Assert(RT_FAILURE_NP(rc));
    1325         Log2Func(("Request submission error from lower-level driver\n"));
     1325        Log2Func(("Request-submission error from lower-level driver\n"));
    13261326        uint8_t uASC, uASCQ = 0;
    13271327        switch (rc)
     
    13421342        respHdr.uResponse  = VIRTIOSCSI_S_FAILURE;
    13431343        respHdr.uResidual  = (cbDataIn + cbDataOut) & UINT32_MAX;
    1344         virtioScsiR3ReqErr(pDevIns, pThis, pThisCC, idxQueue, pDescChain, &respHdr, abSense, cbSenseCfg);
     1344        virtioScsiR3ReqErr(pDevIns, pThis, pThisCC, idxVirtq, pDescChain, &respHdr, abSense, cbSenseCfg);
    13451345        virtioScsiR3FreeReq(pTarget, pReq);
    13461346    }
     
    13561356 * @param   pThis       VirtIO SCSI shared instance data.
    13571357 * @param   pThisCC     VirtIO SCSI ring-3 instance data.
    1358  * @param   idxQueue    CONTROLQ_IDX
     1358 * @param   idxVirtq    CONTROLQ_IDX
    13591359 * @param   pDescChain  Descriptor chain to process.
    13601360 */
    13611361static int virtioScsiR3Ctrl(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, PVIRTIOSCSICC pThisCC,
    1362                             uint16_t idxQueue, PVIRTIO_DESC_CHAIN_T pDescChain)
     1362                            uint16_t idxVirtq, PVIRTIO_DESC_CHAIN_T pDescChain)
    13631363{
    13641364    AssertReturn(pDescChain->cbPhysSend >= RT_MIN(sizeof(VIRTIOSCSI_CTRL_AN_T),
     
    14011401            uint32_t uScsiLun = RT_MAKE_U16(ScsiCtrlUnion.Tmf.abScsiLun[3], ScsiCtrlUnion.Tmf.abScsiLun[2]) & 0x3fff;
    14021402            Log2Func(("[%s] (Target: %d LUN: %d)  Task Mgt Function: %s\n",
    1403                       VIRTQNAME(idxQueue), uTarget, uScsiLun, virtioGetTMFTypeText(ScsiCtrlUnion.Tmf.uSubtype)));
     1403                      VIRTQNAME(idxVirtq), uTarget, uScsiLun, virtioGetTMFTypeText(ScsiCtrlUnion.Tmf.uSubtype)));
    14041404
    14051405            if (uTarget >= pThis->cTargets || !pThisCC->paTargetInstances[uTarget].fPresent)
     
    14621462                virtioGetControlAsyncMaskText(szTypeText, sizeof(szTypeText), ScsiCtrlUnion.AsyncNotify.fEventsRequested);
    14631463                Log2Func(("[%s] (Target: %d LUN: %d)  Async. Notification Query: %s\n",
    1464                           VIRTQNAME(idxQueue), uTarget, uScsiLun, szTypeText));
     1464                          VIRTQNAME(idxVirtq), uTarget, uScsiLun, szTypeText));
    14651465            }
    14661466#endif
     
    14871487                virtioGetControlAsyncMaskText(szTypeText, sizeof(szTypeText), ScsiCtrlUnion.AsyncNotify.fEventsRequested);
    14881488                Log2Func(("[%s] (Target: %d LUN: %d)  Async. Notification Subscribe: %s\n",
    1489                           VIRTQNAME(idxQueue), uTarget, uScsiLun, szTypeText));
     1489                          VIRTQNAME(idxVirtq), uTarget, uScsiLun, szTypeText));
    14901490            }
    14911491#endif
     
    15081508        default:
    15091509        {
    1510             LogFunc(("Unknown control type extracted from %s: %u\n", VIRTQNAME(idxQueue), ScsiCtrlUnion.Type.uType));
     1510            LogFunc(("Unknown control type extracted from %s: %u\n", VIRTQNAME(idxVirtq), ScsiCtrlUnion.Type.uType));
    15111511
    15121512            bResponse = VIRTIOSCSI_S_FAILURE;
     
    15271527    RTSgBufInit(&ReqSgBuf, aReqSegs, cSegs);
    15281528
    1529     virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, idxQueue, &ReqSgBuf, pDescChain, true /*fFence*/);
    1530     virtioCoreQueueSync(pDevIns, &pThis->Virtio, idxQueue);
     1529    virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, idxVirtq, &ReqSgBuf, pDescChain, true /*fFence*/);
     1530    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, idxVirtq);
    15311531
    15321532    return VINF_SUCCESS;
     
    15471547static DECLCALLBACK(int) virtioScsiR3WorkerThread(PPDMDEVINS pDevIns, PPDMTHREAD pThread)
    15481548{
    1549     uint16_t const      idxQueue  = (uint16_t)(uintptr_t)pThread->pvUser;
     1549    uint16_t const      idxVirtq  = (uint16_t)(uintptr_t)pThread->pvUser;
    15501550    PVIRTIOSCSI         pThis     = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    15511551    PVIRTIOSCSICC       pThisCC   = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIOSCSICC);
    1552     PVIRTIOSCSIWORKER   pWorker   = &pThis->aWorkers[idxQueue];
    1553     PVIRTIOSCSIWORKERR3 pWorkerR3 = &pThisCC->aWorkers[idxQueue];
     1552    PVIRTIOSCSIWORKER   pWorker   = &pThis->aWorkers[idxVirtq];
     1553    PVIRTIOSCSIWORKERR3 pWorkerR3 = &pThisCC->aWorkers[idxVirtq];
    15541554
    15551555    if (pThread->enmState == PDMTHREADSTATE_INITIALIZING)
     
    15581558    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    15591559    {
    1560         if (!pWorkerR3->cRedoDescs && IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, idxQueue))
     1560        if (!pWorkerR3->cRedoDescs && IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, idxVirtq))
    15611561        {
    15621562            /* Atomic interlocks avoid missing alarm while going to sleep & notifier waking the awoken */
     
    15651565            if (!fNotificationSent)
    15661566            {
    1567                 Log6Func(("%s worker sleeping...\n", VIRTQNAME(idxQueue)));
     1567                Log6Func(("%s worker sleeping...\n", VIRTQNAME(idxVirtq)));
    15681568                Assert(ASMAtomicReadBool(&pWorker->fSleeping));
    15691569                int rc = PDMDevHlpSUPSemEventWaitNoResume(pDevIns, pWorker->hEvtProcess, RT_INDEFINITE_WAIT);
     
    15731573                if (rc == VERR_INTERRUPTED)
    15741574                    continue;
    1575                 Log6Func(("%s worker woken\n", VIRTQNAME(idxQueue)));
     1575                Log6Func(("%s worker woken\n", VIRTQNAME(idxVirtq)));
    15761576                ASMAtomicWriteBool(&pWorker->fNotified, false);
    15771577            }
     
    15791579        }
    15801580
    1581         if (!pThis->afQueueAttached[idxQueue])
     1581        if (!pThis->afVirtqAttached[idxVirtq])
    15821582        {
    1583             LogFunc(("%s queue not attached, worker aborting...\n", VIRTQNAME(idxQueue)));
     1583            LogFunc(("%s queue not attached, worker aborting...\n", VIRTQNAME(idxVirtq)));
    15841584            break;
    15851585        }
     
    15901590             {
    15911591                  PVIRTIO_DESC_CHAIN_T pDescChain;
    1592                   int rc = virtioCoreR3DescChainGet(pDevIns, &pThis->Virtio, idxQueue,
     1592                  int rc = virtioCoreR3DescChainGet(pDevIns, &pThis->Virtio, idxVirtq,
    15931593                                                    pWorkerR3->auRedoDescs[i], &pDescChain);
    15941594                  if (RT_FAILURE(rc))
    15951595                      LogRel(("Error fetching desc chain to redo, %Rrc", rc));
    15961596
    1597                   rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, idxQueue, pDescChain);
     1597                  rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, idxVirtq, pDescChain);
    15981598                  if (RT_FAILURE(rc))
    15991599                      LogRel(("Error submitting req packet, resetting %Rrc", rc));
     
    16031603             pWorkerR3->cRedoDescs = 0;
    16041604
    1605              Log6Func(("fetching next descriptor chain from %s\n", VIRTQNAME(idxQueue)));
     1605             Log6Func(("fetching next descriptor chain from %s\n", VIRTQNAME(idxVirtq)));
    16061606             PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    1607              int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, idxQueue, &pDescChain, true);
     1607             int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, idxVirtq, &pDescChain, true);
    16081608             if (rc == VERR_NOT_AVAILABLE)
    16091609             {
    1610                  Log6Func(("Nothing found in %s\n", VIRTQNAME(idxQueue)));
     1610                 Log6Func(("Nothing found in %s\n", VIRTQNAME(idxVirtq)));
    16111611                 continue;
    16121612             }
    16131613
    16141614             AssertRC(rc);
    1615              if (idxQueue == CONTROLQ_IDX)
    1616                  virtioScsiR3Ctrl(pDevIns, pThis, pThisCC, idxQueue, pDescChain);
     1615             if (idxVirtq == CONTROLQ_IDX)
     1616                 virtioScsiR3Ctrl(pDevIns, pThis, pThisCC, idxVirtq, pDescChain);
    16171617             else /* request queue index */
    16181618             {
    1619                  rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, idxQueue, pDescChain);
     1619                 rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, idxVirtq, pDescChain);
    16201620                 if (RT_FAILURE(rc))
    16211621                     LogRel(("Error submitting req packet, resetting %Rrc", rc));
     
    17031703        pThisCC->fQuiescing  = false;
    17041704
    1705         for (unsigned i = 0; i < VIRTIOSCSI_QUEUE_CNT; i++)
    1706             pThis->afQueueAttached[i] = true;
     1705        for (unsigned i = 0; i < VIRTIOSCSI_VIRTQ_CNT; i++)
     1706            pThis->afVirtqAttached[i] = true;
    17071707    }
    17081708    else
    17091709    {
    17101710        LogFunc(("VirtIO is resetting\n"));
    1711         for (unsigned i = 0; i < VIRTIOSCSI_QUEUE_CNT; i++)
    1712             pThis->afQueueAttached[i] = false;
     1711        for (unsigned i = 0; i < VIRTIOSCSI_VIRTQ_CNT; i++)
     1712            pThis->afVirtqAttached[i] = false;
    17131713    }
    17141714}
     
    18351835    AssertReturn(pv && cb <= sizeof(uint32_t), fWrite ? VINF_SUCCESS : VINF_IOM_MMIO_UNUSED_00);
    18361836
    1837     if (MATCH_SCSI_CONFIG(uNumQueues))
    1838         SCSI_CONFIG_ACCESSOR_READONLY(uNumQueues);
     1837    if (MATCH_SCSI_CONFIG(uNumVirtqs))
     1838        SCSI_CONFIG_ACCESSOR_READONLY(uNumVirtqs);
    18391839    else
    18401840    if (MATCH_SCSI_CONFIG(uSegMax))
     
    19671967
    19681968    virtioScsiSetVirtqNames(pThis);
    1969     for (int idxQueue = 0; idxQueue < VIRTIOSCSI_QUEUE_CNT; idxQueue++)
    1970         pHlp->pfnSSMGetBool(pSSM, &pThis->afQueueAttached[idxQueue]);
    1971 
    1972     pHlp->pfnSSMGetU32(pSSM,  &pThis->virtioScsiConfig.uNumQueues);
     1969    for (int idxVirtq = 0; idxVirtq < VIRTIOSCSI_VIRTQ_CNT; idxVirtq++)
     1970        pHlp->pfnSSMGetBool(pSSM, &pThis->afVirtqAttached[idxVirtq]);
     1971
     1972    pHlp->pfnSSMGetU32(pSSM,  &pThis->virtioScsiConfig.uNumVirtqs);
    19731973    pHlp->pfnSSMGetU32(pSSM,  &pThis->virtioScsiConfig.uSegMax);
    19741974    pHlp->pfnSSMGetU32(pSSM,  &pThis->virtioScsiConfig.uMaxSectors);
     
    20072007                                              cReqsRedo, VIRTQ_MAX_ENTRIES));
    20082008
    2009         for (uint16_t idxQueue = VIRTQ_REQ_BASE; idxQueue < VIRTIOSCSI_QUEUE_CNT; idxQueue++)
     2009        for (uint16_t idxVirtq = VIRTQ_REQ_BASE; idxVirtq < VIRTIOSCSI_VIRTQ_CNT; idxVirtq++)
    20102010        {
    2011             PVIRTIOSCSIWORKERR3 pWorkerR3 = &pThisCC->aWorkers[idxQueue];
     2011            PVIRTIOSCSIWORKERR3 pWorkerR3 = &pThisCC->aWorkers[idxVirtq];
    20122012            pWorkerR3->cRedoDescs = 0;
    20132013        }
     
    20152015        for (int i = 0; i < cReqsRedo; i++)
    20162016        {
    2017             uint16_t idxQueue;
    2018             rc = pHlp->pfnSSMGetU16(pSSM, &idxQueue);
     2017            uint16_t idxVirtq;
     2018            rc = pHlp->pfnSSMGetU16(pSSM, &idxVirtq);
    20192019            AssertRCReturn(rc, rc);
    2020             AssertReturn(idxQueue < VIRTIOSCSI_QUEUE_CNT,
     2020            AssertReturn(idxVirtq < VIRTIOSCSI_VIRTQ_CNT,
    20212021                         pHlp->pfnSSMSetLoadError(pSSM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED, RT_SRC_POS,
    20222022                                                  N_("Bad queue index for re-do in saved state (%#x, max %#x)"),
    2023                                                   idxQueue, VIRTIOSCSI_QUEUE_CNT - 1));
     2023                                                  idxVirtq, VIRTIOSCSI_VIRTQ_CNT - 1));
    20242024
    20252025            uint16_t idxHead;
     
    20312031                                                  idxHead, VIRTQ_MAX_ENTRIES - 1));
    20322032
    2033             PVIRTIOSCSIWORKERR3 pWorkerR3 = &pThisCC->aWorkers[idxQueue];
     2033            PVIRTIOSCSIWORKERR3 pWorkerR3 = &pThisCC->aWorkers[idxVirtq];
    20342034            pWorkerR3->auRedoDescs[pWorkerR3->cRedoDescs++] = idxHead;
    20352035            pWorkerR3->cRedoDescs %= VIRTQ_MAX_ENTRIES;
     
    20452045     * Nudge request queue workers
    20462046     */
    2047     for (int idxQueue = VIRTQ_REQ_BASE; idxQueue < VIRTIOSCSI_QUEUE_CNT; idxQueue++)
    2048     {
    2049         if (pThis->afQueueAttached[idxQueue])
     2047    for (int idxVirtq = VIRTQ_REQ_BASE; idxVirtq < VIRTIOSCSI_VIRTQ_CNT; idxVirtq++)
     2048    {
     2049        if (pThis->afVirtqAttached[idxVirtq])
    20502050        {
    2051             LogFunc(("Waking %s worker.\n", VIRTQNAME(idxQueue)));
    2052             int rc2 = PDMDevHlpSUPSemEventSignal(pDevIns, pThis->aWorkers[idxQueue].hEvtProcess);
     2051            LogFunc(("Waking %s worker.\n", VIRTQNAME(idxVirtq)));
     2052            int rc2 = PDMDevHlpSUPSemEventSignal(pDevIns, pThis->aWorkers[idxVirtq].hEvtProcess);
    20532053            AssertRCReturn(rc, rc2);
    20542054        }
     
    20692069    LogFunc(("SAVE EXEC!!\n"));
    20702070
    2071     for (int idxQueue = 0; idxQueue < VIRTIOSCSI_QUEUE_CNT; idxQueue++)
    2072         pHlp->pfnSSMPutBool(pSSM, pThis->afQueueAttached[idxQueue]);
    2073 
    2074     pHlp->pfnSSMPutU32(pSSM,  pThis->virtioScsiConfig.uNumQueues);
     2071    for (int idxVirtq = 0; idxVirtq < VIRTIOSCSI_VIRTQ_CNT; idxVirtq++)
     2072        pHlp->pfnSSMPutBool(pSSM, pThis->afVirtqAttached[idxVirtq]);
     2073
     2074    pHlp->pfnSSMPutU32(pSSM,  pThis->virtioScsiConfig.uNumVirtqs);
    20752075    pHlp->pfnSSMPutU32(pSSM,  pThis->virtioScsiConfig.uSegMax);
    20762076    pHlp->pfnSSMPutU32(pSSM,  pThis->virtioScsiConfig.uMaxSectors);
     
    21172117                 while(--cReqsRedo)
    21182118                 {
    2119                     pHlp->pfnSSMPutU16(pSSM, pReq->idxQueue);
     2119                    pHlp->pfnSSMPutU16(pSSM, pReq->idxVirtq);
    21202120                    pHlp->pfnSSMPutU16(pSSM, pReq->pDescChain->uHeadIdx);
    21212121
     
    23352335     * be awake due to new reqs coming in.
    23362336     */
    2337     for (uint16_t idxQueue = 0; idxQueue < VIRTIOSCSI_REQ_QUEUE_CNT; idxQueue++)
    2338     {
    2339         if (ASMAtomicReadBool(&pThis->aWorkers[idxQueue].fSleeping))
     2337    for (uint16_t idxVirtq = 0; idxVirtq < VIRTIOSCSI_REQ_VIRTQ_CNT; idxVirtq++)
     2338    {
     2339        if (ASMAtomicReadBool(&pThis->aWorkers[idxVirtq].fSleeping))
    23402340        {
    2341             Log6Func(("waking %s worker.\n", VIRTQNAME(idxQueue)));
    2342             int rc = PDMDevHlpSUPSemEventSignal(pDevIns, pThis->aWorkers[idxQueue].hEvtProcess);
     2341            Log6Func(("waking %s worker.\n", VIRTQNAME(idxVirtq)));
     2342            int rc = PDMDevHlpSUPSemEventSignal(pDevIns, pThis->aWorkers[idxVirtq].hEvtProcess);
    23432343            AssertRC(rc);
    23442344        }
     
    24142414    pThisCC->pMediaNotify = NULL;
    24152415
    2416     for (unsigned idxQueue = 0; idxQueue < VIRTIOSCSI_QUEUE_CNT; idxQueue++)
    2417     {
    2418         PVIRTIOSCSIWORKER pWorker = &pThis->aWorkers[idxQueue];
     2416    for (unsigned idxVirtq = 0; idxVirtq < VIRTIOSCSI_VIRTQ_CNT; idxVirtq++)
     2417    {
     2418        PVIRTIOSCSIWORKER pWorker = &pThis->aWorkers[idxVirtq];
    24192419        if (pWorker->hEvtProcess != NIL_SUPSEMEVENT)
    24202420        {
     
    24232423        }
    24242424
    2425         if (pThisCC->aWorkers[idxQueue].pThread)
     2425        if (pThisCC->aWorkers[idxVirtq].pThread)
    24262426        {
    24272427            /* Destroy the thread. */
    24282428            int rcThread;
    2429             int rc = PDMDevHlpThreadDestroy(pDevIns, pThisCC->aWorkers[idxQueue].pThread, &rcThread);
     2429            int rc = PDMDevHlpThreadDestroy(pDevIns, pThisCC->aWorkers[idxVirtq].pThread, &rcThread);
    24302430            if (RT_FAILURE(rc) || RT_FAILURE(rcThread))
    24312431                AssertMsgFailed(("%s Failed to destroythread rc=%Rrc rcThread=%Rrc\n",
    24322432                                 __FUNCTION__, rc, rcThread));
    2433            pThisCC->aWorkers[idxQueue].pThread = NULL;
     2433           pThisCC->aWorkers[idxVirtq].pThread = NULL;
    24342434        }
    24352435    }
     
    24872487
    24882488    /* Configure virtio_scsi_config that transacts via VirtIO implementation's Dev. Specific Cap callbacks */
    2489     pThis->virtioScsiConfig.uNumQueues      = VIRTIOSCSI_REQ_QUEUE_CNT;
     2489    pThis->virtioScsiConfig.uNumVirtqs      = VIRTIOSCSI_REQ_VIRTQ_CNT;
    24902490    pThis->virtioScsiConfig.uSegMax         = VIRTIOSCSI_MAX_SEG_COUNT;
    24912491    pThis->virtioScsiConfig.uMaxSectors     = VIRTIOSCSI_MAX_SECTORS_HINT;
     
    24992499
    25002500    /* Initialize the generic Virtio core: */
    2501     pThisCC->Virtio.pfnQueueNotified        = virtioScsiNotified;
     2501    pThisCC->Virtio.pfnVirtqNotified        = virtioScsiNotified;
    25022502    pThisCC->Virtio.pfnStatusChanged        = virtioScsiR3StatusChanged;
    25032503    pThisCC->Virtio.pfnDevCapRead           = virtioScsiR3DevCapRead;
     
    25262526
    25272527    /* Attach the queues and create worker threads for them: */
    2528     for (uint16_t idxQueue = 0; idxQueue < VIRTIOSCSI_QUEUE_CNT; idxQueue++)
    2529     {
    2530         rc = virtioCoreR3QueueAttach(&pThis->Virtio, idxQueue, VIRTQNAME(idxQueue));
     2528    for (uint16_t idxVirtq = 0; idxVirtq < VIRTIOSCSI_VIRTQ_CNT; idxVirtq++)
     2529    {
     2530        rc = virtioCoreR3VirtqAttach(&pThis->Virtio, idxVirtq, VIRTQNAME(idxVirtq));
    25312531        if (RT_FAILURE(rc))
    25322532            continue;
    2533         if (idxQueue == CONTROLQ_IDX || IS_REQ_QUEUE(idxQueue))
     2533        if (idxVirtq == CONTROLQ_IDX || IS_REQ_VIRTQ(idxVirtq))
    25342534        {
    2535             rc = PDMDevHlpThreadCreate(pDevIns, &pThisCC->aWorkers[idxQueue].pThread,
    2536                                        (void *)(uintptr_t)idxQueue, virtioScsiR3WorkerThread,
    2537                                        virtioScsiR3WorkerWakeUp, 0, RTTHREADTYPE_IO, VIRTQNAME(idxQueue));
     2535            rc = PDMDevHlpThreadCreate(pDevIns, &pThisCC->aWorkers[idxVirtq].pThread,
     2536                                       (void *)(uintptr_t)idxVirtq, virtioScsiR3WorkerThread,
     2537                                       virtioScsiR3WorkerWakeUp, 0, RTTHREADTYPE_IO, VIRTQNAME(idxVirtq));
    25382538            if (rc != VINF_SUCCESS)
    25392539            {
    2540                 LogRel(("Error creating thread for Virtual Queue %s: %Rrc\n", VIRTQNAME(idxQueue), rc));
     2540                LogRel(("Error creating thread for Virtual Virtq %s: %Rrc\n", VIRTQNAME(idxVirtq), rc));
    25412541                return rc;
    25422542            }
    25432543
    2544             rc = PDMDevHlpSUPSemEventCreate(pDevIns, &pThis->aWorkers[idxQueue].hEvtProcess);
     2544            rc = PDMDevHlpSUPSemEventCreate(pDevIns, &pThis->aWorkers[idxVirtq].hEvtProcess);
    25452545            if (RT_FAILURE(rc))
    25462546                return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
    25472547                                           N_("DevVirtioSCSI: Failed to create SUP event semaphore"));
    25482548        }
    2549         pThis->afQueueAttached[idxQueue] = true;
     2549        pThis->afVirtqAttached[idxVirtq] = true;
    25502550    }
    25512551
     
    26662666
    26672667
    2668     pThisCC->Virtio.pfnQueueNotified = virtioScsiNotified;
     2668    pThisCC->Virtio.pfnVirtqNotified = virtioScsiNotified;
    26692669    return virtioCoreRZInit(pDevIns, &pThis->Virtio);
    26702670}
  • trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp

    r84783 r84803  
    4242*********************************************************************************************************************************/
    4343#define INSTANCE(a_pVirtio)                 ((a_pVirtio)->szInstance)
    44 #define VIRTQNAME(a_pVirtio, a_idxQueue)    ((a_pVirtio)->virtqState[(a_idxQueue)].szVirtqName)
     44#define VIRTQNAME(a_pVirtio, a_idxVirtq)    ((a_pVirtio)->aVirtqState[(a_idxVirtq)].szVirtqName)
    4545#define IS_DRIVER_OK(a_pVirtio)             ((a_pVirtio)->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK)
    46 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtq) \
    47             (virtioCoreQueueAvailCount(pDevIns, pVirtio, pVirtq) == 0)
     46#define IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtqState) \
     47            (virtioCoreVirtqAvailCount(pDevIns, pVirtio, pVirtqState) == 0)
    4848
    4949/**
     
    135135/* Internal Functions */
    136136
    137 static void virtioCoreNotifyGuestDriver(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue);
     137static void virtioCoreNotifyGuestDriver(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq);
    138138static int  virtioKick(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint8_t uCause, uint16_t uVec);
    139139
     
    145145 */
    146146#ifdef IN_RING3
    147 DECLINLINE(void) virtioReadDesc(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     147DECLINLINE(void) virtioReadDesc(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    148148                                uint32_t idxDesc, PVIRTQ_DESC_T pDesc)
    149149{
    150150    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    151     uint16_t const cQueueItems = RT_MAX(pVirtio->uQueueSize[idxQueue], 1); /* Make sure to avoid div-by-zero. */
     151    uint16_t const cVirtqItems = RT_MAX(pVirtio->uVirtqSize[idxVirtq], 1); /* Make sure to avoid div-by-zero. */
    152152    PDMDevHlpPCIPhysRead(pDevIns,
    153                       pVirtio->aGCPhysQueueDesc[idxQueue] + sizeof(VIRTQ_DESC_T) * (idxDesc % cQueueItems),
     153                      pVirtio->aGCPhysVirtqDesc[idxVirtq] + sizeof(VIRTQ_DESC_T) * (idxDesc % cVirtqItems),
    154154                      pDesc, sizeof(VIRTQ_DESC_T));
    155155}
     
    160160 */
    161161#ifdef IN_RING3
    162 DECLINLINE(uint16_t) virtioReadAvailDescIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, uint32_t availIdx)
     162DECLINLINE(uint16_t) virtioReadAvailDescIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, uint32_t availIdx)
    163163{
    164164    uint16_t uDescIdx;
    165165    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    166     uint16_t const cQueueItems = RT_MAX(pVirtio->uQueueSize[idxQueue], 1); /* Make sure to avoid div-by-zero. */
     166    uint16_t const cVirtqItems = RT_MAX(pVirtio->uVirtqSize[idxVirtq], 1); /* Make sure to avoid div-by-zero. */
    167167    PDMDevHlpPCIPhysRead(pDevIns,
    168                         pVirtio->aGCPhysQueueAvail[idxQueue]
    169                       + RT_UOFFSETOF_DYN(VIRTQ_AVAIL_T, auRing[availIdx % cQueueItems]),
     168                        pVirtio->aGCPhysVirtqAvail[idxVirtq]
     169                      + RT_UOFFSETOF_DYN(VIRTQ_AVAIL_T, auRing[availIdx % cVirtqItems]),
    170170                      &uDescIdx, sizeof(uDescIdx));
    171171    return uDescIdx;
    172172}
    173173
    174 DECLINLINE(uint16_t) virtioReadAvailUsedEvent(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     174DECLINLINE(uint16_t) virtioReadAvailUsedEvent(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    175175{
    176176    uint16_t uUsedEventIdx;
     
    178178    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    179179    PDMDevHlpPCIPhysRead(pDevIns,
    180                       pVirtio->aGCPhysQueueAvail[idxQueue] + RT_UOFFSETOF_DYN(VIRTQ_AVAIL_T, auRing[pVirtio->uQueueSize[idxQueue]]),
     180                      pVirtio->aGCPhysVirtqAvail[idxVirtq] + RT_UOFFSETOF_DYN(VIRTQ_AVAIL_T, auRing[pVirtio->uVirtqSize[idxVirtq]]),
    181181                      &uUsedEventIdx, sizeof(uUsedEventIdx));
    182182    return uUsedEventIdx;
     
    184184#endif
    185185
    186 DECLINLINE(uint16_t) virtioReadAvailRingIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     186DECLINLINE(uint16_t) virtioReadAvailRingIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    187187{
    188188    uint16_t uIdx = 0;
    189189    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    190190    PDMDevHlpPCIPhysRead(pDevIns,
    191                       pVirtio->aGCPhysQueueAvail[idxQueue] + RT_UOFFSETOF(VIRTQ_AVAIL_T, uIdx),
     191                      pVirtio->aGCPhysVirtqAvail[idxVirtq] + RT_UOFFSETOF(VIRTQ_AVAIL_T, uIdx),
    192192                      &uIdx, sizeof(uIdx));
    193193    return uIdx;
    194194}
    195195
    196 DECLINLINE(uint16_t) virtioReadAvailRingFlags(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     196DECLINLINE(uint16_t) virtioReadAvailRingFlags(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    197197{
    198198    uint16_t fFlags = 0;
    199199    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    200200    PDMDevHlpPCIPhysRead(pDevIns,
    201                       pVirtio->aGCPhysQueueAvail[idxQueue] + RT_UOFFSETOF(VIRTQ_AVAIL_T, fFlags),
     201                      pVirtio->aGCPhysVirtqAvail[idxVirtq] + RT_UOFFSETOF(VIRTQ_AVAIL_T, fFlags),
    202202                      &fFlags, sizeof(fFlags));
    203203    return fFlags;
     
    211211
    212212#ifdef IN_RING3
    213 DECLINLINE(void) virtioWriteUsedElem(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     213DECLINLINE(void) virtioWriteUsedElem(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    214214                                     uint32_t usedIdx, uint32_t uDescIdx, uint32_t uLen)
    215215{
    216216    VIRTQ_USED_ELEM_T elem = { uDescIdx,  uLen };
    217217    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    218     uint16_t const cQueueItems = RT_MAX(pVirtio->uQueueSize[idxQueue], 1); /* Make sure to avoid div-by-zero. */
     218    uint16_t const cVirtqItems = RT_MAX(pVirtio->uVirtqSize[idxVirtq], 1); /* Make sure to avoid div-by-zero. */
    219219    PDMDevHlpPCIPhysWrite(pDevIns,
    220                           pVirtio->aGCPhysQueueUsed[idxQueue] + RT_UOFFSETOF_DYN(VIRTQ_USED_T, aRing[usedIdx % cQueueItems]),
     220                          pVirtio->aGCPhysVirtqUsed[idxVirtq] + RT_UOFFSETOF_DYN(VIRTQ_USED_T, aRing[usedIdx % cVirtqItems]),
    221221                          &elem, sizeof(elem));
    222222}
    223223
    224 DECLINLINE(void) virtioWriteUsedRingFlags(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, uint16_t fFlags)
     224DECLINLINE(void) virtioWriteUsedRingFlags(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, uint16_t fFlags)
    225225{
    226226    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    227227    RT_UNTRUSTED_VALIDATED_FENCE(); /* VirtIO 1.0, Section 3.2.1.4.1 */
    228228    PDMDevHlpPCIPhysWrite(pDevIns,
    229                           pVirtio->aGCPhysQueueUsed[idxQueue] + RT_UOFFSETOF(VIRTQ_USED_T, fFlags),
     229                          pVirtio->aGCPhysVirtqUsed[idxVirtq] + RT_UOFFSETOF(VIRTQ_USED_T, fFlags),
    230230                          &fFlags, sizeof(fFlags));
    231231}
    232232#endif
    233233
    234 DECLINLINE(void) virtioWriteUsedRingIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, uint16_t uIdx)
     234DECLINLINE(void) virtioWriteUsedRingIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, uint16_t uIdx)
    235235{
    236236    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    237237    PDMDevHlpPCIPhysWrite(pDevIns,
    238                           pVirtio->aGCPhysQueueUsed[idxQueue] + RT_UOFFSETOF(VIRTQ_USED_T, uIdx),
     238                          pVirtio->aGCPhysVirtqUsed[idxVirtq] + RT_UOFFSETOF(VIRTQ_USED_T, uIdx),
    239239                          &uIdx, sizeof(uIdx));
    240240}
     
    243243#ifdef IN_RING3
    244244
    245 DECLINLINE(uint16_t) virtioReadUsedRingIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     245DECLINLINE(uint16_t) virtioReadUsedRingIdx(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    246246{
    247247    uint16_t uIdx = 0;
    248248    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    249249    PDMDevHlpPCIPhysRead(pDevIns,
    250                       pVirtio->aGCPhysQueueUsed[idxQueue] + RT_UOFFSETOF(VIRTQ_USED_T, uIdx),
     250                      pVirtio->aGCPhysVirtqUsed[idxVirtq] + RT_UOFFSETOF(VIRTQ_USED_T, uIdx),
    251251                      &uIdx, sizeof(uIdx));
    252252    return uIdx;
    253253}
    254254
    255 DECLINLINE(uint16_t) virtioReadUsedRingFlags(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     255DECLINLINE(uint16_t) virtioReadUsedRingFlags(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    256256{
    257257    uint16_t fFlags = 0;
    258258    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    259259    PDMDevHlpPCIPhysRead(pDevIns,
    260                       pVirtio->aGCPhysQueueUsed[idxQueue] + RT_UOFFSETOF(VIRTQ_USED_T, fFlags),
     260                      pVirtio->aGCPhysVirtqUsed[idxVirtq] + RT_UOFFSETOF(VIRTQ_USED_T, fFlags),
    261261                      &fFlags, sizeof(fFlags));
    262262    return fFlags;
    263263}
    264264
    265 DECLINLINE(void) virtioWriteUsedAvailEvent(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, uint32_t uAvailEventIdx)
     265DECLINLINE(void) virtioWriteUsedAvailEvent(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, uint32_t uAvailEventIdx)
    266266{
    267267    /** VirtIO 1.0 uAvailEventIdx (avail_event) immediately follows ring */
    268268    AssertMsg(pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK, ("Called with guest driver not ready\n"));
    269269    PDMDevHlpPCIPhysWrite(pDevIns,
    270                           pVirtio->aGCPhysQueueUsed[idxQueue] + RT_UOFFSETOF_DYN(VIRTQ_USED_T, aRing[pVirtio->uQueueSize[idxQueue]]),
     270                          pVirtio->aGCPhysVirtqUsed[idxVirtq] + RT_UOFFSETOF_DYN(VIRTQ_USED_T, aRing[pVirtio->uVirtqSize[idxVirtq]]),
    271271                          &uAvailEventIdx, sizeof(uAvailEventIdx));
    272272}
     
    275275#endif
    276276
    277 DECLINLINE(uint16_t) virtioCoreQueueAvailCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, PVIRTQSTATE pVirtq)
    278 {
    279     uint16_t uIdx    = virtioReadAvailRingIdx(pDevIns, pVirtio, pVirtq->idxQueue);
    280     uint16_t uShadow = pVirtq->uAvailIdxShadow;
     277DECLINLINE(uint16_t) virtioCoreVirtqAvailCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, PVIRTQSTATE pVirtqState)
     278{
     279    uint16_t uIdx    = virtioReadAvailRingIdx(pDevIns, pVirtio, pVirtqState->idxVirtq);
     280    uint16_t uShadow = pVirtqState->uAvailIdxShadow;
    281281
    282282    uint16_t uDelta;
     
    287287
    288288    LogFunc(("%s has %u %s (idx=%u shadow=%u)\n",
    289         VIRTQNAME(pVirtio, pVirtq->idxQueue), uDelta, uDelta == 1 ? "entry" : "entries",
     289        VIRTQNAME(pVirtio, pVirtqState->idxVirtq), uDelta, uDelta == 1 ? "entry" : "entries",
    290290        uIdx, uShadow));
    291291
     
    297297 * @param   pDevIns     The device instance.
    298298 * @param   pVirtio     Pointer to the shared virtio state.
    299  * @param   idxQueue    Queue number
     299 * @param   idxVirtq    Virtq number
    300300 *
    301301 * @returns how many entries have been added to ring as a delta of the consumer's
    302302 *          avail index and the queue's guest-side current avail index.
    303303 */
    304 uint16_t virtioCoreQueueAvailCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
    305 {
    306     if (!IS_DRIVER_OK(pVirtio) || !pVirtio->uQueueEnable[idxQueue])
     304uint16_t virtioCoreVirtqAvailCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     305{
     306    if (!IS_DRIVER_OK(pVirtio) || !pVirtio->uVirtqEnable[idxVirtq])
    307307    {
    308308        LogRelFunc(("Driver not ready or queue not enabled\n"));
    309309        return 0;
    310310    }
    311     return virtioCoreQueueAvailCount(pDevIns, pVirtio, &pVirtio->virtqState[idxQueue]);
     311    return virtioCoreVirtqAvailCount(pDevIns, pVirtio, &pVirtio->aVirtqState[idxVirtq]);
    312312}
    313313
     
    681681    bool fState    = pszArgs && (*pszArgs == 's' || *pszArgs == 'S'); /* "state"    */
    682682    bool fPointers = pszArgs && (*pszArgs == 'p' || *pszArgs == 'P'); /* "pointers" */
    683     bool fQueues   = pszArgs && (*pszArgs == 'q' || *pszArgs == 'Q'); /* "queues    */
    684     RT_NOREF6(fNone, fAll, fBasic, fState, fPointers, fQueues);
     683    bool fVirtqs   = pszArgs && (*pszArgs == 'q' || *pszArgs == 'Q'); /* "queues    */
     684    RT_NOREF6(fNone, fAll, fBasic, fState, fPointers, fVirtqs);
    685685    pHlp->pfnPrintf(pHlp, "");
    686686
    687687}
    688688
    689 void virtioCoreR3QueueInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs, int idxQueue)
     689void virtioCoreR3VirtqInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs, int idxVirtq)
    690690{
    691691    RT_NOREF(pszArgs);
    692692    PVIRTIOCORE pVirtio = PDMDEVINS_2_DATA(pDevIns, PVIRTIOCORE);
    693     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
     693    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
    694694
    695695//    bool fDump      = pszArgs && (*pszArgs == 'd' || *pszArgs == 'D'); /* "dump" (avail phys descriptor)"       */
    696696
    697     uint16_t uAvailIdx       = virtioReadAvailRingIdx(pDevIns, pVirtio, idxQueue);
    698     uint16_t uAvailIdxShadow = pVirtq->uAvailIdxShadow;
    699 
    700     uint16_t uUsedIdx        = virtioReadUsedRingIdx(pDevIns, pVirtio, idxQueue);
    701     uint16_t uUsedIdxShadow  = pVirtq->uUsedIdxShadow;
     697    uint16_t uAvailIdx       = virtioReadAvailRingIdx(pDevIns, pVirtio, idxVirtq);
     698    uint16_t uAvailIdxShadow = pVirtqState->uAvailIdxShadow;
     699
     700    uint16_t uUsedIdx        = virtioReadUsedRingIdx(pDevIns, pVirtio, idxVirtq);
     701    uint16_t uUsedIdxShadow  = pVirtqState->uUsedIdxShadow;
    702702
    703703    PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    704704
    705     bool fEmpty = IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtq);
    706 
    707     LogFunc(("%s, empty = %s\n", VIRTQNAME(pVirtio, idxQueue), fEmpty ? "true" : "false"));
     705    bool fEmpty = IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtqState);
     706
     707    LogFunc(("%s, empty = %s\n", VIRTQNAME(pVirtio, idxVirtq), fEmpty ? "true" : "false"));
    708708
    709709    int cSendSegs = 0, cReturnSegs = 0;
    710710    if (!fEmpty)
    711711    {
    712         virtioCoreR3QueuePeek(pDevIns,  pVirtio, idxQueue, &pDescChain);
     712        virtioCoreR3VirtqPeek(pDevIns,  pVirtio, idxVirtq, &pDescChain);
    713713        cSendSegs   = pDescChain->pSgPhysSend ? pDescChain->pSgPhysSend->cSegs : 0;
    714714        cReturnSegs = pDescChain->pSgPhysReturn ? pDescChain->pSgPhysReturn->cSegs : 0;
    715715    }
    716716
    717     bool fAvailNoInterrupt   = virtioReadAvailRingFlags(pDevIns, pVirtio, idxQueue) & VIRTQ_AVAIL_F_NO_INTERRUPT;
    718     bool fUsedNoNotify       = virtioReadUsedRingFlags(pDevIns, pVirtio, idxQueue) & VIRTQ_USED_F_NO_NOTIFY;
    719 
    720 
    721     pHlp->pfnPrintf(pHlp, "       queue enabled: ........... %s\n", pVirtio->uQueueEnable[idxQueue] ? "true" : "false");
    722     pHlp->pfnPrintf(pHlp, "       size: .................... %d\n", pVirtio->uQueueSize[idxQueue]);
    723     pHlp->pfnPrintf(pHlp, "       notify offset: ........... %d\n", pVirtio->uQueueNotifyOff[idxQueue]);
     717    bool fAvailNoInterrupt   = virtioReadAvailRingFlags(pDevIns, pVirtio, idxVirtq) & VIRTQ_AVAIL_F_NO_INTERRUPT;
     718    bool fUsedNoNotify       = virtioReadUsedRingFlags(pDevIns, pVirtio, idxVirtq) & VIRTQ_USED_F_NO_NOTIFY;
     719
     720
     721    pHlp->pfnPrintf(pHlp, "       queue enabled: ........... %s\n", pVirtio->uVirtqEnable[idxVirtq] ? "true" : "false");
     722    pHlp->pfnPrintf(pHlp, "       size: .................... %d\n", pVirtio->uVirtqSize[idxVirtq]);
     723    pHlp->pfnPrintf(pHlp, "       notify offset: ........... %d\n", pVirtio->uVirtqNotifyOff[idxVirtq]);
    724724    if (pVirtio->fMsiSupport)
    725         pHlp->pfnPrintf(pHlp, "       MSIX vector: ....... %4.4x\n", pVirtio->uQueueMsixVector[idxQueue]);
     725        pHlp->pfnPrintf(pHlp, "       MSIX vector: ....... %4.4x\n", pVirtio->uVirtqMsixVector[idxVirtq]);
    726726    pHlp->pfnPrintf(pHlp, "\n");
    727727    pHlp->pfnPrintf(pHlp, "       avail ring (%d entries):\n", uAvailIdx - uAvailIdxShadow);
     
    747747        {
    748748            pHlp->pfnPrintf(pHlp, "             index: ............. %d\n", pDescChain->pSgPhysSend->idxSeg);
    749             pHlp->pfnPrintf(pHlp, "             unsent ............. %d\n",  pDescChain->pSgPhysSend->cbSegLeft);
     749            pHlp->pfnPrintf(pHlp, "             unsent ............. %d\n", pDescChain->pSgPhysSend->cbSegLeft);
    750750        }
    751751        pHlp->pfnPrintf(pHlp, "\n");
     
    755755        {
    756756            pHlp->pfnPrintf(pHlp, "             index: ............. %d\n", pDescChain->pSgPhysReturn->idxSeg);
    757             pHlp->pfnPrintf(pHlp, "             unsent ............. %d\n",  pDescChain->pSgPhysReturn->cbSegLeft);
     757            pHlp->pfnPrintf(pHlp, "             unsent ............. %d\n", pDescChain->pSgPhysReturn->cbSegLeft);
    758758        }
    759759    } else
     
    767767 *
    768768 * @param   pVirtio     Pointer to the shared virtio state.
    769  * @param   idxQueue    Queue number
     769 * @param   idxVirtq    Virtq number
    770770 * @param   pcszName    Name to give queue
    771771 *
    772772 * @returns VBox status code.
    773773 */
    774 int virtioCoreR3QueueAttach(PVIRTIOCORE pVirtio, uint16_t idxQueue, const char *pcszName)
     774int virtioCoreR3VirtqAttach(PVIRTIOCORE pVirtio, uint16_t idxVirtq, const char *pcszName)
    775775{
    776776    LogFunc(("%s\n", pcszName));
    777     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
    778     pVirtq->idxQueue = idxQueue;
    779     pVirtq->uAvailIdxShadow = 0;
    780     pVirtq->uUsedIdxShadow  = 0;
    781     pVirtq->fVirtqRingEventThreshold = false;
    782     RTStrCopy(pVirtq->szVirtqName, sizeof(pVirtq->szVirtqName), pcszName);
     777    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
     778    pVirtqState->idxVirtq = idxVirtq;
     779    pVirtqState->uAvailIdxShadow = 0;
     780    pVirtqState->uUsedIdxShadow  = 0;
     781    pVirtqState->fVirtqRingEventThreshold = false;
     782    RTStrCopy(pVirtqState->szVirtqName, sizeof(pVirtqState->szVirtqName), pcszName);
    783783    return VINF_SUCCESS;
    784784}
     
    788788#ifdef IN_RING3
    789789
    790 int virtioCoreR3DescChainGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     790int virtioCoreR3DescChainGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    791791                             uint16_t uHeadIdx, PPVIRTIO_DESC_CHAIN_T ppDescChain)
    792792{
     
    794794    *ppDescChain = NULL;
    795795
    796     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    797 
    798     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
    799 
    800     AssertMsgReturn(IS_DRIVER_OK(pVirtio) && pVirtio->uQueueEnable[idxQueue],
     796    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     797
     798    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
     799
     800    AssertMsgReturn(IS_DRIVER_OK(pVirtio) && pVirtio->uVirtqEnable[idxVirtq],
    801801                    ("Guest driver not in ready state.\n"), VERR_INVALID_STATE);
    802802
    803803    uint16_t uDescIdx = uHeadIdx;
    804804
    805     Log6Func(("%s DESC CHAIN: (head) desc_idx=%u\n", pVirtq->szVirtqName, uHeadIdx));
    806     RT_NOREF(pVirtq);
     805    Log6Func(("%s DESC CHAIN: (head) desc_idx=%u\n", pVirtqState->szVirtqName, uHeadIdx));
     806    RT_NOREF(pVirtqState);
    807807
    808808    /*
     
    853853        RT_UNTRUSTED_VALIDATED_FENCE();
    854854
    855         virtioReadDesc(pDevIns, pVirtio, idxQueue, uDescIdx, &desc);
     855        virtioReadDesc(pDevIns, pVirtio, idxVirtq, uDescIdx, &desc);
    856856
    857857        if (desc.fFlags & VIRTQ_DESC_F_WRITE)
    858858        {
    859             Log6Func(("%s IN  desc_idx=%u seg=%u addr=%RGp cb=%u\n", VIRTQNAME(pVirtio, idxQueue), uDescIdx, cSegsIn, desc.GCPhysBuf, desc.cb));
     859            Log6Func(("%s IN  desc_idx=%u seg=%u addr=%RGp cb=%u\n", VIRTQNAME(pVirtio, idxVirtq), uDescIdx, cSegsIn, desc.GCPhysBuf, desc.cb));
    860860            cbIn += desc.cb;
    861861            pSeg = &paSegsIn[cSegsIn++];
     
    863863        else
    864864        {
    865             Log6Func(("%s OUT desc_idx=%u seg=%u addr=%RGp cb=%u\n", VIRTQNAME(pVirtio, idxQueue), uDescIdx, cSegsOut, desc.GCPhysBuf, desc.cb));
     865            Log6Func(("%s OUT desc_idx=%u seg=%u addr=%RGp cb=%u\n", VIRTQNAME(pVirtio, idxVirtq), uDescIdx, cSegsOut, desc.GCPhysBuf, desc.cb));
    866866            cbOut += desc.cb;
    867867            pSeg = &paSegsOut[cSegsOut++];
     
    899899
    900900    STAM_REL_COUNTER_INC(&pVirtio->StatDescChainsAllocated);
    901     Log6Func(("%s -- segs OUT: %u (%u bytes)   IN: %u (%u bytes) --\n", pVirtq->szVirtqName, cSegsOut, cbOut, cSegsIn, cbIn));
     901    Log6Func(("%s -- segs OUT: %u (%u bytes)   IN: %u (%u bytes) --\n", pVirtqState->szVirtqName, cSegsOut, cbOut, cSegsIn, cbIn));
    902902
    903903    return VINF_SUCCESS;
     
    964964 *
    965965 * @param   pVirtio     Pointer to the shared virtio state.
    966  * @param   idxQueue    Queue number
     966 * @param   idxVirtq    Virtq number
    967967 * @param   fEnable    Selects notification mode (enabled or disabled)
    968968 */
    969 void virtioCoreQueueNotifyEnable(PVIRTIOCORE pVirtio, uint16_t idxQueue, bool fEnable)
     969void virtioCoreVirtqNotifyEnable(PVIRTIOCORE pVirtio, uint16_t idxVirtq, bool fEnable)
    970970{
    971971    if (pVirtio->uDeviceStatus & VIRTIO_STATUS_DRIVER_OK)
    972972    {
    973         uint16_t fFlags = virtioReadUsedRingFlags(pVirtio->pDevInsR3, pVirtio, idxQueue);
     973        uint16_t fFlags = virtioReadUsedRingFlags(pVirtio->pDevInsR3, pVirtio, idxVirtq);
    974974
    975975        if (fEnable)
     
    978978            fFlags |= VIRTQ_USED_F_NO_NOTIFY;
    979979
    980         virtioWriteUsedRingFlags(pVirtio->pDevInsR3, pVirtio, idxQueue, fFlags);
     980        virtioWriteUsedRingFlags(pVirtio->pDevInsR3, pVirtio, idxVirtq, fFlags);
    981981    }
    982982}
     
    999999}
    10001000
    1001 
    1002 
    10031001/**
    10041002 * Fetches descriptor chain using avail ring of indicated queue and converts the descriptor
    10051003 * chain into its OUT (to device) and IN to guest components, but does NOT remove it from
    1006  * the 'avail' queue. I.e. doesn't advance the index.  This can be used with virtioQueueSkip(),
     1004 * the 'avail' queue. I.e. doesn't advance the index.  This can be used with virtioVirtqSkip(),
    10071005 * which *does* advance the avail index. Together they facilitate a mechanism that allows
    10081006 * work with a queue element (descriptor chain) to be aborted if necessary, by not advancing
     
    10111009 * Additionally it converts the OUT desc chain data to a contiguous virtual
    10121010 * memory buffer for easy consumption by the caller. The caller must return the
    1013  * descriptor chain pointer via virtioCoreR3QueuePut() and then call virtioCoreQueueSync()
     1011 * descriptor chain pointer via virtioCoreR3VirtqPut() and then call virtioCoreVirtqSync()
    10141012 * at some point to return the data to the guest and complete the transaction.
    10151013 *
    10161014 * @param   pDevIns     The device instance.
    10171015 * @param   pVirtio     Pointer to the shared virtio state.
    1018  * @param   idxQueue    Queue number
     1016 * @param   idxVirtq    Virtq number
    10191017 * @param   ppDescChain Address to store pointer to descriptor chain that contains the
    10201018 *                      pre-processed transaction information pulled from the virtq.
     
    10261024 */
    10271025
    1028 int virtioCoreR3QueuePeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     1026int virtioCoreR3VirtqPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    10291027                         PPVIRTIO_DESC_CHAIN_T ppDescChain)
    10301028{
    1031     return virtioCoreR3QueueGet(pDevIns, pVirtio,  idxQueue, ppDescChain, false);
    1032 }
    1033 
    1034 /**
    1035  * Skip the next entry in the specified queue (typically used with virtioCoreR3QueuePeek())
     1029    return virtioCoreR3VirtqGet(pDevIns, pVirtio,  idxVirtq, ppDescChain, false);
     1030}
     1031
     1032/**
     1033 * Skip the next entry in the specified queue (typically used with virtioCoreR3VirtqPeek())
    10361034 *
    10371035 * @param   pVirtio     Pointer to the virtio state.
    1038  * @param   idxQueue    Index of queue
    1039  */
    1040 int virtioCoreR3QueueSkip(PVIRTIOCORE pVirtio, uint16_t idxQueue)
    1041 {
    1042     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    1043     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
    1044 
    1045     AssertMsgReturn(IS_DRIVER_OK(pVirtio) && pVirtio->uQueueEnable[idxQueue],
     1036 * @param   idxVirtq    Index of queue
     1037 */
     1038int virtioCoreR3VirtqSkip(PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     1039{
     1040    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     1041    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
     1042
     1043    AssertMsgReturn(IS_DRIVER_OK(pVirtio) && pVirtio->uVirtqEnable[idxVirtq],
    10461044                    ("Guest driver not in ready state.\n"), VERR_INVALID_STATE);
    10471045
    1048     if (IS_VIRTQ_EMPTY(pVirtio->pDevInsR3, pVirtio, pVirtq))
     1046    if (IS_VIRTQ_EMPTY(pVirtio->pDevInsR3, pVirtio, pVirtqState))
    10491047        return VERR_NOT_AVAILABLE;
    10501048
    1051     Log6Func(("%s avail shadow idx: %u\n", pVirtq->szVirtqName, pVirtq->uAvailIdxShadow));
    1052     pVirtq->uAvailIdxShadow++;
     1049    Log6Func(("%s avail shadow idx: %u\n", pVirtqState->szVirtqName, pVirtqState->uAvailIdxShadow));
     1050    pVirtqState->uAvailIdxShadow++;
    10531051
    10541052    return VINF_SUCCESS;
     
    10611059 * Additionally it converts the OUT desc chain data to a contiguous virtual
    10621060 * memory buffer for easy consumption by the caller. The caller must return the
    1063  * descriptor chain pointer via virtioCoreR3QueuePut() and then call virtioCoreQueueSync()
     1061 * descriptor chain pointer via virtioCoreR3VirtqPut() and then call virtioCoreVirtqSync()
    10641062 * at some point to return the data to the guest and complete the transaction.
    10651063 *
    10661064 * @param   pDevIns     The device instance.
    10671065 * @param   pVirtio     Pointer to the shared virtio state.
    1068  * @param   idxQueue    Queue number
     1066 * @param   idxVirtq    Virtq number
    10691067 * @param   ppDescChain Address to store pointer to descriptor chain that contains the
    10701068 *                      pre-processed transaction information pulled from the virtq.
     
    10781076 * @retval  VERR_NOT_AVAILABLE   If the queue is empty.
    10791077 */
    1080 int virtioCoreR3QueueGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     1078int virtioCoreR3VirtqGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    10811079                         PPVIRTIO_DESC_CHAIN_T ppDescChain, bool fRemove)
    10821080{
    1083     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
    1084 
    1085     if (IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtq))
     1081    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
     1082
     1083    if (IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtqState))
    10861084        return VERR_NOT_AVAILABLE;
    10871085
    1088     uint16_t uHeadIdx = virtioReadAvailDescIdx(pDevIns, pVirtio, idxQueue, pVirtq->uAvailIdxShadow);
     1086    uint16_t uHeadIdx = virtioReadAvailDescIdx(pDevIns, pVirtio, idxVirtq, pVirtqState->uAvailIdxShadow);
    10891087
    10901088    if (pVirtio->uDriverFeatures & VIRTIO_F_EVENT_IDX)
    1091         virtioWriteUsedAvailEvent(pDevIns,pVirtio, idxQueue, pVirtq->uAvailIdxShadow + 1);
     1089        virtioWriteUsedAvailEvent(pDevIns,pVirtio, idxVirtq, pVirtqState->uAvailIdxShadow + 1);
    10921090
    10931091    if (fRemove)
    1094         pVirtq->uAvailIdxShadow++;
    1095 
    1096     int rc = virtioCoreR3DescChainGet(pDevIns, pVirtio, idxQueue, uHeadIdx, ppDescChain);
     1092        pVirtqState->uAvailIdxShadow++;
     1093
     1094    int rc = virtioCoreR3DescChainGet(pDevIns, pVirtio, idxVirtq, uHeadIdx, ppDescChain);
    10971095    return rc;
    10981096}
    10991097
    11001098/**
    1101  * Returns data to the guest to complete a transaction initiated by virtQueueGet().
     1099 * Returns data to the guest to complete a transaction initiated by virtVirtqGet().
    11021100 *
    11031101 * The caller passes in a pointer to a scatter-gather buffer of virtual memory segments
     
    11081106 *
    11091107 * @note This does a write-ahead to the used ring of the guest's queue. The data
    1110  *       written won't be seen by the guest until the next call to virtioCoreQueueSync()
     1108 *       written won't be seen by the guest until the next call to virtioCoreVirtqSync()
    11111109 *
    11121110 *
    11131111 * @param   pDevIns         The device instance (for reading).
    11141112 * @param   pVirtio         Pointer to the shared virtio state.
    1115  * @param   idxQueue        Queue number
     1113 * @param   idxVirtq        Virtq number
    11161114 *
    11171115 * @param   pSgVirtReturn   Points to scatter-gather buffer of virtual memory
     
    11271125 * @retval  VINF_SUCCESS       Success
    11281126 * @retval  VERR_INVALID_STATE VirtIO not in ready state
    1129  * @retval  VERR_NOT_AVAILABLE Queue is empty
     1127 * @retval  VERR_NOT_AVAILABLE Virtq is empty
    11301128 *
    11311129 * @note    This function will not release any reference to pDescChain.  The
    11321130 *          caller must take care of that.
    11331131 */
    1134 int virtioCoreR3QueuePut(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, PRTSGBUF pSgVirtReturn,
     1132int virtioCoreR3VirtqPut(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, PRTSGBUF pSgVirtReturn,
    11351133                         PVIRTIO_DESC_CHAIN_T pDescChain, bool fFence)
    11361134{
    1137     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    1138     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
     1135    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     1136    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
    11391137    PVIRTIOSGBUF pSgPhysReturn = pDescChain->pSgPhysReturn;
    11401138
     
    11451143
    11461144    Log6Func(("Copying client data to %s, desc chain (head desc_idx %d)\n",
    1147               VIRTQNAME(pVirtio, idxQueue), virtioReadUsedRingIdx(pDevIns, pVirtio, idxQueue)));
     1145              VIRTQNAME(pVirtio, idxVirtq), virtioReadUsedRingIdx(pDevIns, pVirtio, idxVirtq)));
    11481146
    11491147    /* Copy s/g buf (virtual memory) to guest phys mem (IN direction). */
     
    11751173    /* If this write-ahead crosses threshold where the driver wants to get an event flag it */
    11761174    if (pVirtio->uDriverFeatures & VIRTIO_F_EVENT_IDX)
    1177         if (pVirtq->uUsedIdxShadow == virtioReadAvailUsedEvent(pDevIns, pVirtio, idxQueue))
    1178             pVirtq->fVirtqRingEventThreshold = true;
     1175        if (pVirtqState->uUsedIdxShadow == virtioReadAvailUsedEvent(pDevIns, pVirtio, idxVirtq))
     1176            pVirtqState->fVirtqRingEventThreshold = true;
    11791177
    11801178    /*
    11811179     * Place used buffer's descriptor in used ring but don't update used ring's slot index.
    1182      * That will be done with a subsequent client call to virtioCoreQueueSync() */
    1183     virtioWriteUsedElem(pDevIns, pVirtio, idxQueue, pVirtq->uUsedIdxShadow++, pDescChain->uHeadIdx, (uint32_t)cbTotal);
     1180     * That will be done with a subsequent client call to virtioCoreVirtqSync() */
     1181    virtioWriteUsedElem(pDevIns, pVirtio, idxVirtq, pVirtqState->uUsedIdxShadow++, pDescChain->uHeadIdx, (uint32_t)cbTotal);
    11841182
    11851183    if (pSgVirtReturn)
     
    11881186
    11891187    Log6Func(("Write ahead used_idx=%u, %s used_idx=%u\n",
    1190               pVirtq->uUsedIdxShadow, VIRTQNAME(pVirtio, idxQueue), virtioReadUsedRingIdx(pDevIns, pVirtio, idxQueue)));
     1188              pVirtqState->uUsedIdxShadow, VIRTQNAME(pVirtio, idxVirtq), virtioReadUsedRingIdx(pDevIns, pVirtio, idxVirtq)));
    11911189
    11921190    return VINF_SUCCESS;
     
    11981196 * Updates the indicated virtq's "used ring" descriptor index to match the
    11991197 * current write-head index, thus exposing the data added to the used ring by all
    1200  * virtioCoreR3QueuePut() calls since the last sync. This should be called after one or
    1201  * more virtioCoreR3QueuePut() calls to inform the guest driver there is data in the queue.
     1198 * virtioCoreR3VirtqPut() calls since the last sync. This should be called after one or
     1199 * more virtioCoreR3VirtqPut() calls to inform the guest driver there is data in the queue.
    12021200 * Explicit notifications (e.g. interrupt or MSI-X) will be sent to the guest,
    12031201 * depending on VirtIO features negotiated and conditions, otherwise the guest
     
    12061204 * @param   pDevIns     The device instance.
    12071205 * @param   pVirtio     Pointer to the shared virtio state.
    1208  * @param   idxQueue    Queue number
     1206 * @param   idxVirtq    Virtq number
    12091207 *
    12101208 * @returns VBox status code.
     
    12121210 * @retval  VERR_INVALID_STATE VirtIO not in ready state
    12131211 */
    1214 int virtioCoreQueueSync(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
    1215 {
    1216     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    1217     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
    1218 
    1219     AssertMsgReturn(IS_DRIVER_OK(pVirtio) && pVirtio->uQueueEnable[idxQueue],
     1212int virtioCoreVirtqSync(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     1213{
     1214    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     1215    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
     1216
     1217    AssertMsgReturn(IS_DRIVER_OK(pVirtio) && pVirtio->uVirtqEnable[idxVirtq],
    12201218                    ("Guest driver not in ready state.\n"), VERR_INVALID_STATE);
    12211219
    12221220    Log6Func(("Updating %s used_idx to %u\n",
    1223               VIRTQNAME(pVirtio, idxQueue), pVirtq->uUsedIdxShadow));
    1224 
    1225     virtioWriteUsedRingIdx(pDevIns, pVirtio, idxQueue, pVirtq->uUsedIdxShadow);
    1226     virtioCoreNotifyGuestDriver(pDevIns, pVirtio, idxQueue);
     1221              VIRTQNAME(pVirtio, idxVirtq), pVirtqState->uUsedIdxShadow));
     1222
     1223    virtioWriteUsedRingIdx(pDevIns, pVirtio, idxVirtq, pVirtqState->uUsedIdxShadow);
     1224    virtioCoreNotifyGuestDriver(pDevIns, pVirtio, idxVirtq);
    12271225
    12281226    return VINF_SUCCESS;
     
    12321230/**
    12331231 */
    1234 static void virtioCoreQueueNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, uint16_t uNotifyIdx)
     1232static void virtioCoreVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, uint16_t uNotifyIdx)
    12351233{
    12361234
    12371235    PVIRTIOCORECC pVirtioCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIOCORECC);
    12381236
    1239     /* See VirtIO 1.0, section 4.1.5.2 It implies that idxQueue and uNotifyIdx should match.
     1237    /* See VirtIO 1.0, section 4.1.5.2 It implies that idxVirtq and uNotifyIdx should match.
    12401238     * Disregarding this notification may cause throughput to stop, however there's no way to know
    12411239     * which was queue was intended for wake-up if the two parameters disagree. */
    12421240
    1243     AssertMsg(uNotifyIdx == idxQueue,
     1241    AssertMsg(uNotifyIdx == idxVirtq,
    12441242                    ("Guest kicked virtq %d's notify addr w/non-corresponding virtq idx %d\n",
    1245                      idxQueue, uNotifyIdx));
     1243                     idxVirtq, uNotifyIdx));
    12461244    RT_NOREF(uNotifyIdx);
    12471245
    1248     AssertReturnVoid(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
     1246    AssertReturnVoid(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
    12491247    Log6Func(("%s (desc chains: %u)\n",
    1250         pVirtio->virtqState[idxQueue].szVirtqName,
    1251         virtioCoreQueueAvailCount(pDevIns, pVirtio, idxQueue)));
     1248        pVirtio->aVirtqState[idxVirtq].szVirtqName,
     1249        virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq)));
    12521250
    12531251    /* Inform client */
    1254     pVirtioCC->pfnQueueNotified(pDevIns, pVirtio, idxQueue);
     1252    pVirtioCC->pfnVirtqNotified(pDevIns, pVirtio, idxVirtq);
    12551253}
    12561254
     
    12641262 * @param   pDevIns     The device instance.
    12651263 * @param   pVirtio     Pointer to the shared virtio state.
    1266  * @param   idxQueue    Queue to check for guest interrupt handling preference
    1267  */
    1268 static void virtioCoreNotifyGuestDriver(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
    1269 {
    1270 
    1271     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    1272     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
     1264 * @param   idxVirtq    Virtq to check for guest interrupt handling preference
     1265 */
     1266static void virtioCoreNotifyGuestDriver(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     1267{
     1268
     1269    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     1270    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
    12731271
    12741272    if (!IS_DRIVER_OK(pVirtio))
     
    12801278    if (pVirtio->uDriverFeatures & VIRTIO_F_EVENT_IDX)
    12811279    {
    1282         if (pVirtq->fVirtqRingEventThreshold)
     1280        if (pVirtqState->fVirtqRingEventThreshold)
    12831281        {
    12841282#ifdef IN_RING3
    12851283            Log6Func(("...kicking guest %s, VIRTIO_F_EVENT_IDX set and threshold (%d) reached\n",
    1286                    VIRTQNAME(pVirtio, idxQueue), (uint16_t)virtioReadAvailUsedEvent(pDevIns, pVirtio, idxQueue)));
     1284                   VIRTQNAME(pVirtio, idxVirtq), (uint16_t)virtioReadAvailUsedEvent(pDevIns, pVirtio, idxVirtq)));
    12871285#endif
    1288             virtioKick(pDevIns, pVirtio, VIRTIO_ISR_VIRTQ_INTERRUPT, pVirtio->uQueueMsixVector[idxQueue]);
    1289             pVirtq->fVirtqRingEventThreshold = false;
     1286            virtioKick(pDevIns, pVirtio, VIRTIO_ISR_VIRTQ_INTERRUPT, pVirtio->uVirtqMsixVector[idxVirtq]);
     1287            pVirtqState->fVirtqRingEventThreshold = false;
    12901288            return;
    12911289        }
    12921290#ifdef IN_RING3
    12931291        Log6Func(("...skip interrupt %s, VIRTIO_F_EVENT_IDX set but threshold (%d) not reached (%d)\n",
    1294                    VIRTQNAME(pVirtio, idxQueue),(uint16_t)virtioReadAvailUsedEvent(pDevIns, pVirtio, idxQueue), pVirtq->uUsedIdxShadow));
     1292                   VIRTQNAME(pVirtio, idxVirtq),(uint16_t)virtioReadAvailUsedEvent(pDevIns, pVirtio, idxVirtq), pVirtqState->uUsedIdxShadow));
    12951293#endif
    12961294    }
     
    12981296    {
    12991297        /** If guest driver hasn't suppressed interrupts, interrupt  */
    1300         if (!(virtioReadAvailRingFlags(pDevIns, pVirtio, idxQueue) & VIRTQ_AVAIL_F_NO_INTERRUPT))
    1301         {
    1302             virtioKick(pDevIns, pVirtio, VIRTIO_ISR_VIRTQ_INTERRUPT, pVirtio->uQueueMsixVector[idxQueue]);
     1298        if (!(virtioReadAvailRingFlags(pDevIns, pVirtio, idxVirtq) & VIRTQ_AVAIL_F_NO_INTERRUPT))
     1299        {
     1300            virtioKick(pDevIns, pVirtio, VIRTIO_ISR_VIRTQ_INTERRUPT, pVirtio->uVirtqMsixVector[idxVirtq]);
    13031301            return;
    13041302        }
    13051303        Log6Func(("...skipping interrupt for %s (guest set VIRTQ_AVAIL_F_NO_INTERRUPT)\n",
    1306                      VIRTQNAME(pVirtio, idxQueue)));
     1304                     VIRTQNAME(pVirtio, idxVirtq)));
    13071305    }
    13081306}
     
    13491347
    13501348#ifdef IN_RING3
    1351 static void virtioResetQueue(PVIRTIOCORE pVirtio, uint16_t idxQueue)
    1352 {
    1353     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    1354     PVIRTQSTATE pVirtq = &pVirtio->virtqState[idxQueue];
    1355     pVirtq->uAvailIdxShadow = 0;
    1356     pVirtq->uUsedIdxShadow  = 0;
    1357     pVirtq->fVirtqRingEventThreshold = false;
    1358     pVirtio->uQueueEnable[idxQueue] = false;
    1359     pVirtio->uQueueSize[idxQueue] = VIRTQ_MAX_ENTRIES;
    1360     pVirtio->uQueueNotifyOff[idxQueue] = idxQueue;
    1361     pVirtio->uQueueMsixVector[idxQueue] = idxQueue + 2;
     1349static void virtioResetVirtq(PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     1350{
     1351    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     1352    PVIRTQSTATE pVirtqState = &pVirtio->aVirtqState[idxVirtq];
     1353    pVirtqState->uAvailIdxShadow = 0;
     1354    pVirtqState->uUsedIdxShadow  = 0;
     1355    pVirtqState->fVirtqRingEventThreshold = false;
     1356    pVirtio->uVirtqEnable[idxVirtq] = false;
     1357    pVirtio->uVirtqSize[idxVirtq] = VIRTQ_MAX_ENTRIES;
     1358    pVirtio->uVirtqNotifyOff[idxVirtq] = idxVirtq;
     1359    pVirtio->uVirtqMsixVector[idxVirtq] = idxVirtq + 2;
    13621360    if (!pVirtio->fMsiSupport) /* VirtIO 1.0, 4.1.4.3 and 4.1.5.1.2 */
    1363         pVirtio->uQueueMsixVector[idxQueue] = VIRTIO_MSI_NO_VECTOR;
    1364 
    1365     virtioLowerInterrupt(pVirtio->pDevInsR3, pVirtio->uQueueMsixVector[idxQueue]);
     1361        pVirtio->uVirtqMsixVector[idxVirtq] = VIRTIO_MSI_NO_VECTOR;
     1362
     1363    virtioLowerInterrupt(pVirtio->pDevInsR3, pVirtio->uVirtqMsixVector[idxVirtq]);
    13661364}
    13671365
     
    13821380        for (int i = 0; i < VIRTQ_MAX_CNT; i++)
    13831381        {
    1384             virtioLowerInterrupt(pDevIns, pVirtio->uQueueMsixVector[i]);
    1385             pVirtio->uQueueMsixVector[i];
     1382            virtioLowerInterrupt(pDevIns, pVirtio->uVirtqMsixVector[i]);
     1383            pVirtio->uVirtqMsixVector[i];
    13861384        }
    13871385    }
     
    13901388        pVirtio->uMsixConfig = VIRTIO_MSI_NO_VECTOR;
    13911389
    1392     for (uint16_t idxQueue = 0; idxQueue < VIRTQ_MAX_CNT; idxQueue++)
    1393         virtioResetQueue(pVirtio, idxQueue);
     1390    for (uint16_t idxVirtq = 0; idxVirtq < VIRTQ_MAX_CNT; idxVirtq++)
     1391        virtioResetVirtq(pVirtio, idxVirtq);
    13941392}
    13951393
     
    15791577        }
    15801578    }
    1581     else if (MATCH_COMMON_CFG(uNumQueues))
     1579    else if (MATCH_COMMON_CFG(uNumVirtqs))
    15821580    {
    15831581        if (fWrite)
     
    15891587        {
    15901588            *(uint16_t *)pv = VIRTQ_MAX_CNT;
    1591             LOG_COMMON_CFG_ACCESS(uNumQueues, 0);
     1589            LOG_COMMON_CFG_ACCESS(uNumVirtqs, 0);
    15921590        }
    15931591    }
     
    16511649        COMMON_CFG_ACCESSOR_READONLY(uConfigGeneration);
    16521650    else
    1653     if (MATCH_COMMON_CFG(uQueueSelect))
    1654         COMMON_CFG_ACCESSOR(uQueueSelect);
    1655     else
    1656     if (MATCH_COMMON_CFG(uQueueSize))
    1657         COMMON_CFG_ACCESSOR_INDEXED(uQueueSize, pVirtio->uQueueSelect);
    1658     else
    1659     if (MATCH_COMMON_CFG(uQueueMsixVector))
    1660         COMMON_CFG_ACCESSOR_INDEXED(uQueueMsixVector, pVirtio->uQueueSelect);
    1661     else
    1662     if (MATCH_COMMON_CFG(uQueueEnable))
    1663         COMMON_CFG_ACCESSOR_INDEXED(uQueueEnable, pVirtio->uQueueSelect);
    1664     else
    1665     if (MATCH_COMMON_CFG(uQueueNotifyOff))
    1666         COMMON_CFG_ACCESSOR_INDEXED_READONLY(uQueueNotifyOff, pVirtio->uQueueSelect);
    1667     else
    1668     if (MATCH_COMMON_CFG(aGCPhysQueueDesc))
    1669         COMMON_CFG_ACCESSOR_INDEXED(aGCPhysQueueDesc, pVirtio->uQueueSelect);
    1670     else
    1671     if (MATCH_COMMON_CFG(aGCPhysQueueAvail))
    1672         COMMON_CFG_ACCESSOR_INDEXED(aGCPhysQueueAvail, pVirtio->uQueueSelect);
    1673     else
    1674     if (MATCH_COMMON_CFG(aGCPhysQueueUsed))
    1675         COMMON_CFG_ACCESSOR_INDEXED(aGCPhysQueueUsed, pVirtio->uQueueSelect);
     1651    if (MATCH_COMMON_CFG(uVirtqSelect))
     1652        COMMON_CFG_ACCESSOR(uVirtqSelect);
     1653    else
     1654    if (MATCH_COMMON_CFG(uVirtqSize))
     1655        COMMON_CFG_ACCESSOR_INDEXED(uVirtqSize, pVirtio->uVirtqSelect);
     1656    else
     1657    if (MATCH_COMMON_CFG(uVirtqMsixVector))
     1658        COMMON_CFG_ACCESSOR_INDEXED(uVirtqMsixVector, pVirtio->uVirtqSelect);
     1659    else
     1660    if (MATCH_COMMON_CFG(uVirtqEnable))
     1661        COMMON_CFG_ACCESSOR_INDEXED(uVirtqEnable, pVirtio->uVirtqSelect);
     1662    else
     1663    if (MATCH_COMMON_CFG(uVirtqNotifyOff))
     1664        COMMON_CFG_ACCESSOR_INDEXED_READONLY(uVirtqNotifyOff, pVirtio->uVirtqSelect);
     1665    else
     1666    if (MATCH_COMMON_CFG(aGCPhysVirtqDesc))
     1667        COMMON_CFG_ACCESSOR_INDEXED(aGCPhysVirtqDesc, pVirtio->uVirtqSelect);
     1668    else
     1669    if (MATCH_COMMON_CFG(aGCPhysVirtqAvail))
     1670        COMMON_CFG_ACCESSOR_INDEXED(aGCPhysVirtqAvail, pVirtio->uVirtqSelect);
     1671    else
     1672    if (MATCH_COMMON_CFG(aGCPhysVirtqUsed))
     1673        COMMON_CFG_ACCESSOR_INDEXED(aGCPhysVirtqUsed, pVirtio->uVirtqSelect);
    16761674    else
    16771675    {
     
    18091807    if (MATCHES_VIRTIO_CAP_STRUCT(off, cb, uOffset, pVirtio->LocNotifyCap) && cb == sizeof(uint16_t))
    18101808    {
    1811         virtioCoreQueueNotified(pDevIns, pVirtio, uOffset / VIRTIO_NOTIFY_OFFSET_MULTIPLIER, *(uint16_t *)pv);
     1809        virtioCoreVirtqNotified(pDevIns, pVirtio, uOffset / VIRTIO_NOTIFY_OFFSET_MULTIPLIER, *(uint16_t *)pv);
    18121810        return VINF_SUCCESS;
    18131811    }
     
    19181916    pHlp->pfnSSMPutU8(pSSM,     pVirtio->uPciCfgDataOff);
    19191917    pHlp->pfnSSMPutU8(pSSM,     pVirtio->uISR);
    1920     pHlp->pfnSSMPutU16(pSSM,    pVirtio->uQueueSelect);
     1918    pHlp->pfnSSMPutU16(pSSM,    pVirtio->uVirtqSelect);
    19211919    pHlp->pfnSSMPutU32(pSSM,    pVirtio->uDeviceFeaturesSelect);
    19221920    pHlp->pfnSSMPutU32(pSSM,    pVirtio->uDriverFeaturesSelect);
     
    19251923    for (uint32_t i = 0; i < VIRTQ_MAX_CNT; i++)
    19261924    {
    1927         pHlp->pfnSSMPutGCPhys64(pSSM, pVirtio->aGCPhysQueueDesc[i]);
    1928         pHlp->pfnSSMPutGCPhys64(pSSM, pVirtio->aGCPhysQueueAvail[i]);
    1929         pHlp->pfnSSMPutGCPhys64(pSSM, pVirtio->aGCPhysQueueUsed[i]);
    1930         pHlp->pfnSSMPutU16(pSSM,      pVirtio->uQueueNotifyOff[i]);
    1931         pHlp->pfnSSMPutU16(pSSM,      pVirtio->uQueueMsixVector[i]);
    1932         pHlp->pfnSSMPutU16(pSSM,      pVirtio->uQueueEnable[i]);
    1933         pHlp->pfnSSMPutU16(pSSM,      pVirtio->uQueueSize[i]);
    1934         pHlp->pfnSSMPutU16(pSSM,      pVirtio->virtqState[i].uAvailIdxShadow);
    1935         pHlp->pfnSSMPutU16(pSSM,      pVirtio->virtqState[i].uUsedIdxShadow);
    1936         int rc = pHlp->pfnSSMPutMem(pSSM, pVirtio->virtqState[i].szVirtqName, 32);
     1925        pHlp->pfnSSMPutGCPhys64(pSSM, pVirtio->aGCPhysVirtqDesc[i]);
     1926        pHlp->pfnSSMPutGCPhys64(pSSM, pVirtio->aGCPhysVirtqAvail[i]);
     1927        pHlp->pfnSSMPutGCPhys64(pSSM, pVirtio->aGCPhysVirtqUsed[i]);
     1928        pHlp->pfnSSMPutU16(pSSM,      pVirtio->uVirtqNotifyOff[i]);
     1929        pHlp->pfnSSMPutU16(pSSM,      pVirtio->uVirtqMsixVector[i]);
     1930        pHlp->pfnSSMPutU16(pSSM,      pVirtio->uVirtqEnable[i]);
     1931        pHlp->pfnSSMPutU16(pSSM,      pVirtio->uVirtqSize[i]);
     1932        pHlp->pfnSSMPutU16(pSSM,      pVirtio->aVirtqState[i].uAvailIdxShadow);
     1933        pHlp->pfnSSMPutU16(pSSM,      pVirtio->aVirtqState[i].uUsedIdxShadow);
     1934        int rc = pHlp->pfnSSMPutMem(pSSM, pVirtio->aVirtqState[i].szVirtqName, 32);
    19371935        AssertRCReturn(rc, rc);
    19381936    }
     
    19761974    pHlp->pfnSSMGetU8(pSSM,   &pVirtio->uPciCfgDataOff);
    19771975    pHlp->pfnSSMGetU8(pSSM,   &pVirtio->uISR);
    1978     pHlp->pfnSSMGetU16(pSSM,  &pVirtio->uQueueSelect);
     1976    pHlp->pfnSSMGetU16(pSSM,  &pVirtio->uVirtqSelect);
    19791977    pHlp->pfnSSMGetU32(pSSM,  &pVirtio->uDeviceFeaturesSelect);
    19801978    pHlp->pfnSSMGetU32(pSSM,  &pVirtio->uDriverFeaturesSelect);
     
    19831981    for (uint32_t i = 0; i < VIRTQ_MAX_CNT; i++)
    19841982    {
    1985         pHlp->pfnSSMGetGCPhys64(pSSM, &pVirtio->aGCPhysQueueDesc[i]);
    1986         pHlp->pfnSSMGetGCPhys64(pSSM, &pVirtio->aGCPhysQueueAvail[i]);
    1987         pHlp->pfnSSMGetGCPhys64(pSSM, &pVirtio->aGCPhysQueueUsed[i]);
    1988         pHlp->pfnSSMGetU16(pSSM, &pVirtio->uQueueNotifyOff[i]);
    1989         pHlp->pfnSSMGetU16(pSSM, &pVirtio->uQueueMsixVector[i]);
    1990         pHlp->pfnSSMGetU16(pSSM, &pVirtio->uQueueEnable[i]);
    1991         pHlp->pfnSSMGetU16(pSSM, &pVirtio->uQueueSize[i]);
    1992         pHlp->pfnSSMGetU16(pSSM, &pVirtio->virtqState[i].uAvailIdxShadow);
    1993         pHlp->pfnSSMGetU16(pSSM, &pVirtio->virtqState[i].uUsedIdxShadow);
    1994         rc = pHlp->pfnSSMGetMem(pSSM, pVirtio->virtqState[i].szVirtqName,
    1995                                 sizeof(pVirtio->virtqState[i].szVirtqName));
     1983        pHlp->pfnSSMGetGCPhys64(pSSM, &pVirtio->aGCPhysVirtqDesc[i]);
     1984        pHlp->pfnSSMGetGCPhys64(pSSM, &pVirtio->aGCPhysVirtqAvail[i]);
     1985        pHlp->pfnSSMGetGCPhys64(pSSM, &pVirtio->aGCPhysVirtqUsed[i]);
     1986        pHlp->pfnSSMGetU16(pSSM, &pVirtio->uVirtqNotifyOff[i]);
     1987        pHlp->pfnSSMGetU16(pSSM, &pVirtio->uVirtqMsixVector[i]);
     1988        pHlp->pfnSSMGetU16(pSSM, &pVirtio->uVirtqEnable[i]);
     1989        pHlp->pfnSSMGetU16(pSSM, &pVirtio->uVirtqSize[i]);
     1990        pHlp->pfnSSMGetU16(pSSM, &pVirtio->aVirtqState[i].uAvailIdxShadow);
     1991        pHlp->pfnSSMGetU16(pSSM, &pVirtio->aVirtqState[i].uUsedIdxShadow);
     1992        rc = pHlp->pfnSSMGetMem(pSSM, pVirtio->aVirtqState[i].szVirtqName,
     1993                                sizeof(pVirtio->aVirtqState[i].szVirtqName));
    19961994        AssertRCReturn(rc, rc);
    19971995    }
     
    20282026            break;
    20292027        case kvirtIoVmStateChangedResume:
    2030             virtioCoreNotifyGuestDriver(pVirtio->pDevInsR3, pVirtio, 0 /* idxQueue */);
     2028            virtioCoreNotifyGuestDriver(pVirtio->pDevInsR3, pVirtio, 0 /* idxVirtq */);
    20312029            break;
    20322030        default:
     
    20902088     */
    20912089    AssertReturn(pVirtioCC->pfnStatusChanged, VERR_INVALID_POINTER);
    2092     AssertReturn(pVirtioCC->pfnQueueNotified, VERR_INVALID_POINTER);
     2090    AssertReturn(pVirtioCC->pfnVirtqNotified, VERR_INVALID_POINTER);
    20932091
    20942092#if 0 /* Until pdmR3DvHlp_PCISetIrq() impl is fixed and Assert that limits vec to 0 is removed */
     
    21732171    /*
    21742172     * Notify capability (VirtIO 1.0 spec, section 4.1.4.4). Note: uLength is based on the choice
    2175      * of this implementation to make each queue's uQueueNotifyOff equal to (QueueSelect) ordinal
     2173     * of this implementation to make each queue's uVirtqNotifyOff equal to (VirtqSelect) ordinal
    21762174     * value of the queue (different strategies are possible according to spec).
    21772175     */
  • trunk/src/VBox/Devices/VirtIO/Virtio_1_0.h

    r84774 r84803  
    5252  * TEMPORARY NOTE: Some of these values are experimental during development and will likely change.
    5353  */
    54 #define VIRTIO_MAX_QUEUE_NAME_SIZE          32                   /**< Maximum length of a queue name           */
     54#define VIRTIO_MAX_VIRTQ_NAME_SIZE          32                   /**< Maximum length of a queue name           */
    5555#define VIRTQ_MAX_ENTRIES                   1024                 /**< Max size (# desc elements) of a virtq    */
    5656#define VIRTQ_MAX_CNT                       24                   /**< Max queues we allow guest to create      */
     
    187187typedef struct VIRTQSTATE
    188188{
    189     uint16_t  idxQueue;                                          /**< Index of this queue                       */
     189    uint16_t  idxVirtq;                                          /**< Index of this queue                       */
    190190    char      szVirtqName[32];                                   /**< Dev-specific name of queue                */
    191191    uint16_t  uAvailIdxShadow;                                   /**< Consumer's position in avail ring         */
     
    207207    uint32_t  uDriverFeatures;                                   /**< RW (driver-accepted device features)      */
    208208    uint16_t  uMsixConfig;                                       /**< RW (driver sets MSI-X config vector)      */
    209     uint16_t  uNumQueues;                                        /**< RO (device specifies max queues)          */
     209    uint16_t  uNumVirtqs;                                        /**< RO (device specifies max queues)          */
    210210    uint8_t   uDeviceStatus;                                     /**< RW (driver writes device status, 0=reset) */
    211211    uint8_t   uConfigGeneration;                                 /**< RO (device changes when changing configs) */
    212212
    213     /* Per virtqueue fields (as determined by uQueueSelect) */
    214     uint16_t  uQueueSelect;                                      /**< RW (selects queue focus for these fields) */
    215     uint16_t  uQueueSize;                                        /**< RW (queue size, 0 - 2^n)                  */
    216     uint16_t  uQueueMsixVector;                                  /**< RW (driver selects MSI-X queue vector)    */
    217     uint16_t  uQueueEnable;                                      /**< RW (driver controls usability of queue)   */
    218     uint16_t  uQueueNotifyOff;                                   /**< RO (offset uto virtqueue; see spec)       */
    219     uint64_t  aGCPhysQueueDesc;                                  /**< RW (driver writes desc table phys addr)   */
    220     uint64_t  aGCPhysQueueAvail;                                 /**< RW (driver writes avail ring phys addr)   */
    221     uint64_t  aGCPhysQueueUsed;                                  /**< RW (driver writes used ring  phys addr)   */
     213    /* Per virtqueue fields (as determined by uVirtqSelect) */
     214    uint16_t  uVirtqSelect;                                      /**< RW (selects queue focus for these fields) */
     215    uint16_t  uVirtqSize;                                        /**< RW (queue size, 0 - 2^n)                  */
     216    uint16_t  uVirtqMsixVector;                                  /**< RW (driver selects MSI-X queue vector)    */
     217    uint16_t  uVirtqEnable;                                      /**< RW (driver controls usability of queue)   */
     218    uint16_t  uVirtqNotifyOff;                                   /**< RO (offset uto virtqueue; see spec)       */
     219    uint64_t  aGCPhysVirtqDesc;                                  /**< RW (driver writes desc table phys addr)   */
     220    uint64_t  aGCPhysVirtqAvail;                                 /**< RW (driver writes avail ring phys addr)   */
     221    uint64_t  aGCPhysVirtqUsed;                                  /**< RW (driver writes used ring  phys addr)   */
    222222} VIRTIO_PCI_COMMON_CFG_T, *PVIRTIO_PCI_COMMON_CFG_T;
    223223
     
    253253    PPDMDEVINS                  pDevInsR0;                          /**< Client device instance                    */
    254254    PPDMDEVINS                  pDevInsR3;                          /**< Client device instance                    */
    255     RTGCPHYS                    aGCPhysQueueDesc[VIRTQ_MAX_CNT];    /**< (MMIO) PhysAdr per-Q desc structs   GUEST */
    256     RTGCPHYS                    aGCPhysQueueAvail[VIRTQ_MAX_CNT];   /**< (MMIO) PhysAdr per-Q avail structs  GUEST */
    257     RTGCPHYS                    aGCPhysQueueUsed[VIRTQ_MAX_CNT];    /**< (MMIO) PhysAdr per-Q used structs   GUEST */
    258     uint16_t                    uQueueNotifyOff[VIRTQ_MAX_CNT];     /**< (MMIO) per-Q notify offset           HOST */
    259     uint16_t                    uQueueMsixVector[VIRTQ_MAX_CNT];    /**< (MMIO) Per-queue vector for MSI-X   GUEST */
    260     uint16_t                    uQueueEnable[VIRTQ_MAX_CNT];        /**< (MMIO) Per-queue enable             GUEST */
    261     uint16_t                    uQueueSize[VIRTQ_MAX_CNT];          /**< (MMIO) Per-queue size          HOST/GUEST */
    262     uint16_t                    uQueueSelect;                       /**< (MMIO) queue selector               GUEST */
     255    RTGCPHYS                    aGCPhysVirtqDesc[VIRTQ_MAX_CNT];    /**< (MMIO) PhysAdr per-Q desc structs   GUEST */
     256    RTGCPHYS                    aGCPhysVirtqAvail[VIRTQ_MAX_CNT];   /**< (MMIO) PhysAdr per-Q avail structs  GUEST */
     257    RTGCPHYS                    aGCPhysVirtqUsed[VIRTQ_MAX_CNT];    /**< (MMIO) PhysAdr per-Q used structs   GUEST */
     258    uint16_t                    uVirtqNotifyOff[VIRTQ_MAX_CNT];     /**< (MMIO) per-Q notify offset           HOST */
     259    uint16_t                    uVirtqMsixVector[VIRTQ_MAX_CNT];    /**< (MMIO) Per-queue vector for MSI-X   GUEST */
     260    uint16_t                    uVirtqEnable[VIRTQ_MAX_CNT];        /**< (MMIO) Per-queue enable             GUEST */
     261    uint16_t                    uVirtqSize[VIRTQ_MAX_CNT];          /**< (MMIO) Per-queue size          HOST/GUEST */
     262    uint16_t                    uVirtqSelect;                       /**< (MMIO) queue selector               GUEST */
    263263    uint16_t                    padding;
    264264    uint64_t                    uDeviceFeatures;                    /**< (MMIO) Host features offered         HOST */
     
    270270    uint8_t                     uPrevDeviceStatus;                  /**< (MMIO) Prev Device Status           GUEST */
    271271    uint8_t                     uConfigGeneration;                  /**< (MMIO) Device config sequencer       HOST */
    272     VIRTQSTATE                  virtqState[VIRTQ_MAX_CNT];          /**< Local impl-specific queue context         */
     272    VIRTQSTATE                  aVirtqState[VIRTQ_MAX_CNT];         /**< Local impl-specific queue context         */
    273273
    274274    /** @name The locations of the capability structures in PCI config space and the BAR.
     
    348348     * @param   pVirtio    Pointer to the shared virtio state.
    349349     * @param   pVirtioCC  Pointer to the ring-3 virtio state.
    350      * @param   idxQueue   Index of the notified queue
     350     * @param   idxVirtq   Index of the notified queue
    351351     */
    352     DECLCALLBACKMEMBER(void, pfnQueueNotified)(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue);
     352    DECLCALLBACKMEMBER(void, pfnVirtqNotified)(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq);
    353353
    354354    /** @} */
     
    381381     * @param   pVirtio    Pointer to the shared virtio state.
    382382     * @param   pVirtioCC  Pointer to the ring-3 virtio state.
    383      * @param   idxQueue   Index of the notified queue
     383     * @param   idxVirtq   Index of the notified queue
    384384     */
    385     DECLCALLBACKMEMBER(void, pfnQueueNotified)(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue);
     385    DECLCALLBACKMEMBER(void, pfnVirtqNotified)(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq);
    386386
    387387} VIRTIOCORER0;
     
    405405 * @{ */
    406406
    407 int      virtioCoreQueueSync(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue);
    408 uint16_t virtioCoreQueueAvailCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue);
    409 void     virtioCoreQueueEnable(PVIRTIOCORE pVirtio, uint16_t idxQueue, bool fEnable);
    410 void     virtioCoreQueueNotifyEnable(PVIRTIOCORE pVirtio, uint16_t idxQueue, bool fEnable);
     407int      virtioCoreVirtqSync(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq);
     408uint16_t virtioCoreVirtqAvailCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq);
     409void     virtioCoreVirtqEnable(PVIRTIOCORE pVirtio, uint16_t idxVirtq, bool fEnable);
     410void     virtioCoreVirtqNotifyEnable(PVIRTIOCORE pVirtio, uint16_t idxVirtq, bool fEnable);
    411411void     virtioCoreNotifyConfigChanged(PVIRTIOCORE pVirtio);
    412412void     virtioCoreResetAll(PVIRTIOCORE pVirtio);
     
    416416uint32_t virtioCoreR3DescChainRelease(PVIRTIOCORE pVirtio, PVIRTIO_DESC_CHAIN_T pDescChain);
    417417void     virtioCoreR3Info(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs);
    418 void     virtioCoreR3QueueInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs, int idxQueue);
    419 int      virtioCoreR3QueueAttach(PVIRTIOCORE pVirtio, uint16_t idxQueue, const char *pcszName);
    420 
    421 int      virtioCoreR3DescChainGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     418void     virtioCoreR3VirtqInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs, int idxVirtq);
     419int      virtioCoreR3VirtqAttach(PVIRTIOCORE pVirtio, uint16_t idxVirtq, const char *pcszName);
     420
     421int      virtioCoreR3DescChainGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    422422                                  uint16_t uHeadIdx, PPVIRTIO_DESC_CHAIN_T ppDescChain);
    423423
    424 int      virtioCoreR3QueuePeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     424int      virtioCoreR3VirtqPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    425425                               PPVIRTIO_DESC_CHAIN_T ppDescChain);
    426426
    427 int      virtioCoreR3QueueSkip(PVIRTIOCORE pVirtio, uint16_t idxQueue);
    428 
    429 int      virtioCoreR3QueueGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue,
     427int      virtioCoreR3VirtqSkip(PVIRTIOCORE pVirtio, uint16_t idxVirtq);
     428
     429int      virtioCoreR3VirtqGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq,
    430430                              PPVIRTIO_DESC_CHAIN_T ppDescChain, bool fRemove);
    431431
    432 int      virtioCoreR3QueuePut(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue, PRTSGBUF pSgVirtReturn,
     432int      virtioCoreR3VirtqPut(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq, PRTSGBUF pSgVirtReturn,
    433433                              PVIRTIO_DESC_CHAIN_T pDescChain, bool fFence);
    434434
     
    438438 *
    439439 * @param   pVirtio     Pointer to the virtio state.
    440  * @param   idxQueue    Queue number.
     440 * @param   idxVirtq    Virtq number.
    441441 * @returns   true or false indicating whether to enable queue or not
    442442 */
    443 DECLINLINE(bool) virtioCoreIsQueueEnabled(PVIRTIOCORE pVirtio, uint16_t idxQueue)
    444 {
    445     Assert(idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    446     return pVirtio->uQueueEnable[idxQueue] != 0;
     443DECLINLINE(bool) virtioCoreIsVirtqEnabled(PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     444{
     445    Assert(idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     446    return pVirtio->uVirtqEnable[idxVirtq] != 0;
    447447}
    448448
    449449/**
    450  * Get name of queue, by idxQueue, assigned at virtioCoreR3QueueAttach()
     450 * Get name of queue, by idxVirtq, assigned at virtioCoreR3VirtqAttach()
    451451 *
    452452 * @param   pVirtio     Pointer to the virtio state.
    453  * @param   idxQueue    Queue number.
     453 * @param   idxVirtq    Virtq number.
    454454 *
    455455 * @returns Pointer to read-only queue name.
    456456 */
    457 DECLINLINE(const char *) virtioCoreQueueGetName(PVIRTIOCORE pVirtio, uint16_t idxQueue)
    458 {
    459     Assert((size_t)idxQueue < RT_ELEMENTS(pVirtio->virtqState));
    460     return pVirtio->virtqState[idxQueue].szVirtqName;
     457DECLINLINE(const char *) virtioCoreVirtqGetName(PVIRTIOCORE pVirtio, uint16_t idxVirtq)
     458{
     459    Assert((size_t)idxVirtq < RT_ELEMENTS(pVirtio->aVirtqState));
     460    return pVirtio->aVirtqState[idxVirtq].szVirtqName;
    461461}
    462462
     
    467467 */
    468468DECLINLINE(uint64_t) virtioCoreGetNegotiatedFeatures(PVIRTIOCORE pVirtio)
    469 {
    470     return pVirtio->uDriverFeatures;
    471 }
    472 
    473 /**
    474  * Get VirtIO accepted host-side features
    475  *
    476  * @returns feature bits selected or 0 if selector out of range.
    477  *
    478  * @param   pState          Virtio state
    479  */
    480 DECLINLINE(uint64_t) virtioCoreGetAcceptedFeatures(PVIRTIOCORE pVirtio)
    481469{
    482470    return pVirtio->uDriverFeatures;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette