Prevent the BmRepairAllControllers routine in an infinite loop

Contributed-under: TianoCore Contribution Agreement 1.0

Signed-off-by: Gary Li <gar...@hpe.com>
---
 MdeModulePkg/Library/UefiBootManagerLib/BmDriverHealth.c      | 11 +++++++++--
 .../Library/UefiBootManagerLib/UefiBootManagerLib.inf         |  3 ++-
 MdeModulePkg/MdeModulePkg.dec                                 |  5 +++++
 MdeModulePkg/MdeModulePkg.uni                                 |  4 ++++
 4 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmDriverHealth.c 
b/MdeModulePkg/Library/UefiBootManagerLib/BmDriverHealth.c
index bffbeda..1e68cbc 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmDriverHealth.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmDriverHealth.c
@@ -1,8 +1,9 @@
 /** @file
   Library functions which relates with driver health.
 
-(C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
 Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
+(C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
@@ -439,6 +440,8 @@ BmRepairAllControllers (
   BOOLEAN                             RebootRequired;
   EFI_HII_HANDLE                      *HiiHandles;
   EFI_FORM_BROWSER2_PROTOCOL          *FormBrowser2;
+  UINT32                              MaxRepairCount;
+  UINT32                              RepairCount;
 
   //
   // Configure PcdDriverHealthConfigureForm to ZeroGuid to disable driver 
health check.
@@ -450,6 +453,9 @@ BmRepairAllControllers (
   Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) 
&FormBrowser2);
   ASSERT_EFI_ERROR (Status);
 
+  MaxRepairCount = PcdGet32 (PcdMaxRepairCount);
+  RepairCount = 0;
+
   do {
     RepairRequired        = FALSE;
     ConfigurationRequired = FALSE;
@@ -512,7 +518,8 @@ BmRepairAllControllers (
     }
   
     EfiBootManagerFreeDriverHealthInfo (DriverHealthInfo, Count);
-  } while (RepairRequired || ConfigurationRequired);
+    RepairCount++;
+  } while ((RepairRequired || ConfigurationRequired) && ((MaxRepairCount == 0) 
|| (RepairCount < MaxRepairCount)));
 
   RebootRequired    = FALSE;
   ReconnectRequired = FALSE;
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf 
b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
index 9d62d3d..078f272 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+++ b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
@@ -6,6 +6,7 @@
 #  manipulation, driver health checking and etc.
 #
 #  Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
+#  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
@@ -117,4 +118,4 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable                    ## 
SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile                     ## 
CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdDriverHealthConfigureForm               ## 
SOMETIMES_CONSUMES
-
+  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxRepairCount                          ## 
CONSUMES
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index a133824..27efb37 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -1105,6 +1105,11 @@
   # @Prompt Exposed ACPI table versions.
   
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x3E|UINT32|0x0001004c
 
+  ## This PCD defines the MAX repair count.
+  #  The default value is 0 that means infinite.
+  # @Prompt MAX repair count
+  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxRepairCount|0x00|UINT32|0x00010076
+
 [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   ## This PCD defines the Console output row. The default value is 25 
according to UEFI spec.
   #  This PCD could be set to 0 then console output would be at max column and 
max row.
diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni
index 346f735..f529dce 100644
--- a/MdeModulePkg/MdeModulePkg.uni
+++ b/MdeModulePkg/MdeModulePkg.uni
@@ -978,3 +978,7 @@
 #string 
STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSdMmcPciHostControllerMmioBase_PROMPT  
#language en-US "Mmio base address of pci-based SD/MMC host controller"
 
 #string 
STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSdMmcPciHostControllerMmioBase_HELP  
#language en-US "This PCD specifies the PCI-based SD/MMC host controller mmio 
base address. Define the mmio base address of the pci-based SD/MMC host 
controller. If there are multiple SD/MMC host controllers, their mmio base 
addresses are calculated one by one from this base address.<BR>"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdMaxRepairCount_PROMPT  #language 
en-US "MAX repair count"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdMaxRepairCount_HELP  #language 
en-US "This PCD defines the MAX repair count. The default value is 0 that means 
infinite.<BR>"
-- 
2.7.2.windows.1

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

Reply via email to