BusAssignmentManager.cpp revision 56140087893593dc95f2311c9e99341b4c71ea9c
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * VirtualBox bus slots assignment manager
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * Copyright (C) 2010-2012 Oracle Corporation
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * available from http://www.virtualbox.org. This file is free software;
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * you can redistribute it and/or modify it under the terms of the GNU
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * General Public License (GPL) as published by the Free Software
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync const char* pszName;
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync/* Those rules define PCI slots assignment */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync/* Device Bus Device Function Priority */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync/* Generic rules */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* VGA controller */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* VMM device */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* Audio controllers */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* Storage controllers */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* USB controllers */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* ACPI controller */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* Network controllers */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* the first network card gets the PCI ID 3, the next 3 gets 8..10,
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * next 4 get 16..19. */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* VMWare assigns first NIC to slot 11 */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* ISA/LPC controller */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync/* PIIX3 chipset rules */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync/* ICH9 chipset rules */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* Host Controller */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* Those are functions of LPC at 00:1e:00 */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * Please note, that for devices being functions, like we do here, device 0
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * must be multifunction, i.e. have header type 0x80. Our LPC device is.
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync * Alternative approach is to assign separate slot to each device.
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* to make sure rule never used before rules assigning devices on it */
939ffd583b0105c9cfab3570932faa41e0ccd563vboxsync /* Storage controllers */
struct PCIDeviceRecord
bool operator<(const PCIDeviceRecord &a) const
bool operator==(const PCIDeviceRecord &a) const
State()
~State()
return S_OK;
HRESULT BusAssignmentManager::State::record(const char* pszName, PCIBusAddress& Address, PCIBusAddress HostAddress)
return S_OK;
bool BusAssignmentManager::State::findPCIAddress(const char* pszDevName, int iInstance, PCIBusAddress& Address)
switch (mChipsetType)
case ChipsetType_PIIX3:
case ChipsetType_ICH9:
Assert(false);
return NULL;
if (pszAlias)
return S_OK;
return E_INVALIDARG;
void BusAssignmentManager::State::listAttachedPCIDevices(ComSafeArrayOut(IPCIDeviceAttachment*, aAttached))
if (pState)
delete pState;
return pInstance;
return E_INVALIDARG;
return S_OK;
bool fGuestAddressRequired)
if (!fAvailable)
return rc;
return rc;
return rc;
return rc;
return rc;
return S_OK;
bool BusAssignmentManager::findPCIAddress(const char* pszDevName, int iInstance, PCIBusAddress& Address)