]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/DxeCapsuleLibFmp: Use new Variable Lock interface
authorYang Jie <jie.yang@intel.com>
Wed, 10 Nov 2021 02:00:00 +0000 (10:00 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 10 Nov 2021 09:27:33 +0000 (09:27 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3699
The code in MdeModulePkg\Library\DxeCapsuleLibFmp call the deprecated=20
interface VariableLockRequestToLock.c. So I changed the code in
FmpDevicePkg using RegisterBasicVariablePolicy, instead of the=20
deprecated interface.

Signed-off-by: Yang Jie <jie.yang@intel.com>
Cc: Guomin Jiang <guomin.jiang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleReportLib.c

index 4932479d420b9013c1651fde267bd29ab654a77f..095e062a6ee47e363623ba35fa984158d5a00070 100644 (file)
@@ -3,7 +3,7 @@
 #\r
 #  Capsule library instance for DXE_DRIVER module types.\r
 #\r
-#  Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 ##\r
@@ -51,6 +51,7 @@
   DisplayUpdateProgressLib\r
   FileHandleLib\r
   UefiBootManagerLib\r
+  VariablePolicyHelperLib\r
 \r
 [Pcd]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleMax                               ## CONSUMES\r
 [Protocols]\r
   gEsrtManagementProtocolGuid                   ## CONSUMES\r
   gEfiFirmwareManagementProtocolGuid            ## CONSUMES\r
-  gEdkiiVariableLockProtocolGuid                ## SOMETIMES_CONSUMES\r
   gEdkiiFirmwareManagementProgressProtocolGuid  ## SOMETIMES_CONSUMES\r
   gEfiSimpleFileSystemProtocolGuid              ## SOMETIMES_CONSUMES\r
   gEfiBlockIoProtocolGuid                       ## CONSUMES\r
   gEfiDiskIoProtocolGuid                        ## CONSUMES\r
+  gEdkiiVariablePolicyProtocolGuid              ## CONSUMES\r
 \r
 [Guids]\r
   gEfiFmpCapsuleGuid                      ## SOMETIMES_CONSUMES ## GUID\r
index 0ec5f20676c82ba2e03723bc36bbfea282d5858a..4f718129c6950f3a03bc0eeb69bcd852ba658df7 100644 (file)
@@ -1,14 +1,13 @@
 /** @file\r
   DXE capsule report related function.\r
 \r
-  Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <PiDxe.h>\r
 #include <Protocol/FirmwareManagement.h>\r
-#include <Protocol/VariableLock.h>\r
 #include <Guid/CapsuleReport.h>\r
 #include <Guid/FmpCapsule.h>\r
 #include <Guid/CapsuleVendor.h>\r
@@ -26,6 +25,7 @@
 #include <Library/ReportStatusCodeLib.h>\r
 #include <Library/DevicePathLib.h>\r
 #include <Library/CapsuleLib.h>\r
+#include <Library/VariablePolicyHelperLib.h>\r
 \r
 #include <IndustryStandard/WindowsUxCapsule.h>\r
 \r
@@ -94,6 +94,40 @@ GetNewCapsuleResultIndex (
   return CurrentIndex + 1;\r
 }\r
 \r
+/**\r
+  Lock Variable by variable policy.\r
+\r
+  @param[in] VariableGuid         The Guid of the variable to be locked\r
+  @param[in] VariableName         The name of the variable to be locked\r
+  @param[in] VariablePolicy       The pointer of variable lock policy\r
+**/\r
+VOID\r
+LockVariable (\r
+  IN CONST  EFI_GUID                 VariableGuid,\r
+  IN CHAR16                          *VariableName,\r
+  IN EDKII_VARIABLE_POLICY_PROTOCOL  *VariablePolicy\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+\r
+  // Set the policies to protect the target variables\r
+  Status = RegisterBasicVariablePolicy (VariablePolicy,\r
+                                        &VariableGuid,\r
+                                        VariableName,\r
+                                        VARIABLE_POLICY_NO_MIN_SIZE,\r
+                                        VARIABLE_POLICY_NO_MAX_SIZE,\r
+                                        VARIABLE_POLICY_NO_MUST_ATTR,\r
+                                        VARIABLE_POLICY_NO_CANT_ATTR,\r
+                                        VARIABLE_POLICY_TYPE_LOCK_NOW);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "DxeCapsuleLibFmp: Failed to lock variable %g %s.  Status = %r\n",\r
+            &VariableGuid,\r
+            VariableName,\r
+            Status));\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+}\r
+\r
 /**\r
   Write a new capsule status variable.\r
 \r
@@ -269,16 +303,17 @@ RecordFmpCapsuleStatusVariable (
 \r
 /**\r
   Initialize CapsuleMax variables.\r
+\r
+  @param[in] VariablePolicy       The pointer of variable lock policy\r
 **/\r
 VOID\r
 InitCapsuleMaxVariable (\r
-  VOID\r
+  EDKII_VARIABLE_POLICY_PROTOCOL   *VariablePolicy\r
   )\r
 {\r
   EFI_STATUS                       Status;\r
   UINTN                            Size;\r
   CHAR16                           CapsuleMaxStr[sizeof("Capsule####")];\r
-  EDKII_VARIABLE_LOCK_PROTOCOL     *VariableLock;\r
 \r
   UnicodeSPrint(\r
     CapsuleMaxStr,\r
@@ -297,25 +332,22 @@ InitCapsuleMaxVariable (
                   );\r
   if (!EFI_ERROR(Status)) {\r
     // Lock it per UEFI spec.\r
-    Status = gBS->LocateProtocol(&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLock);\r
-    if (!EFI_ERROR(Status)) {\r
-      Status = VariableLock->RequestToLock(VariableLock, L"CapsuleMax", &gEfiCapsuleReportGuid);\r
-      ASSERT_EFI_ERROR(Status);\r
-    }\r
+    LockVariable (gEfiCapsuleReportGuid, L"CapsuleMax", VariablePolicy);\r
   }\r
 }\r
 \r
 /**\r
   Initialize CapsuleLast variables.\r
+\r
+  @param[in] VariablePolicy       The pointer of variable lock policy\r
 **/\r
 VOID\r
 InitCapsuleLastVariable (\r
-  VOID\r
+  EDKII_VARIABLE_POLICY_PROTOCOL   *VariablePolicy\r
   )\r
 {\r
   EFI_STATUS                       Status;\r
   EFI_BOOT_MODE                    BootMode;\r
-  EDKII_VARIABLE_LOCK_PROTOCOL     *VariableLock;\r
   VOID                             *CapsuleResult;\r
   UINTN                            Size;\r
   CHAR16                           CapsuleLastStr[sizeof("Capsule####")];\r
@@ -372,11 +404,7 @@ InitCapsuleLastVariable (
     }\r
 \r
     // Lock it in normal boot path per UEFI spec.\r
-    Status = gBS->LocateProtocol(&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLock);\r
-    if (!EFI_ERROR(Status)) {\r
-      Status = VariableLock->RequestToLock(VariableLock, L"CapsuleLast", &gEfiCapsuleReportGuid);\r
-      ASSERT_EFI_ERROR(Status);\r
-    }\r
+    LockVariable (gEfiCapsuleReportGuid, L"CapsuleLast", VariablePolicy);\r
   }\r
 }\r
 \r
