LocatePciExpressCapabilityRegBlock () doesn't check the return status of 
Pci.Read().
Certain platform's PciRootBridge.Pci.Read() doesn't support PCIE access causing 
the CapabilityEntry not updated.
If the uninitialized CapabilityEntry equals to a big enough initial value, the 
while-loop will never end.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu...@intel.com>
CC: Maurice Ma <maurice...@intel.com>
---
 MdeModulePkg/Bus/Pci/PciBusDxe/PciCommand.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciCommand.c 
b/MdeModulePkg/Bus/Pci/PciBusDxe/PciCommand.c
index 9f3fcce..8a8b4b8 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciCommand.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciCommand.c
@@ -1,7 +1,7 @@
 /** @file
   PCI command register operations supporting functions implementation for PCI 
Bus module.
 
-Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -200,9 +200,10 @@ LocatePciExpressCapabilityRegBlock (
      OUT UINT32        *NextRegBlock OPTIONAL
   )
 {
-  UINT32  CapabilityPtr;
-  UINT32  CapabilityEntry;
-  UINT16  CapabilityID;
+  EFI_STATUS           Status;
+  UINT32               CapabilityPtr;
+  UINT32               CapabilityEntry;
+  UINT16               CapabilityID;
 
   //
   // To check the capability of this device supports
@@ -222,13 +223,16 @@ LocatePciExpressCapabilityRegBlock (
     // Mask it to DWORD alignment per PCI spec
     //
     CapabilityPtr &= 0xFFC;
-    PciIoDevice->PciIo.Pci.Read (
-                             &PciIoDevice->PciIo,
-                             EfiPciIoWidthUint32,
-                             CapabilityPtr,
-                             1,
-                             &CapabilityEntry
-                             );
+    Status = PciIoDevice->PciIo.Pci.Read (
+                                      &PciIoDevice->PciIo,
+                                      EfiPciIoWidthUint32,
+                                      CapabilityPtr,
+                                      1,
+                                      &CapabilityEntry
+                                      );
+    if (EFI_ERROR (Status)) {
+      break;
+    }
 
     CapabilityID = (UINT16) CapabilityEntry;
 
-- 
1.9.5.msysgit.1


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to