]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
MdeModulePkg Variable: Abstract GetHobVariableStore function
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / Variable.c
index 7303681aaa293adc801d6ac45694b84e19c731a1..fca8d5380924449533b19572fef040d2d8ec9b60 100644 (file)
@@ -16,7 +16,7 @@
   VariableServiceSetVariable() should also check authenticate data to avoid buffer overflow,\r
   integer overflow. It should also check attribute to avoid authentication bypass.\r
 \r
-Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 (C) Copyright 2015-2018 Hewlett Packard Enterprise Development LP<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -238,6 +238,8 @@ IsValidVariableHeader (
   @param Buffer                  Pointer to the buffer from which data is written.\r
 \r
   @retval EFI_INVALID_PARAMETER  Parameters not valid.\r
+  @retval EFI_UNSUPPORTED        Fvb is a NULL for Non-Volatile variable update.\r
+  @retval EFI_OUT_OF_RESOURCES   The remaining size is not enough.\r
   @retval EFI_SUCCESS            Variable store successfully updated.\r
 \r
 **/\r
@@ -274,7 +276,7 @@ UpdateVariableStore (
   //\r
   if (!Volatile) {\r
     if (Fvb == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
+      return EFI_UNSUPPORTED;\r
     }\r
     Status = Fvb->GetPhysicalAddress(Fvb, &FvVolHdr);\r
     ASSERT_EFI_ERROR (Status);\r
@@ -289,7 +291,7 @@ UpdateVariableStore (
     }\r
 \r
     if ((DataPtr + DataSize) > ((EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) FwVolHeader + FwVolHeader->FvLength))) {\r
-      return EFI_INVALID_PARAMETER;\r
+      return EFI_OUT_OF_RESOURCES;\r
     }\r
   } else {\r
     //\r
@@ -302,7 +304,7 @@ UpdateVariableStore (
     }\r
 \r
     if ((DataPtr + DataSize) > ((UINTN) ((UINT8 *) VolatileBase + VolatileBase->Size))) {\r
-      return EFI_INVALID_PARAMETER;\r
+      return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
     //\r
@@ -1531,8 +1533,8 @@ GetLangFromSupportedLangCodes (
   @param[in]  SupportedLanguages  A pointer to a Null-terminated ASCII string that\r
                                   contains a set of language codes in the format\r
                                   specified by Iso639Language.\r
-  @param[in]  Iso639Language      If TRUE, then all language codes are assumed to be\r
-                                  in ISO 639-2 format.  If FALSE, then all language\r
+  @param[in]  Iso639Language      If not zero, then all language codes are assumed to be\r
+                                  in ISO 639-2 format.  If zero, then all language\r
                                   codes are assumed to be in RFC 4646 language format\r
   @param[in]  ...                 A variable argument list that contains pointers to\r
                                   Null-terminated ASCII strings that contain one or more\r
@@ -1560,7 +1562,7 @@ CHAR8 *
 EFIAPI\r
 VariableGetBestLanguage (\r
   IN CONST CHAR8  *SupportedLanguages,\r
-  IN BOOLEAN      Iso639Language,\r
+  IN UINTN        Iso639Language,\r
   ...\r
   )\r
 {\r
@@ -1586,7 +1588,7 @@ VariableGetBestLanguage (
     //\r
     // If in RFC 4646 mode, then determine the length of the first RFC 4646 language code in Language\r
     //\r
-    if (!Iso639Language) {\r
+    if (Iso639Language == 0) {\r
       for (LanguageLength = 0; Language[LanguageLength] != 0 && Language[LanguageLength] != ';'; LanguageLength++);\r
     }\r
 \r
@@ -1601,7 +1603,7 @@ VariableGetBestLanguage (
         //\r
         // In RFC 4646 mode, then Loop through all language codes in SupportedLanguages\r
         //\r
-        if (!Iso639Language) {\r
+        if (Iso639Language == 0) {\r
           //\r
           // Skip ';' characters in Supported\r
           //\r
@@ -1623,13 +1625,13 @@ VariableGetBestLanguage (
         if (AsciiStrnCmp (Supported, Language, LanguageLength) == 0) {\r
           VA_END (Args);\r
 \r
-          Buffer = Iso639Language ? mVariableModuleGlobal->Lang : mVariableModuleGlobal->PlatformLang;\r
+          Buffer = (Iso639Language != 0) ? mVariableModuleGlobal->Lang : mVariableModuleGlobal->PlatformLang;\r
           Buffer[CompareLength] = '\0';\r
           return CopyMem (Buffer, Supported, CompareLength);\r
         }\r
       }\r
 \r
-      if (Iso639Language) {\r
+      if (Iso639Language != 0) {\r
         //\r
         // If ISO 639 mode, then each language can only be tested once\r
         //\r
@@ -4167,6 +4169,64 @@ ConvertNormalVarStorageToAuthVarStorage (
   mVariableModuleGlobal->VariableGlobal.AuthFormat = TRUE;\r
   return AuthVarStorage;\r
 }\r
+\r
+/**\r
+  Get HOB variable store.\r
+\r
+  @param[out] VariableGuid      NV variable store signature.\r
+\r
+  @retval EFI_SUCCESS           Function successfully executed.\r
+  @retval EFI_OUT_OF_RESOURCES  Fail to allocate enough memory resource.\r
+\r
+**/\r
+EFI_STATUS\r
+GetHobVariableStore (\r
+  IN EFI_GUID                   *VariableGuid\r
+  )\r
+{\r
+  VARIABLE_STORE_HEADER         *VariableStoreHeader;\r
+  UINT64                        VariableStoreLength;\r
+  EFI_HOB_GUID_TYPE             *GuidHob;\r
+  BOOLEAN                       NeedConvertNormalToAuth;\r
+\r
+  //\r
+  // Combinations supported:\r
+  // 1. Normal NV variable store +\r
+  //    Normal HOB variable store\r
+  // 2. Auth NV variable store +\r
+  //    Auth HOB variable store\r
+  // 3. Auth NV variable store +\r
+  //    Normal HOB variable store (code will convert it to Auth Format)\r
+  //\r
+  NeedConvertNormalToAuth = FALSE;\r
+  GuidHob = GetFirstGuidHob (VariableGuid);\r
+  if (GuidHob == NULL && VariableGuid == &gEfiAuthenticatedVariableGuid) {\r
+    //\r
+    // Try getting it from normal variable HOB\r
+    //\r
+    GuidHob = GetFirstGuidHob (&gEfiVariableGuid);\r
+    NeedConvertNormalToAuth = TRUE;\r
+  }\r
+  if (GuidHob != NULL) {\r
+    VariableStoreHeader = GET_GUID_HOB_DATA (GuidHob);\r
+    VariableStoreLength = GuidHob->Header.HobLength - sizeof (EFI_HOB_GUID_TYPE);\r
+    if (GetVariableStoreStatus (VariableStoreHeader) == EfiValid) {\r
+      if (!NeedConvertNormalToAuth) {\r
+        mVariableModuleGlobal->VariableGlobal.HobVariableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) AllocateRuntimeCopyPool ((UINTN) VariableStoreLength, (VOID *) VariableStoreHeader);\r
+      } else {\r
+        mVariableModuleGlobal->VariableGlobal.HobVariableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) ConvertNormalVarStorageToAuthVarStorage ((VOID *) VariableStoreHeader);\r
+      }\r
+      if (mVariableModuleGlobal->VariableGlobal.HobVariableBase == 0) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+    } else {\r
+      DEBUG ((EFI_D_ERROR, "HOB Variable Store header is corrupted!\n"));\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Initializes variable store area for non-volatile and volatile variable.\r
 \r
@@ -4181,13 +4241,9 @@ VariableCommonInitialize (
 {\r
   EFI_STATUS                      Status;\r
   VARIABLE_STORE_HEADER           *VolatileVariableStore;\r
-  VARIABLE_STORE_HEADER           *VariableStoreHeader;\r
-  UINT64                          VariableStoreLength;\r
   UINTN                           ScratchSize;\r
-  EFI_HOB_GUID_TYPE               *GuidHob;\r
   EFI_GUID                        *VariableGuid;\r
   EFI_FIRMWARE_VOLUME_HEADER      *NvFvHeader;\r
-  BOOLEAN                         IsNormalVariableHob;\r
 \r
   //\r
   // Allocate runtime memory for variable driver global structure.\r
@@ -4229,32 +4285,11 @@ VariableCommonInitialize (
   //\r
   // Get HOB variable store.\r
   //\r
-  IsNormalVariableHob = FALSE;\r
-  GuidHob = GetFirstGuidHob (VariableGuid);\r
-  if (GuidHob == NULL && VariableGuid == &gEfiAuthenticatedVariableGuid) {\r
-    //\r
-    // Try getting it from normal variable HOB\r
-    //\r
-    GuidHob = GetFirstGuidHob (&gEfiVariableGuid);\r
-    IsNormalVariableHob = TRUE;\r
-  }\r
-  if (GuidHob != NULL) {\r
-    VariableStoreHeader = GET_GUID_HOB_DATA (GuidHob);\r
-    VariableStoreLength = GuidHob->Header.HobLength - sizeof (EFI_HOB_GUID_TYPE);\r
-    if (GetVariableStoreStatus (VariableStoreHeader) == EfiValid) {\r
-      if (!IsNormalVariableHob) {\r
-        mVariableModuleGlobal->VariableGlobal.HobVariableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) AllocateRuntimeCopyPool ((UINTN) VariableStoreLength, (VOID *) VariableStoreHeader);\r
-      } else {\r
-        mVariableModuleGlobal->VariableGlobal.HobVariableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) ConvertNormalVarStorageToAuthVarStorage ((VOID *) VariableStoreHeader);\r
-      }\r
-      if (mVariableModuleGlobal->VariableGlobal.HobVariableBase == 0) {\r
-        FreePool (NvFvHeader);\r
-        FreePool (mVariableModuleGlobal);\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-    } else {\r
-      DEBUG ((EFI_D_ERROR, "HOB Variable Store header is corrupted!\n"));\r
-    }\r
+  Status = GetHobVariableStore (VariableGuid);\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (NvFvHeader);\r
+    FreePool (mVariableModuleGlobal);\r
+    return Status;\r
   }\r
 \r
   mVariableModuleGlobal->MaxVolatileVariableSize = ((PcdGet32 (PcdMaxVolatileVariableSize) != 0) ?\r