InitCommunicateBuffer() is really function to check the variable data size.\r
\r
Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) Microsoft Corporation.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
#include <PiDxe.h>\r
#include <Protocol/VariableWrite.h>\r
#include <Protocol/Variable.h>\r
-#include <Protocol/SmmCommunication.h>\r
+#include <Protocol/MmCommunication2.h>\r
#include <Protocol/SmmVariable.h>\r
#include <Protocol/VariableLock.h>\r
#include <Protocol/VarCheck.h>\r
#include <Library/DebugLib.h>\r
#include <Library/UefiLib.h>\r
#include <Library/BaseLib.h>\r
+#include <Library/MmUnblockMemoryLib.h>\r
\r
#include <Guid/EventGroup.h>\r
#include <Guid/SmmVariableCommon.h>\r
#include "PrivilegePolymorphic.h"\r
#include "VariableParsing.h"\r
\r
-EFI_HANDLE mHandle = NULL;\r
-EFI_SMM_VARIABLE_PROTOCOL *mSmmVariable = NULL;\r
-EFI_EVENT mVirtualAddressChangeEvent = NULL;\r
-EFI_SMM_COMMUNICATION_PROTOCOL *mSmmCommunication = NULL;\r
-UINT8 *mVariableBuffer = NULL;\r
-UINT8 *mVariableBufferPhysical = NULL;\r
-VARIABLE_INFO_ENTRY *mVariableInfo = NULL;\r
-VARIABLE_STORE_HEADER *mVariableRuntimeHobCacheBuffer = NULL;\r
-VARIABLE_STORE_HEADER *mVariableRuntimeNvCacheBuffer = NULL;\r
-VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL;\r
-UINTN mVariableBufferSize;\r
-UINTN mVariableRuntimeHobCacheBufferSize;\r
-UINTN mVariableRuntimeNvCacheBufferSize;\r
-UINTN mVariableRuntimeVolatileCacheBufferSize;\r
-UINTN mVariableBufferPayloadSize;\r
-BOOLEAN mVariableRuntimeCachePendingUpdate;\r
-BOOLEAN mVariableRuntimeCacheReadLock;\r
-BOOLEAN mVariableAuthFormat;\r
-BOOLEAN mHobFlushComplete;\r
-EFI_LOCK mVariableServicesLock;\r
-EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock;\r
-EDKII_VAR_CHECK_PROTOCOL mVarCheck;\r
+EFI_HANDLE mHandle = NULL;\r
+EFI_SMM_VARIABLE_PROTOCOL *mSmmVariable = NULL;\r
+EFI_EVENT mVirtualAddressChangeEvent = NULL;\r
+EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2 = NULL;\r
+UINT8 *mVariableBuffer = NULL;\r
+UINT8 *mVariableBufferPhysical = NULL;\r
+VARIABLE_INFO_ENTRY *mVariableInfo = NULL;\r
+VARIABLE_STORE_HEADER *mVariableRuntimeHobCacheBuffer = NULL;\r
+VARIABLE_STORE_HEADER *mVariableRuntimeNvCacheBuffer = NULL;\r
+VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL;\r
+UINTN mVariableBufferSize;\r
+UINTN mVariableRuntimeHobCacheBufferSize;\r
+UINTN mVariableRuntimeNvCacheBufferSize;\r
+UINTN mVariableRuntimeVolatileCacheBufferSize;\r
+UINTN mVariableBufferPayloadSize;\r
+BOOLEAN mVariableRuntimeCachePendingUpdate;\r
+BOOLEAN mVariableRuntimeCacheReadLock;\r
+BOOLEAN mVariableAuthFormat;\r
+BOOLEAN mHobFlushComplete;\r
+EFI_LOCK mVariableServicesLock;\r
+EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock;\r
+EDKII_VAR_CHECK_PROTOCOL mVarCheck;\r
+\r
+/**\r
+ The logic to initialize the VariablePolicy engine is in its own file.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+VariablePolicySmmDxeMain (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ );\r
\r
/**\r
Some Secure Boot Policy Variable may update following other variable changes(SecureBoot follows PK change, etc).\r
**/\r
VOID\r
EFIAPI\r
-RecordSecureBootPolicyVarData(\r
+RecordSecureBootPolicyVarData (\r
VOID\r
);\r
\r
**/\r
VOID\r
AcquireLockOnlyAtBootTime (\r
- IN EFI_LOCK *Lock\r
+ IN EFI_LOCK *Lock\r
)\r
{\r
if (!EfiAtRuntime ()) {\r
**/\r
VOID\r
ReleaseLockOnlyAtBootTime (\r
- IN EFI_LOCK *Lock\r
+ IN EFI_LOCK *Lock\r
)\r
{\r
if (!EfiAtRuntime ()) {\r
**/\r
EFI_STATUS\r
InitVariableCache (\r
- OUT VARIABLE_STORE_HEADER **VariableCacheBuffer,\r
- IN OUT UINTN *TotalVariableCacheSize\r
+ OUT VARIABLE_STORE_HEADER **VariableCacheBuffer,\r
+ IN OUT UINTN *TotalVariableCacheSize\r
)\r
{\r
- VARIABLE_STORE_HEADER *VariableCacheStorePtr;\r
+ VARIABLE_STORE_HEADER *VariableCacheStorePtr;\r
+ EFI_STATUS Status;\r
\r
if (TotalVariableCacheSize == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (*TotalVariableCacheSize == 0) {\r
return EFI_SUCCESS;\r
}\r
- if (VariableCacheBuffer == NULL || *TotalVariableCacheSize < sizeof (VARIABLE_STORE_HEADER)) {\r
+\r
+ if ((VariableCacheBuffer == NULL) || (*TotalVariableCacheSize < sizeof (VARIABLE_STORE_HEADER))) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
*TotalVariableCacheSize = ALIGN_VALUE (*TotalVariableCacheSize, sizeof (UINT32));\r
\r
//\r
// Allocate NV Storage Cache and initialize it to all 1's (like an erased FV)\r
//\r
- *VariableCacheBuffer = (VARIABLE_STORE_HEADER *) AllocateRuntimePages (\r
- EFI_SIZE_TO_PAGES (*TotalVariableCacheSize)\r
- );\r
+ *VariableCacheBuffer = (VARIABLE_STORE_HEADER *)AllocateRuntimePages (\r
+ EFI_SIZE_TO_PAGES (*TotalVariableCacheSize)\r
+ );\r
if (*VariableCacheBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
+ //\r
+ // Request to unblock the newly allocated cache region to be accessible from inside MM\r
+ //\r
+ Status = MmUnblockMemoryRequest (\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)*VariableCacheBuffer,\r
+ EFI_SIZE_TO_PAGES (*TotalVariableCacheSize)\r
+ );\r
+ if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
VariableCacheStorePtr = *VariableCacheBuffer;\r
- SetMem32 ((VOID *) VariableCacheStorePtr, *TotalVariableCacheSize, (UINT32) 0xFFFFFFFF);\r
+ SetMem32 ((VOID *)VariableCacheStorePtr, *TotalVariableCacheSize, (UINT32)0xFFFFFFFF);\r
\r
- ZeroMem ((VOID *) VariableCacheStorePtr, sizeof (VARIABLE_STORE_HEADER));\r
- VariableCacheStorePtr->Size = (UINT32) *TotalVariableCacheSize;\r
- VariableCacheStorePtr->Format = VARIABLE_STORE_FORMATTED;\r
- VariableCacheStorePtr->State = VARIABLE_STORE_HEALTHY;\r
+ ZeroMem ((VOID *)VariableCacheStorePtr, sizeof (VARIABLE_STORE_HEADER));\r
+ VariableCacheStorePtr->Size = (UINT32)*TotalVariableCacheSize;\r
+ VariableCacheStorePtr->Format = VARIABLE_STORE_FORMATTED;\r
+ VariableCacheStorePtr->State = VARIABLE_STORE_HEALTHY;\r
\r
return EFI_SUCCESS;\r
}\r
**/\r
EFI_STATUS\r
InitCommunicateBuffer (\r
- OUT VOID **DataPtr OPTIONAL,\r
- IN UINTN DataSize,\r
- IN UINTN Function\r
+ OUT VOID **DataPtr OPTIONAL,\r
+ IN UINTN DataSize,\r
+ IN UINTN Function\r
)\r
{\r
- EFI_SMM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
- SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
-\r
+ EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
+ SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
\r
if (DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE > mVariableBufferSize) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) mVariableBuffer;\r
+ SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer;\r
CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
SmmCommunicateHeader->MessageLength = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;\r
\r
- SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+ SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
SmmVariableFunctionHeader->Function = Function;\r
if (DataPtr != NULL) {\r
*DataPtr = SmmVariableFunctionHeader->Data;\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Send the data in communicate buffer to SMM.\r
\r
**/\r
EFI_STATUS\r
SendCommunicateBuffer (\r
- IN UINTN DataSize\r
+ IN UINTN DataSize\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN CommSize;\r
- EFI_SMM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
- SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
+ EFI_STATUS Status;\r
+ UINTN CommSize;\r
+ EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
+ SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
\r
CommSize = DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;\r
- Status = mSmmCommunication->Communicate (mSmmCommunication, mVariableBufferPhysical, &CommSize);\r
+ Status = mMmCommunication2->Communicate (\r
+ mMmCommunication2,\r
+ mVariableBufferPhysical,\r
+ mVariableBuffer,\r
+ &CommSize\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
- SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) mVariableBuffer;\r
+ SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer;\r
SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
- return SmmVariableFunctionHeader->ReturnStatus;\r
+ return SmmVariableFunctionHeader->ReturnStatus;\r
}\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
VariableLockRequestToLock (\r
- IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This,\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid\r
+ IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This,\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN VariableNameSize;\r
- UINTN PayloadSize;\r
- SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE *VariableToLock;\r
+ EFI_STATUS Status;\r
+ UINTN VariableNameSize;\r
+ UINTN PayloadSize;\r
+ SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE *VariableToLock;\r
\r
- if (VariableName == NULL || VariableName[0] == 0 || VendorGuid == NULL) {\r
+ if ((VariableName == NULL) || (VariableName[0] == 0) || (VendorGuid == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+ AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
\r
//\r
// Init the communicate buffer. The buffer data size is:\r
// SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
//\r
PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE, Name) + VariableNameSize;\r
- Status = InitCommunicateBuffer ((VOID **) &VariableToLock, PayloadSize, SMM_VARIABLE_FUNCTION_LOCK_VARIABLE);\r
+ Status = InitCommunicateBuffer ((VOID **)&VariableToLock, PayloadSize, SMM_VARIABLE_FUNCTION_LOCK_VARIABLE);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (VariableToLock != NULL);\r
\r
CopyGuid (&VariableToLock->Guid, VendorGuid);\r
EFI_STATUS\r
EFIAPI\r
VarCheckRegisterSetVariableCheckHandler (\r
- IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER Handler\r
+ IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER Handler\r
)\r
{\r
return EFI_UNSUPPORTED;\r
EFI_STATUS\r
EFIAPI\r
VarCheckVariablePropertySet (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *Guid,\r
- IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
+ IN CHAR16 *Name,\r
+ IN EFI_GUID *Guid,\r
+ IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN VariableNameSize;\r
- UINTN PayloadSize;\r
- SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY *CommVariableProperty;\r
+ EFI_STATUS Status;\r
+ UINTN VariableNameSize;\r
+ UINTN PayloadSize;\r
+ SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY *CommVariableProperty;\r
\r
- if (Name == NULL || Name[0] == 0 || Guid == NULL) {\r
+ if ((Name == NULL) || (Name[0] == 0) || (Guid == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- VariableNameSize = StrSize (Name);\r
+ VariableNameSize = StrSize (Name);\r
CommVariableProperty = NULL;\r
\r
//\r
// SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
//\r
PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) + VariableNameSize;\r
- Status = InitCommunicateBuffer ((VOID **) &CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET);\r
+ Status = InitCommunicateBuffer ((VOID **)&CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (CommVariableProperty != NULL);\r
\r
CopyGuid (&CommVariableProperty->Guid, Guid);\r
EFI_STATUS\r
EFIAPI\r
VarCheckVariablePropertyGet (\r
- IN CHAR16 *Name,\r
- IN EFI_GUID *Guid,\r
- OUT VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
+ IN CHAR16 *Name,\r
+ IN EFI_GUID *Guid,\r
+ OUT VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN VariableNameSize;\r
- UINTN PayloadSize;\r
- SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY *CommVariableProperty;\r
+ EFI_STATUS Status;\r
+ UINTN VariableNameSize;\r
+ UINTN PayloadSize;\r
+ SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY *CommVariableProperty;\r
\r
- if (Name == NULL || Name[0] == 0 || Guid == NULL) {\r
+ if ((Name == NULL) || (Name[0] == 0) || (Guid == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- VariableNameSize = StrSize (Name);\r
+ VariableNameSize = StrSize (Name);\r
CommVariableProperty = NULL;\r
\r
//\r
// SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
//\r
PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) + VariableNameSize;\r
- Status = InitCommunicateBuffer ((VOID **) &CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET);\r
+ Status = InitCommunicateBuffer ((VOID **)&CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (CommVariableProperty != NULL);\r
\r
CopyGuid (&CommVariableProperty->Guid, Guid);\r
if (mVariableRuntimeCachePendingUpdate) {\r
SyncRuntimeCache ();\r
}\r
+\r
ASSERT (!mVariableRuntimeCachePendingUpdate);\r
\r
//\r
// The HOB variable data may have finished being flushed in the runtime cache sync update\r
//\r
- if (mHobFlushComplete && mVariableRuntimeHobCacheBuffer != NULL) {\r
+ if (mHobFlushComplete && (mVariableRuntimeHobCacheBuffer != NULL)) {\r
if (!EfiAtRuntime ()) {\r
FreePages (mVariableRuntimeHobCacheBuffer, EFI_SIZE_TO_PAGES (mVariableRuntimeHobCacheBufferSize));\r
}\r
+\r
mVariableRuntimeHobCacheBuffer = NULL;\r
}\r
}\r
**/\r
EFI_STATUS\r
FindVariableInRuntimeCache (\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINT32 *Attributes OPTIONAL,\r
- IN OUT UINTN *DataSize,\r
- OUT VOID *Data OPTIONAL\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid,\r
+ OUT UINT32 *Attributes OPTIONAL,\r
+ IN OUT UINTN *DataSize,\r
+ OUT VOID *Data OPTIONAL\r
)\r
{\r
EFI_STATUS Status;\r
\r
Status = EFI_NOT_FOUND;\r
\r
- if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
+ if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ ZeroMem (&RtPtrTrack, sizeof (RtPtrTrack));\r
+\r
//\r
// The UEFI specification restricts Runtime Services callers from invoking the same or certain other Runtime Service\r
// functions prior to completion and return from a previous Runtime Service call. These restrictions prevent\r
VariableStoreList[VariableStoreTypeHob] = mVariableRuntimeHobCacheBuffer;\r
VariableStoreList[VariableStoreTypeNv] = mVariableRuntimeNvCacheBuffer;\r
\r
- for (StoreType = (VARIABLE_STORE_TYPE) 0; StoreType < VariableStoreTypeMax; StoreType++) {\r
+ for (StoreType = (VARIABLE_STORE_TYPE)0; StoreType < VariableStoreTypeMax; StoreType++) {\r
if (VariableStoreList[StoreType] == NULL) {\r
continue;\r
}\r
\r
RtPtrTrack.StartPtr = GetStartPointer (VariableStoreList[StoreType]);\r
- RtPtrTrack.EndPtr = GetEndPointer (VariableStoreList[StoreType]);\r
- RtPtrTrack.Volatile = (BOOLEAN) (StoreType == VariableStoreTypeVolatile);\r
+ RtPtrTrack.EndPtr = GetEndPointer (VariableStoreList[StoreType]);\r
+ RtPtrTrack.Volatile = (BOOLEAN)(StoreType == VariableStoreTypeVolatile);\r
\r
Status = FindVariableEx (VariableName, VendorGuid, FALSE, &RtPtrTrack, mVariableAuthFormat);\r
if (!EFI_ERROR (Status)) {\r
}\r
\r
CopyMem (Data, GetVariableDataPtr (RtPtrTrack.CurrPtr, mVariableAuthFormat), TempDataSize);\r
- if (Attributes != NULL) {\r
- *Attributes = RtPtrTrack.CurrPtr->Attributes;\r
- }\r
-\r
*DataSize = TempDataSize;\r
\r
UpdateVariableInfo (VariableName, VendorGuid, RtPtrTrack.Volatile, TRUE, FALSE, FALSE, TRUE, &mVariableInfo);\r
goto Done;\r
} else {\r
*DataSize = TempDataSize;\r
- Status = EFI_BUFFER_TOO_SMALL;\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
goto Done;\r
}\r
}\r
}\r
\r
Done:\r
+ if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) {\r
+ if ((Attributes != NULL) && (RtPtrTrack.CurrPtr != NULL)) {\r
+ *Attributes = RtPtrTrack.CurrPtr->Attributes;\r
+ }\r
+ }\r
+\r
mVariableRuntimeCacheReadLock = FALSE;\r
\r
return Status;\r
**/\r
EFI_STATUS\r
FindVariableInSmm (\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINT32 *Attributes OPTIONAL,\r
- IN OUT UINTN *DataSize,\r
- OUT VOID *Data OPTIONAL\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid,\r
+ OUT UINT32 *Attributes OPTIONAL,\r
+ IN OUT UINTN *DataSize,\r
+ OUT VOID *Data OPTIONAL\r
)\r
{\r
EFI_STATUS Status;\r
UINTN TempDataSize;\r
UINTN VariableNameSize;\r
\r
- if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
+ if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- TempDataSize = *DataSize;\r
- VariableNameSize = StrSize (VariableName);\r
- SmmVariableHeader = NULL;\r
+ TempDataSize = *DataSize;\r
+ VariableNameSize = StrSize (VariableName);\r
+ SmmVariableHeader = NULL;\r
\r
//\r
// If VariableName exceeds SMM payload limit. Return failure\r
//\r
TempDataSize = mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) - VariableNameSize;\r
}\r
+\r
PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + VariableNameSize + TempDataSize;\r
\r
- Status = InitCommunicateBuffer ((VOID **) &SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_GET_VARIABLE);\r
+ Status = InitCommunicateBuffer ((VOID **)&SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_GET_VARIABLE);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (SmmVariableHeader != NULL);\r
\r
CopyGuid (&SmmVariableHeader->Guid, VendorGuid);\r
- SmmVariableHeader->DataSize = TempDataSize;\r
- SmmVariableHeader->NameSize = VariableNameSize;\r
+ SmmVariableHeader->DataSize = TempDataSize;\r
+ SmmVariableHeader->NameSize = VariableNameSize;\r
if (Attributes == NULL) {\r
SmmVariableHeader->Attributes = 0;\r
} else {\r
SmmVariableHeader->Attributes = *Attributes;\r
}\r
+\r
CopyMem (SmmVariableHeader->Name, VariableName, SmmVariableHeader->NameSize);\r
\r
//\r
//\r
// Get data from SMM.\r
//\r
- if (Status == EFI_SUCCESS || Status == EFI_BUFFER_TOO_SMALL) {\r
+ if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) {\r
//\r
// SMM CommBuffer DataSize can be a trimed value\r
// Only update DataSize when needed\r
//\r
*DataSize = SmmVariableHeader->DataSize;\r
}\r
+\r
if (Attributes != NULL) {\r
*Attributes = SmmVariableHeader->Attributes;\r
}\r
EFI_STATUS\r
EFIAPI\r
RuntimeServiceGetVariable (\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid,\r
- OUT UINT32 *Attributes OPTIONAL,\r
- IN OUT UINTN *DataSize,\r
- OUT VOID *Data\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid,\r
+ OUT UINT32 *Attributes OPTIONAL,\r
+ IN OUT UINTN *DataSize,\r
+ OUT VOID *Data\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
- if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
+ if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (VariableName[0] == 0) {\r
return EFI_NOT_FOUND;\r
}\r
} else {\r
Status = FindVariableInSmm (VariableName, VendorGuid, Attributes, DataSize, Data);\r
}\r
+\r
ReleaseLockOnlyAtBootTime (&mVariableServicesLock);\r
\r
return Status;\r
**/\r
EFI_STATUS\r
GetNextVariableNameInRuntimeCache (\r
- IN OUT UINTN *VariableNameSize,\r
- IN OUT CHAR16 *VariableName,\r
- IN OUT EFI_GUID *VendorGuid\r
+ IN OUT UINTN *VariableNameSize,\r
+ IN OUT CHAR16 *VariableName,\r
+ IN OUT EFI_GUID *VendorGuid\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN VarNameSize;\r
- VARIABLE_HEADER *VariablePtr;\r
- VARIABLE_STORE_HEADER *VariableStoreHeader[VariableStoreTypeMax];\r
+ EFI_STATUS Status;\r
+ UINTN VarNameSize;\r
+ VARIABLE_HEADER *VariablePtr;\r
+ VARIABLE_STORE_HEADER *VariableStoreHeader[VariableStoreTypeMax];\r
\r
Status = EFI_NOT_FOUND;\r
\r
*VariableNameSize = VarNameSize;\r
}\r
}\r
+\r
mVariableRuntimeCacheReadLock = FALSE;\r
\r
return Status;\r
**/\r
EFI_STATUS\r
GetNextVariableNameInSmm (\r
- IN OUT UINTN *VariableNameSize,\r
- IN OUT CHAR16 *VariableName,\r
- IN OUT EFI_GUID *VendorGuid\r
+ IN OUT UINTN *VariableNameSize,\r
+ IN OUT CHAR16 *VariableName,\r
+ IN OUT EFI_GUID *VendorGuid\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN PayloadSize;\r
- SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME *SmmGetNextVariableName;\r
- UINTN OutVariableNameSize;\r
- UINTN InVariableNameSize;\r
-\r
- OutVariableNameSize = *VariableNameSize;\r
- InVariableNameSize = StrSize (VariableName);\r
+ EFI_STATUS Status;\r
+ UINTN PayloadSize;\r
+ SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME *SmmGetNextVariableName;\r
+ UINTN OutVariableNameSize;\r
+ UINTN InVariableNameSize;\r
+\r
+ OutVariableNameSize = *VariableNameSize;\r
+ InVariableNameSize = StrSize (VariableName);\r
SmmGetNextVariableName = NULL;\r
\r
//\r
//\r
OutVariableNameSize = mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME, Name);\r
}\r
+\r
//\r
// Payload should be Guid + NameSize + MAX of Input & Output buffer\r
//\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (SmmGetNextVariableName != NULL);\r
\r
//\r
//\r
CopyMem (SmmGetNextVariableName->Name, VariableName, InVariableNameSize);\r
if (OutVariableNameSize > InVariableNameSize) {\r
- ZeroMem ((UINT8 *) SmmGetNextVariableName->Name + InVariableNameSize, OutVariableNameSize - InVariableNameSize);\r
+ ZeroMem ((UINT8 *)SmmGetNextVariableName->Name + InVariableNameSize, OutVariableNameSize - InVariableNameSize);\r
}\r
\r
//\r
//\r
// Get data from SMM.\r
//\r
- if (Status == EFI_SUCCESS || Status == EFI_BUFFER_TOO_SMALL) {\r
+ if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) {\r
//\r
// SMM CommBuffer NameSize can be a trimed value\r
// Only update VariableNameSize when needed\r
//\r
*VariableNameSize = SmmGetNextVariableName->NameSize;\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
EFI_STATUS\r
EFIAPI\r
RuntimeServiceGetNextVariableName (\r
- IN OUT UINTN *VariableNameSize,\r
- IN OUT CHAR16 *VariableName,\r
- IN OUT EFI_GUID *VendorGuid\r
+ IN OUT UINTN *VariableNameSize,\r
+ IN OUT CHAR16 *VariableName,\r
+ IN OUT EFI_GUID *VendorGuid\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN MaxLen;\r
+ EFI_STATUS Status;\r
+ UINTN MaxLen;\r
\r
Status = EFI_NOT_FOUND;\r
\r
- if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
+ if ((VariableNameSize == NULL) || (VariableName == NULL) || (VendorGuid == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
} else {\r
Status = GetNextVariableNameInSmm (VariableNameSize, VariableName, VendorGuid);\r
}\r
+\r
ReleaseLockOnlyAtBootTime (&mVariableServicesLock);\r
\r
return Status;\r
EFI_STATUS\r
EFIAPI\r
RuntimeServiceSetVariable (\r
- IN CHAR16 *VariableName,\r
- IN EFI_GUID *VendorGuid,\r
- IN UINT32 Attributes,\r
- IN UINTN DataSize,\r
- IN VOID *Data\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid,\r
+ IN UINT32 Attributes,\r
+ IN UINTN DataSize,\r
+ IN VOID *Data\r
)\r
{\r
EFI_STATUS Status;\r
//\r
// Check input parameters.\r
//\r
- if (VariableName == NULL || VariableName[0] == 0 || VendorGuid == NULL) {\r
+ if ((VariableName == NULL) || (VariableName[0] == 0) || (VendorGuid == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (DataSize != 0 && Data == NULL) {\r
+ if ((DataSize != 0) && (Data == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- VariableNameSize = StrSize (VariableName);\r
- SmmVariableHeader = NULL;\r
+ VariableNameSize = StrSize (VariableName);\r
+ SmmVariableHeader = NULL;\r
\r
//\r
// If VariableName or DataSize exceeds SMM payload limit. Return failure\r
//\r
if ((VariableNameSize > mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name)) ||\r
- (DataSize > mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) - VariableNameSize)){\r
+ (DataSize > mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) - VariableNameSize))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+ AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
\r
//\r
// Init the communicate buffer. The buffer data size is:\r
// SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
//\r
PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + VariableNameSize + DataSize;\r
- Status = InitCommunicateBuffer ((VOID **)&SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_SET_VARIABLE);\r
+ Status = InitCommunicateBuffer ((VOID **)&SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_SET_VARIABLE);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (SmmVariableHeader != NULL);\r
\r
- CopyGuid ((EFI_GUID *) &SmmVariableHeader->Guid, VendorGuid);\r
+ CopyGuid ((EFI_GUID *)&SmmVariableHeader->Guid, VendorGuid);\r
SmmVariableHeader->DataSize = DataSize;\r
SmmVariableHeader->NameSize = VariableNameSize;\r
SmmVariableHeader->Attributes = Attributes;\r
CopyMem (SmmVariableHeader->Name, VariableName, SmmVariableHeader->NameSize);\r
- CopyMem ((UINT8 *) SmmVariableHeader->Name + SmmVariableHeader->NameSize, Data, DataSize);\r
+ CopyMem ((UINT8 *)SmmVariableHeader->Name + SmmVariableHeader->NameSize, Data, DataSize);\r
\r
//\r
// Send data to SMM.\r
);\r
}\r
}\r
+\r
return Status;\r
}\r
\r
-\r
/**\r
This code returns information about the EFI variables.\r
\r
EFI_STATUS\r
EFIAPI\r
RuntimeServiceQueryVariableInfo (\r
- IN UINT32 Attributes,\r
- OUT UINT64 *MaximumVariableStorageSize,\r
- OUT UINT64 *RemainingVariableStorageSize,\r
- OUT UINT64 *MaximumVariableSize\r
+ IN UINT32 Attributes,\r
+ OUT UINT64 *MaximumVariableStorageSize,\r
+ OUT UINT64 *RemainingVariableStorageSize,\r
+ OUT UINT64 *MaximumVariableSize\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN PayloadSize;\r
- SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO *SmmQueryVariableInfo;\r
+ EFI_STATUS Status;\r
+ UINTN PayloadSize;\r
+ SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO *SmmQueryVariableInfo;\r
\r
SmmQueryVariableInfo = NULL;\r
\r
- if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {\r
+ if ((MaximumVariableStorageSize == NULL) || (RemainingVariableStorageSize == NULL) || (MaximumVariableSize == NULL) || (Attributes == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+ AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
\r
//\r
// Init the communicate buffer. The buffer data size is:\r
// SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize;\r
//\r
PayloadSize = sizeof (SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO);\r
- Status = InitCommunicateBuffer ((VOID **)&SmmQueryVariableInfo, PayloadSize, SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO);\r
+ Status = InitCommunicateBuffer ((VOID **)&SmmQueryVariableInfo, PayloadSize, SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
+\r
ASSERT (SmmQueryVariableInfo != NULL);\r
\r
- SmmQueryVariableInfo->Attributes = Attributes;\r
+ SmmQueryVariableInfo->Attributes = Attributes;\r
\r
//\r
// Send data to SMM.\r
return Status;\r
}\r
\r
-\r
/**\r
Exit Boot Services Event notification handler.\r
\r
VOID\r
EFIAPI\r
OnExitBootServices (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
//\r
SendCommunicateBuffer (0);\r
}\r
\r
-\r
/**\r
On Ready To Boot Services Event notification handler.\r
\r
VOID\r
EFIAPI\r
OnReadyToBoot (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
//\r
gBS->CloseEvent (Event);\r
}\r
\r
-\r
/**\r
Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
\r
VOID\r
EFIAPI\r
VariableAddressChangeEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- EfiConvertPointer (0x0, (VOID **) &mVariableBuffer);\r
- EfiConvertPointer (0x0, (VOID **) &mSmmCommunication);\r
- EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **) &mVariableRuntimeHobCacheBuffer);\r
- EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **) &mVariableRuntimeNvCacheBuffer);\r
- EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **) &mVariableRuntimeVolatileCacheBuffer);\r
+ EfiConvertPointer (0x0, (VOID **)&mVariableBuffer);\r
+ EfiConvertPointer (0x0, (VOID **)&mMmCommunication2);\r
+ EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRuntimeHobCacheBuffer);\r
+ EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRuntimeNvCacheBuffer);\r
+ EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRuntimeVolatileCacheBuffer);\r
}\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
GetVariablePayloadSize (\r
- OUT UINTN *VariablePayloadSize\r
+ OUT UINTN *VariablePayloadSize\r
)\r
{\r
- EFI_STATUS Status;\r
- SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *SmmGetPayloadSize;\r
- EFI_SMM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
- SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
- UINTN CommSize;\r
- UINT8 *CommBuffer;\r
+ EFI_STATUS Status;\r
+ SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *SmmGetPayloadSize;\r
+ EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
+ SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
+ UINTN CommSize;\r
+ UINT8 *CommBuffer;\r
\r
SmmGetPayloadSize = NULL;\r
- CommBuffer = NULL;\r
+ CommBuffer = NULL;\r
\r
- if(VariablePayloadSize == NULL) {\r
+ if (VariablePayloadSize == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+ AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
\r
//\r
// Init the communicate buffer. The buffer data size is:\r
// SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
//\r
- CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
+ CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
CommBuffer = AllocateZeroPool (CommSize);\r
if (CommBuffer == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
\r
- SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+ SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer;\r
CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
\r
- SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+ SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE;\r
- SmmGetPayloadSize = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *) SmmVariableFunctionHeader->Data;\r
+ SmmGetPayloadSize = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *)SmmVariableFunctionHeader->Data;\r
\r
//\r
// Send data to SMM.\r
//\r
- Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+ Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize);\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = SmmVariableFunctionHeader->ReturnStatus;\r
if (CommBuffer != NULL) {\r
FreePool (CommBuffer);\r
}\r
+\r
ReleaseLockOnlyAtBootTime (&mVariableServicesLock);\r
return Status;\r
}\r
**/\r
EFI_STATUS\r
GetRuntimeCacheInfo (\r
- OUT UINTN *TotalHobStorageSize,\r
- OUT UINTN *TotalNvStorageSize,\r
- OUT UINTN *TotalVolatileStorageSize,\r
- OUT BOOLEAN *AuthenticatedVariableUsage\r
+ OUT UINTN *TotalHobStorageSize,\r
+ OUT UINTN *TotalNvStorageSize,\r
+ OUT UINTN *TotalVolatileStorageSize,\r
+ OUT BOOLEAN *AuthenticatedVariableUsage\r
)\r
{\r
- EFI_STATUS Status;\r
- SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *SmmGetRuntimeCacheInfo;\r
- EFI_SMM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
- SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
- UINTN CommSize;\r
- UINT8 *CommBuffer;\r
+ EFI_STATUS Status;\r
+ SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *SmmGetRuntimeCacheInfo;\r
+ EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
+ SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
+ UINTN CommSize;\r
+ UINT8 *CommBuffer;\r
\r
SmmGetRuntimeCacheInfo = NULL;\r
- CommBuffer = mVariableBuffer;\r
+ CommBuffer = mVariableBuffer;\r
\r
- if (TotalHobStorageSize == NULL || TotalNvStorageSize == NULL || TotalVolatileStorageSize == NULL || AuthenticatedVariableUsage == NULL) {\r
+ if ((TotalHobStorageSize == NULL) || (TotalNvStorageSize == NULL) || (TotalVolatileStorageSize == NULL) || (AuthenticatedVariableUsage == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO);\r
ZeroMem (CommBuffer, CommSize);\r
\r
- SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+ SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer;\r
CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO);\r
\r
- SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+ SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO;\r
- SmmGetRuntimeCacheInfo = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *) SmmVariableFunctionHeader->Data;\r
+ SmmGetRuntimeCacheInfo = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *)SmmVariableFunctionHeader->Data;\r
\r
//\r
// Send data to SMM.\r
//\r
- Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+ Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize);\r
ASSERT_EFI_ERROR (Status);\r
if (CommSize <= SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) {\r
Status = EFI_BAD_BUFFER_SIZE;\r
//\r
// Get data from SMM.\r
//\r
- *TotalHobStorageSize = SmmGetRuntimeCacheInfo->TotalHobStorageSize;\r
- *TotalNvStorageSize = SmmGetRuntimeCacheInfo->TotalNvStorageSize;\r
- *TotalVolatileStorageSize = SmmGetRuntimeCacheInfo->TotalVolatileStorageSize;\r
+ *TotalHobStorageSize = SmmGetRuntimeCacheInfo->TotalHobStorageSize;\r
+ *TotalNvStorageSize = SmmGetRuntimeCacheInfo->TotalNvStorageSize;\r
+ *TotalVolatileStorageSize = SmmGetRuntimeCacheInfo->TotalVolatileStorageSize;\r
*AuthenticatedVariableUsage = SmmGetRuntimeCacheInfo->AuthenticatedVariableUsage;\r
\r
Done:\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *SmmRuntimeVarCacheContext;\r
- EFI_SMM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
- SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
- UINTN CommSize;\r
- UINT8 *CommBuffer;\r
+ EFI_STATUS Status;\r
+ SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *SmmRuntimeVarCacheContext;\r
+ EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader;\r
+ SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;\r
+ UINTN CommSize;\r
+ UINT8 *CommBuffer;\r
\r
SmmRuntimeVarCacheContext = NULL;\r
- CommBuffer = mVariableBuffer;\r
+ CommBuffer = mVariableBuffer;\r
\r
if (CommBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT);\r
ZeroMem (CommBuffer, CommSize);\r
\r
- SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+ SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer;\r
CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT);\r
\r
- SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+ SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT;\r
- SmmRuntimeVarCacheContext = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *) SmmVariableFunctionHeader->Data;\r
+ SmmRuntimeVarCacheContext = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *)SmmVariableFunctionHeader->Data;\r
\r
- SmmRuntimeVarCacheContext->RuntimeHobCache = mVariableRuntimeHobCacheBuffer;\r
+ SmmRuntimeVarCacheContext->RuntimeHobCache = mVariableRuntimeHobCacheBuffer;\r
SmmRuntimeVarCacheContext->RuntimeVolatileCache = mVariableRuntimeVolatileCacheBuffer;\r
- SmmRuntimeVarCacheContext->RuntimeNvCache = mVariableRuntimeNvCacheBuffer;\r
- SmmRuntimeVarCacheContext->PendingUpdate = &mVariableRuntimeCachePendingUpdate;\r
- SmmRuntimeVarCacheContext->ReadLock = &mVariableRuntimeCacheReadLock;\r
- SmmRuntimeVarCacheContext->HobFlushComplete = &mHobFlushComplete;\r
+ SmmRuntimeVarCacheContext->RuntimeNvCache = mVariableRuntimeNvCacheBuffer;\r
+ SmmRuntimeVarCacheContext->PendingUpdate = &mVariableRuntimeCachePendingUpdate;\r
+ SmmRuntimeVarCacheContext->ReadLock = &mVariableRuntimeCacheReadLock;\r
+ SmmRuntimeVarCacheContext->HobFlushComplete = &mHobFlushComplete;\r
+\r
+ //\r
+ // Request to unblock this region to be accessible from inside MM environment\r
+ // These fields "should" be all on the same page, but just to be on the safe side...\r
+ //\r
+ Status = MmUnblockMemoryRequest (\r
+ (EFI_PHYSICAL_ADDRESS)ALIGN_VALUE ((UINTN)SmmRuntimeVarCacheContext->PendingUpdate - EFI_PAGE_SIZE + 1, EFI_PAGE_SIZE),\r
+ EFI_SIZE_TO_PAGES (sizeof (mVariableRuntimeCachePendingUpdate))\r
+ );\r
+ if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = MmUnblockMemoryRequest (\r
+ (EFI_PHYSICAL_ADDRESS)ALIGN_VALUE ((UINTN)SmmRuntimeVarCacheContext->ReadLock - EFI_PAGE_SIZE + 1, EFI_PAGE_SIZE),\r
+ EFI_SIZE_TO_PAGES (sizeof (mVariableRuntimeCacheReadLock))\r
+ );\r
+ if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = MmUnblockMemoryRequest (\r
+ (EFI_PHYSICAL_ADDRESS)ALIGN_VALUE ((UINTN)SmmRuntimeVarCacheContext->HobFlushComplete - EFI_PAGE_SIZE + 1, EFI_PAGE_SIZE),\r
+ EFI_SIZE_TO_PAGES (sizeof (mHobFlushComplete))\r
+ );\r
+ if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
\r
//\r
// Send data to SMM.\r
//\r
- Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+ Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize);\r
ASSERT_EFI_ERROR (Status);\r
if (CommSize <= SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) {\r
Status = EFI_BAD_BUFFER_SIZE;\r
VOID\r
EFIAPI\r
SmmVariableReady (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
- Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &mSmmVariable);\r
+ Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)&mSmmVariable);\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
\r
- Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
+ Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2);\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
//\r
Status = GetVariablePayloadSize (&mVariableBufferPayloadSize);\r
ASSERT_EFI_ERROR (Status);\r
- mVariableBufferSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + mVariableBufferPayloadSize;\r
- mVariableBuffer = AllocateRuntimePool (mVariableBufferSize);\r
+ mVariableBufferSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + mVariableBufferPayloadSize;\r
+ mVariableBuffer = AllocateRuntimePool (mVariableBufferSize);\r
ASSERT (mVariableBuffer != NULL);\r
\r
//\r
}\r
}\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
- mVariableRuntimeHobCacheBuffer = NULL;\r
- mVariableRuntimeNvCacheBuffer = NULL;\r
+ mVariableRuntimeHobCacheBuffer = NULL;\r
+ mVariableRuntimeNvCacheBuffer = NULL;\r
mVariableRuntimeVolatileCacheBuffer = NULL;\r
}\r
}\r
+\r
ASSERT_EFI_ERROR (Status);\r
} else {\r
DEBUG ((DEBUG_INFO, "Variable driver runtime cache is disabled.\n"));\r
ASSERT_EFI_ERROR (Status);\r
\r
mVariableLock.RequestToLock = VariableLockRequestToLock;\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &mHandle,\r
- &gEdkiiVariableLockProtocolGuid,\r
- &mVariableLock,\r
- NULL\r
- );\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &mHandle,\r
+ &gEdkiiVariableLockProtocolGuid,\r
+ &mVariableLock,\r
+ NULL\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
mVarCheck.RegisterSetVariableCheckHandler = VarCheckRegisterSetVariableCheckHandler;\r
- mVarCheck.VariablePropertySet = VarCheckVariablePropertySet;\r
- mVarCheck.VariablePropertyGet = VarCheckVariablePropertyGet;\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &mHandle,\r
- &gEdkiiVarCheckProtocolGuid,\r
- &mVarCheck,\r
- NULL\r
- );\r
+ mVarCheck.VariablePropertySet = VarCheckVariablePropertySet;\r
+ mVarCheck.VariablePropertyGet = VarCheckVariablePropertyGet;\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &mHandle,\r
+ &gEdkiiVarCheckProtocolGuid,\r
+ &mVarCheck,\r
+ NULL\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
gBS->CloseEvent (Event);\r
}\r
\r
-\r
/**\r
SMM Non-Volatile variable write service is ready notify event handler.\r
\r
VOID\r
EFIAPI\r
SmmVariableWriteReady (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- EFI_STATUS Status;\r
- VOID *ProtocolOps;\r
+ EFI_STATUS Status;\r
+ VOID *ProtocolOps;\r
\r
//\r
// Check whether the protocol is installed or not.\r
//\r
- Status = gBS->LocateProtocol (&gSmmVariableWriteGuid, NULL, (VOID **) &ProtocolOps);\r
+ Status = gBS->LocateProtocol (&gSmmVariableWriteGuid, NULL, (VOID **)&ProtocolOps);\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
// Some Secure Boot Policy Var (SecureBoot, etc) updates following other\r
// Secure Boot Policy Variable change. Record their initial value.\r
//\r
- RecordSecureBootPolicyVarData();\r
+ RecordSecureBootPolicyVarData ();\r
\r
Status = gBS->InstallProtocolInterface (\r
&mHandle,\r
gBS->CloseEvent (Event);\r
}\r
\r
-\r
/**\r
Variable Driver main entry point. The Variable driver places the 4 EFI\r
runtime services in the EFI System Table and installs arch protocols\r
EFI_STATUS\r
EFIAPI\r
VariableSmmRuntimeInitialize (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- VOID *SmmVariableRegistration;\r
- VOID *SmmVariableWriteRegistration;\r
- EFI_EVENT OnReadyToBootEvent;\r
- EFI_EVENT ExitBootServiceEvent;\r
- EFI_EVENT LegacyBootEvent;\r
+ VOID *SmmVariableRegistration;\r
+ VOID *SmmVariableWriteRegistration;\r
+ EFI_EVENT OnReadyToBootEvent;\r
+ EFI_EVENT ExitBootServiceEvent;\r
+ EFI_EVENT LegacyBootEvent;\r
\r
EfiInitializeLock (&mVariableServicesLock, TPL_NOTIFY);\r
\r
// Register the event to inform SMM variable that it is at runtime for legacy boot.\r
// Reuse OnExitBootServices() here.\r
//\r
- EfiCreateEventLegacyBootEx(\r
+ EfiCreateEventLegacyBootEx (\r
TPL_NOTIFY,\r
OnExitBootServices,\r
NULL,\r
&mVirtualAddressChangeEvent\r
);\r
\r
+ // Initialize the VariablePolicy protocol and engine.\r
+ VariablePolicySmmDxeMain (ImageHandle, SystemTable);\r
+\r
return EFI_SUCCESS;\r
}\r
-\r