REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4868 In current PCIE Resizable BAR feature, add below check: 1. Check Register Number of Resizable BARs is legal. 2. Check Register Register BAR Index is legal.
Signed-off-by: Foster Nong <foster.n...@intel.com> Cc: Michael D Kinney <michael.d.kin...@intel.com> Cc: Liming Gao <gaolim...@byosoft.com.cn> Cc: Ray Ni <ray...@intel.com> --- MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c | 43 ++++++++++++++++++------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c index 84fc0161a1..dc5fd27665 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c @@ -1800,7 +1800,6 @@ PciProgramResizableBar ( UINT32 Index; UINT32 Offset; INTN Bit; - UINTN ResizableBarNumber; EFI_STATUS Status; PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY Entries[PCI_MAX_BAR]; @@ -1813,18 +1812,40 @@ PciProgramResizableBar ( PciIoDevice->ResizableBarNumber )); - ResizableBarNumber = MIN (PciIoDevice->ResizableBarNumber, PCI_MAX_BAR); - PciIo = &PciIoDevice->PciIo; - Status = PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint8, - PciIoDevice->ResizableBarOffset + sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER), - sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY) * ResizableBarNumber, - (VOID *)(&Entries) - ); + if ((PciIoDevice->ResizableBarNumber > PCI_MAX_BAR) || (PciIoDevice->ResizableBarNumber == 0)) { + DEBUG ((DEBUG_ERROR, "ERROR: Resizable BAR register ResizableBarNumber=0x%X is illegal\n", PciIoDevice->ResizableBarNumber)); + return EFI_DEVICE_ERROR; + } + + PciIo = &PciIoDevice->PciIo; + Status = PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint8, + PciIoDevice->ResizableBarOffset + sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER), + sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY) * PciIoDevice->ResizableBarNumber, + (VOID *)(&Entries) + ); ASSERT_EFI_ERROR (Status); - for (Index = 0; Index < ResizableBarNumber; Index++) { + for (Index = 0; Index < PciIoDevice->ResizableBarNumber; Index++) { + // + // BAR index: encoded value + // 0 BAR located at offset 10h + // 1 BAR located at offset 14h + // 2 BAR located at offset 18h + // 3 BAR located at offset 1ch + // 4 BAR located at offset 20h + // 5 BAR located at offset 24h + // Others Reserved. + // Do not configure anything if some BAR info is wrong. + // + if (Entries[Index].ResizableBarControl.Bits.BarIndex >= PCI_MAX_BAR ) { + DEBUG ((DEBUG_ERROR, "ERROR: Resizable BAR Entry[%x].BarIndex=%x is illegal\n", Index, Entries[Index].ResizableBarControl.Bits.BarIndex)); + return EFI_DEVICE_ERROR; + } + } + + for (Index = 0; Index < PciIoDevice->ResizableBarNumber; Index++) { // // When the bit of Capabilities Set, indicates that the Function supports // operating with the BAR sized to (2^Bit) MB. -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#120666): https://edk2.groups.io/g/devel/message/120666 Mute This Topic: https://groups.io/mt/109174501/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-