> -----Original Message----- > From: Xu, Wei6 > Sent: Tuesday, June 25, 2019 2:51 PM > To: devel@edk2.groups.io > Cc: Wang, Jian J; Wu, Hao A; Zhang, Chao B > Subject: [edk2-devel][Patch] MdeModulePkg/CapsuleApp: Enhance > Capsule-On-Disk related functions. > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1840 > > 1. Introduce an internal header file to put definitions in it. > 2. Add missing '\n' in usage. > 3. Fix the dead loop of CapsuleApp -L. > 4. Fix the bug that CapsuleApp -OD cannot perform capsules in sub- > folder. > 5. Optimize the handling for option -NR and -OD to support both > 'CapsuleApp <Capsule> -OD -NR' and 'CapsuleApp <Capsule> -NR -OD'. > 6. Check if Capsule-On-Disk is supported by "OsIndicationsSupported" > variable firstly before processing capsules. If not supported, prompt > an error message and quit the process.
Acked-by: Hao A Wu <hao.a...@intel.com> Hello Chao, could you help to review this patch? Thanks in advance. Best Regards, Hao Wu > > Cc: Jian J Wang <jian.j.w...@intel.com> > Cc: Hao A Wu <hao.a...@intel.com> > Cc: Chao B Zhang <chao.b.zh...@intel.com> > Signed-off-by: Wei6 Xu <wei6...@intel.com> > --- > MdeModulePkg/Application/CapsuleApp/AppSupport.c | 13 +- > MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 215 ++------------- > --- > MdeModulePkg/Application/CapsuleApp/CapsuleApp.h | 240 > +++++++++++++++++++++ > MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 3 +- > MdeModulePkg/Application/CapsuleApp/CapsuleDump.c | 98 +-------- > .../Application/CapsuleApp/CapsuleOnDisk.c | 86 +++++--- > 6 files changed, 323 insertions(+), 332 deletions(-) > create mode 100644 > MdeModulePkg/Application/CapsuleApp/CapsuleApp.h > > diff --git a/MdeModulePkg/Application/CapsuleApp/AppSupport.c > b/MdeModulePkg/Application/CapsuleApp/AppSupport.c > index d9ce1b4843..8fe70dc3b6 100644 > --- a/MdeModulePkg/Application/CapsuleApp/AppSupport.c > +++ b/MdeModulePkg/Application/CapsuleApp/AppSupport.c > @@ -1,23 +1,14 @@ > /** @file > A shell application that triggers capsule update process. > > - Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > -#include <Uefi.h> > -#include <Library/BaseLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Protocol/SimpleFileSystem.h> > -#include <Protocol/ShellParameters.h> > -#include <Protocol/Shell.h> > -#include <Guid/FileInfo.h> > +#include "CapsuleApp.h" > > UINTN Argc; > CHAR16 **Argv; > EFI_SHELL_PROTOCOL *mShellProtocol = NULL; > > diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > index e3c591dbf3..3439ce5feb 100644 > --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > @@ -4,191 +4,19 @@ > Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > -#include <Uefi.h> > -#include <Library/BaseLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > -#include <Library/UefiLib.h> > -#include <Library/PrintLib.h> > -#include <Library/BmpSupportLib.h> > -#include <Protocol/GraphicsOutput.h> > -#include <Guid/GlobalVariable.h> > -#include <Guid/CapsuleReport.h> > -#include <Guid/SystemResourceTable.h> > -#include <Guid/FmpCapsule.h> > -#include <IndustryStandard/WindowsUxCapsule.h> > - > -#define CAPSULE_HEADER_SIZE 0x20 > - > -#define NESTED_CAPSULE_HEADER_SIZE SIZE_4KB > -#define SYSTEM_FIRMWARE_FLAG 0x50000 > -#define DEVICE_FIRMWARE_FLAG 0x78010 > - > -#define MAJOR_VERSION 1 > -#define MINOR_VERSION 0 > - > -#define MAX_CAPSULE_NUM 10 > - > -extern UINTN Argc; > -extern CHAR16 **Argv; > +#include "CapsuleApp.h" > > // > // Define how many block descriptors we want to test with. > // > UINTN NumberOfDescriptors = 1; > UINTN CapsuleFirstIndex; > UINTN CapsuleLastIndex; > > -/** > - Dump capsule information > - > - @param[in] CapsuleName The name of the capsule image. > - > - @retval EFI_SUCCESS The capsule information is dumped. > - @retval EFI_UNSUPPORTED Input parameter is not valid. > -**/ > -EFI_STATUS > -DumpCapsule ( > - IN CHAR16 *CapsuleName > - ); > - > -/** > - Dump capsule status variable. > - > - @retval EFI_SUCCESS The capsule status variable is dumped. > - @retval EFI_UNSUPPORTED Input parameter is not valid. > -**/ > -EFI_STATUS > -DumpCapsuleStatusVariable ( > - VOID > - ); > - > -/** > - Dump FMP protocol info. > -**/ > -VOID > -DumpFmpData ( > - VOID > - ); > - > -/** > - Dump FMP image data. > - > - @param[in] ImageTypeId The ImageTypeId of the FMP image. > - It is used to identify the FMP protocol. > - @param[in] ImageIndex The ImageIndex of the FMP image. > - It is the input parameter for FMP->GetImage(). > - @param[in] ImageName The file name to hold the output FMP image. > -**/ > -VOID > -DumpFmpImage ( > - IN EFI_GUID *ImageTypeId, > - IN UINTN ImageIndex, > - IN CHAR16 *ImageName > - ); > - > -/** > - Dump ESRT info. > -**/ > -VOID > -DumpEsrtData ( > - VOID > - ); > - > -/** > - Dump Provisioned Capsule. > - > - @param[in] DumpCapsuleInfo The flag to indicate whether to dump the > capsule inforomation. > -**/ > -VOID > -DumpProvisionedCapsule ( > - IN BOOLEAN DumpCapsuleInfo > - ); > - > -/** > - Dump all EFI System Partition. > -**/ > -VOID > -DumpAllEfiSysPartition ( > - VOID > - ); > - > -/** > - 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 > - @param[in] FilePath An array of capsule images file path > - @param[in] Map File system mapping string > - @param[in] CapsuleNum The count of capsule images > - > - @retval EFI_SUCCESS Capsule on disk success. > - @retval others Capsule on disk fail. > - > -**/ > -EFI_STATUS > -ProcessCapsuleOnDisk ( > - IN VOID **CapsuleBuffer, > - IN UINTN *CapsuleBufferSize, > - IN CHAR16 **FilePath, > - IN CHAR16 *Map, > - IN UINTN CapsuleNum > - ); > - > -/** > - Read a file. > - > - @param[in] FileName The file to be read. > - @param[out] BufferSize The file buffer size > - @param[out] Buffer The file buffer > - > - @retval EFI_SUCCESS Read file successfully > - @retval EFI_NOT_FOUND Shell protocol or file not found > - @retval others Read file failed > -**/ > -EFI_STATUS > -ReadFileToBuffer ( > - IN CHAR16 *FileName, > - OUT UINTN *BufferSize, > - OUT VOID **Buffer > - ); > - > -/** > - Write a file. > - > - @param[in] FileName The file to be written. > - @param[in] BufferSize The file buffer size > - @param[in] Buffer The file buffer > - > - @retval EFI_SUCCESS Write file successfully > - @retval EFI_NOT_FOUND Shell protocol not found > - @retval others Write file failed > -**/ > -EFI_STATUS > -WriteFileFromBuffer ( > - IN CHAR16 *FileName, > - IN UINTN BufferSize, > - IN VOID *Buffer > - ); > - > -/** > - > - This function parse application ARG. > - > - @return Status > -**/ > -EFI_STATUS > -GetArg ( > - VOID > - ); > - > /** > Create UX capsule. > > @retval EFI_SUCCESS The capsule header is appended. > @retval EFI_UNSUPPORTED Input parameter is not valid. > @@ -847,11 +675,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."); > + Print(L" -OD: Delivery of Capsules via file on Mass Storage device.\n"); > 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,44 +846,43 @@ UefiMain ( > ParaNrIndex = Index; > NoReset = TRUE; > } > } > > - if (ParaOdIndex != 0) { > - if (ParaOdIndex == Argc - 1) { > + if (ParaOdIndex > ParaNrIndex) { > + if (ParaNrIndex != 0) { > + CapsuleLastIndex = ParaNrIndex - 1; > + } else { > + CapsuleLastIndex = ParaOdIndex - 1; > + } > + > + if (ParaOdIndex == Argc -1) { > MapFsStr = NULL; > } else if (ParaOdIndex == Argc - 2) { > MapFsStr = Argv[Argc-1]; > } else { > - Print (L"CapsuleApp: Invalid Position for -OD Options\n"); > + Print (L"CapsuleApp: Cannot specify more than one FS mapping!\n"); > Status = EFI_INVALID_PARAMETER; > goto Done; > } > - > - if (ParaNrIndex != 0) { > - if (ParaNrIndex + 1 == ParaOdIndex) { > - CapsuleLastIndex = ParaNrIndex - 1; > - } else { > - Print (L"CapsuleApp: Invalid Position for -NR Options\n"); > - Status = EFI_INVALID_PARAMETER; > - goto Done; > - } > - } else { > + } else if (ParaOdIndex < ParaNrIndex) { > + if (ParaOdIndex != 0) { > CapsuleLastIndex = ParaOdIndex - 1; > - } > - } else { > - if (ParaNrIndex != 0) { > - if (ParaNrIndex == Argc -1) { > - CapsuleLastIndex = ParaNrIndex - 1; > + if (ParaOdIndex == ParaNrIndex - 1) { > + MapFsStr = NULL; > + } else if (ParaOdIndex == ParaNrIndex - 2) { > + MapFsStr = Argv[ParaOdIndex + 1]; > } else { > - Print (L"CapsuleApp: Invalid Position for -NR Options\n"); > + Print (L"CapsuleApp: Cannot specify more than one FS mapping!\n"); > Status = EFI_INVALID_PARAMETER; > goto Done; > } > } else { > - CapsuleLastIndex = Argc - 1; > + CapsuleLastIndex = ParaNrIndex - 1; > } > + } else { > + CapsuleLastIndex = Argc - 1; > } > > CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1; > > if (CapsuleFirstIndex > CapsuleLastIndex) { > diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.h > b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.h > new file mode 100644 > index 0000000000..270d2359a3 > --- /dev/null > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.h > @@ -0,0 +1,240 @@ > +/** @file > + A shell application that triggers capsule update process. > + > + Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > + > +#ifndef _CAPSULE_APP_H_ > +#define _CAPSULE_APP_H_ > + > +#include <Uefi.h> > +#include <Library/BaseLib.h> > +#include <Library/DebugLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <Library/UefiLib.h> > +#include <Library/PrintLib.h> > +#include <Library/BmpSupportLib.h> > +#include <Library/FileHandleLib.h> > +#include <Library/SortLib.h> > +#include <Library/UefiBootManagerLib.h> > +#include <Library/DevicePathLib.h> > +#include <Protocol/GraphicsOutput.h> > +#include <Protocol/SimpleFileSystem.h> > +#include <Protocol/ShellParameters.h> > +#include <Protocol/Shell.h> > +#include <Protocol/FirmwareManagement.h> > +#include <Guid/GlobalVariable.h> > +#include <Guid/CapsuleReport.h> > +#include <Guid/SystemResourceTable.h> > +#include <Guid/FmpCapsule.h> > +#include <Guid/FileInfo.h> > +#include <Guid/ImageAuthentication.h> > +#include <Guid/CapsuleVendor.h> > +#include <Guid/Gpt.h> > +#include <IndustryStandard/WindowsUxCapsule.h> > + > +#define CAPSULE_HEADER_SIZE 0x20 > + > +#define NESTED_CAPSULE_HEADER_SIZE SIZE_4KB > +#define SYSTEM_FIRMWARE_FLAG 0x50000 > +#define DEVICE_FIRMWARE_FLAG 0x78010 > + > +#define MAJOR_VERSION 1 > +#define MINOR_VERSION 0 > + > +#define MAX_CAPSULE_NUM 10 > + > +// > +// (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)) > + > +extern UINTN Argc; > +extern CHAR16 **Argv; > + > +/** > + > + This function parse application ARG. > + > + @return Status > +**/ > +EFI_STATUS > +GetArg ( > + VOID > + ); > + > +/** > + Get shell protocol. > + > + @return Pointer to shell protocol. > + > +**/ > +EFI_SHELL_PROTOCOL * > +GetShellProtocol ( > + VOID > + ); > + > + > +/** > + Read a file. > + > + @param[in] FileName The file to be read. > + @param[out] BufferSize The file buffer size > + @param[out] Buffer The file buffer > + > + @retval EFI_SUCCESS Read file successfully > + @retval EFI_NOT_FOUND Shell protocol or file not found > + @retval others Read file failed > +**/ > +EFI_STATUS > +ReadFileToBuffer ( > + IN CHAR16 *FileName, > + OUT UINTN *BufferSize, > + OUT VOID **Buffer > + ); > + > +/** > + Write a file. > + > + @param[in] FileName The file to be written. > + @param[in] BufferSize The file buffer size > + @param[in] Buffer The file buffer > + > + @retval EFI_SUCCESS Write file successfully > + @retval EFI_NOT_FOUND Shell protocol not found > + @retval others Write file failed > +**/ > +EFI_STATUS > +WriteFileFromBuffer ( > + IN CHAR16 *FileName, > + IN UINTN BufferSize, > + IN VOID *Buffer > + ); > + > + > +/** > + Dump capsule information > + > + @param[in] CapsuleName The name of the capsule image. > + > + @retval EFI_SUCCESS The capsule information is dumped. > + @retval EFI_UNSUPPORTED Input parameter is not valid. > +**/ > +EFI_STATUS > +DumpCapsule ( > + IN CHAR16 *CapsuleName > + ); > + > +/** > + Dump capsule status variable. > + > + @retval EFI_SUCCESS The capsule status variable is dumped. > + @retval EFI_UNSUPPORTED Input parameter is not valid. > +**/ > +EFI_STATUS > +DumpCapsuleStatusVariable ( > + VOID > + ); > + > +/** > + Dump FMP protocol info. > +**/ > +VOID > +DumpFmpData ( > + VOID > + ); > + > +/** > + Dump FMP image data. > + > + @param[in] ImageTypeId The ImageTypeId of the FMP image. > + It is used to identify the FMP protocol. > + @param[in] ImageIndex The ImageIndex of the FMP image. > + It is the input parameter for FMP->GetImage(). > + @param[in] ImageName The file name to hold the output FMP image. > +**/ > +VOID > +DumpFmpImage ( > + IN EFI_GUID *ImageTypeId, > + IN UINTN ImageIndex, > + IN CHAR16 *ImageName > + ); > + > +/** > + Dump ESRT info. > +**/ > +VOID > +DumpEsrtData ( > + VOID > + ); > + > +/** > + Dump Provisioned Capsule. > + > + @param[in] DumpCapsuleInfo The flag to indicate whether to dump the > capsule inforomation. > +**/ > +VOID > +DumpProvisionedCapsule ( > + IN BOOLEAN DumpCapsuleInfo > + ); > + > +/** > + Dump all EFI System Partition. > +**/ > +VOID > +DumpAllEfiSysPartition ( > + VOID > + ); > + > + > +/** > + Get SimpleFileSystem from boot option file path. > + > + @param[in] DevicePath The file path of boot option > + @param[out] FullPath The full device path of boot device > + @param[out] Fs The file system within EfiSysPartition > + > + @retval EFI_SUCCESS Get file system successfully > + @retval EFI_NOT_FOUND No valid file system found > + @retval others Get file system failed > + > +**/ > +EFI_STATUS > +GetEfiSysPartitionFromBootOptionFilePath ( > + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, > + OUT EFI_DEVICE_PATH_PROTOCOL **FullPath, > + OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs > + ); > + > + > +/** > + 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 > + @param[in] FilePath An array of capsule images file path > + @param[in] Map File system mapping string > + @param[in] CapsuleNum The count of capsule images > + > + @retval EFI_SUCCESS Capsule on disk success. > + @retval others Capsule on disk fail. > + > +**/ > +EFI_STATUS > +ProcessCapsuleOnDisk ( > + IN VOID **CapsuleBuffer, > + IN UINTN *CapsuleBufferSize, > + IN CHAR16 **FilePath, > + IN CHAR16 *Map, > + IN UINTN CapsuleNum > + ); > + > +#endif > + > diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > index 8ca5e04104..6ed0659835 100644 > --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > @@ -2,11 +2,11 @@ > # A shell application that triggers capsule update process. > # > # This application can trigger capsule update process. It can also > # generate capsule image, or dump capsule variable information. > # > -# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > ## > > [Defines] > @@ -24,10 +24,11 @@ > # VALID_ARCHITECTURES = IA32 X64 > # > > [Sources] > CapsuleApp.c > + CapsuleApp.h > CapsuleDump.c > CapsuleOnDisk.c > AppSupport.c > > [Packages] > diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c > b/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c > index b81c5b7b3a..58a93568d0 100644 > --- a/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleDump.c > @@ -4,102 +4,11 @@ > Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > -#include <PiDxe.h> > -#include <Library/BaseLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > -#include <Library/UefiLib.h> > -#include <Library/PrintLib.h> > -#include <Library/FileHandleLib.h> > -#include <Library/SortLib.h> > -#include <Library/UefiBootManagerLib.h> > -#include <Library/DevicePathLib.h> > -#include <Protocol/FirmwareManagement.h> > -#include <Protocol/SimpleFileSystem.h> > -#include <Protocol/Shell.h> > -#include <Guid/ImageAuthentication.h> > -#include <Guid/CapsuleReport.h> > -#include <Guid/SystemResourceTable.h> > -#include <Guid/FmpCapsule.h> > -#include <Guid/CapsuleVendor.h> > -#include <IndustryStandard/WindowsUxCapsule.h> > - > -// > -// (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)) > - > -/** > - Read a file. > - > - @param[in] FileName The file to be read. > - @param[out] BufferSize The file buffer size > - @param[out] Buffer The file buffer > - > - @retval EFI_SUCCESS Read file successfully > - @retval EFI_NOT_FOUND File not found > -**/ > -EFI_STATUS > -ReadFileToBuffer ( > - IN CHAR16 *FileName, > - OUT UINTN *BufferSize, > - OUT VOID **Buffer > - ); > - > -/** > - Write a file. > - > - @param[in] FileName The file to be written. > - @param[in] BufferSize The file buffer size > - @param[in] Buffer The file buffer > - > - @retval EFI_SUCCESS Write file successfully > -**/ > -EFI_STATUS > -WriteFileFromBuffer ( > - IN CHAR16 *FileName, > - IN UINTN BufferSize, > - IN VOID *Buffer > - ); > - > -/** > - Get shell protocol. > - > - @return Pointer to shell protocol. > - > -**/ > -EFI_SHELL_PROTOCOL * > -GetShellProtocol ( > - VOID > - ); > - > -/** > - Get SimpleFileSystem from boot option file path. > - > - @param[in] DevicePath The file path of boot option > - @param[out] FullPath The full device path of boot device > - @param[out] Fs The file system within EfiSysPartition > - > - @retval EFI_SUCCESS Get file system successfully > - @retval EFI_NOT_FOUND No valid file system found > - @retval others Get file system failed > - > -**/ > -EFI_STATUS > -EFIAPI > -GetEfiSysPartitionFromBootOptionFilePath ( > - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, > - OUT EFI_DEVICE_PATH_PROTOCOL **FullPath, > - OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs > - ); > +#include "CapsuleApp.h" > > /** > Validate if it is valid capsule header > > This function assumes the caller provided correct CapsuleHeader pointer > @@ -707,11 +616,10 @@ SplitFileNameExtension ( > @return <0 Buffer1 is less than Buffer2. > @return >0 Buffer1 is greater than Buffer2. > > **/ > INTN > -EFIAPI > CompareFileNameInAlphabet ( > IN VOID *Left, > IN VOID *Right > ) > { > @@ -810,12 +718,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 +752,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 a11683d66c..382efa9aa0 100644 > --- a/MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c > @@ -3,40 +3,14 @@ > > Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > -#include <Uefi.h> > -#include <Library/BaseLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > -#include <Library/UefiLib.h> > -#include <Library/PrintLib.h> > -#include <Library/DevicePathLib.h> > -#include <Library/FileHandleLib.h> > -#include <Library/UefiBootManagerLib.h> > -#include <Protocol/SimpleFileSystem.h> > -#include <Protocol/Shell.h> > -#include <Guid/FileInfo.h> > -#include <Guid/GlobalVariable.h> > -#include <Guid/Gpt.h> > > -EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, > { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } }; > - > -/** > - Get shell protocol. > +#include "CapsuleApp.h" > > - @return Pointer to shell protocol. > - > -**/ > -EFI_SHELL_PROTOCOL * > -GetShellProtocol ( > - VOID > - ); > +EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, > { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } }; > > /** > Get file name from file path. > > @param FilePath File path. > @@ -328,11 +302,10 @@ GetEfiSysPartitionFromDevPath ( > @retval EFI_NOT_FOUND No valid file system found > @retval others Get file system failed > > **/ > EFI_STATUS > -EFIAPI > GetEfiSysPartitionFromBootOptionFilePath ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, > OUT EFI_DEVICE_PATH_PROTOCOL **FullPath, > OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs > ) > @@ -396,11 +369,10 @@ GetEfiSysPartitionFromBootOptionFilePath ( > @retval EFI_NOT_FOUND No valid FS found > @retval others Get FS failed > > **/ > EFI_STATUS > -EFIAPI > GetUpdateFileSystem ( > IN CHAR16 *Map, > OUT UINT16 *BootNext, > OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs, > OUT BOOLEAN *UpdateBootNext > @@ -742,10 +714,45 @@ 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 > @@ -768,10 +775,20 @@ 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; > @@ -780,14 +797,21 @@ 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, FilePath, > CapsuleNum, Fs); > + Status = WriteUpdateFile (CapsuleBuffer, CapsuleBufferSize, FileName, > CapsuleNum, Fs); > if (EFI_ERROR (Status)) { > Print (L"CapsuleApp: capsule image could not be copied for update.\n"); > return Status; > } > > -- > 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#42849): https://edk2.groups.io/g/devel/message/42849 Mute This Topic: https://groups.io/mt/32200994/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-