]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
MdeModulePkg/CapsuleLib: Add CapsuleTarget support.
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleReportLib.c
index d34eb25a6e5d06336415c38402537fc8c4a8487d..61ede5cfa9a2b9e9be562f1d07fa3034ec7f8d50 100644 (file)
@@ -30,6 +30,7 @@
 #include <Library/HobLib.h>\r
 #include <Library/PrintLib.h>\r
 #include <Library/ReportStatusCodeLib.h>\r
+#include <Library/DevicePathLib.h>\r
 #include <Library/CapsuleLib.h>\r
 \r
 #include <IndustryStandard/WindowsUxCapsule.h>\r
@@ -280,6 +281,7 @@ RecordCapsuleStatusVariable (
   @param[in] CapsuleStatus  The capsule process stauts\r
   @param[in] PayloadIndex   FMP payload index\r
   @param[in] ImageHeader    FMP image header\r
+  @param[in] FmpDevicePath  DevicePath associated with the FMP producer\r
 \r
   @retval EFI_SUCCESS          The capsule status variable is recorded.\r
   @retval EFI_OUT_OF_RESOURCES No resource to record the capsule status variable.\r
@@ -289,26 +291,37 @@ RecordFmpCapsuleStatusVariable (
   IN EFI_CAPSULE_HEADER                            *CapsuleHeader,\r
   IN EFI_STATUS                                    CapsuleStatus,\r
   IN UINTN                                         PayloadIndex,\r
-  IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER  *ImageHeader\r
+  IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER  *ImageHeader,\r
+  IN EFI_DEVICE_PATH_PROTOCOL                      *FmpDevicePath OPTIONAL\r
   )\r
 {\r
   EFI_CAPSULE_RESULT_VARIABLE_HEADER  *CapsuleResultVariableHeader;\r
   EFI_CAPSULE_RESULT_VARIABLE_FMP     *CapsuleResultVariableFmp;\r
   EFI_STATUS                          Status;\r
   UINT8                               *CapsuleResultVariable;\r
-  UINT32                              CapsuleResultVariableSize;\r
+  UINTN                               CapsuleResultVariableSize;\r
+  CHAR16                              *DevicePathStr;\r
+  UINTN                               DevicePathStrSize;\r
 \r
-  CapsuleResultVariable     = NULL;\r
+  DevicePathStr = NULL;\r
+  if (FmpDevicePath != NULL) {\r
+    DevicePathStr = ConvertDevicePathToText (FmpDevicePath, FALSE, FALSE);\r
+  }\r
+  if (DevicePathStr != NULL) {\r
+    DevicePathStrSize = StrSize(DevicePathStr);\r
+  } else {\r
+    DevicePathStrSize = sizeof(CHAR16);\r
+  }\r
   //\r
-  // Allocate zero CHAR16 for CapsuleFileName and CapsuleTarget.\r
+  // Allocate zero CHAR16 for CapsuleFileName.\r
   //\r
-  CapsuleResultVariableSize = sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + sizeof(CHAR16) * 2;\r
+  CapsuleResultVariableSize = sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + sizeof(CHAR16) + DevicePathStrSize;\r
   CapsuleResultVariable     = AllocateZeroPool (CapsuleResultVariableSize);\r
   if (CapsuleResultVariable == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
   CapsuleResultVariableHeader = (VOID *)CapsuleResultVariable;\r
-  CapsuleResultVariableHeader->VariableTotalSize = CapsuleResultVariableSize;\r
+  CapsuleResultVariableHeader->VariableTotalSize = (UINT32)CapsuleResultVariableSize;\r
   CapsuleResultVariableHeader->Reserved = 0;\r
   CopyGuid(&CapsuleResultVariableHeader->CapsuleGuid, &CapsuleHeader->CapsuleGuid);\r
   ZeroMem(&CapsuleResultVariableHeader->CapsuleProcessed, sizeof(CapsuleResultVariableHeader->CapsuleProcessed));\r
@@ -320,6 +333,11 @@ RecordFmpCapsuleStatusVariable (
   CapsuleResultVariableFmp->PayloadIndex = (UINT8)PayloadIndex;\r
   CapsuleResultVariableFmp->UpdateImageIndex = ImageHeader->UpdateImageIndex;\r
   CopyGuid (&CapsuleResultVariableFmp->UpdateImageTypeId, &ImageHeader->UpdateImageTypeId);\r
+  if (DevicePathStr != NULL) {\r
+    CopyMem ((UINT8 *)CapsuleResultVariableFmp + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP) + sizeof(CHAR16), DevicePathStr, DevicePathStrSize);\r
+    FreePool (DevicePathStr);\r
+    DevicePathStr = NULL;\r
+  }\r
 \r
   //\r
   // Save Local Cache\r