]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/CapsuleApp/CapsuleDump.c
MdeModulePkg: Add FMP Capsule Image Header extension
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / CapsuleDump.c
index 9fd4af4e5584c85eb8680205113f053214bcf572..5725e2f6dd5b454f999c69305e556d974963c14c 100644 (file)
 /** @file\r
   Dump Capsule image information.\r
 \r
-  Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
+  Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include <PiDxe.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/FileHandleLib.h>\r
-#include <Library/SortLib.h>\r
-#include <Library/UefiBootManagerLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Protocol/FirmwareManagement.h>\r
-#include <Protocol/SimpleFileSystem.h>\r
-#include <Protocol/Shell.h>\r
-#include <Guid/ImageAuthentication.h>\r
-#include <Guid/CapsuleReport.h>\r
-#include <Guid/SystemResourceTable.h>\r
-#include <Guid/FmpCapsule.h>\r
-#include <Guid/CapsuleVendor.h>\r
-#include <IndustryStandard/WindowsUxCapsule.h>\r
-\r
-//\r
-// (20 * (6+5+2))+1) unicode characters from EFI FAT spec (doubled for bytes)\r
-//\r
-#define MAX_FILE_NAME_SIZE   522\r
-#define MAX_FILE_NAME_LEN    (MAX_FILE_NAME_SIZE / sizeof(CHAR16))\r
-\r
-/**\r
-  Read a file.\r
-\r
-  @param[in]  FileName        The file to be read.\r
-  @param[out] BufferSize      The file buffer size\r
-  @param[out] Buffer          The file buffer\r
-\r
-  @retval EFI_SUCCESS    Read file successfully\r
-  @retval EFI_NOT_FOUND  File not found\r
 **/\r
