]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/CapsuleApp/CapsuleOnDisk.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / CapsuleOnDisk.c
index 4faa863bcaf02be37d289968278d6224a4b7b732..5ce5a50f7b96f7153cc6147d280f43c7a6ea92a4 100644 (file)
@@ -2,45 +2,15 @@
   Process Capsule On Disk.\r
 \r
   Copyright (c) 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
-\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
+  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
 \r
-  @return Pointer to shell protocol.\r
+#include "CapsuleApp.h"\r
 \r
-**/\r
-EFI_SHELL_PROTOCOL *\r
-GetShellProtocol (\r
-  VOID\r
-  );\r
+EFI_GUID  mCapsuleOnDiskBootOptionGuid = {\r
+  0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 }\r
+};\r
 \r
 /**\r
   Get file name from file path.\r
@@ -52,13 +22,13 @@ GetShellProtocol (
 **/\r
 CHAR16 *\r
 GetFileNameFromPath (\r
-  CHAR16                            *FilePath\r
+  CHAR16  *FilePath\r
   )\r
 {\r
-  EFI_STATUS                        Status;\r
-  EFI_SHELL_PROTOCOL                *ShellProtocol;\r
-  SHELL_FILE_HANDLE                 Handle;\r
-  EFI_FILE_INFO                     *FileInfo;\r
+  EFI_STATUS          Status;\r
+  EFI_SHELL_PROTOCOL  *ShellProtocol;\r
+  SHELL_FILE_HANDLE   Handle;\r
+  EFI_FILE_INFO       *FileInfo;\r
 \r
   ShellProtocol = GetShellProtocol ();\r
   if (ShellProtocol == NULL) {\r
@@ -100,13 +70,13 @@ GetFileNameFromPath (
 **/\r
 BOOLEAN\r
 IsEfiSysPartitionDevicePath (\r
-  EFI_DEVICE_PATH_PROTOCOL   *DevicePath\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-  EFI_DEVICE_PATH_PROTOCOL   *TempDevicePath;\r
-  HARDDRIVE_DEVICE_PATH      *Hd;\r
-  EFI_HANDLE                 Handle;\r
+  EFI_STATUS                Status;\r
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;\r
+  HARDDRIVE_DEVICE_PATH     *Hd;\r
+  EFI_HANDLE                Handle;\r
 \r
   //\r
   // Check if the device path contains GPT node\r
@@ -115,12 +85,14 @@ IsEfiSysPartitionDevicePath (
 \r
   while (!IsDevicePathEnd (TempDevicePath)) {\r
     if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&\r
-      (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {\r
+        (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))\r
+    {\r
       Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;\r
       if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {\r
         break;\r
       }\r
     }\r
+\r
     TempDevicePath = NextDevicePathNode (TempDevicePath);\r
   }\r
 \r
@@ -144,19 +116,19 @@ DumpAllEfiSysPartition (
   VOID\r
   )\r
 {\r
-  EFI_HANDLE                 *SimpleFileSystemHandles;\r
-  UINTN                      NumberSimpleFileSystemHandles;\r
-  UINTN                      Index;\r
-  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;\r
-  UINTN                      NumberEfiSystemPartitions;\r
-  EFI_SHELL_PROTOCOL         *ShellProtocol;\r
+  EFI_HANDLE                *SimpleFileSystemHandles;\r
+  UINTN                     NumberSimpleFileSystemHandles;\r
+  UINTN                     Index;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  UINTN                     NumberEfiSystemPartitions;\r
+  EFI_SHELL_PROTOCOL        *ShellProtocol;\r
 \r
   NumberEfiSystemPartitions = 0;\r
 \r
   ShellProtocol = GetShellProtocol ();\r
   if (ShellProtocol == NULL) {\r
-    Print (L"Get Shell Protocol Fail\n");;\r
-    return ;\r
+    Print (L"Get Shell Protocol Fail\n");\r
+    return;\r
   }\r
 \r
   Print (L"EFI System Partition list:\n");\r
@@ -173,12 +145,12 @@ DumpAllEfiSysPartition (
     DevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]);\r
     if (IsEfiSysPartitionDevicePath (DevicePath)) {\r
       NumberEfiSystemPartitions++;\r
-      Print(L"    %s\n        %s\n", ShellProtocol->GetMapFromDevicePath (&DevicePath), ConvertDevicePathToText (DevicePath, TRUE, TRUE));\r
+      Print (L"    %s\n        %s\n", ShellProtocol->GetMapFromDevicePath (&DevicePath), ConvertDevicePathToText (DevicePath, TRUE, TRUE));\r
     }\r
   }\r
 \r
   if (NumberEfiSystemPartitions == 0) {\r
-    Print(L"    No ESP found.\n");\r
+    Print (L"    No ESP found.\n");\r
   }\r
 }\r
 \r
@@ -194,21 +166,22 @@ IsCapsuleProvisioned (
   VOID\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
-  UINT64                OsIndication;\r
-  UINTN                 DataSize;\r
+  EFI_STATUS  Status;\r
+  UINT64      OsIndication;\r
+  UINTN       DataSize;\r
 \r
   OsIndication = 0;\r
-  DataSize = sizeof(UINT64);\r
-  Status = gRT->GetVariable (\r
-                  L"OsIndications",\r
-                  &gEfiGlobalVariableGuid,\r
-                  NULL,\r
-                  &DataSize,\r
-                  &OsIndication\r
-                  );\r
+  DataSize     = sizeof (UINT64);\r
+  Status       = gRT->GetVariable (\r
+                        L"OsIndications",\r
+                        &gEfiGlobalVariableGuid,\r
+                        NULL,\r
+                        &DataSize,\r
+                        &OsIndication\r
+                        );\r
   if (!EFI_ERROR (Status) &&\r
-      (OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0) {\r
+      ((OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0))\r
+  {\r
     return TRUE;\r
   }\r
 \r
@@ -231,11 +204,11 @@ GetEfiSysPartition (
   OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  **Fs\r
   )\r
 {\r
-  EFI_HANDLE                 *SimpleFileSystemHandles;\r
-  UINTN                      NumberSimpleFileSystemHandles;\r
-  UINTN                      Index;\r
-  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;\r
-  EFI_STATUS                 Status;\r
+  EFI_HANDLE                *SimpleFileSystemHandles;\r
+  UINTN                     NumberSimpleFileSystemHandles;\r
+  UINTN                     Index;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  EFI_STATUS                Status;\r
 \r
   Status = gBS->LocateHandleBuffer (\r
                   ByProtocol,\r
@@ -277,15 +250,15 @@ GetEfiSysPartition (
 **/\r
 EFI_STATUS\r
 GetEfiSysPartitionFromDevPath (\r
-  IN  EFI_DEVICE_PATH_PROTOCOL        *DevicePath,\r
-  OUT EFI_DEVICE_PATH_PROTOCOL        **FsDevicePath,\r
-  OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs\r
+  IN  EFI_DEVICE_PATH_PROTOCOL         *DevicePath,\r
+  OUT EFI_DEVICE_PATH_PROTOCOL         **FsDevicePath,\r
+  OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  **Fs\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-  EFI_DEVICE_PATH_PROTOCOL   *TempDevicePath;\r
-  HARDDRIVE_DEVICE_PATH      *Hd;\r
-  EFI_HANDLE                 Handle;\r
+  EFI_STATUS                Status;\r
+  EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;\r
+  HARDDRIVE_DEVICE_PATH     *Hd;\r
+  EFI_HANDLE                Handle;\r
 \r
   //\r
   // Check if the device path contains GPT node\r
@@ -293,12 +266,14 @@ GetEfiSysPartitionFromDevPath (
   TempDevicePath = DevicePath;\r
   while (!IsDevicePathEnd (TempDevicePath)) {\r
     if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&\r
-       (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {\r
+        (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))\r
+    {\r
       Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;\r
       if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {\r
         break;\r
       }\r
     }\r
+\r
     TempDevicePath = NextDevicePathNode (TempDevicePath);\r
   }\r
 \r
@@ -336,26 +311,25 @@ GetEfiSysPartitionFromDevPath (
 \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
 {\r
-  EFI_STATUS                        Status;\r
-  EFI_DEVICE_PATH_PROTOCOL          *CurFullPath;\r
-  EFI_DEVICE_PATH_PROTOCOL          *PreFullPath;\r
-  EFI_DEVICE_PATH_PROTOCOL          *FsFullPath;\r
+  EFI_STATUS                Status;\r
+  EFI_DEVICE_PATH_PROTOCOL  *CurFullPath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *PreFullPath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *FsFullPath;\r
 \r
   CurFullPath = NULL;\r
-  FsFullPath = NULL;\r
+  FsFullPath  = NULL;\r
   //\r
   // Try every full device Path generated from bootoption\r
   //\r
   do {\r
     PreFullPath = CurFullPath;\r
-    CurFullPath = EfiBootManagerGetNextFullDevicePath (DevicePath, CurFullPath);\r
+    CurFullPath = EfiBootManagerGetNextLoadOptionDevicePath (DevicePath, CurFullPath);\r
 \r
     if (PreFullPath != NULL) {\r
       FreePool (PreFullPath);\r
@@ -369,15 +343,16 @@ GetEfiSysPartitionFromBootOptionFilePath (
       break;\r
     }\r
 \r
-    DEBUG_CODE (\r
-      CHAR16 *DevicePathStr;\r
+    DEBUG_CODE_BEGIN ();\r
+    CHAR16  *DevicePathStr;\r
 \r
-      DevicePathStr = ConvertDevicePathToText (CurFullPath, TRUE, TRUE);\r
-      if (DevicePathStr != NULL){\r
-        DEBUG ((DEBUG_INFO, "Full device path %s\n", DevicePathStr));\r
-        FreePool (DevicePathStr);\r
-      }\r
-    );\r
+    DevicePathStr = ConvertDevicePathToText (CurFullPath, TRUE, TRUE);\r
+    if (DevicePathStr != NULL) {\r
+      DEBUG ((DEBUG_INFO, "Full device path %s\n", DevicePathStr));\r
+      FreePool (DevicePathStr);\r
+    }\r
+\r
+    DEBUG_CODE_END ();\r
 \r
     Status = GetEfiSysPartitionFromDevPath (CurFullPath, &FsFullPath, Fs);\r
   } while (EFI_ERROR (Status));\r
@@ -404,13 +379,12 @@ GetEfiSysPartitionFromBootOptionFilePath (
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 GetUpdateFileSystem (\r
   IN  CHAR16                           *Map,\r
   OUT UINT16                           *BootNext,\r
   OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  **Fs,\r
   OUT BOOLEAN                          *UpdateBootNext\r
-)\r
+  )\r
 {\r
   EFI_STATUS                      Status;\r
   CHAR16                          BootOptionName[20];\r
@@ -430,7 +404,7 @@ GetUpdateFileSystem (
 \r
   ShellProtocol = GetShellProtocol ();\r
   if (ShellProtocol == NULL) {\r
-    Print (L"Get Shell Protocol Fail\n");;\r
+    Print (L"Get Shell Protocol Fail\n");\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
@@ -438,23 +412,26 @@ GetUpdateFileSystem (
   // 1. If Fs is not assigned and there are capsule provisioned before,\r
   // Get EFI system partition from BootNext.\r
   //\r
-  if (IsCapsuleProvisioned () && Map == NULL) {\r
+  if (IsCapsuleProvisioned () && (Map == NULL)) {\r
     Status = GetVariable2 (\r
                L"BootNext",\r
                &gEfiGlobalVariableGuid,\r
                (VOID **)&BootNextData,\r
                NULL\r
                );\r
-    if (!EFI_ERROR (Status)) {\r
+    if (EFI_ERROR (Status) || (BootNextData == NULL)) {\r
+      Print (L"Get Boot Next Data Fail. Status = %r\n", Status);\r
+      return EFI_NOT_FOUND;\r
+    } else {\r
       UnicodeSPrint (BootOptionName, sizeof (BootOptionName), L"Boot%04x", *BootNextData);\r
       Status = EfiBootManagerVariableToLoadOption (BootOptionName, &BootNextOption);\r
       if (!EFI_ERROR (Status)) {\r
         DevicePath = BootNextOption.FilePath;\r
-        Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);\r
+        Status     = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);\r
         if (!EFI_ERROR (Status)) {\r
           *UpdateBootNext = FALSE;\r
-          Print(L"Get EFI system partition from BootNext : %s\n", BootNextOption.Description);\r
-          Print(L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));\r
+          Print (L"Get EFI system partition from BootNext : %s\n", BootNextOption.Description);\r
+          Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));\r
           return EFI_SUCCESS;\r
         }\r
       }\r
@@ -467,10 +444,10 @@ GetUpdateFileSystem (
   if (Map != NULL) {\r
     MappedDevicePath = ShellProtocol->GetDevicePathFromMap (Map);\r
     if (MappedDevicePath == NULL) {\r
-      Print(L"'%s' is not a valid mapping.\n", Map);\r
+      Print (L"'%s' is not a valid mapping.\n", Map);\r
       return EFI_INVALID_PARAMETER;\r
     } else if (!IsEfiSysPartitionDevicePath (DuplicateDevicePath (MappedDevicePath))) {\r
-      Print(L"'%s' is not a EFI System Partition.\n", Map);\r
+      Print (L"'%s' is not a EFI System Partition.\n", Map);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
@@ -479,9 +456,10 @@ GetUpdateFileSystem (
   // 2. Get EFI system partition form boot options.\r
   //\r
   BootOptionBuffer = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);\r
-  if ( (BootOptionBuffer == NULL) ||\r
-       (BootOptionCount == 0 && Map == NULL)\r
-     ) {\r
+  if ((BootOptionBuffer == NULL) ||\r
+      ((BootOptionCount == 0) && (Map == NULL))\r
+      )\r
+  {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
@@ -489,32 +467,34 @@ GetUpdateFileSystem (
     //\r
     // Get the boot option from the link list\r
     //\r
-    DevicePath  = BootOptionBuffer[Index].FilePath;\r
+    DevicePath = BootOptionBuffer[Index].FilePath;\r
 \r
     //\r
     // Skip inactive or legacy boot options\r
     //\r
-    if ((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0 ||\r
-        DevicePathType (DevicePath) == BBS_DEVICE_PATH) {\r
+    if (((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0) ||\r
+        (DevicePathType (DevicePath) == BBS_DEVICE_PATH))\r
+    {\r
       continue;\r
     }\r
 \r
-    DEBUG_CODE (\r
-      CHAR16 *DevicePathStr;\r
+    DEBUG_CODE_BEGIN ();\r
+    CHAR16  *DevicePathStr;\r
 \r
-      DevicePathStr = ConvertDevicePathToText (DevicePath, TRUE, TRUE);\r
-      if (DevicePathStr != NULL){\r
-        DEBUG ((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));\r
-        FreePool (DevicePathStr);\r
-      } else {\r
-        DEBUG ((DEBUG_INFO, "DevicePathToStr failed\n"));\r
-      }\r
-    );\r
+    DevicePathStr = ConvertDevicePathToText (DevicePath, TRUE, TRUE);\r
+    if (DevicePathStr != NULL) {\r
+      DEBUG ((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));\r
+      FreePool (DevicePathStr);\r
+    } else {\r
+      DEBUG ((DEBUG_INFO, "DevicePathToStr failed\n"));\r
+    }\r
+\r
+    DEBUG_CODE_END ();\r
 \r
     Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);\r
     if (!EFI_ERROR (Status)) {\r
       if (Map == NULL) {\r
-        *BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber;\r
+        *BootNext       = (UINT16)BootOptionBuffer[Index].OptionNumber;\r
         *UpdateBootNext = TRUE;\r
         Print (L"Found EFI system partition on Boot%04x: %s\n", *BootNext, BootOptionBuffer[Index].Description);\r
         Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));\r
@@ -522,7 +502,7 @@ GetUpdateFileSystem (
       }\r
 \r
       if (StrnCmp (Map, ShellProtocol->GetMapFromDevicePath (&FullPath), StrLen (Map)) == 0) {\r
-        *BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber;\r
+        *BootNext       = (UINT16)BootOptionBuffer[Index].OptionNumber;\r
         *UpdateBootNext = TRUE;\r
         Print (L"Found Boot Option on %s : %s\n", Map, BootOptionBuffer[Index].Description);\r
         return EFI_SUCCESS;\r
@@ -538,11 +518,12 @@ GetUpdateFileSystem (
     // If map is assigned, try to get ESP from mapped Fs.\r
     //\r
     DevicePath = DuplicateDevicePath (MappedDevicePath);\r
-    Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);\r
+    Status     = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);\r
     if (EFI_ERROR (Status)) {\r
-      Print (L"Error: Cannot get EFI system partiion from '%s' - %r\n", Map, Status);\r
+      Print (L"Error: Cannot get EFI system partition from '%s' - %r\n", Map, Status);\r
       return EFI_NOT_FOUND;\r
     }\r
+\r
     Print (L"Warning: Cannot find Boot Option on '%s'!\n", Map);\r
   } else {\r
     Status = GetEfiSysPartition (&DevicePath, Fs);\r
@@ -560,15 +541,16 @@ GetUpdateFileSystem (
              LOAD_OPTION_ACTIVE,\r
              L"UEFI Capsule On Disk",\r
              DevicePath,\r
-             (UINT8 *) &mCapsuleOnDiskBootOptionGuid,\r
-             sizeof(EFI_GUID)\r
+             (UINT8 *)&mCapsuleOnDiskBootOptionGuid,\r
+             sizeof (EFI_GUID)\r
              );\r
   if (!EFI_ERROR (Status)) {\r
-    Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1); {\r
+    Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN)-1);\r
+    {\r
       if (!EFI_ERROR (Status)) {\r
         *UpdateBootNext = TRUE;\r
-        *BootNext = (UINT16) NewOption.OptionNumber;\r
-        Print (L"  Boot%04x: %s\n", *BootNext, ConvertDevicePathToText(DevicePath, TRUE, TRUE));\r
+        *BootNext       = (UINT16)NewOption.OptionNumber;\r
+        Print (L"  Boot%04x: %s\n", *BootNext, ConvertDevicePathToText (DevicePath, TRUE, TRUE));\r
         return EFI_SUCCESS;\r
       }\r
     }\r
@@ -595,25 +577,25 @@ GetUpdateFileSystem (
 **/\r
 EFI_STATUS\r
 WriteUpdateFile (\r
-  IN  VOID                                 **Buffer,\r
-  IN  UINTN                                *BufferSize,\r
-  IN  CHAR16                               **FileName,\r
-  IN  UINTN                                BufferNum,\r
-  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL      *Fs\r
-)\r
+  IN  VOID                             **Buffer,\r
+  IN  UINTN                            *BufferSize,\r
+  IN  CHAR16                           **FileName,\r
+  IN  UINTN                            BufferNum,\r
+  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *Fs\r
+  )\r
 {\r
-  EFI_STATUS                          Status;\r
-  EFI_FILE                            *Root;\r
-  EFI_FILE                            *FileHandle;\r
-  EFI_FILE_PROTOCOL                   *DirHandle;\r
-  UINT64                              FileInfo;\r
-  VOID                                *Filebuffer;\r
-  UINTN                               FileSize;\r
-  UINTN                               Index;\r
-\r
-  DirHandle   = NULL;\r
-  FileHandle  = NULL;\r
-  Index       = 0;\r
+  EFI_STATUS         Status;\r
+  EFI_FILE           *Root;\r
+  EFI_FILE           *FileHandle;\r
+  EFI_FILE_PROTOCOL  *DirHandle;\r
+  UINT64             FileInfo;\r
+  VOID               *Filebuffer;\r
+  UINTN              FileSize;\r
+  UINTN              Index;\r
+\r
+  DirHandle  = NULL;\r
+  FileHandle = NULL;\r
+  Index      = 0;\r
 \r
   //\r
   // Open Root from SFS\r
@@ -631,15 +613,16 @@ WriteUpdateFile (
   if (EFI_ERROR (Status)) {\r
     Status = Root->Open (Root, &DirHandle, L"\\EFI", EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY);\r
     if (EFI_ERROR (Status)) {\r
-      Print(L"Unable to create %s directory\n", L"\\EFI");\r
+      Print (L"Unable to create %s directory\n", L"\\EFI");\r
       return EFI_NOT_FOUND;\r
     }\r
   }\r
-  Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE , 0);\r
+\r
+  Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0);\r
   if (EFI_ERROR (Status)) {\r
     Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY);\r
     if (EFI_ERROR (Status)) {\r
-      Print(L"Unable to create %s directory\n", EFI_CAPSULE_FILE_DIRECTORY);\r
+      Print (L"Unable to create %s directory\n", EFI_CAPSULE_FILE_DIRECTORY);\r
       return EFI_NOT_FOUND;\r
     }\r
   }\r
@@ -674,7 +657,7 @@ WriteUpdateFile (
       // Set the file size to 0.\r
       //\r
       FileInfo = 0;\r
-      Status = FileHandleSetSize (FileHandle, FileInfo);\r
+      Status   = FileHandleSetSize (FileHandle, FileInfo);\r
       if (EFI_ERROR (Status)) {\r
         Print (L"Error Deleting %s\n", FileName[Index]);\r
         FileHandleClose (FileHandle);\r
@@ -686,8 +669,8 @@ WriteUpdateFile (
     // Write Filebuffer to file\r
     //\r
     Filebuffer = Buffer[Index];\r
-    FileSize = BufferSize[Index];\r
-    Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer);\r
+    FileSize   = BufferSize[Index];\r
+    Status     = FileHandleWrite (FileHandle, &FileSize, Filebuffer);\r
     if (EFI_ERROR (Status)) {\r
       Print (L"Unable to write Capsule Update to %s, Status = %r\n", FileName[Index], Status);\r
       return EFI_NOT_FOUND;\r
@@ -711,42 +694,78 @@ WriteUpdateFile (
 **/\r
 EFI_STATUS\r
 SetCapsuleStatusVariable (\r
-  BOOLEAN                       SetCap\r
+  BOOLEAN  SetCap\r
   )\r
 {\r
-  EFI_STATUS                    Status;\r
-  UINT64                        OsIndication;\r
-  UINTN                         DataSize;\r
+  EFI_STATUS  Status;\r
+  UINT64      OsIndication;\r
+  UINTN       DataSize;\r
 \r
   OsIndication = 0;\r
-  DataSize = sizeof(UINT64);\r
-  Status = gRT->GetVariable (\r
-                  L"OsIndications",\r
-                  &gEfiGlobalVariableGuid,\r
-                  NULL,\r
-                  &DataSize,\r
-                  &OsIndication\r
-                  );\r
+  DataSize     = sizeof (UINT64);\r
+  Status       = gRT->GetVariable (\r
+                        L"OsIndications",\r
+                        &gEfiGlobalVariableGuid,\r
+                        NULL,\r
+                        &DataSize,\r
+                        &OsIndication\r
+                        );\r
   if (EFI_ERROR (Status)) {\r
     OsIndication = 0;\r
   }\r
+\r
   if (SetCap) {\r
     OsIndication |= ((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);\r
-  }\r
-  else {\r
+  } else {\r
     OsIndication &= ~((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);\r
   }\r
+\r
   Status = gRT->SetVariable (\r
                   L"OsIndications",\r
                   &gEfiGlobalVariableGuid,\r
                   EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                  sizeof(UINT64),\r
+                  sizeof (UINT64),\r
                   &OsIndication\r
                   );\r
 \r
   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
@@ -762,17 +781,27 @@ SetCapsuleStatusVariable (
 **/\r
 EFI_STATUS\r
 ProcessCapsuleOnDisk (\r
-  IN VOID                          **CapsuleBuffer,\r
-  IN UINTN                         *CapsuleBufferSize,\r
-  IN CHAR16                        **FilePath,\r
-  IN CHAR16                        *Map,\r
-  IN UINTN                         CapsuleNum\r
+  IN VOID    **CapsuleBuffer,\r
+  IN UINTN   *CapsuleBufferSize,\r
+  IN CHAR16  **FilePath,\r
+  IN CHAR16  *Map,\r
+  IN UINTN   CapsuleNum\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  UINT16                          BootNext;\r
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;\r
-  BOOLEAN                         UpdateBootNext;\r
+  EFI_STATUS                       Status;\r
+  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
@@ -781,14 +810,21 @@ ProcessCapsuleOnDisk (
 \r
   Status = GetUpdateFileSystem (Map, &BootNext, &Fs, &UpdateBootNext);\r
   if (EFI_ERROR (Status)) {\r
-    Print (L"CapsuleApp: cannot find a valid file system on boot devies. Status = %r\n", Status);\r
+    Print (L"CapsuleApp: cannot find a valid file system on boot devices. Status = %r\n", Status);\r
     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
@@ -805,13 +841,13 @@ ProcessCapsuleOnDisk (
 \r
   if (UpdateBootNext) {\r
     Status = gRT->SetVariable (\r
-      L"BootNext",\r
-      &gEfiGlobalVariableGuid,\r
-      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-      sizeof(UINT16),\r
-      &BootNext\r
-      );\r
-    if (EFI_ERROR (Status)){\r
+                    L"BootNext",\r
+                    &gEfiGlobalVariableGuid,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    sizeof (UINT16),\r
+                    &BootNext\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
       Print (L"CapsuleApp: unable to set BootNext variable.\n");\r
       return Status;\r
     }\r