From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"Zhang, Chao B" <chao.b.zhang@intel.com>
Cc: "Xu, Wei6" <wei6.xu@intel.com>
Subject: Re: [edk2-devel] [Patch] Revert "Capsule on Disk entire patch."
Date: Fri, 21 Jun 2019 02:07:36 +0000 [thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A093C8F3199@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20190621020227.13104-1-chao.b.zhang@intel.com>
> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Zhang, Chao B
> Sent: Friday, June 21, 2019 10:02 AM
> To: devel@edk2.groups.io
> Cc: Xu, Wei6; Wu, Hao A; Zhang, Chao B
> Subject: [edk2-devel] [Patch] Revert "Capsule on Disk entire patch."
>
> This reverts commit 0d4aa276d1f6e0cb9d71a7fb88b30c416ba6d5a3,
> 6470a43160183cd48cad8901c912a48811f18b13,
> fd7286089542ee7a98cfea00be45ceb3561e0b20,
> 7837d1249807b4248079699097bc993254235d7a,
> 6b32af2e105f9b5454a55b581f2dc365c5eb6397,
> 8636f70b5a763ed1c03b292708f9c5543e531ea9,
> f17935321a5b818a66e999632ef371b374b98f0c
> due to incorrect review process.
>
> Cc: Wei6 Xu <wei6.xu@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Signed-off-by: Chao B Zhang <chao.b.zhang@intel.com>
> Signed-off-by: Zhang, Chao B <chao.b.zhang@intel.com>
Thanks Chao,
Please remove the extra 'Signed-off' tag above.
With this handled,
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Best Regards,
Hao Wu
> ---
> MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 41 +-
> MdeModulePkg/Application/CapsuleApp/CapsuleDump.c | 4 +-
> .../Application/CapsuleApp/CapsuleOnDisk.c | 56 +-
> MdeModulePkg/Core/DxeIplPeim/DxeIpl.h | 3 +-
> MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf | 20 +-
> MdeModulePkg/Core/DxeIplPeim/DxeLoad.c | 30 +-
> MdeModulePkg/Include/Library/CapsuleLib.h | 78 +-
> MdeModulePkg/Include/Ppi/CapsuleOnDisk.h | 55 -
> .../Library/DxeCapsuleLibFmp/CapsuleOnDisk.c | 1966 --------------------
> .../Library/DxeCapsuleLibFmp/CapsuleOnDisk.h | 75 -
> .../Library/DxeCapsuleLibFmp/DxeCapsuleLib.c | 57 +-
> .../Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf | 21 +-
> .../DxeCapsuleLibFmp/DxeCapsuleProcessLib.c | 124 +-
> .../Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c | 67 +-
> .../DxeCapsuleLibFmp/DxeCapsuleReportLibNull.c | 6 +-
> .../DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf | 3 +-
> .../Library/DxeCapsuleLibNull/DxeCapsuleLibNull.c | 85 +-
> MdeModulePkg/MdeModulePkg.dec | 48 -
> MdeModulePkg/MdeModulePkg.dsc | 4 -
> MdeModulePkg/MdeModulePkg.uni | 34 -
> MdeModulePkg/Universal/BdsDxe/BdsDxe.inf | 3 +-
> MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 6 +-
> .../CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c | 442 -----
> .../CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.inf | 64 -
> .../CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.uni | 15 -
> .../CapsuleOnDiskLoadPeiExtra.uni | 14 -
> .../CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf | 1 -
> .../Universal/CapsuleRuntimeDxe/CapsuleService.c | 12 +-
> 28 files changed, 68 insertions(+), 3266 deletions(-)
> delete mode 100644 MdeModulePkg/Include/Ppi/CapsuleOnDisk.h
> delete mode 100644
> MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
> delete mode 100644
> MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.h
> delete mode 100644
> MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c
> delete mode 100644
> MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.in
> f
> delete mode 100644
> MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.u
> ni
> delete mode 100644
> MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPeiEx
> tra.uni
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> index 0b5f7c8684..e3c591dbf3 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> @@ -847,11 +847,11 @@ PrintUsage (
> Print(L" CapsuleApp -D <Capsule>\n");
> Print(L" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");
> Print(L"Parameter:\n");
> Print(L" -NR: No reset will be triggered for the capsule\n");
> Print(L" with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without
> CAPSULE_FLAGS_INITIATE_RESET.\n");
> - Print(L" -OD: Delivery of Capsules via file on Mass Storage device.\n");
> + Print(L" -OD: Delivery of Capsules via file on Mass Storage device.");
> Print(L" -S: Dump capsule report variable
> (EFI_CAPSULE_REPORT_GUID),\n");
> Print(L" which is defined in UEFI specification.\n");
> Print(L" -C: Clear capsule report variable
> (EFI_CAPSULE_REPORT_GUID),\n");
> Print(L" which is defined in UEFI specification.\n");
> Print(L" -P: Dump UEFI FMP protocol info, or get image with specified\n");
> @@ -1018,43 +1018,44 @@ UefiMain (
> ParaNrIndex = Index;
> NoReset = TRUE;
> }
> }
>
> - if (ParaOdIndex > ParaNrIndex) {
> - if (ParaNrIndex != 0) {
> - CapsuleLastIndex = ParaNrIndex - 1;
> - } else {
> - CapsuleLastIndex = ParaOdIndex - 1;
> - }
> -
> - if (ParaOdIndex == Argc -1) {
> + if (ParaOdIndex != 0) {
> + if (ParaOdIndex == Argc - 1) {
> MapFsStr = NULL;
> } else if (ParaOdIndex == Argc - 2) {
> MapFsStr = Argv[Argc-1];
> } else {
> - Print (L"CapsuleApp: Cannot specify more than one FS mapping!\n");
> + Print (L"CapsuleApp: Invalid Position for -OD Options\n");
> Status = EFI_INVALID_PARAMETER;
> goto Done;
> }
> - } else if (ParaOdIndex < ParaNrIndex) {
> - if (ParaOdIndex != 0) {
> - CapsuleLastIndex = ParaOdIndex - 1;
> - if (ParaOdIndex == ParaNrIndex - 1) {
> - MapFsStr = NULL;
> - } else if (ParaOdIndex == ParaNrIndex - 2) {
> - MapFsStr = Argv[ParaOdIndex + 1];
> +
> + if (ParaNrIndex != 0) {
> + if (ParaNrIndex + 1 == ParaOdIndex) {
> + CapsuleLastIndex = ParaNrIndex - 1;
> } else {
> - Print (L"CapsuleApp: Cannot specify more than one FS mapping!\n");
> + Print (L"CapsuleApp: Invalid Position for -NR Options\n");
> Status = EFI_INVALID_PARAMETER;
> goto Done;
> }
> } else {
> - CapsuleLastIndex = ParaNrIndex - 1;
> + CapsuleLastIndex = ParaOdIndex - 1;
> }
> } else {
> - CapsuleLastIndex = Argc - 1;
> + if (ParaNrIndex != 0) {
> + if (ParaNrIndex == Argc -1) {
> + CapsuleLastIndex = ParaNrIndex - 1;
> + } else {
> + Print (L"CapsuleApp: Invalid Position for -NR Options\n");
> + Status = EFI_INVALID_PARAMETER;
> + goto Done;
> + }
> + } else {
> + CapsuleLastIndex = Argc - 1;
> + }
> }
>
> CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1;
>
> if (CapsuleFirstIndex > CapsuleLastIndex) {
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
> b/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
> index 0e0c566702..b81c5b7b3a 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
> @@ -810,12 +810,12 @@ DumpCapsuleFromDisk (
> }
>
> //
> // Get file count first
> //
> - Status = FileHandleFindFirstFile (DirHandle, &FileInfo);
> do {
> + Status = FileHandleFindFirstFile (DirHandle, &FileInfo);
> if (EFI_ERROR (Status) || FileInfo == NULL) {
> Print (L"Get File Info Fail. Status = %r\n", Status);
> goto Done;
> }
>
> @@ -844,12 +844,12 @@ DumpCapsuleFromDisk (
> NoFile = FALSE;
>
> //
> // Get all file info
> //
> - Status = FileHandleFindFirstFile (DirHandle, &FileInfo);
> do {
> + Status = FileHandleFindFirstFile (DirHandle, &FileInfo);
> if (EFI_ERROR (Status) || FileInfo == NULL) {
> Print (L"Get File Info Fail. Status = %r\n", Status);
> goto Done;
> }
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c
> b/MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c
> index df43a436f2..a11683d66c 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c
> @@ -21,12 +21,10 @@
> #include <Protocol/Shell.h>
> #include <Guid/FileInfo.h>
> #include <Guid/GlobalVariable.h>
> #include <Guid/Gpt.h>
>
> -#define MAX_CAPSULE_NUM 10
> -
> EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2,
> { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } };
>
> /**
> Get shell protocol.
>
> @@ -744,45 +742,10 @@ SetCapsuleStatusVariable (
> );
>
> return Status;
> }
>
> -/**
> - Check if Capsule On Disk is supported.
> -
> - @retval TRUE Capsule On Disk is supported.
> - @retval FALSE Capsule On Disk is not supported.
> -
> -**/
> -BOOLEAN
> -IsCapsuleOnDiskSupported (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - UINT64 OsIndicationsSupported;
> - UINTN DataSize;
> -
> - DataSize = sizeof(UINT64);
> - Status = gRT->GetVariable (
> - L"OsIndicationsSupported",
> - &gEfiGlobalVariableGuid,
> - NULL,
> - &DataSize,
> - &OsIndicationsSupported
> - );
> - if (EFI_ERROR (Status)) {
> - return FALSE;
> - }
> -
> - if (OsIndicationsSupported &
> EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) {
> - return TRUE;
> - }
> -
> - return FALSE;
> -}
> -
> /**
> Process Capsule On Disk.
>
> @param[in] CapsuleBuffer An array of pointer to capsule images
> @param[in] CapsuleBufferSize An array of UINTN to capsule images size
> @@ -805,20 +768,10 @@ ProcessCapsuleOnDisk (
> {
> EFI_STATUS Status;
> UINT16 BootNext;
> EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
> BOOLEAN UpdateBootNext;
> - CHAR16 *FileName[MAX_CAPSULE_NUM];
> - UINTN Index;
> -
> - //
> - // Check if Capsule On Disk is supported
> - //
> - if (!IsCapsuleOnDiskSupported ()) {
> - Print (L"CapsuleApp: Capsule On Disk is not supported.\n");
> - return EFI_UNSUPPORTED;
> - }
>
> //
> // Get a valid file system from boot path
> //
> Fs = NULL;
> @@ -827,21 +780,14 @@ ProcessCapsuleOnDisk (
> if (EFI_ERROR (Status)) {
> Print (L"CapsuleApp: cannot find a valid file system on boot devies. Status
> = %r\n", Status);
> return Status;
> }
>
> - //
> - // Get file name from file path
> - //
> - for (Index = 0; Index < CapsuleNum; Index ++) {
> - FileName[Index] = GetFileNameFromPath (FilePath[Index]);
> - }
> -
> //
> // Copy capsule image to '\efi\UpdateCapsule\'
> //
> - Status = WriteUpdateFile (CapsuleBuffer, CapsuleBufferSize, FileName,
> CapsuleNum, Fs);
> + Status = WriteUpdateFile (CapsuleBuffer, CapsuleBufferSize, FilePath,
> CapsuleNum, Fs);
> if (EFI_ERROR (Status)) {
> Print (L"CapsuleApp: capsule image could not be copied for update.\n");
> return Status;
> }
>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> index 90b5b5b211..063fefb414 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> @@ -1,10 +1,10 @@
> /** @file
> Master header file for DxeIpl PEIM. All source files in this module should
> include this file for common definitions.
>
> -Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #ifndef __PEI_DXEIPL_H__
> @@ -19,11 +19,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> #include <Ppi/FirmwareVolumeInfo.h>
> #include <Ppi/GuidedSectionExtraction.h>
> #include <Ppi/LoadFile.h>
> #include <Ppi/S3Resume2.h>
> #include <Ppi/RecoveryModule.h>
> -#include <Ppi/CapsuleOnDisk.h>
> #include <Ppi/VectorHandoffInfo.h>
>
> #include <Guid/MemoryTypeInformation.h>
> #include <Guid/MemoryAllocationHob.h>
> #include <Guid/FirmwareFileSystem2.h>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index abc3217b01..62bb3f3077 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -3,11 +3,11 @@
> #
> # This module produces a special PPI named the DXE Initial Program Load
> (IPL)
> # PPI to discover and dispatch the DXE Foundation and components that are
> # needed to run the DXE Foundation.
> #
> -# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> # Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> #
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> ##
> @@ -74,23 +74,21 @@
>
> [LibraryClasses.ARM, LibraryClasses.AARCH64]
> ArmMmuLib
>
> [Ppis]
> - gEfiDxeIplPpiGuid ## PRODUCES
> - gEfiPeiDecompressPpiGuid ## PRODUCES
> - gEfiEndOfPeiSignalPpiGuid ## SOMETIMES_PRODUCES # Not
> produced on S3 boot path
> - gEfiPeiReadOnlyVariable2PpiGuid ## SOMETIMES_CONSUMES
> - gEfiPeiLoadFilePpiGuid ## SOMETIMES_CONSUMES
> - gEfiPeiS3Resume2PpiGuid ## SOMETIMES_CONSUMES #
> Consumed on S3 boot path
> - gEfiPeiRecoveryModulePpiGuid ## SOMETIMES_CONSUMES #
> Consumed on recovery boot path
> + gEfiDxeIplPpiGuid ## PRODUCES
> + gEfiPeiDecompressPpiGuid ## PRODUCES
> + gEfiEndOfPeiSignalPpiGuid ## SOMETIMES_PRODUCES # Not
> produced on S3 boot path
> + gEfiPeiReadOnlyVariable2PpiGuid ## SOMETIMES_CONSUMES
> + gEfiPeiLoadFilePpiGuid ## SOMETIMES_CONSUMES
> + gEfiPeiS3Resume2PpiGuid ## SOMETIMES_CONSUMES # Consumed
> on S3 boot path
> + gEfiPeiRecoveryModulePpiGuid ## SOMETIMES_CONSUMES #
> Consumed on recovery boot path
> ## SOMETIMES_CONSUMES
> ## UNDEFINED # HOB
> gEfiVectorHandoffInfoPpiGuid
> - gEfiPeiMemoryDiscoveredPpiGuid ## SOMETIMES_CONSUMES
> - gEdkiiPeiBootInCapsuleOnDiskModePpiGuid ## SOMETIMES_CONSUMES
> - gEdkiiPeiCapsuleOnDiskPpiGuid ## SOMETIMES_CONSUMES #
> Consumed on firmware update boot path
> + gEfiPeiMemoryDiscoveredPpiGuid ## SOMETIMES_CONSUMES
>
> [Guids]
> ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation"
> ## SOMETIMES_PRODUCES ## HOB
> gEfiMemoryTypeInformationGuid
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> index 859184e0d1..c6e5b83309 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> @@ -1,11 +1,11 @@
> /** @file
> Last PEIM.
> Responsibility of this module is to load the DXE Core from a Firmware
> Volume.
>
> Copyright (c) 2016 HP Development Company, L.P.
> -Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #include "DxeIpl.h"
> @@ -263,13 +263,11 @@ DxeLoadCore (
> UINTN Instance;
> UINT32 AuthenticationState;
> UINTN DataSize;
> EFI_PEI_S3_RESUME2_PPI *S3Resume;
> EFI_PEI_RECOVERY_MODULE_PPI *PeiRecovery;
> - EFI_PEI_CAPSULE_ON_DISK_PPI *PeiCapsuleOnDisk;
> EFI_MEMORY_TYPE_INFORMATION
> MemoryData[EfiMaxMemoryType + 1];
> - VOID *CapsuleOnDiskModePpi;
>
> //
> // if in S3 Resume, restore configure
> //
> BootMode = GetBootModeHob ();
> @@ -330,36 +328,10 @@ DxeLoadCore (
> }
> REPORT_STATUS_CODE (EFI_PROGRESS_CODE,
> (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_START));
> //
> // Now should have a HOB with the DXE core
> //
> - } else if (BootMode == BOOT_ON_FLASH_UPDATE) {
> - //
> - // If Capsule On Disk mode, call storage stack to read Capsule Relocation
> file
> - // IoMmmu is highly recommmended to enable before reading
> - //
> - Status = PeiServicesLocatePpi (
> - &gEdkiiPeiBootInCapsuleOnDiskModePpiGuid,
> - 0,
> - NULL,
> - &CapsuleOnDiskModePpi
> - );
> - if (!EFI_ERROR(Status)) {
> - Status = PeiServicesLocatePpi (
> - &gEdkiiPeiCapsuleOnDiskPpiGuid,
> - 0,
> - NULL,
> - (VOID **) &PeiCapsuleOnDisk
> - );
> -
> - //
> - // Whether failed, still goes to Firmware Update boot path. BDS will clear
> corresponding indicator and reboot later on
> - //
> - if (!EFI_ERROR (Status)) {
> - Status = PeiCapsuleOnDisk->LoadCapsuleOnDisk (PeiServices,
> PeiCapsuleOnDisk);
> - }
> - }
> }
>
> if (GetFirstGuidHob ((CONST EFI_GUID
> *)&gEfiMemoryTypeInformationGuid) == NULL) {
> //
> // Don't build GuidHob if GuidHob has been installed.
> diff --git a/MdeModulePkg/Include/Library/CapsuleLib.h
> b/MdeModulePkg/Include/Library/CapsuleLib.h
> index 7a5414c80f..1fc2fba3a2 100644
> --- a/MdeModulePkg/Include/Library/CapsuleLib.h
> +++ b/MdeModulePkg/Include/Library/CapsuleLib.h
> @@ -1,22 +1,17 @@
> /** @file
>
> This library class defines a set of interfaces for how to process capsule
> image updates.
>
> -Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #ifndef __CAPSULE_LIB_H__
> #define __CAPSULE_LIB_H__
>
> -//
> -// BOOLEAN Variable to indicate whether system is in the capsule on disk
> state.
> -//
> -#define COD_RELOCATION_INFO_VAR_NAME L"CodRelocationInfo"
> -
> /**
> The firmware checks whether the capsule image is supported
> by the CapsuleGuid in CapsuleHeader or if there is other specific
> information in
> the capsule image.
>
> @@ -84,77 +79,6 @@ EFI_STATUS
> EFIAPI
> ProcessCapsules (
> VOID
> );
>
> -/**
> - This routine is called to check if CapsuleOnDisk flag in OsIndications Variable
> - is enabled.
> -
> - @retval TRUE Flag is enabled
> - @retval FALSE Flag is not enabled
> -
> -**/
> -BOOLEAN
> -EFIAPI
> -CoDCheckCapsuleOnDiskFlag(
> - VOID
> - );
> -
> -/**
> - This routine is called to clear CapsuleOnDisk flags including OsIndications
> and BootNext variable
> -
> - @retval EFI_SUCCESS All Capsule On Disk flags are cleared
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDClearCapsuleOnDiskFlag(
> - VOID
> - );
> -
> -/**
> - Relocate Capsule on Disk from EFI system partition.
> -
> - Two solution to deliver Capsule On Disk:
> - Solution A: If PcdCapsuleInRamSupport is enabled, relocate Capsule On
> Disk to memory and call UpdateCapsule().
> - Solution B: If PcdCapsuleInRamSupport is disabled, relocate Capsule On
> Disk to a platform-specific NV storage
> - device with BlockIo protocol.
> -
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - Side Effects:
> - Capsule Delivery Supported Flag in OsIndication variable and BootNext
> variable will be cleared.
> - Solution B: Content corruption. Block IO write directly touches low level
> write. Orignal partitions, file
> - systems of the relocation device will be corrupted.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated. Input 0 means no
> retry.
> -
> - @retval EFI_SUCCESS Capsule on Disk images are successfully relocated.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDRelocateCapsule(
> - UINTN MaxRetry
> - );
> -
> -/**
> - Remove the temp file from the root of EFI System Partition.
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated. Input 0 means no
> retry.
> -
> - @retval EFI_SUCCESS Remove the temp file successfully.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDRemoveTempFile (
> - UINTN MaxRetry
> - );
> -
> #endif
> diff --git a/MdeModulePkg/Include/Ppi/CapsuleOnDisk.h
> b/MdeModulePkg/Include/Ppi/CapsuleOnDisk.h
> deleted file mode 100644
> index c83e68fcd0..0000000000
> --- a/MdeModulePkg/Include/Ppi/CapsuleOnDisk.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/** @file
> - This file declares Capsule On Disk PPI. This PPI is used to find and load the
> - capsule on files that are relocated into a temp file under rootdir.
> -
> - Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> - SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef __PEI_CAPSULE_ON_DISK_PPI_H__
> -#define __PEI_CAPSULE_ON_DISK_PPI_H__
> -
> -#define EFI_PEI_CAPSULE_ON_DISK_PPI_GUID \
> - { \
> - 0x71a9ea61, 0x5a35, 0x4a5d, {0xac, 0xef, 0x9c, 0xf8, 0x6d, 0x6d, 0x67,
> 0xe0 } \
> - }
> -
> -typedef struct _EFI_PEI_CAPSULE_ON_DISK_PPI
> EFI_PEI_CAPSULE_ON_DISK_PPI;
> -
> -/**
> - Loads a DXE capsule from some media into memory and updates the HOB
> table
> - with the DXE firmware volume information.
> -
> - @param PeiServices General-purpose services that are available to every
> PEIM.
> - @param This Indicates the EFI_PEI_RECOVERY_MODULE_PPI instance.
> -
> - @retval EFI_SUCCESS The capsule was loaded correctly.
> - @retval EFI_DEVICE_ERROR A device error occurred.
> - @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found.
> -
> -**/
> -typedef
> -EFI_STATUS
> -(EFIAPI *EFI_PEI_LOAD_CAPSULE_ON_DISK)(
> - IN EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PEI_CAPSULE_ON_DISK_PPI *This
> - );
> -
> -///
> -/// Finds and loads the recovery files.
> -///
> -struct _EFI_PEI_CAPSULE_ON_DISK_PPI {
> - EFI_PEI_LOAD_CAPSULE_ON_DISK LoadCapsuleOnDisk; ///< Loads a DXE
> binary capsule into memory.
> -};
> -
> -extern EFI_GUID gEdkiiPeiCapsuleOnDiskPpiGuid;
> -
> -#define EFI_PEI_BOOT_IN_CAPSULE_ON_DISK_MODE_PPI \
> - { \
> - 0xb08a11e4, 0xe2b7, 0x4b75, { 0xb5, 0x15, 0xaf, 0x61, 0x6, 0x68, 0xbf,
> 0xd1 } \
> - }
> -
> -extern EFI_GUID gEfiPeiBootInCapsuleOnDiskModePpiGuid;
> -
> -#endif
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
> deleted file mode 100644
> index bb34e6d37a..0000000000
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.c
> +++ /dev/null
> @@ -1,1966 +0,0 @@
> -/** @file
> - The implementation supports Capusle on Disk.
> -
> - Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> - SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#include "CapsuleOnDisk.h"
> -
> -/**
> - Return if this capsule is a capsule name capsule, based upon
> CapsuleHeader.
> -
> - @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER
> -
> - @retval TRUE It is a capsule name capsule.
> - @retval FALSE It is not a capsule name capsule.
> -**/
> -BOOLEAN
> -IsCapsuleNameCapsule (
> - IN EFI_CAPSULE_HEADER *CapsuleHeader
> - );
> -
> -/**
> - Check the integrity of the capsule name capsule.
> - If the capsule is vaild, return the physical address of each capsule name
> string.
> -
> - @param[in] CapsuleHeader Pointer to the capsule header of a capsule
> name capsule.
> - @param[out] CapsuleNameNum Number of capsule name.
> -
> - @retval NULL Capsule name capsule is not valid.
> - @retval CapsuleNameBuf Array of capsule name physical address.
> -
> -**/
> -EFI_PHYSICAL_ADDRESS *
> -ValidateCapsuleNameCapsuleIntegrity (
> - IN EFI_CAPSULE_HEADER *CapsuleHeader,
> - OUT UINTN *CapsuleNameNum
> - )
> -{
> - UINT8 *CapsuleNamePtr;
> - UINT8 *CapsuleNameBufStart;
> - UINT8 *CapsuleNameBufEnd;
> - UINTN Index;
> - UINTN StringSize;
> - EFI_PHYSICAL_ADDRESS *CapsuleNameBuf;
> -
> - if (!IsCapsuleNameCapsule (CapsuleHeader)) {
> - return NULL;
> - }
> -
> - //
> - // Total string size must be even.
> - //
> - if (((CapsuleHeader->CapsuleImageSize - CapsuleHeader->HeaderSize) &
> BIT0) != 0) {
> - return NULL;
> - }
> -
> - *CapsuleNameNum = 0;
> - Index = 0;
> - CapsuleNameBufStart = (UINT8 *) CapsuleHeader + CapsuleHeader-
> >HeaderSize;
> -
> - //
> - // If strings are not aligned on a 16-bit boundary, reallocate memory for it.
> - //
> - if (((UINTN) CapsuleNameBufStart & BIT0) != 0) {
> - CapsuleNameBufStart = AllocateCopyPool (CapsuleHeader-
> >CapsuleImageSize - CapsuleHeader->HeaderSize, CapsuleNameBufStart);
> - }
> -
> - CapsuleNameBufEnd = CapsuleNameBufStart + CapsuleHeader-
> >CapsuleImageSize - CapsuleHeader->HeaderSize;
> -
> - CapsuleNamePtr = CapsuleNameBufStart;
> - while (CapsuleNamePtr < CapsuleNameBufEnd) {
> - StringSize= StrnSizeS ((CHAR16 *) CapsuleNamePtr, (CapsuleNameBufEnd
> - CapsuleNamePtr)/sizeof(CHAR16));
> - CapsuleNamePtr += StringSize;
> - (*CapsuleNameNum) ++;
> - }
> -
> - //
> - // Integrity check.
> - //
> - if (CapsuleNamePtr != CapsuleNameBufEnd) {
> - if (CapsuleNameBufStart != (UINT8 *)CapsuleHeader + CapsuleHeader-
> >HeaderSize) {
> - FreePool (CapsuleNameBufStart);
> - }
> - return NULL;
> - }
> -
> - CapsuleNameBuf = AllocatePool (*CapsuleNameNum * sizeof
> (EFI_PHYSICAL_ADDRESS));
> - if (CapsuleNameBuf == NULL) {
> - if (CapsuleNameBufStart != (UINT8 *)CapsuleHeader + CapsuleHeader-
> >HeaderSize) {
> - FreePool (CapsuleNameBufStart);
> - }
> - return NULL;
> - }
> -
> - CapsuleNamePtr = CapsuleNameBufStart;
> - while (CapsuleNamePtr < CapsuleNameBufEnd) {
> - StringSize= StrnSizeS ((CHAR16 *) CapsuleNamePtr, (CapsuleNameBufEnd
> - CapsuleNamePtr)/sizeof(CHAR16));
> - CapsuleNameBuf[Index] = (EFI_PHYSICAL_ADDRESS)(UINTN)
> CapsuleNamePtr;
> - CapsuleNamePtr += StringSize;
> - Index ++;
> - }
> -
> - return CapsuleNameBuf;
> -}
> -
> -/**
> - This routine is called to upper case given unicode string.
> -
> - @param[in] Str String to upper case
> -
> - @retval upper cased string after process
> -
> -**/
> -static
> -CHAR16 *
> -UpperCaseString (
> - IN CHAR16 *Str
> - )
> -{
> - CHAR16 *Cptr;
> -
> - for (Cptr = Str; *Cptr; Cptr++) {
> - if (L'a' <= *Cptr && *Cptr <= L'z') {
> - *Cptr = *Cptr - L'a' + L'A';
> - }
> - }
> -
> - return Str;
> -}
> -
> -/**
> - This routine is used to return substring before period '.' or '\0'
> - Caller should respsonsible of substr space allocation & free
> -
> - @param[in] Str String to check
> - @param[out] SubStr First part of string before period or '\0'
> - @param[out] SubStrLen Length of first part of string
> -
> -**/
> -static
> -VOID
> -GetSubStringBeforePeriod (
> - IN CHAR16 *Str,
> - OUT CHAR16 *SubStr,
> - OUT UINTN *SubStrLen
> - )
> -{
> - UINTN Index;
> - for (Index = 0; Str[Index] != L'.' && Str[Index] != L'\0'; Index++) {
> - SubStr[Index] = Str[Index];
> - }
> -
> - SubStr[Index] = L'\0';
> - *SubStrLen = Index;
> -}
> -
> -/**
> - This routine pad the string in tail with input character.
> -
> - @param[in] StrBuf Str buffer to be padded, should be enough room
> for
> - @param[in] PadLen Expected padding length
> - @param[in] Character Character used to pad
> -
> -**/
> -static
> -VOID
> -PadStrInTail (
> - IN CHAR16 *StrBuf,
> - IN UINTN PadLen,
> - IN CHAR16 Character
> - )
> -{
> - UINTN Index;
> -
> - for (Index = 0; StrBuf[Index] != L'\0'; Index++);
> -
> - while(PadLen != 0) {
> - StrBuf[Index] = Character;
> - Index++;
> - PadLen--;
> - }
> -
> - StrBuf[Index] = L'\0';
> -}
> -
> -/**
> - This routine find the offset of the last period '.' of string. If No period exists
> - function FileNameExtension is set to L'\0'
> -
> - @param[in] FileName File name to split between last period
> - @param[out] FileNameFirst First FileName before last period
> - @param[out] FileNameExtension FileName after last period
> -
> -**/
> -static
> -VOID
> -SplitFileNameExtension (
> - IN CHAR16 *FileName,
> - OUT CHAR16 *FileNameFirst,
> - OUT CHAR16 *FileNameExtension
> - )
> -{
> - UINTN Index;
> - UINTN StringLen;
> -
> - StringLen = StrnLenS(FileName, MAX_FILE_NAME_SIZE);
> - for (Index = StringLen; Index > 0 && FileName[Index] != L'.'; Index--);
> -
> - //
> - // No period exists. No FileName Extension
> - //
> - if (Index == 0 && FileName[Index] != L'.') {
> - FileNameExtension[0] = L'\0';
> - Index = StringLen;
> - } else {
> - StrCpyS(FileNameExtension, MAX_FILE_NAME_SIZE,
> &FileName[Index+1]);
> - }
> -
> - //
> - // Copy First file name
> - //
> - StrnCpyS(FileNameFirst, MAX_FILE_NAME_SIZE, FileName, Index);
> - FileNameFirst[Index] = L'\0';
> -}
> -
> -/**
> - This routine is called to get all boot options in the order determnined by:
> - 1. "OptionBuf"
> - 2. "BootOrder"
> -
> - @param[out] OptionBuf BootList buffer to all boot options returned
> - @param[out] OptionCount BootList count of all boot options returned
> -
> - @retval EFI_SUCCESS There is no error when processing capsule
> -
> -**/
> -EFI_STATUS
> -GetBootOptionInOrder(
> - OUT EFI_BOOT_MANAGER_LOAD_OPTION **OptionBuf,
> - OUT UINTN *OptionCount
> - )
> -{
> - EFI_STATUS Status;
> - UINTN DataSize;
> - UINT16 BootNext;
> - CHAR16 BootOptionName[20];
> - EFI_BOOT_MANAGER_LOAD_OPTION *BootOrderOptionBuf;
> - UINTN BootOrderCount;
> - EFI_BOOT_MANAGER_LOAD_OPTION BootNextOptionEntry;
> - UINTN BootNextCount;
> - EFI_BOOT_MANAGER_LOAD_OPTION *TempBuf;
> -
> - BootOrderOptionBuf = NULL;
> - TempBuf = NULL;
> - BootNextCount = 0;
> - BootOrderCount = 0;
> - *OptionBuf = NULL;
> - *OptionCount = 0;
> -
> - //
> - // First Get BootOption from "BootNext"
> - //
> - DataSize = sizeof(BootNext);
> - Status = gRT->GetVariable (
> - EFI_BOOT_NEXT_VARIABLE_NAME,
> - &gEfiGlobalVariableGuid,
> - NULL,
> - &DataSize,
> - (VOID *)&BootNext
> - );
> - //
> - // BootNext variable is a single UINT16
> - //
> - if (!EFI_ERROR(Status) && DataSize == sizeof(UINT16)) {
> - //
> - // Add the boot next boot option
> - //
> - UnicodeSPrint (BootOptionName, sizeof (BootOptionName), L"Boot%04x",
> BootNext);
> - ZeroMem(&BootNextOptionEntry,
> sizeof(EFI_BOOT_MANAGER_LOAD_OPTION));
> - Status = EfiBootManagerVariableToLoadOption (BootOptionName,
> &BootNextOptionEntry);
> -
> - if (!EFI_ERROR(Status)) {
> - BootNextCount = 1;
> - }
> - }
> -
> - //
> - // Second get BootOption from "BootOrder"
> - //
> - BootOrderOptionBuf = EfiBootManagerGetLoadOptions
> (&BootOrderCount, LoadOptionTypeBoot);
> - if (BootNextCount == 0 && BootOrderCount == 0) {
> - return EFI_NOT_FOUND;
> - }
> -
> - //
> - // At least one BootOption is found
> - //
> - TempBuf = AllocatePool(sizeof(EFI_BOOT_MANAGER_LOAD_OPTION) *
> (BootNextCount + BootOrderCount));
> - if (TempBuf != NULL) {
> - if (BootNextCount == 1) {
> - CopyMem(TempBuf, &BootNextOptionEntry,
> sizeof(EFI_BOOT_MANAGER_LOAD_OPTION));
> - }
> -
> - if (BootOrderCount > 0) {
> - CopyMem(TempBuf + BootNextCount, BootOrderOptionBuf,
> sizeof(EFI_BOOT_MANAGER_LOAD_OPTION) * BootOrderCount);
> - }
> -
> - *OptionBuf = TempBuf;
> - *OptionCount = BootNextCount + BootOrderCount;
> - Status = EFI_SUCCESS;
> - } else {
> - Status = EFI_OUT_OF_RESOURCES;
> - }
> -
> - FreePool(BootOrderOptionBuf);
> -
> - return Status;
> -}
> -
> -/**
> - This routine is called to get boot option by OptionNumber.
> -
> - @param[in] Number The OptionNumber of boot option
> - @param[out] OptionBuf BootList buffer to all boot options returned
> -
> - @retval EFI_SUCCESS There is no error when getting boot option
> -
> -**/
> -EFI_STATUS
> -GetBootOptionByNumber(
> - IN UINT16 Number,
> - OUT EFI_BOOT_MANAGER_LOAD_OPTION **OptionBuf
> - )
> -{
> - EFI_STATUS Status;
> - CHAR16 BootOptionName[20];
> - EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
> -
> - UnicodeSPrint (BootOptionName, sizeof (BootOptionName), L"Boot%04x",
> Number);
> - ZeroMem (&BootOption, sizeof (EFI_BOOT_MANAGER_LOAD_OPTION));
> - Status = EfiBootManagerVariableToLoadOption (BootOptionName,
> &BootOption);
> -
> - if (!EFI_ERROR (Status)) {
> - *OptionBuf = AllocatePool (sizeof
> (EFI_BOOT_MANAGER_LOAD_OPTION));
> - CopyMem (*OptionBuf, &BootOption, sizeof
> (EFI_BOOT_MANAGER_LOAD_OPTION));
> - return EFI_SUCCESS;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Get Active EFI System Partition within GPT based on device path.
> -
> - @param[in] DevicePath Device path to find a active EFI System Partition
> - @param[out] FsHandle BootList points to all boot options returned
> -
> - @retval EFI_SUCCESS Active EFI System Partition is succesfully found
> - @retval EFI_NOT_FOUND No Active EFI System Partition is found
> -
> -**/
> -EFI_STATUS
> -GetEfiSysPartitionFromDevPath(
> - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
> - OUT EFI_HANDLE *FsHandle
> - )
> -{
> - EFI_STATUS Status;
> - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
> - HARDDRIVE_DEVICE_PATH *Hd;
> - EFI_HANDLE Handle;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
> -
> - //
> - // Check if the device path contains GPT node
> - //
> - TempDevicePath = DevicePath;
> - while (!IsDevicePathEnd (TempDevicePath)) {
> - if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
> - (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {
> - Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
> - if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
> - break;
> - }
> - }
> - TempDevicePath = NextDevicePathNode (TempDevicePath);
> - }
> -
> - if (!IsDevicePathEnd (TempDevicePath)) {
> - //
> - // Search for EFI system partition protocol on full device path in Boot
> Option
> - //
> - Status = gBS->LocateDevicePath (&gEfiPartTypeSystemPartGuid,
> &DevicePath, &Handle);
> -
> - //
> - // Search for simple file system on this handler
> - //
> - if (!EFI_ERROR(Status)) {
> - Status = gBS->HandleProtocol(Handle,
> &gEfiSimpleFileSystemProtocolGuid, (VOID **)&Fs);
> - if (!EFI_ERROR(Status)) {
> - *FsHandle = Handle;
> - return EFI_SUCCESS;
> - }
> - }
> - }
> -
> - return EFI_NOT_FOUND;
> -}
> -
> -/**
> - This routine is called to get Simple File System protocol on the first EFI
> system partition found in
> - active boot option. The boot option list is detemined in order by
> - 1. "BootNext"
> - 2. "BootOrder"
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - device like USB can get enumerated.
> - @param[in, out] LoadOptionNumber On input, specify the boot option to
> get EFI system partition.
> - On output, return the OptionNumber of the boot option
> where EFI
> - system partition is got from.
> - @param[out] FsFsHandle Simple File System Protocol found on first
> active EFI system partition
> -
> - @retval EFI_SUCCESS Simple File System protocol found for EFI system
> partition
> - @retval EFI_NOT_FOUND No Simple File System protocol found for EFI
> system partition
> -
> -**/
> -EFI_STATUS
> -GetEfiSysPartitionFromActiveBootOption(
> - IN UINTN MaxRetry,
> - IN OUT UINT16 **LoadOptionNumber,
> - OUT EFI_HANDLE *FsHandle
> - )
> -{
> - EFI_STATUS Status;
> - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptionBuf;
> - UINTN BootOptionNum;
> - UINTN Index;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> - EFI_DEVICE_PATH_PROTOCOL *CurFullPath;
> - EFI_DEVICE_PATH_PROTOCOL *PreFullPath;
> -
> - *FsHandle = NULL;
> -
> - if (*LoadOptionNumber != NULL) {
> - BootOptionNum = 1;
> - Status = GetBootOptionByNumber(**LoadOptionNumber,
> &BootOptionBuf);
> - if (EFI_ERROR(Status)) {
> - DEBUG ((DEBUG_ERROR, "GetBootOptionByIndex Failed %x! No
> BootOption available for connection\n", Status));
> - return Status;
> - }
> - } else {
> - Status = GetBootOptionInOrder(&BootOptionBuf, &BootOptionNum);
> - if (EFI_ERROR(Status)) {
> - DEBUG ((DEBUG_ERROR, "GetBootOptionInOrder Failed %x! No
> BootOption available for connection\n", Status));
> - return Status;
> - }
> - }
> -
> - //
> - // Search BootOptionList to check if it is an active boot option with EFI
> system partition
> - // 1. Connect device path
> - // 2. expend short/plug in devicepath
> - // 3. LoadImage
> - //
> - for (Index = 0; Index < BootOptionNum; Index++) {
> - //
> - // Get the boot option from the link list
> - //
> - DevicePath = BootOptionBuf[Index].FilePath;
> -
> - //
> - // Skip inactive or legacy boot options
> - //
> - if ((BootOptionBuf[Index].Attributes & LOAD_OPTION_ACTIVE) == 0 ||
> - DevicePathType (DevicePath) == BBS_DEVICE_PATH) {
> - continue;
> - }
> -
> - DEBUG_CODE (
> - CHAR16 *DevicePathStr;
> -
> - DevicePathStr = ConvertDevicePathToText(DevicePath, TRUE, TRUE);
> - if (DevicePathStr != NULL){
> - DEBUG((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));
> - FreePool(DevicePathStr);
> - } else {
> - DEBUG((DEBUG_INFO, "DevicePathToStr failed\n"));
> - }
> - );
> -
> - CurFullPath = NULL;
> - //
> - // Try every full device Path generated from bootoption
> - //
> - do {
> - PreFullPath = CurFullPath;
> - CurFullPath =
> EfiBootManagerGetNextLoadOptionDevicePath(DevicePath, CurFullPath);
> -
> - if (PreFullPath != NULL) {
> - FreePool (PreFullPath);
> - }
> -
> - if (CurFullPath == NULL) {
> - //
> - // No Active EFI system partition is found in BootOption device path
> - //
> - Status = EFI_NOT_FOUND;
> - break;
> - }
> -
> - DEBUG_CODE (
> - CHAR16 *DevicePathStr1;
> -
> - DevicePathStr1 = ConvertDevicePathToText(CurFullPath, TRUE, TRUE);
> - if (DevicePathStr1 != NULL){
> - DEBUG((DEBUG_INFO, "Full device path %s\n", DevicePathStr1));
> - FreePool(DevicePathStr1);
> - }
> - );
> -
> - //
> - // Make sure the boot option device path connected.
> - // Only handle first device in boot option. Other optional device paths are
> described as OSV specific
> - // FullDevice could contain extra directory & file info. So don't check
> connection status here.
> - //
> - EfiBootManagerConnectDevicePath (CurFullPath, NULL);
> - Status = GetEfiSysPartitionFromDevPath(CurFullPath, FsHandle);
> -
> - //
> - // Some relocation device like USB need more time to get enumerated
> - //
> - while (EFI_ERROR(Status) && MaxRetry > 0) {
> - EfiBootManagerConnectDevicePath(CurFullPath, NULL);
> -
> - //
> - // Search for EFI system partition protocol on full device path in Boot
> Option
> - //
> - Status = GetEfiSysPartitionFromDevPath(CurFullPath, FsHandle);
> - if (!EFI_ERROR(Status)) {
> - break;
> - }
> - DEBUG((DEBUG_ERROR, "GetEfiSysPartitionFromDevPath Loop %x\n",
> Status));
> - //
> - // Stall 100ms if connection failed to ensure USB stack is ready
> - //
> - gBS->Stall(100000);
> - MaxRetry --;
> - }
> - } while(EFI_ERROR(Status));
> -
> - //
> - // Find a qualified Simple File System
> - //
> - if (!EFI_ERROR(Status)) {
> - break;
> - }
> -
> - }
> -
> - //
> - // Return the OptionNumber of the boot option where EFI system partition
> is got from
> - //
> - if (*LoadOptionNumber == NULL) {
> - *LoadOptionNumber = AllocateCopyPool (sizeof(UINT16), (UINT16 *)
> &BootOptionBuf[Index].OptionNumber);
> - }
> -
> - //
> - // No qualified EFI system partition found
> - //
> - if (*FsHandle == NULL) {
> - Status = EFI_NOT_FOUND;
> - }
> -
> - DEBUG_CODE (
> - CHAR16 *DevicePathStr2;
> - if (*FsHandle != NULL) {
> - DevicePathStr2 = ConvertDevicePathToText(CurFullPath, TRUE, TRUE);
> - if (DevicePathStr2 != NULL){
> - DEBUG((DEBUG_INFO, "Found Active EFI System Partion on %s\n",
> DevicePathStr2));
> - FreePool(DevicePathStr2);
> - }
> - } else {
> - DEBUG((DEBUG_INFO, "Failed to found Active EFI System Partion\n"));
> - }
> - );
> -
> - if (CurFullPath != NULL) {
> - FreePool(CurFullPath);
> - }
> -
> - //
> - // Free BootOption Buffer
> - //
> - for (Index = 0; Index < BootOptionNum; Index++) {
> - if (BootOptionBuf[Index].Description != NULL) {
> - FreePool(BootOptionBuf[Index].Description);
> - }
> -
> - if (BootOptionBuf[Index].FilePath != NULL) {
> - FreePool(BootOptionBuf[Index].FilePath);
> - }
> -
> - if (BootOptionBuf[Index].OptionalData != NULL) {
> - FreePool(BootOptionBuf[Index].OptionalData);
> - }
> - }
> -
> - FreePool(BootOptionBuf);
> -
> - return Status;
> -}
> -
> -
> -/**
> - This routine is called to get all file infos with in a given dir & with given file
> attribute, the file info is listed in
> - alphabetical order described in UEFI spec.
> -
> - @param[in] Dir Directory file handler
> - @param[in] FileAttr Attribute of file to be red from directory
> - @param[out] FileInfoList File images info list red from directory
> - @param[out] FileNum File images number red from directory
> -
> - @retval EFI_SUCCESS File FileInfo list in the given
> -
> -**/
> -EFI_STATUS
> -GetFileInfoListInAlphabetFromDir(
> - IN EFI_FILE_HANDLE Dir,
> - IN UINT64 FileAttr,
> - OUT LIST_ENTRY *FileInfoList,
> - OUT UINTN *FileNum
> - )
> -{
> - EFI_STATUS Status;
> - FILE_INFO_ENTRY *NewFileInfoEntry;
> - FILE_INFO_ENTRY *TempFileInfoEntry;
> - EFI_FILE_INFO *FileInfo;
> - CHAR16 *NewFileName;
> - CHAR16 *ListedFileName;
> - CHAR16 *NewFileNameExtension;
> - CHAR16 *ListedFileNameExtension;
> - CHAR16 *TempNewSubStr;
> - CHAR16 *TempListedSubStr;
> - LIST_ENTRY *Link;
> - BOOLEAN NoFile;
> - UINTN FileCount;
> - UINTN IndexNew;
> - UINTN IndexListed;
> - UINTN NewSubStrLen;
> - UINTN ListedSubStrLen;
> - INTN SubStrCmpResult;
> -
> - Status = EFI_SUCCESS;
> - NewFileName = NULL;
> - ListedFileName = NULL;
> - NewFileNameExtension = NULL;
> - ListedFileNameExtension = NULL;
> - TempNewSubStr = NULL;
> - TempListedSubStr = NULL;
> - NoFile = FALSE;
> - FileCount = 0;
> -
> - InitializeListHead(FileInfoList);
> -
> - TempNewSubStr = (CHAR16 *)
> AllocateZeroPool(MAX_FILE_NAME_SIZE);
> - TempListedSubStr = (CHAR16 *)
> AllocateZeroPool(MAX_FILE_NAME_SIZE);
> -
> - if (TempNewSubStr == NULL || TempListedSubStr == NULL ) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> -
> - for ( Status = FileHandleFindFirstFile(Dir, &FileInfo)
> - ; !EFI_ERROR(Status) && !NoFile
> - ; Status = FileHandleFindNextFile(Dir, FileInfo, &NoFile)
> - ){
> -
> - //
> - // Skip file with mismatching File attribute
> - //
> - if ((FileInfo->Attribute & (FileAttr)) == 0) {
> - continue;
> - }
> -
> - NewFileInfoEntry = NULL;
> - NewFileInfoEntry =
> (FILE_INFO_ENTRY*)AllocateZeroPool(sizeof(FILE_INFO_ENTRY));
> - if (NewFileInfoEntry == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> - NewFileInfoEntry->Signature = FILE_INFO_SIGNATURE;
> - NewFileInfoEntry->FileInfo = AllocateCopyPool((UINTN) FileInfo->Size,
> FileInfo);
> - if (NewFileInfoEntry->FileInfo == NULL) {
> - FreePool(NewFileInfoEntry);
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> -
> - NewFileInfoEntry->FileNameFirstPart = (CHAR16 *)
> AllocateZeroPool(MAX_FILE_NAME_SIZE);
> - if (NewFileInfoEntry->FileNameFirstPart == NULL) {
> - FreePool(NewFileInfoEntry->FileInfo);
> - FreePool(NewFileInfoEntry);
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> - NewFileInfoEntry->FileNameSecondPart = (CHAR16 *)
> AllocateZeroPool(MAX_FILE_NAME_SIZE);
> - if (NewFileInfoEntry->FileNameSecondPart == NULL) {
> - FreePool(NewFileInfoEntry->FileInfo);
> - FreePool(NewFileInfoEntry->FileNameFirstPart);
> - FreePool(NewFileInfoEntry);
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> -
> - //
> - // Splitter the whole New file name into 2 parts between the last period
> L'.' into NewFileName NewFileExtension
> - // If no period in the whole file name. NewFileExtension is set to L'\0'
> - //
> - NewFileName = NewFileInfoEntry->FileNameFirstPart;
> - NewFileNameExtension = NewFileInfoEntry->FileNameSecondPart;
> - SplitFileNameExtension(FileInfo->FileName, NewFileName,
> NewFileNameExtension);
> - UpperCaseString(NewFileName);
> - UpperCaseString(NewFileNameExtension);
> -
> - //
> - // Insert capsule file in alphabetical ordered list
> - //
> - for (Link = FileInfoList->ForwardLink; Link != FileInfoList; Link = Link-
> >ForwardLink) {
> - //
> - // Get the FileInfo from the link list
> - //
> - TempFileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link,
> FILE_INFO_SIGNATURE);
> - ListedFileName = TempFileInfoEntry->FileNameFirstPart;
> - ListedFileNameExtension = TempFileInfoEntry->FileNameSecondPart;
> -
> - //
> - // Follow rule in UEFI spec 8.5.5 to compare file name
> - //
> - IndexListed = 0;
> - IndexNew = 0;
> - while (TRUE){
> - //
> - // First compare each substrings in NewFileName & ListedFileName
> between periods
> - //
> - GetSubStringBeforePeriod(&NewFileName[IndexNew],
> TempNewSubStr, &NewSubStrLen);
> - GetSubStringBeforePeriod(&ListedFileName[IndexListed],
> TempListedSubStr, &ListedSubStrLen);
> - if (NewSubStrLen > ListedSubStrLen) {
> - //
> - // Substr in NewFileName is longer. Pad tail with SPACE
> - //
> - PadStrInTail(TempListedSubStr, NewSubStrLen - ListedSubStrLen, L' ');
> - } else if (NewSubStrLen < ListedSubStrLen){
> - //
> - // Substr in ListedFileName is longer. Pad tail with SPACE
> - //
> - PadStrInTail(TempNewSubStr, ListedSubStrLen - NewSubStrLen, L' ');
> - }
> -
> - SubStrCmpResult = StrnCmp(TempNewSubStr, TempListedSubStr,
> MAX_FILE_NAME_LEN);
> - if (SubStrCmpResult != 0) {
> - break;
> - }
> -
> - //
> - // Move to skip this substring
> - //
> - IndexNew += NewSubStrLen;
> - IndexListed += ListedSubStrLen;
> - //
> - // Reach File First Name end
> - //
> - if (NewFileName[IndexNew] == L'\0' || ListedFileName[IndexListed] ==
> L'\0') {
> - break;
> - }
> -
> - //
> - // Skip the period L'.'
> - //
> - IndexNew++;
> - IndexListed++;
> - }
> -
> - if (SubStrCmpResult < 0) {
> - //
> - // NewFileName is smaller. Find the right place to insert New file
> - //
> - break;
> - } else if (SubStrCmpResult == 0) {
> - //
> - // 2 cases whole NewFileName is smaller than ListedFileName
> - // 1. if NewFileName == ListedFileName. Continue to compare
> FileNameExtension
> - // 2. if NewFileName is shorter than ListedFileName
> - //
> - if (NewFileName[IndexNew] == L'\0') {
> - if (ListedFileName[IndexListed] != L'\0' ||
> (StrnCmp(NewFileNameExtension, ListedFileNameExtension,
> MAX_FILE_NAME_LEN) < 0)) {
> - break;
> - }
> - }
> - }
> -
> - //
> - // Other case, ListedFileName is smaller. Continue to compare the next
> file in the list
> - //
> - }
> -
> - //
> - // If Find an entry in the list whose name is bigger than new FileInfo in
> alphabet order
> - // Insert it before this entry
> - // else
> - // Insert at the tail of this list (Link = FileInfoList)
> - //
> - InsertTailList(Link, &NewFileInfoEntry->Link);
> -
> - FileCount++;
> - }
> -
> - *FileNum = FileCount;
> -
> -EXIT:
> -
> - if (TempNewSubStr != NULL) {
> - FreePool(TempNewSubStr);
> - }
> -
> - if (TempListedSubStr != NULL) {
> - FreePool(TempListedSubStr);
> - }
> -
> - if (EFI_ERROR(Status)) {
> - while(!IsListEmpty(FileInfoList)) {
> - Link = FileInfoList->ForwardLink;
> - RemoveEntryList(Link);
> -
> - TempFileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link,
> FILE_INFO_SIGNATURE);
> -
> - FreePool(TempFileInfoEntry->FileInfo);
> - FreePool(TempFileInfoEntry->FileNameFirstPart);
> - FreePool(TempFileInfoEntry->FileNameSecondPart);
> - FreePool(TempFileInfoEntry);
> - }
> - *FileNum = 0;
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - This routine is called to get all qualified image from file from an given
> directory
> - in alphabetic order. All the file image is copied to allocated boottime
> memory.
> - Caller should free these memory
> -
> - @param[in] Dir Directory file handler
> - @param[in] FileAttr Attribute of file to be red from directory
> - @param[out] FilePtr File images Info buffer red from directory
> - @param[out] FileNum File images number red from directory
> -
> - @retval EFI_SUCCESS Succeed to get all capsules in alphabetic order.
> -
> -**/
> -EFI_STATUS
> -GetFileImageInAlphabetFromDir(
> - IN EFI_FILE_HANDLE Dir,
> - IN UINT64 FileAttr,
> - OUT IMAGE_INFO **FilePtr,
> - OUT UINTN *FileNum
> - )
> -{
> - EFI_STATUS Status;
> - LIST_ENTRY *Link;
> - EFI_FILE_HANDLE FileHandle;
> - FILE_INFO_ENTRY *FileInfoEntry;
> - EFI_FILE_INFO *FileInfo;
> - UINTN FileCount;
> - IMAGE_INFO *TempFilePtrBuf;
> - UINTN Size;
> - LIST_ENTRY FileInfoList;
> -
> - FileHandle = NULL;
> - FileCount = 0;
> - TempFilePtrBuf = NULL;
> - *FilePtr = NULL;
> -
> - //
> - // Get file list in Dir in alphabetical order
> - //
> - Status = GetFileInfoListInAlphabetFromDir(
> - Dir,
> - FileAttr,
> - &FileInfoList,
> - &FileCount
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG ((DEBUG_ERROR, "GetFileInfoListInAlphabetFromDir Failed!\n"));
> - goto EXIT;
> - }
> -
> - if (FileCount == 0) {
> - DEBUG ((DEBUG_ERROR, "No file found in Dir!\n"));
> - Status = EFI_NOT_FOUND;
> - goto EXIT;
> - }
> -
> - TempFilePtrBuf = (IMAGE_INFO *)AllocateZeroPool(sizeof(IMAGE_INFO)
> * FileCount);
> - if (TempFilePtrBuf == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> -
> - //
> - // Read all files from FileInfoList to BS memory
> - //
> - FileCount = 0;
> - for (Link = FileInfoList.ForwardLink; Link != &FileInfoList; Link = Link-
> >ForwardLink) {
> - //
> - // Get FileInfo from the link list
> - //
> - FileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link, FILE_INFO_SIGNATURE);
> - FileInfo = FileInfoEntry->FileInfo;
> -
> - Status = Dir->Open(
> - Dir,
> - &FileHandle,
> - FileInfo->FileName,
> - EFI_FILE_MODE_READ,
> - 0
> - );
> - if (EFI_ERROR(Status)){
> - continue;
> - }
> -
> - Size = (UINTN)FileInfo->FileSize;
> - TempFilePtrBuf[FileCount].ImageAddress = AllocateZeroPool(Size);
> - if (TempFilePtrBuf[FileCount].ImageAddress == NULL) {
> - DEBUG((DEBUG_ERROR, "Fail to allocate memory for capsule. Stop
> processing the rest.\n"));
> - break;
> - }
> -
> - Status = FileHandle->Read(
> - FileHandle,
> - &Size,
> - TempFilePtrBuf[FileCount].ImageAddress
> - );
> -
> - FileHandle->Close(FileHandle);
> -
> - //
> - // Skip read error file
> - //
> - if (EFI_ERROR(Status) || Size != (UINTN)FileInfo->FileSize) {
> - //
> - // Remove this error file info accordingly
> - // & move Link to BackLink
> - //
> - Link = RemoveEntryList(Link);
> - Link = Link->BackLink;
> -
> - FreePool(FileInfoEntry->FileInfo);
> - FreePool(FileInfoEntry->FileNameFirstPart);
> - FreePool(FileInfoEntry->FileNameSecondPart);
> - FreePool(FileInfoEntry);
> -
> - FreePool(TempFilePtrBuf[FileCount].ImageAddress);
> - TempFilePtrBuf[FileCount].ImageAddress = NULL;
> - TempFilePtrBuf[FileCount].FileInfo = NULL;
> -
> - continue;
> - }
> - TempFilePtrBuf[FileCount].FileInfo = FileInfo;
> - FileCount++;
> - }
> -
> - DEBUG_CODE (
> - for (Link = FileInfoList.ForwardLink; Link != &FileInfoList; Link = Link-
> >ForwardLink) {
> - FileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link, FILE_INFO_SIGNATURE);
> - FileInfo = FileInfoEntry->FileInfo;
> - DEBUG((DEBUG_INFO, "Successfully read capsule file %s from disk.\n",
> FileInfo->FileName));
> - }
> - );
> -
> -EXIT:
> -
> - *FilePtr = TempFilePtrBuf;
> - *FileNum = FileCount;
> -
> - //
> - // FileInfo will be freed by Calller
> - //
> - while(!IsListEmpty(&FileInfoList)) {
> - Link = FileInfoList.ForwardLink;
> - RemoveEntryList(Link);
> -
> - FileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link, FILE_INFO_SIGNATURE);
> -
> - FreePool(FileInfoEntry->FileNameFirstPart);
> - FreePool(FileInfoEntry->FileNameSecondPart);
> - FreePool(FileInfoEntry);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This routine is called to remove all qualified image from file from an given
> directory.
> -
> - @param[in] Dir Directory file handler
> - @param[in] FileAttr Attribute of files to be deleted
> -
> - @retval EFI_SUCCESS Succeed to remove all files from an given directory.
> -
> -**/
> -EFI_STATUS
> -RemoveFileFromDir(
> - IN EFI_FILE_HANDLE Dir,
> - IN UINT64 FileAttr
> - )
> -{
> - EFI_STATUS Status;
> - LIST_ENTRY *Link;
> - LIST_ENTRY FileInfoList;
> - EFI_FILE_HANDLE FileHandle;
> - FILE_INFO_ENTRY *FileInfoEntry;
> - EFI_FILE_INFO *FileInfo;
> - UINTN FileCount;
> -
> - FileHandle = NULL;
> -
> - //
> - // Get file list in Dir in alphabetical order
> - //
> - Status = GetFileInfoListInAlphabetFromDir(
> - Dir,
> - FileAttr,
> - &FileInfoList,
> - &FileCount
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG ((DEBUG_ERROR, "GetFileInfoListInAlphabetFromDir Failed!\n"));
> - goto EXIT;
> - }
> -
> - if (FileCount == 0) {
> - DEBUG ((DEBUG_ERROR, "No file found in Dir!\n"));
> - Status = EFI_NOT_FOUND;
> - goto EXIT;
> - }
> -
> - //
> - // Delete all files with given attribute in Dir
> - //
> - for (Link = FileInfoList.ForwardLink; Link != &(FileInfoList); Link = Link-
> >ForwardLink) {
> - //
> - // Get FileInfo from the link list
> - //
> - FileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link, FILE_INFO_SIGNATURE);
> - FileInfo = FileInfoEntry->FileInfo;
> -
> - Status = Dir->Open(
> - Dir,
> - &FileHandle,
> - FileInfo->FileName,
> - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
> - 0
> - );
> - if (EFI_ERROR(Status)){
> - continue;
> - }
> -
> - Status = FileHandle->Delete(FileHandle);
> - }
> -
> -EXIT:
> -
> - while(!IsListEmpty(&FileInfoList)) {
> - Link = FileInfoList.ForwardLink;
> - RemoveEntryList(Link);
> -
> - FileInfoEntry = CR (Link, FILE_INFO_ENTRY, Link, FILE_INFO_SIGNATURE);
> -
> - FreePool(FileInfoEntry->FileInfo);
> - FreePool(FileInfoEntry);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This routine is called to get all caspules from file. The capsule file image is
> - copied to BS memory. Caller is responsible to free them.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated.
> - @param[out] CapsulePtr Copied Capsule file Image Info buffer
> - @param[out] CapsuleNum CapsuleNumber
> - @param[out] FsHandle File system handle
> - @param[out] LoadOptionNumber OptionNumber of boot option
> -
> - @retval EFI_SUCCESS Succeed to get all capsules.
> -
> -**/
> -EFI_STATUS
> -GetAllCapsuleOnDisk(
> - IN UINTN MaxRetry,
> - OUT IMAGE_INFO **CapsulePtr,
> - OUT UINTN *CapsuleNum,
> - OUT EFI_HANDLE *FsHandle,
> - OUT UINT16 *LoadOptionNumber
> - )
> -{
> - EFI_STATUS Status;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
> - EFI_FILE_HANDLE RootDir;
> - EFI_FILE_HANDLE FileDir;
> - UINT16 *TempOptionNumber;
> -
> - Fs = NULL;
> - RootDir = NULL;
> - FileDir = NULL;
> - TempOptionNumber = NULL;
> - *CapsuleNum = 0;
> -
> - Status = GetEfiSysPartitionFromActiveBootOption(MaxRetry,
> &TempOptionNumber, FsHandle);
> - if (EFI_ERROR(Status)) {
> - return Status;
> - }
> -
> - Status = gBS->HandleProtocol(*FsHandle,
> &gEfiSimpleFileSystemProtocolGuid, (VOID **)&Fs);
> - if (EFI_ERROR(Status)) {
> - return Status;
> - }
> -
> - Status = Fs->OpenVolume(Fs, &RootDir);
> - if (EFI_ERROR(Status)) {
> - return Status;
> - }
> -
> - Status = RootDir->Open(
> - RootDir,
> - &FileDir,
> - EFI_CAPSULE_FILE_DIRECTORY,
> - EFI_FILE_MODE_READ,
> - 0
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG((DEBUG_ERROR, "CodLibGetAllCapsuleOnDisk fail to open
> RootDir!\n"));
> - goto EXIT;
> - }
> -
> - //
> - // Only Load files with EFI_FILE_SYSTEM or EFI_FILE_ARCHIVE attribute
> - // ignore EFI_FILE_READ_ONLY, EFI_FILE_HIDDEN, EFI_FILE_RESERVED,
> EFI_FILE_DIRECTORY
> - //
> - Status = GetFileImageInAlphabetFromDir(
> - FileDir,
> - EFI_FILE_SYSTEM | EFI_FILE_ARCHIVE,
> - CapsulePtr,
> - CapsuleNum
> - );
> - DEBUG((DEBUG_INFO, "GetFileImageInAlphabetFromDir status %x\n",
> Status));
> -
> - //
> - // Always remove file to avoid deadloop in capsule process
> - //
> - Status = RemoveFileFromDir(FileDir, EFI_FILE_SYSTEM | EFI_FILE_ARCHIVE);
> - DEBUG((DEBUG_INFO, "RemoveFileFromDir status %x\n", Status));
> -
> - if (LoadOptionNumber != NULL) {
> - *LoadOptionNumber = *TempOptionNumber;
> - }
> -
> -EXIT:
> -
> - if (FileDir != NULL) {
> - FileDir->Close (FileDir);
> - }
> -
> - if (RootDir != NULL) {
> - RootDir->Close (RootDir);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Build Gather list for a list of capsule images.
> -
> - @param[in] CapsuleBuffer An array of pointer to capsule images
> - @param[in] CapsuleSize An array of UINTN to capsule images size
> - @param[in] CapsuleNum The count of capsule images
> - @param[out] BlockDescriptors The block descriptors for the capsule images
> -
> - @retval EFI_SUCCESS The block descriptors for the capsule images are
> constructed.
> -
> -**/
> -EFI_STATUS
> -BuildGatherList (
> - IN VOID **CapsuleBuffer,
> - IN UINTN *CapsuleSize,
> - IN UINTN CapsuleNum,
> - OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors
> - )
> -{
> - EFI_STATUS Status;
> - EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors1;
> - EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptorPre;
> - EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptorsHeader;
> - UINTN Index;
> -
> - BlockDescriptors1 = NULL;
> - BlockDescriptorPre = NULL;
> - BlockDescriptorsHeader = NULL;
> -
> - for (Index = 0; Index < CapsuleNum; Index++) {
> - //
> - // Allocate memory for the descriptors.
> - //
> - BlockDescriptors1 = AllocateZeroPool (2 * sizeof
> (EFI_CAPSULE_BLOCK_DESCRIPTOR));
> - if (BlockDescriptors1 == NULL) {
> - DEBUG ((DEBUG_ERROR, "BuildGatherList: failed to allocate memory for
> descriptors\n"));
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ERREXIT;
> - } else {
> - DEBUG ((DEBUG_INFO, "BuildGatherList: creating capsule descriptors at
> 0x%X\n", (UINTN) BlockDescriptors1));
> - }
> -
> - //
> - // Record descirptor header
> - //
> - if (Index == 0) {
> - BlockDescriptorsHeader = BlockDescriptors1;
> - }
> -
> - if (BlockDescriptorPre != NULL) {
> - BlockDescriptorPre->Union.ContinuationPointer = (UINTN)
> BlockDescriptors1;
> - BlockDescriptorPre->Length = 0;
> - }
> -
> - BlockDescriptors1->Union.DataBlock = (UINTN) CapsuleBuffer[Index];
> - BlockDescriptors1->Length = CapsuleSize[Index];
> -
> - BlockDescriptorPre = BlockDescriptors1 + 1;
> - BlockDescriptors1 = NULL;
> - }
> -
> - //
> - // Null-terminate.
> - //
> - if (BlockDescriptorPre != NULL) {
> - BlockDescriptorPre->Union.ContinuationPointer = (UINTN)NULL;
> - BlockDescriptorPre->Length = 0;
> - *BlockDescriptors = BlockDescriptorsHeader;
> - }
> -
> - return EFI_SUCCESS;
> -
> -ERREXIT:
> - if (BlockDescriptors1 != NULL) {
> - FreePool (BlockDescriptors1);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This routine is called to check if CapsuleOnDisk flag in OsIndications Variable
> - is enabled.
> -
> - @retval TRUE Flag is enabled
> - @retval FALSE Flag is not enabled
> -
> -**/
> -BOOLEAN
> -EFIAPI
> -CoDCheckCapsuleOnDiskFlag(
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - UINT64 OsIndication;
> - UINTN DataSize;
> -
> - //
> - // Check File Capsule Delivery Supported Flag in OsIndication variable
> - //
> - OsIndication = 0;
> - DataSize = sizeof(UINT64);
> - Status = gRT->GetVariable (
> - EFI_OS_INDICATIONS_VARIABLE_NAME,
> - &gEfiGlobalVariableGuid,
> - NULL,
> - &DataSize,
> - &OsIndication
> - );
> - if (!EFI_ERROR(Status) &&
> - (OsIndication &
> EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0) {
> - return TRUE;
> - }
> -
> - return FALSE;
> -}
> -
> -
> -/**
> - This routine is called to clear CapsuleOnDisk flags including OsIndications
> and BootNext variable.
> -
> - @retval EFI_SUCCESS All Capsule On Disk flags are cleared
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDClearCapsuleOnDiskFlag(
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - UINT64 OsIndication;
> - UINTN DataSize;
> -
> - //
> - // Reset File Capsule Delivery Supported Flag in OsIndication variable
> - //
> - OsIndication = 0;
> - DataSize = sizeof(UINT64);
> - Status = gRT->GetVariable (
> - EFI_OS_INDICATIONS_VARIABLE_NAME,
> - &gEfiGlobalVariableGuid,
> - NULL,
> - &DataSize,
> - &OsIndication
> - );
> - if (EFI_ERROR(Status) ||
> - (OsIndication &
> EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) == 0) {
> - return Status;
> - }
> -
> - OsIndication &=
> ~((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
> - Status = gRT->SetVariable (
> - EFI_OS_INDICATIONS_VARIABLE_NAME,
> - &gEfiGlobalVariableGuid,
> - EFI_VARIABLE_BOOTSERVICE_ACCESS |
> EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
> - sizeof(UINT64),
> - &OsIndication
> - );
> - ASSERT(!EFI_ERROR(Status));
> -
> - //
> - // Delete BootNext variable. Capsule Process may reset system, so can't
> rely on Bds to clear this variable
> - //
> - Status = gRT->SetVariable (
> - EFI_BOOT_NEXT_VARIABLE_NAME,
> - &gEfiGlobalVariableGuid,
> - 0,
> - 0,
> - NULL
> - );
> - ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_FOUND);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - This routine is called to clear CapsuleOnDisk Relocation Info variable.
> - Total Capsule On Disk length is recorded in this variable
> -
> - @retval EFI_SUCCESS Capsule On Disk flags are cleared
> -
> -**/
> -EFI_STATUS
> -CoDClearCapsuleRelocationInfo(
> - VOID
> - )
> -{
> - return gRT->SetVariable (
> - COD_RELOCATION_INFO_VAR_NAME,
> - &gEfiCapsuleVendorGuid,
> - 0,
> - 0,
> - NULL
> - );
> -}
> -
> -/**
> - Relocate Capsule on Disk from EFI system partition to a platform-specific
> NV storage device
> - with BlockIo protocol. Relocation device path, identified by
> PcdCodRelocationDevPath, must
> - be a full device path.
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - Side Effects:
> - Content corruption. Block IO write directly touches low level write. Orignal
> partitions, file systems
> - of the relocation device will be corrupted.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated.
> -
> - @retval EFI_SUCCESS Capsule on Disk images are sucessfully relocated to
> the platform-specific device.
> -
> -**/
> -EFI_STATUS
> -RelocateCapsuleToDisk(
> - UINTN MaxRetry
> - )
> -{
> - EFI_STATUS Status;
> - UINTN CapsuleOnDiskNum;
> - UINTN Index;
> - UINTN DataSize;
> - UINT64 TotalImageSize;
> - UINT64 TotalImageNameSize;
> - IMAGE_INFO *CapsuleOnDiskBuf;
> - EFI_HANDLE Handle;
> - EFI_HANDLE TempHandle;
> - EFI_HANDLE *HandleBuffer;
> - UINTN NumberOfHandles;
> - EFI_BLOCK_IO_PROTOCOL *BlockIo;
> - UINT8 *CapsuleDataBuf;
> - UINT8 *CapsulePtr;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
> - EFI_FILE_HANDLE RootDir;
> - EFI_FILE_HANDLE TempCodFile;
> - UINT64 TempCodFileSize;
> - EFI_DEVICE_PATH *TempDevicePath;
> - BOOLEAN RelocationInfo;
> - UINT16 LoadOptionNumber;
> - EFI_CAPSULE_HEADER FileNameCapsuleHeader;
> -
> - RootDir = NULL;
> - TempCodFile = NULL;
> - HandleBuffer = NULL;
> - CapsuleDataBuf = NULL;
> - CapsuleOnDiskBuf = NULL;
> - NumberOfHandles = 0;
> -
> - DEBUG ((DEBUG_INFO, "CapsuleOnDisk RelocateCapsule Enter\n"));
> -
> - //
> - // 1. Load all Capsule On Disks in to memory
> - //
> - Status = GetAllCapsuleOnDisk(MaxRetry, &CapsuleOnDiskBuf,
> &CapsuleOnDiskNum, &Handle, &LoadOptionNumber);
> - if (EFI_ERROR(Status) || CapsuleOnDiskNum == 0) {
> - DEBUG ((DEBUG_INFO, "RelocateCapsule: GetAllCapsuleOnDisk Status -
> 0x%x\n", Status));
> - return EFI_NOT_FOUND;
> - }
> -
> - //
> - // 2. Connect platform special device path as relocation device.
> - // If no platform special device path specified or the device path is invalid,
> use the EFI system partition where
> - // stores the capsules as relocation device.
> - //
> - if (IsDevicePathValid ((EFI_DEVICE_PATH
> *)PcdGetPtr(PcdCodRelocationDevPath),
> PcdGetSize(PcdCodRelocationDevPath))) {
> - Status = EfiBootManagerConnectDevicePath ((EFI_DEVICE_PATH
> *)PcdGetPtr(PcdCodRelocationDevPath), &TempHandle);
> - if (EFI_ERROR(Status)) {
> - DEBUG ((DEBUG_ERROR, "RelocateCapsule:
> EfiBootManagerConnectDevicePath Status - 0x%x\n", Status));
> - goto EXIT;
> - }
> -
> - //
> - // Connect all the child handle. Partition & FAT drivers are allowed in this
> case
> - //
> - gBS->ConnectController (TempHandle, NULL, NULL, TRUE);
> - Status = gBS->LocateHandleBuffer(
> - ByProtocol,
> - &gEfiSimpleFileSystemProtocolGuid,
> - NULL,
> - &NumberOfHandles,
> - &HandleBuffer
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG ((DEBUG_ERROR, "RelocateCapsule: LocateHandleBuffer Status -
> 0x%x\n", Status));
> - goto EXIT;
> - }
> -
> - //
> - // Find first Simple File System Handle which can match
> PcdCodRelocationDevPath
> - //
> - for (Index = 0; Index < NumberOfHandles; Index++) {
> - Status = gBS->HandleProtocol(HandleBuffer[Index],
> &gEfiDevicePathProtocolGuid, (VOID **)&TempDevicePath);
> - if (EFI_ERROR(Status)) {
> - continue;
> - }
> -
> - DataSize = GetDevicePathSize((EFI_DEVICE_PATH
> *)PcdGetPtr(PcdCodRelocationDevPath)) - sizeof(EFI_DEVICE_PATH);
> - if (0 == CompareMem((EFI_DEVICE_PATH
> *)PcdGetPtr(PcdCodRelocationDevPath), TempDevicePath, DataSize)) {
> - Handle = HandleBuffer[Index];
> - break;
> - }
> - }
> -
> - FreePool(HandleBuffer);
> -
> - if (Index == NumberOfHandles) {
> - DEBUG ((DEBUG_ERROR, "RelocateCapsule: No simple file system
> protocol found.\n"));
> - Status = EFI_NOT_FOUND;
> - }
> - }
> -
> - Status = gBS->HandleProtocol(Handle, &gEfiBlockIoProtocolGuid, (VOID
> **)&BlockIo);
> - if (EFI_ERROR(Status) || BlockIo->Media->ReadOnly) {
> - DEBUG((DEBUG_ERROR, "Fail to find Capsule on Disk relocation BlockIo
> device or device is ReadOnly!\n"));
> - goto EXIT;
> - }
> -
> - Status = gBS->HandleProtocol(Handle, &gEfiSimpleFileSystemProtocolGuid,
> (VOID **)&Fs);
> - if (EFI_ERROR(Status)) {
> - goto EXIT;
> - }
> -
> - //
> - // Check if device used to relocate Capsule On Disk is big enough
> - //
> - TotalImageSize = 0;
> - TotalImageNameSize = 0;
> - for (Index = 0; Index < CapsuleOnDiskNum; Index++) {
> - //
> - // Overflow check
> - //
> - if (MAX_ADDRESS - (UINTN)TotalImageSize <=
> CapsuleOnDiskBuf[Index].FileInfo->FileSize) {
> - Status = EFI_INVALID_PARAMETER;
> - goto EXIT;
> - }
> -
> - if (MAX_ADDRESS - (UINTN)TotalImageNameSize <=
> StrSize(CapsuleOnDiskBuf[Index].FileInfo->FileName)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto EXIT;
> - }
> -
> - TotalImageSize += CapsuleOnDiskBuf[Index].FileInfo->FileSize;
> - TotalImageNameSize += StrSize(CapsuleOnDiskBuf[Index].FileInfo-
> >FileName);
> - DEBUG((DEBUG_INFO, "RelocateCapsule: %x
> Size %x\n",CapsuleOnDiskBuf[Index].FileInfo->FileName,
> CapsuleOnDiskBuf[Index].FileInfo->FileSize));
> - }
> -
> - DEBUG((DEBUG_INFO, "RelocateCapsule: TotalImageSize %x\n",
> TotalImageSize));
> - DEBUG((DEBUG_INFO, "RelocateCapsule: TotalImageNameSize %x\n",
> TotalImageNameSize));
> -
> - if (MAX_ADDRESS - (UINTN)TotalImageNameSize <= sizeof(UINT64) * 2 ||
> - MAX_ADDRESS - (UINTN)TotalImageSize <=
> (UINTN)TotalImageNameSize + sizeof(UINT64) * 2) {
> - Status = EFI_INVALID_PARAMETER;
> - goto EXIT;
> - }
> -
> - TempCodFileSize = sizeof(UINT64) + TotalImageSize +
> sizeof(EFI_CAPSULE_HEADER) + TotalImageNameSize;
> -
> - //
> - // Check if CapsuleTotalSize. There could be reminder, so use LastBlock
> number directly
> - //
> - if (DivU64x32(TempCodFileSize, BlockIo->Media->BlockSize) > BlockIo-
> >Media->LastBlock) {
> - DEBUG((DEBUG_ERROR, "RelocateCapsule: Relocation device isn't big
> enough to hold all Capsule on Disk!\n"));
> - DEBUG((DEBUG_ERROR, "TotalImageSize = %x\n", TotalImageSize));
> - DEBUG((DEBUG_ERROR, "TotalImageNameSize = %x\n",
> TotalImageNameSize));
> - DEBUG((DEBUG_ERROR, "RelocationDev BlockSize = %x LastBlock = %x\n",
> BlockIo->Media->BlockSize, BlockIo->Media->LastBlock));
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> -
> - CapsuleDataBuf = AllocatePool((UINTN) TempCodFileSize);
> - if (CapsuleDataBuf == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto EXIT;
> - }
> -
> - //
> - // First UINT64 reserved for total image size, including capsule name
> capsule.
> - //
> - *(UINT64 *) CapsuleDataBuf = TotalImageSize +
> sizeof(EFI_CAPSULE_HEADER) + TotalImageNameSize;
> -
> - //
> - // Line up all the Capsule on Disk and write to relocation disk at one time. It
> could save some time in disk write
> - //
> - for (Index = 0, CapsulePtr = CapsuleDataBuf + sizeof(UINT64); Index <
> CapsuleOnDiskNum; Index++) {
> - CopyMem(CapsulePtr, CapsuleOnDiskBuf[Index].ImageAddress, (UINTN)
> CapsuleOnDiskBuf[Index].FileInfo->FileSize);
> - CapsulePtr += CapsuleOnDiskBuf[Index].FileInfo->FileSize;
> - }
> -
> - //
> - // Line the capsule header for capsule name capsule.
> - //
> - CopyGuid(&FileNameCapsuleHeader.CapsuleGuid,
> &gEdkiiCapsuleOnDiskNameGuid);
> - FileNameCapsuleHeader.CapsuleImageSize = (UINT32)
> TotalImageNameSize + sizeof(EFI_CAPSULE_HEADER);
> - FileNameCapsuleHeader.Flags =
> CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
> - FileNameCapsuleHeader.HeaderSize = sizeof(EFI_CAPSULE_HEADER);
> - CopyMem(CapsulePtr, &FileNameCapsuleHeader,
> FileNameCapsuleHeader.HeaderSize);
> - CapsulePtr += FileNameCapsuleHeader.HeaderSize;
> -
> - //
> - // Line up all the Capsule file names.
> - //
> - for (Index = 0; Index < CapsuleOnDiskNum; Index++) {
> - CopyMem(CapsulePtr, CapsuleOnDiskBuf[Index].FileInfo->FileName,
> StrSize(CapsuleOnDiskBuf[Index].FileInfo->FileName));
> - CapsulePtr += StrSize(CapsuleOnDiskBuf[Index].FileInfo->FileName);
> - }
> -
> - //
> - // 5. Flash all Capsules on Disk to TempCoD.tmp under RootDir
> - //
> - Status = Fs->OpenVolume(Fs, &RootDir);
> - if (EFI_ERROR(Status)) {
> - DEBUG((DEBUG_ERROR, "RelocateCapsule: OpenVolume error. %x\n",
> Status));
> - goto EXIT;
> - }
> -
> - Status = RootDir->Open(
> - RootDir,
> - &TempCodFile,
> - (CHAR16 *)PcdGetPtr(PcdCoDRelocationFileName),
> - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
> - 0
> - );
> - if (!EFI_ERROR(Status)) {
> - //
> - // Error handling code to prevent malicious code to hold this file to block
> capsule on disk
> - //
> - TempCodFile->Delete(TempCodFile);
> - }
> - Status = RootDir->Open(
> - RootDir,
> - &TempCodFile,
> - (CHAR16 *)PcdGetPtr(PcdCoDRelocationFileName),
> - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |
> EFI_FILE_MODE_CREATE,
> - 0
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG((DEBUG_ERROR, "RelocateCapsule: Open TemCoD.tmp
> error. %x\n", Status));
> - goto EXIT;
> - }
> -
> - //
> - // Always write at the begining of TempCap file
> - //
> - DataSize = (UINTN) TempCodFileSize;
> - Status = TempCodFile->Write(
> - TempCodFile,
> - &DataSize,
> - CapsuleDataBuf
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG((DEBUG_ERROR, "RelocateCapsule: Write TemCoD.tmp
> error. %x\n", Status));
> - goto EXIT;
> - }
> -
> - if (DataSize != TempCodFileSize) {
> - Status = EFI_DEVICE_ERROR;
> - goto EXIT;
> - }
> -
> - //
> - // Save Capsule On Disk relocation info to "CodRelocationInfo" Var
> - // It is used in next reboot by TCB
> - //
> - RelocationInfo = TRUE;
> - Status = gRT->SetVariable(
> - COD_RELOCATION_INFO_VAR_NAME,
> - &gEfiCapsuleVendorGuid,
> - EFI_VARIABLE_NON_VOLATILE |
> EFI_VARIABLE_BOOTSERVICE_ACCESS,
> - sizeof (BOOLEAN),
> - &RelocationInfo
> - );
> - //
> - // Save the LoadOptionNumber of the boot option, where the capsule is
> relocated,
> - // into "CodRelocationLoadOption" var. It is used in next reboot after
> capsule is
> - // updated out of TCB to remove the TempCoDFile.
> - //
> - Status = gRT->SetVariable(
> - COD_RELOCATION_LOAD_OPTION_VAR_NAME,
> - &gEfiCapsuleVendorGuid,
> - EFI_VARIABLE_NON_VOLATILE |
> EFI_VARIABLE_BOOTSERVICE_ACCESS,
> - sizeof (UINT16),
> - &LoadOptionNumber
> - );
> -
> -EXIT:
> -
> - if (CapsuleDataBuf != NULL) {
> - FreePool(CapsuleDataBuf);
> - }
> -
> - if (CapsuleOnDiskBuf != NULL) {
> - //
> - // Free resources allocated by CodLibGetAllCapsuleOnDisk
> - //
> - for (Index = 0; Index < CapsuleOnDiskNum; Index++ ) {
> - FreePool(CapsuleOnDiskBuf[Index].ImageAddress);
> - FreePool(CapsuleOnDiskBuf[Index].FileInfo);
> - }
> - FreePool(CapsuleOnDiskBuf);
> - }
> -
> - if (TempCodFile != NULL) {
> - if (EFI_ERROR(Status)) {
> - TempCodFile->Delete (TempCodFile);
> - } else {
> - TempCodFile->Close (TempCodFile);
> - }
> - }
> -
> - if (RootDir != NULL) {
> - RootDir->Close (RootDir);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - For the platforms that support Capsule In Ram, reuse the Capsule In Ram to
> deliver capsule.
> - Relocate Capsule On Disk to memory and call UpdateCapsule().
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated.
> -
> - @retval EFI_SUCCESS Deliver capsule through Capsule In Ram successfully.
> -
> -**/
> -EFI_STATUS
> -RelocateCapsuleToRam (
> - UINTN MaxRetry
> - )
> -{
> - EFI_STATUS Status;
> - UINTN CapsuleOnDiskNum;
> - IMAGE_INFO *CapsuleOnDiskBuf;
> - EFI_HANDLE Handle;
> - EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors;
> - VOID **CapsuleBuffer;
> - UINTN *CapsuleSize;
> - EFI_CAPSULE_HEADER *FileNameCapsule;
> - UINTN Index;
> - UINT8 *StringBuf;
> - UINTN StringSize;
> - UINTN TotalStringSize;
> -
> - CapsuleOnDiskBuf = NULL;
> - BlockDescriptors = NULL;
> - CapsuleBuffer = NULL;
> - CapsuleSize = NULL;
> - FileNameCapsule = NULL;
> - TotalStringSize = 0;
> -
> - //
> - // 1. Load all Capsule On Disks into memory
> - //
> - Status = GetAllCapsuleOnDisk (MaxRetry, &CapsuleOnDiskBuf,
> &CapsuleOnDiskNum, &Handle, NULL);
> - if (EFI_ERROR (Status) || CapsuleOnDiskNum == 0) {
> - DEBUG ((DEBUG_ERROR, "GetAllCapsuleOnDisk Status - 0x%x\n", Status));
> - return EFI_NOT_FOUND;
> - }
> -
> - //
> - // 2. Add a capsule for Capsule file name strings
> - //
> - CapsuleBuffer = AllocateZeroPool ((CapsuleOnDiskNum + 1) * sizeof (VOID
> *));
> - if (CapsuleBuffer == NULL) {
> - DEBUG ((DEBUG_ERROR, "Fail to allocate memory for capsules.\n"));
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - CapsuleSize = AllocateZeroPool ((CapsuleOnDiskNum + 1) * sizeof (UINTN));
> - if (CapsuleSize == NULL) {
> - DEBUG ((DEBUG_ERROR, "Fail to allocate memory for capsules.\n"));
> - FreePool (CapsuleBuffer);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - for (Index = 0; Index < CapsuleOnDiskNum; Index++) {
> - CapsuleBuffer[Index] = (VOID *)(UINTN)
> CapsuleOnDiskBuf[Index].ImageAddress;
> - CapsuleSize[Index] = (UINTN) CapsuleOnDiskBuf[Index].FileInfo->FileSize;
> - TotalStringSize += StrSize (CapsuleOnDiskBuf[Index].FileInfo->FileName);
> - }
> -
> - FileNameCapsule = AllocateZeroPool (sizeof (EFI_CAPSULE_HEADER) +
> TotalStringSize);
> - if (FileNameCapsule == NULL) {
> - DEBUG ((DEBUG_ERROR, "Fail to allocate memory for name capsule.\n"));
> - FreePool (CapsuleBuffer);
> - FreePool (CapsuleSize);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - FileNameCapsule->CapsuleImageSize = (UINT32) (sizeof
> (EFI_CAPSULE_HEADER) + TotalStringSize);
> - FileNameCapsule->Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
> - FileNameCapsule->HeaderSize = sizeof (EFI_CAPSULE_HEADER);
> - CopyGuid (&(FileNameCapsule->CapsuleGuid),
> &gEdkiiCapsuleOnDiskNameGuid);
> -
> - StringBuf = (UINT8 *)FileNameCapsule + FileNameCapsule->HeaderSize;
> - for (Index = 0; Index < CapsuleOnDiskNum; Index ++) {
> - StringSize = StrSize (CapsuleOnDiskBuf[Index].FileInfo->FileName);
> - CopyMem (StringBuf, CapsuleOnDiskBuf[Index].FileInfo->FileName,
> StringSize);
> - StringBuf += StringSize;
> - }
> -
> - CapsuleBuffer[CapsuleOnDiskNum] = FileNameCapsule;
> - CapsuleSize[CapsuleOnDiskNum] = TotalStringSize + sizeof
> (EFI_CAPSULE_HEADER);
> -
> - //
> - // 3. Build Gather list for the capsules
> - //
> - Status = BuildGatherList (CapsuleBuffer, CapsuleSize, CapsuleOnDiskNum +
> 1, &BlockDescriptors);
> - if (EFI_ERROR (Status) || BlockDescriptors == NULL) {
> - FreePool (CapsuleBuffer);
> - FreePool (CapsuleSize);
> - FreePool (FileNameCapsule);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - //
> - // 4. Call UpdateCapsule() service
> - //
> - Status = gRT->UpdateCapsule((EFI_CAPSULE_HEADER **) CapsuleBuffer,
> CapsuleOnDiskNum + 1, (UINTN) BlockDescriptors);
> -
> - return Status;
> -}
> -
> -/**
> - Relocate Capsule on Disk from EFI system partition.
> -
> - Two solution to deliver Capsule On Disk:
> - Solution A: If PcdCapsuleInRamSupport is enabled, relocate Capsule On
> Disk to memory and call UpdateCapsule().
> - Solution B: If PcdCapsuleInRamSupport is disabled, relocate Capsule On
> Disk to a platform-specific NV storage
> - device with BlockIo protocol.
> -
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - Side Effects:
> - Capsule Delivery Supported Flag in OsIndication variable and BootNext
> variable will be cleared.
> - Solution B: Content corruption. Block IO write directly touches low level
> write. Orignal partitions, file
> - systems of the relocation device will be corrupted.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated. Input 0 means no
> retry.
> -
> - @retval EFI_SUCCESS Capsule on Disk images are successfully relocated.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDRelocateCapsule(
> - UINTN MaxRetry
> - )
> -{
> - if (!PcdGetBool (PcdCapsuleOnDiskSupport)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - //
> - // Clear CapsuleOnDisk Flag firstly.
> - //
> - CoDClearCapsuleOnDiskFlag ();
> -
> - //
> - // If Capsule In Ram is supported, delivery capsules through memory
> - //
> - if (PcdGetBool (PcdCapsuleInRamSupport)) {
> - DEBUG ((DEBUG_INFO, "Capsule In Ram is supported, call gRT-
> >UpdateCapsule().\n"));
> - return RelocateCapsuleToRam (MaxRetry);
> - } else {
> - DEBUG ((DEBUG_INFO, "Reallcoate all Capsule on Disks to %s in
> RootDir.\n", (CHAR16 *)PcdGetPtr(PcdCoDRelocationFileName)));
> - return RelocateCapsuleToDisk (MaxRetry);
> - }
> -}
> -
> -/**
> - Remove the temp file from the root of EFI System Partition.
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated. Input 0 means no
> retry.
> -
> - @retval EFI_SUCCESS Remove the temp file successfully.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDRemoveTempFile (
> - UINTN MaxRetry
> - )
> -{
> - EFI_STATUS Status;
> - UINTN DataSize;
> - UINT16 *LoadOptionNumber;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
> - EFI_HANDLE FsHandle;
> - EFI_FILE_HANDLE RootDir;
> - EFI_FILE_HANDLE TempCodFile;
> -
> - RootDir = NULL;
> - TempCodFile = NULL;
> - DataSize = sizeof(UINT16);
> -
> - LoadOptionNumber = AllocatePool (sizeof(UINT16));
> - if (LoadOptionNumber == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - //
> - // Check if capsule files are relocated
> - //
> - Status = gRT->GetVariable (
> - COD_RELOCATION_LOAD_OPTION_VAR_NAME,
> - &gEfiCapsuleVendorGuid,
> - NULL,
> - &DataSize,
> - (VOID *)LoadOptionNumber
> - );
> - if (EFI_ERROR(Status) || DataSize != sizeof(UINT16)) {
> - goto EXIT;
> - }
> -
> - //
> - // Get the EFI file system from the boot option where the capsules are
> relocated
> - //
> - Status = GetEfiSysPartitionFromActiveBootOption(MaxRetry,
> &LoadOptionNumber, &FsHandle);
> - if (EFI_ERROR(Status)) {
> - goto EXIT;
> - }
> -
> - Status = gBS->HandleProtocol(FsHandle,
> &gEfiSimpleFileSystemProtocolGuid, (VOID **)&Fs);
> - if (EFI_ERROR(Status)) {
> - goto EXIT;
> - }
> -
> - Status = Fs->OpenVolume(Fs, &RootDir);
> - if (EFI_ERROR(Status)) {
> - goto EXIT;
> - }
> -
> - //
> - // Delete the TempCoDFile
> - //
> - Status = RootDir->Open(
> - RootDir,
> - &TempCodFile,
> - (CHAR16 *)PcdGetPtr(PcdCoDRelocationFileName),
> - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
> - 0
> - );
> - if (EFI_ERROR(Status)) {
> - goto EXIT;
> - }
> -
> - TempCodFile->Delete(TempCodFile);
> -
> - //
> - // Clear "CoDRelocationLoadOption" variable
> - //
> - Status = gRT->SetVariable (
> - COD_RELOCATION_LOAD_OPTION_VAR_NAME,
> - &gEfiCapsuleVendorGuid,
> - 0,
> - 0,
> - NULL
> - );
> -
> -EXIT:
> - if (LoadOptionNumber != NULL) {
> - FreePool (LoadOptionNumber);
> - }
> -
> - if (RootDir != NULL) {
> - RootDir->Close(RootDir);
> - }
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.h
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.h
> deleted file mode 100644
> index 4300e32770..0000000000
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/CapsuleOnDisk.h
> +++ /dev/null
> @@ -1,75 +0,0 @@
> -/** @file
> - Defines several datastructures used by Capsule On Disk feature.
> - They are mainly used for FAT files.
> -
> - Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> - SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef _CAPSULES_ON_DISK_H_
> -#define _CAPSULES_ON_DISK_H_
> -
> -#include <Uefi.h>
> -#include <Pi/PiMultiPhase.h>
> -
> -#include <Library/UefiLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiRuntimeServicesTableLib.h>
> -#include <Library/UefiRuntimeLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/FileHandleLib.h>
> -#include <Library/CapsuleLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Library/PrintLib.h>
> -#include <Library/UefiBootManagerLib.h>
> -
> -#include <Protocol/SimpleFileSystem.h>
> -#include <Protocol/DiskIo.h>
> -#include <Protocol/BlockIo.h>
> -
> -#include <Guid/CapsuleVendor.h>
> -#include <Guid/FileInfo.h>
> -#include <Guid/GlobalVariable.h>
> -
> -//
> -// This data structure is the part of FILE_INFO_ENTRY
> -//
> -#define FILE_INFO_SIGNATURE SIGNATURE_32 ('F', 'L', 'I', 'F')
> -
> -//
> -// LoadOptionNumber of the boot option where the capsules is relocated.
> -//
> -#define COD_RELOCATION_LOAD_OPTION_VAR_NAME
> L"CodRelocationLoadOption"
> -
> -//
> -// (20 * (6+5+2))+1) unicode characters from EFI FAT spec (doubled for
> bytes)
> -//
> -#define MAX_FILE_NAME_SIZE 522
> -#define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16))
> -#define MAX_FILE_INFO_LEN (OFFSET_OF(EFI_FILE_INFO, FileName) +
> MAX_FILE_NAME_LEN)
> -
> -typedef struct {
> - UINTN Signature;
> - LIST_ENTRY Link; /// Linked list members.
> - EFI_FILE_INFO *FileInfo; /// Pointer to the FileInfo struct for this file
> or NULL.
> - CHAR16 *FileNameFirstPart; /// Text to the left of right-most period
> in the file name. String is capitialized
> - CHAR16 *FileNameSecondPart; /// Text to the right of right-most
> period in the file name.String is capitialized. Maybe NULL
> -} FILE_INFO_ENTRY;
> -
> -typedef struct {
> - //
> - // image address.
> - //
> - VOID *ImageAddress;
> - //
> - // The file info of the image comes from.
> - // if FileInfo == NULL. means image does not come from file
> - //
> - EFI_FILE_INFO *FileInfo;
> -} IMAGE_INFO;
> -
> -#endif // _CAPSULES_ON_DISK_H_
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> index 95aa9de087..f38ab69e38 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> @@ -8,11 +8,11 @@
>
> SupportCapsuleImage(), ProcessCapsuleImage(), IsValidCapsuleHeader(),
> ValidateFmpCapsule(), and DisplayCapsuleImage() receives untrusted input
> and
> performs basic validation.
>
> - Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #include <PiDxe.h>
> @@ -78,23 +78,21 @@ RecordCapsuleStatusVariable (
> @param[in] CapsuleHeader The capsule image header
> @param[in] CapsuleStatus The capsule process stauts
> @param[in] PayloadIndex FMP payload index
> @param[in] ImageHeader FMP image header
> @param[in] FmpDevicePath DevicePath associated with the FMP producer
> - @param[in] CapFileName Capsule file name
>
> @retval EFI_SUCCESS The capsule status variable is recorded.
> @retval EFI_OUT_OF_RESOURCES No resource to record the capsule status
> variable.
> **/
> EFI_STATUS
> RecordFmpCapsuleStatusVariable (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> IN EFI_STATUS CapsuleStatus,
> IN UINTN PayloadIndex,
> IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
> *ImageHeader,
> - IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath, OPTIONAL
> - IN CHAR16 *CapFileName OPTIONAL
> + IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath OPTIONAL
> );
>
> /**
> Function indicate the current completion progress of the firmware
> update. Platform may override with own specific progress function.
> @@ -109,26 +107,10 @@ EFI_STATUS
> EFIAPI
> UpdateImageProgress (
> IN UINTN Completion
> );
>
> -/**
> - Return if this capsule is a capsule name capsule, based upon
> CapsuleHeader.
> -
> - @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER
> -
> - @retval TRUE It is a capsule name capsule.
> - @retval FALSE It is not a capsule name capsule.
> -**/
> -BOOLEAN
> -IsCapsuleNameCapsule (
> - IN EFI_CAPSULE_HEADER *CapsuleHeader
> - )
> -{
> - return CompareGuid (&CapsuleHeader->CapsuleGuid,
> &gEdkiiCapsuleOnDiskNameGuid);
> -}
> -
> /**
> Return if this CapsuleGuid is a FMP capsule GUID or not.
>
> @param[in] CapsuleGuid A pointer to EFI_GUID
>
> @@ -1050,25 +1032,23 @@ StartFmpImage (
> }
>
> /**
> Record FMP capsule status.
>
> - @param[in] Handle A FMP handle.
> + @param[in] Handle A FMP handle.
> @param[in] CapsuleHeader The capsule image header
> @param[in] CapsuleStatus The capsule process stauts
> @param[in] PayloadIndex FMP payload index
> @param[in] ImageHeader FMP image header
> - @param[in] CapFileName Capsule file name
> **/
> VOID
> RecordFmpCapsuleStatus (
> IN EFI_HANDLE Handle, OPTIONAL
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> IN EFI_STATUS CapsuleStatus,
> IN UINTN PayloadIndex,
> - IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
> *ImageHeader,
> - IN CHAR16 *CapFileName OPTIONAL
> + IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
> *ImageHeader
> )
> {
> EFI_STATUS Status;
> EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath;
> UINT32 FmpImageInfoDescriptorVer;
> @@ -1088,12 +1068,11 @@ RecordFmpCapsuleStatus (
> RecordFmpCapsuleStatusVariable (
> CapsuleHeader,
> CapsuleStatus,
> PayloadIndex,
> ImageHeader,
> - FmpDevicePath,
> - CapFileName
> + FmpDevicePath
> );
>
> //
> // Update corresponding ESRT entry LastAttemp Status
> //
> @@ -1134,11 +1113,10 @@ RecordFmpCapsuleStatus (
> EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER are correct.
>
> This function need support nested FMP capsule.
>
> @param[in] CapsuleHeader Points to a capsule header.
> - @param[in] CapFileName Capsule file name.
> @param[out] ResetRequired Indicates whether reset is required or not.
>
> @retval EFI_SUCESS Process Capsule Image successfully.
> @retval EFI_UNSUPPORTED Capsule image is not supported by the
> firmware.
> @retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted.
> @@ -1146,11 +1124,10 @@ RecordFmpCapsuleStatus (
> @retval EFI_NOT_READY No FMP protocol to handle this FMP capsule.
> **/
> EFI_STATUS
> ProcessFmpCapsuleImage (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> - IN CHAR16 *CapFileName, OPTIONAL
> OUT BOOLEAN *ResetRequired OPTIONAL
> )
> {
> EFI_STATUS Status;
> EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER
> *FmpCapsuleHeader;
> @@ -1166,11 +1143,11 @@ ProcessFmpCapsuleImage (
> UINTN Index2;
> BOOLEAN NotReady;
> BOOLEAN Abort;
>
> if (!IsFmpCapsuleGuid(&CapsuleHeader->CapsuleGuid)) {
> - return ProcessFmpCapsuleImage ((EFI_CAPSULE_HEADER
> *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), CapFileName,
> ResetRequired);
> + return ProcessFmpCapsuleImage ((EFI_CAPSULE_HEADER
> *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), ResetRequired);
> }
>
> NotReady = FALSE;
> Abort = FALSE;
>
> @@ -1248,12 +1225,11 @@ ProcessFmpCapsuleImage (
> RecordFmpCapsuleStatus (
> NULL,
> CapsuleHeader,
> EFI_NOT_READY,
> Index - FmpCapsuleHeader->EmbeddedDriverCount,
> - ImageHeader,
> - CapFileName
> + ImageHeader
> );
> continue;
> }
>
> for (Index2 = 0; Index2 < NumberOfHandles; Index2++) {
> @@ -1261,12 +1237,11 @@ ProcessFmpCapsuleImage (
> RecordFmpCapsuleStatus (
> HandleBuffer[Index2],
> CapsuleHeader,
> EFI_ABORTED,
> Index - FmpCapsuleHeader->EmbeddedDriverCount,
> - ImageHeader,
> - CapFileName
> + ImageHeader
> );
> continue;
> }
>
> Status = SetFmpImageData (
> @@ -1285,12 +1260,11 @@ ProcessFmpCapsuleImage (
> RecordFmpCapsuleStatus (
> HandleBuffer[Index2],
> CapsuleHeader,
> Status,
> Index - FmpCapsuleHeader->EmbeddedDriverCount,
> - ImageHeader,
> - CapFileName
> + ImageHeader
> );
> }
> if (HandleBuffer != NULL) {
> FreePool(HandleBuffer);
> }
> @@ -1438,17 +1412,10 @@ SupportCapsuleImage (
> //
> if (CompareGuid (&gWindowsUxCapsuleGuid, &CapsuleHeader-
> >CapsuleGuid)) {
> return EFI_SUCCESS;
> }
>
> - //
> - // Check capsule file name capsule
> - //
> - if (IsCapsuleNameCapsule(CapsuleHeader)) {
> - return EFI_SUCCESS;
> - }
> -
> if (IsFmpCapsule(CapsuleHeader)) {
> //
> // Fake capsule header is valid case in QueryCapsuleCpapbilities().
> //
> if (CapsuleHeader->HeaderSize == CapsuleHeader->CapsuleImageSize) {
> @@ -1467,11 +1434,10 @@ SupportCapsuleImage (
> The firmware implements to process the capsule image.
>
> Caution: This function may receive untrusted input.
>
> @param[in] CapsuleHeader Points to a capsule header.
> - @param[in] CapFileName Capsule file name.
> @param[out] ResetRequired Indicates whether reset is required or not.
>
> @retval EFI_SUCESS Process Capsule Image successfully.
> @retval EFI_UNSUPPORTED Capsule image is not supported by the
> firmware.
> @retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted.
> @@ -1479,11 +1445,10 @@ SupportCapsuleImage (
> **/
> EFI_STATUS
> EFIAPI
> ProcessThisCapsuleImage (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> - IN CHAR16 *CapFileName, OPTIONAL
> OUT BOOLEAN *ResetRequired OPTIONAL
> )
> {
> EFI_STATUS Status;
>
> @@ -1517,11 +1482,11 @@ ProcessThisCapsuleImage (
>
> //
> // Process EFI FMP Capsule
> //
> DEBUG((DEBUG_INFO, "ProcessFmpCapsuleImage ...\n"));
> - Status = ProcessFmpCapsuleImage(CapsuleHeader, CapFileName,
> ResetRequired);
> + Status = ProcessFmpCapsuleImage(CapsuleHeader, ResetRequired);
> DEBUG((DEBUG_INFO, "ProcessFmpCapsuleImage - %r\n", Status));
>
> return Status;
> }
>
> @@ -1544,11 +1509,11 @@ EFI_STATUS
> EFIAPI
> ProcessCapsuleImage (
> IN EFI_CAPSULE_HEADER *CapsuleHeader
> )
> {
> - return ProcessThisCapsuleImage (CapsuleHeader, NULL, NULL);
> + return ProcessThisCapsuleImage (CapsuleHeader, NULL);
> }
>
> /**
> Callback function executed when the EndOfDxe event group is signaled.
>
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
> index 05de4299fb..14c3d19bc3 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
> +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
> @@ -1,11 +1,11 @@
> ## @file
> # Capsule library instance for DXE_DRIVER.
> #
> # Capsule library instance for DXE_DRIVER module types.
> #
> -# Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> ##
>
> [Defines]
> @@ -27,12 +27,10 @@
>
> [Sources]
> DxeCapsuleLib.c
> DxeCapsuleProcessLib.c
> DxeCapsuleReportLib.c
> - CapsuleOnDisk.c
> - CapsuleOnDisk.h
>
> [Packages]
> MdePkg/MdePkg.dec
> MdeModulePkg/MdeModulePkg.dec
>
> @@ -47,12 +45,10 @@
> ReportStatusCodeLib
> PrintLib
> HobLib
> BmpSupportLib
> DisplayUpdateProgressLib
> - FileHandleLib
> - UefiBootManagerLib
>
> [Pcd]
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleMax ##
> CONSUMES
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdSystemRebootAfterCapsuleProcess
> Flag ## CONSUMES
>
> @@ -61,38 +57,23 @@
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeProcessCapsules
> End ## CONSUMES
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeUpdatingFirmwa
> re ## CONSUMES
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeUpdateFirmwar
> eSuccess ## CONSUMES
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeUpdateFirmwar
> eFailed ## CONSUMES
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeResettingSyste
> m ## CONSUMES
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleInRamSupport
> ## CONSUMES
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport
> ## CONSUMES
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCodRelocationDevPath
> ## SOMETIMES_CONSUMES
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCoDRelocationFileName
> ## CONSUMES
>
> [Protocols]
> gEsrtManagementProtocolGuid ## CONSUMES
> gEfiFirmwareManagementProtocolGuid ## CONSUMES
> gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES
> gEdkiiFirmwareManagementProgressProtocolGuid ##
> SOMETIMES_CONSUMES
> - gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES
> - gEfiBlockIoProtocolGuid ## CONSUMES
> - gEfiDiskIoProtocolGuid ## CONSUMES
>
> [Guids]
> gEfiFmpCapsuleGuid ## SOMETIMES_CONSUMES ## GUID
> gWindowsUxCapsuleGuid ## SOMETIMES_CONSUMES ## GUID
> ## SOMETIMES_CONSUMES ## Variable:L"CapsuleMax"
> ## SOMETIMES_PRODUCES ## Variable:L"CapsuleMax"
> gEfiCapsuleReportGuid
> gEfiCapsuleVendorGuid ## SOMETIMES_CONSUMES ##
> Variable:L"CapsuleUpdateData"
> gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event
> - gEfiPartTypeSystemPartGuid ## SOMETIMES_CONSUMES
> - gEfiCapsuleVendorGuid ## SOMETIMES_CONSUMES ##
> Variable:L"CodRelocationInfo"
> - ## SOMETIMES_CONSUMES ## Variable:L"OsIndications"
> - ## SOMETIMES_PRODUCES ## Variable:L"OsIndications"
> - ## SOMETIMES_CONSUMES ## Variable:L"BootNext"
> - ## SOMETIMES_PRODUCES ## Variable:L"BootNext"
> - gEfiGlobalVariableGuid
> - gEdkiiCapsuleOnDiskNameGuid ## SOMETIMES_CONSUMES ##
> GUID
>
> [Depex]
> gEfiVariableWriteArchProtocolGuid
> diff --git
> a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c
> index 9c9cd9e373..5e2d2b87a8 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c
> +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c
> @@ -7,11 +7,11 @@
> buffer overflow, integer overflow.
>
> ProcessCapsules(), ProcessTheseCapsules() will receive untrusted
> input and do basic validation.
>
> - Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #include <PiDxe.h>
> @@ -90,45 +90,14 @@ BOOLEAN
> IsValidCapsuleHeader (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> IN UINT64 CapsuleSize
> );
>
> -/**
> - Return if this capsule is a capsule name capsule, based upon
> CapsuleHeader.
> -
> - @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER
> -
> - @retval TRUE It is a capsule name capsule.
> - @retval FALSE It is not a capsule name capsule.
> -**/
> -BOOLEAN
> -IsCapsuleNameCapsule (
> - IN EFI_CAPSULE_HEADER *CapsuleHeader
> - );
> -
> -/**
> - Check the integrity of the capsule name capsule.
> - If the capsule is vaild, return the physical address of each capsule name
> string.
> -
> - @param[in] CapsuleHeader Pointer to the capsule header of a capsule
> name capsule.
> - @param[out] CapsuleNameNum Number of capsule name.
> -
> - @retval NULL Capsule name capsule is not valid.
> - @retval CapsuleNameBuf Array of capsule name physical address.
> -
> -**/
> -EFI_PHYSICAL_ADDRESS *
> -ValidateCapsuleNameCapsuleIntegrity (
> - IN EFI_CAPSULE_HEADER *CapsuleHeader,
> - OUT UINTN *CapsuleNameNum
> - );
> -
> extern BOOLEAN mDxeCapsuleLibEndOfDxe;
> BOOLEAN mNeedReset = FALSE;
>
> VOID **mCapsulePtr;
> -CHAR16 **mCapsuleNamePtr;
> EFI_STATUS *mCapsuleStatusArray;
> UINT32 mCapsuleTotalNumber;
>
> /**
> The firmware implements to process the capsule image.
> @@ -145,11 +114,10 @@ UINT32 mCapsuleTotalNumber;
> **/
> EFI_STATUS
> EFIAPI
> ProcessThisCapsuleImage (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> - IN CHAR16 *CapFileName, OPTIONAL
> OUT BOOLEAN *ResetRequired OPTIONAL
> );
>
> /**
> Function indicate the current completion progress of the firmware
> @@ -215,36 +183,20 @@ InitCapsulePtr (
> VOID
> )
> {
> EFI_PEI_HOB_POINTERS HobPointer;
> UINTN Index;
> - UINTN Index2;
> - UINTN Index3;
> - UINTN CapsuleNameNumber;
> - UINTN CapsuleNameTotalNumber;
> - UINTN CapsuleNameCapsuleTotalNumber;
> - VOID **CapsuleNameCapsulePtr;
> - EFI_PHYSICAL_ADDRESS *CapsuleNameAddress;
> -
> - CapsuleNameNumber = 0;
> - CapsuleNameTotalNumber = 0;
> - CapsuleNameCapsuleTotalNumber = 0;
> - CapsuleNameCapsulePtr = NULL;
>
> //
> // Find all capsule images from hob
> //
> HobPointer.Raw = GetHobList ();
> while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE,
> HobPointer.Raw)) != NULL) {
> if (!IsValidCapsuleHeader((VOID *)(UINTN)HobPointer.Capsule-
> >BaseAddress, HobPointer.Capsule->Length)) {
> HobPointer.Header->HobType = EFI_HOB_TYPE_UNUSED; // Mark this
> hob as invalid
> } else {
> - if (IsCapsuleNameCapsule((VOID *)(UINTN)HobPointer.Capsule-
> >BaseAddress)) {
> - CapsuleNameCapsuleTotalNumber++;
> - } else {
> - mCapsuleTotalNumber++;
> - }
> + mCapsuleTotalNumber++;
> }
> HobPointer.Raw = GET_NEXT_HOB (HobPointer);
> }
>
> DEBUG ((DEBUG_INFO, "mCapsuleTotalNumber - 0x%x\n",
> mCapsuleTotalNumber));
> @@ -270,76 +222,19 @@ InitCapsulePtr (
> mCapsuleTotalNumber = 0;
> return ;
> }
> SetMemN (mCapsuleStatusArray, sizeof (EFI_STATUS) *
> mCapsuleTotalNumber, EFI_NOT_READY);
>
> - if (CapsuleNameCapsuleTotalNumber != 0) {
> - CapsuleNameCapsulePtr = (VOID **) AllocateZeroPool (sizeof (VOID *) *
> CapsuleNameCapsuleTotalNumber);
> - if (CapsuleNameCapsulePtr == NULL) {
> - DEBUG ((DEBUG_ERROR, "Allocate CapsuleNameCapsulePtr fail!\n"));
> - FreePool (mCapsulePtr);
> - FreePool (mCapsuleStatusArray);
> - mCapsulePtr = NULL;
> - mCapsuleStatusArray = NULL;
> - mCapsuleTotalNumber = 0;
> - return ;
> - }
> - }
> -
> //
> // Find all capsule images from hob
> //
> HobPointer.Raw = GetHobList ();
> - Index = 0;
> - Index2 = 0;
> + Index = 0;
> while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE,
> HobPointer.Raw)) != NULL) {
> - if (!IsCapsuleNameCapsule ((VOID *) (UINTN) HobPointer.Capsule-
> >BaseAddress)) {
> - mCapsulePtr [Index++] = (VOID *) (UINTN) HobPointer.Capsule-
> >BaseAddress;
> - } else {
> - CapsuleNameCapsulePtr [Index2++] = (VOID *) (UINTN)
> HobPointer.Capsule->BaseAddress;
> - }
> + mCapsulePtr [Index++] = (VOID *) (UINTN) HobPointer.Capsule-
> >BaseAddress;
> HobPointer.Raw = GET_NEXT_HOB (HobPointer);
> }
> -
> - //
> - // Find Capsule On Disk Names
> - //
> - for (Index = 0; Index < CapsuleNameCapsuleTotalNumber; Index ++) {
> - CapsuleNameAddress = ValidateCapsuleNameCapsuleIntegrity
> (CapsuleNameCapsulePtr[Index], &CapsuleNameNumber);
> - if (CapsuleNameAddress != NULL ) {
> - CapsuleNameTotalNumber += CapsuleNameNumber;
> - }
> - }
> -
> - if (CapsuleNameTotalNumber == mCapsuleTotalNumber) {
> - mCapsuleNamePtr = (CHAR16 **) AllocateZeroPool (sizeof (CHAR16 *) *
> mCapsuleTotalNumber);
> - if (mCapsuleNamePtr == NULL) {
> - DEBUG ((DEBUG_ERROR, "Allocate mCapsuleNamePtr fail!\n"));
> - FreePool (mCapsulePtr);
> - FreePool (mCapsuleStatusArray);
> - FreePool (CapsuleNameCapsulePtr);
> - mCapsulePtr = NULL;
> - mCapsuleStatusArray = NULL;
> - mCapsuleTotalNumber = 0;
> - return ;
> - }
> -
> - for (Index = 0, Index3 = 0; Index < CapsuleNameCapsuleTotalNumber;
> Index ++) {
> - CapsuleNameAddress = ValidateCapsuleNameCapsuleIntegrity
> (CapsuleNameCapsulePtr[Index], &CapsuleNameNumber);
> - if (CapsuleNameAddress != NULL ) {
> - for (Index2 = 0; Index2 < CapsuleNameNumber; Index2 ++) {
> - mCapsuleNamePtr[Index3 ++] = (CHAR16 *)(UINTN)
> CapsuleNameAddress[Index2];
> - }
> - }
> - }
> - } else {
> - mCapsuleNamePtr = NULL;
> - }
> -
> - if (CapsuleNameCapsulePtr != NULL) {
> - FreePool (CapsuleNameCapsulePtr);
> - }
> }
>
> /**
> This function returns if all capsule images are processed.
>
> @@ -499,11 +394,10 @@ ProcessTheseCapsules (
> EFI_CAPSULE_HEADER *CapsuleHeader;
> UINT32 Index;
> ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;
> UINT16 EmbeddedDriverCount;
> BOOLEAN ResetRequired;
> - CHAR16 *CapsuleName;
>
> REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE |
> PcdGet32(PcdStatusCodeSubClassCapsule) |
> PcdGet32(PcdCapsuleStatusCodeProcessCapsulesBegin)));
>
> if (FirstRound) {
> InitCapsulePtr ();
> @@ -512,11 +406,10 @@ ProcessTheseCapsules (
> if (mCapsuleTotalNumber == 0) {
> //
> // We didn't find a hob, so had no errors.
> //
> DEBUG ((DEBUG_ERROR, "We can not find capsule data in capsule update
> boot mode.\n"));
> - mNeedReset = TRUE;
> return EFI_SUCCESS;
> }
>
> if (AreAllImagesProcessed ()) {
> return EFI_SUCCESS;
> @@ -535,15 +428,14 @@ ProcessTheseCapsules (
> //
> // If Windows UX capsule exist, process it first
> //
> for (Index = 0; Index < mCapsuleTotalNumber; Index++) {
> CapsuleHeader = (EFI_CAPSULE_HEADER*) mCapsulePtr [Index];
> - CapsuleName = (mCapsuleNamePtr == NULL) ? NULL :
> mCapsuleNamePtr[Index];
> if (CompareGuid (&CapsuleHeader->CapsuleGuid,
> &gWindowsUxCapsuleGuid)) {
> DEBUG ((DEBUG_INFO, "ProcessThisCapsuleImage (Ux) - 0x%x\n",
> CapsuleHeader));
> DEBUG ((DEBUG_INFO, "Display logo capsule is found.\n"));
> - Status = ProcessThisCapsuleImage (CapsuleHeader, CapsuleName, NULL);
> + Status = ProcessThisCapsuleImage (CapsuleHeader, NULL);
> mCapsuleStatusArray [Index] = EFI_SUCCESS;
> DEBUG((DEBUG_INFO, "ProcessThisCapsuleImage (Ux) - %r\n", Status));
> break;
> }
> }
> @@ -557,11 +449,10 @@ ProcessTheseCapsules (
> if (mCapsuleStatusArray [Index] != EFI_NOT_READY) {
> // already processed
> continue;
> }
> CapsuleHeader = (EFI_CAPSULE_HEADER*) mCapsulePtr [Index];
> - CapsuleName = (mCapsuleNamePtr == NULL) ? NULL :
> mCapsuleNamePtr[Index];
> if (!CompareGuid (&CapsuleHeader->CapsuleGuid,
> &gWindowsUxCapsuleGuid)) {
> //
> // Call capsule library to process capsule image.
> //
> EmbeddedDriverCount = 0;
> @@ -578,11 +469,11 @@ ProcessTheseCapsules (
> }
>
> if ((!FirstRound) || (EmbeddedDriverCount == 0)) {
> DEBUG((DEBUG_INFO, "ProcessThisCapsuleImage - 0x%x\n",
> CapsuleHeader));
> ResetRequired = FALSE;
> - Status = ProcessThisCapsuleImage (CapsuleHeader, CapsuleName,
> &ResetRequired);
> + Status = ProcessThisCapsuleImage (CapsuleHeader, &ResetRequired);
> mCapsuleStatusArray [Index] = Status;
> DEBUG((DEBUG_INFO, "ProcessThisCapsuleImage - %r\n", Status));
>
> if (Status != EFI_NOT_READY) {
> if (EFI_ERROR(Status)) {
> @@ -637,12 +528,11 @@ DoResetSystem (
> This routine is called to process capsules.
>
> Caution: This function may receive untrusted input.
>
> The capsules reported in EFI_HOB_UEFI_CAPSULE are processed.
> - If there is no EFI_HOB_UEFI_CAPSULE, it means error occurs, force reset to
> - normal boot path.
> + If there is no EFI_HOB_UEFI_CAPSULE, this routine does nothing.
>
> This routine should be called twice in BDS.
> 1) The first call must be before EndOfDxe. The system capsules is processed.
> If device capsule FMP protocols are exposted at this time and device FMP
> capsule has zero EmbeddedDriverCount, the device capsules are
> processed.
> diff --git
> a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
> index 0ec5f20676..6ad766d65a 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
> +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
> @@ -1,9 +1,9 @@
> /** @file
> DXE capsule report related function.
>
> - Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #include <PiDxe.h>
> @@ -27,22 +27,10 @@
> #include <Library/DevicePathLib.h>
> #include <Library/CapsuleLib.h>
>
> #include <IndustryStandard/WindowsUxCapsule.h>
>
> -/**
> - This routine is called to clear CapsuleOnDisk Relocation Info variable.
> - Total Capsule On Disk length is recorded in this variable
> -
> - @retval EFI_SUCCESS Capsule On Disk flags are cleared
> -
> -**/
> -EFI_STATUS
> -CoDClearCapsuleRelocationInfo(
> - VOID
> - );
> -
> /**
> Get current capsule last variable index.
>
> @return Current capsule last variable index.
> @retval -1 No current capsule last variable.
> @@ -184,55 +172,44 @@ RecordCapsuleStatusVariable (
> @param[in] CapsuleHeader The capsule image header
> @param[in] CapsuleStatus The capsule process stauts
> @param[in] PayloadIndex FMP payload index
> @param[in] ImageHeader FMP image header
> @param[in] FmpDevicePath DevicePath associated with the FMP producer
> - @param[in] CapFileName Capsule file name
>
> @retval EFI_SUCCESS The capsule status variable is recorded.
> @retval EFI_OUT_OF_RESOURCES No resource to record the capsule status
> variable.
> **/
> EFI_STATUS
> RecordFmpCapsuleStatusVariable (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> IN EFI_STATUS CapsuleStatus,
> IN UINTN PayloadIndex,
> IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
> *ImageHeader,
> - IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath, OPTIONAL
> - IN CHAR16 *CapFileName OPTIONAL
> + IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath OPTIONAL
> )
> {
> EFI_CAPSULE_RESULT_VARIABLE_HEADER *CapsuleResultVariableHeader;
> EFI_CAPSULE_RESULT_VARIABLE_FMP *CapsuleResultVariableFmp;
> EFI_STATUS Status;
> UINT8 *CapsuleResultVariable;
> UINTN CapsuleResultVariableSize;
> CHAR16 *DevicePathStr;
> UINTN DevicePathStrSize;
> - UINTN CapFileNameSize;
> -
> - DevicePathStr = NULL;
> - CapFileNameSize = sizeof(CHAR16);
>
> + DevicePathStr = NULL;
> if (FmpDevicePath != NULL) {
> DevicePathStr = ConvertDevicePathToText (FmpDevicePath, FALSE, FALSE);
> }
> if (DevicePathStr != NULL) {
> DevicePathStrSize = StrSize(DevicePathStr);
> } else {
> DevicePathStrSize = sizeof(CHAR16);
> }
> -
> - if (CapFileName != NULL) {
> - CapFileNameSize = StrSize(CapFileName);
> - }
> -
> //
> - // Allocate room for CapsuleFileName.
> + // Allocate zero CHAR16 for CapsuleFileName.
> //
> - CapsuleResultVariableSize =
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) +
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + CapFileNameSize +
> DevicePathStrSize;
> -
> + CapsuleResultVariableSize =
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) +
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + sizeof(CHAR16) +
> DevicePathStrSize;
> CapsuleResultVariable = AllocateZeroPool (CapsuleResultVariableSize);
> if (CapsuleResultVariable == NULL) {
> return EFI_OUT_OF_RESOURCES;
> }
> CapsuleResultVariableHeader = (VOID *)CapsuleResultVariable;
> @@ -246,17 +223,12 @@ RecordFmpCapsuleStatusVariable (
> CapsuleResultVariableFmp = (VOID *)(CapsuleResultVariable +
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER));
> CapsuleResultVariableFmp->Version = 0x1;
> CapsuleResultVariableFmp->PayloadIndex = (UINT8)PayloadIndex;
> CapsuleResultVariableFmp->UpdateImageIndex = ImageHeader-
> >UpdateImageIndex;
> CopyGuid (&CapsuleResultVariableFmp->UpdateImageTypeId,
> &ImageHeader->UpdateImageTypeId);
> -
> - if (CapFileName != NULL) {
> - CopyMem((UINT8 *)CapsuleResultVariableFmp +
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP), CapFileName,
> CapFileNameSize);
> - }
> -
> if (DevicePathStr != NULL) {
> - CopyMem ((UINT8 *)CapsuleResultVariableFmp +
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + CapFileNameSize,
> DevicePathStr, DevicePathStrSize);
> + CopyMem ((UINT8 *)CapsuleResultVariableFmp +
> sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + sizeof(CHAR16),
> DevicePathStr, DevicePathStrSize);
> FreePool (DevicePathStr);
> DevicePathStr = NULL;
> }
>
> Status = EFI_SUCCESS;
> @@ -426,35 +398,10 @@ InitCapsuleUpdateVariable (
> }
> Index++;
> }
> }
>
> -/**
> - Initialize capsule relocation info variable.
> -**/
> -VOID
> -InitCapsuleRelocationInfo (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock;
> -
> - CoDClearCapsuleRelocationInfo();
> -
> - //
> - // Unlock Capsule On Disk relocation Info variable only when Capsule On
> Disk flag is enabled
> - //
> - if (!CoDCheckCapsuleOnDiskFlag()) {
> - Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL,
> (VOID **) &VariableLock);
> - if (!EFI_ERROR (Status)) {
> - Status = VariableLock->RequestToLock (VariableLock,
> COD_RELOCATION_INFO_VAR_NAME, &gEfiCapsuleVendorGuid);
> - ASSERT_EFI_ERROR (Status);
> - }
> - }
> -}
> -
> /**
> Initialize capsule related variables.
> **/
> VOID
> InitCapsuleVariable (
> @@ -462,12 +409,10 @@ InitCapsuleVariable (
> )
> {
> InitCapsuleUpdateVariable();
> InitCapsuleMaxVariable();
> InitCapsuleLastVariable();
> - InitCapsuleRelocationInfo();
> -
> //
> // No need to clear L"Capsule####", because OS/APP should refer
> L"CapsuleLast"
> // to check status and delete them.
> //
> }
> diff --git
> a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLibNull.c
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLibNull.c
> index b09631830f..dc67fcbe20 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLibNull.c
> +++
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLibNull.c
> @@ -1,11 +1,11 @@
> /** @file
> DXE capsule report related function.
> Dummy function for runtime module, because CapsuleDxeRuntime
> does not need record capsule status variable.
>
> - Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #include <PiDxe.h>
> @@ -37,23 +37,21 @@ RecordCapsuleStatusVariable (
> @param[in] CapsuleHeader The capsule image header
> @param[in] CapsuleStatus The capsule process stauts
> @param[in] PayloadIndex FMP payload index
> @param[in] ImageHeader FMP image header
> @param[in] FmpDevicePath DevicePath associated with the FMP producer
> - @param[in] CapFileName Capsule file name
>
> @retval EFI_SUCCESS The capsule status variable is recorded.
> @retval EFI_OUT_OF_RESOURCES No resource to record the capsule status
> variable.
> **/
> EFI_STATUS
> RecordFmpCapsuleStatusVariable (
> IN EFI_CAPSULE_HEADER *CapsuleHeader,
> IN EFI_STATUS CapsuleStatus,
> IN UINTN PayloadIndex,
> IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER
> *ImageHeader,
> - IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath, OPTIONAL
> - IN CHAR16 *CapFileName OPTIONAL
> + IN EFI_DEVICE_PATH_PROTOCOL *FmpDevicePath OPTIONAL
> )
> {
> return EFI_UNSUPPORTED;
> }
>
> diff --git
> a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
> index bf56f4623f..2c93e68700 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
> +++
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
> @@ -1,11 +1,11 @@
> ## @file
> # Capsule library instance for DXE_RUNTIME_DRIVER.
> #
> # Capsule library instance for DXE_RUNTIME_DRIVER module types.
> #
> -# Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> ##
>
> [Defines]
> @@ -66,9 +66,8 @@
> gEfiCapsuleReportGuid
> gEfiCapsuleVendorGuid ## SOMETIMES_CONSUMES ##
> Variable:L"CapsuleUpdateData"
> gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event
> gEfiEventReadyToBootGuid ## CONSUMES ## Event
> gEfiEventVirtualAddressChangeGuid ## CONSUMES ## Event
> - gEdkiiCapsuleOnDiskNameGuid ## SOMETIMES_CONSUMES ##
> GUID
>
> [Depex]
> gEfiVariableWriteArchProtocolGuid
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.c
> b/MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.c
> index 55985abd78..06a1abe16b 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.c
> +++ b/MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.c
> @@ -1,9 +1,9 @@
> /** @file
> Null Dxe Capsule Library instance does nothing and returns unsupport
> status.
>
> -Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
> #include <Uefi.h>
> #include <Library/CapsuleLib.h>
> @@ -83,88 +83,5 @@ ProcessCapsules (
> )
> {
> return EFI_UNSUPPORTED;
> }
>
> -
> -/**
> - This routine is called to check if CapsuleOnDisk flag in OsIndications Variable
> - is enabled.
> -
> - @retval TRUE Flag is enabled
> - @retval FALSE Flag is not enabled
> -
> -**/
> -BOOLEAN
> -EFIAPI
> -CoDCheckCapsuleOnDiskFlag(
> - VOID
> - )
> -{
> - return FALSE;
> -}
> -
> -/**
> - This routine is called to clear CapsuleOnDisk flags including OsIndications
> and BootNext variable.
> -
> - @retval EFI_SUCCESS All Capsule On Disk flags are cleared
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDClearCapsuleOnDiskFlag(
> - VOID
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> -
> -/**
> - Relocate Capsule on Disk from EFI system partition.
> -
> - Two solution to deliver Capsule On Disk:
> - Solution A: If PcdCapsuleInRamSupport is enabled, relocate Capsule On
> Disk to memory and call UpdateCapsule().
> - Solution B: If PcdCapsuleInRamSupport is disabled, relocate Capsule On
> Disk to a platform-specific NV storage
> - device with BlockIo protocol.
> -
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - Side Effects:
> - Capsule Delivery Supported Flag in OsIndication variable and BootNext
> variable will be cleared.
> - Solution B: Content corruption. Block IO write directly touches low level
> write. Orignal partitions, file
> - systems of the relocation device will be corrupted.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated. Input 0 means no
> retry.
> -
> - @retval EFI_SUCCESS Capsule on Disk images are successfully relocated.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDRelocateCapsule(
> - UINTN MaxRetry
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> -
> -/**
> - Remove the temp file from the root of EFI System Partition.
> - Device enumeration like USB costs time, user can input MaxRetry to tell
> function to retry.
> - Function will stall 100ms between each retry.
> -
> - @param[in] MaxRetry Max Connection Retry. Stall 100ms between
> each connection try to ensure
> - devices like USB can get enumerated. Input 0 means no
> retry.
> -
> - @retval EFI_SUCCESS Remove the temp file successfully.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -CoDRemoveTempFile (
> - UINTN MaxRetry
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> diff --git a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec
> index 08b3cbd7f2..2dee139ba3 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -397,13 +397,10 @@
> gS3StorageDeviceInitListGuid = { 0x310e9b8c, 0xcf90, 0x421e, { 0x8e, 0x9b,
> 0x9e, 0xef, 0xb6, 0x17, 0xc8, 0xef } }
>
> ## Include/Guid/SerialPortLibVendor.h
> gEdkiiSerialPortLibVendorGuid = { 0xD3987D4B, 0x971A, 0x435F, { 0x8C,
> 0xAF, 0x49, 0x67, 0xEB, 0x62, 0x72, 0x41 } }
>
> - ## GUID indicates the capsule is to store Capsule On Disk file names.
> - gEdkiiCapsuleOnDiskNameGuid = { 0x98c80a4f, 0xe16b, 0x4d11, { 0x93,
> 0x9a, 0xab, 0xe5, 0x61, 0x26, 0x3, 0x30 } }
> -
> [Ppis]
> ## Include/Ppi/AtaController.h
> gPeiAtaControllerPpiGuid = { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0, 0x7a,
> 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }}
>
> ## Include/Ppi/UsbHostController.h
> @@ -470,14 +467,10 @@
> gEdkiiPeiAtaPassThruPpiGuid = { 0xa16473fd, 0xd474, 0x4c89, { 0xae,
> 0xc7, 0x90, 0xb8, 0x3c, 0x73, 0x86, 0x9 } }
>
> ## Include/Ppi/Debug.h
> gEdkiiDebugPpiGuid = { 0x999e699c, 0xb013, 0x475e, { 0xb1,
> 0x7b, 0xf3, 0xa8, 0xae, 0x5c, 0x48, 0x75 } }
>
> - ## Include/Ppi/CapsuleOnDisk.h
> - gEdkiiPeiCapsuleOnDiskPpiGuid = { 0x71a9ea61, 0x5a35, 0x4a5d,
> { 0xac, 0xef, 0x9c, 0xf8, 0x6d, 0x6d, 0x67, 0xe0 } }
> - gEdkiiPeiBootInCapsuleOnDiskModePpiGuid = { 0xb08a11e4, 0xe2b7,
> 0x4b75, { 0xb5, 0x15, 0xaf, 0x61, 0x6, 0x68, 0xbf, 0xd1 } }
> -
> [Protocols]
> ## Load File protocol provides capability to load and unload EFI image into
> memory and execute it.
> # Include/Protocol/LoadPe32Image.h
> # This protocol is deprecated. Native EDKII module should NOT use this
> protocol to load/unload image.
> # If developer need implement such functionality, they should use
> BasePeCoffLib.
> @@ -1483,26 +1476,10 @@
>
> ## Indicates the allowable maximum number of Reset Filters, Reset
> Notifications or Reset Handlers in PEI phase.
> # @Prompt Maximum Number of PEI Reset Filters, Reset Notifications or
> Reset Handlers.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdMaximumPeiResetNotifies|0x10|UI
> NT32|0x0000010A
>
> - ## Capsule On Disk is to deliver capsules via files on Mass Storage
> device.<BR><BR>
> - # This PCD indicates if the Capsule On Disk is supported.<BR>
> - # TRUE - Capsule On Disk is supported.<BR>
> - # FALSE - Capsule On Disk is not supported.<BR>
> - # If platform does not use this feature, this PCD should be set to
> FALSE.<BR><BR>
> - # Two sulotions to deliver Capsule On Disk:<BR>
> - # a) If PcdCapsuleInRamSupport = TRUE, Load Capsule On Disk image out
> of TCB, and reuse
> - # Capsule In Ram to deliver capsule.<BR>
> - # b) If PcdCapsuleInRamSupport = FALSE, Relocate Capsule On Disk image
> to RootDir out
> - # of TCB, and reuse FatPei to load capsules from external storage.<BR>
> - # Note:<BR>
> - # If Both Capsule In Ram and Capsule On Disk are provisioned at the same
> time, the Capsule
> - # On Disk will be bypassed.
> - # @Prompt Enable Capsule On Disk support.
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport|FALSE|BOO
> LEAN|0x0000002d
> -
> [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.
> # @Prompt Console output row.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow|25|UINT32|0x4000000
> 6
> @@ -1958,21 +1935,10 @@
> # The file name must be the 8.3 format.
> # The PCD data must be in UNICODE format.
> # @Prompt Recover file name in PEI phase
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdRecoveryFileName|L"FVMAIN.FV"|
> VOID*|0x30001045
>
> - ## This is Capsule Temp Relocation file name in PEI phase.
> - # The file must be in the root directory.
> - # The file name must be the 8.3 format.
> - # The PCD data must be in UNICODE format.
> - # CapsuleOnDiskLoadPei PEI module will set value of this PCD to
> PcdRecoveryFileName, then
> - # leverage recovery to get Capsule On Disk Temp Relocation file.
> - # Note: The file name must be shorter than PcdRecoveryFileName,
> otherwise CapsuleOnDiskLoadPei
> - # PEI module will fail to get Capsule On Disk Temp Relocation file.
> - # @Prompt Capsule On Disk Temp Relocation file name in PEI phase
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdCoDRelocationFileName|L"TempCo
> d.tmp"|VOID*|0x30001048
> -
> ## This PCD hold a list GUIDs for the ImageTypeId to indicate the
> # FMP capsule is a system FMP.
> # @Prompt A list of system FMP ImageTypeId GUIDs
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGu
> id|{0x0}|VOID*|0x30001046
>
> @@ -1980,24 +1946,10 @@
> # enabled on AMD processors supporting the Secure Encrypted
> Virtualization (SEV) feature.
> # This mask should be applied when creating 1:1 virtual to physical mapping
> tables.
> # @Prompt The address mask when memory encryption is enabled.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0|UINT64|0x30001047
>
> - ## Capsule In Ram is to use memory to deliver the capsules that will be
> processed after system
> - # reset.<BR><BR>
> - # This PCD indicates if the Capsule In Ram is supported.<BR>
> - # TRUE - Capsule In Ram is supported.<BR>
> - # FALSE - Capsule In Ram is not supported.
> - # @Prompt Enable Capsule In Ram support.
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleInRamSupport|TRUE|BOOL
> EAN|0x0000002e
> -
> - ## Full device path of plaform specific device to store Capsule On Disk temp
> relocation file.<BR>
> - # If this PCD is set, Capsule On Disk temp relocation file will be stored in the
> device specified
> - # by this PCD, instead of the EFI System Partition that stores capsule image
> file.
> - # @Prompt Capsule On Disk relocation device path.
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdCodRelocationDevPath|{0xFF}|VOI
> D*|0x0000002f
> -
> [PcdsPatchableInModule]
> ## Specify memory size with page number for PEI code when
> # Loading Module at Fixed Address feature is enabled.
> # The value will be set by the build tool.
> # @Prompt LMFA PEI code page number.
> diff --git a/MdeModulePkg/MdeModulePkg.dsc
> b/MdeModulePkg/MdeModulePkg.dsc
> index 6ca7d9ade4..f32adc3839 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -197,13 +197,10 @@
> gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x06
> gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizeNonPopulateCapsule|0x0
> gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizePopulateCapsule|0x0
> gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries|28
>
> -[PcdsDynamicExDefault]
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdRecoveryFileName|L"FVMAIN.FV"
> -
> [Components]
> MdeModulePkg/Application/HelloWorld/HelloWorld.inf
> MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf
> MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo.inf
>
> @@ -334,11 +331,10 @@
>
> NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMainte
> nanceManagerUiLib.inf
> }
>
> MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManager
> Dxe.inf
>
> MdeModulePkg/Universal/BootManagerPolicyDxe/BootManagerPolicyDxe.i
> nf
> MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
> -
> MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.in
> f
> MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
> MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
>
> MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleD
> xe.inf
>
> MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDx
> e.inf
> diff --git a/MdeModulePkg/MdeModulePkg.uni
> b/MdeModulePkg/MdeModulePkg.uni
> index 06356407fb..ed8ac9eadc 100644
> --- a/MdeModulePkg/MdeModulePkg.uni
> +++ b/MdeModulePkg/MdeModulePkg.uni
> @@ -1064,19 +1064,10 @@
> #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdRecoveryFileName_HELP
> #language en-US "This is recover file name in PEI phase.\n"
> "The file must be in the root
> directory.\n"
> "The file name must be the 8.3
> format.\n"
> "The PCD data must be in
> UNICODE format."
>
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCoDRelocationFileName_PRO
> MPT #language en-US "Capsule On Disk Temp Relocation file name in PEI
> phase"
> -
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCoDRelocationFileName_HELP
> #language en-US "This is Capsule Temp Relocation file name in PEI
> phase.<BR>"
> - "The file must be in the root
> directory.<BR>"
> - "The file name must be the 8.3
> format.<BR>"
> - "The PCD data must be in
> UNICODE format.<BR>"
> - "CapsuleOnDiskLoadPei PEI
> module will set value of this PCD to PcdRecoveryFileName, then leverage
> recovery to get Capsule On Disk Temp Relocation file.<BR>"
> - "Note: The file name must be
> shorter than PcdRecoveryFileName, otherwise CapsuleOnDiskLoadPei PEI
> module will fail to get Capsule On Disk Temp Relocation file.<BR>"
> -
> #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSystemFmpCapsuleImageTyp
> eIdGuid_PROMPT #language en-US "A list of system FMP ImageTypeId
> GUIDs"
>
> #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSystemFmpCapsuleImageTyp
> eIdGuid_HELP #language en-US "This PCD hold a list GUIDs for the
> ImageTypeId to indicate the\n"
> "FMP capsule is a system
> FMP."
>
> @@ -1138,35 +1129,10 @@
>
> #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdPteMemoryEncryptionAddres
> sOrMask_HELP #language en-US "This PCD holds the address mask for page
> table entries when memory encryption is\n"
> "enabled on AMD
> processors supporting the Secure Encrypted Virtualization (SEV) feature.\n"
> "This mask should be
> applied when creating 1:1 virtual to physical mapping tables."
>
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCapsuleOnDiskSupport_PRO
> MPT #language en-US "Enable Capsule On Disk support"
> -
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCapsuleOnDiskSupport_HELP
> #language en-US "Capsule On Disk is to deliver capsules via files on Mass
> Storage device.<BR><BR>"
> - "This PCD indicates if the
> Capsule On Disk is supported.<BR>"
> - " TRUE - Capsule On Disk is
> supported.<BR>"
> - " FALSE - Capsule On Disk is not
> supported.<BR>"
> - "If platform does not use this
> feature, this PCD should be set to FALSE.<BR><BR>"
> - "Two sulotions to deliver
> Capsule On Disk:<BR>"
> - " a) If
> PcdCapsuleInRamSupport = TRUE, Load Capsule On Disk image out of TCB,
> and reuse Capsule In Ram to deliver capsule.<BR>"
> - " b) If
> PcdCapsuleInRamSupport = FALSE, Relocate Capsule On Disk image to
> RootDir out of TCB, and reuse FatPei to load capsules from external
> storage.<BR>"
> - "Note:<BR>"
> - "If Both Capsule In Ram and
> Capsule On Disk are provisioned at the same time, the Capsule On Disk will
> be bypassed."
> -
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCapsuleInRamSupport_PROM
> PT #language en-US "Enable Capsule In Ram support"
> -
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCapsuleInRamSupport_HELP
> #language en-US "Capsule In Ram is to use memory to deliver the capsules
> that will be processed after system reset.<BR><BR>"
> - "This PCD indicates if the
> Capsule In Ram is supported.<BR>"
> - " TRUE - Capsule In Ram is
> supported.<BR>"
> - " FALSE - Capsule In Ram is not
> supported."
> -
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCodRelocationDevPath_PRO
> MPT #language en-US "Capsule On Disk relacation device path."
> -
> -#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdCodRelocationDevPath_HELP
> #language en-US "Full device path of plaform specific device to store
> Capsule On Disk temp relocation file.<BR>"
> - "If this PCD is set, Capsule On
> Disk temp relocation file will be stored in the device specified by this PCD,
> instead of the EFI System Partition that stores capsule image file."
> -
> #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdNullPointerDetectionProperty
> Mask_PROMPT #language en-US "Enable NULL pointer detection"
>
> #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdNullPointerDetectionProperty
> Mask_HELP #language en-US "Mask to control the NULL address detection
> in code for different phases.\n"
> " If enabled, accessing
> NULL address in UEFI or SMM code can be caught.\n\n"
> " BIT0 - Enable NULL
> pointer detection for UEFI.\n"
> diff --git a/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> b/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> index 3d13c725ce..6913389d34 100644
> --- a/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> +++ b/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> @@ -3,11 +3,11 @@
> #
> # When DxeCore dispatching all DXE driver, this module will produce
> architecture protocol
> # gEfiBdsArchProtocolGuid. After DxeCore finish dispatching, DxeCore will
> invoke Entry
> # interface of protocol gEfiBdsArchProtocolGuid, then BDS phase is entered.
> #
> -# Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> ##
>
> [Defines]
> @@ -93,11 +93,10 @@
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor ##
> CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareRevision ##
> CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand
> ## CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ##
> SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed ##
> CONSUMES
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport ##
> CONSUMES
>
> [Depex]
> TRUE
>
> [UserExtensions.TianoCore."ExtraFiles"]
> diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c
> b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c
> index 2a4ae9f488..9d312bd982 100644
> --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c
> +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c
> @@ -3,11 +3,11 @@
> When this module was dispatched by DxeCore, gEfiBdsArchProtocolGuid
> will be installed
> which contains interface of BdsEntry.
> After DxeCore finish DXE phase, gEfiBdsArchProtocolGuid->BdsEntry will be
> invoked
> to enter BDS phase.
>
> -Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
> (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
> @@ -550,14 +550,10 @@ BdsFormalizeOSIndicationVariable (
> EfiBootManagerFreeLoadOption (&BootManagerMenu);
> } else {
> OsIndicationSupport =
> EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY;
> }
>
> - if (PcdGetBool(PcdCapsuleOnDiskSupport)) {
> - OsIndicationSupport |=
> EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED;
> - }
> -
> Status = gRT->SetVariable (
> EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME,
> &gEfiGlobalVariableGuid,
> EFI_VARIABLE_BOOTSERVICE_ACCESS |
> EFI_VARIABLE_RUNTIME_ACCESS,
> sizeof(UINT64),
> diff --git
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> c
> b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> c
> deleted file mode 100644
> index ac96526bc2..0000000000
> ---
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> c
> +++ /dev/null
> @@ -1,442 +0,0 @@
> -/** @file
> - Recovery module.
> -
> - Caution: This module requires additional review when modified.
> - This module will have external input - Capsule-on-Disk Temp Relocation
> image.
> - This external input must be validated carefully to avoid security issue like
> - buffer overflow, integer overflow.
> -
> - RetrieveRelocatedCapsule() will receive untrusted input and do basic
> validation.
> -
> - Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> - SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -//
> -// The package level header files this module uses
> -//
> -#include <Uefi.h>
> -#include <PiPei.h>
> -
> -//
> -// The protocols, PPI and GUID defintions for this module
> -//
> -#include <Ppi/MasterBootMode.h>
> -#include <Ppi/FirmwareVolumeInfo.h>
> -#include <Ppi/ReadOnlyVariable2.h>
> -#include <Ppi/Capsule.h>
> -#include <Ppi/CapsuleOnDisk.h>
> -#include <Ppi/DeviceRecoveryModule.h>
> -
> -#include <Guid/FirmwareFileSystem2.h>
> -//
> -// The Library classes this module consumes
> -//
> -#include <Library/DebugLib.h>
> -#include <Library/PeimEntryPoint.h>
> -#include <Library/PeiServicesLib.h>
> -#include <Library/HobLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/PcdLib.h>
> -#include <Library/CapsuleLib.h>
> -#include <Library/ReportStatusCodeLib.h>
> -
> -/**
> - Loads a DXE capsule from some media into memory and updates the HOB
> table
> - with the DXE firmware volume information.
> -
> - @param[in] PeiServices General-purpose services that are available to
> every PEIM.
> - @param[in] This Indicates the EFI_PEI_RECOVERY_MODULE_PPI
> instance.
> -
> - @retval EFI_SUCCESS The capsule was loaded correctly.
> - @retval EFI_DEVICE_ERROR A device error occurred.
> - @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -LoadCapsuleOnDisk (
> - IN EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PEI_CAPSULE_ON_DISK_PPI *This
> - );
> -
> -EFI_PEI_CAPSULE_ON_DISK_PPI mCapsuleOnDiskPpi = {
> - LoadCapsuleOnDisk
> -};
> -
> -EFI_PEI_PPI_DESCRIPTOR mCapsuleOnDiskPpiList = {
> - (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> - &gEdkiiPeiCapsuleOnDiskPpiGuid,
> - &mCapsuleOnDiskPpi
> -};
> -
> -/**
> - Determine if capsule comes from memory by checking Capsule PPI.
> -
> - @param[in] PeiServices General purpose services available to every PEIM.
> -
> - @retval TRUE Capsule comes from memory.
> - @retval FALSE No capsule comes from memory.
> -
> -**/
> -static
> -BOOLEAN
> -CheckCapsuleFromRam (
> - IN CONST EFI_PEI_SERVICES **PeiServices
> - )
> -{
> - EFI_STATUS Status;
> - PEI_CAPSULE_PPI *Capsule;
> -
> - Status = PeiServicesLocatePpi (
> - &gEfiPeiCapsulePpiGuid,
> - 0,
> - NULL,
> - (VOID **) &Capsule
> - );
> - if (!EFI_ERROR(Status)) {
> - Status = Capsule->CheckCapsuleUpdate ((EFI_PEI_SERVICES
> **)PeiServices);
> - if (!EFI_ERROR(Status)) {
> - return TRUE;
> - }
> - }
> -
> - return FALSE;
> -}
> -
> -/**
> - Determine if it is a Capsule On Disk mode.
> -
> - @retval TRUE Capsule On Disk mode.
> - @retval FALSE Not capsule On Disk mode.
> -
> -**/
> -BOOLEAN
> -IsCapsuleOnDiskMode (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - UINTN Size;
> - EFI_PEI_READ_ONLY_VARIABLE2_PPI *PPIVariableServices;
> - BOOLEAN CodRelocInfo;
> -
> - Status = PeiServicesLocatePpi (
> - &gEfiPeiReadOnlyVariable2PpiGuid,
> - 0,
> - NULL,
> - (VOID **) &PPIVariableServices
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> - Size = sizeof (BOOLEAN);
> - Status = PPIVariableServices->GetVariable (
> - PPIVariableServices,
> - COD_RELOCATION_INFO_VAR_NAME,
> - &gEfiCapsuleVendorGuid,
> - NULL,
> - &Size,
> - &CodRelocInfo
> - );
> -
> - if (EFI_ERROR (Status) || Size != sizeof(BOOLEAN) || !CodRelocInfo) {
> - DEBUG (( DEBUG_ERROR, "Error Get CodRelocationInfo variable %r!\n",
> Status));
> - return FALSE;
> - }
> -
> - return TRUE;
> -}
> -
> -/**
> - Gets capsule images from relocated capsule buffer.
> - Create Capsule hob for each Capsule.
> -
> - Caution: This function may receive untrusted input.
> - Capsule-on-Disk Temp Relocation image is external input, so this function
> - will validate Capsule-on-Disk Temp Relocation image to make sure the
> content
> - is read within the buffer.
> -
> - @param[in] RelocCapsuleBuf Buffer pointer to the relocated capsule.
> - @param[in] RelocCapsuleTotalSize Total size of the relocated capsule.
> -
> - @retval EFI_SUCCESS Succeed to get capsules and create hob.
> - @retval Others Fail to get capsules and create hob.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -RetrieveRelocatedCapsule (
> - IN UINT8 *RelocCapsuleBuf,
> - IN UINTN RelocCapsuleTotalSize
> - )
> -{
> - EFI_STATUS Status;
> - UINTN Index;
> - UINT8 *CapsuleDataBufEnd;
> - UINT8 *CapsulePtr;
> - UINT32 CapsuleSize;
> - UINT64 TotalImageSize;
> - UINTN CapsuleNum;
> -
> - CapsuleNum = 0;
> -
> - //
> - // Temp file contains at least 2 capsule (including 1 capsule name capsule) &
> 1 UINT64
> - //
> - if (RelocCapsuleTotalSize < sizeof(UINT64) + sizeof(EFI_CAPSULE_HEADER)
> * 2) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - CopyMem(&TotalImageSize, RelocCapsuleBuf, sizeof(UINT64));
> -
> - DEBUG ((DEBUG_INFO, "ProcessRelocatedCapsule CapsuleBuf %x
> TotalCapSize %lx\n",
> - RelocCapsuleBuf, TotalImageSize));
> -
> - RelocCapsuleBuf += sizeof(UINT64);
> -
> - //
> - // TempCaspule file length check
> - //
> - if (MAX_ADDRESS - TotalImageSize <= sizeof(UINT64) ||
> - (UINT64)RelocCapsuleTotalSize != TotalImageSize + sizeof(UINT64) ||
> - (UINTN)(MAX_ADDRESS - (PHYSICAL_ADDRESS)(UINTN)RelocCapsuleBuf)
> <= TotalImageSize) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - CapsuleDataBufEnd = RelocCapsuleBuf + TotalImageSize;
> -
> - //
> - // TempCapsule file integrity check over Capsule Header to ensure no data
> corruption in NV Var & Relocation storage
> - //
> - CapsulePtr = RelocCapsuleBuf;
> -
> - while (CapsulePtr < CapsuleDataBufEnd) {
> - if ((CapsuleDataBufEnd - CapsulePtr) < sizeof(EFI_CAPSULE_HEADER) ||
> - ((EFI_CAPSULE_HEADER *)CapsulePtr)->CapsuleImageSize <
> sizeof(EFI_CAPSULE_HEADER) ||
> - (UINTN)(MAX_ADDRESS - (PHYSICAL_ADDRESS)(UINTN)CapsulePtr) <
> ((EFI_CAPSULE_HEADER *)CapsulePtr)->CapsuleImageSize
> - ) {
> - break;
> - }
> - CapsulePtr += ((EFI_CAPSULE_HEADER *)CapsulePtr)->CapsuleImageSize;
> - CapsuleNum ++;
> - }
> -
> - if (CapsulePtr != CapsuleDataBufEnd) {
> - Status = EFI_INVALID_PARAMETER;
> - goto EXIT;
> - }
> -
> - //
> - // Capsule count must be less than PcdCapsuleMax, avoid building too
> many CvHobs to occupy all the free space in HobList.
> - //
> - if (CapsuleNum > PcdGet16 (PcdCapsuleMax)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto EXIT;
> - }
> -
> - //
> - // Re-iterate the capsule buffer to create Capsule hob & Capsule Name Str
> Hob for each Capsule saved in relocated capsule file
> - //
> - CapsulePtr = RelocCapsuleBuf;
> - Index = 0;
> - while (CapsulePtr < CapsuleDataBufEnd) {
> - CapsuleSize = ((EFI_CAPSULE_HEADER *)CapsulePtr)->CapsuleImageSize;
> - BuildCvHob ((EFI_PHYSICAL_ADDRESS)(UINTN)CapsulePtr, CapsuleSize);
> -
> - DEBUG((DEBUG_INFO, "Capsule saved in address %x size %x\n",
> CapsulePtr, CapsuleSize));
> -
> - CapsulePtr += CapsuleSize;
> - Index++;
> - }
> -
> -EXIT:
> -
> - return Status;
> -}
> -
> -/**
> - Recovery module entrypoint
> -
> - @param[in] FileHandle Handle of the file being invoked.
> - @param[in] PeiServices Describes the list of possible PEI Services.
> -
> - @return EFI_SUCCESS Recovery module is initialized.
> -**/
> -EFI_STATUS
> -EFIAPI
> -InitializeCapsuleOnDiskLoad (
> - IN EFI_PEI_FILE_HANDLE FileHandle,
> - IN CONST EFI_PEI_SERVICES **PeiServices
> - )
> -{
> - EFI_STATUS Status;
> - UINTN BootMode;
> - UINTN FileNameSize;
> -
> - BootMode = GetBootModeHob();
> - ASSERT(BootMode == BOOT_ON_FLASH_UPDATE);
> -
> - //
> - // If there are capsules provisioned in memory, quit.
> - // Only one capsule resource is accept, CapsuleOnRam's priority is higher
> than CapsuleOnDisk.
> - //
> - if (CheckCapsuleFromRam(PeiServices)) {
> - DEBUG((DEBUG_ERROR, "Capsule On Memory Detected! Quit.\n"));
> - return EFI_ABORTED;
> - }
> -
> - DEBUG_CODE (
> - VOID *CapsuleOnDiskModePpi;
> -
> - if (!IsCapsuleOnDiskMode()){
> - return EFI_NOT_FOUND;
> - }
> -
> - //
> - // Check Capsule On Disk Relocation flag. If exists, load capsule & create
> Capsule Hob
> - //
> - Status = PeiServicesLocatePpi (
> - &gEdkiiPeiBootInCapsuleOnDiskModePpiGuid,
> - 0,
> - NULL,
> - (VOID **)&CapsuleOnDiskModePpi
> - );
> - if (EFI_ERROR(Status)) {
> - DEBUG((DEBUG_ERROR, "Locate CapsuleOnDiskModePpi error %x\n",
> Status));
> - return Status;
> - }
> - );
> -
> - Status = PeiServicesInstallPpi (&mCapsuleOnDiskPpiList);
> - ASSERT_EFI_ERROR (Status);
> -
> - FileNameSize = PcdGetSize (PcdCoDRelocationFileName);
> - Status = PcdSetPtrS (PcdRecoveryFileName, &FileNameSize, (VOID *)
> PcdGetPtr(PcdCoDRelocationFileName));
> - ASSERT_EFI_ERROR (Status);
> -
> - return Status;
> -}
> -
> -/**
> - Loads a DXE capsule from some media into memory and updates the HOB
> table
> - with the DXE firmware volume information.
> -
> - @param[in] PeiServices General-purpose services that are available to
> every PEIM.
> - @param[in] This Indicates the EFI_PEI_RECOVERY_MODULE_PPI
> instance.
> -
> - @retval EFI_SUCCESS The capsule was loaded correctly.
> - @retval EFI_DEVICE_ERROR A device error occurred.
> - @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -LoadCapsuleOnDisk (
> - IN EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PEI_CAPSULE_ON_DISK_PPI *This
> - )
> -{
> - EFI_STATUS Status;
> - EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *DeviceRecoveryPpi;
> - UINTN NumberRecoveryCapsules;
> - UINTN Instance;
> - UINTN CapsuleInstance;
> - UINTN CapsuleSize;
> - EFI_GUID CapsuleType;
> - VOID *CapsuleBuffer;
> -
> - DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Load Capsule On Disk Entry\n"));
> -
> - for (Instance = 0; ; Instance++) {
> - Status = PeiServicesLocatePpi (
> - &gEfiPeiDeviceRecoveryModulePpiGuid,
> - Instance,
> - NULL,
> - (VOID **)&DeviceRecoveryPpi
> - );
> - DEBUG ((DEBUG_INFO, "LoadCapsuleOnDisk - LocateRecoveryPpi (%d) -
> %r\n", Instance, Status));
> - if (EFI_ERROR (Status)) {
> - if (Instance == 0) {
> - REPORT_STATUS_CODE (
> - EFI_ERROR_CODE | EFI_ERROR_MAJOR,
> - (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND)
> - );
> - }
> - break;
> - }
> - NumberRecoveryCapsules = 0;
> - Status = DeviceRecoveryPpi->GetNumberRecoveryCapsules (
> - (EFI_PEI_SERVICES **)PeiServices,
> - DeviceRecoveryPpi,
> - &NumberRecoveryCapsules
> - );
> - DEBUG ((DEBUG_INFO, "LoadCapsuleOnDisk -
> GetNumberRecoveryCapsules (%d) - %r\n", NumberRecoveryCapsules,
> Status));
> - if (EFI_ERROR (Status)) {
> - continue;
> - }
> -
> - for (CapsuleInstance = 1; CapsuleInstance <= NumberRecoveryCapsules;
> CapsuleInstance++) {
> - CapsuleSize = 0;
> - Status = DeviceRecoveryPpi->GetRecoveryCapsuleInfo (
> - (EFI_PEI_SERVICES **)PeiServices,
> - DeviceRecoveryPpi,
> - CapsuleInstance,
> - &CapsuleSize,
> - &CapsuleType
> - );
> - DEBUG ((DEBUG_INFO, "LoadCapsuleOnDisk - GetRecoveryCapsuleInfo
> (%d - %x) - %r\n", CapsuleInstance, CapsuleSize, Status));
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> -
> - //
> - // Allocate the memory so that it gets preserved into DXE.
> - // Capsule is special because it may need to populate to system table
> - //
> - CapsuleBuffer = AllocateRuntimePages (EFI_SIZE_TO_PAGES
> (CapsuleSize));
> -
> - if (CapsuleBuffer == NULL) {
> - DEBUG ((DEBUG_ERROR, "LoadCapsuleOnDisk - AllocateRuntimePages
> fail\n"));
> - continue;
> - }
> -
> - Status = DeviceRecoveryPpi->LoadRecoveryCapsule (
> - (EFI_PEI_SERVICES **)PeiServices,
> - DeviceRecoveryPpi,
> - CapsuleInstance,
> - CapsuleBuffer
> - );
> - DEBUG ((DEBUG_INFO, "LoadCapsuleOnDisk - LoadRecoveryCapsule (%d)
> - %r\n", CapsuleInstance, Status));
> - if (EFI_ERROR (Status)) {
> - FreePages (CapsuleBuffer, EFI_SIZE_TO_PAGES(CapsuleSize));
> - break;
> - }
> -
> - //
> - // Capsule Update Mode, Split relocated Capsule buffer into different
> capsule vehical hobs.
> - //
> - Status = RetrieveRelocatedCapsule(CapsuleBuffer, CapsuleSize);
> -
> - break;
> - }
> -
> - if (EFI_ERROR (Status)) {
> - REPORT_STATUS_CODE (
> - EFI_ERROR_CODE | EFI_ERROR_MAJOR,
> - (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_EC_NO_RECOVERY_CAPSULE)
> - );
> - }
> -
> - return Status;
> - }
> -
> - //
> - // Any attack against GPT, Relocation Info Variable or temp relocation file
> will result in no Capsule HOB and return EFI_NOT_FOUND.
> - // After flow to DXE phase. since no capsule hob is detected. Platform will
> clear Info flag and force restart.
> - // No volunerability will be exposed
> - //
> -
> - return EFI_NOT_FOUND;
> -}
> diff --git
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> inf
> b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> inf
> deleted file mode 100644
> index b1f5620585..0000000000
> ---
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> inf
> +++ /dev/null
> @@ -1,64 +0,0 @@
> -## @file
> -# Load Capsule on Disk module.
> -#
> -# Load Capsule On Disk from Root Directory file system. Create CV hob
> -# based on temporary Capsule On Disk file.
> -#
> -# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -#
> -# SPDX-License-Identifier: BSD-2-Clause-Patent
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = CapsuleOnDiskLoadPei
> - MODULE_UNI_FILE = CapsuleOnDiskLoadPei.uni
> - FILE_GUID = 8ADEDF9E-2EC8-40fb-AE56-B76D90225D2D
> - MODULE_TYPE = PEIM
> - VERSION_STRING = 1.0
> - ENTRY_POINT = InitializeCapsuleOnDiskLoad
> -
> -#
> -# The following information is for reference only and not required by the
> build tools.
> -#
> -# VALID_ARCHITECTURES = IA32 X64 EBC
> -#
> -
> -[Sources]
> - CapsuleOnDiskLoadPei.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - MdeModulePkg/MdeModulePkg.dec
> -
> -[LibraryClasses]
> - PeimEntryPoint
> - DebugLib
> - HobLib
> - BaseMemoryLib
> - MemoryAllocationLib
> - ReportStatusCodeLib
> -
> -[Ppis]
> - gEdkiiPeiCapsuleOnDiskPpiGuid ## PRODUCES
> - gEfiPeiReadOnlyVariable2PpiGuid ## CONSUMES
> - gEdkiiPeiBootInCapsuleOnDiskModePpiGuid ## SOMETIMES_CONSUMES
> - gEfiPeiDeviceRecoveryModulePpiGuid ## CONSUMES
> - gEfiPeiCapsulePpiGuid ## CONSUMES
> -
> -[Guids]
> - gEfiCapsuleVendorGuid ## SOMETIMES_CONSUMES ## Variable
> L"CodRelocationInfo"
> -
> -[Pcd]
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCoDRelocationFileName
> ## CONSUMES
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleMax ##
> CONSUMES
> -
> -[PcdEx]
> - gEfiMdeModulePkgTokenSpaceGuid.PcdRecoveryFileName ##
> PRODUCES
> -
> -[Depex]
> - gEdkiiPeiBootInCapsuleOnDiskModePpiGuid
> -
> -[UserExtensions.TianoCore."ExtraFiles"]
> - CapsuleOnDiskLoadPeiExtra.uni
> diff --git
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> uni
> b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> uni
> deleted file mode 100644
> index c3eae6a5c2..0000000000
> ---
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.
> uni
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -// /** @file
> -// Caspule On Disk Load module.
> -//
> -// Load Capsule On Disk and build CV hob.
> -//
> -// Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -//
> -// SPDX-License-Identifier: BSD-2-Clause-Patent
> -//
> -// **/
> -
> -
> -#string STR_MODULE_ABSTRACT #language en-US "Caspule On Disk
> Load module."
> -
> -#string STR_MODULE_DESCRIPTION #language en-US "Load Capsule On
> Disk and build CV hob."
> diff --git
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei
> Extra.uni
> b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei
> Extra.uni
> deleted file mode 100644
> index 81034f6294..0000000000
> ---
> a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei
> Extra.uni
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -// /** @file
> -// CapsuleOnDiskLoadPei Localized Strings and Content
> -//
> -// Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -//
> -// SPDX-License-Identifier: BSD-2-Clause-Patent
> -//
> -// **/
> -
> -#string STR_PROPERTIES_MODULE_NAME
> -#language en-US
> -"CapsuleOnDiskLoad PEI Driver"
> -
> -
> diff --git
> a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> index 9da450722b..338577e293 100644
> ---
> a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> +++
> b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> @@ -88,11 +88,10 @@
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
> CONSUMES
>
> [Pcd]
> gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizeNonPopulateCapsule ##
> SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizePopulateCapsule ##
> SOMETIMES_CONSUMES # Populate Image requires reset support.
> - gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleInRamSupport ##
> CONSUMES
>
> [Pcd.X64]
> gEfiMdeModulePkgTokenSpaceGuid.PcdCapsulePeiLongModeStackSize
> ## SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ##
> SOMETIMES_CONSUMES
>
> diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleService.c
> b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleService.c
> index 77b8f00062..aaf819c4c6 100644
> --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleService.c
> +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleService.c
> @@ -2,11 +2,11 @@
> Capsule Runtime Driver produces two UEFI capsule runtime services.
> (UpdateCapsule, QueryCapsuleCapabilities)
> It installs the Capsule Architectural Protocol defined in PI1.0a to signify
> the capsule runtime services are ready.
>
> -Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> #include "CapsuleService.h"
> @@ -69,18 +69,10 @@ UpdateCapsule (
> BOOLEAN NeedReset;
> BOOLEAN InitiateReset;
> CHAR16 CapsuleVarName[30];
> CHAR16 *TempVarName;
>
> - //
> - // Check if platform support Capsule In RAM or not.
> - // Platform could choose to drop CapsulePei/CapsuleX64 and do not
> support Capsule In RAM.
> - //
> - if (!PcdGetBool(PcdCapsuleInRamSupport)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> //
> // Capsule Count can't be less than one.
> //
> if (CapsuleCount < 1) {
> return EFI_INVALID_PARAMETER;
> @@ -224,12 +216,10 @@ UpdateCapsule (
> return Status;
> }
>
> /**
> Returns if the capsule can be supported via UpdateCapsule().
> - Notice: When PcdCapsuleInRamSupport is unsupported, even this routine
> returns a valid answer,
> - the capsule still is unsupported via UpdateCapsule().
>
> @param CapsuleHeaderArray Virtual pointer to an array of virtual
> pointers to the capsules
> being passed into update capsule.
> @param CapsuleCount Number of pointers to EFI_CAPSULE_HEADER
> in
> CaspuleHeaderArray.
> --
> 2.16.2.windows.1
>
>
>
prev parent reply other threads:[~2019-06-21 2:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-21 2:02 [Patch] Revert "Capsule on Disk entire patch." Zhang, Chao B
2019-06-21 2:07 ` Wu, Hao A [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A093C8F3199@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox