]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c
MdeModulePkg: VariableSmmRuntimeDxe: Added request unblock memory interface
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableSmmRuntimeDxe.c
index c47e614d81f4594c36b31fab80c26508854818d8..a166d284dfe43458b1d7c07f7fdaa94f30507851 100644 (file)
@@ -35,6 +35,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #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
@@ -165,6 +166,7 @@ InitVariableCache (
   )\r
 {\r
   VARIABLE_STORE_HEADER   *VariableCacheStorePtr;\r
+  EFI_STATUS              Status;\r
 \r
   if (TotalVariableCacheSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -186,6 +188,18 @@ InitVariableCache (
   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
@@ -1536,6 +1550,34 @@ SendRuntimeVariableCacheContextToSmm (
   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