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...@intel.com>
Cc: Jordan Justen <jordan.l.jus...@intel.com>
Cc: Marcel Apfelbaum <mar...@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <ler...@redhat.com>
---

Notes:
    v2:
    - replace the PCI config space "aperture" with a dedicated BOOLEAN flag
      called ExtendedConfigSpace [Ray]
    - simplify the commit message

 MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h   | 1 +
 MdeModulePkg/Include/Library/PciHostBridgeLib.h         | 4 ++++
 MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c | 4 +++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h 
b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
index b1e83f1c9089..f9839fed4628 100644
--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
+++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
@@ -72,6 +72,7 @@ typedef struct {
   PCI_ROOT_BRIDGE_APERTURE          MemAbove4G;
   PCI_ROOT_BRIDGE_APERTURE          PMemAbove4G;
   BOOLEAN                           DmaAbove4G;
+  BOOLEAN                           ExtendedConfigSpace;
   VOID                              *ConfigBuffer;
   EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
   CHAR16                            *DevicePathStr;
diff --git a/MdeModulePkg/Include/Library/PciHostBridgeLib.h 
b/MdeModulePkg/Include/Library/PciHostBridgeLib.h
index b1dba0f754d7..fbf3be860c13 100644
--- a/MdeModulePkg/Include/Library/PciHostBridgeLib.h
+++ b/MdeModulePkg/Include/Library/PciHostBridgeLib.h
@@ -34,6 +34,10 @@ typedef struct {
                                                  ///< and SetAttributes() in 
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
   BOOLEAN                  DmaAbove4G;           ///< DMA above 4GB memory.
                                                  ///< Set to TRUE when root 
bridge supports DMA above 4GB memory.
+  BOOLEAN                  ExtendedConfigSpace;  ///< When TRUE, the root 
bridge supports
+                                                 ///< Extended (4096-byte) 
Configuration Space.
+                                                 ///< When FALSE, the root 
bridge supports
+                                                 ///< 256-byte Configuration 
Space only.
   UINT64                   AllocationAttributes; ///< Allocation attributes.
                                                  ///< Refer to 
EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and
                                                  ///< 
EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()
diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c 
b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
index 332860eb3819..b0b1a2c18cca 100644
--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
+++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
@@ -80,6 +80,7 @@ CreateRootBridge (
   DEBUG ((EFI_D_INFO, "%s\n", DevicePathStr = ConvertDevicePathToText 
(Bridge->DevicePath, FALSE, FALSE)));
   DEBUG ((EFI_D_INFO, "Support/Attr: %lx / %lx\n", Bridge->Supports, 
Bridge->Attributes));
   DEBUG ((EFI_D_INFO, "  DmaAbove4G: %s\n", Bridge->DmaAbove4G ? L"Yes" : 
L"No"));
+  DEBUG ((EFI_D_INFO, "ExtConfSpace: %s\n", Bridge->ExtendedConfigSpace ? 
L"Yes" : L"No"));
   DEBUG ((EFI_D_INFO, "   AllocAttr: %lx (%s%s)\n", 
Bridge->AllocationAttributes,
           (Bridge->AllocationAttributes & 
EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM) != 0 ? L"CombineMemPMem " : L"",
           (Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) != 
0 ? L"Mem64Decode" : L""
@@ -155,6 +156,7 @@ CreateRootBridge (
   RootBridge->Supports = Bridge->Supports;
   RootBridge->Attributes = Bridge->Attributes;
   RootBridge->DmaAbove4G = Bridge->DmaAbove4G;
+  RootBridge->ExtendedConfigSpace = Bridge->ExtendedConfigSpace;
   RootBridge->AllocationAttributes = Bridge->AllocationAttributes;
   RootBridge->DevicePath = DuplicateDevicePath (Bridge->DevicePath);
   RootBridge->DevicePathStr = DevicePathStr;
@@ -351,7 +353,7 @@ RootBridgeIoCheckParameter (
       Address = PciRbAddr->Register;
     }
     Base = 0;
-    Limit = 0xFFF;
+    Limit = RootBridge->ExtendedConfigSpace ? 0xFFF : 0xFF;
   }
 
   if (Address < Base) {
-- 
1.8.3.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to