]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c
MdeModulePkg: Replace [Ascii|Unicode]ValueToString
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleReportLib.c
index 25468712a89459337608ed0f6455c3c3b1f2920c..fc0f8698a9b42b5878a188ad87346792a569dd57 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   DXE capsule report related function.\r
 \r
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2017, 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
 #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
 \r
-typedef struct {\r
-  EFI_CAPSULE_RESULT_VARIABLE_HEADER  CapsuleResultHeader;\r
-  EFI_CAPSULE_RESULT_VARIABLE_FMP     CapsuleResultFmp;\r
-} CAPSULE_RESULT_VARIABLE_CACHE;\r
-\r
-#define CAPSULE_RESULT_VARIABLE_CACHE_COUNT   0x10\r
-\r
-CAPSULE_RESULT_VARIABLE_CACHE *mCapsuleResultVariableCache;\r
-UINTN                         mCapsuleResultVariableCacheMaxCount;\r
-UINTN                         mCapsuleResultVariableCacheCount;\r
-\r
 /**\r
   Get current capsule last variable index.\r
 \r
@@ -76,97 +66,11 @@ GetCurrentCapsuleLastIndex (
   return CurrentIndex;\r
 }\r
 \r
-/**\r
-  Check if this FMP capsule is processed.\r
-\r
-  @param[in] CapsuleHeader  The capsule image header\r
-  @param[in] PayloadIndex   FMP payload index\r
-  @param[in] ImageHeader    FMP image header\r
-\r
-  @retval TRUE  This FMP capsule is processed.\r
-  @retval FALSE This FMP capsule is not processed.\r
-**/\r
-BOOLEAN\r
-IsFmpCapsuleProcessed (\r
-  IN EFI_CAPSULE_HEADER                            *CapsuleHeader,\r
-  IN UINTN                                         PayloadIndex,\r
-  IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER  *ImageHeader\r
-  )\r
-{\r
-  UINTN                               Index;\r
-  EFI_CAPSULE_RESULT_VARIABLE_HEADER  *CapsuleResult;\r
-  EFI_CAPSULE_RESULT_VARIABLE_FMP     *CapsuleResultFmp;\r
-\r
-  for (Index = 0; Index < mCapsuleResultVariableCacheCount; Index++) {\r
-    //\r
-    // Check\r
-    //\r
-    CapsuleResult = &mCapsuleResultVariableCache[Index].CapsuleResultHeader;\r
-    if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER)) {\r
-      if (CompareGuid(&CapsuleResult->CapsuleGuid, &gEfiFmpCapsuleGuid)) {\r
-        if (CapsuleResult->VariableTotalSize >= sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP)) {\r
-          CapsuleResultFmp = (EFI_CAPSULE_RESULT_VARIABLE_FMP *)(CapsuleResult + 1);\r
-          if (CompareGuid(&CapsuleResultFmp->UpdateImageTypeId, &ImageHeader->UpdateImageTypeId) &&\r
-              (CapsuleResultFmp->UpdateImageIndex == ImageHeader->UpdateImageIndex) &&\r
-              (CapsuleResultFmp->PayloadIndex == PayloadIndex) ) {\r
-            return TRUE;\r
-          }\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/**\r
-  Write a new capsule status variable cache.\r
-\r
-  @param[in] CapsuleResult      The capsule status variable\r
-  @param[in] CapsuleResultSize  The size of the capsule stauts variable in bytes\r
-\r
-  @retval EFI_SUCCESS          The capsule status variable is cached.\r
-  @retval EFI_OUT_OF_RESOURCES No resource to cache the capsule status variable.\r
-**/\r
-EFI_STATUS\r
-WriteNewCapsuleResultVariableCache (\r
-  IN VOID    *CapsuleResult,\r
-  IN UINTN   CapsuleResultSize\r
-  )\r
-{\r
-  if (CapsuleResultSize > sizeof(CAPSULE_RESULT_VARIABLE_CACHE)) {\r
-    CapsuleResultSize = sizeof(CAPSULE_RESULT_VARIABLE_CACHE);\r
-  }\r
-\r
-  if (mCapsuleResultVariableCacheCount == mCapsuleResultVariableCacheMaxCount) {\r
-    mCapsuleResultVariableCache = ReallocatePool(\r
-                                    mCapsuleResultVariableCacheMaxCount * sizeof(CAPSULE_RESULT_VARIABLE_CACHE),\r
-                                    (mCapsuleResultVariableCacheMaxCount + CAPSULE_RESULT_VARIABLE_CACHE_COUNT) * sizeof(CAPSULE_RESULT_VARIABLE_CACHE),\r
-                                    mCapsuleResultVariableCache\r
-                                    );\r
-    if (mCapsuleResultVariableCache == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-    mCapsuleResultVariableCacheMaxCount += CAPSULE_RESULT_VARIABLE_CACHE_COUNT;\r
-  }\r
-\r
-  ASSERT(mCapsuleResultVariableCacheCount < mCapsuleResultVariableCacheMaxCount);\r
-  ASSERT(mCapsuleResultVariableCache != NULL);\r
-  CopyMem(\r
-    &mCapsuleResultVariableCache[mCapsuleResultVariableCacheCount],\r
-    CapsuleResult,\r
-    CapsuleResultSize\r
-    );\r
-  mCapsuleResultVariableCacheCount++;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 /**\r
   Get a new capsule status variable index.\r
 \r
   @return A new capsule status variable index.\r
-  @retval -1  No new capsule status variable index.\r
+  @retval 0  No new capsule status variable index. Rolling over.\r
 **/\r
 INTN\r
 GetNewCapsuleResultIndex (\r
@@ -177,7 +81,8 @@ GetNewCapsuleResultIndex (
 \r
   CurrentIndex = GetCurrentCapsuleLastIndex();\r
   if (CurrentIndex >= PcdGet16(PcdCapsuleMax)) {\r
-    return -1;\r
+    DEBUG((DEBUG_INFO, "  CapsuleResult variable Rolling Over!\n"));\r
+    return 0;\r
   }\r
 \r
   return CurrentIndex + 1;\r
@@ -205,9 +110,7 @@ WriteNewCapsuleResultVariable (
 \r
   CapsuleResultIndex = GetNewCapsuleResultIndex();\r
   DEBUG((DEBUG_INFO, "New CapsuleResultIndex - 0x%x\n", CapsuleResultIndex));\r
-  if (CapsuleResultIndex == -1) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
+\r
   UnicodeSPrint(\r
     CapsuleResultStr,\r
     sizeof(CapsuleResultStr),\r
@@ -256,16 +159,13 @@ RecordCapsuleStatusVariable (
   EFI_STATUS                          Status;\r
 \r
   CapsuleResultVariable.VariableTotalSize = sizeof(CapsuleResultVariable);\r
+  CapsuleResultVariable.Reserved = 0;\r
   CopyGuid (&CapsuleResultVariable.CapsuleGuid, &CapsuleHeader->CapsuleGuid);\r
   ZeroMem(&CapsuleResultVariable.CapsuleProcessed, sizeof(CapsuleResultVariable.CapsuleProcessed));\r
   gRT->GetTime(&CapsuleResultVariable.CapsuleProcessed, NULL);\r
   CapsuleResultVariable.CapsuleStatus = CapsuleStatus;\r
 \r
-  //\r
-  // Save Local Cache\r
-  //\r
-  Status = WriteNewCapsuleResultVariableCache(&CapsuleResultVariable, sizeof(CapsuleResultVariable));\r
-\r
+  Status = EFI_SUCCESS;\r
   if ((CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {\r
     Status = WriteNewCapsuleResultVariable(&CapsuleResultVariable, sizeof(CapsuleResultVariable));\r
   }\r
@@ -279,6 +179,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
@@ -288,23 +189,38 @@ 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
-  CapsuleResultVariableSize = sizeof(EFI_CAPSULE_RESULT_VARIABLE_HEADER) + sizeof(EFI_CAPSULE_RESULT_VARIABLE_FMP);\r
-  CapsuleResultVariable     = AllocatePool (CapsuleResultVariableSize);\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.\r
+  //\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
   gRT->GetTime(&CapsuleResultVariableHeader->CapsuleProcessed, NULL);\r
@@ -315,12 +231,13 @@ 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
-  //\r
-  Status = WriteNewCapsuleResultVariableCache(CapsuleResultVariable, CapsuleResultVariableSize);\r
-\r
+  Status = EFI_SUCCESS;\r
   if ((CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {\r
     Status = WriteNewCapsuleResultVariable(CapsuleResultVariable, CapsuleResultVariableSize);\r
   }\r
@@ -460,7 +377,13 @@ InitCapsuleUpdateVariable (
   Index = 0;\r
   while (TRUE) {\r
     if (Index > 0) {\r
-      UnicodeValueToString (TempVarName, 0, Index, 0);\r
+      UnicodeValueToStringS (\r
+        TempVarName,\r
+        sizeof (CapsuleVarName) - ((UINTN)TempVarName - (UINTN)CapsuleVarName),\r
+        0,\r
+        Index,\r
+        0\r
+        );\r
     }\r
     Status = gRT->SetVariable (\r
                     CapsuleVarName,\r