VirtualBox

Changeset 70280 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 21, 2017 2:02:41 PM (7 years ago)
Author:
vboxsync
Message:

VBoxGuest-win.cpp: Dropped VBOXGUESTDEVEXTWIN::aPciBaseAddresses and cPciBaseAddresses as nobody uses them and they're unnecessary complexity.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp

    r70279 r70280  
    8080    VGDRVNTDEVSTATE_REMOVED
    8181} VGDRVNTDEVSTATE;
    82 
    83 
    84 typedef struct VBOXGUESTWINBASEADDRESS
    85 {
    86     /** Original device physical address. */
    87     PHYSICAL_ADDRESS RangeStart;
    88     /** Length of I/O or memory range. */
    89     ULONG   RangeLength;
    90     /** Flag: Unmapped range is I/O or memory range. */
    91     BOOLEAN RangeInMemory;
    92     /** Mapped I/O or memory range. */
    93     PVOID   MappedRangeStart;
    94     /** Flag: mapped range is I/O or memory range. */
    95     BOOLEAN MappedRangeInMemory;
    96     /** Flag: resource is mapped (i.e. MmMapIoSpace called). */
    97     BOOLEAN ResourceMapped;
    98 } VBOXGUESTWINBASEADDRESS;
    99 typedef VBOXGUESTWINBASEADDRESS *PVBOXGUESTWINBASEADDRESS;
    10082
    10183
     
    127109    /** LevelSensitive or Latched. */
    128110    KINTERRUPT_MODE         enmInterruptMode;
    129 
    130     /** PCI base address information. */
    131     ULONG                   cPciAddresses;
    132     VBOXGUESTWINBASEADDRESS aPciBaseAddresses[PCI_TYPE0_ADDRESSES];
    133111
    134112    /** Physical address and length of VMMDev memory. */
     
    536514static NTSTATUS vgdrvNtScanPCIResourceList(PVBOXGUESTDEVEXTWIN pDevExt, PCM_RESOURCE_LIST pResList, bool fTranslated)
    537515{
    538     /* Enumerate the resource list. */
    539     LogFlowFunc(("Found %d resources\n",
    540                  pResList->List->PartialResourceList.Count));
    541 
    542     NTSTATUS rc = STATUS_SUCCESS;
     516    LogFlowFunc(("Found %d resources\n", pResList->List->PartialResourceList.Count));
    543517    PCM_PARTIAL_RESOURCE_DESCRIPTOR pPartialData = NULL;
    544     PVBOXGUESTWINBASEADDRESS pBaseAddress   = pDevExt->aPciBaseAddresses;
    545     uint32_t                 cBaseAddresses = 0;
    546     bool                     fGotIrq        = false;
    547     bool                     fGotMmio       = false;
    548     bool                     fGotIoPorts    = false;
     518    bool                            fGotIrq      = false;
     519    bool                            fGotMmio     = false;
     520    bool                            fGotIoPorts  = false;
     521    NTSTATUS                        rc           = STATUS_SUCCESS;
    549522    for (ULONG i = 0; i < pResList->List->PartialResourceList.Count; i++)
    550523    {
     
    553526        {
    554527            case CmResourceTypePort:
    555             {
    556528                LogFlowFunc(("I/O range: Base=%#RX64, length=%08x\n",
    557529                             pPartialData->u.Port.Start.QuadPart, pPartialData->u.Port.Length));
    558 
    559                 /* Overflow protection. */
    560                 if (cBaseAddresses < PCI_TYPE0_ADDRESSES)
     530                /* Save the first I/O port base. */
     531                if (!fGotIoPorts)
    561532                {
    562                     /* Save the first I/O port base. */
    563                     if (!fGotIoPorts)
    564                     {
    565                         pDevExt->Core.IOPortBase = (RTIOPORT)pPartialData->u.Port.Start.LowPart;
    566                         fGotIoPorts = true;
    567                     }
    568                     else
    569                         LogRelFunc(("More than one I/O port range?!?\n"));
    570 
    571                     /* Save resource information. */
    572                     pBaseAddress->RangeStart     = pPartialData->u.Port.Start;
    573                     pBaseAddress->RangeLength    = pPartialData->u.Port.Length;
    574                     pBaseAddress->RangeInMemory  = FALSE;
    575                     pBaseAddress->ResourceMapped = FALSE;
    576 
     533                    pDevExt->Core.IOPortBase = (RTIOPORT)pPartialData->u.Port.Start.LowPart;
     534                    fGotIoPorts = true;
    577535                    LogFunc(("I/O range for VMMDev found! Base=%#RX64, length=%08x\n",
    578536                             pPartialData->u.Port.Start.QuadPart, pPartialData->u.Port.Length));
    579 
    580                     /* Next item ... */
    581                     pBaseAddress++;
    582                     cBaseAddresses++;
    583537                }
    584538                else
    585                     LogFunc(("Too many PCI addresses!\n"));
     539                    LogRelFunc(("More than one I/O port range?!?\n"));
    586540                break;
    587             }
    588541
    589542            case CmResourceTypeInterrupt:
    590             {
    591543                LogFunc(("Interrupt: Level=%x, vector=%x, mode=%x\n",
    592544                         pPartialData->u.Interrupt.Level, pPartialData->u.Interrupt.Vector, pPartialData->Flags));
    593 
    594545                if (!fGotIrq)
    595546                {
     
    605556                        pDevExt->enmInterruptMode = LevelSensitive;
    606557                    fGotIrq = true;
     558                    LogFunc(("Interrupt for VMMDev found! Vector=%#x Level=%#x Affinity=%zx Mode=%d\n", pDevExt->uInterruptVector,
     559                             pDevExt->uInterruptLevel, pDevExt->fInterruptAffinity, pDevExt->enmInterruptMode));
    607560                }
    608561                else
    609562                    LogFunc(("More than one IRQ resource!\n"));
    610563                break;
    611             }
    612564
    613565            case CmResourceTypeMemory:
    614             {
    615566                LogFlowFunc(("Memory range: Base=%#RX64, length=%08x\n",
    616567                             pPartialData->u.Memory.Start.QuadPart, pPartialData->u.Memory.Length));
    617 
    618                 /* Overflow protection. */
    619                 if (cBaseAddresses < PCI_TYPE0_ADDRESSES)
     568                /* We only care about the first read/write memory range. */
     569                if (   !fGotMmio
     570                    && (pPartialData->Flags & CM_RESOURCE_MEMORY_WRITEABILITY_MASK) == CM_RESOURCE_MEMORY_READ_WRITE)
    620571                {
    621                     /* We only care about the first read/write memory range. */
    622                     if (   !fGotMmio
    623                         && (pPartialData->Flags & CM_RESOURCE_MEMORY_WRITEABILITY_MASK) == CM_RESOURCE_MEMORY_READ_WRITE)
     572                    /* Save physical MMIO base + length for VMMDev. */
     573                    pDevExt->uVmmDevMemoryPhysAddr = pPartialData->u.Memory.Start;
     574                    pDevExt->cbVmmDevMemory = (ULONG)pPartialData->u.Memory.Length;
     575
     576                    if (!fTranslated)
    624577                    {
    625                         /* Save physical MMIO base + length for VMMDev. */
    626                         pDevExt->uVmmDevMemoryPhysAddr = pPartialData->u.Memory.Start;
    627                         pDevExt->cbVmmDevMemory = (ULONG)pPartialData->u.Memory.Length;
    628 
    629                         if (!fTranslated)
     578                        /* Technically we need to make the HAL translate the address.  since we
     579                           didn't used to do this and it probably just returns the input address,
     580                           we allow ourselves to ignore failures. */
     581                        ULONG               uAddressSpace = 0;
     582                        PHYSICAL_ADDRESS    PhysAddr = pPartialData->u.Memory.Start;
     583                        if (HalTranslateBusAddress(pResList->List->InterfaceType, pResList->List->BusNumber, PhysAddr,
     584                                                   &uAddressSpace, &PhysAddr))
    630585                        {
    631                             /* Technically we need to make the HAL translate the address.  since we
    632                                didn't used to do this and it probably just returns the input address,
    633                                we allow ourselves to ignore failures. */
    634                             ULONG               uAddressSpace = 0;
    635                             PHYSICAL_ADDRESS    PhysAddr = pPartialData->u.Memory.Start;
    636                             if (HalTranslateBusAddress(pResList->List->InterfaceType, pResList->List->BusNumber, PhysAddr,
    637                                                        &uAddressSpace, &PhysAddr))
    638                             {
    639                                 Log(("HalTranslateBusAddress(%#RX64) -> %RX64, type %#x\n",
    640                                      pPartialData->u.Memory.Start.QuadPart, PhysAddr.QuadPart, uAddressSpace));
    641                                 if (pPartialData->u.Memory.Start.QuadPart != PhysAddr.QuadPart)
    642                                     pDevExt->uVmmDevMemoryPhysAddr = PhysAddr;
    643                             }
    644                             else
    645                                 Log(("HalTranslateBusAddress(%#RX64) -> failed!\n", pPartialData->u.Memory.Start.QuadPart));
     586                            Log(("HalTranslateBusAddress(%#RX64) -> %RX64, type %#x\n",
     587                                 pPartialData->u.Memory.Start.QuadPart, PhysAddr.QuadPart, uAddressSpace));
     588                            if (pPartialData->u.Memory.Start.QuadPart != PhysAddr.QuadPart)
     589                                pDevExt->uVmmDevMemoryPhysAddr = PhysAddr;
    646590                        }
    647 
    648                         /* Save resource information. */
    649                         pBaseAddress->RangeStart     = pPartialData->u.Memory.Start;
    650                         pBaseAddress->RangeLength    = pPartialData->u.Memory.Length;
    651                         pBaseAddress->RangeInMemory  = TRUE;
    652                         pBaseAddress->ResourceMapped = FALSE;
    653 
    654                         LogFunc(("Found memory range for VMMDev! Base = %#RX64, Length = %08x\n",
    655                                  pPartialData->u.Memory.Start.QuadPart, pPartialData->u.Memory.Length));
    656 
    657                         /* Next item ... */
    658                         cBaseAddresses++;
    659                         pBaseAddress++;
    660                         fGotMmio = true;
     591                        else
     592                            Log(("HalTranslateBusAddress(%#RX64) -> failed!\n", pPartialData->u.Memory.Start.QuadPart));
    661593                    }
    662                     else
    663                         LogFunc(("Ignoring memory: Flags=%08x Base=%#RX64\n",
    664                                  pPartialData->Flags, pPartialData->u.Memory.Start.QuadPart));
     594
     595                    fGotMmio = true;
     596                    LogFunc(("Found memory range for VMMDev! Base = %#RX64, Length = %08x\n",
     597                             pPartialData->u.Memory.Start.QuadPart, pPartialData->u.Memory.Length));
    665598                }
    666599                else
    667                     LogFunc(("Too many PCI addresses!\n"));
     600                    LogFunc(("Ignoring memory: Flags=%08x Base=%#RX64\n",
     601                             pPartialData->Flags, pPartialData->u.Memory.Start.QuadPart));
    668602                break;
    669             }
    670603
    671604            default:
    672             {
    673605                LogFunc(("Unhandled resource found, type=%d\n", pPartialData->Type));
    674606                break;
    675             }
    676607        }
    677608    }
    678 
    679     /* Memorize the number of resources found. */
    680     pDevExt->cPciAddresses = cBaseAddresses;
    681609    return rc;
    682610}
     
    807735        PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
    808736# ifdef LOG_ENABLED
    809         vgdrvNtShowDeviceResources(pStack->Parameters.StartDevice.AllocatedResources);
     737        vgdrvNtShowDeviceResources(pStack->Parameters.StartDevice.AllocatedResourcesTranslated);
    810738# endif
    811739        rcNt = vgdrvNtScanPCIResourceList(pDevExt, pStack->Parameters.StartDevice.AllocatedResourcesTranslated,
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