From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.20; helo=mga02.intel.com; envelope-from=jian.j.wang@intel.com; receiver=edk2-devel@lists.01.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 784EF2194D387 for ; Tue, 22 Jan 2019 17:03:56 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jan 2019 17:03:55 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,509,1539673200"; d="scan'208";a="108980163" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga007.jf.intel.com with ESMTP; 22 Jan 2019 17:03:55 -0800 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 22 Jan 2019 17:03:54 -0800 Received: from shsmsx107.ccr.corp.intel.com ([169.254.9.239]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.159]) with mapi id 14.03.0415.000; Wed, 23 Jan 2019 09:03:52 +0800 From: "Wang, Jian J" To: "Zeng, Star" , "edk2-devel@lists.01.org" CC: "Wu, Hao A" Thread-Topic: [PATCH 12/12] MdeModule: Remove EmuVariableRuntimeDxe Thread-Index: AQHUq1YIdtNMjy7x2U6Yn1jyTxkPGaW8GElA Date: Wed, 23 Jan 2019 01:03:52 +0000 Message-ID: References: <1547393875-37188-1-git-send-email-star.zeng@intel.com> <1547393875-37188-13-git-send-email-star.zeng@intel.com> In-Reply-To: <1547393875-37188-13-git-send-email-star.zeng@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYmViOTViMjgtMzZmNS00MGY0LTg1ZDQtYmU2YTBjN2M3ZmRlIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoid3l6YWZTc2Z3dHZSdVZDaXpXWnZSdGpSUURmWDVjdnNEak1BeFFqcDRxRERpRDZyd1wvU0YwczhGb0VwVXhYQlgifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.400.15 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH 12/12] MdeModule: Remove EmuVariableRuntimeDxe X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Jan 2019 01:03:56 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Jian J Wang > -----Original Message----- > From: Zeng, Star > Sent: Sunday, January 13, 2019 11:38 PM > To: edk2-devel@lists.01.org > Cc: Zeng, Star ; Wang, Jian J ; > Wu, Hao A > Subject: [PATCH 12/12] MdeModule: Remove EmuVariableRuntimeDxe >=20 > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1323 > Merge EmuVariable and Real variable driver. >=20 > The real variable driver has been updated to support emulated > variable NV mode. > This patch removes EmuVariableRuntimeDxe after platforms are > migrated to use the merged variable driver. >=20 > Cc: Jian J Wang > Cc: Hao Wu > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Star Zeng > --- > MdeModulePkg/MdeModulePkg.dsc | 5 +- > .../Universal/Variable/EmuRuntimeDxe/EmuVariable.c | 1820 --------------= ------ > .../EmuRuntimeDxe/EmuVariableRuntimeDxe.inf | 88 - > .../EmuRuntimeDxe/EmuVariableRuntimeDxe.uni | 22 - > .../EmuRuntimeDxe/EmuVariableRuntimeDxeExtra.uni | 19 - > .../Variable/EmuRuntimeDxe/InitVariable.c | 259 --- > .../Universal/Variable/EmuRuntimeDxe/Variable.h | 277 --- > 7 files changed, 1 insertion(+), 2489 deletions(-) > delete mode 100644 > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c > delete mode 100644 > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.i > nf > delete mode 100644 > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.u > ni > delete mode 100644 > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxeE > xtra.uni > delete mode 100644 > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/InitVariable.c > delete mode 100644 > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/Variable.h >=20 > diff --git a/MdeModulePkg/MdeModulePkg.dsc > b/MdeModulePkg/MdeModulePkg.dsc > index 5d042be3a862..3186f35a1a48 100644 > --- a/MdeModulePkg/MdeModulePkg.dsc > +++ b/MdeModulePkg/MdeModulePkg.dsc > @@ -2,7 +2,7 @@ > # EFI/PI Reference Module Package for All Architectures > # > # (C) Copyright 2014 Hewlett-Packard Development Company, L.P.
> -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
> +# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
> # > # This program and the accompanying materials > # are licensed and made available under the terms and conditions of t= he BSD > License > @@ -433,9 +433,6 @@ [Components.IA32, Components.X64, > Components.ARM, Components.AARCH64] >=20 > NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32Guid > edSectionExtractLib.inf > } >=20 > -[Components.IA32, Components.X64, Components.Ebc] > - > MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.i > nf > - > [Components.IA32, Components.X64] > MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.i= nf > MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf > diff --git a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c > b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c > deleted file mode 100644 > index 1bcf931b96a6..000000000000 > --- a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariable.c > +++ /dev/null > @@ -1,1820 +0,0 @@ > -/** @file > - > - Emulation Variable services operate on the runtime volatile memory. > - The nonvolatile variable space doesn't exist. > - > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS > OR IMPLIED. > - > -**/ > - > -#include "Variable.h" > - > -/// > -/// Don't use module globals after the SetVirtualAddress map is signaled > -/// > -ESAL_VARIABLE_GLOBAL *mVariableModuleGlobal; > - > -VARIABLE_INFO_ENTRY *gVariableInfo =3D NULL; > - > -/// > -/// The size of a 3 character ISO639 language code. > -/// > -#define ISO_639_2_ENTRY_SIZE 3 > - > -/** > - Update the variable region with Variable information. These are the sa= me > - arguments as the EFI Variable services. > - > - @param[in] VariableName Name of variable > - > - @param[in] VendorGuid Guid of variable > - > - @param[in] Data Variable data > - > - @param[in] DataSize Size of data. 0 means delete > - > - @param[in] Attributes Attribues of the variable > - > - @param[in] Variable The variable information which is used t= o keep > track of variable usage. > - > - @retval EFI_SUCCESS The update operation is success. > - > - @retval EFI_OUT_OF_RESOURCES Variable region is full, can not write o= ther > data into this region. > - > -**/ > -EFI_STATUS > -EFIAPI > -UpdateVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - IN VOID *Data, > - IN UINTN DataSize, > - IN UINT32 Attributes OPTIONAL, > - IN VARIABLE_POINTER_TRACK *Variable > - ); > - > -/** > - Finds variable in storage blocks of volatile and non-volatile storage = areas. > - > - This code finds variable in storage blocks of volatile and non-volatil= e storage > areas. > - If VariableName is an empty string, then we just return the first > - qualified variable without comparing VariableName and VendorGuid. > - Otherwise, VariableName and VendorGuid are compared. > - > - @param VariableName Name of the variable to be found. > - @param VendorGuid Vendor GUID to be found. > - @param PtrTrack VARIABLE_POINTER_TRACK structure f= or output, > - including the range searched and t= he target position. > - @param Global Pointer to VARIABLE_GLOBAL structu= re, including > - base of volatile variable storage = area, base of > - NV variable storage area, and a lo= ck. > - > - @retval EFI_INVALID_PARAMETER If VariableName is not an empty st= ring, > while > - VendorGuid is NULL. > - @retval EFI_SUCCESS Variable successfully found. > - @retval EFI_NOT_FOUND Variable not found. > - > -**/ > -EFI_STATUS > -FindVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - OUT VARIABLE_POINTER_TRACK *PtrTrack, > - IN VARIABLE_GLOBAL *Global > - ); > - > -/** > - Acquires lock only at boot time. Simply returns at runtime. > - > - This is a temperary function which will be removed when > - EfiAcquireLock() in UefiLib can handle the call in UEFI > - Runtimer driver in RT phase. > - It calls EfiAcquireLock() at boot time, and simply returns > - at runtime > - > - @param Lock A pointer to the lock to acquire > - > -**/ > -VOID > -AcquireLockOnlyAtBootTime ( > - IN EFI_LOCK *Lock > - ) > -{ > - if (!EfiAtRuntime ()) { > - EfiAcquireLock (Lock); > - } > -} > - > -/** > - Releases lock only at boot time. Simply returns at runtime. > - > - This is a temperary function which will be removed when > - EfiReleaseLock() in UefiLib can handle the call in UEFI > - Runtimer driver in RT phase. > - It calls EfiReleaseLock() at boot time, and simply returns > - at runtime > - > - @param Lock A pointer to the lock to release > - > -**/ > -VOID > -ReleaseLockOnlyAtBootTime ( > - IN EFI_LOCK *Lock > - ) > -{ > - if (!EfiAtRuntime ()) { > - EfiReleaseLock (Lock); > - } > -} > - > -/** > - Gets pointer to the variable data. > - > - This function gets the pointer to the variable data according > - to the input pointer to the variable header. > - > - @param Variable Pointer to the variable header. > - > - @return Pointer to variable data > - > -**/ > -UINT8 * > -GetVariableDataPtr ( > - IN VARIABLE_HEADER *Variable > - ) > -{ > - if (Variable->StartId !=3D VARIABLE_DATA) { > - return NULL; > - } > - // > - // Be careful about pad size for alignment > - // > - return (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (Variable) + Variable- > >NameSize + GET_PAD_SIZE (Variable->NameSize)); > -} > - > -/** > - Gets pointer to header of the next potential variable. > - > - This function gets the pointer to the next potential variable header > - according to the input point to the variable header. The return value > - is not a valid variable if the input variable was the last variable > - in the variabl store. > - > - @param Variable Pointer to header of the next variable > - > - @return Pointer to next variable header. > - @retval NULL Input was not a valid variable header. > - > -**/ > -VARIABLE_HEADER * > -GetNextPotentialVariablePtr ( > - IN VARIABLE_HEADER *Variable > - ) > -{ > - VARIABLE_HEADER *VarHeader; > - > - if (Variable->StartId !=3D VARIABLE_DATA) { > - return NULL; > - } > - // > - // Be careful about pad size for alignment > - // > - VarHeader =3D (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) > GetVariableDataPtr (Variable) + Variable->DataSize + GET_PAD_SIZE (Variab= le- > >DataSize)); > - > - return VarHeader; > -} > - > -/** > - Gets pointer to header of the next variable. > - > - This function gets the pointer to the next variable header according > - to the input point to the variable header. > - > - @param Variable Pointer to header of the next variable > - > - @return Pointer to next variable header. > - > -**/ > -VARIABLE_HEADER * > -GetNextVariablePtr ( > - IN VARIABLE_HEADER *Variable > - ) > -{ > - VARIABLE_HEADER *VarHeader; > - > - VarHeader =3D GetNextPotentialVariablePtr (Variable); > - > - if ((VarHeader =3D=3D NULL) || (VarHeader->StartId !=3D VARIABLE_DATA)= ) { > - return NULL; > - } > - > - return VarHeader; > -} > - > -/** > - Updates LastVariableOffset variable for the given variable store. > - > - LastVariableOffset points to the offset to use for the next variable > - when updating the variable store. > - > - @param[in] VariableStore Pointer to the start of the variable = store > - @param[out] LastVariableOffset Offset to put the next new variable i= n > - > -**/ > -VOID > -InitializeLocationForLastVariableOffset ( > - IN VARIABLE_STORE_HEADER *VariableStore, > - OUT UINTN *LastVariableOffset > - ) > -{ > - VARIABLE_HEADER *VarHeader; > - > - *LastVariableOffset =3D sizeof (VARIABLE_STORE_HEADER); > - VarHeader =3D (VARIABLE_HEADER*) ((UINT8*)VariableStore + > *LastVariableOffset); > - while (VarHeader->StartId =3D=3D VARIABLE_DATA) { > - VarHeader =3D GetNextPotentialVariablePtr (VarHeader); > - > - if (VarHeader !=3D NULL) { > - *LastVariableOffset =3D (UINTN) VarHeader - (UINTN) VariableStore; > - } else { > - return; > - } > - } > -} > - > -/** > - Gets pointer to the end of the variable storage area. > - > - This function gets pointer to the end of the variable storage > - area, according to the input variable store header. > - > - @param VolHeader Pointer to the variale store header > - > - @return Pointer to the end of the variable storage area. > - > -**/ > -VARIABLE_HEADER * > -GetEndPointer ( > - IN VARIABLE_STORE_HEADER *VolHeader > - ) > -{ > - // > - // The end of variable store > - // > - return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VolHeader + > VolHeader->Size); > -} > - > -/** > - Routine used to track statistical information about variable usage. > - The data is stored in the EFI system table so it can be accessed later= . > - VariableInfo.efi can dump out the table. Only Boot Services variable > - accesses are tracked by this code. The PcdVariableCollectStatistics > - build flag controls if this feature is enabled. > - > - A read that hits in the cache will have Read and Cache true for > - the transaction. Data is allocated by this routine, but never > - freed. > - > - @param[in] VariableName Name of the Variable to track > - @param[in] VendorGuid Guid of the Variable to track > - @param[in] Volatile TRUE if volatile FALSE if non-volatile > - @param[in] Read TRUE if GetVariable() was called > - @param[in] Write TRUE if SetVariable() was called > - @param[in] Delete TRUE if deleted via SetVariable() > - @param[in] Cache TRUE for a cache hit. > - > -**/ > -VOID > -UpdateVariableInfo ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - IN BOOLEAN Volatile, > - IN BOOLEAN Read, > - IN BOOLEAN Write, > - IN BOOLEAN Delete, > - IN BOOLEAN Cache > - ) > -{ > - VARIABLE_INFO_ENTRY *Entry; > - > - if (FeaturePcdGet (PcdVariableCollectStatistics)) { > - > - if (EfiAtRuntime ()) { > - // Don't collect statistics at runtime > - return; > - } > - > - if (gVariableInfo =3D=3D NULL) { > - // > - // on the first call allocate a entry and place a pointer to it in > - // the EFI System Table > - // > - gVariableInfo =3D AllocateZeroPool (sizeof (VARIABLE_INFO_ENTRY)); > - ASSERT (gVariableInfo !=3D NULL); > - > - CopyGuid (&gVariableInfo->VendorGuid, VendorGuid); > - gVariableInfo->Name =3D AllocateZeroPool (StrSize (VariableName)); > - ASSERT (gVariableInfo->Name !=3D NULL); > - StrCpyS (gVariableInfo->Name, StrSize(VariableName)/sizeof(CHAR16)= , > VariableName); > - gVariableInfo->Volatile =3D Volatile; > - > - gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo); > - } > - > - > - for (Entry =3D gVariableInfo; Entry !=3D NULL; Entry =3D Entry->Next= ) { > - if (CompareGuid (VendorGuid, &Entry->VendorGuid)) { > - if (StrCmp (VariableName, Entry->Name) =3D=3D 0) { > - if (Read) { > - Entry->ReadCount++; > - } > - if (Write) { > - Entry->WriteCount++; > - } > - if (Delete) { > - Entry->DeleteCount++; > - } > - if (Cache) { > - Entry->CacheCount++; > - } > - > - return; > - } > - } > - > - if (Entry->Next =3D=3D NULL) { > - // > - // If the entry is not in the table add it. > - // Next iteration of the loop will fill in the data > - // > - Entry->Next =3D AllocateZeroPool (sizeof (VARIABLE_INFO_ENTRY)); > - ASSERT (Entry->Next !=3D NULL); > - > - CopyGuid (&Entry->Next->VendorGuid, VendorGuid); > - Entry->Next->Name =3D AllocateZeroPool (StrSize (VariableName)); > - ASSERT (Entry->Next->Name !=3D NULL); > - StrCpyS (Entry->Next->Name, StrSize(VariableName)/sizeof(CHAR16)= , > VariableName); > - Entry->Next->Volatile =3D Volatile; > - } > - > - } > - } > -} > - > -/** > - Get index from supported language codes according to language string. > - > - This code is used to get corresponding index in supported language cod= es. It > can handle > - RFC4646 and ISO639 language tags. > - In ISO639 language tags, take 3-characters as a delimitation to find m= atched > string and calculate the index. > - In RFC4646 language tags, take semicolon as a delimitation to find mat= ched > string and calculate the index. > - > - For example: > - SupportedLang =3D "engfraengfra" > - Lang =3D "eng" > - Iso639Language =3D TRUE > - The return value is "0". > - Another example: > - SupportedLang =3D "en;fr;en-US;fr-FR" > - Lang =3D "fr-FR" > - Iso639Language =3D FALSE > - The return value is "3". > - > - @param SupportedLang Platform supported language codes. > - @param Lang Configured language. > - @param Iso639Language A bool value to signify if the han= dler is > operated on ISO639 or RFC4646. > - > - @retval the index of language in the language codes. > - > -**/ > -UINTN > -GetIndexFromSupportedLangCodes( > - IN CHAR8 *SupportedLang, > - IN CHAR8 *Lang, > - IN BOOLEAN Iso639Language > - ) > -{ > - UINTN Index; > - UINTN CompareLength; > - UINTN LanguageLength; > - > - if (Iso639Language) { > - CompareLength =3D ISO_639_2_ENTRY_SIZE; > - for (Index =3D 0; Index < AsciiStrLen (SupportedLang); Index +=3D Co= mpareLength) > { > - if (AsciiStrnCmp (Lang, SupportedLang + Index, CompareLength) =3D= =3D 0) { > - // > - // Successfully find the index of Lang string in SupportedLang s= tring. > - // > - Index =3D Index / CompareLength; > - return Index; > - } > - } > - ASSERT (FALSE); > - return 0; > - } else { > - // > - // Compare RFC4646 language code > - // > - Index =3D 0; > - for (LanguageLength =3D 0; Lang[LanguageLength] !=3D '\0'; LanguageL= ength++); > - > - for (Index =3D 0; *SupportedLang !=3D '\0'; Index++, SupportedLang += =3D > CompareLength) { > - // > - // Skip ';' characters in SupportedLang > - // > - for (; *SupportedLang !=3D '\0' && *SupportedLang =3D=3D ';'; Supp= ortedLang++); > - // > - // Determine the length of the next language code in SupportedLang > - // > - for (CompareLength =3D 0; SupportedLang[CompareLength] !=3D '\0' &= & > SupportedLang[CompareLength] !=3D ';'; CompareLength++); > - > - if ((CompareLength =3D=3D LanguageLength) && > - (AsciiStrnCmp (Lang, SupportedLang, CompareLength) =3D=3D 0)) = { > - // > - // Successfully find the index of Lang string in SupportedLang s= tring. > - // > - return Index; > - } > - } > - ASSERT (FALSE); > - return 0; > - } > -} > - > -/** > - Get language string from supported language codes according to index. > - > - This code is used to get corresponding language string in supported la= nguage > codes. It can handle > - RFC4646 and ISO639 language tags. > - In ISO639 language tags, take 3-characters as a delimitation. Find lan= guage > string according to the index. > - In RFC4646 language tags, take semicolon as a delimitation. Find langu= age > string according to the index. > - > - For example: > - SupportedLang =3D "engfraengfra" > - Index =3D "1" > - Iso639Language =3D TRUE > - The return value is "fra". > - Another example: > - SupportedLang =3D "en;fr;en-US;fr-FR" > - Index =3D "1" > - Iso639Language =3D FALSE > - The return value is "fr". > - > - @param SupportedLang Platform supported language codes. > - @param Index the index in supported language co= des. > - @param Iso639Language A bool value to signify if the han= dler is > operated on ISO639 or RFC4646. > - > - @retval the language string in the language codes. > - > -**/ > -CHAR8 * > -GetLangFromSupportedLangCodes ( > - IN CHAR8 *SupportedLang, > - IN UINTN Index, > - IN BOOLEAN Iso639Language > -) > -{ > - UINTN SubIndex; > - UINTN CompareLength; > - CHAR8 *Supported; > - > - SubIndex =3D 0; > - Supported =3D SupportedLang; > - if (Iso639Language) { > - // > - // according to the index of Lang string in SupportedLang string to = get the > language. > - // As this code will be invoked in RUNTIME, therefore there is not m= emory > allocate/free operation. > - // In driver entry, it pre-allocates a runtime attribute memory to > accommodate this string. > - // > - CompareLength =3D ISO_639_2_ENTRY_SIZE; > - mVariableModuleGlobal->Lang[CompareLength] =3D '\0'; > - return CopyMem (mVariableModuleGlobal->Lang, SupportedLang + Index * > CompareLength, CompareLength); > - > - } else { > - while (TRUE) { > - // > - // take semicolon as delimitation, sequentially traverse supported= language > codes. > - // > - for (CompareLength =3D 0; *Supported !=3D ';' && *Supported !=3D '= \0'; > CompareLength++) { > - Supported++; > - } > - if ((*Supported =3D=3D '\0') && (SubIndex !=3D Index)) { > - // > - // Have completed the traverse, but not find corrsponding string= . > - // This case is not allowed to happen. > - // > - ASSERT(FALSE); > - return NULL; > - } > - if (SubIndex =3D=3D Index) { > - // > - // according to the index of Lang string in SupportedLang string= to get the > language. > - // As this code will be invoked in RUNTIME, therefore there is n= ot memory > allocate/free operation. > - // In driver entry, it pre-allocates a runtime attribute memory = to > accommodate this string. > - // > - mVariableModuleGlobal->PlatformLang[CompareLength] =3D '\0'; > - return CopyMem (mVariableModuleGlobal->PlatformLang, Supported - > CompareLength, CompareLength); > - } > - SubIndex++; > - > - // > - // Skip ';' characters in Supported > - // > - for (; *Supported !=3D '\0' && *Supported =3D=3D ';'; Supported++)= ; > - } > - } > -} > - > -/** > - Returns a pointer to an allocated buffer that contains the best matchi= ng > language > - from a set of supported languages. > - > - This function supports both ISO 639-2 and RFC 4646 language codes, but > language > - code types may not be mixed in a single call to this function. This fu= nction > - supports a variable argument list that allows the caller to pass in a = prioritized > - list of language codes to test against all the language codes in > SupportedLanguages. > - > - If SupportedLanguages is NULL, then ASSERT(). > - > - @param[in] SupportedLanguages A pointer to a Null-terminated ASCII s= tring > that > - contains a set of language codes in th= e format > - specified by Iso639Language. > - @param[in] Iso639Language If not zero, then all language codes a= re > assumed to be > - in ISO 639-2 format. If zero, then al= l language > - codes are assumed to be in RFC 4646 la= nguage format > - @param[in] ... A variable argument list that contains= pointers to > - Null-terminated ASCII strings that con= tain one or more > - language codes in the format specified= by Iso639Language. > - The first language code from each of t= hese language > - code lists is used to determine if it = is an exact or > - close match to any of the language cod= es in > - SupportedLanguages. Close matches onl= y apply to RFC 4646 > - language codes, and the matching algor= ithm from RFC 4647 > - is used to determine if a close match = is present. If > - an exact or close match is found, then= the matching > - language code from SupportedLanguages = is returned. If > - no matches are found, then the next va= riable argument > - parameter is evaluated. The variable = argument list > - is terminated by a NULL. > - > - @retval NULL The best matching language could not be found in > SupportedLanguages. > - @retval NULL There are not enough resources available to return the = best > matching > - language. > - @retval Other A pointer to a Null-terminated ASCII string that is the= best > matching > - language in SupportedLanguages. > - > -**/ > -CHAR8 * > -EFIAPI > -VariableGetBestLanguage ( > - IN CONST CHAR8 *SupportedLanguages, > - IN UINTN Iso639Language, > - ... > - ) > -{ > - VA_LIST Args; > - CHAR8 *Language; > - UINTN CompareLength; > - UINTN LanguageLength; > - CONST CHAR8 *Supported; > - CHAR8 *Buffer; > - > - ASSERT (SupportedLanguages !=3D NULL); > - > - VA_START (Args, Iso639Language); > - while ((Language =3D VA_ARG (Args, CHAR8 *)) !=3D NULL) { > - // > - // Default to ISO 639-2 mode > - // > - CompareLength =3D 3; > - LanguageLength =3D MIN (3, AsciiStrLen (Language)); > - > - // > - // If in RFC 4646 mode, then determine the length of the first RFC 4= 646 > language code in Language > - // > - if (Iso639Language =3D=3D 0) { > - for (LanguageLength =3D 0; Language[LanguageLength] !=3D 0 && > Language[LanguageLength] !=3D ';'; LanguageLength++); > - } > - > - // > - // Trim back the length of Language used until it is empty > - // > - while (LanguageLength > 0) { > - // > - // Loop through all language codes in SupportedLanguages > - // > - for (Supported =3D SupportedLanguages; *Supported !=3D '\0'; Suppo= rted +=3D > CompareLength) { > - // > - // In RFC 4646 mode, then Loop through all language codes in > SupportedLanguages > - // > - if (Iso639Language =3D=3D 0) { > - // > - // Skip ';' characters in Supported > - // > - for (; *Supported !=3D '\0' && *Supported =3D=3D ';'; Supporte= d++); > - // > - // Determine the length of the next language code in Supported > - // > - for (CompareLength =3D 0; Supported[CompareLength] !=3D 0 && > Supported[CompareLength] !=3D ';'; CompareLength++); > - // > - // If Language is longer than the Supported, then skip to the = next > language > - // > - if (LanguageLength > CompareLength) { > - continue; > - } > - } > - // > - // See if the first LanguageLength characters in Supported match= Language > - // > - if (AsciiStrnCmp (Supported, Language, LanguageLength) =3D=3D 0)= { > - VA_END (Args); > - > - Buffer =3D (Iso639Language !=3D 0) ? mVariableModuleGlobal->La= ng : > mVariableModuleGlobal->PlatformLang; > - Buffer[CompareLength] =3D '\0'; > - return CopyMem (Buffer, Supported, CompareLength); > - } > - } > - > - if (Iso639Language !=3D 0) { > - // > - // If ISO 639 mode, then each language can only be tested once > - // > - LanguageLength =3D 0; > - } else { > - // > - // If RFC 4646 mode, then trim Language from the right to the ne= xt '-' > character > - // > - for (LanguageLength--; LanguageLength > 0 && > Language[LanguageLength] !=3D '-'; LanguageLength--); > - } > - } > - } > - VA_END (Args); > - > - // > - // No matches were found > - // > - return NULL; > -} > - > -/** > - Hook the operations in PlatformLangCodes, LangCodes, PlatformLang and > Lang. > - > - When setting Lang/LangCodes, simultaneously update > PlatformLang/PlatformLangCodes. > - > - According to UEFI spec, PlatformLangCodes/LangCodes are only set once = in > firmware initialization, > - and are read-only. Therefore, in variable driver, only store the origi= nal value > for other use. > - > - @param[in] VariableName Name of variable > - > - @param[in] Data Variable data > - > - @param[in] DataSize Size of data. 0 means delete > - > -**/ > -VOID > -AutoUpdateLangVariable( > - IN CHAR16 *VariableName, > - IN VOID *Data, > - IN UINTN DataSize > - ) > -{ > - EFI_STATUS Status; > - CHAR8 *BestPlatformLang; > - CHAR8 *BestLang; > - UINTN Index; > - UINT32 Attributes; > - VARIABLE_POINTER_TRACK Variable; > - BOOLEAN SetLanguageCodes; > - > - // > - // Don't do updates for delete operation > - // > - if (DataSize =3D=3D 0) { > - return; > - } > - > - SetLanguageCodes =3D FALSE; > - > - if (StrCmp (VariableName, L"PlatformLangCodes") =3D=3D 0) { > - // > - // PlatformLangCodes is a volatile variable, so it can not be update= d at > runtime. > - // > - if (EfiAtRuntime ()) { > - return; > - } > - > - SetLanguageCodes =3D TRUE; > - > - // > - // According to UEFI spec, PlatformLangCodes is only set once in fir= mware > initialization, and is read-only > - // Therefore, in variable driver, only store the original value for = other use. > - // > - if (mVariableModuleGlobal->PlatformLangCodes !=3D NULL) { > - FreePool (mVariableModuleGlobal->PlatformLangCodes); > - } > - mVariableModuleGlobal->PlatformLangCodes =3D AllocateRuntimeCopyPool > (DataSize, Data); > - ASSERT (mVariableModuleGlobal->PlatformLangCodes !=3D NULL); > - > - // > - // PlatformLang holds a single language from PlatformLangCodes, > - // so the size of PlatformLangCodes is enough for the PlatformLang. > - // > - if (mVariableModuleGlobal->PlatformLang !=3D NULL) { > - FreePool (mVariableModuleGlobal->PlatformLang); > - } > - mVariableModuleGlobal->PlatformLang =3D AllocateRuntimePool (DataSiz= e); > - ASSERT (mVariableModuleGlobal->PlatformLang !=3D NULL); > - > - } else if (StrCmp (VariableName, L"LangCodes") =3D=3D 0) { > - // > - // LangCodes is a volatile variable, so it can not be updated at run= time. > - // > - if (EfiAtRuntime ()) { > - return; > - } > - > - SetLanguageCodes =3D TRUE; > - > - // > - // According to UEFI spec, LangCodes is only set once in firmware > initialization, and is read-only > - // Therefore, in variable driver, only store the original value for = other use. > - // > - if (mVariableModuleGlobal->LangCodes !=3D NULL) { > - FreePool (mVariableModuleGlobal->LangCodes); > - } > - mVariableModuleGlobal->LangCodes =3D AllocateRuntimeCopyPool (DataSi= ze, > Data); > - ASSERT (mVariableModuleGlobal->LangCodes !=3D NULL); > - } > - > - if (SetLanguageCodes > - && (mVariableModuleGlobal->PlatformLangCodes !=3D NULL) > - && (mVariableModuleGlobal->LangCodes !=3D NULL)) { > - // > - // Update Lang if PlatformLang is already set > - // Update PlatformLang if Lang is already set > - // > - Status =3D FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &= Variable, > (VARIABLE_GLOBAL *) mVariableModuleGlobal); > - if (!EFI_ERROR (Status)) { > - // > - // Update Lang > - // > - VariableName =3D L"PlatformLang"; > - Data =3D GetVariableDataPtr (Variable.CurrPtr); > - DataSize =3D Variable.CurrPtr->DataSize; > - } else { > - Status =3D FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variab= le, > (VARIABLE_GLOBAL *) mVariableModuleGlobal); > - if (!EFI_ERROR (Status)) { > - // > - // Update PlatformLang > - // > - VariableName =3D L"Lang"; > - Data =3D GetVariableDataPtr (Variable.CurrPtr); > - DataSize =3D Variable.CurrPtr->DataSize; > - } else { > - // > - // Neither PlatformLang nor Lang is set, directly return > - // > - return; > - } > - } > - } > - > - // > - // According to UEFI spec, "Lang" and "PlatformLang" is NV|BS|RT > attributions. > - // > - Attributes =3D EFI_VARIABLE_NON_VOLATILE | > EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; > - > - if (StrCmp (VariableName, L"PlatformLang") =3D=3D 0) { > - // > - // Update Lang when PlatformLangCodes/LangCodes were set. > - // > - if ((mVariableModuleGlobal->PlatformLangCodes !=3D NULL) && > (mVariableModuleGlobal->LangCodes !=3D NULL)) { > - // > - // When setting PlatformLang, firstly get most matched language st= ring > from supported language codes. > - // > - BestPlatformLang =3D VariableGetBestLanguage (mVariableModuleGloba= l- > >PlatformLangCodes, FALSE, Data, NULL); > - if (BestPlatformLang !=3D NULL) { > - // > - // Get the corresponding index in language codes. > - // > - Index =3D GetIndexFromSupportedLangCodes (mVariableModuleGlobal- > >PlatformLangCodes, BestPlatformLang, FALSE); > - > - // > - // Get the corresponding ISO639 language tag according to RFC464= 6 > language tag. > - // > - BestLang =3D GetLangFromSupportedLangCodes (mVariableModuleGloba= l- > >LangCodes, Index, TRUE); > - > - // > - // Successfully convert PlatformLang to Lang, and set the BestLa= ng value > into Lang variable simultaneously. > - // > - FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, > (VARIABLE_GLOBAL *)mVariableModuleGlobal); > - > - Status =3D UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, Bes= tLang, > ISO_639_2_ENTRY_SIZE + 1, Attributes, &Variable); > - > - DEBUG ((EFI_D_INFO, "Variable Driver Auto Update PlatformLang, > PlatformLang:%a, Lang:%a\n", BestPlatformLang, BestLang)); > - > - ASSERT_EFI_ERROR(Status); > - } > - } > - > - } else if (StrCmp (VariableName, L"Lang") =3D=3D 0) { > - // > - // Update PlatformLang when PlatformLangCodes/LangCodes were set. > - // > - if ((mVariableModuleGlobal->PlatformLangCodes !=3D NULL) && > (mVariableModuleGlobal->LangCodes !=3D NULL)) { > - // > - // When setting Lang, firstly get most matched language string fro= m > supported language codes. > - // > - BestLang =3D VariableGetBestLanguage (mVariableModuleGlobal->LangC= odes, > TRUE, Data, NULL); > - if (BestLang !=3D NULL) { > - // > - // Get the corresponding index in language codes. > - // > - Index =3D GetIndexFromSupportedLangCodes (mVariableModuleGlobal- > >LangCodes, BestLang, TRUE); > - > - // > - // Get the corresponding RFC4646 language tag according to ISO63= 9 > language tag. > - // > - BestPlatformLang =3D GetLangFromSupportedLangCodes > (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE); > - > - // > - // Successfully convert Lang to PlatformLang, and set the > BestPlatformLang value into PlatformLang variable simultaneously. > - // > - FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variabl= e, > (VARIABLE_GLOBAL *)mVariableModuleGlobal); > - > - Status =3D UpdateVariable (L"PlatformLang", &gEfiGlobalVariableG= uid, > BestPlatformLang, > - AsciiStrSize (BestPlatformLang), Attrib= utes, &Variable); > - > - DEBUG ((EFI_D_INFO, "Variable Driver Auto Update Lang, Lang:%a, > PlatformLang:%a\n", BestLang, BestPlatformLang)); > - ASSERT_EFI_ERROR (Status); > - } > - } > - } > -} > - > -/** > - Update the variable region with Variable information. These are the sa= me > - arguments as the EFI Variable services. > - > - @param[in] VariableName Name of variable > - > - @param[in] VendorGuid Guid of variable > - > - @param[in] Data Variable data > - > - @param[in] DataSize Size of data. 0 means delete > - > - @param[in] Attributes Attribues of the variable > - > - @param[in] Variable The variable information which is used t= o keep > track of variable usage. > - > - @retval EFI_SUCCESS The update operation is success. > - > - @retval EFI_OUT_OF_RESOURCES Variable region is full, can not write o= ther > data into this region. > - > -**/ > -EFI_STATUS > -EFIAPI > -UpdateVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - IN VOID *Data, > - IN UINTN DataSize, > - IN UINT32 Attributes OPTIONAL, > - IN VARIABLE_POINTER_TRACK *Variable > - ) > -{ > - EFI_STATUS Status; > - VARIABLE_HEADER *NextVariable; > - UINTN VarNameSize; > - UINTN VarNameOffset; > - UINTN VarDataOffset; > - UINTN VarSize; > - VARIABLE_GLOBAL *Global; > - UINTN NonVolatileVarableStoreSize; > - > - Global =3D &mVariableModuleGlobal->VariableGlobal[Physical]; > - > - if (Variable->CurrPtr !=3D NULL) { > - // > - // Update/Delete existing variable > - // > - > - if (EfiAtRuntime ()) { > - // > - // If EfiAtRuntime and the variable is Volatile and Runtime Access= , > - // the volatile is ReadOnly, and SetVariable should be aborted and > - // return EFI_WRITE_PROTECTED. > - // > - if (Variable->Volatile) { > - Status =3D EFI_WRITE_PROTECTED; > - goto Done; > - } > - // > - // Only variable have NV attribute can be updated/deleted in Runti= me > - // > - if ((Variable->CurrPtr->Attributes & EFI_VARIABLE_NON_VOLATILE) = =3D=3D 0) { > - Status =3D EFI_INVALID_PARAMETER; > - goto Done; > - } > - } > - > - // > - // Setting a data variable with no access, or zero DataSize attribut= es > - // specified causes it to be deleted. > - // > - if (DataSize =3D=3D 0 || (Attributes & (EFI_VARIABLE_RUNTIME_ACCESS = | > EFI_VARIABLE_BOOTSERVICE_ACCESS)) =3D=3D 0) { > - Variable->CurrPtr->State &=3D VAR_DELETED; > - UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, = FALSE, > FALSE, TRUE, FALSE); > - Status =3D EFI_SUCCESS; > - goto Done; > - } > - > - // > - // If the variable is marked valid and the same data has been passed= in > - // then return to the caller immediately. > - // > - if (Variable->CurrPtr->DataSize =3D=3D DataSize && > - CompareMem (Data, GetVariableDataPtr (Variable->CurrPtr), DataSi= ze) =3D=3D > 0 > - ) { > - Status =3D EFI_SUCCESS; > - goto Done; > - } else if (Variable->CurrPtr->State =3D=3D VAR_ADDED) { > - // > - // Mark the old variable as in delete transition > - // > - Variable->CurrPtr->State &=3D VAR_IN_DELETED_TRANSITION; > - } > - > - } else { > - // > - // No found existing variable, Create a new variable > - // > - > - // > - // Make sure we are trying to create a new variable. > - // Setting a data variable with no access, or zero DataSize attribut= es means > to delete it. > - // > - if (DataSize =3D=3D 0 || (Attributes & (EFI_VARIABLE_RUNTIME_ACCESS = | > EFI_VARIABLE_BOOTSERVICE_ACCESS)) =3D=3D 0) { > - Status =3D EFI_NOT_FOUND; > - goto Done; > - } > - > - // > - // Only variable have NV|RT attribute can be created in Runtime > - // > - if (EfiAtRuntime () && > - (((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) =3D=3D 0) || ((Attr= ibutes & > EFI_VARIABLE_NON_VOLATILE) =3D=3D 0))) { > - Status =3D EFI_INVALID_PARAMETER; > - goto Done; > - } > - } > - > - // > - // Function part - create a new variable and copy the data. > - // Both update a variable and create a variable will come here. > - // > - > - VarNameOffset =3D sizeof (VARIABLE_HEADER); > - VarNameSize =3D StrSize (VariableName); > - VarDataOffset =3D VarNameOffset + VarNameSize + GET_PAD_SIZE > (VarNameSize); > - VarSize =3D VarDataOffset + DataSize + GET_PAD_SIZE (DataSize); > - > - if ((Attributes & EFI_VARIABLE_NON_VOLATILE) !=3D 0) { > - NonVolatileVarableStoreSize =3D ((VARIABLE_STORE_HEADER > *)(UINTN)(Global->NonVolatileVariableBase))->Size; > - if ((((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) !=3D 0) > - && ((HEADER_ALIGN (VarSize) + mVariableModuleGlobal- > >HwErrVariableTotalSize) > PcdGet32 (PcdHwErrStorageSize))) > - || (((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) =3D=3D 0) > - && ((HEADER_ALIGN (VarSize) + mVariableModuleGlobal- > >CommonVariableTotalSize) > NonVolatileVarableStoreSize - sizeof > (VARIABLE_STORE_HEADER) - PcdGet32 (PcdHwErrStorageSize)))) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Done; > - } > - > - NextVariable =3D (VARIABLE_HEADER *) (UINT8 *) (mVariableModuleGlob= al- > >NonVolatileLastVariableOffset > - + (UINTN) Global->NonVolatileVariableBase); > - mVariableModuleGlobal->NonVolatileLastVariableOffset +=3D HEADER_ALI= GN > (VarSize); > - > - if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) !=3D 0) { > - mVariableModuleGlobal->HwErrVariableTotalSize +=3D HEADER_ALIGN > (VarSize); > - } else { > - mVariableModuleGlobal->CommonVariableTotalSize +=3D HEADER_ALIGN > (VarSize); > - } > - } else { > - if ((UINT32) (HEADER_ALIGN (VarSize) + mVariableModuleGlobal- > >VolatileLastVariableOffset) > > - ((VARIABLE_STORE_HEADER *) ((UINTN) (Global->VolatileVariableB= ase)))- > >Size > - ) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Done; > - } > - > - NextVariable =3D (VARIABLE_HEADER *) (UINT8 *) (mVariableModuleGl= obal- > >VolatileLastVariableOffset > - + (UINTN) Global->VolatileVariableBase); > - mVariableModuleGlobal->VolatileLastVariableOffset +=3D HEADER_ALIGN > (VarSize); > - } > - > - NextVariable->StartId =3D VARIABLE_DATA; > - NextVariable->Attributes =3D Attributes; > - NextVariable->State =3D VAR_ADDED; > - NextVariable->Reserved =3D 0; > - > - // > - // There will be pad bytes after Data, the NextVariable->NameSize and > - // NextVariable->NameSize should not include pad size so that variable > - // service can get actual size in GetVariable > - // > - NextVariable->NameSize =3D (UINT32)VarNameSize; > - NextVariable->DataSize =3D (UINT32)DataSize; > - > - CopyMem (&NextVariable->VendorGuid, VendorGuid, sizeof (EFI_GUID)); > - CopyMem ( > - (UINT8 *) ((UINTN) NextVariable + VarNameOffset), > - VariableName, > - VarNameSize > - ); > - CopyMem ( > - (UINT8 *) ((UINTN) NextVariable + VarDataOffset), > - Data, > - DataSize > - ); > - > - // > - // Mark the old variable as deleted > - // > - if (Variable->CurrPtr !=3D NULL) { > - Variable->CurrPtr->State &=3D VAR_DELETED; > - } > - > - UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALS= E, > TRUE, FALSE, FALSE); > - > - Status =3D EFI_SUCCESS; > - > -Done: > - return Status; > -} > - > -/** > - Finds variable in storage blocks of volatile and non-volatile storage = areas. > - > - This code finds variable in storage blocks of volatile and non-volatil= e storage > areas. > - If VariableName is an empty string, then we just return the first > - qualified variable without comparing VariableName and VendorGuid. > - Otherwise, VariableName and VendorGuid are compared. > - > - @param VariableName Name of the variable to be found. > - @param VendorGuid Vendor GUID to be found. > - @param PtrTrack VARIABLE_POINTER_TRACK structure f= or output, > - including the range searched and t= he target position. > - @param Global Pointer to VARIABLE_GLOBAL structu= re, including > - base of volatile variable storage = area, base of > - NV variable storage area, and a lo= ck. > - > - @retval EFI_INVALID_PARAMETER If VariableName is not an empty st= ring, > while > - VendorGuid is NULL. > - @retval EFI_SUCCESS Variable successfully found. > - @retval EFI_NOT_FOUND Variable not found. > - > -**/ > -EFI_STATUS > -FindVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - OUT VARIABLE_POINTER_TRACK *PtrTrack, > - IN VARIABLE_GLOBAL *Global > - ) > -{ > - VARIABLE_HEADER *Variable[2]; > - VARIABLE_STORE_HEADER *VariableStoreHeader[2]; > - UINTN Index; > - > - // > - // 0: Non-Volatile, 1: Volatile > - // > - VariableStoreHeader[0] =3D (VARIABLE_STORE_HEADER *) ((UINTN) Global- > >NonVolatileVariableBase); > - VariableStoreHeader[1] =3D (VARIABLE_STORE_HEADER *) ((UINTN) Global- > >VolatileVariableBase); > - > - // > - // Start Pointers for the variable. > - // Actual Data Pointer where data can be written. > - // > - Variable[0] =3D (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader[= 0] > + 1); > - Variable[1] =3D (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader[= 1] > + 1); > - > - if (VariableName[0] !=3D 0 && VendorGuid =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - // > - // Find the variable by walk through non-volatile and volatile variabl= e store > - // > - for (Index =3D 0; Index < 2; Index++) { > - PtrTrack->StartPtr =3D (VARIABLE_HEADER *) HEADER_ALIGN > (VariableStoreHeader[Index] + 1); > - PtrTrack->EndPtr =3D GetEndPointer (VariableStoreHeader[Index]); > - > - while ((Variable[Index] < GetEndPointer (VariableStoreHeader[Index])= ) && > (Variable[Index] !=3D NULL)) { > - if (Variable[Index]->StartId =3D=3D VARIABLE_DATA && Variable[Inde= x]->State > =3D=3D VAR_ADDED) { > - if (!(EfiAtRuntime () && ((Variable[Index]->Attributes & > EFI_VARIABLE_RUNTIME_ACCESS) =3D=3D 0))) { > - if (VariableName[0] =3D=3D 0) { > - PtrTrack->CurrPtr =3D Variable[Index]; > - PtrTrack->Volatile =3D (BOOLEAN) Index; > - return EFI_SUCCESS; > - } else { > - if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) = { > - if (CompareMem (VariableName, GET_VARIABLE_NAME_PTR > (Variable[Index]), Variable[Index]->NameSize) =3D=3D 0) { > - PtrTrack->CurrPtr =3D Variable[Index]; > - PtrTrack->Volatile =3D (BOOLEAN) Index; > - return EFI_SUCCESS; > - } > - } > - } > - } > - } > - > - Variable[Index] =3D GetNextVariablePtr (Variable[Index]); > - } > - } > - PtrTrack->CurrPtr =3D NULL; > - return EFI_NOT_FOUND; > -} > - > -/** > - This code finds variable in storage blocks (Volatile or Non-Volatile). > - > - @param VariableName A Null-terminated Unicode string that i= s the > name of > - the vendor's variable. > - @param VendorGuid A unique identifier for the vendor. > - @param Attributes If not NULL, a pointer to the memory lo= cation to > return the > - attributes bitmask for the variable. > - @param DataSize Size of Data found. If size is less tha= n the > - data, this value contains the required = size. > - @param Data On input, the size in bytes of the retu= rn Data buffer. > - On output, the size of data returned in= Data. > - @param Global Pointer to VARIABLE_GLOBAL structure > - > - @retval EFI_SUCCESS The function completed successfully. > - @retval EFI_NOT_FOUND The variable was not found. > - @retval EFI_BUFFER_TOO_SMALL DataSize is too small for the result. > DataSize has > - been updated with the size needed to co= mplete the request. > - @retval EFI_INVALID_PARAMETER VariableName or VendorGuid or DataSize > is NULL. > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuGetVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - OUT UINT32 *Attributes OPTIONAL, > - IN OUT UINTN *DataSize, > - OUT VOID *Data, > - IN VARIABLE_GLOBAL *Global > - ) > -{ > - VARIABLE_POINTER_TRACK Variable; > - UINTN VarDataSize; > - EFI_STATUS Status; > - UINT8 *VariableDataPtr; > - > - if (VariableName =3D=3D NULL || VendorGuid =3D=3D NULL || DataSize =3D= =3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (VariableName[0] =3D=3D 0) { > - return EFI_NOT_FOUND; > - } > - > - AcquireLockOnlyAtBootTime(&Global->VariableServicesLock); > - > - // > - // Find existing variable > - // > - Status =3D FindVariable (VariableName, VendorGuid, &Variable, Global); > - > - if (Variable.CurrPtr =3D=3D NULL || EFI_ERROR (Status)) { > - goto Done; > - } > - // > - // Get data size > - // > - VarDataSize =3D Variable.CurrPtr->DataSize; > - if (*DataSize >=3D VarDataSize) { > - if (Data =3D=3D NULL) { > - Status =3D EFI_INVALID_PARAMETER; > - goto Done; > - } > - VariableDataPtr =3D GetVariableDataPtr (Variable.CurrPtr); > - ASSERT (VariableDataPtr !=3D NULL); > - > - CopyMem (Data, VariableDataPtr, VarDataSize); > - if (Attributes !=3D NULL) { > - *Attributes =3D Variable.CurrPtr->Attributes; > - } > - > - *DataSize =3D VarDataSize; > - UpdateVariableInfo (VariableName, VendorGuid, Variable.Volatile, TRU= E, > FALSE, FALSE, FALSE); > - Status =3D EFI_SUCCESS; > - goto Done; > - } else { > - *DataSize =3D VarDataSize; > - Status =3D EFI_BUFFER_TOO_SMALL; > - goto Done; > - } > - > -Done: > - ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock); > - return Status; > -} > - > -/** > - > - This code Finds the Next available variable. > - > - @param VariableNameSize The size of the VariableName buffer. Th= e size > must be large enough to fit input > - string supplied in VariableName buffer. > - @param VariableName On input, supplies the last VariableNam= e that > was returned by GetNextVariableName(). > - On output, returns the Null-terminated = Unicode string of the > current variable. > - @param VendorGuid On input, supplies the last VendorGuid = that was > returned by GetNextVariableName(). > - On output, returns the VendorGuid of th= e current variable. > - @param Global Pointer to VARIABLE_GLOBAL structure. > - > - @retval EFI_SUCCESS The function completed successfully. > - @retval EFI_NOT_FOUND The next variable was not found. > - @retval EFI_BUFFER_TOO_SMALL The VariableNameSize is too small for t= he > result. > - VariableNameSize has been updated with = the size needed to > complete the request. > - @retval EFI_INVALID_PARAMETER VariableNameSize or VariableName or > VendorGuid is NULL. > - @retval EFI_INVALID_PARAMETER The input values of VariableName and > VendorGuid are not a name and > - GUID of an existing variable. > - @retval EFI_INVALID_PARAMETER Null-terminator is not found in the fir= st > VariableNameSize bytes of > - the input VariableName buffer. > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuGetNextVariableName ( > - IN OUT UINTN *VariableNameSize, > - IN OUT CHAR16 *VariableName, > - IN OUT EFI_GUID *VendorGuid, > - IN VARIABLE_GLOBAL *Global > - ) > -{ > - VARIABLE_POINTER_TRACK Variable; > - UINTN VarNameSize; > - EFI_STATUS Status; > - UINTN MaxLen; > - > - if (VariableNameSize =3D=3D NULL || VariableName =3D=3D NULL || Vendor= Guid =3D=3D > NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Calculate the possible maximum length of name string, including the= Null > terminator. > - // > - MaxLen =3D *VariableNameSize / sizeof (CHAR16); > - if ((MaxLen =3D=3D 0) || (StrnLenS (VariableName, MaxLen) =3D=3D MaxLe= n)) { > - // > - // Null-terminator is not found in the first VariableNameSize bytes = of the > input VariableName buffer, > - // follow spec to return EFI_INVALID_PARAMETER. > - // > - return EFI_INVALID_PARAMETER; > - } > - > - AcquireLockOnlyAtBootTime(&Global->VariableServicesLock); > - > - Status =3D FindVariable (VariableName, VendorGuid, &Variable, Global); > - > - if (Variable.CurrPtr =3D=3D NULL || EFI_ERROR (Status)) { > - // > - // For VariableName is an empty string, FindVariable() will try to f= ind and > return > - // the first qualified variable, and if FindVariable() returns error > (EFI_NOT_FOUND) > - // as no any variable is found, still go to return the error (EFI_NO= T_FOUND). > - // > - if (VariableName[0] !=3D 0) { > - // > - // For VariableName is not an empty string, and FindVariable() ret= urns error > as > - // VariableName and VendorGuid are not a name and GUID of an exist= ing > variable, > - // there is no way to get next variable, follow spec to return > EFI_INVALID_PARAMETER. > - // > - Status =3D EFI_INVALID_PARAMETER; > - } > - goto Done; > - } > - > - while (TRUE) { > - if (VariableName[0] !=3D 0) { > - // > - // If variable name is not NULL, get next variable > - // > - Variable.CurrPtr =3D GetNextVariablePtr (Variable.CurrPtr); > - } > - // > - // If both volatile and non-volatile variable store are parsed, > - // return not found > - // > - if (Variable.CurrPtr >=3D Variable.EndPtr || Variable.CurrPtr =3D=3D= NULL) { > - Variable.Volatile =3D (BOOLEAN) (Variable.Volatile ^ ((BOOLEAN) 0x= 1)); > - if (Variable.Volatile) { > - Variable.StartPtr =3D (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) > (Global->VolatileVariableBase + sizeof (VARIABLE_STORE_HEADER))); > - Variable.EndPtr =3D (VARIABLE_HEADER *) GetEndPointer > ((VARIABLE_STORE_HEADER *) ((UINTN) Global->VolatileVariableBase)); > - } else { > - Status =3D EFI_NOT_FOUND; > - goto Done; > - } > - > - Variable.CurrPtr =3D Variable.StartPtr; > - if (Variable.CurrPtr->StartId !=3D VARIABLE_DATA) { > - continue; > - } > - } > - // > - // Variable is found > - // > - if (Variable.CurrPtr->StartId =3D=3D VARIABLE_DATA && Variable.CurrP= tr->State > =3D=3D VAR_ADDED) { > - if (!(EfiAtRuntime () && ((Variable.CurrPtr->Attributes & > EFI_VARIABLE_RUNTIME_ACCESS) =3D=3D 0))) { > - VarNameSize =3D Variable.CurrPtr->NameSize; > - if (VarNameSize <=3D *VariableNameSize) { > - CopyMem ( > - VariableName, > - GET_VARIABLE_NAME_PTR (Variable.CurrPtr), > - VarNameSize > - ); > - CopyMem ( > - VendorGuid, > - &Variable.CurrPtr->VendorGuid, > - sizeof (EFI_GUID) > - ); > - Status =3D EFI_SUCCESS; > - } else { > - Status =3D EFI_BUFFER_TOO_SMALL; > - } > - > - *VariableNameSize =3D VarNameSize; > - goto Done; > - } > - } > - } > - > -Done: > - ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock); > - return Status; > - > -} > - > -/** > - > - This code sets variable in storage blocks (Volatile or Non-Volatile). > - > - @param VariableName A Null-terminated Unicode string that i= s the > name of the vendor's > - variable. Each VariableName is unique = for each > - VendorGuid. VariableName must contain = 1 or more > - Unicode characters. If VariableName is= an empty Unicode > - string, then EFI_INVALID_PARAMETER is r= eturned. > - @param VendorGuid A unique identifier for the vendor > - @param Attributes Attributes bitmask to set for the varia= ble > - @param DataSize The size in bytes of the Data buffer. = A size of zero > causes the > - variable to be deleted. > - @param Data The contents for the variable > - @param Global Pointer to VARIABLE_GLOBAL structure > - @param VolatileOffset The offset of last volatile variable > - @param NonVolatileOffset The offset of last non-volatile variabl= e > - > - @retval EFI_SUCCESS The firmware has successfully stored th= e variable > and its data as > - defined by the Attributes. > - @retval EFI_INVALID_PARAMETER An invalid combination of attribute bit= s > was supplied, or the > - DataSize exceeds the maximum allowed, o= r VariableName is > an empty > - Unicode string, or VendorGuid is NULL. > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > the variable and its data. > - @retval EFI_DEVICE_ERROR The variable could not be saved due to = a > hardware failure. > - @retval EFI_WRITE_PROTECTED The variable in question is read-only o= r > cannot be deleted. > - @retval EFI_NOT_FOUND The variable trying to be updated or de= leted > was not found. > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuSetVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - IN UINT32 Attributes, > - IN UINTN DataSize, > - IN VOID *Data, > - IN VARIABLE_GLOBAL *Global, > - IN UINTN *VolatileOffset, > - IN UINTN *NonVolatileOffset > - ) > -{ > - VARIABLE_POINTER_TRACK Variable; > - EFI_STATUS Status; > - > - // > - // Check input parameters > - // > - if (VariableName =3D=3D NULL || VariableName[0] =3D=3D 0 || VendorGuid= =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (DataSize !=3D 0 && Data =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Not support authenticated variable write yet. > - // > - if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) !=3D 0) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Make sure if runtime bit is set, boot service bit is set also > - // > - if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | > EFI_VARIABLE_BOOTSERVICE_ACCESS)) =3D=3D EFI_VARIABLE_RUNTIME_ACCESS) { > - return EFI_INVALID_PARAMETER; > - } > - > - > - if ((UINTN)(~0) - DataSize < StrSize(VariableName)){ > - // > - // Prevent whole variable size overflow > - // > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // The size of the VariableName, including the Unicode Null in bytes = plus > - // the DataSize is limited to maximum size of PcdGet32 > (PcdMaxHardwareErrorVariableSize) > - // bytes for HwErrRec, and PcdGet32 (PcdMaxVariableSize) bytes for th= e > others. > - // > - if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) =3D=3D > EFI_VARIABLE_HARDWARE_ERROR_RECORD) { > - if (StrSize (VariableName) + DataSize > PcdGet32 > (PcdMaxHardwareErrorVariableSize) - sizeof (VARIABLE_HEADER)) { > - return EFI_INVALID_PARAMETER; > - } > - // > - // According to UEFI spec, HARDWARE_ERROR_RECORD variable name > convention should be L"HwErrRecXXXX" > - // > - if (StrnCmp(VariableName, L"HwErrRec", StrLen(L"HwErrRec")) !=3D 0) = { > - return EFI_INVALID_PARAMETER; > - } > - } else { > - // > - // The size of the VariableName, including the Unicode Null in bytes = plus > - // the DataSize is limited to maximum size of PcdGet32 (PcdMaxVariabl= eSize) > bytes. > - // > - if (StrSize (VariableName) + DataSize > PcdGet32 (PcdMaxVariableSize= ) - > sizeof (VARIABLE_HEADER)) { > - return EFI_INVALID_PARAMETER; > - } > - } > - > - AcquireLockOnlyAtBootTime(&Global->VariableServicesLock); > - > - // > - // Check whether the input variable is already existed > - // > - > - Status =3D FindVariable (VariableName, VendorGuid, &Variable, Global); > - > - // > - // Hook the operation of setting PlatformLangCodes/PlatformLang and > LangCodes/Lang > - // > - AutoUpdateLangVariable (VariableName, Data, DataSize); > - > - Status =3D UpdateVariable (VariableName, VendorGuid, Data, DataSize, > Attributes, &Variable); > - > - ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock); > - return Status; > -} > - > -/** > - > - This code returns information about the EFI variables. > - > - @param Attributes Attributes bitmask to specify the= type of > variables > - on which to return information. > - @param MaximumVariableStorageSize On output the maximum size of the > storage space available for > - the EFI variables associated with= the attributes specified. > - @param RemainingVariableStorageSize Returns the remaining size of the > storage space available for EFI > - variables associated with the att= ributes specified. > - @param MaximumVariableSize Returns the maximum size of an > individual EFI variable > - associated with the attributes sp= ecified. > - @param Global Pointer to VARIABLE_GLOBAL struct= ure. > - > - @retval EFI_SUCCESS Valid answer returned. > - @retval EFI_INVALID_PARAMETER An invalid combination of attribu= te bits > was supplied > - @retval EFI_UNSUPPORTED The attribute is not supported on= this > platform, and the > - MaximumVariableStorageSize, > RemainingVariableStorageSize, > - MaximumVariableSize are undefined= . > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuQueryVariableInfo ( > - IN UINT32 Attributes, > - OUT UINT64 *MaximumVariableStorageSize, > - OUT UINT64 *RemainingVariableStorageSize, > - OUT UINT64 *MaximumVariableSize, > - IN VARIABLE_GLOBAL *Global > - ) > -{ > - VARIABLE_HEADER *Variable; > - VARIABLE_HEADER *NextVariable; > - UINT64 VariableSize; > - VARIABLE_STORE_HEADER *VariableStoreHeader; > - UINT64 CommonVariableTotalSize; > - UINT64 HwErrVariableTotalSize; > - > - CommonVariableTotalSize =3D 0; > - HwErrVariableTotalSize =3D 0; > - > - if(MaximumVariableStorageSize =3D=3D NULL || RemainingVariableStorageS= ize =3D=3D > NULL || MaximumVariableSize =3D=3D NULL || Attributes =3D=3D 0) { > - return EFI_INVALID_PARAMETER; > - } > - > - if((Attributes & (EFI_VARIABLE_NON_VOLATILE | > EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | > EFI_VARIABLE_HARDWARE_ERROR_RECORD)) =3D=3D 0) { > - // > - // Make sure the Attributes combination is supported by the platform= . > - // > - return EFI_UNSUPPORTED; > - } else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | > EFI_VARIABLE_BOOTSERVICE_ACCESS)) =3D=3D EFI_VARIABLE_RUNTIME_ACCESS) { > - // > - // Make sure if runtime bit is set, boot service bit is set also. > - // > - return EFI_INVALID_PARAMETER; > - } else if (EfiAtRuntime () && ((Attributes & EFI_VARIABLE_RUNTIME_ACCE= SS) > =3D=3D 0)) { > - // > - // Make sure RT Attribute is set if we are in Runtime phase. > - // > - return EFI_INVALID_PARAMETER; > - } else if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | > EFI_VARIABLE_HARDWARE_ERROR_RECORD)) =3D=3D > EFI_VARIABLE_HARDWARE_ERROR_RECORD) { > - // > - // Make sure Hw Attribute is set with NV. > - // > - return EFI_INVALID_PARAMETER; > - } else if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) !=3D= 0) { > - // > - // Not support authentiated variable write yet. > - // > - return EFI_UNSUPPORTED; > - } > - > - AcquireLockOnlyAtBootTime(&Global->VariableServicesLock); > - > - if((Attributes & EFI_VARIABLE_NON_VOLATILE) =3D=3D 0) { > - // > - // Query is Volatile related. > - // > - VariableStoreHeader =3D (VARIABLE_STORE_HEADER *) ((UINTN) Global- > >VolatileVariableBase); > - } else { > - // > - // Query is Non-Volatile related. > - // > - VariableStoreHeader =3D (VARIABLE_STORE_HEADER *) ((UINTN) Global- > >NonVolatileVariableBase); > - } > - > - // > - // Now let's fill *MaximumVariableStorageSize > *RemainingVariableStorageSize > - // with the storage size (excluding the storage header size) > - // > - *MaximumVariableStorageSize =3D VariableStoreHeader->Size - sizeof > (VARIABLE_STORE_HEADER); > - > - // > - // Harware error record variable needs larger size. > - // > - if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | > EFI_VARIABLE_HARDWARE_ERROR_RECORD)) =3D=3D > (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) > { > - *MaximumVariableStorageSize =3D PcdGet32 (PcdHwErrStorageSize); > - *MaximumVariableSize =3D PcdGet32 (PcdMaxHardwareErrorVariableSize) = - > sizeof (VARIABLE_HEADER); > - } else { > - if ((Attributes & EFI_VARIABLE_NON_VOLATILE) !=3D 0) { > - ASSERT (PcdGet32 (PcdHwErrStorageSize) < VariableStoreHeader->Size= ); > - *MaximumVariableStorageSize =3D VariableStoreHeader->Size - sizeof > (VARIABLE_STORE_HEADER) - PcdGet32 (PcdHwErrStorageSize); > - } > - > - // > - // Let *MaximumVariableSize be PcdGet32 (PcdMaxVariableSize) with th= e > exception of the variable header size. > - // > - *MaximumVariableSize =3D PcdGet32 (PcdMaxVariableSize) - sizeof > (VARIABLE_HEADER); > - } > - > - // > - // Point to the starting address of the variables. > - // > - Variable =3D (VARIABLE_HEADER *) HEADER_ALIGN (VariableStoreHeader + 1= ); > - > - // > - // Now walk through the related variable store. > - // > - while (Variable < GetEndPointer (VariableStoreHeader)) { > - NextVariable =3D GetNextVariablePtr(Variable); > - if (NextVariable =3D=3D NULL) { > - break; > - } > - VariableSize =3D (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Va= riable; > - > - if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) =3D= =3D > EFI_VARIABLE_HARDWARE_ERROR_RECORD) { > - HwErrVariableTotalSize +=3D VariableSize; > - } else { > - CommonVariableTotalSize +=3D VariableSize; > - } > - > - // > - // Go to the next one. > - // > - Variable =3D NextVariable; > - } > - > - if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) =3D=3D > EFI_VARIABLE_HARDWARE_ERROR_RECORD){ > - *RemainingVariableStorageSize =3D *MaximumVariableStorageSize - > HwErrVariableTotalSize; > - } else { > - *RemainingVariableStorageSize =3D *MaximumVariableStorageSize - > CommonVariableTotalSize; > - } > - > - if (*RemainingVariableStorageSize < sizeof (VARIABLE_HEADER)) { > - *MaximumVariableSize =3D 0; > - } else if ((*RemainingVariableStorageSize - sizeof (VARIABLE_HEADER)) = < > *MaximumVariableSize) { > - *MaximumVariableSize =3D *RemainingVariableStorageSize - sizeof > (VARIABLE_HEADER); > - } > - > - ReleaseLockOnlyAtBootTime (&Global->VariableServicesLock); > - return EFI_SUCCESS; > -} > - > -/** > - Initializes variable store area. > - > - This function allocates memory space for variable store area and initi= alizes its > attributes. > - > - @param VolatileStore Indicates if the variable store is volatile. > - > -**/ > -EFI_STATUS > -InitializeVariableStore ( > - IN BOOLEAN VolatileStore > - ) > -{ > - EFI_STATUS Status; > - VARIABLE_STORE_HEADER *VariableStore; > - BOOLEAN FullyInitializeStore; > - EFI_PHYSICAL_ADDRESS *VariableBase; > - UINTN *LastVariableOffset; > - VARIABLE_STORE_HEADER *VariableStoreHeader; > - VARIABLE_HEADER *Variable; > - VOID *VariableData; > - EFI_HOB_GUID_TYPE *GuidHob; > - > - FullyInitializeStore =3D TRUE; > - > - if (VolatileStore) { > - VariableBase =3D &mVariableModuleGlobal- > >VariableGlobal[Physical].VolatileVariableBase; > - LastVariableOffset =3D &mVariableModuleGlobal->VolatileLastVariableO= ffset; > - } else { > - VariableBase =3D &mVariableModuleGlobal- > >VariableGlobal[Physical].NonVolatileVariableBase; > - LastVariableOffset =3D &mVariableModuleGlobal- > >NonVolatileLastVariableOffset; > - } > - > - // > - // Note that in EdkII variable driver implementation, Hardware Error R= ecord > type variable > - // is stored with common variable in the same NV region. So the platfo= rm > integrator should > - // ensure that the value of PcdHwErrStorageSize is less than or equal = to the > value of > - // PcdVariableStoreSize. > - // > - ASSERT (PcdGet32 (PcdHwErrStorageSize) <=3D PcdGet32 (PcdVariableStore= Size)); > - > - // > - // Allocate memory for variable store. > - // > - if (VolatileStore || (PcdGet64 (PcdEmuVariableNvStoreReserved) =3D=3D = 0)) { > - VariableStore =3D (VARIABLE_STORE_HEADER *) AllocateRuntimePool > (PcdGet32 (PcdVariableStoreSize)); > - } else { > - // > - // A memory location has been reserved for the NV variable store. C= ertain > - // platforms may be able to preserve a memory range across system re= sets, > - // thereby providing better NV variable emulation. > - // > - VariableStore =3D > - (VARIABLE_STORE_HEADER *)(VOID*)(UINTN) > - PcdGet64 (PcdEmuVariableNvStoreReserved); > - if ( > - (VariableStore->Size =3D=3D PcdGet32 (PcdVariableStoreSize)) && > - (VariableStore->Format =3D=3D VARIABLE_STORE_FORMATTED) && > - (VariableStore->State =3D=3D VARIABLE_STORE_HEALTHY) > - ) { > - DEBUG(( > - EFI_D_INFO, > - "Variable Store reserved at %p appears to be valid\n", > - VariableStore > - )); > - FullyInitializeStore =3D FALSE; > - } > - } > - > - if (NULL =3D=3D VariableStore) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - if (FullyInitializeStore) { > - SetMem (VariableStore, PcdGet32 (PcdVariableStoreSize), 0xff); > - } > - > - // > - // Variable Specific Data > - // > - *VariableBase =3D (EFI_PHYSICAL_ADDRESS) (UINTN) VariableS= tore; > - InitializeLocationForLastVariableOffset (VariableStore, LastVariableOf= fset); > - > - CopyGuid (&VariableStore->Signature, &gEfiVariableGuid); > - VariableStore->Size =3D PcdGet32 (PcdVariableStoreSize); > - VariableStore->Format =3D VARIABLE_STORE_FORMATTED; > - VariableStore->State =3D VARIABLE_STORE_HEALTHY; > - VariableStore->Reserved =3D 0; > - VariableStore->Reserved1 =3D 0; > - > - if (!VolatileStore) { > - // > - // Get HOB variable store. > - // > - GuidHob =3D GetFirstGuidHob (&gEfiVariableGuid); > - if (GuidHob !=3D NULL) { > - VariableStoreHeader =3D (VARIABLE_STORE_HEADER *) > GET_GUID_HOB_DATA (GuidHob); > - if (CompareGuid (&VariableStoreHeader->Signature, &gEfiVariableGui= d) && > - (VariableStoreHeader->Format =3D=3D VARIABLE_STORE_FORMATTED) = && > - (VariableStoreHeader->State =3D=3D VARIABLE_STORE_HEALTHY) > - ) { > - DEBUG ((EFI_D_INFO, "HOB Variable Store appears to be valid.\n")= ); > - // > - // Flush the HOB variable to Emulation Variable storage. > - // > - for ( Variable =3D (VARIABLE_HEADER *) HEADER_ALIGN > (VariableStoreHeader + 1) > - ; (Variable < GetEndPointer (VariableStoreHeader) && (Variab= le !=3D NULL)) > - ; Variable =3D GetNextVariablePtr (Variable) > - ) { > - ASSERT (Variable->State =3D=3D VAR_ADDED); > - ASSERT ((Variable->Attributes & EFI_VARIABLE_NON_VOLATILE) != =3D 0); > - VariableData =3D GetVariableDataPtr (Variable); > - Status =3D EmuSetVariable ( > - GET_VARIABLE_NAME_PTR (Variable), > - &Variable->VendorGuid, > - Variable->Attributes, > - Variable->DataSize, > - VariableData, > - &mVariableModuleGlobal->VariableGlobal[Physical], > - &mVariableModuleGlobal->VolatileLastVariableOffset, > - &mVariableModuleGlobal->NonVolatileLastVariableOffs= et > - ); > - ASSERT_EFI_ERROR (Status); > - } > - } > - } > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Initializes variable store area for non-volatile and volatile variable= . > - > - This function allocates and initializes memory space for global contex= t of ESAL > - variable service and variable store area for non-volatile and volatile= variable. > - > - @param ImageHandle The Image handle of this driver. > - @param SystemTable The pointer of EFI_SYSTEM_TABLE. > - > - @retval EFI_SUCCESS Function successfully executed. > - @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource. > - > -**/ > -EFI_STATUS > -EFIAPI > -VariableCommonInitialize ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_STATUS Status; > - > - // > - // Allocate memory for mVariableModuleGlobal > - // > - mVariableModuleGlobal =3D (ESAL_VARIABLE_GLOBAL *) > AllocateRuntimeZeroPool ( > - sizeof (ESAL_VARIABL= E_GLOBAL) > - ); > - if (NULL =3D=3D mVariableModuleGlobal) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - EfiInitializeLock(&mVariableModuleGlobal- > >VariableGlobal[Physical].VariableServicesLock, TPL_NOTIFY); > - > - // > - // Intialize volatile variable store > - // > - Status =3D InitializeVariableStore (TRUE); > - if (EFI_ERROR (Status)) { > - FreePool(mVariableModuleGlobal); > - return Status; > - } > - // > - // Intialize non volatile variable store > - // > - Status =3D InitializeVariableStore (FALSE); > - > - return Status; > -} > diff --git > a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > e.inf > b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > e.inf > deleted file mode 100644 > index 12d52dd130e3..000000000000 > --- > a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > e.inf > +++ /dev/null > @@ -1,88 +0,0 @@ > -## @file > -# Emulation Variable for EFI_RUNTIME_SERVICES. > -# > -# This module installs variable arch protocol and variable write arch pr= otocol to > provide > -# four EFI_RUNTIME_SERVICES: SetVariable, GetVariable, > GetNextVariableName and QueryVariableInfo. > -# > -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> -# > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the= BSD > License > -# which accompanies this distribution. The full text of the license may= be found > at > -# http://opensource.org/licenses/bsd-license.php > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -# > -# > -## > - > -[Defines] > - INF_VERSION =3D 0x00010005 > - BASE_NAME =3D EmuVariableRuntimeDxe > - MODULE_UNI_FILE =3D EmuVariableRuntimeDxe.uni > - FILE_GUID =3D 02B01AD5-7E59-43e8-A6D8-238180613A5= A > - MODULE_TYPE =3D DXE_RUNTIME_DRIVER > - VERSION_STRING =3D 1.0 > - ENTRY_POINT =3D VariableServiceInitialize > - > -# > -# The following information is for reference only and not required by th= e build > tools. > -# > -# VALID_ARCHITECTURES =3D IA32 X64 EBC > -# > - > -[Sources] > - InitVariable.c > - EmuVariable.c > - Variable.h > - > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - > - > -[LibraryClasses] > - BaseLib > - UefiLib > - UefiBootServicesTableLib > - UefiDriverEntryPoint > - UefiRuntimeLib > - DebugLib > - MemoryAllocationLib > - BaseMemoryLib > - HobLib > - PcdLib > - > -[Protocols] > - gEfiVariableArchProtocolGuid ## PRODUCES > - gEfiVariableWriteArchProtocolGuid ## PRODUCES > - > -[Guids] > - gEfiEventVirtualAddressChangeGuid ## CONSUMES = ## Event > - ## SOMETIMES_CONSUMES ## Variable:L"PlatformLang" > - ## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" > - ## SOMETIMES_CONSUMES ## Variable:L"Lang" > - ## SOMETIMES_PRODUCES ## Variable:L"Lang" > - gEfiGlobalVariableGuid > - ## PRODUCES ## GUID # Signature of Variable store header > - ## CONSUMES ## GUID # Signature of Variable store header > - ## SOMETIMES_CONSUMES ## HOB > - ## SOMETIMES_PRODUCES ## SystemTable > - gEfiVariableGuid > - > -[Pcd] > - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved ## > CONSUMES > - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize ## > CONSUMES > - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize ## > CONSUMES > - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize ## > CONSUMES > - gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize ## > CONSUMES > - > -[FeaturePcd] > - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## > CONSUMES # statistic the information of variable. > - > -[Depex] > - TRUE > - > -[UserExtensions.TianoCore."ExtraFiles"] > - EmuVariableRuntimeDxeExtra.uni > diff --git > a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > e.uni > b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > e.uni > deleted file mode 100644 > index 6ad601812169..000000000000 > --- > a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > e.uni > +++ /dev/null > @@ -1,22 +0,0 @@ > -// /** @file > -// Emulation Variable for EFI_RUNTIME_SERVICES. > -// > -// This module installs variable arch protocol and variable write arch p= rotocol > to provide > -// four EFI_RUNTIME_SERVICES: SetVariable, GetVariable, > GetNextVariableName and QueryVariableInfo. > -// > -// Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved. > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the= BSD > License > -// which accompanies this distribution. The full text of the license may= be found > at > -// http://opensource.org/licenses/bsd-license.php > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > - > -#string STR_MODULE_ABSTRACT #language en-US "Emulation Varia= ble > for EFI_RUNTIME_SERVICES" > - > -#string STR_MODULE_DESCRIPTION #language en-US "This module > installs variable arch protocol and variable write arch protocol to provi= de four > EFI_RUNTIME_SERVICES: SetVariable, GetVariable, GetNextVariableName and > QueryVariableInfo." > - > diff --git > a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > eExtra.uni > b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > eExtra.uni > deleted file mode 100644 > index a5000373733e..000000000000 > --- > a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDx > eExtra.uni > +++ /dev/null > @@ -1,19 +0,0 @@ > -// /** @file > -// EmuVariableRuntimeDxe Localized Strings and Content > -// > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved. > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the= BSD > License > -// which accompanies this distribution. The full text of the license may= be found > at > -// http://opensource.org/licenses/bsd-license.php > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > -#string STR_PROPERTIES_MODULE_NAME > -#language en-US > -"Emulation Variable DXE Driver" > - > - > diff --git a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/InitVariable.c > b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/InitVariable.c > deleted file mode 100644 > index dac0464253d6..000000000000 > --- a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/InitVariable.c > +++ /dev/null > @@ -1,259 +0,0 @@ > -/** @file > - > - Implment all four UEFI runtime variable services and > - install variable architeture protocol. > - > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS > OR IMPLIED. > - > -**/ > - > -#include "Variable.h" > - > -EFI_EVENT mVirtualAddressChangeEvent =3D NULL; > - > -/** > - > - This code finds variable in storage blocks (Volatile or Non-Volatile). > - > - @param VariableName Name of Variable to be found. > - @param VendorGuid Variable vendor GUID. > - @param Attributes Attribute value of the variable foun= d. > - @param DataSize Size of Data found. If size is less = than the > - data, this value contains the requir= ed size. > - @param Data The buffer to return the contents of= the variable. > May be NULL > - with a zero DataSize in order to det= ermine the size buffer > needed. > - > - @return EFI_INVALID_PARAMETER Invalid parameter > - @return EFI_SUCCESS Find the specified variable > - @return EFI_NOT_FOUND Not found > - @return EFI_BUFFER_TO_SMALL DataSize is too small for the result > - > -**/ > -EFI_STATUS > -EFIAPI > -RuntimeServiceGetVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - OUT UINT32 *Attributes OPTIONAL, > - IN OUT UINTN *DataSize, > - OUT VOID *Data OPTIONAL > - ) > -{ > - return EmuGetVariable ( > - VariableName, > - VendorGuid, > - Attributes OPTIONAL, > - DataSize, > - Data, > - &mVariableModuleGlobal->VariableGlobal[Physical] > - ); > -} > - > -/** > - > - This code Finds the Next available variable. > - > - @param VariableNameSize The size of the VariableName buffer. Th= e size > must be large enough to fit input > - string supplied in VariableName buffer. > - @param VariableName On input, supplies the last VariableNam= e that > was returned by GetNextVariableName(). > - On output, returns the Null-terminated = Unicode string of the > current variable. > - @param VendorGuid On input, supplies the last VendorGuid = that was > returned by GetNextVariableName(). > - On output, returns the VendorGuid of th= e current variable. > - > - @retval EFI_SUCCESS The function completed successfully. > - @retval EFI_NOT_FOUND The next variable was not found. > - @retval EFI_BUFFER_TOO_SMALL The VariableNameSize is too small for t= he > result. > - VariableNameSize has been updated with = the size needed to > complete the request. > - @retval EFI_INVALID_PARAMETER VariableNameSize or VariableName or > VendorGuid is NULL. > - @retval EFI_INVALID_PARAMETER The input values of VariableName and > VendorGuid are not a name and > - GUID of an existing variable. > - @retval EFI_INVALID_PARAMETER Null-terminator is not found in the fir= st > VariableNameSize bytes of > - the input VariableName buffer. > - > -**/ > -EFI_STATUS > -EFIAPI > -RuntimeServiceGetNextVariableName ( > - IN OUT UINTN *VariableNameSize, > - IN OUT CHAR16 *VariableName, > - IN OUT EFI_GUID *VendorGuid > - ) > -{ > - return EmuGetNextVariableName ( > - VariableNameSize, > - VariableName, > - VendorGuid, > - &mVariableModuleGlobal->VariableGlobal[Physical] > - ); > -} > - > -/** > - > - This code sets variable in storage blocks (Volatile or Non-Volatile). > - > - @param VariableName Name of Variable to be found > - @param VendorGuid Variable vendor GUID > - @param Attributes Attribute value of the variabl= e found > - @param DataSize Size of Data found. If size is= less than the > - data, this value contains the = required size. > - @param Data Data pointer > - > - @return EFI_INVALID_PARAMETER Invalid parameter > - @return EFI_SUCCESS Set successfully > - @return EFI_OUT_OF_RESOURCES Resource not enough to set var= iable > - @return EFI_NOT_FOUND Not found > - @return EFI_WRITE_PROTECTED Variable is read-only > - > -**/ > -EFI_STATUS > -EFIAPI > -RuntimeServiceSetVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - IN UINT32 Attributes, > - IN UINTN DataSize, > - IN VOID *Data > - ) > -{ > - return EmuSetVariable ( > - VariableName, > - VendorGuid, > - Attributes, > - DataSize, > - Data, > - &mVariableModuleGlobal->VariableGlobal[Physical], > - &mVariableModuleGlobal->VolatileLastVariableOffset, > - &mVariableModuleGlobal->NonVolatileLastVariableOffset > - ); > -} > - > -/** > - > - This code returns information about the EFI variables. > - > - @param Attributes Attributes bitmask to specify th= e type of > variables > - on which to return information. > - @param MaximumVariableStorageSize Pointer to the maximum size of t= he > storage space available > - for the EFI variables associated= with the attributes > specified. > - @param RemainingVariableStorageSize Pointer to the remaining size of= the > storage space available > - for EFI variables associated wit= h the attributes specified. > - @param MaximumVariableSize Pointer to the maximum size of a= n > individual EFI variables > - associated with the attributes s= pecified. > - > - @return EFI_INVALID_PARAMETER An invalid combination of attrib= ute > bits was supplied. > - @return EFI_SUCCESS Query successfully. > - @return EFI_UNSUPPORTED The attribute is not supported o= n this > platform. > - > -**/ > -EFI_STATUS > -EFIAPI > -RuntimeServiceQueryVariableInfo ( > - IN UINT32 Attributes, > - OUT UINT64 *MaximumVariableStorageSize, > - OUT UINT64 *RemainingVariableStorageSize, > - OUT UINT64 *MaximumVariableSize > - ) > -{ > - return EmuQueryVariableInfo ( > - Attributes, > - MaximumVariableStorageSize, > - RemainingVariableStorageSize, > - MaximumVariableSize, > - &mVariableModuleGlobal->VariableGlobal[Physical] > - ); > -} > - > -/** > - Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. > - > - This is a notification function registered on > EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. > - It convers pointer to new virtual address. > - > - @param Event Event whose notification function is being invoke= d. > - @param Context Pointer to the notification function's context. > - > -**/ > -VOID > -EFIAPI > -VariableClassAddressChangeEvent ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal- > >PlatformLangCodes); > - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->LangCodes); > - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLang= ); > - EfiConvertPointer ( > - 0x0, > - (VOID **) &mVariableModuleGlobal- > >VariableGlobal[Physical].NonVolatileVariableBase > - ); > - EfiConvertPointer ( > - 0x0, > - (VOID **) &mVariableModuleGlobal- > >VariableGlobal[Physical].VolatileVariableBase > - ); > - EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal); > -} > - > -/** > - EmuVariable Driver main entry point. The Variable driver places the 4 = EFI > - runtime services in the EFI System Table and installs arch protocols > - for variable read and write services being available. It also register= s > - notification function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. > - > - @param[in] ImageHandle The firmware allocated handle for the EFI im= age. > - @param[in] SystemTable A pointer to the EFI System Table. > - > - @retval EFI_SUCCESS Variable service successfully initialized. > - > -**/ > -EFI_STATUS > -EFIAPI > -VariableServiceInitialize ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_HANDLE NewHandle; > - EFI_STATUS Status; > - > - Status =3D VariableCommonInitialize (ImageHandle, SystemTable); > - ASSERT_EFI_ERROR (Status); > - > - SystemTable->RuntimeServices->GetVariable =3D > RuntimeServiceGetVariable; > - SystemTable->RuntimeServices->GetNextVariableName =3D > RuntimeServiceGetNextVariableName; > - SystemTable->RuntimeServices->SetVariable =3D RuntimeServiceSe= tVariable; > - SystemTable->RuntimeServices->QueryVariableInfo =3D > RuntimeServiceQueryVariableInfo; > - > - // > - // Now install the Variable Runtime Architectural Protocol on a new ha= ndle > - // > - NewHandle =3D NULL; > - Status =3D gBS->InstallMultipleProtocolInterfaces ( > - &NewHandle, > - &gEfiVariableArchProtocolGuid, > - NULL, > - &gEfiVariableWriteArchProtocolGuid, > - NULL, > - NULL > - ); > - ASSERT_EFI_ERROR (Status); > - > - Status =3D gBS->CreateEventEx ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - VariableClassAddressChangeEvent, > - NULL, > - &gEfiEventVirtualAddressChangeGuid, > - &mVirtualAddressChangeEvent > - ); > - ASSERT_EFI_ERROR (Status); > - > - return EFI_SUCCESS; > -} > diff --git a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/Variable.h > b/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/Variable.h > deleted file mode 100644 > index 2851582d0dc0..000000000000 > --- a/MdeModulePkg/Universal/Variable/EmuRuntimeDxe/Variable.h > +++ /dev/null > @@ -1,277 +0,0 @@ > -/** @file > - > - The internal header file includes the common header files, defines > - internal structure and functions used by EmuVariable module. > - > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS > OR IMPLIED. > - > -**/ > - > -#ifndef _VARIABLE_H_ > -#define _VARIABLE_H_ > - > -#include > - > -#include > -#include > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include > - > -#define GET_VARIABLE_NAME_PTR(a) (CHAR16 *) ((UINTN) (a) + sizeof > (VARIABLE_HEADER)) > - > -/// > -/// The size of a 3 character ISO639 language code. > -/// > -#define ISO_639_2_ENTRY_SIZE 3 > - > -typedef enum { > - Physical, > - Virtual > -} VARIABLE_POINTER_TYPE; > - > -typedef struct { > - VARIABLE_HEADER *CurrPtr; > - VARIABLE_HEADER *EndPtr; > - VARIABLE_HEADER *StartPtr; > - BOOLEAN Volatile; > -} VARIABLE_POINTER_TRACK; > - > -typedef struct { > - EFI_PHYSICAL_ADDRESS VolatileVariableBase; > - EFI_PHYSICAL_ADDRESS NonVolatileVariableBase; > - EFI_LOCK VariableServicesLock; > -} VARIABLE_GLOBAL; > - > -typedef struct { > - VARIABLE_GLOBAL VariableGlobal[2]; > - UINTN VolatileLastVariableOffset; > - UINTN NonVolatileLastVariableOffset; > - UINTN CommonVariableTotalSize; > - UINTN HwErrVariableTotalSize; > - CHAR8 *PlatformLangCodes; > - CHAR8 *LangCodes; > - CHAR8 *PlatformLang; > - CHAR8 Lang[ISO_639_2_ENTRY_SIZE + 1]; > -} ESAL_VARIABLE_GLOBAL; > - > -/// > -/// Don't use module globals after the SetVirtualAddress map is signaled > -/// > -extern ESAL_VARIABLE_GLOBAL *mVariableModuleGlobal; > - > -/** > - Initializes variable store area for non-volatile and volatile variable= . > - > - This function allocates and initializes memory space for global contex= t of ESAL > - variable service and variable store area for non-volatile and volatile= variable. > - > - @param ImageHandle The Image handle of this driver. > - @param SystemTable The pointer of EFI_SYSTEM_TABLE. > - > - @retval EFI_SUCCESS Function successfully executed. > - @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource. > - > -**/ > -EFI_STATUS > -EFIAPI > -VariableCommonInitialize ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ); > - > -/** > - Entry point of EmuVariable service module. > - > - This function is the entry point of EmuVariable service module. > - It registers all interfaces of Variable Services, initializes > - variable store for non-volatile and volatile variables, and registers > - notification function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. > - > - @param ImageHandle The Image handle of this driver. > - @param SystemTable The pointer of EFI_SYSTEM_TABLE. > - > - @retval EFI_SUCCESS Variable service successfully initialized. > - > -**/ > -EFI_STATUS > -EFIAPI > -VariableServiceInitialize ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ); > - > -/** > - Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. > - > - This is a notification function registered on > EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. > - It convers pointer to new virtual address. > - > - @param Event Event whose notification function is being invoke= d. > - @param Context Pointer to the notification function's context. > - > -**/ > -VOID > -EFIAPI > -VariableClassAddressChangeEvent ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ); > - > -/** > - This code finds variable in storage blocks (Volatile or Non-Volatile). > - > - @param VariableName A Null-terminated Unicode string that i= s the > name of > - the vendor's variable. > - @param VendorGuid A unique identifier for the vendor. > - @param Attributes If not NULL, a pointer to the memory lo= cation to > return the > - attributes bitmask for the variable. > - @param DataSize Size of Data found. If size is less tha= n the > - data, this value contains the required = size. > - @param Data On input, the size in bytes of the retu= rn Data buffer. > - On output, the size of data returned in= Data. > - @param Global Pointer to VARIABLE_GLOBAL structure > - > - @retval EFI_SUCCESS The function completed successfully. > - @retval EFI_NOT_FOUND The variable was not found. > - @retval EFI_BUFFER_TOO_SMALL DataSize is too small for the result. > DataSize has > - been updated with the size needed to co= mplete the request. > - @retval EFI_INVALID_PARAMETER VariableName or VendorGuid or DataSize > is NULL. > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuGetVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - OUT UINT32 *Attributes OPTIONAL, > - IN OUT UINTN *DataSize, > - OUT VOID *Data, > - IN VARIABLE_GLOBAL *Global > - ); > - > -/** > - > - This code finds the next available variable. > - > - @param VariableNameSize The size of the VariableName buffer. Th= e size > must be large enough to fit input > - string supplied in VariableName buffer. > - @param VariableName On input, supplies the last VariableNam= e that > was returned by GetNextVariableName(). > - On output, returns the Null-terminated = Unicode string of the > current variable. > - @param VendorGuid On input, supplies the last VendorGuid = that was > returned by GetNextVariableName(). > - On output, returns the VendorGuid of th= e current variable. > - @param Global Pointer to VARIABLE_GLOBAL structure. > - > - @retval EFI_SUCCESS The function completed successfully. > - @retval EFI_NOT_FOUND The next variable was not found. > - @retval EFI_BUFFER_TOO_SMALL The VariableNameSize is too small for t= he > result. > - VariableNameSize has been updated with = the size needed to > complete the request. > - @retval EFI_INVALID_PARAMETER VariableNameSize or VariableName or > VendorGuid is NULL. > - @retval EFI_INVALID_PARAMETER The input values of VariableName and > VendorGuid are not a name and > - GUID of an existing variable. > - @retval EFI_INVALID_PARAMETER Null-terminator is not found in the fir= st > VariableNameSize bytes of > - the input VariableName buffer. > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuGetNextVariableName ( > - IN OUT UINTN *VariableNameSize, > - IN OUT CHAR16 *VariableName, > - IN OUT EFI_GUID *VendorGuid, > - IN VARIABLE_GLOBAL *Global > - ); > - > -/** > - > - This code sets variable in storage blocks (Volatile or Non-Volatile). > - > - @param VariableName A Null-terminated Unicode string that i= s the > name of the vendor's > - variable. Each VariableName is unique = for each > - VendorGuid. VariableName must contain = 1 or more > - Unicode characters. If VariableName is= an empty Unicode > - string, then EFI_INVALID_PARAMETER is r= eturned. > - @param VendorGuid A unique identifier for the vendor > - @param Attributes Attributes bitmask to set for the varia= ble > - @param DataSize The size in bytes of the Data buffer. = A size of zero > causes the > - variable to be deleted. > - @param Data The contents for the variable > - @param Global Pointer to VARIABLE_GLOBAL structure > - @param VolatileOffset The offset of last volatile variable > - @param NonVolatileOffset The offset of last non-volatile variabl= e > - > - @retval EFI_SUCCESS The firmware has successfully stored th= e variable > and its data as > - defined by the Attributes. > - @retval EFI_INVALID_PARAMETER An invalid combination of attribute bit= s > was supplied, or the > - DataSize exceeds the maximum allowed, o= r VariableName is > an empty > - Unicode string, or VendorGuid is NULL. > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > the variable and its data. > - @retval EFI_DEVICE_ERROR The variable could not be saved due to = a > hardware failure. > - @retval EFI_WRITE_PROTECTED The variable in question is read-only o= r > cannot be deleted. > - @retval EFI_NOT_FOUND The variable trying to be updated or de= leted > was not found. > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuSetVariable ( > - IN CHAR16 *VariableName, > - IN EFI_GUID *VendorGuid, > - IN UINT32 Attributes, > - IN UINTN DataSize, > - IN VOID *Data, > - IN VARIABLE_GLOBAL *Global, > - IN UINTN *VolatileOffset, > - IN UINTN *NonVolatileOffset > - ); > - > -/** > - > - This code returns information about the EFI variables. > - > - @param Attributes Attributes bitmask to specify the= type of > variables > - on which to return information. > - @param MaximumVariableStorageSize On output the maximum size of the > storage space available for > - the EFI variables associated with= the attributes specified. > - @param RemainingVariableStorageSize Returns the remaining size of the > storage space available for EFI > - variables associated with the att= ributes specified. > - @param MaximumVariableSize Returns the maximum size of an > individual EFI variable > - associated with the attributes sp= ecified. > - @param Global Pointer to VARIABLE_GLOBAL struct= ure. > - > - @retval EFI_SUCCESS Valid answer returned. > - @retval EFI_INVALID_PARAMETER An invalid combination of attribu= te bits > was supplied > - @retval EFI_UNSUPPORTED The attribute is not supported on= this > platform, and the > - MaximumVariableStorageSize, > RemainingVariableStorageSize, > - MaximumVariableSize are undefined= . > - > -**/ > -EFI_STATUS > -EFIAPI > -EmuQueryVariableInfo ( > - IN UINT32 Attributes, > - OUT UINT64 *MaximumVariableStorageSize, > - OUT UINT64 *RemainingVariableStorageSize, > - OUT UINT64 *MaximumVariableSize, > - IN VARIABLE_GLOBAL *Global > - ); > - > -#endif > -- > 2.7.0.windows.1