The "pc" ("pc-i440fx-*") machine types of QEMU don't support extended
config space. Accordingly, OVMF will use the following library instances
in connection with the core PciHostBridgeDxe driver:
BasePciSegmentLibPci [class: PciSegmentLib]
BasePciLibCf8 [class: PciLib]
BasePciCf8Lib [class: PciCf8Lib]
Add a new field to the PCI_ROOT_BRIDGE structure so that
RootBridgeIoCheckParameter() can catch config space offsets above 0xFF on
such old (emulated) platforms.
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Marcel Apfelbaum <marcel@redhat.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
PCI_ROOT_BRIDGE_APERTURE MemAbove4G;\r
PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;\r
BOOLEAN DmaAbove4G;\r
PCI_ROOT_BRIDGE_APERTURE MemAbove4G;\r
PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;\r
BOOLEAN DmaAbove4G;\r
+ BOOLEAN NoExtendedConfigSpace;\r
VOID *ConfigBuffer;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
CHAR16 *DevicePathStr;\r
VOID *ConfigBuffer;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
CHAR16 *DevicePathStr;\r
DEBUG ((EFI_D_INFO, "%s\n", DevicePathStr = ConvertDevicePathToText (Bridge->DevicePath, FALSE, FALSE)));\r
DEBUG ((EFI_D_INFO, " Support/Attr: %lx / %lx\n", Bridge->Supports, Bridge->Attributes));\r
DEBUG ((EFI_D_INFO, " DmaAbove4G: %s\n", Bridge->DmaAbove4G ? L"Yes" : L"No"));\r
DEBUG ((EFI_D_INFO, "%s\n", DevicePathStr = ConvertDevicePathToText (Bridge->DevicePath, FALSE, FALSE)));\r
DEBUG ((EFI_D_INFO, " Support/Attr: %lx / %lx\n", Bridge->Supports, Bridge->Attributes));\r
DEBUG ((EFI_D_INFO, " DmaAbove4G: %s\n", Bridge->DmaAbove4G ? L"Yes" : L"No"));\r
+ DEBUG ((EFI_D_INFO, "NoExtConfSpace: %s\n", Bridge->NoExtendedConfigSpace ? L"Yes" : L"No"));\r
DEBUG ((EFI_D_INFO, " AllocAttr: %lx (%s%s)\n", Bridge->AllocationAttributes,\r
(Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM) != 0 ? L"CombineMemPMem " : L"",\r
(Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) != 0 ? L"Mem64Decode" : L""\r
DEBUG ((EFI_D_INFO, " AllocAttr: %lx (%s%s)\n", Bridge->AllocationAttributes,\r
(Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM) != 0 ? L"CombineMemPMem " : L"",\r
(Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) != 0 ? L"Mem64Decode" : L""\r
RootBridge->Supports = Bridge->Supports;\r
RootBridge->Attributes = Bridge->Attributes;\r
RootBridge->DmaAbove4G = Bridge->DmaAbove4G;\r
RootBridge->Supports = Bridge->Supports;\r
RootBridge->Attributes = Bridge->Attributes;\r
RootBridge->DmaAbove4G = Bridge->DmaAbove4G;\r
+ RootBridge->NoExtendedConfigSpace = Bridge->NoExtendedConfigSpace;\r
RootBridge->AllocationAttributes = Bridge->AllocationAttributes;\r
RootBridge->DevicePath = DuplicateDevicePath (Bridge->DevicePath);\r
RootBridge->DevicePathStr = DevicePathStr;\r
RootBridge->AllocationAttributes = Bridge->AllocationAttributes;\r
RootBridge->DevicePath = DuplicateDevicePath (Bridge->DevicePath);\r
RootBridge->DevicePathStr = DevicePathStr;\r
Address = PciRbAddr->Register;\r
}\r
Base = 0;\r
Address = PciRbAddr->Register;\r
}\r
Base = 0;\r
+ Limit = RootBridge->NoExtendedConfigSpace ? 0xFF : 0xFFF;\r
}\r
\r
if (Address < Base) {\r
}\r
\r
if (Address < Base) {\r
///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.\r
BOOLEAN DmaAbove4G; ///< DMA above 4GB memory.\r
///< Set to TRUE when root bridge supports DMA above 4GB memory.\r
///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.\r
BOOLEAN DmaAbove4G; ///< DMA above 4GB memory.\r
///< Set to TRUE when root bridge supports DMA above 4GB memory.\r
+ BOOLEAN NoExtendedConfigSpace; ///< When FALSE, the root bridge supports\r
+ ///< Extended (4096-byte) Configuration Space.\r
+ ///< When TRUE, the root bridge supports\r
+ ///< 256-byte Configuration Space only.\r
UINT64 AllocationAttributes; ///< Allocation attributes.\r
///< Refer to EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and\r
///< EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()\r
UINT64 AllocationAttributes; ///< Allocation attributes.\r
///< Refer to EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and\r
///< EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()\r