]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/CapsuleLib: Add CapsuleTarget support.
authorJiewen Yao <jiewen.yao@intel.com>
Fri, 23 Dec 2016 07:42:27 +0000 (15:42 +0800)
committerJiewen Yao <jiewen.yao@intel.com>
Mon, 26 Dec 2016 04:23:32 +0000 (12:23 +0800)
UEFI spec requires CapsuleTarget to be a device path associated
with FMP producer.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Chao Zhang <chao.b.zhang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Chao Zhang <chao.b.zhang@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLibNull.c

index af08886d02b9baa87970254acdaf91c2f3dff0d7..2bb6ac887fdd13be5ba255192a51fc37586f7c3a 100644 (file)
@@ -100,6 +100,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
@@ -109,7 +110,8 @@ 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
 /**\r
@@ -818,6 +820,7 @@ ProcessFmpCapsuleImage (
   UINTN                                         Index2;\r
   MEMMAP_DEVICE_PATH                            MemMapNode;\r
   EFI_DEVICE_PATH_PROTOCOL                      *DriverDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL                      *FmpDevicePath;\r
   ESRT_MANAGEMENT_PROTOCOL                      *EsrtProtocol;\r
   EFI_SYSTEM_RESOURCE_ENTRY                     EsrtEntry;\r
   VOID                                          *VendorCode;\r
@@ -941,6 +944,13 @@ ProcessFmpCapsuleImage (
         continue;\r
       }\r
 \r
+      FmpDevicePath = NULL;\r
+      gBS->HandleProtocol(\r
+             HandleBuffer[Index1],\r
+             &gEfiDevicePathProtocolGuid,\r
+             (VOID **)&FmpDevicePath\r
+             );\r
+\r
       ImageInfoSize = 0;\r
       Status = Fmp->GetImageInfo (\r
                       Fmp,\r
@@ -1060,7 +1070,8 @@ ProcessFmpCapsuleImage (
               CapsuleHeader,                                 // CapsuleGuid\r
               Status,                                        // CapsuleStatus\r
               Index - FmpCapsuleHeader->EmbeddedDriverCount, // PayloadIndex\r
-              ImageHeader                                    // ImageHeader\r
+              ImageHeader,                                   // ImageHeader\r
+              FmpDevicePath                                  // FmpDevicePath\r
               );\r
             if (StatusRet != EFI_SUCCESS) {\r
               StatusRet = Status;\r
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
index bf550e51ee7b9ea6b8d0d85cc9ad51845ce1b4dc..6ab198d0f14d97c1ce9c6ad353d3e592b577c655 100644 (file)
@@ -64,6 +64,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
@@ -73,7 +74,8 @@ 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
   return EFI_UNSUPPORTED;\r