The internal header file includes the common header files, defines\r
internal structure and functions used by Variable modules.\r
\r
-Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include <Guid/FaultTolerantWrite.h>\r
#include <Guid/VarErrorFlag.h>\r
\r
+#include "PrivilegePolymorphic.h"\r
+\r
+#define NV_STORAGE_VARIABLE_BASE (EFI_PHYSICAL_ADDRESS) \\r
+ (PcdGet64 (PcdFlashNvStorageVariableBase64) != 0 ? \\r
+ PcdGet64 (PcdFlashNvStorageVariableBase64) : \\r
+ PcdGet32 (PcdFlashNvStorageVariableBase))\r
+\r
#define EFI_VARIABLE_ATTRIBUTES_MASK (EFI_VARIABLE_NON_VOLATILE | \\r
EFI_VARIABLE_BOOTSERVICE_ACCESS | \\r
EFI_VARIABLE_RUNTIME_ACCESS | \\r
EFI_VARIABLE_HARDWARE_ERROR_RECORD | \\r
- EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \\r
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \\r
EFI_VARIABLE_APPEND_WRITE)\r
\r
VariableStoreTypeMax\r
} VARIABLE_STORE_TYPE;\r
\r
+typedef struct {\r
+ UINT32 PendingUpdateOffset;\r
+ UINT32 PendingUpdateLength;\r
+ VARIABLE_STORE_HEADER *Store;\r
+} VARIABLE_RUNTIME_CACHE;\r
+\r
+typedef struct {\r
+ BOOLEAN *ReadLock;\r
+ BOOLEAN *PendingUpdate;\r
+ BOOLEAN *HobFlushComplete;\r
+ VARIABLE_RUNTIME_CACHE VariableRuntimeHobCache;\r
+ VARIABLE_RUNTIME_CACHE VariableRuntimeNvCache;\r
+ VARIABLE_RUNTIME_CACHE VariableRuntimeVolatileCache;\r
+} VARIABLE_RUNTIME_CACHE_CONTEXT;\r
+\r
typedef struct {\r
VARIABLE_HEADER *CurrPtr;\r
//\r
} VARIABLE_POINTER_TRACK;\r
\r
typedef struct {\r
- EFI_PHYSICAL_ADDRESS HobVariableBase;\r
- EFI_PHYSICAL_ADDRESS VolatileVariableBase;\r
- EFI_PHYSICAL_ADDRESS NonVolatileVariableBase;\r
- EFI_LOCK VariableServicesLock;\r
- UINT32 ReentrantState;\r
- BOOLEAN AuthFormat;\r
- BOOLEAN AuthSupport;\r
+ EFI_PHYSICAL_ADDRESS HobVariableBase;\r
+ EFI_PHYSICAL_ADDRESS VolatileVariableBase;\r
+ EFI_PHYSICAL_ADDRESS NonVolatileVariableBase;\r
+ VARIABLE_RUNTIME_CACHE_CONTEXT VariableRuntimeCacheContext;\r
+ EFI_LOCK VariableServicesLock;\r
+ UINT32 ReentrantState;\r
+ BOOLEAN AuthFormat;\r
+ BOOLEAN AuthSupport;\r
+ BOOLEAN EmuNvMode;\r
} VARIABLE_GLOBAL;\r
\r
typedef struct {\r
UINTN HwErrVariableTotalSize;\r
UINTN MaxVariableSize;\r
UINTN MaxAuthVariableSize;\r
+ UINTN MaxVolatileVariableSize;\r
UINTN ScratchBufferSize;\r
CHAR8 *PlatformLangCodes;\r
CHAR8 *LangCodes;\r
IN BOOLEAN IgnoreRtCheck\r
);\r
\r
-/**\r
-\r
- Gets the pointer to the end of the variable storage area.\r
-\r
- This function gets pointer to the end of the variable storage\r
- area, according to the input variable store header.\r
-\r
- @param VarStoreHeader Pointer to the Variable Store Header.\r
-\r
- @return Pointer to the end of the variable storage area.\r
-\r
-**/\r
-VARIABLE_HEADER *\r
-GetEndPointer (\r
- IN VARIABLE_STORE_HEADER *VarStoreHeader\r
- );\r
-\r
-/**\r
- This code gets the size of variable header.\r
-\r
- @return Size of variable header in bytes in type UINTN.\r
-\r
-**/\r
-UINTN\r
-GetVariableHeaderSize (\r
- VOID\r
- );\r
-\r
-/**\r
-\r
- This code gets the pointer to the variable name.\r
-\r
- @param Variable Pointer to the Variable Header.\r
-\r
- @return Pointer to Variable Name which is Unicode encoding.\r
-\r
-**/\r
-CHAR16 *\r
-GetVariableNamePtr (\r
- IN VARIABLE_HEADER *Variable\r
- );\r
-\r
-/**\r
- This code gets the pointer to the variable guid.\r
-\r
- @param Variable Pointer to the Variable Header.\r
-\r
- @return A EFI_GUID* pointer to Vendor Guid.\r
-\r
-**/\r
-EFI_GUID *\r
-GetVendorGuidPtr (\r
- IN VARIABLE_HEADER *Variable\r
- );\r
-\r
-/**\r
-\r
- This code gets the pointer to the variable data.\r
-\r
- @param Variable Pointer to the Variable Header.\r
-\r
- @return Pointer to Variable Data.\r
-\r
-**/\r
-UINT8 *\r
-GetVariableDataPtr (\r
- IN VARIABLE_HEADER *Variable\r
- );\r
-\r
-/**\r
-\r
- This code gets the size of variable data.\r
-\r
- @param Variable Pointer to the Variable Header.\r
-\r
- @return Size of variable in bytes.\r
-\r
-**/\r
-UINTN\r
-DataSizeOfVariable (\r
- IN VARIABLE_HEADER *Variable\r
- );\r
-\r
/**\r
This function is to check if the remaining variable space is enough to set\r
all Variables from argument list successfully. The purpose of the check\r
);\r
\r
/**\r
- Get non-volatile maximum variable size.\r
+ Get maximum variable size, covering both non-volatile and volatile variables.\r
\r
- @return Non-volatile maximum variable size.\r
+ @return Maximum variable size.\r
\r
**/\r
UINTN\r
-GetNonVolatileMaxVariableSize (\r
+GetMaxVariableSize (\r
VOID\r
);\r
\r
/**\r
- Initializes variable write service after FVB was ready.\r
+ Initializes variable write service.\r
\r
@retval EFI_SUCCESS Function successfully executed.\r
@retval Others Fail to initialize the variable service.\r
OUT VOID *Data OPTIONAL\r
);\r
\r
-/**\r
- This code Finds the Next available variable.\r
-\r
- Caution: This function may receive untrusted input.\r
- This function may be invoked in SMM mode. This function will do basic validation, before parse the data.\r
-\r
- @param[in] VariableName Pointer to variable name.\r
- @param[in] VendorGuid Variable Vendor Guid.\r
- @param[out] VariablePtr Pointer to variable header address.\r
-\r
- @return EFI_SUCCESS Find the specified variable.\r
- @return EFI_NOT_FOUND Not found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-VariableServiceGetNextVariableInternal (\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid,\r
- OUT VARIABLE_HEADER **VariablePtr\r
- );\r
-\r
/**\r
\r
This code Finds the Next available variable.\r
Caution: This function may receive untrusted input.\r
This function may be invoked in SMM mode. This function will do basic validation, before parse the data.\r
\r
- @param VariableNameSize Size of the variable name.\r
+ @param VariableNameSize The size of the VariableName buffer. The size must be large\r
+ enough to fit input string supplied in VariableName buffer.\r
@param VariableName Pointer to variable name.\r
@param VendorGuid Variable Vendor Guid.\r
\r
- @return EFI_INVALID_PARAMETER Invalid parameter.\r
- @return EFI_SUCCESS Find the specified variable.\r
- @return EFI_NOT_FOUND Not found.\r
- @return EFI_BUFFER_TO_SMALL DataSize is too small for the result.\r
+ @retval EFI_SUCCESS The function completed successfully.\r
+ @retval EFI_NOT_FOUND The next variable was not found.\r
+ @retval EFI_BUFFER_TOO_SMALL The VariableNameSize is too small for the result.\r
+ VariableNameSize has been updated with the size needed to complete the request.\r
+ @retval EFI_INVALID_PARAMETER VariableNameSize is NULL.\r
+ @retval EFI_INVALID_PARAMETER VariableName is NULL.\r
+ @retval EFI_INVALID_PARAMETER VendorGuid is NULL.\r
+ @retval EFI_INVALID_PARAMETER The input values of VariableName and VendorGuid are not a name and\r
+ GUID of an existing variable.\r
+ @retval EFI_INVALID_PARAMETER Null-terminator is not found in the first VariableNameSize bytes of\r
+ the input VariableName buffer.\r
\r
**/\r
EFI_STATUS\r
VOID\r
);\r
\r
-extern VARIABLE_MODULE_GLOBAL *mVariableModuleGlobal;\r
+extern VARIABLE_MODULE_GLOBAL *mVariableModuleGlobal;\r
+extern EFI_FIRMWARE_VOLUME_HEADER *mNvFvHeaderCache;\r
+extern VARIABLE_STORE_HEADER *mNvVariableCache;\r
+extern VARIABLE_INFO_ENTRY *gVariableInfo;\r
+extern BOOLEAN mEndOfDxe;\r
+extern VAR_CHECK_REQUEST_SOURCE mRequestSource;\r
\r
-extern AUTH_VAR_LIB_CONTEXT_OUT mAuthContextOut;\r
+extern AUTH_VAR_LIB_CONTEXT_OUT mAuthContextOut;\r
\r
/**\r
Finds variable in storage blocks of volatile and non-volatile storage areas.\r