]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
MdeModulePkg/VariableSmmRuntimeDxe: switch to MM communicate 2
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / Variable.h
index cd0d9568158a1d59594eba7f484db5b08d2036e9..0b2bb6ae66481e7bb5236f9fc32632d1818e7e7c 100644 (file)
@@ -2,14 +2,8 @@
   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
@@ -44,11 +38,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #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
@@ -64,6 +64,21 @@ typedef enum {
   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
@@ -79,13 +94,15 @@ typedef struct {
 } 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
@@ -100,6 +117,7 @@ typedef struct {
   UINTN           HwErrVariableTotalSize;\r
   UINTN           MaxVariableSize;\r
   UINTN           MaxAuthVariableSize;\r
+  UINTN           MaxVolatileVariableSize;\r
   UINTN           ScratchBufferSize;\r
   CHAR8           *PlatformLangCodes;\r
   CHAR8           *LangCodes;\r
@@ -177,89 +195,6 @@ FindVariable (
   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
@@ -449,18 +384,18 @@ ReclaimForOS(
   );\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
@@ -533,28 +468,6 @@ VariableServiceGetVariable (
   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
@@ -562,14 +475,22 @@ VariableServiceGetNextVariableInternal (
   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
@@ -768,9 +689,14 @@ InitializeVariableQuota (
   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