VirtualBox

vbox的更動 7635 路徑 trunk/src/VBox/Devices/Bus


忽略:
時間撮記:
2008-3-28 下午05:15:38 (17 年 以前)
作者:
vboxsync
訊息:

The new MMIO2 code.
WARNING! This changes the pci mapping protocol for MMIO2 so it's working the same way as I/O ports and normal MMIO memory. External users of the interface will have to update their mapping routines.

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r7072 r7635  
     1/* $Id: $ */
    12/** @file
    2  *
    3  * PCI Device.
     3 * PCI BUS Device.
    44 */
    55
     
    214214static void pci_update_mappings(PCIDevice *d)
    215215{
     216    PPCIBUS pBus = d->Int.s.pBus;
    216217    PCIIORegion *r;
    217218    int cmd, i;
     
    279280                        }
    280281                    } else {
    281                         int rc = d->pDevIns->pDevHlp->pfnMMIODeregister(d->pDevIns,
    282                                                                         r->addr + PCIBUS2PCIGLOBALS(d->Int.s.pBus)->pci_mem_base,
    283                                                                         r->size);
    284 #if 0 /** @todo deal correctly with deregistration of MMIO2 ranges and such like. */
    285                         AssertMsg(VBOX_SUCCESS(rc) || !strcmp(d->name, "vga") || !strcmp(d->name, "VMMDev"), ("rc=%Vrc d=%s\n", rc, d->name)); NOREF(rc);
    286 #else /* less strict check */
    287                         AssertMsg(VBOX_SUCCESS(rc) || rc == VERR_IOM_MMIO_RANGE_NOT_FOUND, ("rc=%Vrc d=%s\n", rc, d->name)); NOREF(rc);
    288 #endif
     282                        RTGCPHYS GCPhysBase = r->addr + PCIBUS2PCIGLOBALS(pBus)->pci_mem_base;
     283                        int rc;
     284                        if (pBus->pPciHlpR3->pfnIsMMIO2Base(pBus->pDevInsHC, d->pDevIns, GCPhysBase))
     285                        {
     286                            /* unmap it. */
     287                            int rc = r->map_func(d, i, NIL_RTGCPHYS, r->size, (PCIADDRESSSPACE)(r->type));
     288                            AssertRC(rc);
     289                            rc = PDMDevHlpMMIO2Unmap(d->pDevIns, i, GCPhysBase);
     290                        }
     291                        else
     292                            rc = d->pDevIns->pDevHlp->pfnMMIODeregister(d->pDevIns, GCPhysBase, r->size);
     293                        AssertMsgRC(rc, ("rc=%Rrc d=%s i=%d GCPhysBase=%RGp size=%#x\n", rc, d->name, i, GCPhysBase, r->size));
    289294                    }
    290295                }
     
    292297                if (r->addr != ~0U) {
    293298                    int rc = r->map_func(d, i,
    294                                          r->addr + (r->type & PCI_ADDRESS_SPACE_IO ? 0 : PCIBUS2PCIGLOBALS(d->Int.s.pBus)->pci_mem_base),
     299                                         r->addr + (r->type & PCI_ADDRESS_SPACE_IO ? 0 : PCIBUS2PCIGLOBALS(pBus)->pci_mem_base),
    295300                                         r->size, (PCIADDRESSSPACE)(r->type));
    296301                    AssertRC(rc);
     
    772777    {
    773778    case 0x0101:
    774         if (vendor_id == 0x8086 && 
     779        if (vendor_id == 0x8086 &&
    775780            (device_id == 0x7010 || device_id == 0x7111)) {
    776781            /* PIIX3 or PIIX4 IDE */
     
    10831088            if (pData->devices[i])
    10841089            {
    1085                 LogRel(("New device in slot %#x, %s (vendor=%#06x device=%#06x)\n", i, pData->devices[i]->name, 
     1090                LogRel(("New device in slot %#x, %s (vendor=%#06x device=%#06x)\n", i, pData->devices[i]->name,
    10861091                        PCIDevGetVendorId(pData->devices[i]), PCIDevGetDeviceId(pData->devices[i])));
    10871092                if (SSMR3HandleGetAfter(pSSMHandle) != SSMAFTER_DEBUG_IT)
     
    11001105        if (!pDev)
    11011106        {
    1102             LogRel(("Device in slot %#x has been removed! vendor=%#06x device=%#06x\n", i, 
     1107            LogRel(("Device in slot %#x has been removed! vendor=%#06x device=%#06x\n", i,
    11031108                    PCIDevGetVendorId(&DevTmp), PCIDevGetDeviceId(&DevTmp)));
    11041109            if (SSMR3HandleGetAfter(pSSMHandle) != SSMAFTER_DEBUG_IT)
     
    11181123        /* commit the loaded device config. */
    11191124        memcpy(pDev->config, DevTmp.config, sizeof(pDev->config));
    1120         if (DevTmp.Int.s.iIrq >= PCI_DEVICES_MAX) 
     1125        if (DevTmp.Int.s.iIrq >= PCI_DEVICES_MAX)
    11211126        {
    11221127            LogRel(("Device %s: Too many devices %d (max=%d)\n", pDev->name, DevTmp.Int.s.iIrq, PCI_DEVICES_MAX));
     
    13261331
    13271332
    1328 /** 
     1333/**
    13291334 * @copydoc PDMPCIBUSREG::pfnSetConfigCallbacksHC
    13301335 */
    1331 static DECLCALLBACK(void) pciSetConfigCallbacks(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PFNPCICONFIGREAD pfnRead, PPFNPCICONFIGREAD ppfnReadOld, 
     1336static DECLCALLBACK(void) pciSetConfigCallbacks(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PFNPCICONFIGREAD pfnRead, PPFNPCICONFIGREAD ppfnReadOld,
    13321337                                                PFNPCICONFIGWRITE pfnWrite, PPFNPCICONFIGWRITE ppfnWriteOld)
    13331338{
     
    14951500        return PDMDEV_SET_ERROR(pDevIns, rc,
    14961501                                N_("Failed to register ourselves as a PCI Bus"));
     1502    if (pBus->pPciHlpR3->u32Version != PDM_PCIHLPR3_VERSION)
     1503        return PDMDevHlpVMSetError(pDevIns, VERR_VERSION_MISMATCH, RT_SRC_POS,
     1504                                   N_("PCI helper version mismatch; got %#x expected %#x"),
     1505                                   pBus->pPciHlpR3->u32Version != PDM_PCIHLPR3_VERSION);
    14971506
    14981507    pBus->pPciHlpGC = pBus->pPciHlpR3->pfnGetGCHelpers(pDevIns);
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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