]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c
MdeModulePkg/CapsuleApp: Improve comparisons in CapsuleOnDisk.c
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / CapsuleOnDisk.c
index a11683d66c77a878c4b27f5eef24e831881e282e..b161d1a98172a9ea5f907af996b4c0d8935bfb2a 100644 (file)
@@ -5,36 +5,10 @@
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
-#include <Uefi.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/DevicePathLib.h>\r
-#include <Library/FileHandleLib.h>\r
-#include <Library/UefiBootManagerLib.h>\r
-#include <Protocol/SimpleFileSystem.h>\r
-#include <Protocol/Shell.h>\r
-#include <Guid/FileInfo.h>\r
-#include <Guid/GlobalVariable.h>\r
-#include <Guid/Gpt.h>\r
 \r
-EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } };\r
-\r
-/**\r
-  Get shell protocol.\r
+#include "CapsuleApp.h"\r
 \r
-  @return Pointer to shell protocol.\r
-\r
-**/\r
-EFI_SHELL_PROTOCOL *\r
-GetShellProtocol (\r
-  VOID\r
-  );\r
+EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } };\r
 \r
 /**\r
   Get file name from file path.\r
@@ -330,7 +304,6 @@ GetEfiSysPartitionFromDevPath (
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 GetEfiSysPartitionFromBootOptionFilePath (\r
   IN  EFI_DEVICE_PATH_PROTOCOL         *DevicePath,\r
   OUT EFI_DEVICE_PATH_PROTOCOL         **FullPath,\r
@@ -398,7 +371,6 @@ GetEfiSysPartitionFromBootOptionFilePath (
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 GetUpdateFileSystem (\r
   IN  CHAR16                           *Map,\r
   OUT UINT16                           *BootNext,\r
@@ -744,6 +716,41 @@ SetCapsuleStatusVariable (
   return Status;\r
 }\r
 \r
+/**\r
+  Check if Capsule On Disk is supported.\r
+\r
+  @retval TRUE              Capsule On Disk is supported.\r
+  @retval FALSE             Capsule On Disk is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+IsCapsuleOnDiskSupported (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  UINT64                        OsIndicationsSupported;\r
+  UINTN                         DataSize;\r
+\r
+  DataSize = sizeof(UINT64);\r
+  Status = gRT->GetVariable (\r
+                  L"OsIndicationsSupported",\r
+                  &gEfiGlobalVariableGuid,\r
+                  NULL,\r
+                  &DataSize,\r
+                  &OsIndicationsSupported\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return FALSE;\r
+  }\r
+\r
+  if ((OsIndicationsSupported & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Process Capsule On Disk.\r
 \r
@@ -770,6 +777,16 @@ ProcessCapsuleOnDisk (
   UINT16                          BootNext;\r
   EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;\r
   BOOLEAN                         UpdateBootNext;\r
+  CHAR16                          *FileName[MAX_CAPSULE_NUM];\r
+  UINTN                           Index;\r
+\r
+  //\r
+  // Check if Capsule On Disk is supported\r
+  //\r
+  if (!IsCapsuleOnDiskSupported ()) {\r
+    Print (L"CapsuleApp: Capsule On Disk is not supported.\n");\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
   //\r
   // Get a valid file system from boot path\r
@@ -782,10 +799,17 @@ ProcessCapsuleOnDisk (
     return Status;\r
   }\r
 \r
+  //\r
+  // Get file name from file path\r
+  //\r
+  for (Index = 0; Index < CapsuleNum; Index ++) {\r
+    FileName[Index] = GetFileNameFromPath (FilePath[Index]);\r
+  }\r
+\r
   //\r
   // Copy capsule image to '\efi\UpdateCapsule\'\r
   //\r
-  Status = WriteUpdateFile (CapsuleBuffer, CapsuleBufferSize, FilePath, CapsuleNum, Fs);\r
+  Status = WriteUpdateFile (CapsuleBuffer, CapsuleBufferSize, FileName, CapsuleNum, Fs);\r
   if (EFI_ERROR (Status)) {\r
     Print (L"CapsuleApp: capsule image could not be copied for update.\n");\r
     return Status;\r