]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.c
SecurityPkg-Opal(1): Use fixed SMM communication buffer in OPAL password lib.
[mirror_edk2.git] / SecurityPkg / Library / OpalPasswordSupportLib / OpalPasswordSupportLib.c
index eead27fbe022831f2e72bb68ed9cf2ea12cb8ced..837582359e4f7b8ad228f63e0e71524eb72f6921 100644 (file)
@@ -401,8 +401,36 @@ OpalInitCommunicateBuffer (
   EFI_SMM_COMMUNICATE_HEADER                *SmmCommunicateHeader;\r
   OPAL_SMM_COMMUNICATE_HEADER               *SmmFunctionHeader;\r
   VOID                                      *Buffer;\r
+  EDKII_PI_SMM_COMMUNICATION_REGION_TABLE   *SmmCommRegionTable;\r
+  EFI_MEMORY_DESCRIPTOR                     *SmmCommMemRegion;\r
+  UINTN                                     Index;\r
+  UINTN                                     Size;\r
+  EFI_STATUS                                Status;\r
+\r
+  Buffer = NULL;\r
+  Status = EfiGetSystemConfigurationTable (\r
+             &gEdkiiPiSmmCommunicationRegionTableGuid,\r
+             (VOID **) &SmmCommRegionTable\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
 \r
-  Buffer = AllocateZeroPool (DataSize + OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data) + OFFSET_OF (OPAL_SMM_COMMUNICATE_HEADER, Data));\r
+  ASSERT (SmmCommRegionTable != NULL);\r
+  SmmCommMemRegion = (EFI_MEMORY_DESCRIPTOR *) (SmmCommRegionTable + 1);\r
+  Size = 0;\r
+  for (Index = 0; Index < SmmCommRegionTable->NumberOfEntries; Index++) {\r
+    if (SmmCommMemRegion->Type == EfiConventionalMemory) {\r
+      Size = EFI_PAGES_TO_SIZE ((UINTN) SmmCommMemRegion->NumberOfPages);\r
+      if (Size >= (DataSize + OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data) + OFFSET_OF (OPAL_SMM_COMMUNICATE_HEADER, Data))) {\r
+        break;\r
+      }\r
+    }\r
+    SmmCommMemRegion = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) SmmCommMemRegion + SmmCommRegionTable->DescriptorSize);\r
+  }\r
+  ASSERT (Index < SmmCommRegionTable->NumberOfEntries);\r
+\r
+  Buffer = (VOID*)(UINTN)SmmCommMemRegion->PhysicalStart;\r
   ASSERT (Buffer != NULL);\r
 \r
   SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) Buffer;\r
@@ -513,8 +541,6 @@ OpalSupportSendPasword(
 \r
 EXIT:\r
   ZeroMem(Parameter, Length);\r
-  FreePool(Buffer);\r
-\r
   return Status;\r
 }\r
 \r