MdeModulePkg:Prevent the BmRepairAllControllers routine in an infinite loop

Prevent the BmRepairAllControllers routine in an infinite loop

Contributed-under: TianoCore Contribution Agreement 1.0

Signed-off-by: Gary Li <garyli@hpe.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Gary Li 2016-06-03 15:21:26 +08:00 committed by Liming Gao
parent 5b03f1b514
commit b34e446122
4 changed files with 20 additions and 3 deletions

View File

@ -1,8 +1,9 @@
/** @file /** @file
Library functions which relates with driver health. 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> 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -439,6 +440,8 @@ BmRepairAllControllers (
BOOLEAN RebootRequired; BOOLEAN RebootRequired;
EFI_HII_HANDLE *HiiHandles; EFI_HII_HANDLE *HiiHandles;
EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2; EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;
UINT32 MaxRepairCount;
UINT32 RepairCount;
// //
// Configure PcdDriverHealthConfigureForm to ZeroGuid to disable driver health check. // Configure PcdDriverHealthConfigureForm to ZeroGuid to disable driver health check.
@ -450,6 +453,9 @@ BmRepairAllControllers (
Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2); Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
MaxRepairCount = PcdGet32 (PcdMaxRepairCount);
RepairCount = 0;
do { do {
RepairRequired = FALSE; RepairRequired = FALSE;
ConfigurationRequired = FALSE; ConfigurationRequired = FALSE;
@ -512,7 +518,8 @@ BmRepairAllControllers (
} }
EfiBootManagerFreeDriverHealthInfo (DriverHealthInfo, Count); EfiBootManagerFreeDriverHealthInfo (DriverHealthInfo, Count);
} while (RepairRequired || ConfigurationRequired); RepairCount++;
} while ((RepairRequired || ConfigurationRequired) && ((MaxRepairCount == 0) || (RepairCount < MaxRepairCount)));
RebootRequired = FALSE; RebootRequired = FALSE;
ReconnectRequired = FALSE; ReconnectRequired = FALSE;

View File

@ -6,6 +6,7 @@
# manipulation, driver health checking and etc. # manipulation, driver health checking and etc.
# #
# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> # 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 # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -117,4 +118,4 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDriverHealthConfigureForm ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdDriverHealthConfigureForm ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxRepairCount ## CONSUMES

View File

@ -1105,6 +1105,11 @@
# @Prompt Exposed ACPI table versions. # @Prompt Exposed ACPI table versions.
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x3E|UINT32|0x0001004c 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] [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
## This PCD defines the Console output row. The default value is 25 according to UEFI spec. ## 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. # This PCD could be set to 0 then console output would be at max column and max row.

View File

@ -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_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_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>"