QuarkPlatformPkg/PlatformBootManager: Add capsule/recovery handling.

1) Add capsule and recovery boot path handling in platform BDS.
2) Add check if the platform is using default test key for capsule.
Produce PcdTestKeyUsed to indicate if there is any
test key used in current BIOS, such as recovery key,
or capsule update key.
Then the generic UI may consume this PCD to show warning information.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Kelly Steele <kelly.steele@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Chao Zhang <chao.b.zhang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
This commit is contained in:
Jiewen Yao 2016-09-21 11:37:27 +08:00
parent 4e15ace8b5
commit 9bd5e0cc9c
3 changed files with 152 additions and 5 deletions

View File

@ -2,7 +2,7 @@
This file include all platform action which can be customized
by IBV/OEM.
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, 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
@ -205,6 +205,8 @@ PlatformBootManagerBeforeConsole (
EFI_INPUT_KEY Enter;
EFI_INPUT_KEY F2;
EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;
EFI_BOOT_MODE BootMode;
EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
EFI_HANDLE Handle;
EFI_EVENT EndOfDxeEvent;
@ -246,6 +248,40 @@ PlatformBootManagerBeforeConsole (
//
PlatformRegisterFvBootOption (&mUefiShellFileGuid, L"UEFI Shell", LOAD_OPTION_ACTIVE);
Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement);
if (EFI_ERROR(Status)) {
EsrtManagement = NULL;
}
BootMode = GetBootModeHob();
switch (BootMode) {
case BOOT_ON_FLASH_UPDATE:
DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe ......\n"));
Status = ProcessCapsules ();
DEBUG((DEBUG_INFO, "ProcessCapsules %r\n", Status));
break;
case BOOT_IN_RECOVERY_MODE:
break;
case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
case BOOT_WITH_MINIMAL_CONFIGURATION:
case BOOT_ON_S4_RESUME:
if (EsrtManagement != NULL) {
//
// Lock ESRT cache repository before EndofDxe if ESRT sync is not needed
//
EsrtManagement->LockEsrtRepository();
}
break;
default:
//
// Require to sync ESRT from FMP in a new boot
//
if (EsrtManagement != NULL) {
EsrtManagement->SyncEsrtFmp();
}
break;
}
//
// Prepare for S3
//
@ -303,7 +339,64 @@ PlatformBootManagerAfterConsole (
VOID
)
{
EFI_STATUS Status;
EFI_STATUS Status;
EFI_BOOT_MODE BootMode;
ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;
VOID *Buffer;
UINTN Size;
Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement);
if (EFI_ERROR(Status)) {
EsrtManagement = NULL;
}
BootMode = GetBootModeHob();
switch (BootMode) {
case BOOT_ON_FLASH_UPDATE:
DEBUG((DEBUG_INFO, "Capsule Mode detected\n"));
if (FeaturePcdGet(PcdSupportUpdateCapsuleReset)) {
EfiBootManagerConnectAll ();
EfiBootManagerRefreshAllBootOption ();
//
// Always sync ESRT Cache from FMP Instances after connect all and before capsule process
//
if (EsrtManagement != NULL) {
EsrtManagement->SyncEsrtFmp();
}
DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll ......\n"));
Status = ProcessCapsules();
DEBUG((DEBUG_INFO, "ProcessCapsules %r\n", Status));
}
break;
case BOOT_IN_RECOVERY_MODE:
DEBUG((DEBUG_INFO, "Recovery Mode detected\n"));
// Passthrough
case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
case BOOT_WITH_MINIMAL_CONFIGURATION:
case BOOT_WITH_FULL_CONFIGURATION:
case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS:
case BOOT_WITH_DEFAULT_SETTINGS:
default:
EfiBootManagerConnectAll ();
EfiBootManagerRefreshAllBootOption ();
//
// Sync ESRT Cache from FMP Instance on demand after Connect All
//
if ((BootMode != BOOT_ASSUMING_NO_CONFIGURATION_CHANGES) &&
(BootMode != BOOT_WITH_MINIMAL_CONFIGURATION) &&
(BootMode != BOOT_ON_S4_RESUME)) {
if (EsrtManagement != NULL) {
EsrtManagement->SyncEsrtFmp();
}
}
break;
}
Print (
L"\n"
@ -312,6 +405,40 @@ PlatformBootManagerAfterConsole (
L"\n"
);
//
// Check if the platform is using test key.
//
Status = GetSectionFromAnyFv(
PcdGetPtr(PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid),
EFI_SECTION_RAW,
0,
&Buffer,
&Size
);
if (!EFI_ERROR(Status)) {
if ((Size == PcdGetSize(PcdRsa2048Sha256PublicKeyBuffer)) &&
(CompareMem(Buffer, PcdGetPtr(PcdRsa2048Sha256PublicKeyBuffer), Size) == 0)) {
Print(L"WARNING: Recovery Test Key is used.\n");
PcdSetBoolS(PcdTestKeyUsed, TRUE);
}
FreePool(Buffer);
}
Status = GetSectionFromAnyFv(
PcdGetPtr(PcdEdkiiPkcs7TestPublicKeyFileGuid),
EFI_SECTION_RAW,
0,
&Buffer,
&Size
);
if (!EFI_ERROR(Status)) {
if ((Size == PcdGetSize(PcdPkcs7CertBuffer)) &&
(CompareMem(Buffer, PcdGetPtr(PcdPkcs7CertBuffer), Size) == 0)) {
Print(L"WARNING: Capsule Test Key is used.\n");
PcdSetBoolS(PcdTestKeyUsed, TRUE);
}
FreePool(Buffer);
}
//
// Use a DynamicHii type pcd to save the boot status, which is used to
// control configuration mode, such as FULL/MINIMAL/NO_CHANGES configuration.

View File

@ -1,7 +1,7 @@
/** @file
Head file for BDS Platform specific code
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, 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
@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Protocol/FirmwareVolume2.h>
#include <Protocol/AcpiS3Save.h>
#include <Protocol/DxeSmmReadyToLock.h>
#include <Protocol/EsrtManagement.h>
#include <Guid/DebugAgentGuid.h>
#include <Guid/EventGroup.h>
#include <Guid/PcAnsi.h>
@ -32,9 +33,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootManagerLib.h>
#include <Library/PrintLib.h>
#include <Library/HobLib.h>
#include <Library/CapsuleLib.h>
#include <Library/DxeServicesLib.h>
typedef struct {
EFI_DEVICE_PATH_PROTOCOL *DevicePath;

View File

@ -1,7 +1,7 @@
## @file
# Include all platform action which can be customized by IBV/OEM.
#
# Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2012 - 2016, 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
@ -38,6 +38,9 @@
IntelFrameworkPkg/IntelFrameworkPkg.dec
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
SourceLevelDebugPkg/SourceLevelDebugPkg.dec
QuarkPlatformPkg/QuarkPlatformPkg.dec
SecurityPkg/SecurityPkg.dec
SignedCapsulePkg/SignedCapsulePkg.dec
[LibraryClasses]
BaseLib
@ -49,11 +52,16 @@
UefiBootServicesTableLib
UefiLib
UefiBootManagerLib
PrintLib
HobLib
CapsuleLib
DxeServicesLib
[Protocols]
gEfiFirmwareVolume2ProtocolGuid
gEfiAcpiS3SaveProtocolGuid
gEfiDxeSmmReadyToLockProtocolGuid
gEsrtManagementProtocolGuid
[Guids]
gEfiPcAnsiGuid
@ -70,3 +78,10 @@
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits
gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootState
gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset
gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid
gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiPkcs7TestPublicKeyFileGuid
gEfiSecurityPkgTokenSpaceGuid.PcdRsa2048Sha256PublicKeyBuffer
gEfiSecurityPkgTokenSpaceGuid.PcdPkcs7CertBuffer
gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed