VirtualBox

Changeset 88640 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 22, 2021 6:15:35 AM (4 years ago)
Author:
vboxsync
Message:

Intel IOMMU: bugref:9967 Implement PDM R3-task queueing for sending MSIs via the IOAPIC in ring-0.

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/PDMR0DevHlp.cpp

    r88639 r88640  
    16271627    if (pGVM->pdm.s.IoApic.pDevInsR0)
    16281628        pGVM->pdm.s.IoApic.pfnSendMsiR0(pGVM->pdm.s.IoApic.pDevInsR0, uBusDevFn, pMsi, uTagSrc);
    1629     else
    1630         AssertFatalMsgFailed(("Lazy bastards!"));
     1629    else if (pGVM->pdm.s.IoApic.pDevInsR3)
     1630    {
     1631        /* queue for ring-3 execution. */
     1632        PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pGVM->pdm.s.pDevHlpQueueR0);
     1633        if (pTask)
     1634        {
     1635            pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SEND_MSI;
     1636            pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     1637            pTask->u.IoApicSendMsi.uBusDevFn = uBusDevFn;
     1638            pTask->u.IoApicSendMsi.Msi       = *pMsi;
     1639            pTask->u.IoApicSendMsi.uTagSrc   = uTagSrc;
     1640
     1641            PDMQueueInsertEx(pGVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
     1642        }
     1643        else
     1644            AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
     1645    }
    16311646}
    16321647
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r88639 r88640  
    53925392        }
    53935393
     5394        case PDMDEVHLPTASKOP_IOAPIC_SEND_MSI:
     5395        {
     5396            PDMIoApicSendMsi(pVM, pTask->u.IoApicSendMsi.uBusDevFn, &pTask->u.IoApicSendMsi.Msi, pTask->u.IoApicSendMsi.uTagSrc);
     5397            break;
     5398        }
     5399
    53945400        default:
    53955401            AssertReleaseMsgFailed(("Invalid operation %d\n", pTask->enmOp));
  • trunk/src/VBox/VMM/include/PDMInternal.h

    r88631 r88640  
    12091209    /** PCISetIrq */
    12101210    PDMDEVHLPTASKOP_IOAPIC_SET_IRQ,
     1211    /** IoApicSendMsi */
     1212    PDMDEVHLPTASKOP_IOAPIC_SEND_MSI,
    12111213    /** The usual 32-bit hack. */
    12121214    PDMDEVHLPTASKOP_32BIT_HACK = 0x7fffffff
     
    12591261            uint32_t                uTagSrc;
    12601262        } PciSetIRQ;
     1263
     1264        /**
     1265         * PDMDEVHLPTASKOP_IOAPIC_SEND_MSI
     1266         */
     1267        struct PDMDEVHLPTASKIOAPICSENDMSI
     1268        {
     1269            /** The bus:device:function of the device sending the MSI. */
     1270            PCIBDF                  uBusDevFn;
     1271            /** The MSI. */
     1272            MSIMSG                  Msi;
     1273            /** The IRQ tag and source. */
     1274            uint32_t                uTagSrc;
     1275        } IoApicSendMsi;
    12611276
    12621277        /** Expanding the structure. */
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