#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
)\r
{\r
VARIABLE_STORE_HEADER *VariableCacheStorePtr;\r
+ EFI_STATUS Status;\r
\r
if (TotalVariableCacheSize == NULL) {\r
return EFI_INVALID_PARAMETER;\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
\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