]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
MdeModulePkg: Remove redundant library classes and GUIDs
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / CapsuleApp.c
index df5de91ef524bb4dca0cd17e9f8f863ff2a3c6ef..4d907242f38b55d441fdad8dacc34dc454f83446 100644 (file)
@@ -23,7 +23,6 @@
 #include <Library/PrintLib.h>\r
 #include <Library/BmpSupportLib.h>\r
 #include <Protocol/GraphicsOutput.h>\r
-#include <Guid/GlobalVariable.h>\r
 #include <Guid/CapsuleReport.h>\r
 #include <Guid/SystemResourceTable.h>\r
 #include <Guid/FmpCapsule.h>\r
@@ -70,7 +69,7 @@ DumpCapsule (
   @retval EFI_UNSUPPORTED        Input parameter is not valid.\r
 **/\r
 EFI_STATUS\r
-DmpCapsuleStatusVariable (\r
+DumpCapsuleStatusVariable (\r
   VOID\r
   );\r
 \r
@@ -362,6 +361,60 @@ GetEsrtFwType (
   return ESRT_FW_TYPE_UNKNOWN;\r
 }\r
 \r
+/**\r
+  Validate if it is valid capsule header\r
+\r
+  This function assumes the caller provided correct CapsuleHeader pointer\r
+  and CapsuleSize.\r
+\r
+  This function validates the fields in EFI_CAPSULE_HEADER.\r
+\r
+  @param[in] CapsuleHeader  Points to a capsule header.\r
+  @param[in] CapsuleSize    Size of the whole capsule image.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidCapsuleHeader (\r
+  IN EFI_CAPSULE_HEADER     *CapsuleHeader,\r
+  IN UINT64                 CapsuleSize\r
+  )\r
+{\r
+  if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+    return FALSE;\r
+  }\r
+  if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
+    return FALSE;\r
+  }\r
+  if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {\r
+    return FALSE;\r
+  }\r
+  if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Return if this CapsuleGuid is a FMP capsule GUID or not.\r
+\r
+  @param[in] CapsuleGuid A pointer to EFI_GUID\r
+\r
+  @retval TRUE  It is a FMP capsule GUID.\r
+  @retval FALSE It is not a FMP capsule GUID.\r
+**/\r
+BOOLEAN\r
+IsFmpCapsuleGuid (\r
+  IN EFI_GUID  *CapsuleGuid\r
+  )\r
+{\r
+  if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Append a capsule header on top of current image.\r
   This function follows Windows UEFI Firmware Update Platform document.\r
@@ -407,15 +460,28 @@ CreateNestedFmp (
     Print(L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);\r
     goto Done;\r
   }\r
+  if (!IsValidCapsuleHeader (CapsuleBuffer, FileSize)) {\r
+    Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
+  }\r
+\r
+  if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *) CapsuleBuffer)->CapsuleGuid)) {\r
+    Print(L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
+  }\r
 \r
   ImageTypeId = GetCapsuleImageTypeId(CapsuleBuffer);\r
   if (ImageTypeId == NULL) {\r
     Print(L"CapsuleApp: Capsule ImageTypeId is not found.\n");\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
   FwType = GetEsrtFwType(ImageTypeId);\r
   if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) {\r
     Print(L"CapsuleApp: Capsule FwType is invalid.\n");\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
 \r
@@ -466,11 +532,13 @@ ClearCapsuleStatusVariable (
   UINT32                              Index;\r
   CHAR16                              CapsuleVarName[20];\r
   CHAR16                              *TempVarName;\r
+  BOOLEAN                             Found;\r
 \r
   StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");\r
   TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
   Index = 0;\r
 \r
+  Found = FALSE;\r
   while (TRUE) {\r
     UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);\r
 \r
@@ -481,12 +549,15 @@ ClearCapsuleStatusVariable (
                     0,\r
                     (VOID *)NULL\r
                     );\r
-    if (EFI_ERROR(Status)) {\r
+    if (Status == EFI_NOT_FOUND) {\r
       //\r
-      // There is no capsule variables, quit\r
+      // There is no more capsule variables, quit\r
       //\r
       break;\r
     }\r
+    Found = TRUE;\r
+\r
+    Print (L"Clear %s %r\n", CapsuleVarName, Status);\r
 \r
     Index++;\r
     if (Index > 0xFFFF) {\r
@@ -494,6 +565,10 @@ ClearCapsuleStatusVariable (
     }\r
   }\r
 \r
+  if (!Found) {\r
+    Print (L"No any Capsule#### variable found\n");\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -715,40 +790,6 @@ CleanGatherList (
   }\r
 }\r
 \r
-/**\r
-  Validate if it is valid capsule header\r
-\r
-  This function assumes the caller provided correct CapsuleHeader pointer\r
-  and CapsuleSize.\r
-\r
-  This function validates the fields in EFI_CAPSULE_HEADER.\r
-\r
-  @param[in] CapsuleHeader  Points to a capsule header.\r
-  @param[in] CapsuleSize    Size of the whole capsule image.\r
-\r
-**/\r
-BOOLEAN\r
-IsValidCapsuleHeader (\r
-  IN EFI_CAPSULE_HEADER     *CapsuleHeader,\r
-  IN UINT64                 CapsuleSize\r
-  )\r
-{\r
-  if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
-    return FALSE;\r
-  }\r
-  if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
-    return FALSE;\r
-  }\r
-  if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {\r
-    return FALSE;\r
-  }\r
-  if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
-    return FALSE;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
 /**\r
   Print APP usage.\r
 **/\r
@@ -768,22 +809,26 @@ PrintUsage (
   Print(L"  CapsuleApp -D <Capsule>\n");\r
   Print(L"  CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");\r
   Print(L"Parameter:\n");\r
-  Print(L"  -NR: No reset will be triggered for the capsule\n");\r
-  Print(L"       with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET.\n");\r
+  Print(L"  -NR: No reset will be triggered for the capsule with\n");\r
+  Print(L"       CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without\n");\r
+  Print(L"       CAPSULE_FLAGS_INITIATE_RESET.\n");\r
   Print(L"  -S:  Dump capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");\r
   Print(L"       which is defined in UEFI specification.\n");\r
   Print(L"  -C:  Clear capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");\r
   Print(L"       which is defined in UEFI specification.\n");\r
   Print(L"  -P:  Dump UEFI FMP protocol info, or get image with specified\n");\r
-  Print(L"       ImageTypeId and index to a file if 'GET' option is used.\n");\r
+  Print(L"       ImageTypeId and Index (decimal format) to a file if 'GET'\n");\r
+  Print(L"       option is used.\n");\r
   Print(L"  -E:  Dump UEFI ESRT table info.\n");\r
   Print(L"  -G:  Convert a BMP file to be an UX capsule,\n");\r
   Print(L"       according to Windows Firmware Update document\n");\r
-  Print(L"  -N:  Append a Capsule Header to an existing capsule image,\n");\r
+  Print(L"  -N:  Append a Capsule Header to an existing FMP capsule image\n");\r
+  Print(L"       with its ImageTypeId supported by the system,\n");\r
   Print(L"       according to Windows Firmware Update document\n");\r
   Print(L"  -O:  Output new Capsule file name\n");\r
-  Print(L"  -D:  Dump Capsule image header information, image payload information if it is an UX capsule\n");\r
-  Print(L"       and FMP header information if it is a FMP capsule.\n");\r
+  Print(L"  -D:  Dump Capsule image header information, image payload\n");\r
+  Print(L"       information if it is an UX capsule and FMP header\n");\r
+  Print(L"       information if it is a FMP capsule.\n");\r
 }\r
 \r
 /**\r
@@ -809,14 +854,16 @@ UefiMain (
   UINTN                         FileSize[MAX_CAPSULE_NUM];\r
   VOID                          *CapsuleBuffer[MAX_CAPSULE_NUM];\r
   EFI_CAPSULE_BLOCK_DESCRIPTOR  *BlockDescriptors;\r
-  EFI_CAPSULE_HEADER             *CapsuleHeaderArray[MAX_CAPSULE_NUM + 1];\r
-  UINT64                         MaxCapsuleSize;\r
-  EFI_RESET_TYPE                 ResetType;\r
-  BOOLEAN                        NeedReset;\r
-  BOOLEAN                        NoReset;\r
-  CHAR16                         *CapsuleName;\r
-  UINTN                          CapsuleNum;\r
-  UINTN                          Index;\r
+  EFI_CAPSULE_HEADER            *CapsuleHeaderArray[MAX_CAPSULE_NUM + 1];\r
+  UINT64                        MaxCapsuleSize;\r
+  EFI_RESET_TYPE                ResetType;\r
+  BOOLEAN                       NeedReset;\r
+  BOOLEAN                       NoReset;\r
+  CHAR16                        *CapsuleName;\r
+  UINTN                         CapsuleNum;\r
+  UINTN                         Index;\r
+  EFI_GUID                      ImageTypeId;\r
+  UINTN                         ImageIndex;\r
 \r
   Status = GetArg();\r
   if (EFI_ERROR(Status)) {\r
@@ -844,7 +891,7 @@ UefiMain (
     return Status;\r
   }\r
   if (StrCmp(Argv[1], L"-S") == 0) {\r
-    Status = DmpCapsuleStatusVariable();\r
+    Status = DumpCapsuleStatusVariable();\r
     return EFI_SUCCESS;\r
   }\r
   if (StrCmp(Argv[1], L"-C") == 0) {\r
@@ -865,8 +912,6 @@ UefiMain (
           return EFI_UNSUPPORTED;\r
         }\r
 \r
-        EFI_GUID  ImageTypeId;\r
-        UINTN     ImageIndex;\r
         //\r
         // FMP->GetImage()\r
         //\r