-EFI_STATUS\r
-ReadFileToBuffer (\r
-  IN  CHAR16                               *FileName,\r
-  OUT UINTN                                *BufferSize,\r
-  OUT VOID                                 **Buffer\r
-  );\r
-\r
-/**\r
-  Write a file.\r
-\r
-  @param[in] FileName        The file to be written.\r
-  @param[in] BufferSize      The file buffer size\r
-  @param[in] Buffer          The file buffer\r
 \r
-  @retval EFI_SUCCESS    Write file successfully\r
-**/\r
-EFI_STATUS\r
-WriteFileFromBuffer (\r
-  IN  CHAR16                               *FileName,\r
-  IN  UINTN                                BufferSize,\r
-  IN  VOID                                 *Buffer\r
-  );\r
-\r
-/**\r
-  Get shell protocol.\r
-\r
-  @return Pointer to shell protocol.\r
-\r
-**/\r
-EFI_SHELL_PROTOCOL *\r
-GetShellProtocol (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get SimpleFileSystem from boot option file path.\r
-\r
-  @param[in]  DevicePath     The file path of boot option\r
-  @param[out] FullPath       The full device path of boot device\r
-  @param[out] Fs             The file system within EfiSysPartition\r
-\r
-  @retval EFI_SUCCESS    Get file system successfully\r
-  @retval EFI_NOT_FOUND  No valid file system found\r
-  @retval others         Get file system failed\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-GetEfiSysPartitionFromBootOptionFilePath (\r
-  IN  EFI_DEVICE_PATH_PROTOCOL         *DevicePath,\r
-  OUT EFI_DEVICE_PATH_PROTOCOL         **FullPath,\r
-  OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  **Fs\r
-  );\r
+#include "CapsuleApp.h"\r
 \r
 /**\r
   Validate if it is valid capsule header\r
@@ -135,7 +38,7 @@ DumpUxCapsule (
 {\r
   EFI_DISPLAY_CAPSULE                           *DisplayCapsule;\r
   DisplayCapsule = (EFI_DISPLAY_CAPSULE *)CapsuleHeader;\r
-  Print(L"[UxCapusule]\n");\r
+  Print(L"[UxCapsule]\n");\r
   Print(L"CapsuleHeader:\n");\r
   Print(L"  CapsuleGuid      - %g\n", &DisplayCapsule->CapsuleHeader.CapsuleGuid);\r
   Print(L"  HeaderSize       - 0x%x\n", DisplayCapsule->CapsuleHeader.HeaderSize);\r
@@ -193,8 +96,11 @@ DumpFmpCapsule (
     Print(L"  UpdateImageIndex       - 0x%x\n", FmpImageHeader->UpdateImageIndex);\r
     Print(L"  UpdateImageSize        - 0x%x\n", FmpImageHeader->UpdateImageSize);\r
     Print(L"  UpdateVendorCodeSize   - 0x%x\n", FmpImageHeader->UpdateVendorCodeSize);\r
-    if (FmpImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
+    if (FmpImageHeader->Version >= 2) {\r
       Print(L"  UpdateHardwareInstance - 0x%lx\n", FmpImageHeader->UpdateHardwareInstance);\r
+      if (FmpImageHeader->Version >= EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION) {\r
+        Print(L"  ImageCapsuleSupport    - 0x%lx\n", FmpImageHeader->ImageCapsuleSupport);\r
+      }\r
     }\r
   }\r
 }\r
@@ -296,7 +202,7 @@ DumpCapsule (
     DumpFmpCapsule(CapsuleHeader);\r
   }\r
   if (IsNestedFmpCapsule(CapsuleHeader)) {\r
-    Print(L"[NestedCapusule]\n");\r
+    Print(L"[NestedCapsule]\n");\r
     Print(L"CapsuleHeader:\n");\r
     Print(L"  CapsuleGuid      - %g\n", &CapsuleHeader->CapsuleGuid);\r
     Print(L"  HeaderSize       - 0x%x\n", CapsuleHeader->HeaderSize);\r
@@ -435,6 +341,7 @@ CHAR8 *mLastAttemptStatusString[] = {
   "Error: Auth Error",\r
   "Error: Power Event AC",\r
   "Error: Power Event Battery",\r
+  "Error: Unsatisfied Dependencies",\r
 };\r
 \r
 /**\r
@@ -715,7 +622,6 @@ SplitFileNameExtension (
 \r
 **/\r
 INTN\r
-EFIAPI\r
 CompareFileNameInAlphabet (\r
   IN VOID                         *Left,\r
   IN VOID                         *Right\r
@@ -818,8 +724,8 @@ DumpCapsuleFromDisk (
   //\r
   // Get file count first\r
   //\r
+  Status = FileHandleFindFirstFile (DirHandle, &FileInfo);\r
   do {\r
-    Status = FileHandleFindFirstFile (DirHandle, &FileInfo);\r
     if (EFI_ERROR (Status) || FileInfo == NULL) {\r
       Print (L"Get File Info Fail. Status = %r\n", Status);\r
       goto Done;\r
@@ -852,8 +758,8 @@ DumpCapsuleFromDisk (
   //\r
   // Get all file info\r
   //\r
+  Status = FileHandleFindFirstFile (DirHandle, &FileInfo);\r
   do {\r
-    Status = FileHandleFindFirstFile (DirHandle, &FileInfo);\r
     if (EFI_ERROR (Status) || FileInfo == NULL) {\r
       Print (L"Get File Info Fail. Status = %r\n", Status);\r
       goto Done;\r
@@ -1105,6 +1011,7 @@ DumpFmpImageInfo (
 {\r
   EFI_FIRMWARE_IMAGE_DESCRIPTOR                 *CurrentImageInfo;\r
   UINTN                                         Index;\r
+  UINTN                                         Index2;\r
 \r
   Print(L"  DescriptorVersion  - 0x%x\n", DescriptorVersion);\r
   Print(L"  DescriptorCount    - 0x%x\n", DescriptorCount);\r
@@ -1141,6 +1048,18 @@ DumpFmpImageInfo (
         Print(L"    LastAttemptVersion          - 0x%x\n", CurrentImageInfo->LastAttemptVersion);\r
         Print(L"    LastAttemptStatus           - 0x%x (%a)\n", CurrentImageInfo->LastAttemptStatus, LastAttemptStatusToString(CurrentImageInfo->LastAttemptStatus));\r
         Print(L"    HardwareInstance            - 0x%lx\n", CurrentImageInfo->HardwareInstance);\r
+        if (DescriptorVersion > 3) {\r
+          Print(L"    Dependencies                - ");\r
+          if (CurrentImageInfo->Dependencies == NULL) {\r
+            Print(L"NULL\n");\r
+          } else {\r
+            Index2 = 0;\r
+            do {\r
+              Print(L"%02x ", CurrentImageInfo->Dependencies->Dependencies[Index2]);\r
+            } while (CurrentImageInfo->Dependencies->Dependencies[Index2 ++] != EFI_FMP_DEP_END);\r
+            Print(L"\n");\r
+          }\r
+        }\r
       }\r
     }\r
     //\r