VirtualBox

Changeset 80943 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Sep 23, 2019 9:36:14 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133523
Message:

Devices/PCI: Device model refactoring, part I. bugref:9218

File:
1 edited

Legend:

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

    r80942 r80943  
    283283    LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: pPciDev=%p:{%#x} iIrq=%d iLevel=%d\n",
    284284             pDevIns, pDevIns->iInstance, pPciDev, pPciDev->uDevFn, iIrq, iLevel));
    285     PGVM         pGVM    = pDevIns->Internal.s.pGVM;
    286     size_t const idxBus  = pPciDev->Int.s.idxPdmBus;
    287     AssertReturnVoid(idxBus < RT_ELEMENTS(pGVM->pdm.s.aPciBuses));
    288     PPDMPCIBUS   pPciBus = &pGVM->pdm.s.aPciBuses[idxBus];
     285    PGVM         pGVM      = pDevIns->Internal.s.pGVM;
     286    size_t const idxBus    = pPciDev->Int.s.idxPdmBus;
     287    AssertReturnVoid(idxBus < RT_ELEMENTS(pGVM->pdmr0.s.aPciBuses));
     288    PPDMPCIBUSR0 pPciBusR0 = &pGVM->pdmr0.s.aPciBuses[idxBus];
    289289
    290290    pdmLock(pGVM);
     291
    291292    uint32_t uTagSrc;
    292293    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     
    301302        uTagSrc = pDevIns->Internal.s.pIntR3R0->uLastIrqTag;
    302303
    303     if (    pPciBus
    304         &&  pPciBus->pDevInsR0)
    305     {
    306         pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel, uTagSrc);
     304    if (pPciBusR0->pDevInsR0)
     305    {
     306        pPciBusR0->pfnSetIrqR0(pPciBusR0->pDevInsR0, pPciDev, iIrq, iLevel, uTagSrc);
    307307
    308308        pdmUnlock(pGVM);
     
    793793    LogFlow(("pdmR0DevHlp_DBGFTraceBuf: caller='%p'/%d: returns %p\n", pDevIns, pDevIns->iInstance, hTraceBuf));
    794794    return hTraceBuf;
     795}
     796
     797
     798/** @interface_method_impl{PDMDEVHLPR0,pfnPCIBusSetUpContext} */
     799static DECLCALLBACK(int) pdmR0DevHlp_PCIBusSetUpContext(PPDMDEVINS pDevIns, PPDMPCIBUSREGR0 pPciBusReg, PCPDMPCIHLPR0 *ppPciHlp)
     800{
     801    PDMDEV_ASSERT_DEVINS(pDevIns);
     802    LogFlow(("pdmR0DevHlp_PCIBusSetUpContext: caller='%p'/%d: pPciBusReg=%p{.u32Version=%#x, .iBus=%#u, .pfnSetIrq=%p, u32EnvVersion=%#x} ppPciHlp=%p\n",
     803             pDevIns, pDevIns->iInstance, pPciBusReg, pPciBusReg->u32Version, pPciBusReg->iBus, pPciBusReg->pfnSetIrq,
     804             pPciBusReg->u32EndVersion, ppPciHlp));
     805    PGVM pGVM = pDevIns->Internal.s.pGVM;
     806
     807    /*
     808     * Validate input.
     809     */
     810    AssertPtrReturn(pPciBusReg, VERR_INVALID_POINTER);
     811    AssertLogRelMsgReturn(pPciBusReg->u32Version == PDM_PCIBUSREGCC_VERSION,
     812                          ("%#x vs %#x\n", pPciBusReg->u32Version, PDM_PCIBUSREGCC_VERSION), VERR_VERSION_MISMATCH);
     813    AssertPtrReturn(pPciBusReg->pfnSetIrq, VERR_INVALID_POINTER);
     814    AssertLogRelMsgReturn(pPciBusReg->u32EndVersion == PDM_PCIBUSREGCC_VERSION,
     815                          ("%#x vs %#x\n", pPciBusReg->u32EndVersion, PDM_PCIBUSREGCC_VERSION), VERR_VERSION_MISMATCH);
     816
     817    AssertPtrReturn(ppPciHlp, VERR_INVALID_POINTER);
     818
     819    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_WRONG_ORDER);
     820    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
     821
     822    /* Check the shared bus data (registered earlier from ring-3): */
     823    uint32_t iBus = pPciBusReg->iBus;
     824    ASMCompilerBarrier();
     825    AssertLogRelMsgReturn(iBus < RT_ELEMENTS(pGVM->pdm.s.aPciBuses), ("iBus=%#x\n", iBus), VERR_OUT_OF_RANGE);
     826    PPDMPCIBUS pPciBusShared = &pGVM->pdm.s.aPciBuses[iBus];
     827    AssertLogRelMsgReturn(pPciBusShared->iBus == iBus, ("%u vs %u\n", pPciBusShared->iBus, iBus), VERR_INVALID_PARAMETER);
     828    AssertLogRelMsgReturn(pPciBusShared->pDevInsR3 == pDevIns->pDevInsForR3,
     829                          ("%p vs %p (iBus=%u)\n", pPciBusShared->pDevInsR3, pDevIns->pDevInsForR3, iBus), VERR_NOT_OWNER);
     830
     831    /* Check that the bus isn't already registered in ring-0: */
     832    AssertCompile(RT_ELEMENTS(pGVM->pdm.s.aPciBuses) == RT_ELEMENTS(pGVM->pdmr0.s.aPciBuses));
     833    PPDMPCIBUSR0 pPciBusR0 = &pGVM->pdmr0.s.aPciBuses[iBus];
     834    AssertLogRelMsgReturn(pPciBusR0->pDevInsR0 == NULL,
     835                          ("%p (caller pDevIns=%p, iBus=%u)\n", pPciBusR0->pDevInsR0, pDevIns, iBus),
     836                          VERR_ALREADY_EXISTS);
     837
     838    /*
     839     * Do the registering.
     840     */
     841    pPciBusR0->iBus        = iBus;
     842    pPciBusR0->uPadding0   = 0xbeefbeef;
     843    pPciBusR0->pfnSetIrqR0 = pPciBusReg->pfnSetIrq;
     844    pPciBusR0->pDevInsR0   = pDevIns;
     845
     846    *ppPciHlp = &g_pdmR0PciHlp;
     847
     848    LogFlow(("pdmR0DevHlp_PCIBusSetUpContext: caller='%p'/%d: returns VINF_SUCCESS\n", pDevIns, pDevIns->iInstance));
     849    return VINF_SUCCESS;
    795850}
    796851
     
    853908    pdmR0DevHlp_CritSectGetRecursion,
    854909    pdmR0DevHlp_DBGFTraceBuf,
     910    pdmR0DevHlp_PCIBusSetUpContext,
    855911    NULL /*pfnReserved1*/,
    856912    NULL /*pfnReserved2*/,
Note: See TracChangeset for help on using the changeset viewer.

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