@@ -430,26 +458,21 @@ InitCapsuleUpdateVariable (
 \r
 /**\r
   Initialize capsule relocation info variable.\r
+\r
+  @param[in] VariablePolicy       The pointer of variable lock policy\r
 **/\r
 VOID\r
 InitCapsuleRelocationInfo (\r
-  VOID\r
+  EDKII_VARIABLE_POLICY_PROTOCOL   *VariablePolicy\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock;\r
-\r
   CoDClearCapsuleRelocationInfo();\r
 \r
   //\r
   // Unlock Capsule On Disk relocation Info variable only when Capsule On Disk flag is enabled\r
   //\r
   if (!CoDCheckCapsuleOnDiskFlag()) {\r
-    Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **) &VariableLock);\r
-    if (!EFI_ERROR (Status)) {\r
-      Status = VariableLock->RequestToLock (VariableLock, COD_RELOCATION_INFO_VAR_NAME, &gEfiCapsuleVendorGuid);\r
-      ASSERT_EFI_ERROR (Status);\r
-    }\r
+    LockVariable (gEfiCapsuleVendorGuid, COD_RELOCATION_INFO_VAR_NAME, VariablePolicy);\r
   }\r
 }\r
 \r
@@ -461,10 +484,19 @@ InitCapsuleVariable (
   VOID\r
   )\r
 {\r
+  EFI_STATUS                       Status;\r
+  EDKII_VARIABLE_POLICY_PROTOCOL   *VariablePolicy;\r
+\r
+  // Locate the VariablePolicy protocol\r
+  Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID**)&VariablePolicy);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "DxeCapsuleReportLib %a - Could not locate VariablePolicy protocol! %r\n", __FUNCTION__, Status));\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
   InitCapsuleUpdateVariable();\r
-  InitCapsuleMaxVariable();\r
-  InitCapsuleLastVariable();\r
-  InitCapsuleRelocationInfo();\r
+  InitCapsuleMaxVariable (VariablePolicy);\r
+  InitCapsuleLastVariable (VariablePolicy);\r
+  InitCapsuleRelocationInfo (VariablePolicy);\r
 \r
   //\r
   // No need to clear L"Capsule####", because OS/APP should refer L"CapsuleLast"\r