This patch enhance OPAL password lib SMM communication by using fixed
SMM communication buffer.

Update OPAL password lib to consume EDKII_PI_SMM_COMMUNICATION_REGION_TABLE
as fixed communication buffer for SMM communication.

This is designed to meet Microsoft WSMT table definition on FIXED_COMM_BUFFERS
requirement.

Cc: "Dong, Eric" <eric.d...@intel.com>
Cc: "Tian, Feng" <feng.t...@intel.com>
Cc: "Laszlo Ersek" <ler...@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Dong, Eric" <eric.d...@intel.com>
Reviewed-by: "Tian, Feng" <feng.t...@intel.com>
---
 .../OpalPasswordSupportLib.c                       | 32 ++++++++++++++++++++--
 .../OpalPasswordSupportLib.inf                     |  4 +++
 .../OpalPasswordSupportNotify.h                    |  2 +-
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git 
a/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.c 
b/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.c
index eead27f..8375823 100644
--- a/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.c
+++ b/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.c
@@ -401,8 +401,36 @@ OpalInitCommunicateBuffer (
   EFI_SMM_COMMUNICATE_HEADER                *SmmCommunicateHeader;
   OPAL_SMM_COMMUNICATE_HEADER               *SmmFunctionHeader;
   VOID                                      *Buffer;
+  EDKII_PI_SMM_COMMUNICATION_REGION_TABLE   *SmmCommRegionTable;
+  EFI_MEMORY_DESCRIPTOR                     *SmmCommMemRegion;
+  UINTN                                     Index;
+  UINTN                                     Size;
+  EFI_STATUS                                Status;
+
+  Buffer = NULL;
+  Status = EfiGetSystemConfigurationTable (
+             &gEdkiiPiSmmCommunicationRegionTableGuid,
+             (VOID **) &SmmCommRegionTable
+             );
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
 
-  Buffer = AllocateZeroPool (DataSize + OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, 
Data) + OFFSET_OF (OPAL_SMM_COMMUNICATE_HEADER, Data));
+  ASSERT (SmmCommRegionTable != NULL);
+  SmmCommMemRegion = (EFI_MEMORY_DESCRIPTOR *) (SmmCommRegionTable + 1);
+  Size = 0;
+  for (Index = 0; Index < SmmCommRegionTable->NumberOfEntries; Index++) {
+    if (SmmCommMemRegion->Type == EfiConventionalMemory) {
+      Size = EFI_PAGES_TO_SIZE ((UINTN) SmmCommMemRegion->NumberOfPages);
+      if (Size >= (DataSize + OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data) + 
OFFSET_OF (OPAL_SMM_COMMUNICATE_HEADER, Data))) {
+        break;
+      }
+    }
+    SmmCommMemRegion = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) SmmCommMemRegion + 
SmmCommRegionTable->DescriptorSize);
+  }
+  ASSERT (Index < SmmCommRegionTable->NumberOfEntries);
+
+  Buffer = (VOID*)(UINTN)SmmCommMemRegion->PhysicalStart;
   ASSERT (Buffer != NULL);
 
   SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) Buffer;
@@ -513,8 +541,6 @@ OpalSupportSendPasword(
 
 EXIT:
   ZeroMem(Parameter, Length);
-  FreePool(Buffer);
-
   return Status;
 }
 
diff --git 
a/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.inf 
b/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.inf
index 274366b..b783135 100644
--- a/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.inf
+++ b/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportLib.inf
@@ -43,9 +43,13 @@
 
 [Packages]
   MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
   SecurityPkg/SecurityPkg.dec
 
 [Protocols]
   gEfiStorageSecurityCommandProtocolGuid                         ## CONSUMES
   gEfiSmmCommunicationProtocolGuid                               ## CONSUMES
   gEfiSmmBase2ProtocolGuid                                       ## CONSUMES # 
only for SMM version
+
+[Guids]
+  gEdkiiPiSmmCommunicationRegionTableGuid       ## CONSUMES ## SystemTable
diff --git 
a/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportNotify.h 
b/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportNotify.h
index 59c1214..f0ad3a1 100644
--- a/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportNotify.h
+++ b/SecurityPkg/Library/OpalPasswordSupportLib/OpalPasswordSupportNotify.h
@@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 #include <PiSmm.h>
 
 #include <Uefi/UefiAcpiDataTable.h>
-
+#include <Guid/PiSmmCommunicationRegionTable.h>
 #include <Library/DebugLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/UefiBootServicesTableLib.h>
-- 
2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to