From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web10.1309.1684889314120113380 for ; Tue, 23 May 2023 17:48:34 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=k6WkqZcW; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: miki.shindo@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1684889313; x=1716425313; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=2R1cf+67wBq060EMWDdX5dFZYwpzH/v7o7wbFpEyZ0Q=; b=k6WkqZcWRtvxardmKF011HKm9OsSxJGoSVnXsanzjQvXWbtkrBVdHXQ7 06+e2ZEaV+pdCr5IuIDL8ExAoA2DtgQFgldenHxeV303WWeDxUDR2NDpj z1CdYmpM8XESn2MCq9glswUP+WyYm8xbg4PmdlVJ8+Jk0w12Z4ulNv/an XBT7SuWr8gMnEEoIWhHDTfWUjkhXNQLjGP2cvv532yv+zLHkYGPV+Fk2g 5TOHdawmOzgo5IkdZrkAEHoqRrcUO+7IU9Bp+2j0p81hUPOv61hi3TW8l B9DQ5mRvsl7IhohHMGbQ6BsZCrbuTdEPfopQnaUf+rFZipBo+ij10mGNZ w==; X-IronPort-AV: E=McAfee;i="6600,9927,10719"; a="355762694" X-IronPort-AV: E=Sophos;i="6.00,187,1681196400"; d="scan'208";a="355762694" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 May 2023 17:44:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10719"; a="1034269399" X-IronPort-AV: E=Sophos;i="6.00,187,1681196400"; d="scan'208";a="1034269399" Received: from mshindo-desk2.amr.corp.intel.com ([10.53.88.126]) by fmsmga005.fm.intel.com with ESMTP; 23 May 2023 17:44:10 -0700 From: "Miki Shindo" To: devel@edk2.groups.io Cc: Chasel Chiu , Nate DeSimone , Liming Gao , Eric Dong , Xiaoqiang Zhang Subject: [edk2-platforms:PATCH v2] MinPlatformPkg: Fix SetLargeVariable fail issue Date: Tue, 23 May 2023 17:44:03 -0700 Message-Id: <20230524004403.3338-1-miki.shindo@intel.com> X-Mailer: git-send-email 2.39.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4454 On Server platform, when the large variable "FspNvsBuffer" is already in th= e 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 t= he 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 Cc: Nate DeSimone Cc: Liming Gao Cc: Eric Dong Co-authored-by: Xiaoqiang Zhang Signed-off-by: Miki Shindo --- Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVariableWr= iteLib.c | 10 +++++++++- Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeRuntim= eVariableWriteLib.c | 15 +++++++++++++++ Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariableWrite= Common.c | 16 ++++++++++++++++ Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVari= ableWriteLibConstructor.c | 30 ++++++++++++++++++++++++++++++ Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVar= iableWriteLibConstructor.c | 30 ++++++++++++++++++++++++++++++ Platform/Intel/MinPlatformPkg/Include/Library/VariableWriteLib.h = | 12 ++++++++++++ Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeVariab= leWriteLib.inf | 1 + Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneMmVari= ableWriteLib.inf | 3 ++- Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/TraditionalMmVar= iableWriteLib.inf | 3 ++- 9 files changed, 117 insertions(+), 3 deletions(-) diff --git a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/Lar= geVariableWriteLib.c b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVaria= bleLib/LargeVariableWriteLib.c index de23ae6160..4bf9a6994f 100644 --- a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVaria= bleWriteLib.c +++ b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/LargeVaria= bleWriteLib.c @@ -22,7 +22,7 @@ #include =0D #include =0D #include =0D -=0D +#include =0D #include "LargeVariableCommon.h"=0D =0D /**=0D @@ -270,6 +270,7 @@ SetLargeVariable ( UINT8 *OffsetPtr;=0D UINTN BytesRemaining;=0D UINTN SizeToSave;=0D + UINTN BufferSize =3D 0;=0D =0D //=0D // Check input parameters.=0D @@ -365,6 +366,13 @@ SetLargeVariable ( // Non-Volatile storage to store the data.=0D //=0D RemainingVariableStorage =3D GetRemainingVariableStorageSpace ();=0D + //=0D + // Check if current variable already existed in NV storage variable sp= ace=0D + //=0D + Status =3D GetLargeVariable (VariableName, VendorGuid, &BufferSize, NU= LL);=0D + if ((Status =3D=3D EFI_BUFFER_TOO_SMALL) && (BufferSize !=3D 0) && !Va= rLibAtOsRuntime ()) {=0D + RemainingVariableStorage =3D RemainingVariableStorage + BufferSize;= =0D + }=0D if (DataSize > RemainingVariableStorage) {=0D DEBUG ((DEBUG_ERROR, "SetLargeVariable: Not enough NV storage space = to store the data\n"));=0D Status =3D EFI_OUT_OF_RESOURCES;=0D diff --git a/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteL= ib/DxeRuntimeVariableWriteLib.c b/Platform/Intel/MinPlatformPkg/Library/Dxe= RuntimeVariableWriteLib/DxeRuntimeVariableWriteLib.c index 28730f858b..9ca4734f24 100644 --- a/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeR= untimeVariableWriteLib.c +++ b/Platform/Intel/MinPlatformPkg/Library/DxeRuntimeVariableWriteLib/DxeR= untimeVariableWriteLib.c @@ -195,6 +195,21 @@ VarLibVariableRequestToLock ( return Status;=0D }=0D =0D +/**=0D + Indicator of whether it is runtime or not.=0D +=0D + @retval TRUE It is Runtime.=0D + @retval FALSE It is not Runtime.=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +VarLibAtOsRuntime (=0D + VOID=0D + )=0D +{=0D + return (mVariableWriteLibVariablePolicy =3D=3D NULL) ? TRUE : FALSE;=0D +}=0D +=0D /**=0D Close events when driver unloaded.=0D =0D diff --git a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmV= ariableWriteCommon.c b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWri= teLib/SmmVariableWriteCommon.c index 50ebb544b8..cd7118d1fb 100644 --- a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariable= WriteCommon.c +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/SmmVariable= WriteCommon.c @@ -18,6 +18,7 @@ #include =0D =0D EFI_SMM_VARIABLE_PROTOCOL *mVariableWriteLibSmmVariable =3D NULL;=0D +BOOLEAN mEfiAtRuntime =3D FALSE;=0D =0D /**=0D Sets the value of a variable.=0D @@ -169,3 +170,18 @@ VarLibVariableRequestToLock ( //=0D return EFI_UNSUPPORTED;=0D }=0D +=0D +/**=0D + Indicator of whether it is runtime or not.=0D +=0D + @retval TRUE It is Runtime.=0D + @retval FALSE It is not Runtime.=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +VarLibAtOsRuntime (=0D + VOID=0D + )=0D +{=0D + return mEfiAtRuntime;=0D +}=0D diff --git a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Stan= daloneMmVariableWriteLibConstructor.c b/Platform/Intel/MinPlatformPkg/Libra= ry/SmmVariableWriteLib/StandaloneMmVariableWriteLibConstructor.c index d39418abd2..8c2b7d18f5 100644 --- a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneM= mVariableWriteLibConstructor.c +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneM= mVariableWriteLibConstructor.c @@ -20,6 +20,28 @@ #include =0D =0D extern EFI_SMM_VARIABLE_PROTOCOL *mVariableWriteLibSmmVariable;=0D +extern BOOLEAN mEfiAtRuntime;=0D +=0D +/**=0D + Callback for ExitBootService, which is registered at the constructor.=0D + This callback sets a global variable mEfiAtRuntime to indicate whether=0D + it is after ExitBootService.=0D +=0D + @param[in] Protocol Protocol unique ID.=0D + @param[in] Interface Interface instance.=0D + @param[in] Handle The handle on which the interface is installe= d.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +VarLibExitBootServicesCallback (=0D + IN CONST EFI_GUID *Protocol,=0D + IN VOID *Interface,=0D + IN EFI_HANDLE Handle=0D + )=0D +{=0D + mEfiAtRuntime =3D TRUE;=0D + return EFI_SUCCESS;=0D +}=0D =0D /**=0D The constructor function acquires the EFI SMM Variable Services=0D @@ -41,11 +63,19 @@ StandaloneMmVariableWriteLibConstructor ( )=0D {=0D EFI_STATUS Status;=0D + VOID *Registration =3D NULL;=0D =0D //=0D // Locate SmmVariableProtocol.=0D //=0D Status =3D gMmst->MmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, = (VOID **) &mVariableWriteLibSmmVariable);=0D ASSERT_EFI_ERROR (Status);=0D +=0D + //=0D + // Register VarLibExitBootServicesCallback for gEdkiiSmmExitBootServices= ProtocolGuid.=0D + //=0D + Status =3D SmmRegisterProtocolNotify (&gEdkiiSmmExitBootServicesProtocol= Guid, VarLibExitBootServicesCallback, &Registration);=0D + ASSERT_EFI_ERROR (Status);=0D +=0D return Status;=0D }=0D diff --git a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Trad= itionalMmVariableWriteLibConstructor.c b/Platform/Intel/MinPlatformPkg/Libr= ary/SmmVariableWriteLib/TraditionalMmVariableWriteLibConstructor.c index d142527e17..abc1e25cde 100644 --- a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Traditional= MmVariableWriteLibConstructor.c +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Traditional= MmVariableWriteLibConstructor.c @@ -20,6 +20,28 @@ #include =0D =0D extern EFI_SMM_VARIABLE_PROTOCOL *mVariableWriteLibSmmVariable;=0D +extern BOOLEAN mEfiAtRuntime;=0D +=0D +/**=0D + Callback for ExitBootService, which is registered at the constructor.=0D + This callback sets a global variable mEfiAtRuntime to indicate whether=0D + it is after ExitBootService.=0D +=0D + @param[in] Protocol Protocol unique ID.=0D + @param[in] Interface Interface instance.=0D + @param[in] Handle The handle on which the interface is installe= d.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +VarLibExitBootServicesCallback (=0D + IN CONST EFI_GUID *Protocol,=0D + IN VOID *Interface,=0D + IN EFI_HANDLE Handle=0D + )=0D +{=0D + mEfiAtRuntime =3D TRUE;=0D + return EFI_SUCCESS;=0D +}=0D =0D /**=0D The constructor function acquires the EFI SMM Variable Services=0D @@ -41,11 +63,19 @@ TraditionalMmVariableWriteLibConstructor ( )=0D {=0D EFI_STATUS Status;=0D + VOID *Registration =3D NULL;=0D =0D //=0D // Locate SmmVariableProtocol.=0D //=0D Status =3D gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL,= (VOID **) &mVariableWriteLibSmmVariable);=0D ASSERT_EFI_ERROR (Status);=0D +=0D + //=0D + // Register VarLibExitBootServicesCallback for gEdkiiSmmExitBootServices= ProtocolGuid.=0D + //=0D + Status =3D SmmRegisterProtocolNotify (&gEdkiiSmmExitBootServicesProtocol= Guid, VarLibExitBootServicesCallback, &Registration);=0D + ASSERT_EFI_ERROR (Status);=0D +=0D return Status;=0D }=0D 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=0D );=0D =0D +/**=0D + Indicator of whether it is runtime or not.=0D +=0D + @retval TRUE It is Runtime.=0D + @retval FALSE It is not Runtime.=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +VarLibAtOsRuntime (=0D + VOID=0D + );=0D +=0D #endif // _VARIABLE_WRITE_LIB_H_=0D diff --git a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/Bas= eLargeVariableWriteLib.inf b/Platform/Intel/MinPlatformPkg/Library/BaseLarg= eVariableLib/BaseLargeVariableWriteLib.inf index 2493a94596..cbc2a5d93a 100644 --- a/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeV= ariableWriteLib.inf +++ b/Platform/Intel/MinPlatformPkg/Library/BaseLargeVariableLib/BaseLargeV= ariableWriteLib.inf @@ -49,3 +49,4 @@ PrintLib=0D VariableReadLib=0D VariableWriteLib=0D + LargeVariableReadLib=0D diff --git a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Stan= daloneMmVariableWriteLib.inf b/Platform/Intel/MinPlatformPkg/Library/SmmVar= iableWriteLib/StandaloneMmVariableWriteLib.inf index 0d1c63a297..868be49630 100644 --- a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneM= mVariableWriteLib.inf +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/StandaloneM= mVariableWriteLib.inf @@ -39,7 +39,8 @@ MmServicesTableLib=0D =0D [Protocols]=0D - gEfiSmmVariableProtocolGuid ## CONSUMES=0D + gEfiSmmVariableProtocolGuid ## CONSUMES=0D + gEdkiiSmmExitBootServicesProtocolGuid ## CONSUMES=0D =0D [Depex]=0D gEfiSmmVariableProtocolGuid=0D diff --git a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Trad= itionalMmVariableWriteLib.inf b/Platform/Intel/MinPlatformPkg/Library/SmmVa= riableWriteLib/TraditionalMmVariableWriteLib.inf index 5d833b7e0f..4aaab069ab 100644 --- a/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Traditional= MmVariableWriteLib.inf +++ b/Platform/Intel/MinPlatformPkg/Library/SmmVariableWriteLib/Traditional= MmVariableWriteLib.inf @@ -38,7 +38,8 @@ SmmServicesTableLib=0D =0D [Protocols]=0D - gEfiSmmVariableProtocolGuid ## CONSUMES=0D + gEfiSmmVariableProtocolGuid ## CONSUMES=0D + gEdkiiSmmExitBootServicesProtocolGuid ## CONSUMES=0D =0D [Depex]=0D gEfiSmmVariableProtocolGuid=0D --=20 2.39.1.windows.1