From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Kubacki, Michael A" <michael.a.kubacki@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Bi, Dandan" <dandan.bi@intel.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
"Dong, Eric" <eric.dong@intel.com>,
Laszlo Ersek <lersek@redhat.com>,
"Gao, Liming" <liming.gao@intel.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>,
"Ni, Ray" <ray.ni@intel.com>,
"Wang, Jian J" <jian.j.wang@intel.com>,
"Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [PATCH V4 02/10] MdeModulePkg/Variable: Parameterize GetNextVariableInternal () stores
Date: Wed, 16 Oct 2019 07:53:16 +0000 [thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A093C947FE6@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20191014233001.33024-3-michael.a.kubacki@intel.com>
> -----Original Message-----
> From: Kubacki, Michael A
> Sent: Tuesday, October 15, 2019 7:30 AM
> To: devel@edk2.groups.io
> Cc: Bi, Dandan; Ard Biesheuvel; Dong, Eric; Laszlo Ersek; Gao, Liming; Kinney,
> Michael D; Ni, Ray; Wang, Jian J; Wu, Hao A; Yao, Jiewen
> Subject: [PATCH V4 02/10] MdeModulePkg/Variable: Parameterize
> GetNextVariableInternal () stores
>
> 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.
Since all my previous comments have been addressed, the patch looks good to me:
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Best Regards,
Hao Wu
>
> 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>
> ---
> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h | 13 ++-
> -
> MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c | 12 ++-
> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c | 6 ++
> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c | 82
> ++++++++++++--------
> 4 files changed, 73 insertions(+), 40 deletions(-)
>
> diff --git
> a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h
> b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h
> index b0d7f76bd8..6555316f52 100644
> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h
> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h
> @@ -248,18 +248,20 @@ FindVariableEx (
> );
>
> /**
> - This code Finds the Next available variable.
> + This code finds the next available variable.
>
> Caution: This function may receive untrusted input.
> This function may be invoked in SMM mode. This function will do basic
> validation, before parse the data.
>
> - @param[in] VariableName Pointer to variable name.
> - @param[in] VendorGuid Variable Vendor Guid.
> - @param[out] VariablePtr Pointer to variable header address.
> + @param[in] VariableName Pointer to variable name.
> + @param[in] VendorGuid Variable Vendor Guid.
> + @param[in] VariableStoreList A list of variable stores that should be used
> to get the next variable.
> + The maximum number of entries is the max value of
> VARIABLE_STORE_TYPE.
> + @param[out] VariablePtr Pointer to variable header address.
>
> @retval EFI_SUCCESS The function completed successfully.
> @retval EFI_NOT_FOUND The next variable was not found.
> - @retval EFI_INVALID_PARAMETER If VariableName is not an empty string,
> while VendorGuid is NULL.
> + @retval EFI_INVALID_PARAMETER If VariableName is nt an empty string,
> while VendorGuid is NULL.
> @retval EFI_INVALID_PARAMETER The input values of VariableName and
> VendorGuid are not a name and
> GUID of an existing variable.
>
> @@ -269,6 +271,7 @@ EFIAPI
> VariableServiceGetNextVariableInternal (
> IN CHAR16 *VariableName,
> IN EFI_GUID *VendorGuid,
> + IN VARIABLE_STORE_HEADER **VariableStoreList,
> OUT VARIABLE_HEADER **VariablePtr
> );
>
> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
> b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
> index 76536308e6..70af86db24 100644
> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
> @@ -2358,6 +2358,7 @@ VariableServiceGetNextVariableName (
> UINTN MaxLen;
> UINTN VarNameSize;
> VARIABLE_HEADER *VariablePtr;
> + VARIABLE_STORE_HEADER
> *VariableStoreHeader[VariableStoreTypeMax];
>
> if (VariableNameSize == NULL || VariableName == NULL || VendorGuid ==
> NULL) {
> return EFI_INVALID_PARAMETER;
> @@ -2377,7 +2378,16 @@ VariableServiceGetNextVariableName (
>
> AcquireLockOnlyAtBootTime(&mVariableModuleGlobal-
> >VariableGlobal.VariableServicesLock);
>
> - Status = VariableServiceGetNextVariableInternal (VariableName,
> VendorGuid, &VariablePtr);
> + //
> + // 0: Volatile, 1: HOB, 2: Non-Volatile.
> + // The index and attributes mapping must be kept in this order as
> FindVariable
> + // makes use of this mapping to implement search algorithm.
> + //
> + VariableStoreHeader[VariableStoreTypeVolatile] =
> (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal-
> >VariableGlobal.VolatileVariableBase;
> + VariableStoreHeader[VariableStoreTypeHob] =
> (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal-
> >VariableGlobal.HobVariableBase;
> + VariableStoreHeader[VariableStoreTypeNv] = mNvVariableCache;
> +
> + Status = VariableServiceGetNextVariableInternal (VariableName,
> VendorGuid, VariableStoreHeader, &VariablePtr);
> if (!EFI_ERROR (Status)) {
> VarNameSize = NameSizeOfVariable (VariablePtr);
> ASSERT (VarNameSize != 0);
> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c
> b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c
> index dc78f68fa9..c787ddba5b 100644
> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c
> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c
> @@ -98,10 +98,16 @@ VariableExLibFindNextVariable (
> EFI_STATUS Status;
> VARIABLE_HEADER *VariablePtr;
> AUTHENTICATED_VARIABLE_HEADER *AuthVariablePtr;
> + VARIABLE_STORE_HEADER
> *VariableStoreHeader[VariableStoreTypeMax];
> +
> + VariableStoreHeader[VariableStoreTypeVolatile] =
> (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal-
> >VariableGlobal.VolatileVariableBase;
> + VariableStoreHeader[VariableStoreTypeHob] =
> (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal-
> >VariableGlobal.HobVariableBase;
> + VariableStoreHeader[VariableStoreTypeNv] = mNvVariableCache;
>
> Status = VariableServiceGetNextVariableInternal (
> VariableName,
> VendorGuid,
> + VariableStoreHeader,
> &VariablePtr
> );
> if (EFI_ERROR (Status)) {
> diff --git
> a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c
> b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c
> index 5698a1a5e4..d6bb916e68 100644
> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c
> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c
> @@ -476,14 +476,16 @@ FindVariableEx (
> }
>
> /**
> - This code Finds the Next available variable.
> + This code finds the next available variable.
>
> Caution: This function may receive untrusted input.
> This function may be invoked in SMM mode. This function will do basic
> validation, before parse the data.
>
> - @param[in] VariableName Pointer to variable name.
> - @param[in] VendorGuid Variable Vendor Guid.
> - @param[out] VariablePtr Pointer to variable header address.
> + @param[in] VariableName Pointer to variable name.
> + @param[in] VendorGuid Variable Vendor Guid.
> + @param[in] VariableStoreList A list of variable stores that should be used
> to get the next variable.
> + The maximum number of entries is the max value of
> VARIABLE_STORE_TYPE.
> + @param[out] VariablePtr Pointer to variable header address.
>
> @retval EFI_SUCCESS The function completed successfully.
> @retval EFI_NOT_FOUND The next variable was not found.
> @@ -497,26 +499,47 @@ EFIAPI
> VariableServiceGetNextVariableInternal (
> IN CHAR16 *VariableName,
> IN EFI_GUID *VendorGuid,
> + IN VARIABLE_STORE_HEADER **VariableStoreList,
> OUT VARIABLE_HEADER **VariablePtr
> )
> {
> - VARIABLE_STORE_TYPE Type;
> + EFI_STATUS Status;
> + VARIABLE_STORE_TYPE StoreType;
> VARIABLE_POINTER_TRACK Variable;
> VARIABLE_POINTER_TRACK VariableInHob;
> VARIABLE_POINTER_TRACK VariablePtrTrack;
> - EFI_STATUS Status;
> - VARIABLE_STORE_HEADER *VariableStoreHeader[VariableStoreTypeMax];
>
> - Status = FindVariable (VariableName, VendorGuid, &Variable,
> &mVariableModuleGlobal->VariableGlobal, FALSE);
> + Status = EFI_NOT_FOUND;
> +
> + if (VariableStoreList == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + // Check if the variable exists in the given variable store list
> + for (StoreType = (VARIABLE_STORE_TYPE) 0; StoreType <
> VariableStoreTypeMax; StoreType++) {
> + if (VariableStoreList[StoreType] == NULL) {
> + continue;
> + }
> +
> + Variable.StartPtr = GetStartPointer (VariableStoreList[StoreType]);
> + Variable.EndPtr = GetEndPointer (VariableStoreList[StoreType]);
> + Variable.Volatile = (BOOLEAN) (StoreType == VariableStoreTypeVolatile);
> +
> + Status = FindVariableEx (VariableName, VendorGuid, FALSE, &Variable);
> + if (!EFI_ERROR (Status)) {
> + break;
> + }
> + }
> +
> if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {
> //
> - // For VariableName is an empty string, FindVariable() will try to find and
> return
> - // the first qualified variable, and if FindVariable() returns error
> (EFI_NOT_FOUND)
> + // For VariableName is an empty string, FindVariableEx() will try to find
> and return
> + // the first qualified variable, and if FindVariableEx() returns error
> (EFI_NOT_FOUND)
> // as no any variable is found, still go to return the error
> (EFI_NOT_FOUND).
> //
> if (VariableName[0] != 0) {
> //
> - // For VariableName is not an empty string, and FindVariable() returns
> error as
> + // For VariableName is not an empty string, and FindVariableEx() returns
> error as
> // VariableName and VendorGuid are not a name and GUID of an existing
> variable,
> // there is no way to get next variable, follow spec to return
> EFI_INVALID_PARAMETER.
> //
> @@ -527,39 +550,30 @@ VariableServiceGetNextVariableInternal (
>
> if (VariableName[0] != 0) {
> //
> - // If variable name is not NULL, get next variable.
> + // If variable name is not empty, get next variable.
> //
> Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);
> }
>
> - //
> - // 0: Volatile, 1: HOB, 2: Non-Volatile.
> - // The index and attributes mapping must be kept in this order as
> FindVariable
> - // makes use of this mapping to implement search algorithm.
> - //
> - VariableStoreHeader[VariableStoreTypeVolatile] =
> (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal-
> >VariableGlobal.VolatileVariableBase;
> - VariableStoreHeader[VariableStoreTypeHob] =
> (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal-
> >VariableGlobal.HobVariableBase;
> - VariableStoreHeader[VariableStoreTypeNv] = mNvVariableCache;
> -
> while (TRUE) {
> //
> - // Switch from Volatile to HOB, to Non-Volatile.
> + // Switch to the next variable store if needed
> //
> while (!IsValidVariableHeader (Variable.CurrPtr, Variable.EndPtr)) {
> //
> // Find current storage index
> //
> - for (Type = (VARIABLE_STORE_TYPE) 0; Type < VariableStoreTypeMax;
> Type++) {
> - if ((VariableStoreHeader[Type] != NULL) && (Variable.StartPtr ==
> GetStartPointer (VariableStoreHeader[Type]))) {
> + for (StoreType = (VARIABLE_STORE_TYPE) 0; StoreType <
> VariableStoreTypeMax; StoreType++) {
> + if ((VariableStoreList[StoreType] != NULL) && (Variable.StartPtr ==
> GetStartPointer (VariableStoreList[StoreType]))) {
> break;
> }
> }
> - ASSERT (Type < VariableStoreTypeMax);
> + ASSERT (StoreType < VariableStoreTypeMax);
> //
> // Switch to next storage
> //
> - for (Type++; Type < VariableStoreTypeMax; Type++) {
> - if (VariableStoreHeader[Type] != NULL) {
> + for (StoreType++; StoreType < VariableStoreTypeMax; StoreType++) {
> + if (VariableStoreList[StoreType] != NULL) {
> break;
> }
> }
> @@ -568,12 +582,12 @@ VariableServiceGetNextVariableInternal (
> // 1. current storage is the last one, or
> // 2. no further storage
> //
> - if (Type == VariableStoreTypeMax) {
> + if (StoreType == VariableStoreTypeMax) {
> Status = EFI_NOT_FOUND;
> goto Done;
> }
> - Variable.StartPtr = GetStartPointer (VariableStoreHeader[Type]);
> - Variable.EndPtr = GetEndPointer (VariableStoreHeader[Type]);
> + Variable.StartPtr = GetStartPointer (VariableStoreList[StoreType]);
> + Variable.EndPtr = GetEndPointer (VariableStoreList[StoreType]);
> Variable.CurrPtr = Variable.StartPtr;
> }
>
> @@ -605,11 +619,11 @@ VariableServiceGetNextVariableInternal (
> //
> // Don't return NV variable when HOB overrides it
> //
> - if ((VariableStoreHeader[VariableStoreTypeHob] != NULL) &&
> (VariableStoreHeader[VariableStoreTypeNv] != NULL) &&
> - (Variable.StartPtr == GetStartPointer
> (VariableStoreHeader[VariableStoreTypeNv]))
> + if ((VariableStoreList[VariableStoreTypeHob] != NULL) &&
> (VariableStoreList[VariableStoreTypeNv] != NULL) &&
> + (Variable.StartPtr == GetStartPointer
> (VariableStoreList[VariableStoreTypeNv]))
> ) {
> - VariableInHob.StartPtr = GetStartPointer
> (VariableStoreHeader[VariableStoreTypeHob]);
> - VariableInHob.EndPtr = GetEndPointer
> (VariableStoreHeader[VariableStoreTypeHob]);
> + VariableInHob.StartPtr = GetStartPointer
> (VariableStoreList[VariableStoreTypeHob]);
> + VariableInHob.EndPtr = GetEndPointer
> (VariableStoreList[VariableStoreTypeHob]);
> Status = FindVariableEx (
> GetVariableNamePtr (Variable.CurrPtr),
> GetVendorGuidPtr (Variable.CurrPtr),
> --
> 2.16.2.windows.1
next prev parent reply other threads:[~2019-10-16 7:53 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-14 23:29 [PATCH V4 00/10] UEFI Variable SMI Reduction Kubacki, Michael A
2019-10-14 23:29 ` [PATCH V4 01/10] MdeModulePkg/Variable: Consolidate common parsing functions Kubacki, Michael A
2019-10-16 7:52 ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 02/10] MdeModulePkg/Variable: Parameterize GetNextVariableInternal () stores Kubacki, Michael A
2019-10-16 7:53 ` Wu, Hao A [this message]
2019-10-14 23:29 ` [PATCH V4 03/10] MdeModulePkg/Variable: Parameterize VARIABLE_INFO_ENTRY buffer Kubacki, Michael A
2019-10-16 7:54 ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 04/10] MdeModulePkg/Variable: Parameterize auth status in VariableParsing Kubacki, Michael A
2019-10-17 1:01 ` Wu, Hao A
2019-10-17 1:41 ` Kubacki, Michael A
2019-10-17 1:49 ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 05/10] MdeModulePkg/Variable: Add a file for NV variable functions Kubacki, Michael A
2019-10-16 7:55 ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 06/10] MdeModulePkg VariableInfo: Always consider RT DXE and SMM stats Kubacki, Michael A
2019-10-16 7:56 ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 07/10] MdeModulePkg/Variable: Add RT GetVariable() cache support Kubacki, Michael A
2019-10-16 6:46 ` Wang, Jian J
[not found] ` <15CE0DB2DE3EB613.1607@groups.io>
2019-10-16 6:54 ` [edk2-devel] " Wang, Jian J
2019-10-17 1:24 ` Kubacki, Michael A
2019-10-17 1:47 ` Wang, Jian J
2019-10-16 7:56 ` Wu, Hao A
2019-10-16 16:44 ` Kubacki, Michael A
2019-10-17 14:23 ` Wang, Jian J
2019-10-17 17:44 ` Kubacki, Michael A
2019-10-14 23:29 ` [PATCH V4 08/10] MdeModulePkg/Variable: Add RT GetNextVariableName() " Kubacki, Michael A
2019-10-16 7:56 ` Wu, Hao A
2019-10-14 23:30 ` [PATCH V4 09/10] OvmfPkg: Disable variable runtime cache Kubacki, Michael A
2019-10-15 7:32 ` Laszlo Ersek
2019-10-14 23:30 ` [PATCH V4 10/10] MdeModulePkg: Enable variable runtime cache by default Kubacki, Michael A
2019-10-15 7:33 ` Laszlo Ersek
2019-10-16 7:57 ` Wu, Hao A
2019-10-15 0:49 ` [PATCH V4 00/10] UEFI Variable SMI Reduction Liming Gao
2019-10-15 16:15 ` Kubacki, Michael A
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A093C947FE6@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox