/** @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
#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
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
\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
);\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
}\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
\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
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