public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chiu, Chasel" <chasel.chiu@intel.com>
To: "Shindo, Miki" <miki.shindo@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Desimone, Nathaniel L" <nathaniel.l.desimone@intel.com>,
	"Gao, Liming" <gaoliming@byosoft.com.cn>,
	"Dong, Eric" <eric.dong@intel.com>,
	"Zhang, Xiaoqiang" <xiaoqiang.zhang@intel.com>
Subject: Re: [edk2-platforms:PATCH v2] MinPlatformPkg: Fix SetLargeVariable fail issue
Date: Wed, 24 May 2023 19:48:33 +0000	[thread overview]
Message-ID: <BN9PR11MB5483A33098381820FF120C1DE6419@BN9PR11MB5483.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20230524004403.3338-1-miki.shindo@intel.com>


Patch merged:
https://github.com/tianocore/edk2-platforms/commit/b71f2bda9e4fc183068eef5d1d90a631181a2506

Thanks,
Chasel


> -----Original Message-----
> From: Shindo, Miki <miki.shindo@intel.com>
> Sent: Tuesday, May 23, 2023 5:44 PM
> To: devel@edk2.groups.io
> Cc: Chiu, Chasel <chasel.chiu@intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>;
> Dong, Eric <eric.dong@intel.com>; Zhang, Xiaoqiang
> <xiaoqiang.zhang@intel.com>
> Subject: [edk2-platforms:PATCH v2] MinPlatformPkg: Fix SetLargeVariable fail
> issue
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4454
> 
> On Server platform, when the large variable "FspNvsBuffer" is already in the
> UEFI variable store and the remaining variable storage space is less than the
> large variable size, and also not in OS runtime, then we need to add the size of
> the current data that will end up being replaced by the new data to the
> remaining space before we decide that there is not enough space to store the
> large variable.
> 
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Eric Dong <eric.dong@intel.com>
> Co-authored-by: Xiaoqiang Zhang <xiaoqiang.zhang@intel.com>
> Signed-off-by: Miki Shindo <miki.shindo@intel.com>
> ---
> 
> Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableWri
> teLib.c                   | 10 +++++++++-
> 
> Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRunti
> meVariableWriteLib.c        | 15 +++++++++++++++
> 
> Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableWrit
> eCommon.c                   | 16 ++++++++++++++++
> 
> Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVa
> riableWriteLibConstructor.c  | 30 ++++++++++++++++++++++++++++++
> Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVa
> riableWriteLibConstructor.c | 30 ++++++++++++++++++++++++++++++
>  Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
> | 12 ++++++++++++
> 
> Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariabl
> eWriteLib.inf             |  1 +
> 
> Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVa
> riableWriteLib.inf           |  3 ++-
> 
> Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVa
> riableWriteLib.inf          |  3 ++-
>  9 files changed, 117 insertions(+), 3 deletions(-)
> 
> diff --git
> a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariable
> WriteLib.c
> b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariable
> WriteLib.c
> index de23ae6160..4bf9a6994f 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariable
> WriteLib.c
> +++ b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVa
> +++ riableWriteLib.c
> @@ -22,7 +22,7 @@
>  #include <Library/PrintLib.h> #include <Library/VariableReadLib.h> #include
> <Library/VariableWriteLib.h>-+#include <Library/LargeVariableReadLib.h>
> #include "LargeVariableCommon.h"  /**@@ -270,6 +270,7 @@
> SetLargeVariable (
>    UINT8         *OffsetPtr;   UINTN         BytesRemaining;   UINTN
> SizeToSave;+  UINTN         BufferSize = 0;    //   // Check input parameters.@@ -
> 365,6 +366,13 @@ SetLargeVariable (
>      // Non-Volatile storage to store the data.     //     RemainingVariableStorage =
> GetRemainingVariableStorageSpace ();+    //+    // Check if current variable
> already existed in NV storage variable space+    //+    Status = GetLargeVariable
> (VariableName, VendorGuid, &BufferSize, NULL);+    if ((Status ==
> EFI_BUFFER_TOO_SMALL) && (BufferSize != 0) && !VarLibAtOsRuntime ()) {+
> RemainingVariableStorage = RemainingVariableStorage + BufferSize;+    }     if
> (DataSize > RemainingVariableStorage) {       DEBUG ((DEBUG_ERROR,
> "SetLargeVariable: Not enough NV storage space to store the data\n"));
> Status = EFI_OUT_OF_RESOURCES;diff --git
> a/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRun
> timeVariableWriteLib.c
> b/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRun
> timeVariableWriteLib.c
> index 28730f858b..9ca4734f24 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRun
> timeVariableWriteLib.c
> +++ b/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/D
> +++ xeRuntimeVariableWriteLib.c
> @@ -195,6 +195,21 @@ VarLibVariableRequestToLock (
>    return Status; } +/**+  Indicator of whether it is runtime or not.++  @retval
> TRUE        It is Runtime.+  @retval FALSE       It is not
> Runtime.+**/+BOOLEAN+EFIAPI+VarLibAtOsRuntime (+  VOID+  )+{+  return
> (mVariableWriteLibVariablePolicy == NULL) ? TRUE : FALSE;+}+ /**   Close
> events when driver unloaded. diff --git
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableW
> riteCommon.c
> b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableW
> riteCommon.c
> index 50ebb544b8..cd7118d1fb 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableW
> riteCommon.c
> +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVaria
> +++ bleWriteCommon.c
> @@ -18,6 +18,7 @@
>  #include <Protocol/SmmVariable.h>  EFI_SMM_VARIABLE_PROTOCOL
> *mVariableWriteLibSmmVariable = NULL;+BOOLEAN                    mEfiAtRuntime =
> FALSE;  /**   Sets the value of a variable.@@ -169,3 +170,18 @@
> VarLibVariableRequestToLock (
>    //   return EFI_UNSUPPORTED; }++/**+  Indicator of whether it is runtime or
> not.++  @retval TRUE        It is Runtime.+  @retval FALSE       It is not
> Runtime.+**/+BOOLEAN+EFIAPI+VarLibAtOsRuntime (+  VOID+  )+{+  return
> mEfiAtRuntime;+}diff --git
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
> VariableWriteLibConstructor.c
> b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
> VariableWriteLibConstructor.c
> index d39418abd2..8c2b7d18f5 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
> VariableWriteLibConstructor.c
> +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Standalo
> +++ neMmVariableWriteLibConstructor.c
> @@ -20,6 +20,28 @@
>  #include <Library/MmServicesTableLib.h>  extern
> EFI_SMM_VARIABLE_PROTOCOL  *mVariableWriteLibSmmVariable;+extern
> BOOLEAN                    mEfiAtRuntime;++/**+  Callback for ExitBootService, which
> is registered at the constructor.+  This callback sets a global variable
> mEfiAtRuntime to indicate whether+  it is after ExitBootService.++  @param[in]
> Protocol        Protocol unique ID.+  @param[in] Interface       Interface instance.+
> @param[in] Handle          The handle on which the interface is
> installed.+**/+EFI_STATUS+EFIAPI+VarLibExitBootServicesCallback (+  IN
> CONST EFI_GUID   *Protocol,+  IN      VOID             *Interface,+  IN
> EFI_HANDLE        Handle+  )+{+  mEfiAtRuntime = TRUE;+  return EFI_SUCCESS;+}
> /**   The constructor function acquires the EFI SMM Variable Services@@ -
> 41,11 +63,19 @@ StandaloneMmVariableWriteLibConstructor (
>    ) {   EFI_STATUS    Status;+  VOID          *Registration = NULL;    //   // Locate
> SmmVariableProtocol.   //   Status = gMmst->MmLocateProtocol
> (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)
> &mVariableWriteLibSmmVariable);   ASSERT_EFI_ERROR (Status);++  //+  //
> Register VarLibExitBootServicesCallback for
> gEdkiiSmmExitBootServicesProtocolGuid.+  //+  Status =
> SmmRegisterProtocolNotify (&gEdkiiSmmExitBootServicesProtocolGuid,
> VarLibExitBootServicesCallback, &Registration);+  ASSERT_EFI_ERROR (Status);+
> return Status; }diff --git
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMm
> VariableWriteLibConstructor.c
> b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMm
> VariableWriteLibConstructor.c
> index d142527e17..abc1e25cde 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMm
> VariableWriteLibConstructor.c
> +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Traditio
> +++ nalMmVariableWriteLibConstructor.c
> @@ -20,6 +20,28 @@
>  #include <Library/SmmServicesTableLib.h>  extern
> EFI_SMM_VARIABLE_PROTOCOL  *mVariableWriteLibSmmVariable;+extern
> BOOLEAN                    mEfiAtRuntime;++/**+  Callback for ExitBootService, which
> is registered at the constructor.+  This callback sets a global variable
> mEfiAtRuntime to indicate whether+  it is after ExitBootService.++  @param[in]
> Protocol        Protocol unique ID.+  @param[in] Interface       Interface instance.+
> @param[in] Handle          The handle on which the interface is
> installed.+**/+EFI_STATUS+EFIAPI+VarLibExitBootServicesCallback (+  IN
> CONST EFI_GUID   *Protocol,+  IN      VOID             *Interface,+  IN
> EFI_HANDLE        Handle+  )+{+  mEfiAtRuntime = TRUE;+  return EFI_SUCCESS;+}
> /**   The constructor function acquires the EFI SMM Variable Services@@ -
> 41,11 +63,19 @@ TraditionalMmVariableWriteLibConstructor (
>    ) {   EFI_STATUS    Status;+  VOID          *Registration = NULL;    //   // Locate
> SmmVariableProtocol.   //   Status = gSmst->SmmLocateProtocol
> (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)
> &mVariableWriteLibSmmVariable);   ASSERT_EFI_ERROR (Status);++  //+  //
> Register VarLibExitBootServicesCallback for
> gEdkiiSmmExitBootServicesProtocolGuid.+  //+  Status =
> SmmRegisterProtocolNotify (&gEdkiiSmmExitBootServicesProtocolGuid,
> VarLibExitBootServicesCallback, &Registration);+  ASSERT_EFI_ERROR (Status);+
> return Status; }diff --git
> a/Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
> b/Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
> index fab87f2e48..bc0b52d782 100644
> --- a/Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
> +++ b/Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h
> @@ -135,4 +135,16 @@ VarLibVariableRequestToLock (
>    IN  EFI_GUID                     *VendorGuid   ); +/**+  Indicator of whether it is
> runtime or not.++  @retval TRUE        It is Runtime.+  @retval FALSE       It is not
> Runtime.+**/+BOOLEAN+EFIAPI+VarLibAtOsRuntime (+  VOID+  );+ #endif  //
> _VARIABLE_WRITE_LIB_H_diff --git
> a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVaria
> bleWriteLib.inf
> b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVaria
> bleWriteLib.inf
> index 2493a94596..cbc2a5d93a 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVaria
> bleWriteLib.inf
> +++ b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLar
> +++ geVariableWriteLib.inf
> @@ -49,3 +49,4 @@
>    PrintLib   VariableReadLib   VariableWriteLib+  LargeVariableReadLibdiff --git
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
> VariableWriteLib.inf
> b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
> VariableWriteLib.inf
> index 0d1c63a297..868be49630 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMm
> VariableWriteLib.inf
> +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Standalo
> +++ neMmVariableWriteLib.inf
> @@ -39,7 +39,8 @@
>    MmServicesTableLib  [Protocols]-  gEfiSmmVariableProtocolGuid   ##
> CONSUMES+  gEfiSmmVariableProtocolGuid             ## CONSUMES+
> gEdkiiSmmExitBootServicesProtocolGuid   ## CONSUMES  [Depex]
> gEfiSmmVariableProtocolGuiddiff --git
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMm
> VariableWriteLib.inf
> b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMm
> VariableWriteLib.inf
> index 5d833b7e0f..4aaab069ab 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMm
> VariableWriteLib.inf
> +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Traditio
> +++ nalMmVariableWriteLib.inf
> @@ -38,7 +38,8 @@
>    SmmServicesTableLib  [Protocols]-  gEfiSmmVariableProtocolGuid   ##
> CONSUMES+  gEfiSmmVariableProtocolGuid             ## CONSUMES+
> gEdkiiSmmExitBootServicesProtocolGuid   ## CONSUMES  [Depex]
> gEfiSmmVariableProtocolGuid--
> 2.39.1.windows.1


      parent reply	other threads:[~2023-05-24 19:49 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-24  0:44 [edk2-platforms:PATCH v2] MinPlatformPkg: Fix SetLargeVariable fail issue Miki Shindo
2023-05-24  0:58 ` Nate DeSimone
2023-05-24  1:07   ` Chiu, Chasel
2023-05-24 19:48 ` Chiu, Chasel [this message]

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=BN9PR11MB5483A33098381820FF120C1DE6419@BN9PR11MB5483.namprd11.prod.outlook.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