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
\r
EXIT:\r
ZeroMem(Parameter, Length);\r
- FreePool(Buffer);\r
-\r
return Status;\r
}\r
\r