#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
@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
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
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