]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c
MdeModulePkg: Remove EmuVariableRuntimeDxe
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / EmuRuntimeDxe / EmuVariable.c
diff --git a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c
deleted file mode 100644 (file)
index 1bcf931..0000000
+++ /dev/null
@@ -1,1820 +0,0 @@
-/** @file\r
-\r
-  Emulation Variable services operate on the runtime volatile memory.\r
-  The nonvolatile variable space doesn't exist.\r
-\r
-Copyright (c) 2006 - 2018, 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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "Variable.h"\r
-\r
-///\r
-/// Don't use module globals after the SetVirtualAddress map is signaled\r
-///\r
-ESAL_VARIABLE_GLOBAL  *mVariableModuleGlobal;\r
-\r
-VARIABLE_INFO_ENTRY *gVariableInfo = NULL;\r
-\r
-///\r
-/// The size of a 3 character ISO639 language code.\r
-///\r
-#define ISO_639_2_ENTRY_SIZE    3\r
-\r
-/**\r
-  Update the variable region with Variable information. These are the same\r
-  arguments as the EFI Variable services.\r
-\r
-  @param[in] VariableName       Name of variable\r
-\r
-  @param[in] VendorGuid         Guid of variable\r
-\r
-  @param[in] Data               Variable data\r
-\r
-  @param[in] DataSize           Size of data. 0 means delete\r
-\r
-  @param[in] Attributes         Attribues of the variable\r
-\r
-  @param[in] Variable           The variable information which is used to keep track of variable usage.\r
-\r
-  @retval EFI_SUCCESS           The update operation is success.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES  Variable region is full, can not write other data into this region.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UpdateVariable (\r
-  IN      CHAR16                 *VariableName,\r
-  IN      EFI_GUID               *VendorGuid,\r
-  IN      VOID                   *Data,\r
-  IN      UINTN                  DataSize,\r
-  IN      UINT32                 Attributes OPTIONAL,\r
-  IN      VARIABLE_POINTER_TRACK *Variable\r
-  );\r
-\r
-/**\r
-  Finds variable in storage blocks of volatile and non-volatile storage areas.\r
-\r
-  This code finds variable in storage blocks of volatile and non-volatile storage areas.\r
-  If VariableName is an empty string, then we just return the first\r
-  qualified variable without comparing VariableName and VendorGuid.\r
-  Otherwise, VariableName and VendorGuid are compared.\r
-\r
-  @param  VariableName                Name of the variable to be found.\r
-  @param  VendorGuid                  Vendor GUID to be found.\r
-  @param  PtrTrack                    VARIABLE_POINTER_TRACK structure for output,\r
-                                      including the range searched and the target position.\r
-  @param  Global                      Pointer to VARIABLE_GLOBAL structure, including\r
-                                      base of volatile variable storage area, base of\r
-                                      NV variable storage area, and a lock.\r
-\r
-  @retval EFI_INVALID_PARAMETER       If VariableName is not an empty string, while\r
-                                      VendorGuid is NULL.\r
-  @retval EFI_SUCCESS                 Variable successfully found.\r
-  @retval EFI_NOT_FOUND               Variable not found.\r
-\r
-**/\r
-EFI_STATUS\r
-FindVariable (\r
-  IN  CHAR16                  *VariableName,\r
-  IN  EFI_GUID                *VendorGuid,\r
-  OUT VARIABLE_POINTER_TRACK  *PtrTrack,\r
-  IN  VARIABLE_GLOBAL         *Global\r
-  );\r
-\r
-/**\r
-  Acquires lock only at boot time. Simply returns at runtime.\r
-\r
-  This is a temperary function which will be removed when\r
-  EfiAcquireLock() in UefiLib can handle the call in UEFI\r
-  Runtimer driver in RT phase.\r
-  It calls EfiAcquireLock() at boot time, and simply returns\r
-  at runtime\r
-\r
-  @param  Lock         A pointer to the lock to acquire\r
-\r
-**/\r
-VOID\r
-AcquireLockOnlyAtBootTime (\r
-  IN EFI_LOCK  *Lock\r
-  )\r
-{\r
-  if (!EfiAtRuntime ()) {\r
-    EfiAcquireLock (Lock);\r
-  }\r
-}\r
-\r
-/**\r
-  Releases lock only at boot time. Simply returns at runtime.\r
-\r
-  This is a temperary function which will be removed when\r
-  EfiReleaseLock() in UefiLib can handle the call in UEFI\r
-  Runtimer driver in RT phase.\r
-  It calls EfiReleaseLock() at boot time, and simply returns\r
-  at runtime\r
-\r
-  @param  Lock         A pointer to the lock to release\r
-\r
-**/\r
-VOID\r
-ReleaseLockOnlyAtBootTime (\r
-  IN EFI_LOCK  *Lock\r
-  )\r
-{\r
-  if (!EfiAtRuntime ()) {\r
-    EfiReleaseLock (Lock);\r
-  }\r
-}\r
-\r
-/**\r
-  Gets pointer to the variable data.\r
-\r
-  This function gets the pointer to the variable data according\r
-  to the input pointer to the variable header.\r
-\r
-  @param  Variable      Pointer to the variable header.\r
-\r
-  @return Pointer to variable data\r
-\r
-**/\r
-UINT8 *\r
-GetVariableDataPtr (\r
-  IN  VARIABLE_HEADER   *Variable\r
-  )\r
-{\r
-  if (Variable->StartId != VARIABLE_DATA) {\r
-    return NULL;\r
-  }\r
-  //\r
-  // Be careful about pad size for alignment\r
-  //\r
-  return (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (Variable) + Variable->NameSize + GET_PAD_SIZE (Variable->NameSize));\r
-}\r
-\r
-/**\r
-  Gets pointer to header of the next potential variable.\r
-\r
-  This function gets the pointer to the next potential variable header\r
-  according to the input point to the variable header.  The return value\r
-  is not a valid variable if the input variable was the last variable\r
-  in the variabl store.\r
-\r
-  @param  Variable      Pointer to header of the next variable\r
-\r
-  @return Pointer to next variable header.\r
-  @retval NULL  Input was not a valid variable header.\r
-\r
-**/\r
-VARIABLE_HEADER *\r
-GetNextPotentialVariablePtr (\r
-  IN  VARIABLE_HEADER   *Variable\r
-  )\r
-{\r
-  VARIABLE_HEADER *VarHeader;\r
-\r
-  if (Variable->StartId != VARIABLE_DATA) {\r
-    return NULL;\r
-  }\r
-  //\r
-  // Be careful about pad size for alignment\r
-  //\r
-  VarHeader = (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GetVariableDataPtr (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize));\r
-\r
-  return VarHeader;\r
-}\r
-\r
-/**\r
-  Gets pointer to header of the next variable.\r
-\r
-  This function gets the pointer to the next variable header according\r
-  to the input point to the variable header.\r
-\r
-  @param  Variable      Pointer to header of the next variable\r
-\r
-  @return Pointer to next variable header.\r
-\r
-**/\r
-VARIABLE_HEADER *\r
-GetNextVariablePtr (\r
-  IN  VARIABLE_HEADER   *Variable\r
-  )\r
-{\r
-  VARIABLE_HEADER *VarHeader;\r
-\r
-  VarHeader = GetNextPotentialVariablePtr (Variable);\r
-\r
-  if ((VarHeader == NULL) || (VarHeader->StartId != VARIABLE_DATA)) {\r
-    return NULL;\r
-  }\r
-\r
-  return VarHeader;\r
-}\r
-\r
-/**\r
-  Updates LastVariableOffset variable for the given variable store.\r
-\r
-  LastVariableOffset points to the offset to use for the next variable\r
-  when updating the variable store.\r
-\r
-  @param[in]   VariableStore       Pointer to the start of the variable store\r
-  @param[out]  LastVariableOffset  Offset to put the next new variable in\r
-\r
-**/\r
-VOID\r
-InitializeLocationForLastVariableOffset (\r
-  IN  VARIABLE_STORE_HEADER *VariableStore,\r
-  OUT UINTN                 *LastVariableOffset\r
-  )\r
-{\r
-  VARIABLE_HEADER *VarHeader;\r
-\r
-  *LastVariableOffset       = sizeof (VARIABLE_STORE_HEADER);\r
-  VarHeader = (VARIABLE_HEADER*) ((UINT8*)VariableStore + *LastVariableOffset);\r
-  while (VarHeader->StartId == VARIABLE_DATA) {\r
-    VarHeader = GetNextPotentialVariablePtr (VarHeader);\r
-\r
-    if (VarHeader != NULL) {\r
-      *LastVariableOffset = (UINTN) VarHeader - (UINTN) VariableStore;\r
-    } else {\r
-      return;\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Gets pointer to the end of the variable storage area.\r
-\r
-  This function gets pointer to the end of the variable storage\r
-  area, according to the input variable store header.\r
-\r
-  @param  VolHeader     Pointer to the variale store header\r
-\r
-  @return Pointer to the end of the variable storage area.\r
-\r
-**/\r
-VARIABLE_HEADER *\r
-GetEndPointer (\r
-  IN VARIABLE_STORE_HEADER       *VolHeader\r
-  )\r
-{\r
-  //\r
-  // The end of variable store\r
-  //\r
-  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VolHeader + VolHeader->Size);\r
-}\r
-\r
-/**\r
-  Routine used to track statistical information about variable usage.\r
-  The data is stored in the EFI system table so it can be accessed later.\r
-  VariableInfo.efi can dump out the table. Only Boot Services variable\r
-  accesses are tracked by this code. The PcdVariableCollectStatistics\r
-  build flag controls if this feature is enabled.\r
-\r
-  A read that hits in the cache will have Read and Cache true for\r
-  the transaction. Data is allocated by this routine, but never\r
-  freed.\r
-\r
-  @param[in] VariableName   Name of the Variable to track\r
-  @param[in] VendorGuid     Guid of the Variable to track\r
-  @param[in] Volatile       TRUE if volatile FALSE if non-volatile\r
-  @param[in] Read           TRUE if GetVariable() was called\r
-  @param[in] Write          TRUE if SetVariable() was called\r
-  @param[in] Delete         TRUE if deleted via SetVariable()\r
-  @param[in] Cache          TRUE for a cache hit.\r
-\r
-**/\r
-VOID\r
-UpdateVariableInfo (\r
-  IN  CHAR16                  *VariableName,\r
-  IN  EFI_GUID                *VendorGuid,\r
-  IN  BOOLEAN                 Volatile,\r
-  IN  BOOLEAN                 Read,\r
-  IN  BOOLEAN                 Write,\r
-  IN  BOOLEAN                 Delete,\r
-  IN  BOOLEAN                 Cache\r
-  )\r
-{\r
-  VARIABLE_INFO_ENTRY   *Entry;\r
-\r
-  if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
-\r
-    if (EfiAtRuntime ()) {\r
-      // Don't collect statistics at runtime\r
-      return;\r
-    }\r
-\r
-    if (gVariableInfo == NULL) {\r
-      //\r
-      // on the first call allocate a entry and place a pointer to it in\r
-      // the EFI System Table\r
-      //\r
-      gVariableInfo = AllocateZeroPool (sizeof (VARIABLE_INFO_ENTRY));\r
-      ASSERT (gVariableInfo != NULL);\r
-\r
-      CopyGuid (&gVariableInfo->VendorGuid, VendorGuid);\r
-      gVariableInfo->Name = AllocateZeroPool (StrSize (VariableName));\r
-      ASSERT (gVariableInfo->Name != NULL);\r
-      StrCpyS (gVariableInfo->Name, StrSize(VariableName)/sizeof(CHAR16), VariableName);\r
-      gVariableInfo->Volatile = Volatile;\r
-\r
-      gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo);\r
-    }\r
-\r
-\r
-    for (Entry = gVariableInfo; Entry != NULL; Entry = Entry->Next) {\r
-      if (CompareGuid (VendorGuid, &Entry->VendorGuid)) {\r
-        if (StrCmp (VariableName, Entry->Name) == 0) {\r
-          if (Read) {\r
-            Entry->ReadCount++;\r
-          }\r
-          if (Write) {\r
-            Entry->WriteCount++;\r
-          }\r
-          if (Delete) {\r
-            Entry->DeleteCount++;\r
-          }\r
-          if (Cache) {\r
-            Entry->CacheCount++;\r
-          }\r
-\r
-          return;\r
-        }\r
-      }\r
-\r
-      if (Entry->Next == NULL) {\r
-        //\r
-        // If the entry is not in the table add it.\r
-        // Next iteration of the loop will fill in the data\r
-        //\r
-        Entry->Next = AllocateZeroPool (sizeof (VARIABLE_INFO_ENTRY));\r
-        ASSERT (Entry->Next != NULL);\r
-\r
-        CopyGuid (&Entry->Next->VendorGuid, VendorGuid);\r
-        Entry->Next->Name = AllocateZeroPool (StrSize (VariableName));\r
-        ASSERT (Entry->Next->Name != NULL);\r
-        StrCpyS (Entry->Next->Name, StrSize(VariableName)/sizeof(CHAR16), VariableName);\r
-        Entry->Next->Volatile = Volatile;\r
-      }\r
-\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Get index from supported language codes according to language string.\r
-\r
-  This code is used to get corresponding index in supported language codes. It can handle\r
-  RFC4646 and ISO639 language tags.\r
-  In ISO639 language tags, take 3-characters as a delimitation to find matched string and calculate the index.\r
-  In RFC4646 language tags, take semicolon as a delimitation to find matched string and calculate the index.\r
-\r
-  For example:\r
-    SupportedLang  = "engfraengfra"\r
-    Lang           = "eng"\r
-    Iso639Language = TRUE\r
-  The return value is "0".\r
-  Another example:\r
-    SupportedLang  = "en;fr;en-US;fr-FR"\r
-    Lang           = "fr-FR"\r
-    Iso639Language = FALSE\r
-  The return value is "3".\r
-\r
-  @param  SupportedLang               Platform supported language codes.\r
-  @param  Lang                        Configured language.\r
-  @param  Iso639Language              A bool value to signify if the handler is operated on ISO639 or RFC4646.\r
-\r
-  @retval the index of language in the language codes.\r
-\r
-**/\r
-UINTN\r
-GetIndexFromSupportedLangCodes(\r
-  IN  CHAR8            *SupportedLang,\r
-  IN  CHAR8            *Lang,\r
-  IN  BOOLEAN          Iso639Language\r
-  )\r
-{\r
-  UINTN    Index;\r
-  UINTN    CompareLength;\r
-  UINTN    LanguageLength;\r
-\r
-  if (Iso639Language) {\r
-    CompareLength = ISO_639_2_ENTRY_SIZE;\r
-    for (Index = 0; Index < AsciiStrLen (SupportedLang); Index += CompareLength) {\r
-      if (AsciiStrnCmp (Lang, SupportedLang + Index, CompareLength) == 0) {\r
-        //\r
-        // Successfully find the index of Lang string in SupportedLang string.\r
-        //\r
-        Index = Index / CompareLength;\r
-        return Index;\r
-      }\r
-    }\r
-    ASSERT (FALSE);\r
-    return 0;\r
-  } else {\r
-    //\r
-    // Compare RFC4646 language code\r
-    //\r
-    Index = 0;\r
-    for (LanguageLength = 0; Lang[LanguageLength] != '\0'; LanguageLength++);\r
-\r
-    for (Index = 0; *SupportedLang != '\0'; Index++, SupportedLang += CompareLength) {\r
-      //\r
-      // Skip ';' characters in SupportedLang\r
-      //\r
-      for (; *SupportedLang != '\0' && *SupportedLang == ';'; SupportedLang++);\r
-      //\r
-      // Determine the length of the next language code in SupportedLang\r
-      //\r
-      for (CompareLength = 0; SupportedLang[CompareLength] != '\0' && SupportedLang[CompareLength] != ';'; CompareLength++);\r
-\r
-      if ((CompareLength == LanguageLength) &&\r
-          (AsciiStrnCmp (Lang, SupportedLang, CompareLength) == 0)) {\r
-        //\r
-        // Successfully find the index of Lang string in SupportedLang string.\r
-        //\r
-        return Index;\r
-      }\r
-    }\r
-    ASSERT (FALSE);\r
-    return 0;\r
-  }\r
-}\r
-\r
-/**\r
-  Get language string from supported language codes according to index.\r
-\r
-  This code is used to get corresponding language string in supported language codes. It can handle\r
-  RFC4646 and ISO639 language tags.\r
-  In ISO639 language tags, take 3-characters as a delimitation. Find language string according to the index.\r
-  In RFC4646 language tags, take semicolon as a delimitation. Find language string according to the index.\r
-\r
-  For example:\r
-    SupportedLang  = "engfraengfra"\r
-    Index          = "1"\r
-    Iso639Language = TRUE\r
-  The return value is "fra".\r
-  Another example:\r
-    SupportedLang  = "en;fr;en-US;fr-FR"\r
-    Index          = "1"\r
-    Iso639Language = FALSE\r
-  The return value is "fr".\r
-\r
-  @param  SupportedLang               Platform supported language codes.\r
-  @param  Index                       the index in supported language codes.\r
-  @param  Iso639Language              A bool value to signify if the handler is operated on ISO639 or RFC4646.\r
-\r
-  @retval the language string in the language codes.\r
-\r
-**/\r
-CHAR8 *\r
-GetLangFromSupportedLangCodes (\r
-  IN  CHAR8            *SupportedLang,\r
-  IN  UINTN            Index,\r
-  IN  BOOLEAN          Iso639Language\r
-)\r
-{\r
-  UINTN    SubIndex;\r
-  UINTN    CompareLength;\r
-  CHAR8    *Supported;\r
-\r
-  SubIndex  = 0;\r
-  Supported = SupportedLang;\r
-  if (Iso639Language) {\r
-    //\r
-    // according to the index of Lang string in SupportedLang string to get the language.\r
-    // As this code will be invoked in RUNTIME, therefore there is not memory allocate/free operation.\r
-    // In driver entry, it pre-allocates a runtime attribute memory to accommodate this string.\r
-    //\r
-    CompareLength = ISO_639_2_ENTRY_SIZE;\r
-    mVariableModuleGlobal->Lang[CompareLength] = '\0';\r
-    return CopyMem (mVariableModuleGlobal->Lang, SupportedLang + Index * CompareLength, CompareLength);\r
-\r
-  } else {\r
-    while (TRUE) {\r
-      //\r
-      // take semicolon as delimitation, sequentially traverse supported language codes.\r
-      //\r
-      for (CompareLength = 0; *Supported != ';' && *Supported != '\0'; CompareLength++) {\r
-        Supported++;\r
-      }\r
-      if ((*Supported == '\0') && (SubIndex != Index)) {\r
-        //\r
-        // Have completed the traverse, but not find corrsponding string.\r
-        // This case is not allowed to happen.\r
-        //\r
-        ASSERT(FALSE);\r
-        return NULL;\r
-      }\r
-      if (SubIndex == Index) {\r
-        //\r
-        // according to the index of Lang string in SupportedLang string to get the language.\r
-        // As this code will be invoked in RUNTIME, therefore there is not memory allocate/free operation.\r
-        // In driver entry, it pre-allocates a runtime attribute memory to accommodate this string.\r
-        //\r
-        mVariableModuleGlobal->PlatformLang[CompareLength] = '\0';\r
-        return CopyMem (mVariableModuleGlobal->PlatformLang, Supported - CompareLength, CompareLength);\r
-      }\r
-      SubIndex++;\r
-\r
-      //\r
-      // Skip ';' characters in Supported\r
-      //\r
-      for (; *Supported != '\0' && *Supported == ';'; Supported++);\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Returns a pointer to an allocated buffer that contains the best matching language\r
-  from a set of supported languages.\r
-\r
-  This function supports both ISO 639-2 and RFC 4646 language codes, but language\r
-  code types may not be mixed in a single call to this function. This function\r
-  supports a variable argument list that allows the caller to pass in a prioritized\r
-  list of language codes to test against all the language codes in SupportedLanguages.\r
-\r
-  If SupportedLanguages is NULL, then ASSERT().\r
-\r
-  @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 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
-                                  language codes in the format specified by Iso639Language.\r
-                                  The first language code from each of these language\r
-                                  code lists is used to determine if it is an exact or\r
-                                  close match to any of the language codes in\r
-                                  SupportedLanguages.  Close matches only apply to RFC 4646\r
-                                  language codes, and the matching algorithm from RFC 4647\r
-                                  is used to determine if a close match is present.  If\r
-                                  an exact or close match is found, then the matching\r
-                                  language code from SupportedLanguages is returned.  If\r
-                                  no matches are found, then the next variable argument\r
-                                  parameter is evaluated.  The variable argument list\r
-                                  is terminated by a NULL.\r
-\r
-  @retval NULL   The best matching language could not be found in SupportedLanguages.\r
-  @retval NULL   There are not enough resources available to return the best matching\r
-                 language.\r
-  @retval Other  A pointer to a Null-terminated ASCII string that is the best matching\r
-                 language in SupportedLanguages.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-VariableGetBestLanguage (\r
-  IN CONST CHAR8  *SupportedLanguages,\r
-  IN UINTN        Iso639Language,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST      Args;\r
-  CHAR8        *Language;\r
-  UINTN        CompareLength;\r
-  UINTN        LanguageLength;\r
-  CONST CHAR8  *Supported;\r
-  CHAR8        *Buffer;\r
-\r
-  ASSERT (SupportedLanguages != NULL);\r
-\r
-  VA_START (Args, Iso639Language);\r
-  while ((Language = VA_ARG (Args, CHAR8 *)) != NULL) {\r
-    //\r
-    // Default to ISO 639-2 mode\r
-    //\r
-    CompareLength  = 3;\r
-    LanguageLength = MIN (3, AsciiStrLen (Language));\r
-\r
-    //\r
-    // If in RFC 4646 mode, then determine the length of the first RFC 4646 language code in Language\r
-    //\r
-    if (Iso639Language == 0) {\r
-      for (LanguageLength = 0; Language[LanguageLength] != 0 && Language[LanguageLength] != ';'; LanguageLength++);\r
-    }\r
-\r
-    //\r
-    // Trim back the length of Language used until it is empty\r
-    //\r
-    while (LanguageLength > 0) {\r
-      //\r
-      // Loop through all language codes in SupportedLanguages\r
-      //\r
-      for (Supported = SupportedLanguages; *Supported != '\0'; Supported += CompareLength) {\r
-        //\r
-        // In RFC 4646 mode, then Loop through all language codes in SupportedLanguages\r
-        //\r
-        if (Iso639Language == 0) {\r
-          //\r
-          // Skip ';' characters in Supported\r
-          //\r
-          for (; *Supported != '\0' && *Supported == ';'; Supported++);\r
-          //\r
-          // Determine the length of the next language code in Supported\r
-          //\r
-          for (CompareLength = 0; Supported[CompareLength] != 0 && Supported[CompareLength] != ';'; CompareLength++);\r
-          //\r
-          // If Language is longer than the Supported, then skip to the next language\r
-          //\r
-          if (LanguageLength > CompareLength) {\r
-            continue;\r
-          }\r
-        }\r
-        //\r
-        // See if the first LanguageLength characters in Supported match Language\r
-        //\r
-        if (AsciiStrnCmp (Supported, Language, LanguageLength) == 0) {\r
-          VA_END (Args);\r
-\r
-          Buffer = (Iso639Language != 0) ? mVariableModuleGlobal->Lang : mVariableModuleGlobal->PlatformLang;\r
-          Buffer[CompareLength] = '\0';\r
-          return CopyMem (Buffer, Supported, CompareLength);\r
-        }\r
-      }\r
-\r
-      if (Iso639Language != 0) {\r
-        //\r
-        // If ISO 639 mode, then each language can only be tested once\r
-        //\r
-        LanguageLength = 0;\r
-      } else {\r
-        //\r
-        // If RFC 4646 mode, then trim Language from the right to the next '-' character\r
-        //\r
-        for (LanguageLength--; LanguageLength > 0 && Language[LanguageLength] != '-'; LanguageLength--);\r
-      }\r
-    }\r
-  }\r
-  VA_END (Args);\r
-\r
-  //\r
-  // No matches were found\r
-  //\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  Hook the operations in PlatformLangCodes, LangCodes, PlatformLang and Lang.\r
-\r
-  When setting Lang/LangCodes, simultaneously update PlatformLang/PlatformLangCodes.\r
-\r
-  According to UEFI spec, PlatformLangCodes/LangCodes are only set once in firmware initialization,\r
-  and are read-only. Therefore, in variable driver, only store the original value for other use.\r
-\r
-  @param[in] VariableName       Name of variable\r
-\r
-  @param[in] Data               Variable data\r
-\r
-  @param[in] DataSize           Size of data. 0 means delete\r
-\r
-**/\r
-VOID\r
-AutoUpdateLangVariable(\r
-  IN  CHAR16             *VariableName,\r
-  IN  VOID               *Data,\r
-  IN  UINTN              DataSize\r
-  )\r
-{\r
-  EFI_STATUS             Status;\r
-  CHAR8                  *BestPlatformLang;\r
-  CHAR8                  *BestLang;\r
-  UINTN                  Index;\r
-  UINT32                 Attributes;\r
-  VARIABLE_POINTER_TRACK Variable;\r
-  BOOLEAN                SetLanguageCodes;\r
-\r
-  //\r
-  // Don't do updates for delete operation\r
-  //\r
-  if (DataSize == 0) {\r
-    return;\r
-  }\r
-\r
-  SetLanguageCodes = FALSE;\r
-\r
-  if (StrCmp (VariableName, L"PlatformLangCodes") == 0) {\r
-    //\r
-    // PlatformLangCodes is a volatile variable, so it can not be updated at runtime.\r
-    //\r
-    if (EfiAtRuntime ()) {\r
-      return;\r
-    }\r
-\r
-    SetLanguageCodes = TRUE;\r
-\r
-    //\r
-    // According to UEFI spec, PlatformLangCodes is only set once in firmware initialization, and is read-only\r
-    // Therefore, in variable driver, only store the original value for other use.\r
-    //\r
-    if (mVariableModuleGlobal->PlatformLangCodes != NULL) {\r
-      FreePool (mVariableModuleGlobal->PlatformLangCodes);\r
-    }\r
-    mVariableModuleGlobal->PlatformLangCodes = AllocateRuntimeCopyPool (DataSize, Data);\r
-    ASSERT (mVariableModuleGlobal->PlatformLangCodes != NULL);\r
-\r
-    //\r
-    // PlatformLang holds a single language from PlatformLangCodes,\r
-    // so the size of PlatformLangCodes is enough for the PlatformLang.\r
-    //\r
-    if (mVariableModuleGlobal->PlatformLang != NULL) {\r
-      FreePool (mVariableModuleGlobal->PlatformLang);\r
-    }\r
-    mVariableModuleGlobal->PlatformLang = AllocateRuntimePool (DataSize);\r
-    ASSERT (mVariableModuleGlobal->PlatformLang != NULL);\r
-\r
-  } else if (StrCmp (VariableName, L"LangCodes") == 0) {\r
-    //\r
-    // LangCodes is a volatile variable, so it can not be updated at runtime.\r
-    //\r
-    if (EfiAtRuntime ()) {\r
-      return;\r
-    }\r
-\r
-    SetLanguageCodes = TRUE;\r
-\r
-    //\r
-    // According to UEFI spec, LangCodes is only set once in firmware initialization, and is read-only\r
-    // Therefore, in variable driver, only store the original value for other use.\r
-    //\r
-    if (mVariableModuleGlobal->LangCodes != NULL) {\r
-      FreePool (mVariableModuleGlobal->LangCodes);\r
-    }\r
-    mVariableModuleGlobal->LangCodes = AllocateRuntimeCopyPool (DataSize, Data);\r
-    ASSERT (mVariableModuleGlobal->LangCodes != NULL);\r
-  }\r
-\r
-  if (SetLanguageCodes\r
-      && (mVariableModuleGlobal->PlatformLangCodes != NULL)\r
-      && (mVariableModuleGlobal->LangCodes != NULL)) {\r
-    //\r
-    // Update Lang if PlatformLang is already set\r
-    // Update PlatformLang if Lang is already set\r
-    //\r
-    Status = FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, (VARIABLE_GLOBAL *) mVariableModuleGlobal);\r
-    if (!EFI_ERROR (Status)) {\r
-      //\r
-      // Update Lang\r
-      //\r
-      VariableName = L"PlatformLang";\r
-      Data         = GetVariableDataPtr (Variable.CurrPtr);\r
-      DataSize     = Variable.CurrPtr->DataSize;\r
-    } else {\r
-      Status = FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, (VARIABLE_GLOBAL *) mVariableModuleGlobal);\r
-      if (!EFI_ERROR (Status)) {\r
-        //\r
-        // Update PlatformLang\r
-        //\r
-        VariableName = L"Lang";\r
-        Data         = GetVariableDataPtr (Variable.CurrPtr);\r
-        DataSize     = Variable.CurrPtr->DataSize;\r
-      } else {\r
-        //\r
-        // Neither PlatformLang nor Lang is set, directly return\r
-        //\r
-        return;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // According to UEFI spec, "Lang" and "PlatformLang" is NV|BS|RT attributions.\r
-  //\r
-  Attributes = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;\r
-\r
-  if (StrCmp (VariableName, L"PlatformLang") == 0) {\r
-    //\r
-    // Update Lang when PlatformLangCodes/LangCodes were set.\r
-    //\r
-    if ((mVariableModuleGlobal->PlatformLangCodes != NULL) && (mVariableModuleGlobal->LangCodes != NULL)) {\r
-      //\r
-      // When setting PlatformLang, firstly get most matched language string from supported language codes.\r
-      //\r
-      BestPlatformLang = VariableGetBestLanguage (mVariableModuleGlobal->PlatformLangCodes, FALSE, Data, NULL);\r
-      if (BestPlatformLang != NULL) {\r
-        //\r
-        // Get the corresponding index in language codes.\r
-        //\r
-        Index = GetIndexFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, BestPlatformLang, FALSE);\r
-\r
-        //\r
-        // Get the corresponding ISO639 language tag according to RFC4646 language tag.\r
-        //\r
-        BestLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, Index, TRUE);\r
-\r
-        //\r
-        // Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.\r
-        //\r
-        FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, (VARIABLE_GLOBAL *)mVariableModuleGlobal);\r
-\r
-        Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang, ISO_639_2_ENTRY_SIZE + 1, Attributes, &Variable);\r
-\r
-        DEBUG ((EFI_D_INFO, "Variable Driver Auto Update PlatformLang, PlatformLang:%a, Lang:%a\n", BestPlatformLang, BestLang));\r
-\r
-        ASSERT_EFI_ERROR(Status);\r
-      }\r
-    }\r
-\r
-  } else if (StrCmp (VariableName, L"Lang") == 0) {\r
-    //\r
-    // Update PlatformLang when PlatformLangCodes/LangCodes were set.\r
-    //\r
-    if ((mVariableModuleGlobal->PlatformLangCodes != NULL) && (mVariableModuleGlobal->LangCodes != NULL)) {\r
-      //\r
-      // When setting Lang, firstly get most matched language string from supported language codes.\r
-      //\r
-      BestLang = VariableGetBestLanguage (mVariableModuleGlobal->LangCodes, TRUE, Data, NULL);\r
-      if (BestLang != NULL) {\r
-        //\r
-        // Get the corresponding index in language codes.\r
-        //\r
-        Index = GetIndexFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, BestLang, TRUE);\r
-\r
-        //\r
-        // Get the corresponding RFC4646 language tag according to ISO639 language tag.\r
-        //\r
-        BestPlatformLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);\r
-\r
-        //\r
-        // Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.\r
-        //\r
-        FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, (VARIABLE_GLOBAL *)mVariableModuleGlobal);\r
-\r
-        Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,\r
-                                 AsciiStrSize (BestPlatformLang), Attributes, &Variable);\r
-\r
-        DEBUG ((EFI_D_INFO, "Variable Driver Auto Update Lang, Lang:%a, PlatformLang:%a\n", BestLang, BestPlatformLang));\r
-        ASSERT_EFI_ERROR (Status);\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Update the variable region with Variable information. These are the same\r
-  arguments as the EFI Variable services.\r
-\r
-  @param[in] VariableName       Name of variable\r
-\r
-  @param[in] VendorGuid         Guid of variable\r
-\r
-  @param[in] Data               Variable data\r
-\r
-  @param[in] DataSize           Size of data. 0 means delete\r
-\r
-  @param[in] Attributes         Attribues of the variable\r
-\r
-  @param[in] Variable           The variable information which is used to keep track of variable usage.\r
-\r
-  @retval EFI_SUCCESS           The update operation is success.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES  Variable region is full, can not write other data into this region.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UpdateVariable (\r
-  IN      CHAR16          *VariableName,\r
-  IN      EFI_GUID        *VendorGuid,\r
-  IN      VOID            *Data,\r
-  IN      UINTN           DataSize,\r
-  IN      UINT32          Attributes OPTIONAL,\r
-  IN      VARIABLE_POINTER_TRACK *Variable\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  VARIABLE_HEADER         *NextVariable;\r
-  UINTN                   VarNameSize;\r
-  UINTN                   VarNameOffset;\r
-  UINTN                   VarDataOffset;\r
-  UINTN                   VarSize;\r
-  VARIABLE_GLOBAL         *Global;\r
-  UINTN                   NonVolatileVarableStoreSize;\r
-\r
-  Global = &mVariableModuleGlobal->VariableGlobal[Physical];\r
-\r
-  if (Variable->CurrPtr != NULL) {\r
-    //\r
-    // Update/Delete existing variable\r
-    //\r
-\r
-    if (EfiAtRuntime ()) {\r
-      //\r
-      // If EfiAtRuntime and the variable is Volatile and Runtime Access,\r
-      // the volatile is ReadOnly, and SetVariable should be aborted and\r
-      // return EFI_WRITE_PROTECTED.\r
-      //\r
-      if (Variable->Volatile) {\r
-        Status = EFI_WRITE_PROTECTED;\r
-        goto Done;\r
-      }\r
-      //\r
-      // Only variable have NV attribute can be updated/deleted in Runtime\r
-      //\r
-      if ((Variable->CurrPtr->Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {\r
-        Status = EFI_INVALID_PARAMETER;\r
-        goto Done;\r
-      }\r
-    }\r
-\r
-    //\r
-    // Setting a data variable with no access, or zero DataSize attributes\r
-    // specified causes it to be deleted.\r
-    //\r
-    if (DataSize == 0 || (Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == 0) {\r
-      Variable->CurrPtr->State &= VAR_DELETED;\r
-      UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, FALSE, TRUE, FALSE);\r
-      Status = EFI_SUCCESS;\r
-      goto Done;\r
-    }\r
-\r
-    //\r
-    // If the variable is marked valid and the same data has been passed in\r
-    // then return to the caller immediately.\r
-    //\r
-    if (Variable->CurrPtr->DataSize == DataSize &&\r
-        CompareMem (Data, GetVariableDataPtr (Variable->CurrPtr), DataSize) == 0\r
-          ) {\r
-      Status = EFI_SUCCESS;\r
-      goto Done;\r
-    } else if (Variable->CurrPtr->State == VAR_ADDED) {\r
-      //\r
-      // Mark the old variable as in delete transition\r
-      //\r
-      Variable->CurrPtr->State &= VAR_IN_DELETED_TRANSITION;\r
-    }\r
-\r
-  } else {\r
-    //\r
-    // No found existing variable, Create a new variable\r
-    //\r
-\r
-    //\r
-    // Make sure we are trying to create a new variable.\r
-    // Setting a data variable with no access, or zero DataSize attributes means to delete it.\r
-    //\r
-    if (DataSize == 0 || (Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == 0) {\r
-      Status = EFI_NOT_FOUND;\r
-      goto Done;\r
-    }\r
-\r
-    //\r
-    // Only variable have NV|RT attribute can be created in Runtime\r
-    //\r
-    if (EfiAtRuntime () &&\r
-        (((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) || ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0))) {\r
-      Status = EFI_INVALID_PARAMETER;\r
-      goto Done;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Function part - create a new variable and copy the data.\r
-  // Both update a variable and create a variable will come here.\r
-  //\r
-\r
-  VarNameOffset = sizeof (VARIABLE_HEADER);\r
-  VarNameSize   = StrSize (VariableName);\r
-  VarDataOffset = VarNameOffset + VarNameSize + GET_PAD_SIZE (VarNameSize);\r
-  VarSize       = VarDataOffset + DataSize + GET_PAD_SIZE (DataSize);\r
-\r
-  if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
-    NonVolatileVarableStoreSize = ((VARIABLE_STORE_HEADER *)(UINTN)(Global->NonVolatileVariableBase))->Size;\r
-    if ((((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != 0)\r
-      && ((HEADER_ALIGN (VarSize) + mVariableModuleGlobal->HwErrVariableTotalSize) > PcdGet32 (PcdHwErrStorageSize)))\r
-      || (((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == 0)\r
-      && ((HEADER_ALIGN (VarSize) + mVariableModuleGlobal->CommonVariableTotalSize) > NonVolatileVarableStoreSize - sizeof (VARIABLE_STORE_HEADER) - PcdGet32 (PcdHwErrStorageSize)))) {\r
-      Status = EFI_OUT_OF_RESOURCES;\r
-      goto Done;\r
-    }\r
-\r
-    NextVariable  = (VARIABLE_HEADER *) (UINT8 *) (mVariableModuleGlobal->NonVolatileLastVariableOffset\r
-                      + (UINTN) Global->NonVolatileVariableBase);\r
-    mVariableModuleGlobal->NonVolatileLastVariableOffset += HEADER_ALIGN (VarSize);\r
-\r
-    if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != 0) {\r
-      mVariableModuleGlobal->HwErrVariableTotalSize += HEADER_ALIGN (VarSize);\r
-    } else {\r
-      mVariableModuleGlobal->CommonVariableTotalSize += HEADER_ALIGN (VarSize);\r
-    }\r
-  } else {\r
-    if ((UINT32) (HEADER_ALIGN (VarSize) + mVariableModuleGlobal->VolatileLastVariableOffset) >\r
-          ((VARIABLE_STORE_HEADER *) ((UINTN) (Global->VolatileVariableBase)))->Size\r
-          ) {\r
-      Status = EFI_OUT_OF_RESOURCES;\r
-      goto Done;\r
-    }\r
-\r
-    NextVariable    = (VARIABLE_HEADER *) (UINT8 *) (mVariableModuleGlobal->VolatileLastVariableOffset\r
-                        + (UINTN) Global->VolatileVariableBase);\r
-    mVariableModuleGlobal->VolatileLastVariableOffset += HEADER_ALIGN (VarSize);\r
-  }\r
-\r
-  NextVariable->StartId     = VARIABLE_DATA;\r
-  NextVariable->Attributes  = Attributes;\r
-  NextVariable->State       = VAR_ADDED;\r
-  NextVariable->Reserved    = 0;\r
-\r
-  //\r
-  // There will be pad bytes after Data, the NextVariable->NameSize and\r
-  // NextVariable->NameSize should not include pad size so that variable\r
-  // service can get actual size in GetVariable\r
-  //\r
-  NextVariable->NameSize  = (UINT32)VarNameSize;\r
-  NextVariable->DataSize  = (UINT32)DataSize;\r
-\r
-  CopyMem (&NextVariable->VendorGuid, VendorGuid, sizeof (EFI_GUID));\r
-  CopyMem (\r
-    (UINT8 *) ((UINTN) NextVariable + VarNameOffset),\r
-    VariableName,\r
-    VarNameSize\r
-    );\r
-  CopyMem (\r
-    (UINT8 *) ((UINTN) NextVariable + VarDataOffset),\r
-    Data,\r
-    DataSize\r
-    );\r
-\r
-  //\r
-  // Mark the old variable as deleted\r
-  //\r
-  if (Variable->CurrPtr != NULL) {\r
-    Variable->CurrPtr->State &= VAR_DELETED;\r
-  }\r
-\r
-  UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, TRUE, FALSE, FALSE);\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Finds variable in storage blocks of volatile and non-volatile storage areas.\r
-\r
-  This code finds variable in storage blocks of volatile and non-volatile storage areas.\r
-  If VariableName is an empty string, then we just return the first\r
-  qualified variable without comparing VariableName and VendorGuid.\r
-  Otherwise, VariableName and VendorGuid are compared.\r
-\r
-  @param  VariableName                Name of the variable to be found.\r
-  @param  VendorGuid                  Vendor GUID to be found.\r
-  @param  PtrTrack                    VARIABLE_POINTER_TRACK structure for output,\r
-                                      including the range searched and the target position.\r
-  @param  Global                      Pointer to VARIABLE_GLOBAL structure, including\r
-                                      base of volatile variable storage area, base of\r
-                                      NV variable storage area, and a lock.\r
-\r
-  @retval EFI_INVALID_PARAMETER       If VariableName is not an empty string, while\r
-                                      VendorGuid is NULL.\r
-  @retval EFI_SUCCESS                 Variable successfully found.\r
-  @retval EFI_NOT_FOUND               Variable not found.\r
-\r
-**/\r
-EFI_STATUS\r
-FindVariable (\r
-  IN  CHAR16                  *VariableName,\r
-  IN  EFI_GUID                *VendorGuid,\r
-  OUT VARIABLE_POINTER_TRACK  *PtrTrack,\r
-  IN  VARIABLE_GLOBAL         *Global\r
-  )\r
-{\r
-  VARIABLE_HEADER       *Variable[2];\r
-  VARIABLE_STORE_HEADER *VariableStoreHeader[2];\r
-  UINTN                 Index;\r
-\r
-  //\r
-  // 0: Non-Volatile, 1: Volatile\r
-  //\r
-  VariableStoreHeader[0]  = (VARIABLE_STORE_HEADER *) ((UINTN) Global->NonVolatileVariableBase);\r
-  VariableStoreHeader[1]  = (VARIABLE_STORE_HEADER *) ((UINTN) Global->VolatileVariableBase);\r
-\r
-  //\r
-  // Start Pointers for the variable.\r
-  // Actual Data Pointer where data can be written.\r
-  //\r
-  Variable[0] = (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader[0] + 1);\r
-  Variable[1] = (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader[1] + 1);\r
-\r
-  if (VariableName[0] != 0 && VendorGuid == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Find the variable by walk through non-volatile and volatile variable store\r
-  //\r
-  for (Index = 0; Index < 2; Index++) {\r
-    PtrTrack->StartPtr  = (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader[Index] + 1);\r
-    PtrTrack->EndPtr    = GetEndPointer (VariableStoreHeader[Index]);\r
-\r
-    while ((Variable[Index] < GetEndPointer (VariableStoreHeader[Index])) && (Variable[Index] != NULL)) {\r
-      if (Variable[Index]->StartId == VARIABLE_DATA && Variable[Index]->State == VAR_ADDED) {\r
-        if (!(EfiAtRuntime () && ((Variable[Index]->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0))) {\r
-          if (VariableName[0] == 0) {\r
-            PtrTrack->CurrPtr   = Variable[Index];\r
-            PtrTrack->Volatile  = (BOOLEAN) Index;\r
-            return EFI_SUCCESS;\r
-          } else {\r
-            if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) {\r
-              if (CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable[Index]), Variable[Index]->NameSize) == 0) {\r
-                PtrTrack->CurrPtr   = Variable[Index];\r
-                PtrTrack->Volatile  = (BOOLEAN) Index;\r
-                return EFI_SUCCESS;\r
-              }\r
-            }\r
-          }\r
-        }\r
-      }\r
-\r
-      Variable[Index] = GetNextVariablePtr (Variable[Index]);\r
-    }\r
-  }\r
-  PtrTrack->CurrPtr = NULL;\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
-  This code finds variable in storage blocks (Volatile or Non-Volatile).\r
-\r
-  @param  VariableName           A Null-terminated Unicode string that is the name of\r
-                                 the vendor's variable.\r
-  @param  VendorGuid             A unique identifier for the vendor.\r
-  @param  Attributes             If not NULL, a pointer to the memory location to return the\r
-                                 attributes bitmask for the variable.\r
-  @param  DataSize               Size of Data found. If size is less than the\r
-                                 data, this value contains the required size.\r
-  @param  Data                   On input, the size in bytes of the return Data buffer.\r
-                                 On output, the size of data returned in Data.\r
-  @param  Global                 Pointer to VARIABLE_GLOBAL structure\r
-\r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-  @retval EFI_NOT_FOUND          The variable was not found.\r
-  @retval EFI_BUFFER_TOO_SMALL   DataSize is too small for the result.  DataSize has\r
-                                 been updated with the size needed to complete the request.\r
-  @retval EFI_INVALID_PARAMETER  VariableName or VendorGuid or DataSize is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EmuGetVariable (\r
-  IN      CHAR16            *VariableName,\r
-  IN      EFI_GUID          *VendorGuid,\r
-  OUT     UINT32            *Attributes OPTIONAL,\r
-  IN OUT  UINTN             *DataSize,\r
-  OUT     VOID              *Data,\r
-  IN      VARIABLE_GLOBAL   *Global\r
-  )\r
-{\r
-  VARIABLE_POINTER_TRACK  Variable;\r
-  UINTN                   VarDataSize;\r
-  EFI_STATUS              Status;\r
-  UINT8                   *VariableDataPtr;\r
-\r
-  if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (VariableName[0] == 0) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  AcquireLockOnlyAtBootTime(&Global->VariableServicesLock);\r
-\r
-  //\r
-  // Find existing variable\r
-  //\r
-  Status = FindVariable (VariableName, VendorGuid, &Variable, Global);\r
-\r
-  if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
-    goto Done;\r
-  }\r
-  //\r
-  // Get data size\r
-  //\r
-  VarDataSize = Variable.CurrPtr->DataSize;\r
-  if (*DataSize >= VarDataSize) {\r
-    if (Data == NULL) {\r
-      Status = EFI_INVALID_PARAMETER;\r
-      goto Done;\r
-    }\r
-    VariableDataPtr = GetVariableDataPtr (Variable.CurrPtr);\r
-    ASSERT (VariableDataPtr != NULL);\r
-\r
-    CopyMem (Data, VariableDataPtr, VarDataSize);\r
-    if (Attributes != NULL) {\r
-      *Attributes = Variable.CurrPtr->Attributes;\r
-    }\r
-\r
-    *DataSize = VarDataSize;\r
-    UpdateVariableInfo (VariableName, VendorGuid, Variable.Volatile, TRUE, FALSE, FALSE, FALSE);\r
-    Status = EFI_SUCCESS;\r
-    goto Done;\r
-  } else {\r
-    *DataSize = VarDataSize;\r
-    Status = EFI_BUFFER_TOO_SMALL;\r
-    goto Done;\r
-  }\r
-\r
-Done:\r
-  ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock);\r
-  return Status;\r
-}\r
-\r
-/**\r
-\r
-  This code Finds the Next available variable.\r
-\r
-  @param  VariableNameSize       The size of the VariableName buffer. The size must be large enough to fit input\r
-                                 string supplied in VariableName buffer.\r
-  @param  VariableName           On input, supplies the last VariableName that was returned by GetNextVariableName().\r
-                                 On output, returns the Null-terminated Unicode string of the current variable.\r
-  @param  VendorGuid             On input, supplies the last VendorGuid that was returned by GetNextVariableName().\r
-                                 On output, returns the VendorGuid of the current variable.\r
-  @param  Global                 Pointer to VARIABLE_GLOBAL structure.\r
-\r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-  @retval EFI_NOT_FOUND          The next variable was not found.\r
-  @retval EFI_BUFFER_TOO_SMALL   The VariableNameSize is too small for the result.\r
-                                 VariableNameSize has been updated with the size needed to complete the request.\r
-  @retval EFI_INVALID_PARAMETER  VariableNameSize or VariableName or VendorGuid is NULL.\r
-  @retval EFI_INVALID_PARAMETER  The input values of VariableName and VendorGuid are not a name and\r
-                                 GUID of an existing variable.\r
-  @retval EFI_INVALID_PARAMETER  Null-terminator is not found in the first VariableNameSize bytes of\r
-                                 the input VariableName buffer.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EmuGetNextVariableName (\r
-  IN OUT  UINTN             *VariableNameSize,\r
-  IN OUT  CHAR16            *VariableName,\r
-  IN OUT  EFI_GUID          *VendorGuid,\r
-  IN      VARIABLE_GLOBAL   *Global\r
-  )\r
-{\r
-  VARIABLE_POINTER_TRACK  Variable;\r
-  UINTN                   VarNameSize;\r
-  EFI_STATUS              Status;\r
-  UINTN                   MaxLen;\r
-\r
-  if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Calculate the possible maximum length of name string, including the Null terminator.\r
-  //\r
-  MaxLen = *VariableNameSize / sizeof (CHAR16);\r
-  if ((MaxLen == 0) || (StrnLenS (VariableName, MaxLen) == MaxLen)) {\r
-    //\r
-    // Null-terminator is not found in the first VariableNameSize bytes of the input VariableName buffer,\r
-    // follow spec to return EFI_INVALID_PARAMETER.\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  AcquireLockOnlyAtBootTime(&Global->VariableServicesLock);\r
-\r
-  Status = FindVariable (VariableName, VendorGuid, &Variable, Global);\r
-\r
-  if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
-    //\r
-    // For VariableName is an empty string, FindVariable() will try to find and return\r
-    // the first qualified variable, and if FindVariable() returns error (EFI_NOT_FOUND)\r
-    // as no any variable is found, still go to return the error (EFI_NOT_FOUND).\r
-    //\r
-    if (VariableName[0] != 0) {\r
-      //\r
-      // For VariableName is not an empty string, and FindVariable() returns error as\r
-      // VariableName and VendorGuid are not a name and GUID of an existing variable,\r
-      // there is no way to get next variable, follow spec to return EFI_INVALID_PARAMETER.\r
-      //\r
-      Status = EFI_INVALID_PARAMETER;\r
-    }\r
-    goto Done;\r
-  }\r
-\r
-  while (TRUE) {\r
-    if (VariableName[0] != 0) {\r
-      //\r
-      // If variable name is not NULL, get next variable\r
-      //\r
-      Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);\r
-    }\r
-    //\r
-    // If both volatile and non-volatile variable store are parsed,\r
-    // return not found\r
-    //\r
-    if (Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL) {\r
-      Variable.Volatile = (BOOLEAN) (Variable.Volatile ^ ((BOOLEAN) 0x1));\r
-      if (Variable.Volatile) {\r
-        Variable.StartPtr = (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) (Global->VolatileVariableBase + sizeof (VARIABLE_STORE_HEADER)));\r
-        Variable.EndPtr = (VARIABLE_HEADER *) GetEndPointer ((VARIABLE_STORE_HEADER *) ((UINTN) Global->VolatileVariableBase));\r
-      } else {\r
-        Status = EFI_NOT_FOUND;\r
-        goto Done;\r
-      }\r
-\r
-      Variable.CurrPtr = Variable.StartPtr;\r
-      if (Variable.CurrPtr->StartId != VARIABLE_DATA) {\r
-        continue;\r
-      }\r
-    }\r
-    //\r
-    // Variable is found\r
-    //\r
-    if (Variable.CurrPtr->StartId == VARIABLE_DATA && Variable.CurrPtr->State == VAR_ADDED) {\r
-      if (!(EfiAtRuntime () && ((Variable.CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0))) {\r
-        VarNameSize = Variable.CurrPtr->NameSize;\r
-        if (VarNameSize <= *VariableNameSize) {\r
-          CopyMem (\r
-            VariableName,\r
-            GET_VARIABLE_NAME_PTR (Variable.CurrPtr),\r
-            VarNameSize\r
-            );\r
-          CopyMem (\r
-            VendorGuid,\r
-            &Variable.CurrPtr->VendorGuid,\r
-            sizeof (EFI_GUID)\r
-            );\r
-          Status = EFI_SUCCESS;\r
-        } else {\r
-          Status = EFI_BUFFER_TOO_SMALL;\r
-        }\r
-\r
-        *VariableNameSize = VarNameSize;\r
-        goto Done;\r
-      }\r
-    }\r
-  }\r
-\r
-Done:\r
-  ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock);\r
-  return Status;\r
-\r
-}\r
-\r
-/**\r
-\r
-  This code sets variable in storage blocks (Volatile or Non-Volatile).\r
-\r
-  @param  VariableName           A Null-terminated Unicode string that is the name of the vendor's\r
-                                 variable.  Each VariableName is unique for each\r
-                                 VendorGuid.  VariableName must contain 1 or more\r
-                                 Unicode characters.  If VariableName is an empty Unicode\r
-                                 string, then EFI_INVALID_PARAMETER is returned.\r
-  @param  VendorGuid             A unique identifier for the vendor\r
-  @param  Attributes             Attributes bitmask to set for the variable\r
-  @param  DataSize               The size in bytes of the Data buffer.  A size of zero causes the\r
-                                 variable to be deleted.\r
-  @param  Data                   The contents for the variable\r
-  @param  Global                 Pointer to VARIABLE_GLOBAL structure\r
-  @param  VolatileOffset         The offset of last volatile variable\r
-  @param  NonVolatileOffset      The offset of last non-volatile variable\r
-\r
-  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as\r
-                                 defined by the Attributes.\r
-  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits was supplied, or the\r
-                                 DataSize exceeds the maximum allowed, or VariableName is an empty\r
-                                 Unicode string, or VendorGuid is NULL.\r
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.\r
-  @retval EFI_DEVICE_ERROR       The variable could not be saved due to a hardware failure.\r
-  @retval EFI_WRITE_PROTECTED    The variable in question is read-only or cannot be deleted.\r
-  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EmuSetVariable (\r
-  IN CHAR16                  *VariableName,\r
-  IN EFI_GUID                *VendorGuid,\r
-  IN UINT32                  Attributes,\r
-  IN UINTN                   DataSize,\r
-  IN VOID                    *Data,\r
-  IN VARIABLE_GLOBAL         *Global,\r
-  IN UINTN                   *VolatileOffset,\r
-  IN UINTN                   *NonVolatileOffset\r
-  )\r
-{\r
-  VARIABLE_POINTER_TRACK  Variable;\r
-  EFI_STATUS              Status;\r
-\r
-  //\r
-  // Check input parameters\r
-  //\r
-  if (VariableName == NULL || VariableName[0] == 0 || VendorGuid == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (DataSize != 0 && Data == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Not support authenticated variable write yet.\r
-  //\r
-  if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  //  Make sure if runtime bit is set, boot service bit is set also\r
-  //\r
-  if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-\r
-  if ((UINTN)(~0) - DataSize < StrSize(VariableName)){\r
-    //\r
-    // Prevent whole variable size overflow\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  //  The size of the VariableName, including the Unicode Null in bytes plus\r
-  //  the DataSize is limited to maximum size of PcdGet32 (PcdMaxHardwareErrorVariableSize)\r
-  //  bytes for HwErrRec, and PcdGet32 (PcdMaxVariableSize) bytes for the others.\r
-  //\r
-  if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
-    if (StrSize (VariableName) + DataSize > PcdGet32 (PcdMaxHardwareErrorVariableSize) - sizeof (VARIABLE_HEADER)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-    //\r
-    // According to UEFI spec, HARDWARE_ERROR_RECORD variable name convention should be L"HwErrRecXXXX"\r
-    //\r
-    if (StrnCmp(VariableName, L"HwErrRec", StrLen(L"HwErrRec")) != 0) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  } else {\r
-  //\r
-  //  The size of the VariableName, including the Unicode Null in bytes plus\r
-  //  the DataSize is limited to maximum size of PcdGet32 (PcdMaxVariableSize) bytes.\r
-  //\r
-    if (StrSize (VariableName) + DataSize > PcdGet32 (PcdMaxVariableSize) - sizeof (VARIABLE_HEADER)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-\r
-  AcquireLockOnlyAtBootTime(&Global->VariableServicesLock);\r
-\r
-  //\r
-  // Check whether the input variable is already existed\r
-  //\r
-\r
-  Status = FindVariable (VariableName, VendorGuid, &Variable, Global);\r
-\r
-  //\r
-  // Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang\r
-  //\r
-  AutoUpdateLangVariable (VariableName, Data, DataSize);\r
-\r
-  Status = UpdateVariable (VariableName, VendorGuid, Data, DataSize, Attributes, &Variable);\r
-\r
-  ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock);\r
-  return Status;\r
-}\r
-\r
-/**\r
-\r
-  This code returns information about the EFI variables.\r
-\r
-  @param  Attributes                   Attributes bitmask to specify the type of variables\r
-                                       on which to return information.\r
-  @param  MaximumVariableStorageSize   On output the maximum size of the storage space available for\r
-                                       the EFI variables associated with the attributes specified.\r
-  @param  RemainingVariableStorageSize Returns the remaining size of the storage space available for EFI\r
-                                       variables associated with the attributes specified.\r
-  @param  MaximumVariableSize          Returns the maximum size of an individual EFI variable\r
-                                       associated with the attributes specified.\r
-  @param  Global                       Pointer to VARIABLE_GLOBAL structure.\r
-\r
-  @retval EFI_SUCCESS                  Valid answer returned.\r
-  @retval EFI_INVALID_PARAMETER        An invalid combination of attribute bits was supplied\r
-  @retval EFI_UNSUPPORTED              The attribute is not supported on this platform, and the\r
-                                       MaximumVariableStorageSize, RemainingVariableStorageSize,\r
-                                       MaximumVariableSize are undefined.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EmuQueryVariableInfo (\r
-  IN  UINT32                 Attributes,\r
-  OUT UINT64                 *MaximumVariableStorageSize,\r
-  OUT UINT64                 *RemainingVariableStorageSize,\r
-  OUT UINT64                 *MaximumVariableSize,\r
-  IN  VARIABLE_GLOBAL        *Global\r
-  )\r
-{\r
-  VARIABLE_HEADER        *Variable;\r
-  VARIABLE_HEADER        *NextVariable;\r
-  UINT64                 VariableSize;\r
-  VARIABLE_STORE_HEADER  *VariableStoreHeader;\r
-  UINT64                 CommonVariableTotalSize;\r
-  UINT64                 HwErrVariableTotalSize;\r
-\r
-  CommonVariableTotalSize = 0;\r
-  HwErrVariableTotalSize = 0;\r
-\r
-  if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == 0) {\r
-    //\r
-    // Make sure the Attributes combination is supported by the platform.\r
-    //\r
-    return EFI_UNSUPPORTED;\r
-  } else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {\r
-    //\r
-    // Make sure if runtime bit is set, boot service bit is set also.\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  } else if (EfiAtRuntime () && ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)) {\r
-    //\r
-    //   Make sure RT Attribute is set if we are in Runtime phase.\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  } else if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
-    //\r
-    // Make sure Hw Attribute is set with NV.\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  } else if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
-    //\r
-    // Not support authentiated variable write yet.\r
-    //\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  AcquireLockOnlyAtBootTime(&Global->VariableServicesLock);\r
-\r
-  if((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {\r
-    //\r
-    // Query is Volatile related.\r
-    //\r
-    VariableStoreHeader = (VARIABLE_STORE_HEADER *) ((UINTN) Global->VolatileVariableBase);\r
-  } else {\r
-    //\r
-    // Query is Non-Volatile related.\r
-    //\r
-    VariableStoreHeader = (VARIABLE_STORE_HEADER *) ((UINTN) Global->NonVolatileVariableBase);\r
-  }\r
-\r
-  //\r
-  // Now let's fill *MaximumVariableStorageSize *RemainingVariableStorageSize\r
-  // with the storage size (excluding the storage header size)\r
-  //\r
-  *MaximumVariableStorageSize   = VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER);\r
-\r
-  //\r
-  // Harware error record variable needs larger size.\r
-  //\r
-  if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {\r
-    *MaximumVariableStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
-    *MaximumVariableSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) - sizeof (VARIABLE_HEADER);\r
-  } else {\r
-    if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
-      ASSERT (PcdGet32 (PcdHwErrStorageSize) < VariableStoreHeader->Size);\r
-      *MaximumVariableStorageSize = VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER) - PcdGet32 (PcdHwErrStorageSize);\r
-    }\r
-\r
-    //\r
-    // Let *MaximumVariableSize be PcdGet32 (PcdMaxVariableSize) with the exception of the variable header size.\r
-    //\r
-    *MaximumVariableSize = PcdGet32 (PcdMaxVariableSize) - sizeof (VARIABLE_HEADER);\r
-  }\r
-\r
-  //\r
-  // Point to the starting address of the variables.\r
-  //\r
-  Variable = (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader + 1);\r
-\r
-  //\r
-  // Now walk through the related variable store.\r
-  //\r
-  while (Variable < GetEndPointer (VariableStoreHeader)) {\r
-    NextVariable = GetNextVariablePtr(Variable);\r
-    if (NextVariable == NULL) {\r
-      break;\r
-    }\r
-    VariableSize = (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Variable;\r
-\r
-    if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
-      HwErrVariableTotalSize += VariableSize;\r
-    } else {\r
-      CommonVariableTotalSize += VariableSize;\r
-    }\r
-\r
-    //\r
-    // Go to the next one.\r
-    //\r
-    Variable = NextVariable;\r
-  }\r
-\r
-  if ((Attributes  & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD){\r
-    *RemainingVariableStorageSize = *MaximumVariableStorageSize - HwErrVariableTotalSize;\r
-  } else {\r
-    *RemainingVariableStorageSize = *MaximumVariableStorageSize - CommonVariableTotalSize;\r
-  }\r
-\r
-  if (*RemainingVariableStorageSize < sizeof (VARIABLE_HEADER)) {\r
-    *MaximumVariableSize = 0;\r
-  } else if ((*RemainingVariableStorageSize - sizeof (VARIABLE_HEADER)) < *MaximumVariableSize) {\r
-    *MaximumVariableSize = *RemainingVariableStorageSize - sizeof (VARIABLE_HEADER);\r
-  }\r
-\r
-  ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Initializes variable store area.\r
-\r
-  This function allocates memory space for variable store area and initializes its attributes.\r
-\r
-  @param  VolatileStore  Indicates if the variable store is volatile.\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeVariableStore (\r
-  IN  BOOLEAN               VolatileStore\r
-  )\r
-{\r
-  EFI_STATUS            Status;\r
-  VARIABLE_STORE_HEADER *VariableStore;\r
-  BOOLEAN               FullyInitializeStore;\r
-  EFI_PHYSICAL_ADDRESS  *VariableBase;\r
-  UINTN                 *LastVariableOffset;\r
-  VARIABLE_STORE_HEADER *VariableStoreHeader;\r
-  VARIABLE_HEADER       *Variable;\r
-  VOID                  *VariableData;\r
-  EFI_HOB_GUID_TYPE     *GuidHob;\r
-\r
-  FullyInitializeStore = TRUE;\r
-\r
-  if (VolatileStore) {\r
-    VariableBase = &mVariableModuleGlobal->VariableGlobal[Physical].VolatileVariableBase;\r
-    LastVariableOffset = &mVariableModuleGlobal->VolatileLastVariableOffset;\r
-  } else {\r
-    VariableBase = &mVariableModuleGlobal->VariableGlobal[Physical].NonVolatileVariableBase;\r
-    LastVariableOffset = &mVariableModuleGlobal->NonVolatileLastVariableOffset;\r
-  }\r
-\r
-  //\r
-  // Note that in EdkII variable driver implementation, Hardware Error Record type variable\r
-  // is stored with common variable in the same NV region. So the platform integrator should\r
-  // ensure that the value of PcdHwErrStorageSize is less than or equal to the value of\r
-  // PcdVariableStoreSize.\r
-  //\r
-  ASSERT (PcdGet32 (PcdHwErrStorageSize) <= PcdGet32 (PcdVariableStoreSize));\r
-\r
-  //\r
-  // Allocate memory for variable store.\r
-  //\r
-  if (VolatileStore || (PcdGet64 (PcdEmuVariableNvStoreReserved) == 0)) {\r
-    VariableStore = (VARIABLE_STORE_HEADER *) AllocateRuntimePool (PcdGet32 (PcdVariableStoreSize));\r
-  } else {\r
-    //\r
-    // A memory location has been reserved for the NV variable store.  Certain\r
-    // platforms may be able to preserve a memory range across system resets,\r
-    // thereby providing better NV variable emulation.\r
-    //\r
-    VariableStore =\r
-      (VARIABLE_STORE_HEADER *)(VOID*)(UINTN)\r
-        PcdGet64 (PcdEmuVariableNvStoreReserved);\r
-    if (\r
-         (VariableStore->Size == PcdGet32 (PcdVariableStoreSize)) &&\r
-         (VariableStore->Format == VARIABLE_STORE_FORMATTED) &&\r
-         (VariableStore->State == VARIABLE_STORE_HEALTHY)\r
-       ) {\r
-      DEBUG((\r
-        EFI_D_INFO,\r
-        "Variable Store reserved at %p appears to be valid\n",\r
-        VariableStore\r
-        ));\r
-      FullyInitializeStore = FALSE;\r
-    }\r
-  }\r
-\r
-  if (NULL == VariableStore) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  if (FullyInitializeStore) {\r
-    SetMem (VariableStore, PcdGet32 (PcdVariableStoreSize), 0xff);\r
-  }\r
-\r
-  //\r
-  // Variable Specific Data\r
-  //\r
-  *VariableBase             = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore;\r
-  InitializeLocationForLastVariableOffset (VariableStore, LastVariableOffset);\r
-\r
-  CopyGuid (&VariableStore->Signature, &gEfiVariableGuid);\r
-  VariableStore->Size       = PcdGet32 (PcdVariableStoreSize);\r
-  VariableStore->Format     = VARIABLE_STORE_FORMATTED;\r
-  VariableStore->State      = VARIABLE_STORE_HEALTHY;\r
-  VariableStore->Reserved   = 0;\r
-  VariableStore->Reserved1  = 0;\r
-\r
-  if (!VolatileStore) {\r
-    //\r
-    // Get HOB variable store.\r
-    //\r
-    GuidHob = GetFirstGuidHob (&gEfiVariableGuid);\r
-    if (GuidHob != NULL) {\r
-      VariableStoreHeader = (VARIABLE_STORE_HEADER *) GET_GUID_HOB_DATA (GuidHob);\r
-      if (CompareGuid (&VariableStoreHeader->Signature, &gEfiVariableGuid) &&\r
-          (VariableStoreHeader->Format == VARIABLE_STORE_FORMATTED) &&\r
-          (VariableStoreHeader->State == VARIABLE_STORE_HEALTHY)\r
-         ) {\r
-        DEBUG ((EFI_D_INFO, "HOB Variable Store appears to be valid.\n"));\r
-        //\r
-        // Flush the HOB variable to Emulation Variable storage.\r
-        //\r
-        for ( Variable = (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader + 1)\r
-            ; (Variable < GetEndPointer (VariableStoreHeader) && (Variable != NULL))\r
-            ; Variable = GetNextVariablePtr (Variable)\r
-            ) {\r
-          ASSERT (Variable->State == VAR_ADDED);\r
-          ASSERT ((Variable->Attributes & EFI_VARIABLE_NON_VOLATILE) != 0);\r
-          VariableData = GetVariableDataPtr (Variable);\r
-          Status = EmuSetVariable (\r
-                     GET_VARIABLE_NAME_PTR (Variable),\r
-                     &Variable->VendorGuid,\r
-                     Variable->Attributes,\r
-                     Variable->DataSize,\r
-                     VariableData,\r
-                     &mVariableModuleGlobal->VariableGlobal[Physical],\r
-                     &mVariableModuleGlobal->VolatileLastVariableOffset,\r
-                     &mVariableModuleGlobal->NonVolatileLastVariableOffset\r
-                     );\r
-          ASSERT_EFI_ERROR (Status);\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Initializes variable store area for non-volatile and volatile variable.\r
-\r
-  This function allocates and initializes memory space for global context of ESAL\r
-  variable service and variable store area for non-volatile and volatile variable.\r
-\r
-  @param  ImageHandle           The Image handle of this driver.\r
-  @param  SystemTable           The pointer of EFI_SYSTEM_TABLE.\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
-EFIAPI\r
-VariableCommonInitialize (\r
-  IN EFI_HANDLE         ImageHandle,\r
-  IN EFI_SYSTEM_TABLE   *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  //\r
-  // Allocate memory for mVariableModuleGlobal\r
-  //\r
-  mVariableModuleGlobal = (ESAL_VARIABLE_GLOBAL *) AllocateRuntimeZeroPool (\r
-                                                    sizeof (ESAL_VARIABLE_GLOBAL)\r
-                                                   );\r
-  if (NULL == mVariableModuleGlobal) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  EfiInitializeLock(&mVariableModuleGlobal->VariableGlobal[Physical].VariableServicesLock, TPL_NOTIFY);\r
-\r
-  //\r
-  // Intialize volatile variable store\r
-  //\r
-  Status = InitializeVariableStore (TRUE);\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool(mVariableModuleGlobal);\r
-    return Status;\r
-  }\r
-  //\r
-  // Intialize non volatile variable store\r
-  //\r
-  Status = InitializeVariableStore (FALSE);\r
-\r
-  return Status;\r
-}\r