]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/Variable: Parameterize GetNextVariableInternal () stores
authorMichael Kubacki <michael.a.kubacki@intel.com>
Fri, 27 Sep 2019 21:41:47 +0000 (14:41 -0700)
committerMichael Kubacki <michael.a.kubacki@intel.com>
Wed, 6 Nov 2019 05:55:53 +0000 (21:55 -0800)
The majority of logic related to GetNextVariableName () is currently
implemented in VariableServiceGetNextVariableInternal (). The list
of variable stores to search for the given variable name and variable
GUID is defined in the function body. This change adds a new parameter
so that the caller must pass in the list of variable stores to be used
in the variable search.

Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Michael Kubacki <michael.a.kubacki@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h

index 76536308e6acaa9686e65b690d196dc24868fd0d..70af86db242bf9fb1827be67c3e507c5eba5e1eb 100644 (file)
@@ -2358,6 +2358,7 @@ VariableServiceGetNextVariableName (
   UINTN                   MaxLen;\r
   UINTN                   VarNameSize;\r
   VARIABLE_HEADER         *VariablePtr;\r
+  VARIABLE_STORE_HEADER   *VariableStoreHeader[VariableStoreTypeMax];\r
 \r
   if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -2377,7 +2378,16 @@ VariableServiceGetNextVariableName (
 \r
   AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
 \r
-  Status = VariableServiceGetNextVariableInternal (VariableName, VendorGuid, &VariablePtr);\r
+  //\r
+  // 0: Volatile, 1: HOB, 2: Non-Volatile.\r
+  // The index and attributes mapping must be kept in this order as FindVariable\r
+  // makes use of this mapping to implement search algorithm.\r
+  //\r
+  VariableStoreHeader[VariableStoreTypeVolatile] = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.VolatileVariableBase;\r
+  VariableStoreHeader[VariableStoreTypeHob]      = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase;\r
+  VariableStoreHeader[VariableStoreTypeNv]       = mNvVariableCache;\r
+\r
+  Status = VariableServiceGetNextVariableInternal (VariableName, VendorGuid, VariableStoreHeader, &VariablePtr);\r
   if (!EFI_ERROR (Status)) {\r
     VarNameSize = NameSizeOfVariable (VariablePtr);\r
     ASSERT (VarNameSize != 0);\r
index dc78f68fa9e05e9580ab043a0f58d866c3428666..c787ddba5bbf7b1216a8f295cb14f9813eae1afd 100644 (file)
@@ -98,10 +98,16 @@ VariableExLibFindNextVariable (
   EFI_STATUS                    Status;\r
   VARIABLE_HEADER               *VariablePtr;\r
   AUTHENTICATED_VARIABLE_HEADER *AuthVariablePtr;\r
+  VARIABLE_STORE_HEADER         *VariableStoreHeader[VariableStoreTypeMax];\r
+\r
+  VariableStoreHeader[VariableStoreTypeVolatile] = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.VolatileVariableBase;\r
+  VariableStoreHeader[VariableStoreTypeHob]      = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase;\r
+  VariableStoreHeader[VariableStoreTypeNv]       = mNvVariableCache;\r
 \r
   Status = VariableServiceGetNextVariableInternal (\r
              VariableName,\r
              VendorGuid,\r
+             VariableStoreHeader,\r
              &VariablePtr\r
              );\r
   if (EFI_ERROR (Status)) {\r
index 5698a1a5e42f487ea6a6165e853035fe6a5d24e9..d6bb916e68e73b61737107df09f710350375be42 100644 (file)
@@ -476,14 +476,16 @@ FindVariableEx (
 }\r
 \r
 /**\r
-  This code Finds the Next available variable.\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
+  @param[in]  VariableName      Pointer to variable name.\r
+  @param[in]  VendorGuid        Variable Vendor Guid.\r
+  @param[in]  VariableStoreList A list of variable stores that should be used to get the next variable.\r
+                                The maximum number of entries is the max value of VARIABLE_STORE_TYPE.\r
+  @param[out] VariablePtr       Pointer to variable header address.\r
 \r
   @retval EFI_SUCCESS           The function completed successfully.\r
   @retval EFI_NOT_FOUND         The next variable was not found.\r
@@ -497,26 +499,47 @@ EFIAPI
 VariableServiceGetNextVariableInternal (\r
   IN  CHAR16                *VariableName,\r
   IN  EFI_GUID              *VendorGuid,\r
+  IN  VARIABLE_STORE_HEADER **VariableStoreList,\r
   OUT VARIABLE_HEADER       **VariablePtr\r
   )\r
 {\r
-  VARIABLE_STORE_TYPE     Type;\r
+  EFI_STATUS              Status;\r
+  VARIABLE_STORE_TYPE     StoreType;\r
   VARIABLE_POINTER_TRACK  Variable;\r
   VARIABLE_POINTER_TRACK  VariableInHob;\r
   VARIABLE_POINTER_TRACK  VariablePtrTrack;\r
-  EFI_STATUS              Status;\r
-  VARIABLE_STORE_HEADER   *VariableStoreHeader[VariableStoreTypeMax];\r
 \r
-  Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
+  Status = EFI_NOT_FOUND;\r
+\r
+  if (VariableStoreList == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  // Check if the variable exists in the given variable store list\r
+  for (StoreType = (VARIABLE_STORE_TYPE) 0; StoreType < VariableStoreTypeMax; StoreType++) {\r
+    if (VariableStoreList[StoreType] == NULL) {\r
+      continue;\r
+    }\r
+\r
+    Variable.StartPtr = GetStartPointer (VariableStoreList[StoreType]);\r
+    Variable.EndPtr   = GetEndPointer   (VariableStoreList[StoreType]);\r
+    Variable.Volatile = (BOOLEAN) (StoreType == VariableStoreTypeVolatile);\r
+\r
+    Status = FindVariableEx (VariableName, VendorGuid, FALSE, &Variable);\r
+    if (!EFI_ERROR (Status)) {\r
+      break;\r
+    }\r
+  }\r
+\r
   if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
     //\r
-    // For VariableName is an empty string, FindVariable() will try to find and return\r
-    // the first qualified variable, and if FindVariable() returns error (EFI_NOT_FOUND)\r
+    // For VariableName is an empty string, FindVariableEx() will try to find and return\r
+    // the first qualified variable, and if FindVariableEx() returns error (EFI_NOT_FOUND)\r
     // as no any variable is found, still go to return the error (EFI_NOT_FOUND).\r
     //\r
     if (VariableName[0] != 0) {\r
       //\r
-      // For VariableName is not an empty string, and FindVariable() returns error as\r
+      // For VariableName is not an empty string, and FindVariableEx() returns error as\r
       // VariableName and VendorGuid are not a name and GUID of an existing variable,\r
       // there is no way to get next variable, follow spec to return EFI_INVALID_PARAMETER.\r
       //\r
@@ -527,39 +550,30 @@ VariableServiceGetNextVariableInternal (
 \r
   if (VariableName[0] != 0) {\r
     //\r
-    // If variable name is not NULL, get next variable.\r
+    // If variable name is not empty, get next variable.\r
     //\r
     Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);\r
   }\r
 \r
-  //\r
-  // 0: Volatile, 1: HOB, 2: Non-Volatile.\r
-  // The index and attributes mapping must be kept in this order as FindVariable\r
-  // makes use of this mapping to implement search algorithm.\r
-  //\r
-  VariableStoreHeader[VariableStoreTypeVolatile] = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.VolatileVariableBase;\r
-  VariableStoreHeader[VariableStoreTypeHob]      = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase;\r
-  VariableStoreHeader[VariableStoreTypeNv]       = mNvVariableCache;\r
-\r
   while (TRUE) {\r
     //\r
-    // Switch from Volatile to HOB, to Non-Volatile.\r
+    // Switch to the next variable store if needed\r
     //\r
     while (!IsValidVariableHeader (Variable.CurrPtr, Variable.EndPtr)) {\r
       //\r
       // Find current storage index\r
       //\r
-      for (Type = (VARIABLE_STORE_TYPE) 0; Type < VariableStoreTypeMax; Type++) {\r
-        if ((VariableStoreHeader[Type] != NULL) && (Variable.StartPtr == GetStartPointer (VariableStoreHeader[Type]))) {\r
+      for (StoreType = (VARIABLE_STORE_TYPE) 0; StoreType < VariableStoreTypeMax; StoreType++) {\r
+        if ((VariableStoreList[StoreType] != NULL) && (Variable.StartPtr == GetStartPointer (VariableStoreList[StoreType]))) {\r
           break;\r
         }\r
       }\r
-      ASSERT (Type < VariableStoreTypeMax);\r
+      ASSERT (StoreType < VariableStoreTypeMax);\r
       //\r
       // Switch to next storage\r
       //\r
-      for (Type++; Type < VariableStoreTypeMax; Type++) {\r
-        if (VariableStoreHeader[Type] != NULL) {\r
+      for (StoreType++; StoreType < VariableStoreTypeMax; StoreType++) {\r
+        if (VariableStoreList[StoreType] != NULL) {\r
           break;\r
         }\r
       }\r
@@ -568,12 +582,12 @@ VariableServiceGetNextVariableInternal (
       // 1. current storage is the last one, or\r
       // 2. no further storage\r
       //\r
-      if (Type == VariableStoreTypeMax) {\r
+      if (StoreType == VariableStoreTypeMax) {\r
         Status = EFI_NOT_FOUND;\r
         goto Done;\r
       }\r
-      Variable.StartPtr = GetStartPointer (VariableStoreHeader[Type]);\r
-      Variable.EndPtr   = GetEndPointer   (VariableStoreHeader[Type]);\r
+      Variable.StartPtr = GetStartPointer (VariableStoreList[StoreType]);\r
+      Variable.EndPtr   = GetEndPointer   (VariableStoreList[StoreType]);\r
       Variable.CurrPtr  = Variable.StartPtr;\r
     }\r
 \r
@@ -605,11 +619,11 @@ VariableServiceGetNextVariableInternal (
         //\r
         // Don't return NV variable when HOB overrides it\r
         //\r
-        if ((VariableStoreHeader[VariableStoreTypeHob] != NULL) && (VariableStoreHeader[VariableStoreTypeNv] != NULL) &&\r
-            (Variable.StartPtr == GetStartPointer (VariableStoreHeader[VariableStoreTypeNv]))\r
+        if ((VariableStoreList[VariableStoreTypeHob] != NULL) && (VariableStoreList[VariableStoreTypeNv] != NULL) &&\r
+            (Variable.StartPtr == GetStartPointer (VariableStoreList[VariableStoreTypeNv]))\r
            ) {\r
-          VariableInHob.StartPtr = GetStartPointer (VariableStoreHeader[VariableStoreTypeHob]);\r
-          VariableInHob.EndPtr   = GetEndPointer   (VariableStoreHeader[VariableStoreTypeHob]);\r
+          VariableInHob.StartPtr = GetStartPointer (VariableStoreList[VariableStoreTypeHob]);\r
+          VariableInHob.EndPtr   = GetEndPointer   (VariableStoreList[VariableStoreTypeHob]);\r
           Status = FindVariableEx (\r
                      GetVariableNamePtr (Variable.CurrPtr),\r
                      GetVendorGuidPtr (Variable.CurrPtr),\r
index b0d7f76bd8f070d400d5286d9ca0016f0e242e7d..6555316f52ec7c0f7674dda9818d490eeaf1b22f 100644 (file)
@@ -248,18 +248,20 @@ FindVariableEx (
   );\r
 \r
 /**\r
-  This code Finds the Next available variable.\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
+  @param[in]  VariableName      Pointer to variable name.\r
+  @param[in]  VendorGuid        Variable Vendor Guid.\r
+  @param[in]  VariableStoreList A list of variable stores that should be used to get the next variable.\r
+                                The maximum number of entries is the max value of VARIABLE_STORE_TYPE.\r
+  @param[out] VariablePtr       Pointer to variable header address.\r
 \r
   @retval EFI_SUCCESS           The function completed successfully.\r
   @retval EFI_NOT_FOUND         The next variable was not found.\r
-  @retval EFI_INVALID_PARAMETER If VariableName is not an empty string, while VendorGuid is NULL.\r
+  @retval EFI_INVALID_PARAMETER If VariableName is nt an empty string, while 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
 \r
@@ -269,6 +271,7 @@ EFIAPI
 VariableServiceGetNextVariableInternal (\r
   IN  CHAR16                *VariableName,\r
   IN  EFI_GUID              *VendorGuid,\r
+  IN  VARIABLE_STORE_HEADER **VariableStoreList,\r
   OUT VARIABLE_HEADER       **VariablePtr\r
   );\r
 \r