From: "Laszlo Ersek" <lersek@redhat.com>
To: Bret Barkelew <Bret.Barkelew@microsoft.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>,
"bret@corthon.com" <bret@corthon.com>
Cc: Jian J Wang <jian.j.wang@intel.com>,
Hao A Wu <hao.a.wu@intel.com>,
"liming.gao" <liming.gao@intel.com>
Subject: Re: [EXTERNAL] Re: [edk2-devel] [PATCH v4 09/14] MdeModulePkg: Connect VariablePolicy business logic to VariableServices
Date: Tue, 2 Jun 2020 21:54:46 +0200 [thread overview]
Message-ID: <823206aa-c87b-5498-bd61-b8bd9bb84d94@redhat.com> (raw)
In-Reply-To: <CY4PR21MB0743AD042F402A06DEFB17FEEF8B0@CY4PR21MB0743.namprd21.prod.outlook.com>
On 06/02/20 20:17, Bret Barkelew wrote:
> Actually, two things:
>
> 1. I was running on the wrong branch and
> 2. I don’t know that I submitted this series to GitHub yet, so the CI wouldn’t have caught it.
Ah OK -- I thought you had run the v4 series through a personal CI build
(= PR without the "push" label) on github.com.
(I don't closely monitor my github notifications folder just yet, i.e.
before we transition to github.com for good, and so I couldn't have
remembered either the presence or the absence of such a personal CI
build / PR in the recent past.)
Thanks!
Laszlo
>
> I ran it through the Windows CI on my local machine before v4 patches, but VS is less picky (for better or [probably] worse) about things like EFIAPI and CONST.
>
> I have these patched and ready for v5.
>
> - Bret
>
> From: Bret Barkelew via groups.io<mailto:bret.barkelew=microsoft.com@groups.io>
> Sent: Tuesday, June 2, 2020 9:55 AM
> To: devel@edk2.groups.io<mailto:devel@edk2.groups.io>; lersek@redhat.com<mailto:lersek@redhat.com>; bret@corthon.com<mailto:bret@corthon.com>
> Cc: Jian J Wang<mailto:jian.j.wang@intel.com>; Hao A Wu<mailto:hao.a.wu@intel.com>; liming.gao<mailto:liming.gao@intel.com>
> Subject: Re: [EXTERNAL] Re: [edk2-devel] [PATCH v4 09/14] MdeModulePkg: Connect VariablePolicy business logic to VariableServices
>
> I’m also puzzled by the lack of error in CI. I just tried to leverage it to iterate on the problem and resolve the issue you’re seeing, but it wasn’t of any use. Will poke around a little, but also keen to hear from anyone with more GCC5 experience.
>
> - Bret
>
> From: Laszlo Ersek via groups.io<mailto:lersek=redhat.com@groups.io>
> Sent: Tuesday, June 2, 2020 8:48 AM
> To: devel@edk2.groups.io<mailto:devel@edk2.groups.io>; bret@corthon.com<mailto:bret@corthon.com>
> Cc: Jian J Wang<mailto:jian.j.wang@intel.com>; Hao A Wu<mailto:hao.a.wu@intel.com>; liming.gao<mailto:liming.gao@intel.com>
> Subject: [EXTERNAL] Re: [edk2-devel] [PATCH v4 09/14] MdeModulePkg: Connect VariablePolicy business logic to VariableServices
>
> Hi Bret,
>
> this patch causes a build failure with the GCC48 toolchain (actual
> version: gcc 4.8.5-36 in RHEL7), and also with the GCC5 toolchain
> (actual version: "Red Hat Cross 6.1.1-2"):
>
> On 06/01/20 18:33, Bret Barkelew wrote:
>> https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2522&data=02%7C01%7CBret.Barkelew%40microsoft.com%7C40552c2a4896475ed9da08d8070c6f51%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637267097285334746&sdata=UEd%2FyUeixp5cq2jXwUQ68tIws9pbGBl0m9cpnrijaGc%3D&reserved=0<https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2522&data=02%7C01%7Cbret.barkelew%40microsoft.com%7C35bc0a0f5b704d509a4808d80715cd2c%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637267137524542472&sdata=JpZVvrk4J3uqv8z5uCcR9DDLXSu0eL4Sm2UtffT9N3U%3D&reserved=0>
>>
>> VariablePolicy is an updated interface to
>> replace VarLock and VarCheckProtocol.
>>
>> Add connective code to publish the VariablePolicy protocol
>> and wire it to either the SMM communication interface
>> or directly into the VariablePolicyLib business logic.
>>
>> Cc: Jian J Wang <jian.j.wang@intel.com>
>> Cc: Hao A Wu <hao.a.wu@intel.com>
>> Cc: Liming Gao <liming.gao@intel.com>
>> Cc: Bret Barkelew <brbarkel@microsoft.com>
>> Signed-off-by: Bret Barkelew <brbarkel@microsoft.com>
>> ---
>> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c | 53 ++
>> MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c | 642 ++++++++++++++++++++
>> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 14 +
>> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf | 2 +
>> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf | 3 +
>> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf | 10 +
>> 6 files changed, 724 insertions(+)
>>
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
>> index 7d2b6c8e1fad..d404d4763e54 100644
>> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
>> @@ -5,18 +5,34 @@
>> Copyright (C) 2013, Red Hat, Inc.
>> Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>> (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
>> +Copyright (c) Microsoft Corporation.
>> SPDX-License-Identifier: BSD-2-Clause-Patent
>>
>> **/
>>
>> #include "Variable.h"
>>
>> +#include <Protocol/VariablePolicy.h>
>> +#include <Library/VariablePolicyLib.h>
>> +
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolIsVariablePolicyEnabled (
>> + OUT BOOLEAN *State
>> + );
>> +
>> EFI_HANDLE mHandle = NULL;
>> EFI_EVENT mVirtualAddressChangeEvent = NULL;
>> VOID *mFtwRegistration = NULL;
>> VOID ***mVarCheckAddressPointer = NULL;
>> UINTN mVarCheckAddressPointerCount = 0;
>> EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock = { VariableLockRequestToLock };
>> +EDKII_VARIABLE_POLICY_PROTOCOL mVariablePolicyProtocol = { EDKII_VARIABLE_POLICY_PROTOCOL_REVISION,
>> + DisableVariablePolicy,
>> + ProtocolIsVariablePolicyEnabled,
>> + RegisterVariablePolicy,
>
> (1) "error: initialization from incompatible pointer type [-Werror]"
>
> That's because RegisterVariablePolicy() has the following prototype
> (from "MdeModulePkg/Include/Library/VariablePolicyLib.h"):
>
> EFI_STATUS
> EFIAPI
> RegisterVariablePolicy (
> IN CONST VARIABLE_POLICY_ENTRY *NewPolicy
> );
>
> whereas "EDKII_VARIABLE_POLICY_PROTOCOL.RegisterVariablePolicy" has the
> following type (from "MdeModulePkg/Include/Protocol/VariablePolicy.h"):
>
> typedef
> EFI_STATUS
> (EFIAPI *REGISTER_VARIABLE_POLICY)(
> IN VARIABLE_POLICY_ENTRY *PolicyEntry
> );
>
> The latter does not take a pointer to CONST.
>
> Now, assuming that "CONST is good", I locally modified the
> REGISTER_VARIABLE_POLICY typedef, just to see if that would allow the
> build to complete. It fixes problem (1), but it triggers a different
> problem:
>
>
>> + DumpVariablePolicy,
>> + LockVariablePolicy };
>> EDKII_VAR_CHECK_PROTOCOL mVarCheck = { VarCheckRegisterSetVariableCheckHandler,
>> VarCheckVariablePropertySet,
>> VarCheckVariablePropertyGet };
>> @@ -303,6 +319,8 @@ OnReadyToBoot (
>> }
>> }
>>
>> + ASSERT_EFI_ERROR (LockVariablePolicy ());
>> +
>> gBS->CloseEvent (Event);
>> }
>>
>> @@ -466,6 +484,28 @@ FtwNotificationEvent (
>> }
>>
>>
>> +/**
>> + This API function returns whether or not the policy engine is
>> + currently being enforced.
>> +
>> + @param[out] State Pointer to a return value for whether the policy enforcement
>> + is currently enabled.
>> +
>> + @retval EFI_SUCCESS
>> + @retval Others An error has prevented this command from completing.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolIsVariablePolicyEnabled (
>> + OUT BOOLEAN *State
>> + )
>> +{
>> + *State = IsVariablePolicyEnabled ();
>> + return EFI_SUCCESS;
>> +}
>> +
>> +
>> /**
>> Variable Driver main entry point. The Variable driver places the 4 EFI
>> runtime services in the EFI System Table and installs arch protocols
>> @@ -576,6 +616,19 @@ VariableServiceInitialize (
>> );
>> ASSERT_EFI_ERROR (Status);
>>
>> + // Register and initialize the VariablePolicy engine.
>> + Status = InitVariablePolicyLib (VariableServiceGetVariable);
>> + ASSERT_EFI_ERROR (Status);
>> + Status = VarCheckRegisterSetVariableCheckHandler (ValidateSetVariable);
>> + ASSERT_EFI_ERROR (Status);
>> + Status = gBS->InstallMultipleProtocolInterfaces (
>> + &mHandle,
>> + &gEdkiiVariablePolicyProtocolGuid,
>> + &mVariablePolicyProtocol,
>> + NULL
>> + );
>> + ASSERT_EFI_ERROR (Status);
>> +
>> return EFI_SUCCESS;
>> }
>>
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c
>> new file mode 100644
>> index 000000000000..3d799025983a
>> --- /dev/null
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c
>> @@ -0,0 +1,642 @@
>> +/** @file -- VariablePolicySmmDxe.c
>> +This protocol allows communication with Variable Policy Engine.
>> +
>> +Copyright (c) Microsoft Corporation.
>> +SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <Library/BaseLib.h>
>> +#include <Library/UefiLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/SafeIntLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +
>> +#include <Protocol/VariablePolicy.h>
>> +#include <Protocol/MmCommunication2.h>
>> +
>> +#include <Guid/VarCheckPolicyMmi.h>
>> +
>> +#include "Variable.h"
>> +
>> +EDKII_VARIABLE_POLICY_PROTOCOL mVariablePolicyProtocol;
>> +EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication;
>> +
>> +VOID *mMmCommunicationBuffer;
>> +UINTN mMmCommunicationBufferSize;
>> +EFI_LOCK mMmCommunicationLock;
>> +
>> +/**
>> + Internal helper function to consolidate communication method.
>> +
>> + @param[in,out] CommBuffer
>> + @param[in,out] CommSize Size of the CommBuffer.
>> +
>> + @retval EFI_STATUS Result from communication method.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +InternalMmCommunicate (
>> + IN OUT VOID *CommBuffer,
>> + IN OUT UINTN *CommSize
>> + )
>> +{
>> + EFI_STATUS Status;
>> + if (CommBuffer == NULL || CommSize == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> + Status = mMmCommunication->Communicate (mMmCommunication, CommBuffer, CommBuffer, CommSize);
>> + return Status;
>> +}
>> +
>> +
>> +/**
>> + This API function disables the variable policy enforcement. If it's
>> + already been called once, will return EFI_ALREADY_STARTED.
>> +
>> + @retval EFI_SUCCESS
>> + @retval EFI_ALREADY_STARTED Has already been called once this boot.
>> + @retval EFI_WRITE_PROTECTED Interface has been locked until reboot.
>> + @retval EFI_WRITE_PROTECTED Interface option is disabled by platform PCD.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolDisableVariablePolicy (
>> + VOID
>> + )
>> +{
>> + EFI_STATUS Status;
>> + EFI_MM_COMMUNICATE_HEADER *CommHeader;
>> + VAR_CHECK_POLICY_COMM_HEADER *PolicyHeader;
>> + UINTN BufferSize;
>> +
>> + // Check the PCD for convenience.
>> + // This would also be rejected by the lib, but why go to MM if we don't have to?
>> + if (!PcdGetBool (PcdAllowVariablePolicyEnforcementDisable)) {
>> + return EFI_WRITE_PROTECTED;
>> + }
>> +
>> + AcquireLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + // Set up the MM communication.
>> + BufferSize = mMmCommunicationBufferSize;
>> + CommHeader = mMmCommunicationBuffer;
>> + PolicyHeader = (VAR_CHECK_POLICY_COMM_HEADER*)&CommHeader->Data;
>> + CopyGuid( &CommHeader->HeaderGuid, &gVarCheckPolicyLibMmiHandlerGuid );
>> + CommHeader->MessageLength = BufferSize;
>> + PolicyHeader->Signature = VAR_CHECK_POLICY_COMM_SIG;
>> + PolicyHeader->Revision = VAR_CHECK_POLICY_COMM_REVISION;
>> + PolicyHeader->Command = VAR_CHECK_POLICY_COMMAND_DISABLE;
>> +
>> + Status = InternalMmCommunicate (CommHeader, &BufferSize);
>> + DEBUG(( DEBUG_VERBOSE, "%a - MmCommunication returned %r.\n", __FUNCTION__, Status ));
>> +
>> + ReleaseLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + return (EFI_ERROR( Status )) ? Status : PolicyHeader->Result;
>> +}
>> +
>> +
>> +/**
>> + This API function returns whether or not the policy engine is
>> + currently being enforced.
>> +
>> + @param[out] State Pointer to a return value for whether the policy enforcement
>> + is currently enabled.
>> +
>> + @retval EFI_SUCCESS
>> + @retval Others An error has prevented this command from completing.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolIsVariablePolicyEnabled (
>> + OUT BOOLEAN *State
>> + )
>> +{
>> + EFI_STATUS Status;
>> + EFI_MM_COMMUNICATE_HEADER *CommHeader;
>> + VAR_CHECK_POLICY_COMM_HEADER *PolicyHeader;
>> + VAR_CHECK_POLICY_COMM_IS_ENABLED_PARAMS *CommandParams;
>> + UINTN BufferSize;
>> +
>> + if (State == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + AcquireLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + // Set up the MM communication.
>> + BufferSize = mMmCommunicationBufferSize;
>> + CommHeader = mMmCommunicationBuffer;
>> + PolicyHeader = (VAR_CHECK_POLICY_COMM_HEADER*)&CommHeader->Data;
>> + CommandParams = (VAR_CHECK_POLICY_COMM_IS_ENABLED_PARAMS*)(PolicyHeader + 1);
>> + CopyGuid( &CommHeader->HeaderGuid, &gVarCheckPolicyLibMmiHandlerGuid );
>> + CommHeader->MessageLength = BufferSize;
>> + PolicyHeader->Signature = VAR_CHECK_POLICY_COMM_SIG;
>> + PolicyHeader->Revision = VAR_CHECK_POLICY_COMM_REVISION;
>> + PolicyHeader->Command = VAR_CHECK_POLICY_COMMAND_IS_ENABLED;
>> +
>> + Status = InternalMmCommunicate (CommHeader, &BufferSize);
>> + DEBUG(( DEBUG_VERBOSE, "%a - MmCommunication returned %r.\n", __FUNCTION__, Status ));
>> +
>> + if (!EFI_ERROR( Status )) {
>> + Status = PolicyHeader->Result;
>> + *State = CommandParams->State;
>> + }
>> +
>> + ReleaseLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + return Status;
>> +}
>> +
>> +
>> +/**
>> + This API function validates and registers a new policy with
>> + the policy enforcement engine.
>> +
>> + @param[in] NewPolicy Pointer to the incoming policy structure.
>> +
>> + @retval EFI_SUCCESS
>> + @retval EFI_INVALID_PARAMETER NewPolicy is NULL or is internally inconsistent.
>> + @retval EFI_ALREADY_STARTED An identical matching policy already exists.
>> + @retval EFI_WRITE_PROTECTED The interface has been locked until the next reboot.
>> + @retval EFI_UNSUPPORTED Policy enforcement has been disabled. No reason to add more policies.
>> + @retval EFI_ABORTED A calculation error has prevented this function from completing.
>> + @retval EFI_OUT_OF_RESOURCES Cannot grow the table to hold any more policies.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolRegisterVariablePolicy (
>> + IN VARIABLE_POLICY_ENTRY *NewPolicy
>> + )
>> +{
>> + EFI_STATUS Status;
>> + EFI_MM_COMMUNICATE_HEADER *CommHeader;
>> + VAR_CHECK_POLICY_COMM_HEADER *PolicyHeader;
>> + VOID *PolicyBuffer;
>> + UINTN BufferSize;
>> + UINTN RequiredSize;
>> +
>> + if (NewPolicy == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + // First, make sure that the required size does not exceed the capabilities
>> + // of the MmCommunication buffer.
>> + RequiredSize = OFFSET_OF(EFI_MM_COMMUNICATE_HEADER, Data) + sizeof(VAR_CHECK_POLICY_COMM_HEADER);
>> + Status = SafeUintnAdd( RequiredSize, NewPolicy->Size, &RequiredSize );
>> + if (EFI_ERROR( Status ) || RequiredSize > mMmCommunicationBufferSize) {
>> + DEBUG(( DEBUG_ERROR, "%a - Policy too large for buffer! %r, %d > %d \n", __FUNCTION__,
>> + Status, RequiredSize, mMmCommunicationBufferSize ));
>> + return EFI_OUT_OF_RESOURCES;
>> + }
>> +
>> + AcquireLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + // Set up the MM communication.
>> + BufferSize = mMmCommunicationBufferSize;
>> + CommHeader = mMmCommunicationBuffer;
>> + PolicyHeader = (VAR_CHECK_POLICY_COMM_HEADER*)&CommHeader->Data;
>> + PolicyBuffer = (VOID*)(PolicyHeader + 1);
>> + CopyGuid( &CommHeader->HeaderGuid, &gVarCheckPolicyLibMmiHandlerGuid );
>> + CommHeader->MessageLength = BufferSize;
>> + PolicyHeader->Signature = VAR_CHECK_POLICY_COMM_SIG;
>> + PolicyHeader->Revision = VAR_CHECK_POLICY_COMM_REVISION;
>> + PolicyHeader->Command = VAR_CHECK_POLICY_COMMAND_REGISTER;
>> +
>> + // Copy the policy into place. This copy is safe because we've already tested above.
>> + CopyMem( PolicyBuffer, NewPolicy, NewPolicy->Size );
>> +
>> + Status = InternalMmCommunicate (CommHeader, &BufferSize);
>> + DEBUG(( DEBUG_VERBOSE, "%a - MmCommunication returned %r.\n", __FUNCTION__, Status ));
>> +
>> + ReleaseLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + return (EFI_ERROR( Status )) ? Status : PolicyHeader->Result;
>> +}
>> +
>> +
>> +/**
>> + This helper function takes care of the overhead of formatting, sending, and interpreting
>> + the results for a single DumpVariablePolicy request.
>> +
>> + @param[in] PageRequested The page of the paginated results from MM. 0 for metadata.
>> + @param[out] TotalSize The total size of the entire buffer. Returned as part of metadata.
>> + @param[out] PageSize The size of the current page being returned. Not valid as part of metadata.
>> + @param[out] HasMore A flag indicating whether there are more pages after this one.
>> + @param[out] Buffer The start of the current page from MM.
>> +
>> + @retval EFI_SUCCESS Output params have been updated (either metadata or dump page).
>> + @retval EFI_INVALID_PARAMETER One of the output params is NULL.
>> + @retval Others Response from MM handler.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +DumpVariablePolicyHelper (
>> + IN UINT32 PageRequested,
>> + OUT UINT32 *TotalSize,
>> + OUT UINT32 *PageSize,
>> + OUT BOOLEAN *HasMore,
>> + OUT UINT8 **Buffer
>> + )
>> +{
>> + EFI_STATUS Status;
>> + EFI_MM_COMMUNICATE_HEADER *CommHeader;
>> + VAR_CHECK_POLICY_COMM_HEADER *PolicyHeader;
>> + VAR_CHECK_POLICY_COMM_DUMP_PARAMS *CommandParams;
>> + UINTN BufferSize;
>> +
>> + if (TotalSize == NULL || PageSize == NULL || HasMore == NULL || Buffer == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + // Set up the MM communication.
>> + BufferSize = mMmCommunicationBufferSize;
>> + CommHeader = mMmCommunicationBuffer;
>> + PolicyHeader = (VAR_CHECK_POLICY_COMM_HEADER*)&CommHeader->Data;
>> + CommandParams = (VAR_CHECK_POLICY_COMM_DUMP_PARAMS*)(PolicyHeader + 1);
>> + CopyGuid( &CommHeader->HeaderGuid, &gVarCheckPolicyLibMmiHandlerGuid );
>> + CommHeader->MessageLength = BufferSize;
>> + PolicyHeader->Signature = VAR_CHECK_POLICY_COMM_SIG;
>> + PolicyHeader->Revision = VAR_CHECK_POLICY_COMM_REVISION;
>> + PolicyHeader->Command = VAR_CHECK_POLICY_COMMAND_DUMP;
>> +
>> + CommandParams->PageRequested = PageRequested;
>> +
>> + Status = InternalMmCommunicate (CommHeader, &BufferSize);
>> + DEBUG(( DEBUG_VERBOSE, "%a - MmCommunication returned %r.\n", __FUNCTION__, Status ));
>> +
>> + if (!EFI_ERROR( Status )) {
>> + Status = PolicyHeader->Result;
>> + *TotalSize = CommandParams->TotalSize;
>> + *PageSize = CommandParams->PageSize;
>> + *HasMore = CommandParams->HasMore;
>> + *Buffer = (UINT8*)(CommandParams + 1);
>> + }
>> +
>> + return Status;
>> +}
>> +
>> +
>> +/**
>> + This API function will dump the entire contents of the variable policy table.
>> +
>> + Similar to GetVariable, the first call can be made with a 0 size and it will return
>> + the size of the buffer required to hold the entire table.
>> +
>> + @param[out] Policy Pointer to the policy buffer. Can be NULL if Size is 0.
>> + @param[in,out] Size On input, the size of the output buffer. On output, the size
>> + of the data returned.
>> +
>> + @retval EFI_SUCCESS Policy data is in the output buffer and Size has been updated.
>> + @retval EFI_INVALID_PARAMETER Size is NULL, or Size is non-zero and Policy is NULL.
>> + @retval EFI_BUFFER_TOO_SMALL Size is insufficient to hold policy. Size updated with required size.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolDumpVariablePolicy (
>> + OUT UINT8 *Policy OPTIONAL,
>> + IN OUT UINT32 *Size
>> + )
>> +{
>> + EFI_STATUS Status;
>> + UINT8 *Source;
>> + UINT8 *Destination;
>> + UINT32 PolicySize;
>> + UINT32 PageSize;
>> + BOOLEAN HasMore;
>> + UINT32 PageIndex;
>> +
>> + if (Size == NULL || (*Size > 0 && Policy == NULL)) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + AcquireLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + // Repeat this whole process until we either have a failure case or get the entire buffer.
>> + do {
>> + // First, we must check the zero page to determine the buffer size and
>> + // reset the internal state.
>> + PolicySize = 0;
>> + PageSize = 0;
>> + HasMore = FALSE;
>> + Status = DumpVariablePolicyHelper (0, &PolicySize, &PageSize, &HasMore, &Source);
>> + if (EFI_ERROR (Status)) {
>> + break;
>> + }
>> +
>> + // If we're good, we can at least check the required size now.
>> + if (*Size < PolicySize) {
>> + *Size = PolicySize;
>> + Status = EFI_BUFFER_TOO_SMALL;
>> + break;
>> + }
>> +
>> + // On further thought, let's update the size either way.
>> + *Size = PolicySize;
>> + // And get ready to ROCK.
>> + Destination = Policy;
>> +
>> + // Keep looping and copying until we're either done or freak out.
>> + for (PageIndex = 1; !EFI_ERROR (Status) && HasMore && PageIndex < MAX_UINT32; PageIndex++) {
>> + Status = DumpVariablePolicyHelper (PageIndex, &PolicySize, &PageSize, &HasMore, &Source);
>> + if (!EFI_ERROR (Status)) {
>> + CopyMem (Destination, Source, PageSize);
>> + Destination += PageSize;
>> + }
>> + }
>> +
>> + // Next, we check to see whether
>> + } while (Status == EFI_TIMEOUT);
>> +
>> + ReleaseLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + // There's currently no use for this, but it shouldn't be hard to implement.
>> + return Status;
>> +}
>> +
>> +
>> +/**
>> + This API function locks the interface so that no more policy updates
>> + can be performed or changes made to the enforcement until the next boot.
>> +
>> + @retval EFI_SUCCESS
>> + @retval Others An error has prevented this command from completing.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +ProtocolLockVariablePolicy (
>> + VOID
>> + )
>> +{
>> + EFI_STATUS Status;
>> + EFI_MM_COMMUNICATE_HEADER *CommHeader;
>> + VAR_CHECK_POLICY_COMM_HEADER *PolicyHeader;
>> + UINTN BufferSize;
>> +
>> + AcquireLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + // Set up the MM communication.
>> + BufferSize = mMmCommunicationBufferSize;
>> + CommHeader = mMmCommunicationBuffer;
>> + PolicyHeader = (VAR_CHECK_POLICY_COMM_HEADER*)&CommHeader->Data;
>> + CopyGuid( &CommHeader->HeaderGuid, &gVarCheckPolicyLibMmiHandlerGuid );
>> + CommHeader->MessageLength = BufferSize;
>> + PolicyHeader->Signature = VAR_CHECK_POLICY_COMM_SIG;
>> + PolicyHeader->Revision = VAR_CHECK_POLICY_COMM_REVISION;
>> + PolicyHeader->Command = VAR_CHECK_POLICY_COMMAND_LOCK;
>> +
>> + Status = InternalMmCommunicate (CommHeader, &BufferSize);
>> + DEBUG(( DEBUG_VERBOSE, "%a - MmCommunication returned %r.\n", __FUNCTION__, Status ));
>> +
>> + ReleaseLockOnlyAtBootTime (&mMmCommunicationLock);
>> +
>> + return (EFI_ERROR( Status )) ? Status : PolicyHeader->Result;
>> +}
>> +
>> +
>> +/**
>> + This helper function locates the shared comm buffer and assigns it to input pointers.
>> +
>> + @param[in,out] BufferSize On input, the minimum buffer size required INCLUDING the MM communicate header.
>> + On output, the size of the matching buffer found.
>> + @param[out] LocatedBuffer A pointer to the matching buffer.
>> +
>> + @retval EFI_SUCCESS
>> + @retval EFI_INVALID_PARAMETER One of the output pointers was NULL.
>> + @retval EFI_OUT_OF_RESOURCES Not enough memory to allocate a comm buffer.
>> +
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +InitMmCommonCommBuffer (
>> + IN OUT UINTN *BufferSize,
>> + OUT VOID **LocatedBuffer
>> + )
>> +{
>> + EFI_STATUS Status;
>> +
>> + Status = EFI_SUCCESS;
>> +
>> + // Make sure that we're working with good pointers.
>> + if (BufferSize == NULL || LocatedBuffer == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + // Allocate the runtime memory for the comm buffer.
>> + *LocatedBuffer = AllocateRuntimePool (*BufferSize);
>> + if (*LocatedBuffer == NULL) {
>> + Status = EFI_OUT_OF_RESOURCES;
>> + *BufferSize = 0;
>> + }
>> +
>> + EfiInitializeLock (&mMmCommunicationLock, TPL_NOTIFY);
>> +
>> + return Status;
>> +}
>> +
>> +
>> +/**
>> + This helper is responsible for telemetry and any other actions that
>> + need to be taken if the VariablePolicy fails to lock.
>> +
>> + NOTE: It's possible that parts of this handling will need to become
>> + part of a platform policy.
>> +
>> + @param[in] FailureStatus The failure that was reported by LockVariablePolicy
>> +
>> +**/
>> +STATIC
>> +VOID
>> +VariablePolicyHandleFailureToLock (
>> + IN EFI_STATUS FailureStatus
>> + )
>> +{
>> + // For now, there's no agreed-upon policy for this.
>> + return;
>> +}
>> +
>> +
>> +/**
>> + ReadyToBoot Callback
>> + Lock the VariablePolicy interface if it hasn't already been locked.
>> +
>> + @param[in] Event Event whose notification function is being invoked
>> + @param[in] Context Pointer to the notification function's context
>> +
>> +**/
>> +STATIC
>> +VOID
>> +EFIAPI
>> +LockPolicyInterfaceAtReadyToBoot (
>> + IN EFI_EVENT Event,
>> + IN VOID *Context
>> + )
>> +{
>> + EFI_STATUS Status;
>> +
>> + Status = ProtocolLockVariablePolicy();
>> +
>> + if (EFI_ERROR( Status )) {
>> + VariablePolicyHandleFailureToLock( Status );
>> + }
>> + else {
>> + gBS->CloseEvent( Event );
>> + }
>> +
>> +}
>> +
>> +
>> +/**
>> + Convert internal pointer addresses to virtual addresses.
>> +
>> + @param[in] Event Event whose notification function is being invoked.
>> + @param[in] Context The pointer to the notification function's context, which
>> + is implementation-dependent.
>> +**/
>> +STATIC
>> +VOID
>> +EFIAPI
>> +VariablePolicyVirtualAddressCallback (
>> + IN EFI_EVENT Event,
>> + IN VOID *Context
>> + )
>> +{
>> + EfiConvertPointer (0, (VOID **)&mMmCommunication);
>> + EfiConvertPointer (0, (VOID **)&mMmCommunicationBuffer);
>> +}
>> +
>> +
>> +/**
>> + The driver's entry point.
>> +
>> + @param[in] ImageHandle The firmware allocated handle for the EFI image.
>> + @param[in] SystemTable A pointer to the EFI System Table.
>> +
>> + @retval EFI_SUCCESS The entry point executed successfully.
>> + @retval other Some error occured when executing this entry point.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +VariablePolicySmmDxeMain (
>> + IN EFI_HANDLE ImageHandle,
>> + IN EFI_SYSTEM_TABLE *SystemTable
>> + )
>> +{
>> + EFI_STATUS Status;
>> + BOOLEAN ProtocolInstalled;
>> + BOOLEAN CallbackRegistered;
>> + BOOLEAN VirtualAddressChangeRegistered;
>> + EFI_EVENT ReadyToBootEvent;
>> + EFI_EVENT VirtualAddressChangeEvent;
>> +
>> + Status = EFI_SUCCESS;
>> + ProtocolInstalled = FALSE;
>> + CallbackRegistered = FALSE;
>> + VirtualAddressChangeRegistered = FALSE;
>> +
>> + // Update the minimum buffer size.
>> + mMmCommunicationBufferSize = VAR_CHECK_POLICY_MM_COMM_BUFFER_SIZE;
>> + // Locate the shared comm buffer to use for sending MM commands.
>> + Status = InitMmCommonCommBuffer( &mMmCommunicationBufferSize, &mMmCommunicationBuffer );
>> + if (EFI_ERROR( Status )) {
>> + DEBUG((DEBUG_ERROR, "%a - Failed to locate a viable MM comm buffer! %r\n", __FUNCTION__, Status));
>> + ASSERT_EFI_ERROR( Status );
>> + return Status;
>> + }
>> +
>> + // Locate the MmCommunication protocol.
>> + Status = gBS->LocateProtocol( &gEfiMmCommunication2ProtocolGuid, NULL, (VOID**)&mMmCommunication );
>> + if (EFI_ERROR( Status )) {
>> + DEBUG((DEBUG_ERROR, "%a - Failed to locate MmCommunication protocol! %r\n", __FUNCTION__, Status));
>> + ASSERT_EFI_ERROR( Status );
>> + return Status;
>> + }
>> +
>> + // Configure the VariablePolicy protocol structure.
>> + mVariablePolicyProtocol.Revision = EDKII_VARIABLE_POLICY_PROTOCOL_REVISION;
>> + mVariablePolicyProtocol.DisableVariablePolicy = ProtocolDisableVariablePolicy;
>> + mVariablePolicyProtocol.IsVariablePolicyEnabled = ProtocolIsVariablePolicyEnabled;
>> + mVariablePolicyProtocol.RegisterVariablePolicy = ProtocolRegisterVariablePolicy;
>
> (2) "error: assignment from incompatible pointer type [-Werror]"
>
> Because, with my local modification for (1), the LHS now takes a
> pointer-to-CONST, but the RHS is declared (in the present patch) as
>
> STATIC
> EFI_STATUS
> EFIAPI
> ProtocolRegisterVariablePolicy (
> IN VARIABLE_POLICY_ENTRY *NewPolicy
> )
>
> So I modified this too, to take a pointer-to-CONST. That allowed the
> builds to complete.
>
> Therefore I suggest one of the following:
>
> (a) If CONST is not important in the RegisterVariablePolicy() lib class
> API, then please remove CONST from there (and the implementation(s) of
> that function).
>
> (b) Alternatively, if CONST is preferred in the library, then
>
> (b1) please squash the following hunk:
>
>> diff --git a/MdeModulePkg/Include/Protocol/VariablePolicy.h b/MdeModulePkg/Include/Protocol/VariablePolicy.h
>> index 30d6c155ae6a..83b6a999df07 100644
>> --- a/MdeModulePkg/Include/Protocol/VariablePolicy.h
>> +++ b/MdeModulePkg/Include/Protocol/VariablePolicy.h
>> @@ -102,7 +102,7 @@ EFI_STATUS
>> typedef
>> EFI_STATUS
>> (EFIAPI *REGISTER_VARIABLE_POLICY)(
>> - IN VARIABLE_POLICY_ENTRY *PolicyEntry
>> + IN CONST VARIABLE_POLICY_ENTRY *PolicyEntry
>> );
>>
>> /**
>
> into patch "MdeModulePkg: Define the VariablePolicy protocol interface".
>
> (b2) And please squash the following hunk:
>
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c
>> index 3d799025983a..e2d4cf4cec1a 100644
>> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c
>> @@ -176,7 +176,7 @@ STATIC
>> EFI_STATUS
>> EFIAPI
>> ProtocolRegisterVariablePolicy (
>> - IN VARIABLE_POLICY_ENTRY *NewPolicy
>> + IN CONST VARIABLE_POLICY_ENTRY *NewPolicy
>> )
>> {
>> EFI_STATUS Status;
>
> into the present patch.
>
> I've used (b1)+(b2) locally, and those together allow the builds to
> complete.
>
>
> Now, I wonder why the GCC / OVMF build(s) in the github.com CI did not
> report this problem. According to the C99 standard, "6.7.5.3 Function
> declarators (including prototypes)", paragraph 15:
>
> For two function types to be compatible, both shall specify compatible
> return types. [...] Moreover, the parameter type lists, if both are
> present, shall agree in the number of parameters and in use of the
> ellipsis terminator; corresponding parameters shall have compatible
> types. [...]
>
> Furthermore, from "6.7.5.1 Pointer declarators", paragraph 2:
>
> For two pointer types to be compatible, both shall be identically
> qualified and both shall be pointers to compatible types.
>
> Yet further, from "6.5.16.1 Simple assignment", paragraph 1:
>
> One of the following shall hold:
>
> [...]
>
> - both operands are pointers to qualified or unqualified versions of
> compatible types, and the type pointed to by the left has all the
> qualifiers of the type pointed to by the right;
>
> [...]
>
> So the thought process is:
>
> - "mVariablePolicyProtocol.RegisterVariablePolicy" has type
>
> EFI_STATUS (EFIAPI *)( VARIABLE_POLICY_ENTRY *)
>
> while a pointer to RegisterVariablePolicy(), from the library, has
> type
>
> EFI_STATUS (EFIAPI *)(const VARIABLE_POLICY_ENTRY *)
>
> For the assignment, these need to be compatible, per 6.5.16.1p1.
>
> Are they compatible?
>
> - Per 6.7.5.1p2, that depends on whether the pointed-to function types
> are compatible.
>
> Are the pointed-to function types compatible?
>
> - Per 6.7.5.3p15, that depends on whether (VARIABLE_POLICY_ENTRY *) and
> (const VARIABLE_POLICY_ENTRY *) are compatible.
>
> Are those pointer types compatible?
>
> - They're not, based on 6.7.5.1p2 -- they are not identically qualified.
>
> So IMO (according to the language standard), the code should have been
> flagged by MSVC too; but more importantly, I don't understand why the
> GCC5 / Ubuntu builds succeeded in CI.
>
> Thanks!
> Laszlo
>
>
>> + mVariablePolicyProtocol.DumpVariablePolicy = ProtocolDumpVariablePolicy;
>> + mVariablePolicyProtocol.LockVariablePolicy = ProtocolLockVariablePolicy;
>> +
>> + // Register all the protocols and return the status.
>> + Status = gBS->InstallMultipleProtocolInterfaces( &ImageHandle,
>> + &gEdkiiVariablePolicyProtocolGuid, &mVariablePolicyProtocol,
>> + NULL );
>> + if (EFI_ERROR( Status )) {
>> + DEBUG(( DEBUG_ERROR, "%a - Failed to install protocol! %r\n", __FUNCTION__, Status ));
>> + goto Exit;
>> + }
>> + else {
>> + ProtocolInstalled = TRUE;
>> + }
>> +
>> + //
>> + // Register a callback for ReadyToBoot so that the interface is at least locked before
>> + // dispatching any bootloaders or UEFI apps.
>> + Status = gBS->CreateEventEx( EVT_NOTIFY_SIGNAL,
>> + TPL_CALLBACK,
>> + LockPolicyInterfaceAtReadyToBoot,
>> + NULL,
>> + &gEfiEventReadyToBootGuid,
>> + &ReadyToBootEvent );
>> + if (EFI_ERROR( Status )) {
>> + DEBUG(( DEBUG_ERROR, "%a - Failed to create ReadyToBoot event! %r\n", __FUNCTION__, Status ));
>> + goto Exit;
>> + }
>> + else {
>> + CallbackRegistered = TRUE;
>> + }
>> +
>> + //
>> + // Register a VirtualAddressChange callback for the MmComm protocol and Comm buffer.
>> + Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL,
>> + TPL_NOTIFY,
>> + VariablePolicyVirtualAddressCallback,
>> + NULL,
>> + &gEfiEventVirtualAddressChangeGuid,
>> + &VirtualAddressChangeEvent);
>> + if (EFI_ERROR( Status )) {
>> + DEBUG(( DEBUG_ERROR, "%a - Failed to create VirtualAddressChange event! %r\n", __FUNCTION__, Status ));
>> + goto Exit;
>> + }
>> + else {
>> + VirtualAddressChangeRegistered = TRUE;
>> + }
>> +
>> +
>> +Exit:
>> + //
>> + // If we're about to return a failed status (and unload this driver), we must first undo anything that
>> + // has been successfully done.
>> + if (EFI_ERROR( Status )) {
>> + if (ProtocolInstalled) {
>> + gBS->UninstallProtocolInterface( &ImageHandle, &gEdkiiVariablePolicyProtocolGuid, &mVariablePolicyProtocol );
>> + }
>> + if (CallbackRegistered) {
>> + gBS->CloseEvent( ReadyToBootEvent );
>> + }
>> + if (VirtualAddressChangeRegistered) {
>> + gBS->CloseEvent( VirtualAddressChangeEvent );
>> + }
>> + }
>> +
>> + return Status;
>> +}
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c
>> index 663a1aaa128f..c47e614d81f4 100644
>> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c
>> @@ -65,6 +65,17 @@ EFI_LOCK mVariableServicesLock;
>> EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock;
>> EDKII_VAR_CHECK_PROTOCOL mVarCheck;
>>
>> +/**
>> + The logic to initialize the VariablePolicy engine is in its own file.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +VariablePolicySmmDxeMain (
>> + IN EFI_HANDLE ImageHandle,
>> + IN EFI_SYSTEM_TABLE *SystemTable
>> + );
>> +
>> /**
>> Some Secure Boot Policy Variable may update following other variable changes(SecureBoot follows PK change, etc).
>> Record their initial State when variable write service is ready.
>> @@ -1796,6 +1807,9 @@ VariableSmmRuntimeInitialize (
>> &mVirtualAddressChangeEvent
>> );
>>
>> + // Initialize the VariablePolicy protocol and engine.
>> + VariablePolicySmmDxeMain (ImageHandle, SystemTable);
>> +
>> return EFI_SUCCESS;
>> }
>>
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
>> index ceea5d1ff9ac..48ac167906f7 100644
>> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
>> @@ -10,6 +10,7 @@
>> # buffer overflow or integer overflow.
>> #
>> # Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>> +# Copyright (c) Microsoft Corporation.
>> # SPDX-License-Identifier: BSD-2-Clause-Patent
>> #
>> ##
>> @@ -69,6 +70,7 @@ [LibraryClasses]
>> TpmMeasurementLib
>> AuthVariableLib
>> VarCheckLib
>> + VariablePolicyLib
>>
>> [Protocols]
>> gEfiFirmwareVolumeBlockProtocolGuid ## CONSUMES
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
>> index bc3033588d40..bbc8d2080193 100644
>> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf
>> @@ -19,6 +19,7 @@
>> # the authentication service provided in this driver will be broken, and the behavior is undefined.
>> #
>> # Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
>> +# Copyright (c) Microsoft Corporation.
>> # SPDX-License-Identifier: BSD-2-Clause-Patent
>> #
>> ##
>> @@ -78,6 +79,8 @@ [LibraryClasses]
>> AuthVariableLib
>> VarCheckLib
>> UefiBootServicesTableLib
>> + VariablePolicyLib
>> + VariablePolicyHelperLib
>>
>> [Protocols]
>> gEfiSmmFirmwareVolumeBlockProtocolGuid ## CONSUMES
>> diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
>> index 01564e4c5068..f217530b2985 100644
>> --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
>> +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf
>> @@ -14,6 +14,7 @@
>> # the authentication service provided in this driver will be broken, and the behavior is undefined.
>> #
>> # Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
>> +# Copyright (c) Microsoft Corporation.<BR>
>> # SPDX-License-Identifier: BSD-2-Clause-Patent
>> #
>> ##
>> @@ -42,6 +43,7 @@ [Sources]
>> VariableParsing.c
>> VariableParsing.h
>> Variable.h
>> + VariablePolicySmmDxe.c
>>
>> [Packages]
>> MdePkg/MdePkg.dec
>> @@ -56,6 +58,8 @@ [LibraryClasses]
>> DxeServicesTableLib
>> UefiDriverEntryPoint
>> TpmMeasurementLib
>> + SafeIntLib
>> + PcdLib
>>
>> [Protocols]
>> gEfiVariableWriteArchProtocolGuid ## PRODUCES
>> @@ -67,11 +71,15 @@ [Protocols]
>> gEfiSmmVariableProtocolGuid
>> gEdkiiVariableLockProtocolGuid ## PRODUCES
>> gEdkiiVarCheckProtocolGuid ## PRODUCES
>> + gEdkiiVariablePolicyProtocolGuid ## PRODUCES
>>
>> [FeaturePcd]
>> gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache ## CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES
>>
>> +[Pcd]
>> + gEfiMdeModulePkgTokenSpaceGuid.PcdAllowVariablePolicyEnforcementDisable ## CONSUMES
>> +
>> [Guids]
>> ## PRODUCES ## GUID # Signature of Variable store header
>> ## CONSUMES ## GUID # Signature of Variable store header
>> @@ -99,6 +107,8 @@ [Guids]
>> ## SOMETIMES_CONSUMES ## Variable:L"dbt"
>> gEfiImageSecurityDatabaseGuid
>>
>> + gVarCheckPolicyLibMmiHandlerGuid
>> +
>> [Depex]
>> gEfiMmCommunication2ProtocolGuid
>>
>>
>
>
>
>
>
next prev parent reply other threads:[~2020-06-02 19:55 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-01 16:32 [PATCH v4 00/14] Add the VariablePolicy feature Bret Barkelew
2020-06-01 16:32 ` [PATCH v4 01/14] MdeModulePkg: Define the VariablePolicy protocol interface Bret Barkelew
2020-06-01 16:32 ` [PATCH v4 02/14] MdeModulePkg: Define the VariablePolicyLib Bret Barkelew
2020-06-01 16:32 ` [PATCH v4 03/14] MdeModulePkg: Define the VariablePolicyHelperLib Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 04/14] MdeModulePkg: Define the VarCheckPolicyLib and SMM interface Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 05/14] OvmfPkg: Add VariablePolicy engine to OvmfPkg platform Bret Barkelew
2020-06-02 15:48 ` [edk2-devel] " Laszlo Ersek
2020-06-01 16:33 ` [PATCH v4 06/14] EmulatorPkg: Add VariablePolicy engine to EmulatorPkg platform Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 07/14] ArmVirtPkg: Add VariablePolicy engine to ArmVirtPkg platform Bret Barkelew
2020-06-02 15:51 ` [edk2-devel] " Laszlo Ersek
2020-06-01 16:33 ` [PATCH v4 08/14] UefiPayloadPkg: Add VariablePolicy engine to UefiPayloadPkg platform Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 09/14] MdeModulePkg: Connect VariablePolicy business logic to VariableServices Bret Barkelew
2020-06-02 15:48 ` [edk2-devel] " Laszlo Ersek
2020-06-02 16:55 ` [EXTERNAL] " Bret Barkelew
[not found] ` <1614C86F19BEB5BC.13152@groups.io>
2020-06-02 18:17 ` Bret Barkelew
2020-06-02 19:54 ` Laszlo Ersek [this message]
2020-06-01 16:33 ` [PATCH v4 10/14] MdeModulePkg: Allow VariablePolicy state to delete protected variables Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 11/14] SecurityPkg: Allow VariablePolicy state to delete authenticated variables Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 12/14] MdeModulePkg: Change TCG MOR variables to use VariablePolicy Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 13/14] MdeModulePkg: Drop VarLock from RuntimeDxe variable driver Bret Barkelew
2020-06-01 16:33 ` [PATCH v4 14/14] MdeModulePkg: Add a shell-based functional test for VariablePolicy Bret Barkelew
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=823206aa-c87b-5498-bd61-b8bd9bb84d94@redhat.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