VirtualBox

Changeset 64696 in vbox for trunk


Ignore:
Timestamp:
Nov 17, 2016 5:37:59 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
111975
Message:

DevPCI*,PDM: Get internal bus number from PDM.

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmcommon.h

    r62476 r64696  
    5353#define PDM_VERSION_MAKE(uMagic, uMajor, uMinor) \
    5454    ( ((uint32_t)(uMagic) << 16) | ((uint32_t)((uMajor) & 0xff) << 4) | ((uint32_t)((uMinor) & 0xf) << 0) )
     55
     56/**
     57 * Version of PDM_VERSION_MAKE that's compatible with the preprocessor.
     58 *
     59 * @returns 32-bit structure version number.
     60 *
     61 * @param   uMagic      16-bit magic value, no suffix.  This must be unique.
     62 * @param   uMajor      12-bit major version number, no suffix.  Structures with
     63 *                      different major numbers are not compatible.
     64 * @param   uMinor      4-bit minor version number, no suffix.  When only the
     65 *                      minor version differs, the structures will be 100%
     66 *                      backwards compatible.
     67 */
     68#define PDM_VERSION_MAKE_PP(uMagic, uMajor, uMinor) \
     69    ( (UINT32_C(uMagic) << 16) | ((UINT32_C(uMajor) & UINT32_C(0xff)) << 4) | ((UINT32_C(uMinor) & UINT32_C(0xf)) << 0) )
    5570
    5671/** Checks if @a uVerMagic1 is compatible with @a uVerMagic2.
  • trunk/include/VBox/vmm/pdmdev.h

    r64655 r64696  
    18761876/** @}   */
    18771877
     1878/** Current PDMDEVHLPR3 version number.
     1879 * @todo Next major revision should add piBus to pfnPCIBusRegister.  */
     1880#define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE_PP(0xffe7, 19, 1)
     1881//#define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     1882
    18781883/**
    18791884 * PDM Device API.
     
    29702975    DECLR3CALLBACKMEMBER(int, pfnRTCRegister,(PPDMDEVINS pDevIns, PCPDMRTCREG pRtcReg, PCPDMRTCHLP *ppRtcHlp));
    29712976
    2972     /**
    2973      * Register the PCI Bus.
    2974      *
    2975      * @returns VBox status code.
     2977#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2978    /**
     2979     * Register a PCI Bus.
     2980     *
     2981     * @returns VBox status code, but the positive values 0..31 are used to indicate
     2982     *          bus number rather than informational status codes.
    29762983     * @param   pDevIns             The device instance.
    29772984     * @param   pPciBusReg          Pointer to PCI bus registration structure.
    29782985     * @param   ppPciHlpR3          Where to store the pointer to the PCI Bus
    29792986     *                              helpers.
     2987     * @param   piBus               Where to return the PDM bus number. Optional.
     2988     */
     2989    DECLR3CALLBACKMEMBER(int, pfnPCIBusRegister,(PPDMDEVINS pDevIns, PPDMPCIBUSREG pPciBusReg,
     2990                                                 PCPDMPCIHLPR3 *ppPciHlpR3, uint32_t *piBus));
     2991#else
     2992    /**
     2993     * Register a PCI Bus.
     2994     *
     2995     * @returns VBox status code, but the positive values 0..31 are used to indicate
     2996     *          bus number rather than informational status codes.
     2997     * @param   pDevIns             The device instance.
     2998     * @param   pPciBusReg          Pointer to PCI bus registration structure.
     2999     * @param   ppPciHlpR3          Where to store the pointer to the PCI Bus
     3000     *                              helpers.
    29803001     */
    29813002    DECLR3CALLBACKMEMBER(int, pfnPCIBusRegister,(PPDMDEVINS pDevIns, PPDMPCIBUSREG pPciBusReg, PCPDMPCIHLPR3 *ppPciHlpR3));
     3003#endif
    29823004
    29833005    /**
     
    34523474/** Pointer to the R3 PDM Device API, const variant. */
    34533475typedef R3PTRTYPE(const struct PDMDEVHLPR3 *) PCPDMDEVHLPR3;
    3454 
    3455 /** Current PDMDEVHLPR3 version number. */
    3456 #define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE(0xffe7, 19, 0)
    34573476
    34583477
     
    50105029 * @copydoc PDMDEVHLPR3::pfnPCIBusRegister
    50115030 */
     5031#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     5032DECLINLINE(int) PDMDevHlpPCIBusRegister(PPDMDEVINS pDevIns, PPDMPCIBUSREG pPciBusReg, PCPDMPCIHLPR3 *ppPciHlpR3, uint32_t *piBus)
     5033{
     5034    return pDevIns->pHlpR3->pfnPCIBusRegister(pDevIns, pPciBusReg, ppPciHlpR3, piBus);
     5035}
     5036#else
    50125037DECLINLINE(int) PDMDevHlpPCIBusRegister(PPDMDEVINS pDevIns, PPDMPCIBUSREG pPciBusReg, PCPDMPCIHLPR3 *ppPciHlpR3)
    50135038{
    50145039    return pDevIns->pHlpR3->pfnPCIBusRegister(pDevIns, pPciBusReg, ppPciHlpR3);
    50155040}
     5041#endif
    50165042
    50175043/**
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r64468 r64696  
    12691269    PciBusReg.pszSetIrqRC             = fGCEnabled ? "pciSetIrq" : NULL;
    12701270    PciBusReg.pszSetIrqR0             = fR0Enabled ? "pciSetIrq" : NULL;
     1271#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     1272    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3, &pBus->iBus);
     1273#else
    12711274    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3);
     1275    pBus->iBus = rc;
     1276#endif
    12721277    if (RT_FAILURE(rc))
    12731278        return PDMDEV_SET_ERROR(pDevIns, rc,
    12741279                                N_("Failed to register ourselves as a PCI Bus"));
     1280    Assert(pBus->iBus == 0);
    12751281    if (pBus->pPciHlpR3->u32Version != PDM_PCIHLPR3_VERSION)
    12761282        return PDMDevHlpVMSetError(pDevIns, VERR_VERSION_MISMATCH, RT_SRC_POS,
     
    16061612    PciBusReg.pszSetIrqRC             = fGCEnabled ? "pcibridgeSetIrq" : NULL;
    16071613    PciBusReg.pszSetIrqR0             = fR0Enabled ? "pcibridgeSetIrq" : NULL;
     1614#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     1615    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3, &pBus->iBus);
     1616#else
    16081617    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3);
     1618    pBus->iBus = rc;
     1619#endif
    16091620    if (RT_FAILURE(rc))
    16101621        return PDMDEV_SET_ERROR(pDevIns, rc,
    16111622                                N_("Failed to register ourselves as a PCI Bus"));
     1623    Assert(pBus->iBus == (uint32_t)iInstance + 1); /* Can be removed when adding support for multiple bridge implementations. */
    16121624    if (pBus->pPciHlpR3->u32Version != PDM_PCIHLPR3_VERSION)
    16131625        return PDMDevHlpVMSetError(pDevIns, VERR_VERSION_MISMATCH, RT_SRC_POS,
     
    16491661
    16501662    pBus->iDevSearch = 0;
    1651     /*
    1652      * The iBus property doesn't really represent the bus number
    1653      * because the guest and the BIOS can choose different bus numbers
    1654      * for them.
    1655      * The bus number is mainly for the setIrq function to indicate
    1656      * when the host bus is reached which will have iBus = 0.
    1657      * That's why the + 1.
    1658      */
    1659     pBus->iBus = iInstance + 1;
    16601663
    16611664    /*
  • trunk/src/VBox/Devices/Bus/DevPciIch9.cpp

    r64496 r64696  
    24622462    PciBusReg.pszSetIrqRC             = fGCEnabled ? "ich9pciSetIrq" : NULL;
    24632463    PciBusReg.pszSetIrqR0             = fR0Enabled ? "ich9pciSetIrq" : NULL;
     2464#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2465    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3, &pBus->iBus);
     2466#else
    24642467    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3);
     2468    pBus->iBus = rc;
     2469#endif
    24652470    if (RT_FAILURE(rc))
    24662471        return PDMDEV_SET_ERROR(pDevIns, rc,
    24672472                                N_("Failed to register ourselves as a PCI Bus"));
     2473    Assert(pBus->iBus == 0);
    24682474    if (pBus->pPciHlpR3->u32Version != PDM_PCIHLPR3_VERSION)
    24692475        return PDMDevHlpVMSetError(pDevIns, VERR_VERSION_MISMATCH, RT_SRC_POS,
     
    27342740    PciBusReg.pszSetIrqRC             = fGCEnabled ? "ich9pcibridgeSetIrq" : NULL;
    27352741    PciBusReg.pszSetIrqR0             = fR0Enabled ? "ich9pcibridgeSetIrq" : NULL;
     2742#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2743    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3, &pBus->iBus);
     2744#else
    27362745    rc = PDMDevHlpPCIBusRegister(pDevIns, &PciBusReg, &pBus->pPciHlpR3);
     2746    pBus->iBus = rc;
     2747#endif
    27372748    if (RT_FAILURE(rc))
    27382749        return PDMDEV_SET_ERROR(pDevIns, rc,
    27392750                                N_("Failed to register ourselves as a PCI Bus"));
     2751    Assert(pBus->iBus == (uint32_t)iInstance + 1); /* Can be removed when adding support for multiple bridge implementations. */
    27402752    if (pBus->pPciHlpR3->u32Version != PDM_PCIHLPR3_VERSION)
    27412753        return PDMDevHlpVMSetError(pDevIns, VERR_VERSION_MISMATCH, RT_SRC_POS,
     
    27452757    pBus->pPciHlpRC = pBus->pPciHlpR3->pfnGetRCHelpers(pDevIns);
    27462758    pBus->pPciHlpR0 = pBus->pPciHlpR3->pfnGetR0Helpers(pDevIns);
     2759
    27472760
    27482761    /* Disable default device locking. */
     
    27792792    pBus->PciDev.Int.s.pfnBridgeConfigRead  = ich9pcibridgeConfigRead;
    27802793    pBus->PciDev.Int.s.pfnBridgeConfigWrite = ich9pcibridgeConfigWrite;
    2781 
    2782     /*
    2783      * The iBus property doesn't really represent the bus number
    2784      * because the guest and the BIOS can choose different bus numbers
    2785      * for them.
    2786      * The bus number is mainly for the setIrq function to indicate
    2787      * when the host bus is reached which will have iBus = 0.
    2788      * That's why the + 1.
    2789      */
    2790     pBus->iBus = iInstance + 1;
    27912794
    27922795    /*
  • trunk/src/VBox/Devices/Bus/DevPciInternal.h

    r64461 r64696  
    3131{
    3232    /** Bus number. */
    33     int32_t                 iBus;
     33    uint32_t                iBus;
    3434    /** Number of bridges attached to the bus. */
    3535    uint32_t                cBridges;
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r62606 r64696  
    570570                                                                                 pfLockTaken));
    571571        rc = PGM_BTH_NAME(SyncPage)(pVCpu, PdeSrcDummy, pvFault, 1, uErr);
    572 #endif
     572#   endif
    573573        AssertRC(rc);
    574574        PGM_INVL_PG(pVCpu, pvFault);
     
    634634            return VINF_SUCCESS;
    635635        }
    636         //AssertMsg(GstWalk.Pde.u == GstWalk.pPde->u || GstWalk.pPte->u == GstWalk.pPde->u, ("%RX64 %RX64\n", (uint64_t)GstWalk.Pde.u, (uint64_t)GstWalk.pPde->u)); - triggers with smp w7 guests.
    637         //AssertMsg(GstWalk.Core.fBigPage || GstWalk.Pte.u == GstWalk.pPte->u, ("%RX64 %RX64\n", (uint64_t)GstWalk.Pte.u, (uint64_t)GstWalk.pPte->u)); - ditto.
     636#ifdef DEBUG_bird
     637        AssertMsg(GstWalk.Pde.u == GstWalk.pPde->u || GstWalk.pPte->u == GstWalk.pPde->u || pVM->cCpus > 1, ("%RX64 %RX64\n", (uint64_t)GstWalk.Pde.u, (uint64_t)GstWalk.pPde->u)); // - triggers with smp w7 guests.
     638        AssertMsg(GstWalk.Core.fBigPage || GstWalk.Pte.u == GstWalk.pPte->u || pVM->cCpus > 1, ("%RX64 %RX64\n", (uint64_t)GstWalk.Pte.u, (uint64_t)GstWalk.pPte->u)); // - ditto.
     639#endif
    638640    }
    639641
     
    676678    }
    677679
    678 #  if   PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) && !defined(PGM_WITHOUT_MAPPINGS)
     680#  if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) && !defined(PGM_WITHOUT_MAPPINGS)
    679681    /*
    680682     * Check if this address is within any of our mappings.
     
    11321134                rc2 = PGMShwGetPage(pVCpu, pvFault, &fPageShw, NULL);
    11331135
     1136#if 0
    11341137                /*
    11351138                 * Compare page flags.
     
    11451148                          ("Page flags mismatch! pvFault=%RGv uErr=%x GCPhys=%RGp fPageShw=%RX64 fPageGst=%RX64 rc=%d\n",
    11461149                           pvFault, (uint32_t)uErr, GCPhys, fPageShw, fPageGst, rc));
     115001:01:15.623511 00:08:43.266063 Expression: (fPageShw & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK)) == (fPageGst & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK)) || ( pVCpu->pgm.s.cNetwareWp0Hacks > 0 && (fPageShw & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK | X86_PTE_RW | X86_PTE_US)) == (fPageGst & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK | X86_PTE_RW | X86_PTE_US)) && (fPageShw & (X86_PTE_RW | X86_PTE_US)) == X86_PTE_RW && (fPageGst & (X86_PTE_RW | X86_PTE_US)) == X86_PTE_US)
     115101:01:15.623511 00:08:43.266064 Location  : e:\vbox\svn\trunk\srcPage flags mismatch! pvFault=fffff801b0d7b000 uErr=11 GCPhys=0000000019b52000 fPageShw=0 fPageGst=77b0000000000121 rc=0
     1152
     115301:01:15.625516 00:08:43.268051 Expression: (fPageShw & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK)) == (fPageGst & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK)) || ( pVCpu->pgm.s.cNetwareWp0Hacks > 0 && (fPageShw & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK | X86_PTE_RW | X86_PTE_US)) == (fPageGst & ~(X86_PTE_A | X86_PTE_D | X86_PTE_AVL_MASK | X86_PTE_RW | X86_PTE_US)) && (fPageShw & (X86_PTE_RW | X86_PTE_US)) == X86_PTE_RW && (fPageGst & (X86_PTE_RW | X86_PTE_US)) == X86_PTE_US)
     115401:01:15.625516 00:08:43.268051 Location  :
     1155e:\vbox\svn\trunk\srcPage flags mismatch!
     1156pvFault=fffff801b0d7b000
     1157                uErr=11     X86_TRAP_PF_ID | X86_TRAP_PF_P
     1158GCPhys=0000000019b52000
     1159fPageShw=0
     1160fPageGst=77b0000000000121
     1161rc=0
     1162#endif
     1163
    11471164            }
    11481165            else
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r64551 r64696  
    125125# define IEM_DO_INSTR_STAT(a_Name, a_szDesc) \
    126126            STAMR3RegisterF(pVM, &pVCpu->iem.s.pStatsCCR3->a_Name, STAMTYPE_U32_RESET, STAMVISIBILITY_USED, \
    127                             STAMUNIT_COUNT, a_szDesc, "/IEM/CPU%u/r0-rc-Instr/" #a_Name, idCpu); \
     127                            STAMUNIT_COUNT, a_szDesc, "/IEM/CPU%u/instr-RZ/" #a_Name, idCpu); \
    128128            STAMR3RegisterF(pVM, &pVCpu->iem.s.pStatsR3->a_Name, STAMTYPE_U32_RESET, STAMVISIBILITY_USED, \
    129                             STAMUNIT_COUNT, a_szDesc, "/IEM/CPU%u/r3-Instr/" #a_Name, idCpu);
     129                            STAMUNIT_COUNT, a_szDesc, "/IEM/CPU%u/instr-R3/" #a_Name, idCpu);
    130130# include "IEMInstructionStatisticsTmpl.h"
    131131# undef IEM_DO_INSTR_STAT
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r64655 r64696  
    25762576
    25772577/** @interface_method_impl{PDMDEVHLPR3,pfnPCIBusRegister} */
     2578#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2579static DECLCALLBACK(int) pdmR3DevHlp_PCIBusRegister(PPDMDEVINS pDevIns, PPDMPCIBUSREG pPciBusReg,
     2580                                                    PCPDMPCIHLPR3 *ppPciHlpR3, uint32_t *piBus)
     2581#else
    25782582static DECLCALLBACK(int) pdmR3DevHlp_PCIBusRegister(PPDMDEVINS pDevIns, PPDMPCIBUSREG pPciBusReg, PCPDMPCIHLPR3 *ppPciHlpR3)
    2579 {
    2580     PDMDEV_ASSERT_DEVINS(pDevIns);
    2581     PVM pVM = pDevIns->Internal.s.pVMR3;
    2582     VM_ASSERT_EMT(pVM);
     2583#endif
     2584{
     2585    PDMDEV_ASSERT_DEVINS(pDevIns);
     2586    PVM pVM = pDevIns->Internal.s.pVMR3;
     2587    VM_ASSERT_EMT(pVM);
     2588#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2589    LogFlow(("pdmR3DevHlp_PCIBusRegister: caller='%s'/%d: pPciBusReg=%p:{.u32Version=%#x, .pfnRegisterR3=%p, .pfnIORegionRegisterR3=%p, "
     2590             ".pfnSetIrqR3=%p, .pfnFakePCIBIOSR3=%p, .pszSetIrqRC=%p:{%s}, .pszSetIrqR0=%p:{%s}} ppPciHlpR3=%p piBus=%p\n",
     2591             pDevIns->pReg->szName, pDevIns->iInstance, pPciBusReg, pPciBusReg->u32Version, pPciBusReg->pfnRegisterR3,
     2592             pPciBusReg->pfnIORegionRegisterR3, pPciBusReg->pfnSetIrqR3, pPciBusReg->pfnFakePCIBIOSR3,
     2593             pPciBusReg->pszSetIrqRC, pPciBusReg->pszSetIrqRC, pPciBusReg->pszSetIrqR0, pPciBusReg->pszSetIrqR0,
     2594             ppPciHlpR3, piBus));
     2595#else
    25832596    LogFlow(("pdmR3DevHlp_PCIBusRegister: caller='%s'/%d: pPciBusReg=%p:{.u32Version=%#x, .pfnRegisterR3=%p, .pfnIORegionRegisterR3=%p, "
    25842597             ".pfnSetIrqR3=%p, .pfnFakePCIBIOSR3=%p, .pszSetIrqRC=%p:{%s}, .pszSetIrqR0=%p:{%s}} ppPciHlpR3=%p\n",
     
    25862599             pPciBusReg->pfnIORegionRegisterR3, pPciBusReg->pfnSetIrqR3, pPciBusReg->pfnFakePCIBIOSR3,
    25872600             pPciBusReg->pszSetIrqRC, pPciBusReg->pszSetIrqRC, pPciBusReg->pszSetIrqR0, pPciBusReg->pszSetIrqR0, ppPciHlpR3));
     2601#endif
    25882602
    25892603    /*
     
    26222636        return VERR_INVALID_PARAMETER;
    26232637    }
    2624      if (!ppPciHlpR3)
     2638    if (!ppPciHlpR3)
    26252639    {
    26262640        Assert(ppPciHlpR3);
     
    26282642        return VERR_INVALID_PARAMETER;
    26292643    }
     2644#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2645    AssertLogRelMsgReturn(RT_VALID_PTR(piBus) || !piBus,
     2646                          ("caller='%s'/%d: piBus=%p\n", pDevIns->pReg->szName, pDevIns->iInstance, piBus),
     2647                          VERR_INVALID_POINTER);
     2648#endif
    26302649
    26312650    /*
     
    27002719    /* set the helper pointer and return. */
    27012720    *ppPciHlpR3 = &g_pdmR3DevPciHlp;
    2702     LogFlow(("pdmR3DevHlp_PCIBusRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
     2721#if PDM_DEVHLPR3_VERSION >= PDM_VERSION_MAKE_PP(0xffe7, 20, 0)
     2722    if (piBus)
     2723        *piBus = iBus;
     2724    LogFlow(("pdmR3DevHlp_PCIBusRegister: caller='%s'/%d: returns %Rrc *piBus=%u\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS, iBus));
    27032725    return VINF_SUCCESS;
     2726#else
     2727    LogFlow(("pdmR3DevHlp_PCIBusRegister: caller='%s'/%d: returns %u\n", pDevIns->pReg->szName, pDevIns->iInstance, iBus));
     2728    return (int)iBus;
     2729#endif
    27042730}
    27052731
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